From 5d2f5125dae8213ffef83b6d9a2ad5b9449b7979 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 19:24:20 +0000 Subject: [PATCH] deploy: e7218074f83365718a40ffac0bc6fff693923024 --- 404.html | 2 +- FAQ/index.html | 8 ++++---- assets/js/04d926a5.9b86ad1f.js | 13 ------------- assets/js/04d926a5.ec6f4fcd.js | 13 +++++++++++++ assets/js/08938dd7.64df4ca4.js | 1 + assets/js/08938dd7.9aaf2469.js | 1 - assets/js/094000d3.145fb8c1.js | 1 + assets/js/094000d3.256efb93.js | 1 - assets/js/153c3ceb.8bccd2a2.js | 1 - assets/js/153c3ceb.d314d9bc.js | 1 + assets/js/1bb2dc41.a7345fdd.js | 1 + assets/js/1bb2dc41.e8fa8674.js | 1 - assets/js/1fb61236.1db46805.js | 1 - assets/js/1fb61236.67d54122.js | 1 + assets/js/202c4968.54d0bed6.js | 1 - assets/js/202c4968.c6902699.js | 1 + assets/js/24a5b6e6.a9742041.js | 12 ------------ assets/js/24a5b6e6.efe1a012.js | 12 ++++++++++++ assets/js/294f31e2.20b72f2a.js | 1 + assets/js/294f31e2.fad893ae.js | 1 - assets/js/2a24ad03.3ae318a5.js | 13 +++++++++++++ assets/js/2a24ad03.f7468792.js | 13 ------------- assets/js/2ecbbad4.2f08c93b.js | 1 + assets/js/2ecbbad4.b0403b88.js | 1 - assets/js/30829cd8.c41b385a.js | 1 + assets/js/30829cd8.ec4d59dc.js | 1 - assets/js/33c4ed3f.368cddb1.js | 1 + assets/js/33c4ed3f.96b3612f.js | 1 - assets/js/3827a595.6079a539.js | 1 - assets/js/3827a595.db3b6819.js | 1 + assets/js/41cd626a.319629aa.js | 1 + assets/js/41cd626a.990a1161.js | 1 - assets/js/425b8dd3.32de60d8.js | 1 + assets/js/425b8dd3.cea8b1a2.js | 1 - assets/js/44b2647e.24c4f22d.js | 1 + assets/js/44b2647e.35013e97.js | 1 - assets/js/490e20a0.13e19275.js | 1 + assets/js/490e20a0.2f2af6ce.js | 1 - assets/js/49117d77.5bb5222b.js | 1 + assets/js/49117d77.ecb7b006.js | 1 - assets/js/493c00ca.c9ab1381.js | 1 + assets/js/493c00ca.d188969b.js | 1 - assets/js/498c77bd.493fa519.js | 1 - assets/js/498c77bd.5d01d565.js | 1 + assets/js/4edc808e.01dc77ad.js | 1 - assets/js/4edc808e.56f2ac9b.js | 1 + assets/js/4f7d60c5.1123e42a.js | 1 - assets/js/4f7d60c5.81c82ae0.js | 1 + assets/js/5930ad03.ad7a7ac4.js | 1 + assets/js/5930ad03.bc7160d6.js | 1 - assets/js/5a378701.abc8db86.js | 1 + assets/js/5a378701.f804e785.js | 1 - assets/js/5a6ebb5c.0af53e22.js | 1 - assets/js/5a6ebb5c.127bc10c.js | 1 + assets/js/5f7452e4.26462546.js | 1 - assets/js/5f7452e4.38065108.js | 1 + assets/js/61856a46.2dde7a02.js | 1 - assets/js/61856a46.d8bdfb0e.js | 1 + assets/js/64837553.7ea1aa42.js | 1 + assets/js/64837553.c7e6ef42.js | 1 - assets/js/72d905a9.6c664fe1.js | 1 - assets/js/72d905a9.fb69ac6f.js | 1 + assets/js/73287945.b4e4ba6e.js | 1 + assets/js/73287945.e71cfce7.js | 1 - assets/js/74876495.15b0c1e9.js | 1 + assets/js/74876495.3bfa055b.js | 1 - assets/js/778b0fa6.180c28af.js | 1 + assets/js/778b0fa6.f419d76e.js | 1 - assets/js/7b4f75c2.3c5e2cf9.js | 1 + assets/js/7b4f75c2.49dd4e62.js | 1 - assets/js/7ebd3339.c3c05102.js | 1 - assets/js/7ebd3339.d6aa4b2e.js | 1 + assets/js/812e048c.397090c1.js | 1 + assets/js/812e048c.cc12e48d.js | 1 - assets/js/8b39be93.09830469.js | 12 ++++++++++++ assets/js/8b39be93.eb6d9d58.js | 12 ------------ assets/js/91a78c9f.055787b3.js | 1 - assets/js/91a78c9f.f02c9e98.js | 1 + assets/js/925abbc7.c3c17436.js | 1 - assets/js/925abbc7.e3c9000b.js | 1 + assets/js/9bcab3db.544fccb4.js | 1 + assets/js/9bcab3db.7daa78ab.js | 1 - assets/js/9fd2a592.3a67aa4f.js | 1 - assets/js/9fd2a592.84dff9d4.js | 1 + assets/js/a16703cd.53e0bfce.js | 13 +++++++++++++ assets/js/a16703cd.a3295a26.js | 13 ------------- assets/js/a93ae359.1ee4806b.js | 1 - assets/js/a93ae359.a1767c63.js | 1 + assets/js/ad895e75.13e7b34f.js | 1 - assets/js/ad895e75.1c516a11.js | 1 + assets/js/af9480c3.7c9adf49.js | 1 - assets/js/af9480c3.99d1652c.js | 1 + assets/js/b46f7c12.16114bb2.js | 1 + assets/js/b46f7c12.3100fbe6.js | 1 - assets/js/b49ba48c.caa11833.js | 1 + assets/js/b49ba48c.e798877e.js | 1 - assets/js/bf69edfb.c50ccff0.js | 1 - assets/js/bf69edfb.d12f9775.js | 1 + assets/js/c2e935db.64d4c215.js | 1 + assets/js/c2e935db.ed551359.js | 1 - assets/js/cdda7d53.15b867c8.js | 1 + assets/js/cdda7d53.3378a080.js | 1 - assets/js/d3a18f08.066bdca8.js | 1 + assets/js/d3a18f08.ea51fc4e.js | 1 - assets/js/d50915e5.222d6408.js | 1 + assets/js/d50915e5.3f036d92.js | 1 - assets/js/d53edd15.9d3522ee.js | 1 - assets/js/d53edd15.c1d02ade.js | 1 + assets/js/dfa6d5b1.79649750.js | 1 + assets/js/dfa6d5b1.bed44827.js | 1 - assets/js/e6ac3f64.065ee538.js | 1 - assets/js/e6ac3f64.b17508a6.js | 1 + assets/js/e7a53bbd.caba3573.js | 1 - assets/js/e7a53bbd.e67b3e0e.js | 1 + assets/js/e82a470f.19ce1061.js | 1 - assets/js/e82a470f.9ee66086.js | 1 + assets/js/ea69cd8d.1b69a39c.js | 1 + assets/js/ea69cd8d.ff01e187.js | 1 - assets/js/f18fd350.4afa2ce8.js | 1 - assets/js/f18fd350.cacb4e1a.js | 1 + assets/js/fa357871.84bc7d57.js | 1 - assets/js/fa357871.86b5747b.js | 1 + assets/js/fee59995.19421a19.js | 1 - assets/js/fee59995.4edad005.js | 1 + assets/js/runtime~main.35348c8b.js | 1 - assets/js/runtime~main.5478431f.js | 1 + category/development/index.html | 2 +- .../clients/discord/discord-app/index.html | 8 ++++---- .../clients/discord/discord-headless/index.html | 8 ++++---- configuration/clients/discord/index.html | 8 ++++---- configuration/clients/index.html | 8 ++++---- configuration/clients/koito/index.html | 8 ++++---- configuration/clients/lastfm/index.html | 8 ++++---- configuration/clients/librefm/index.html | 8 ++++---- configuration/clients/listenbrainz/index.html | 8 ++++---- configuration/clients/maloja/index.html | 8 ++++---- configuration/clients/rocksky/index.html | 8 ++++---- configuration/clients/tealfm/index.html | 8 ++++---- configuration/duplicates/index.html | 8 ++++---- configuration/index.html | 8 ++++---- configuration/kitchensink/index.html | 8 ++++---- configuration/sources/applemusic/index.html | 8 ++++---- configuration/sources/azuracast/index.html | 8 ++++---- configuration/sources/deezer/index.html | 8 ++++---- configuration/sources/google-cast/index.html | 8 ++++---- configuration/sources/icecast/index.html | 8 ++++---- configuration/sources/index.html | 8 ++++---- configuration/sources/jellyfin/index.html | 8 ++++---- configuration/sources/jriver/index.html | 8 ++++---- configuration/sources/kodi/index.html | 8 ++++---- configuration/sources/koito-source/index.html | 8 ++++---- configuration/sources/lastfm-endpoint/index.html | 8 ++++---- configuration/sources/lastfm-source/index.html | 8 ++++---- configuration/sources/librefm-source/index.html | 8 ++++---- .../sources/listenbrainz-endpoint/index.html | 8 ++++---- .../sources/listenbrainz-source/index.html | 8 ++++---- configuration/sources/maloja/index.html | 8 ++++---- configuration/sources/mopidy/index.html | 8 ++++---- configuration/sources/mpd/index.html | 8 ++++---- configuration/sources/mpris/index.html | 8 ++++---- configuration/sources/musikcube/index.html | 8 ++++---- configuration/sources/plex/index.html | 8 ++++---- configuration/sources/rocksky-source/index.html | 8 ++++---- configuration/sources/sonos/index.html | 8 ++++---- configuration/sources/spotify/index.html | 8 ++++---- configuration/sources/subsonic/index.html | 8 ++++---- configuration/sources/tealfm-source/index.html | 8 ++++---- configuration/sources/vlc/index.html | 8 ++++---- configuration/sources/webscrobbler/index.html | 8 ++++---- configuration/sources/yamaha-musiccast/index.html | 8 ++++---- configuration/sources/yandex-music/index.html | 8 ++++---- configuration/sources/youtube-music/index.html | 8 ++++---- configuration/transforms/index.html | 8 ++++---- configuration/transforms/musicbrainz/index.html | 8 ++++---- configuration/transforms/native/index.html | 8 ++++---- configuration/transforms/user/index.html | 8 ++++---- development/dev-common/index.html | 8 ++++---- development/dev-source/index.html | 8 ++++---- development/flatpak/index.html | 8 ++++---- help/index.html | 8 ++++---- index.html | 8 ++++---- installation/index.html | 8 ++++---- installation/service/index.html | 8 ++++---- playground/index.html | 6 +++--- ...> 03706fb208ac1c95a048ce78c924f6a19f6d9de8.png} | Bin ...> 04775efabc71f03ace6ca23a19a0eb42f7979a84.png} | Bin ...> 05f284f0205c8c68ceb1ed69ee1518288a7dd339.png} | Bin ...> 0c37a4e5a372efdc1e1d65a745db0b29439fe877.png} | Bin ...> 0c77523f647c99228affbb7cb956564c93ef5c92.png} | Bin ...> 103ab48dfe6eb199648d03ecc3c77cec51c6fa87.png} | Bin ...> 16d4d38cfd79fffbff69a10c44661eae71d2fcc7.png} | Bin ...> 179c53cdbf158c55e942b7daa77aa0cf6564dbf3.png} | Bin ...> 17ddd59273844114108795014334ef5f5d569ffe.png} | Bin ...> 1da07869193dce3ae165631e8be9bf3b36e08c19.png} | Bin ...> 21021d29dd8223e60c197e795b86eee7bb295b36.png} | Bin ...> 24a3600f5d63fd7b145e726c3f6b8dcd7b4e3d0e.png} | Bin ...> 28a3abbdf41acd4c4d09dfaa6cba0e29bcc7729c.png} | Bin ...> 2b367609da9d1be3a932c7907ab32cce0731227d.png} | Bin ...> 30fa06f846d61e19cf0acf6cfd880732ad4b5dfc.png} | Bin ...> 3a89200d5d0fe81af529b6ec8b4d422e12c78983.png} | Bin ...> 48b6ff8ee8f9850685e8e6b33ad662d93272054d.png} | Bin ...> 496e9ca37357f69259598310ad399c73912f1bfc.png} | Bin ...> 4b3c898122453c7cb23b575200057873f53251bc.png} | Bin ...> 4c888284ab5bc9cdea04d3680043963785197ebe.png} | Bin ...> 537e2f7cddbd8cc6e30bf35d5c1569b44fa233b7.png} | Bin ...> 6764229ed00ed34f91e59ed8b2f463845a256272.png} | Bin ...> 68958ca0d5c8349172bcccb56409b9b3307fee23.png} | Bin ...> 69114620132778c2d3729b3f7ee9c2f8c58d3e2f.png} | Bin ...> 6bf948ab610df8177f8eb634b9873ccd233d536e.png} | Bin ...> 742fafe6b1cc18071721f07521e51ccd8865cbe6.png} | Bin ...> 75933a10849bcda5c94e88d924f76d0478aabacb.png} | Bin ...> 7671f601b5bb7490808cfbcf734c424b5fac6f56.png} | Bin ...> 79ed183375a4a0564413ec5553c7be7fd066537f.png} | Bin ...> 7e5b38cfcd9b46d50d64c98661c62c544516db37.png} | Bin ...> 8501ac64a388db642c3b20c9eb6cae4b48bddb7e.png} | Bin ...> 8957b9254d4397043c4ab5e6d161509b431f4434.png} | Bin ...> 89b0a178f6301089b96666fc7d8cc18d6db58f4b.png} | Bin ...> 8b2c2164bf8ccc399a7df4c4db48528af2489e52.png} | Bin ...> 8ee00d679eb7aade4de4793bde2262ed98910b72.png} | Bin ...> 91035358cd50bdf6e6bc07050c4a16738f10ee62.png} | Bin ...> 923ce523694d92226f4f4920b1f7c9d60fa756cb.png} | Bin ...> 97796d646d9ab37d860f4325b7ff8f269296f26e.png} | Bin ...> 9c776c3a7d51378966630b607f406c2f23fd5a3c.png} | Bin ...> a3891dac5feaa7dca7be04ea66a7d27d3c66a42c.png} | Bin ...> a98c3609137c55346dbc825fbff2cbe1b3939987.png} | Bin ...> aa417125ed564d95f29716e000e70d9a9356f666.png} | Bin ...> b628bc3eb396995324ab219b62c779898c860113.png} | Bin ...> baa09ddf64949ae5a42a58694169dfabf1ac0086.png} | Bin ...> c4461bf5fa39006bfa9f901892bcd0d71013cf56.png} | Bin ...> c46d9d4e6c564e9bd3563cb50bd3a7fa1c28b1ca.png} | Bin ...> c47b8a55ba7742a78253b7cb6d7bec8f42acc2b3.png} | Bin ...> cc7b0be3b6416435ac4507d62b08c9ef2dfbe4cc.png} | Bin ...> cda6a6fc0e0a83496cc01280fbd496c41144566e.png} | Bin ...> cf72955bb2679cdf841459d86e94d8f35c8550b6.png} | Bin ...> d1a7776d284a5723798250d90914741fc146f246.png} | Bin ...> dc1fc12b91baab0d238c6ef430c86d9a376cbd4f.png} | Bin ...> e0a11f71d90583ef59048801aebc3f1875cc5fd1.png} | Bin ...> e6321c6ba8e056688289cc2f354454f5b8637bd4.png} | Bin ...> e65ec532045e436e8cfeea65bb7d9bcd4725323c.png} | Bin ...> ef046a9b19154e7f488f4e4813052c406986b910.png} | Bin ...> f3d5c11661e673642bcd793c1028175590bd465b.png} | Bin ...> f3fb2aef56d67d6955f9602e19b6b042716327dc.png} | Bin ...> f40524df97f27040bece36444a713e94ea12b167.png} | Bin ...> fc6464ea0b3991c20bb54d5c431a88f4f4140d06.png} | Bin ...> fc9f22a6744df6d773e206c0db0ab9771f640938.png} | Bin ...> fca48c0d5952cc9318ceb4732cb081beb4b07a33.png} | Bin quickstart/index.html | 8 ++++---- search-index.json | 2 +- search/index.html | 2 +- updating/index.html | 8 ++++---- updating/upgrade-path/0140/index.html | 8 ++++---- updating/upgrade-path/index.html | 8 ++++---- 252 files changed, 371 insertions(+), 371 deletions(-) delete mode 100644 assets/js/04d926a5.9b86ad1f.js create mode 100644 assets/js/04d926a5.ec6f4fcd.js create mode 100644 assets/js/08938dd7.64df4ca4.js delete mode 100644 assets/js/08938dd7.9aaf2469.js create mode 100644 assets/js/094000d3.145fb8c1.js delete mode 100644 assets/js/094000d3.256efb93.js delete mode 100644 assets/js/153c3ceb.8bccd2a2.js create mode 100644 assets/js/153c3ceb.d314d9bc.js create mode 100644 assets/js/1bb2dc41.a7345fdd.js delete mode 100644 assets/js/1bb2dc41.e8fa8674.js delete mode 100644 assets/js/1fb61236.1db46805.js create mode 100644 assets/js/1fb61236.67d54122.js delete mode 100644 assets/js/202c4968.54d0bed6.js create mode 100644 assets/js/202c4968.c6902699.js delete mode 100644 assets/js/24a5b6e6.a9742041.js create mode 100644 assets/js/24a5b6e6.efe1a012.js create mode 100644 assets/js/294f31e2.20b72f2a.js delete mode 100644 assets/js/294f31e2.fad893ae.js create mode 100644 assets/js/2a24ad03.3ae318a5.js delete mode 100644 assets/js/2a24ad03.f7468792.js create mode 100644 assets/js/2ecbbad4.2f08c93b.js delete mode 100644 assets/js/2ecbbad4.b0403b88.js create mode 100644 assets/js/30829cd8.c41b385a.js delete mode 100644 assets/js/30829cd8.ec4d59dc.js create mode 100644 assets/js/33c4ed3f.368cddb1.js delete mode 100644 assets/js/33c4ed3f.96b3612f.js delete mode 100644 assets/js/3827a595.6079a539.js create mode 100644 assets/js/3827a595.db3b6819.js create mode 100644 assets/js/41cd626a.319629aa.js delete mode 100644 assets/js/41cd626a.990a1161.js create mode 100644 assets/js/425b8dd3.32de60d8.js delete mode 100644 assets/js/425b8dd3.cea8b1a2.js create mode 100644 assets/js/44b2647e.24c4f22d.js delete mode 100644 assets/js/44b2647e.35013e97.js create mode 100644 assets/js/490e20a0.13e19275.js delete mode 100644 assets/js/490e20a0.2f2af6ce.js create mode 100644 assets/js/49117d77.5bb5222b.js delete mode 100644 assets/js/49117d77.ecb7b006.js create mode 100644 assets/js/493c00ca.c9ab1381.js delete mode 100644 assets/js/493c00ca.d188969b.js delete mode 100644 assets/js/498c77bd.493fa519.js create mode 100644 assets/js/498c77bd.5d01d565.js delete mode 100644 assets/js/4edc808e.01dc77ad.js create mode 100644 assets/js/4edc808e.56f2ac9b.js delete mode 100644 assets/js/4f7d60c5.1123e42a.js create mode 100644 assets/js/4f7d60c5.81c82ae0.js create mode 100644 assets/js/5930ad03.ad7a7ac4.js delete mode 100644 assets/js/5930ad03.bc7160d6.js create mode 100644 assets/js/5a378701.abc8db86.js delete mode 100644 assets/js/5a378701.f804e785.js delete mode 100644 assets/js/5a6ebb5c.0af53e22.js create mode 100644 assets/js/5a6ebb5c.127bc10c.js delete mode 100644 assets/js/5f7452e4.26462546.js create mode 100644 assets/js/5f7452e4.38065108.js delete mode 100644 assets/js/61856a46.2dde7a02.js create mode 100644 assets/js/61856a46.d8bdfb0e.js create mode 100644 assets/js/64837553.7ea1aa42.js delete mode 100644 assets/js/64837553.c7e6ef42.js delete mode 100644 assets/js/72d905a9.6c664fe1.js create mode 100644 assets/js/72d905a9.fb69ac6f.js create mode 100644 assets/js/73287945.b4e4ba6e.js delete mode 100644 assets/js/73287945.e71cfce7.js create mode 100644 assets/js/74876495.15b0c1e9.js delete mode 100644 assets/js/74876495.3bfa055b.js create mode 100644 assets/js/778b0fa6.180c28af.js delete mode 100644 assets/js/778b0fa6.f419d76e.js create mode 100644 assets/js/7b4f75c2.3c5e2cf9.js delete mode 100644 assets/js/7b4f75c2.49dd4e62.js delete mode 100644 assets/js/7ebd3339.c3c05102.js create mode 100644 assets/js/7ebd3339.d6aa4b2e.js create mode 100644 assets/js/812e048c.397090c1.js delete mode 100644 assets/js/812e048c.cc12e48d.js create mode 100644 assets/js/8b39be93.09830469.js delete mode 100644 assets/js/8b39be93.eb6d9d58.js delete mode 100644 assets/js/91a78c9f.055787b3.js create mode 100644 assets/js/91a78c9f.f02c9e98.js delete mode 100644 assets/js/925abbc7.c3c17436.js create mode 100644 assets/js/925abbc7.e3c9000b.js create mode 100644 assets/js/9bcab3db.544fccb4.js delete mode 100644 assets/js/9bcab3db.7daa78ab.js delete mode 100644 assets/js/9fd2a592.3a67aa4f.js create mode 100644 assets/js/9fd2a592.84dff9d4.js create mode 100644 assets/js/a16703cd.53e0bfce.js delete mode 100644 assets/js/a16703cd.a3295a26.js delete mode 100644 assets/js/a93ae359.1ee4806b.js create mode 100644 assets/js/a93ae359.a1767c63.js delete mode 100644 assets/js/ad895e75.13e7b34f.js create mode 100644 assets/js/ad895e75.1c516a11.js delete mode 100644 assets/js/af9480c3.7c9adf49.js create mode 100644 assets/js/af9480c3.99d1652c.js create mode 100644 assets/js/b46f7c12.16114bb2.js delete mode 100644 assets/js/b46f7c12.3100fbe6.js create mode 100644 assets/js/b49ba48c.caa11833.js delete mode 100644 assets/js/b49ba48c.e798877e.js delete mode 100644 assets/js/bf69edfb.c50ccff0.js create mode 100644 assets/js/bf69edfb.d12f9775.js create mode 100644 assets/js/c2e935db.64d4c215.js delete mode 100644 assets/js/c2e935db.ed551359.js create mode 100644 assets/js/cdda7d53.15b867c8.js delete mode 100644 assets/js/cdda7d53.3378a080.js create mode 100644 assets/js/d3a18f08.066bdca8.js delete mode 100644 assets/js/d3a18f08.ea51fc4e.js create mode 100644 assets/js/d50915e5.222d6408.js delete mode 100644 assets/js/d50915e5.3f036d92.js delete mode 100644 assets/js/d53edd15.9d3522ee.js create mode 100644 assets/js/d53edd15.c1d02ade.js create mode 100644 assets/js/dfa6d5b1.79649750.js delete mode 100644 assets/js/dfa6d5b1.bed44827.js delete mode 100644 assets/js/e6ac3f64.065ee538.js create mode 100644 assets/js/e6ac3f64.b17508a6.js delete mode 100644 assets/js/e7a53bbd.caba3573.js create mode 100644 assets/js/e7a53bbd.e67b3e0e.js delete mode 100644 assets/js/e82a470f.19ce1061.js create mode 100644 assets/js/e82a470f.9ee66086.js create mode 100644 assets/js/ea69cd8d.1b69a39c.js delete mode 100644 assets/js/ea69cd8d.ff01e187.js delete mode 100644 assets/js/f18fd350.4afa2ce8.js create mode 100644 assets/js/f18fd350.cacb4e1a.js delete mode 100644 assets/js/fa357871.84bc7d57.js create mode 100644 assets/js/fa357871.86b5747b.js delete mode 100644 assets/js/fee59995.19421a19.js create mode 100644 assets/js/fee59995.4edad005.js delete mode 100644 assets/js/runtime~main.35348c8b.js create mode 100644 assets/js/runtime~main.5478431f.js rename preview-images/{92ea61ac244b5bfee2bec534d2de523af8cd7cde.png => 03706fb208ac1c95a048ce78c924f6a19f6d9de8.png} (100%) rename preview-images/{4b38ed0830c0f1fbbb81589feb166cd9dd5cc098.png => 04775efabc71f03ace6ca23a19a0eb42f7979a84.png} (100%) rename preview-images/{30d7b1919fcafc63f61fd0330bf09c04e05fcc0c.png => 05f284f0205c8c68ceb1ed69ee1518288a7dd339.png} (100%) rename preview-images/{39e254c9904ed3353f81ec151fd337c6f7dd6e6c.png => 0c37a4e5a372efdc1e1d65a745db0b29439fe877.png} (100%) rename preview-images/{3614367ca56b77ce470f6691562213ed6c30b7f6.png => 0c77523f647c99228affbb7cb956564c93ef5c92.png} (100%) rename preview-images/{29df448c9d3d425aca41635206ed128fb93cb667.png => 103ab48dfe6eb199648d03ecc3c77cec51c6fa87.png} (100%) rename preview-images/{fea8269cfdf655360114effcd55053f6ffa73237.png => 16d4d38cfd79fffbff69a10c44661eae71d2fcc7.png} (100%) rename preview-images/{be0d078b11d99fe0d103a008c7e3eaf461712a2c.png => 179c53cdbf158c55e942b7daa77aa0cf6564dbf3.png} (100%) rename preview-images/{e71a277ea713347a1b4f1b8efd6b2ec48c1d2cba.png => 17ddd59273844114108795014334ef5f5d569ffe.png} (100%) rename preview-images/{0de5470e5880945fcd51ecb86bd93d38ff8e635b.png => 1da07869193dce3ae165631e8be9bf3b36e08c19.png} (100%) rename preview-images/{2446102e1afe96613b4668a28b430e40986b4cb3.png => 21021d29dd8223e60c197e795b86eee7bb295b36.png} (100%) rename preview-images/{4b74b86b96a056d4034bc2c62fbeec97e3068b5a.png => 24a3600f5d63fd7b145e726c3f6b8dcd7b4e3d0e.png} (100%) rename preview-images/{527077858e5a967d7456b53311e32eeb0880d04e.png => 28a3abbdf41acd4c4d09dfaa6cba0e29bcc7729c.png} (100%) rename preview-images/{993a672b5d02886c5dee7396fccb77a9caf2601e.png => 2b367609da9d1be3a932c7907ab32cce0731227d.png} (100%) rename preview-images/{8db6746b5ef661f980bf22ee90118b6816fa94f1.png => 30fa06f846d61e19cf0acf6cfd880732ad4b5dfc.png} (100%) rename preview-images/{f8fdcae039e16fe3a94af233d70e9791629ff8f7.png => 3a89200d5d0fe81af529b6ec8b4d422e12c78983.png} (100%) rename preview-images/{7754158319a66976e063101a1e142ac48ac5c2b4.png => 48b6ff8ee8f9850685e8e6b33ad662d93272054d.png} (100%) rename preview-images/{a67b52a6c7940097030157a1fd7d1da4f2eb6885.png => 496e9ca37357f69259598310ad399c73912f1bfc.png} (100%) rename preview-images/{0d90a01383f1887ce724c7a017566dc8f581ff88.png => 4b3c898122453c7cb23b575200057873f53251bc.png} (100%) rename preview-images/{6b12435cc5e4e694bafeeb520c0edae73b599ffe.png => 4c888284ab5bc9cdea04d3680043963785197ebe.png} (100%) rename preview-images/{5b0a9f7cdcc6055508f89da9983ac005a3f872a4.png => 537e2f7cddbd8cc6e30bf35d5c1569b44fa233b7.png} (100%) rename preview-images/{1efbb55e56a63d2a53aa40c6f8ccf5d388f6a348.png => 6764229ed00ed34f91e59ed8b2f463845a256272.png} (100%) rename preview-images/{88124dc72476e93c1b429c8b2b5fa6979043601e.png => 68958ca0d5c8349172bcccb56409b9b3307fee23.png} (100%) rename preview-images/{26ddb4e69b27077134883a971453453aa17b1082.png => 69114620132778c2d3729b3f7ee9c2f8c58d3e2f.png} (100%) rename preview-images/{05e730f1302d34adab3453e3395fa50362728450.png => 6bf948ab610df8177f8eb634b9873ccd233d536e.png} (100%) rename preview-images/{cf2cbb152015f78f3a4bb2b98506dd1f7ed70f96.png => 742fafe6b1cc18071721f07521e51ccd8865cbe6.png} (100%) rename preview-images/{674ba131f2c764d2e74df643171e46812341814b.png => 75933a10849bcda5c94e88d924f76d0478aabacb.png} (100%) rename preview-images/{754dbd8786e3fedd8174ef54bf214a52a4442445.png => 7671f601b5bb7490808cfbcf734c424b5fac6f56.png} (100%) rename preview-images/{fc3eda02a22ec0602dd7727cec2a36a872caddcc.png => 79ed183375a4a0564413ec5553c7be7fd066537f.png} (100%) rename preview-images/{aa0aefc75ec714349a7cdf25869c41b6ade6ba61.png => 7e5b38cfcd9b46d50d64c98661c62c544516db37.png} (100%) rename preview-images/{ff43c7945e1fc3544f8dae05b999e2a94d05d403.png => 8501ac64a388db642c3b20c9eb6cae4b48bddb7e.png} (100%) rename preview-images/{b4b24afe7847e9b97200fd83c5d941aa25c46bf6.png => 8957b9254d4397043c4ab5e6d161509b431f4434.png} (100%) rename preview-images/{54f26bae0a6112e472afd4f6e3d8ca20feddb1cc.png => 89b0a178f6301089b96666fc7d8cc18d6db58f4b.png} (100%) rename preview-images/{9bf6dab0114bce9fa1122e3f727e0dfd72aa25c5.png => 8b2c2164bf8ccc399a7df4c4db48528af2489e52.png} (100%) rename preview-images/{be26be2f8f4f06234d4d0621e448842a594dac1e.png => 8ee00d679eb7aade4de4793bde2262ed98910b72.png} (100%) rename preview-images/{c4735aa4ac2bd0c648690dbe4167171149651e5a.png => 91035358cd50bdf6e6bc07050c4a16738f10ee62.png} (100%) rename preview-images/{b70f487dd1041eeaeee50ca9d1e45f479a16fc54.png => 923ce523694d92226f4f4920b1f7c9d60fa756cb.png} (100%) rename preview-images/{3e11a15053b02be2a425643ae5dbc02386f27192.png => 97796d646d9ab37d860f4325b7ff8f269296f26e.png} (100%) rename preview-images/{d9e32b7c7e56ea9a70ce5c92cdd0d4b7faec8c12.png => 9c776c3a7d51378966630b607f406c2f23fd5a3c.png} (100%) rename preview-images/{555ae9612c6b4bc6f4f9b03edc447277f0713a3a.png => a3891dac5feaa7dca7be04ea66a7d27d3c66a42c.png} (100%) rename preview-images/{04c0fce5dbaa19b205b611b668eb84d9d3f3a8ef.png => a98c3609137c55346dbc825fbff2cbe1b3939987.png} (100%) rename preview-images/{c0d0e14d6285ffed446b2ee8586d709789c23334.png => aa417125ed564d95f29716e000e70d9a9356f666.png} (100%) rename preview-images/{3b0a547a6b984d2e032a302c572b45f211fcc025.png => b628bc3eb396995324ab219b62c779898c860113.png} (100%) rename preview-images/{209744ca2a8044af33b58e114cecc383643f9da8.png => baa09ddf64949ae5a42a58694169dfabf1ac0086.png} (100%) rename preview-images/{b4d06de89a56302e61ecfdebc6e9aa5e501b363d.png => c4461bf5fa39006bfa9f901892bcd0d71013cf56.png} (100%) rename preview-images/{0638d0f0852f8bf8496ba69bf81bdde09e952a52.png => c46d9d4e6c564e9bd3563cb50bd3a7fa1c28b1ca.png} (100%) rename preview-images/{16b9ded1db3f9acc99cb52883fd31bdeaa91eb19.png => c47b8a55ba7742a78253b7cb6d7bec8f42acc2b3.png} (100%) rename preview-images/{200b42265c5456b6822ac6ddf39d314a47a60b3d.png => cc7b0be3b6416435ac4507d62b08c9ef2dfbe4cc.png} (100%) rename preview-images/{1099a8c70c147f485f487cc54216f97f0c28e2d0.png => cda6a6fc0e0a83496cc01280fbd496c41144566e.png} (100%) rename preview-images/{32719a6504362e27295be76b7500131c31225229.png => cf72955bb2679cdf841459d86e94d8f35c8550b6.png} (100%) rename preview-images/{253e7351349408ef5cdb1ea5d57cd6e37e40b917.png => d1a7776d284a5723798250d90914741fc146f246.png} (100%) rename preview-images/{bc6d118156a3606cfe6a870cea49c97afa64fc29.png => dc1fc12b91baab0d238c6ef430c86d9a376cbd4f.png} (100%) rename preview-images/{a6f75922b2909c130885dbe9e06a4dd7d8a63fd6.png => e0a11f71d90583ef59048801aebc3f1875cc5fd1.png} (100%) rename preview-images/{bdfe1e194c00a8c03867902cdc8dace4c21b8499.png => e6321c6ba8e056688289cc2f354454f5b8637bd4.png} (100%) rename preview-images/{607b708f627c19eaf477d82185d067e88dd0137d.png => e65ec532045e436e8cfeea65bb7d9bcd4725323c.png} (100%) rename preview-images/{cabed9fe1559c114628931c386e1e0bd3a96a6dc.png => ef046a9b19154e7f488f4e4813052c406986b910.png} (100%) rename preview-images/{6a8d843c3f6b259a44d8bd321bc6707e641afc08.png => f3d5c11661e673642bcd793c1028175590bd465b.png} (100%) rename preview-images/{550f853c0f7d30f48a8522ec1c07caba5df9f4ec.png => f3fb2aef56d67d6955f9602e19b6b042716327dc.png} (100%) rename preview-images/{847403fc4fe7a0614fe9142df432119218931754.png => f40524df97f27040bece36444a713e94ea12b167.png} (100%) rename preview-images/{055d6df941439ca9d9b298310c51be9438b56feb.png => fc6464ea0b3991c20bb54d5c431a88f4f4140d06.png} (100%) rename preview-images/{df6746d8f308ca1a06a7021e97b2d6502ddda782.png => fc9f22a6744df6d773e206c0db0ab9771f640938.png} (100%) rename preview-images/{29157743ce8ac9646fb0b33a036155775eea0783.png => fca48c0d5952cc9318ceb4732cb081beb4b07a33.png} (100%) diff --git a/404.html b/404.html index 73aa55a2..ef87193f 100644 --- a/404.html +++ b/404.html @@ -5,7 +5,7 @@ Multi-Scrobbler - + diff --git a/FAQ/index.html b/FAQ/index.html index d7d8ad7b..de0374ef 100644 --- a/FAQ/index.html +++ b/FAQ/index.html @@ -3,11 +3,11 @@ -FAQ | Multi-Scrobbler +FAQ | Multi-Scrobbler - + - + @@ -138,6 +138,6 @@

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.

+

Provide ALL logs from the time when the issue occurred including logs from BEFORE (ideally 2-3 minutes of logs) and AFTER the issue.

\ No newline at end of file diff --git a/assets/js/04d926a5.9b86ad1f.js b/assets/js/04d926a5.9b86ad1f.js deleted file mode 100644 index 1a2e23d9..00000000 --- a/assets/js/04d926a5.9b86ad1f.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["4461"],{7265(e,n,i){i.d(n,{Ay:()=>c,RM:()=>o});var s=i(4848),r=i(8453),t=i(2170),l=i.n(t);let o=[];function a(e){let n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...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 Listening Activity 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)(l(),{language:"json5",title:`${e.filename}.json`,children:`{ - "data": { - // ... - }, - "options": { - // highlight-start - "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 - } - // highlight-end - } -}`})]})}function c(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},9625(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>f,frontMatter:()=>d,contentTitle:()=>h,toc:()=>x,assets:()=>u});var s=JSON.parse('{"id":"configuration/configuration","title":"Overview","description":"Configuration","source":"@site/docs/configuration/configuration.mdx","sourceDirName":"configuration","slug":"/configuration/","permalink":"/multi-scrobbler/configuration/","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","description":"Configuration","toc_max_heading_level":3},"sidebar":"tutorialSidebar","previous":{"title":"From < 0.14.0","permalink":"/multi-scrobbler/updating/upgrade-path/0140"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/clients/"}}'),r=i(4848),t=i(8453),l=i(8194),o=i(698),a=i(2170),c=i.n(a);i(2709),i(9461),i(8675),i(7265);let d={sidebar_position:2,title:"Overview",description:"Configuration",toc_max_heading_level:3},h,u={},x=[{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:"Base URL",id:"base-url",level:2},{value:"Caching",id:"caching",level:2},{value:"Secondary Caching Store",id:"secondary-caching",level:3},{value:"Database",id:"database",level:2},{value:"Retention",id:"retention",level:3},{value:"Configuring Compaction Policy",id:"configuring-compaction-policy",level:4},{value:"Configuring Deletion Policy",id:"configuring-deletion-policy",level:4},{value:"Debug Mode",id:"debug-mode",level:2},{value:"Disable Web",id:"disable-web",level:2},{value:"Monitoring",id:"monitoring",level:2},{value:"Upstream Services Status",id:"upstream-services-status",level:3},{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},{value:"Prometheus",id:"prometheus",level:3}];function j(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",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,t.R)(),...e.components},{Details:s,DetailsAdmo:a}=n;return s||p("Details",!0),a||p("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 type."]}),"\n",(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsx)(n.p,{children:"MS will parse environmental variables present in the OS/container when it is run."}),(0,r.jsxs)(n.p,{children:["This method means MS ",(0,r.jsx)(n.strong,{children:"does not require config files"})," but it will still create and use data files in the ",(0,r.jsx)(n.a,{href:"/installation/#config-and-data-directories",children:"local"})," or ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:"docker"})," data directory."]}),(0,r.jsxs)(s,{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 or"}),"\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 Jellyfin -> Koito, or"]}),"\n",(0,r.jsx)(n.li,{children:"You are not comfortable editing JSON files"}),"\n"]})]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(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 - JELLYFIN_URL=192.168.0.110:8096\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b\n - JELLYFIN_USER=MyUser\n - JELLYFIN_ID=myJellyin\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.A,{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 -> See ",(0,r.jsx)(n.a,{href:"/installation/#config-and-data-directories",children:"Config and Data Directories"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config"})," (in the container) -- see the ",(0,r.jsxs)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:[(0,r.jsx)(n.strong,{children:"Storage"})," tab in the Docker installation docs"]})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Use File-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You are comfortable editing JSON files"}),"\n",(0,r.jsxs)(n.li,{children:["You have more than one of the same type of ",(0,r.jsx)(n.strong,{children:"Source/Client"})," you want to use EX 2x Last.fm accounts, 3x Jellyfin accounts"]}),"\n",(0,r.jsxs)(n.li,{children:["You want activity from specific ",(0,r.jsx)(n.strong,{children:"Sources"})," 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, more configuration is possible using File. AIO enables complete configuration."}),"\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.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["These are the same examples you will find in the ",(0,r.jsx)(n.strong,{children:"Configuration"})," section of each Source/Client"]}),"\n"]}),"\n"]}),"\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 config file is named after the ",(0,r.jsx)(n.strong,{children:"type"})," of the Client/Source. Within each file, a JSON ",(0,r.jsx)(n.strong,{children:"array"})," defines all of the instances for 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 jellyfin.json\n lastfm.json\n koito.json\n"})}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="jellyfin.json"',children:'[\n {\n "name": "Foxx JF Server",\n "id": "foxxJf",\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n }\n]\n'})})]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Multiple of Same Config Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="jellyfin.json"',children:'[\n {\n "name": "Foxx JF Server",\n "id": "foxxJf",\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n },\n // highlight-start\n {\n "name": "Foo\'s JF Server",\n "id": "fooJf",\n "data": {\n "url": "http://192.168.0.150:8096",\n "user": "foo",\n "apiKey": "9c5bb56bd6540c756fbf481ebd9c5c40"\n }\n }\n // highlight-end\n]\n'})})]}),(0,r.jsxs)(n.p,{children:["You can find an example of the file name that should be used under the ",(0,r.jsx)(n.strong,{children:"File"})," Configuration for each Source/Client. Note: this is the same value that is used for ",(0,r.jsx)(n.code,{children:"type"})," in AIO configs."]})]}),(0,r.jsxs)(o.A,{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 (",(0,r.jsx)(n.code,{children:"config.json"}),") located in the directory specified by the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," environmental variable. The file's location defaults to:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Local installation -> See ",(0,r.jsx)(n.a,{href:"/installation/#config-and-data-directories",children:"Config and Data Directories"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config/config.json"})," (in the container) -- see the ",(0,r.jsxs)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:[(0,r.jsx)(n.strong,{children:"Storage"})," tab in the Docker installation docs"]})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Use AIO-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["...All of the reasons listed in ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})]}),"\n",(0,r.jsxs)(n.li,{children:["You want to setup ",(0,r.jsx)(n.a,{href:"#monitoring",children:"monitoring/webhooks"}),", default settings for all Sources/Clients, or global config options"]}),"\n",(0,r.jsxs)(n.li,{children:["You want to use ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Transformers"})," (other than what is provided for ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz/#env-configuration",children:"Musicbrainz ENV"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"You want complete control over all potential MS configuration"}),"\n"]})]}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:'AIO config is the "complete" way to configure MS.'}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["All settings available in File/ENV are available in AIO and AIO has ",(0,r.jsx)(n.em,{children:"more"})," exclusive settings."]}),"\n",(0,r.jsxs)(n.li,{children:["AIO enables configuring ",(0,r.jsx)(n.strong,{children:"default settings"})," for all Sources/Clients"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["There is 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.li,{children:["Use the ",(0,r.jsx)(n.a,{href:"/playground",children:(0,r.jsx)(n.strong,{children:"Config Playground"})})," to explore the entire config schema with an editable example","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The example used can also be found in the repo 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"})})," in the example below"]}),"\n"]}),"\n"]}),"\n"]})}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(c(),{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": "Cool Spotify Name",\n "id": "mySpotifyId",\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": "Foxx Maloja",\n "id": "myMalojaId",\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'})]}),(0,r.jsxs)(a,{type:"important",summary:"Source/Client AIO Configs require a 'type' property",children:[(0,r.jsxs)(n.p,{children:["Compared to their ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," equivalent, Sources/Clients configured using AIO require an additional ",(0,r.jsx)(n.code,{children:"type"})," property."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="config.json"',children:'{\n "sources": [\n {\n "name": "Foxx JF Server",\n // highlight-start\n "type: "jellyfin",\n // highlight-end\n "id": "foxxJf",\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["You can find an example of the required ",(0,r.jsx)(n.code,{children:"type"})," value by referring to the ",(0,r.jsx)(n.strong,{children:"AIO"})," tab in each Source/Client's Configuration section example. This is the same value that is used as the name of individual ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," config files."]})]})]})]}),"\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:"/configuration/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)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Given this ",(0,r.jsx)(n.a,{href:"/configuration/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)(a,{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)(a,{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)(a,{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:"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 for services like ",(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)(s,{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.h2,{id:"caching",children:"Caching"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler implements caching to reduce external API calls and make some actions faster."}),"\n",(0,r.jsxs)(n.p,{children:["A default ",(0,r.jsx)(n.strong,{children:"in-memory"})," cache store is used so that you always benefit from some caching. An optional, ",(0,r.jsxs)(n.a,{href:"#secondary-caching",children:[(0,r.jsx)(n.strong,{children:"secondary"})," store"]})," can be configured for greater caching capabilities."]}),"\n",(0,r.jsx)(a,{type:"note",summary:"What is Cached?",children:(0,r.jsxs)(l.A,{groupId:"cachedThings",children:[(0,r.jsx)(o.A,{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.jsx)(o.A,{value:"transform",label:"Scrobble Transforms",children:(0,r.jsxs)(n.p,{children:["The results of ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"transform rules"})," are cached so that if a scrobble with identical data (track/artists/album) is identified and it has the same set of transform rules then the cached transform results can be applied."]})}),(0,r.jsx)(o.A,{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."]})})]})}),"\n",(0,r.jsxs)(a,{type:"important",summary:"Auth Cache Configuration",children:[(0,r.jsxs)(n.p,{children:["Auth caching defaults to a ",(0,r.jsx)(n.strong,{children:"file"})," that is stored in the ",(0,r.jsx)(n.code,{children:"DATA_DIR"})," directory using the pre-defined file name ",(0,r.jsx)(n.code,{children:"ms-auth.cache"}),"."]}),(0,r.jsxs)(n.p,{children:["This provides automatic persistence across restarts for long-lived auth data/credentials if you have configured a ",(0,r.jsx)(n.a,{href:"/installation?dockerSetting=storage#recommended-settings",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"}),")."]}),(0,r.jsxs)(n.p,{children:["If you wish to use the ",(0,r.jsx)(n.a,{href:"#secondary-caching",children:"secondary store"})," for caching Auth you must explicitly configure it. This is because valkey can potentially be ",(0,r.jsx)(n.em,{children:"ephemeral"})," if you do not provide a volume for its data directory."]}),(0,r.jsx)(n.p,{children:"To explicitly configure auth to use the secondary store:"}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(o.A,{value:"env",label:"ENV",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n // highlight-start\n - CACHE_AUTH=valkey\n // highlight-end\n # ...\n"})})}),(0,r.jsx)(o.A,{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": "valkey"\n }\n },\n // ...\n}\n'})})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"secondary-caching",children:"Secondary Caching Store"}),"\n",(0,r.jsx)(n.p,{children:"Using a secondary store enables:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"persistence of cached data across restarts"}),"\n",(0,r.jsx)(n.li,{children:"a larger store (more data is saved)"}),"\n",(0,r.jsx)(n.li,{children:"a longer time-to-live in the store (cached data is fetchable for a longer period)"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["These benefits are particularly beneficial when using ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"transforms"})," like Musicbrainz and it is ",(0,r.jsx)(n.strong,{children:"strongly recommended"})," for these scenarios."]}),"\n",(0,r.jsxs)(n.p,{children:["Currently, Multi-scrobbler only supports ",(0,r.jsx)(n.a,{href:"https://valkey.io/",children:(0,r.jsx)(n.strong,{children:"Valkey"})}),", an open-source fork of Redis, as a secondary store."]}),"\n",(0,r.jsxs)(s,{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.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{value:"named",label:"Named Volume",children:(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 // 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.jsx)(o.A,{value:"bind",label:"Bind Mount",children:(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 // highlight-start\n valkey:\n image: valkey/valkey\n volumes:\n - ./valkeyData:/data\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."]})]}),"\n",(0,r.jsx)(n.p,{children:"The connection string used by multi-scrobbler to connect to your Valkey instance must be in the form:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"redis://HOST_IP:HOST_PORT\n"})}),"\n",(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(o.A,{value:"env",label:"ENV",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n // highlight-start\n - CACHE_VALKEY=redis://192.168.0.120:6379\n // highlight-end\n # ...\n"})})}),(0,r.jsxs)(o.A,{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 "valkey": "redis://192.168.0.120:6379"\n },\n // ...\n}\n'})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"database",children:"Database"}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler depends on a SQLite database (",(0,r.jsx)(n.code,{children:"ms.db"}),") that is created on first run and stored in the ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:(0,r.jsx)(n.code,{children:"CONFIG_DIR"})}),". When upgrading Multi-scrobbler version, if there are any required database changes than this database is ",(0,r.jsx)(n.a,{href:"/updating#database",children:"automatically backed up and migrated."})]}),"\n",(0,r.jsxs)(n.p,{children:["The database stores ",(0,r.jsx)(n.em,{children:"all"})," Plays for your Sources/Clients as well as metadata and debugging information to help troubleshoot issues. Each Play is associated with a Source/Config in the database based on your configuration."]}),"\n",(0,r.jsxs)(n.p,{children:["You ",(0,r.jsx)(n.strong,{children:"must set IDs for each Source/Client"})," so that the database can identify these even when the configuration is changed."]}),"\n",(0,r.jsx)(n.h3,{id:"retention",children:"Retention"}),"\n",(0,r.jsxs)(a,{status:"note",summary:"How much storage does the database use?",children:[(0,r.jsx)(n.p,{children:"The amount of data stored for each Play can widely vary based on a few factors:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"how much data the Source service exposes"}),"\n",(0,r.jsx)(n.li,{children:"how many clients each Source is scrobble to (Plays are duplicated for each Client a Source sends a scrobble to)"}),"\n",(0,r.jsxs)(n.li,{children:["if you are using any ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Transforms"})," the diff of each step is stored, along with any external request/response data (like ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz queries"}),")"]}),"\n"]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/tests/database/drizzle.test.ts#L551",children:"MS repository contains a benchmark"})," to measure an average database size in a few common scenarios."]}),(0,r.jsxs)(l.A,{groupId:"dbSize",children:[(0,r.jsxs)(o.A,{label:"Minimal",value:"minimal",children:[(0,r.jsx)(n.p,{children:"Assuming your Sources send a minimal amount of data or you have compacted all plays:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Play Count"}),(0,r.jsx)(n.th,{children:"DB Size"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"160kb"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"1MB"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"10k"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"10.2MB"})})]})]})]})]}),(0,r.jsxs)(o.A,{label:"With Original Input",value:"input",children:[(0,r.jsx)(n.p,{children:"Assuming your Sources have a non-trivial amount of input data (like Spotify or Listenbrainz) that is not compacted:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Play Count"}),(0,r.jsx)(n.th,{children:"DB Size"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"356kb"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"3MB"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"10k"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"29.6MB"})})]})]})]})]}),(0,r.jsxs)(o.A,{label:"All Debug Deta",value:"all",children:[(0,r.jsx)(n.p,{children:"Assuming your Sources/Clients:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"have a non-trivial amount of input data (like Spotify or Listenbrainz)"}),"\n",(0,r.jsxs)(n.li,{children:["and has many ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Transforms"})," steps that include requests"]}),"\n",(0,r.jsx)(n.li,{children:"nothing is compacted"}),"\n"]}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Play Count"}),(0,r.jsx)(n.th,{children:"DB Size"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"684kb"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"6.28MB"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"10k"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"61.3MB"})})]})]})]})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"A retention policy can be configured to delete Plays, or unused debug data, from the database after a certain amount of time. If no configuration is provided then a default policy is used that should be reasonable for most users."}),"\n",(0,r.jsxs)(l.A,{groupId:"policy",queryString:!0,children:[(0,r.jsxs)(o.A,{label:"Compaction",value:"compaction",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Compaction"})," Retention Policy is used to delete different types of debug data from your stored Plays."]}),(0,r.jsx)(n.p,{children:"This is a useful way to reduce used storage space when you are not having problems with your Plays, or iterating on a configuration, that requires referencing all this extra data."}),(0,r.jsx)(n.p,{children:"There are two types of data that can be compacted (deleted from the Play):"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"input"})," - this is the untouched data retrieved by Multi-scrobbler, from a Source, and used to generate a Play/scrobble. This can be used to reconstruct and replay a Play, when used from troubleshooting or reporting an issue"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"transform"})," - this is all of the steps generated by ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"transforms"}),", the diff of the Play resulting from the step, and any request/responses used to complete the step"]}),"\n"]}),(0,r.jsxs)(n.admonition,{title:"Defaults",type:"note",children:[(0,r.jsx)(n.p,{children:"When no Compact configuration is provided, Multi-scrobbler uses this policy:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Compact (delete) ",(0,r.jsx)(n.code,{children:"input"})," and ",(0,r.jsx)(n.code,{children:"transform"})," data on all Plays after 3 days"]}),"\n"]})]}),(0,r.jsx)(n.h4,{id:"configuring-compaction-policy",children:"Configuring Compaction Policy"}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Details"}),(0,r.jsx)(n.p,{children:"Each value in the configuration properties below can be either"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["a number of seconds EX ",(0,r.jsx)(n.code,{children:"3600"})," = 10 minutes"]}),"\n",(0,r.jsxs)(n.li,{children:["a unit of a common duration with the pattern ",(0,r.jsx)(n.code,{children:"X unit"})," EX","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"30 minutes"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"5 hours"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"2 days"})}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"COMPACT_PROPERTIES"})," - which properties to compact"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_AFTER"})," - Default to use for all Plays"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_COMPLETED_AFTER"})," - Compact only completed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_FAILED_AFTER"})," - Compact only failed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_DUPED_AFTER"})," - Compact only duped/discard Plays after..."]}),"\n"]}),(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ini",children:"# only delete input when compacting\nCOMPACT_PROPERTIES=input\n# compact all plays after 3 days \nRETENTION_COMPACT_AFTER=3 days\n# specifically compact completed plays after 30 minutes\nRETENTION_COMPACT_COMPLETED_AFTER=30 minutes\n"})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Compacting all Play types and deleting both input and transform:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "compactAfter": "3 days",\n "compact": [\n "input",\n "transform"\n ]\n }\n }\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Delete only input during compacting"}),"\n",(0,r.jsx)(n.li,{children:"Compact all after 3 days except completed which compacts after 30 minutes"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "compactAfter": {\n "completed": "30 minutes",\n "duped": "3 days",\n "failed": "3 days"\n },\n "compact": [\n "input"\n ]\n }\n }\n}\n'})})]})]})]})]}),(0,r.jsxs)(o.A,{label:"Deletion",value:"deletion",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Deletion"})," Retention Policy is used to delete different types of stored Plays from Multi-scrobbler database."]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"This does not delete Plays from your Clients."}),' It\'s only deleting the "in-flight" data MS used to create the scrobble that was eventually sent to your clients.']}),(0,r.jsxs)(n.admonition,{title:"Plays Should be Ephemeral",type:"warning",children:[(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Multi-Scrobbler is not designed to store Plays/Scrobbles indefinitely."})}),(0,r.jsx)(n.p,{children:"It should scale fine for thousands of scrobbles but it not meant to store 10's of thousands of scrobbles forever. It is not a scrobbler server."}),(0,r.jsxs)(n.p,{children:["You ",(0,r.jsx)(n.strong,{children:"should"})," set a reasonable deletion policy so that MS stores less than 1000 scrobbles at a time, ideally less."]})]}),(0,r.jsxs)(n.admonition,{title:"Defaults",type:"note",children:[(0,r.jsx)(n.p,{children:"When no Deletion policy configuration is provided, Multi-scrobbler uses this policy:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Delete all Plays after 7 days"}),"\n"]})]}),(0,r.jsx)(n.h4,{id:"configuring-deletion-policy",children:"Configuring Deletion Policy"}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Details"}),(0,r.jsx)(n.p,{children:"Each value in the configuration properties below can be either"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["a number of seconds EX ",(0,r.jsx)(n.code,{children:"3600"})," = 10 minutes"]}),"\n",(0,r.jsxs)(n.li,{children:["a unit of a common duration with the pattern ",(0,r.jsx)(n.code,{children:"X unit"})," EX","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"30 minutes"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"5 hours"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"2 days"})}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_AFTER"})," - Default to use for all Plays"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_COMPLETED_AFTER"})," - Delete only completed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_FAILED_AFTER"})," - Delete only failed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_DUPED_AFTER"})," - Delete only duped/discard Plays after..."]}),"\n"]}),(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ini",children:"# delete all plays after 3 days \nRETENTION_DELETE_AFTER=3 days\n# specifically, delete completed plays after 30 minutes\nRETENTIOND_DELETE_COMPLETED_AFTER=30 minutes\n"})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Deleting all Play types after 3 days:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "deleteAfter": "3 days"\n }\n }\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Delete all after 3 days except completed which are deleted after 30 minutes"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "deleteAfter": {\n "completed": "30 minutes",\n "duped": "3 days",\n "failed": "3 days"\n },\n }\n }\n}\n'})})]})]})]})]})]}),"\n",(0,r.jsx)(n.h2,{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.h2,{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?sourceComm=ingress#by-communication-method",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.h3,{id:"upstream-services-status",children:"Upstream Services Status"}),"\n",(0,r.jsx)(n.p,{children:"A status page for monitoring the reachability of public services used by some Sources/Clients is available at"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://status.multi-scrobbler.app",children:"https://status.multi-scrobbler.app"})})}),"\n",(0,r.jsxs)(n.p,{children:["This monitor runs on a VPS and checks the uptime of ",(0,r.jsx)(n.em,{children:"actual"})," APIs for these services, not just landing pages. On a ~minute interval it checks:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Listenbrainz API"}),"\n",(0,r.jsx)(n.li,{children:"Musicbrainz API"}),"\n",(0,r.jsx)(n.li,{children:"CoverArtArchive API"}),"\n",(0,r.jsx)(n.li,{children:"Last.fm API"}),"\n",(0,r.jsx)(n.li,{children:"A few MS-hosted support services"}),"\n"]}),"\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)(s,{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:"/playground",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)(s,{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:"/playground",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)(s,{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:"/playground",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)(s,{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/api/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:"/api/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:"/api/health?type=spotify"})," or ",(0,r.jsx)(n.code,{children:"/api/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:"/api/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:"/api/health"})," will 500 if they are ",(0,r.jsx)(n.strong,{children:"not polling"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"prometheus",children:"Prometheus"}),"\n",(0,r.jsxs)(n.p,{children:["A ",(0,r.jsx)(n.a,{href:"https://prometheus.io/",children:"Prometheus"})," export endpoint is available at GET ",(0,r.jsx)(n.code,{children:"http://YourMultiScrobblerDomain/api/metrics"})]}),"\n",(0,r.jsx)(n.p,{children:"It includes metrics for:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Count of discovered plays per ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Source"})]}),"\n",(0,r.jsxs)(n.li,{children:["Count of Queued/Scrobbled/Deadletter scrobbles per ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"})]}),"\n",(0,r.jsxs)(n.li,{children:["Number of issues per Source/Client","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"If any of these metrics is > 0 it means your Source/Client is not operating normally"}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:"Caching metrics"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Additionally, general process metrics like cpu and memory usage can be enabled with the env ",(0,r.jsx)(n.code,{children:"PROMETHEUS_FULL=true"})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example Usage"}),(0,r.jsxs)(n.p,{children:["Update your ",(0,r.jsx)(n.a,{href:"https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file",children:"Prometheus Configuration file"})," (usually at ",(0,r.jsx)(n.code,{children:"/etc/prometheus.yml"}),") to add a job to the ",(0,r.jsx)(n.code,{children:"scrape_configs"}),(0,r.jsx)(n.a,{href:"https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config",children:"section"})," like this:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"scrape_configs:\n #\n # ...your other jobs are here\n # \n - job_name: multi-scrobbler\n scrape_interval: 30s\n metrics_path: '/api/metrics'\n static_configs:\n - targets: ['myMultiscrobblerIp:9078']\n"})})]}),"\n",(0,r.jsxs)(a,{status:"tip",summary:"Grafana Dashboard",children:[(0,r.jsxs)(n.p,{children:["Github user ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/507#issuecomment-4144982295",children:"4rft5"})," created a Grafana dashboard that uses the Prometheus metrics from above."]}),(0,r.jsx)("img",{src:i(6434).A,height:"800"}),(0,r.jsxs)(n.p,{children:["Download the json dashboard here: ",(0,r.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:i(3096).A+"",children:(0,r.jsx)(n.code,{children:"multiscrobbler-dashboard.json"})})]})]})]})}function f(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(j,{...e})}):j(e)}function p(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9461(e,n,i){i.d(n,{A:()=>h}),i(6540);var s=i(2170),r=i.n(s),t=i(5548),l=i(349),o=i(1219),a=i.n(o),c=i(4848);let d=e=>{let n,{data:i,name:s,client:l=!1}=e;try{n=a().parse(i)}catch(e){return console.error(e),(0,c.jsxs)(t.A,{type:"danger",title:"Unexpected Error",children:[(0,c.jsx)("p",{children:"Example component crashed because of error!"}),(0,c.jsx)(r(),{children:e.message})]})}n=(n=n.filter(e=>void 0===e.configureAs||e.configureAs===(l?"client":"source"))).map(e=>({...e,type:s}));let o={[l?"clients":"sources"]:n};return(0,c.jsx)(r(),{title:"CONFIG_DIR/config.json",language:"json5",children:JSON.stringify(o,null,2)})},h=e=>(0,c.jsx)(l.A,{fallback:({error:e})=>(0,c.jsx)("div",{children:(0,c.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,c.jsx)(d,{...e})})},1672(e,n,i){i.d(n,{A:()=>l}),i(6540);var s=i(4164),r=i(8774),t=i(4848);function l({size:e=null,outline:n=!1,variant:i="primary",block:o=!1,disabled:a=!1,className:c,style:d={},link:h,label:u,onClick:x=()=>null,...j}){let f=e?({sm:"sm",small:"sm",lg:"lg",large:"lg",medium:null})[e]:"",p=f?`button--${f}`:"",m=i?`button--${i}`:"";return(0,t.jsx)(r.A,{to:a?null:h,children:(0,t.jsx)("button",{className:(0,s.A)("button",p,n?"button--outline":"",m,o?"button--block":"",a?"disabled":"",c),style:d,role:"button","aria-disabled":a,onClick:e=>{e.preventDefault(),x()},...j,children:u})})}},9643(e,n,i){i.d(n,{A:()=>a}),i(6540);var s=i(1672),r=i(4848);let t={borderRadius:"var(--ifm-button-border-radius) 0 0 var(--ifm-button-border-radius)"},l={borderRadius:"0 var(--ifm-button-border-radius) var(--ifm-button-border-radius) 0"},o={borderRadius:"0"};function a({size:e=null,variant:n="primary",block:i=!1,disabled:c=!1,className:d,style:h,options:u,value:x,defaultValue:j,onChange:f=()=>null}){if(void 0===u||0===u.length)return null;let p=u.map((i,a)=>{let c={style:o,outline:!0,size:e,variant:n,label:i[1],link:"#",onClick:()=>f(i[0])};return 0===a?c.style=t:a===u.length-1&&(c.style=l),(x??j)===i[0]&&(c.outline=!1),(0,r.jsx)(s.A,{...c},a)});return(0,r.jsx)("span",{children:p})}},8675(e,n,i){i.d(n,{A:()=>j});var s=i(6540),r=i(2170),t=i.n(r),l=i(349),o=i(8193);let a={};var c=i(9643),d=i(1922),h=i(4581),u=i(4848);let x=e=>{let{data:n,interactive:i=!0,defaultDisplay:r="interactive",schemaName:l,filePathName:x,readOnlyAtWidth:j=1,...f}=e,[p,m]=((e,n,i)=>{let r;return e in a?a[e]():o.A.canUseDOM?(a[e]=(r=[],()=>{let[t,l]=((e,n,i=!0)=>{let[r,t]=(0,s.useState)(()=>{let s=window.localStorage.getItem(e);if(i)try{return s?JSON.parse(s):n}catch(e){return console.error(e),n}try{let e;if(null===s)return n;if("true"===s)return!0;if("false"===s)return!1;if(e=s,("number"==typeof e||"string"==typeof e&&""!==e.trim())&&!isNaN(e)){if(s.includes("."))return parseFloat(s);return parseInt(s)}return s}catch(e){return console.error(e),n}}),l=(0,s.useCallback)(n=>{t(()=>(i?localStorage.setItem(e,JSON.stringify(n)):localStorage.setItem(e,n),n))},[e]);return(0,s.useEffect)(()=>{let i=i=>{i.storageArea===localStorage&&i.key===e&&t(null===i.newValue?n:i.newValue)};return window.addEventListener("storage",i),()=>window.removeEventListener("storage",i)}),[r,l]})(e,n,i),o=(0,s.useCallback)(e=>{for(let n of r)n(e)},[]);return(0,s.useEffect)(()=>(r.push(l),()=>{r.splice(r.indexOf(l),1)}),[l]),[t,o]}),a[e]()):[n,()=>null]})("docusaurus.tab.fileExampleShow",r,!1),g=(0,h.l)({desktopBreakpoint:j}),b=null,y=i&&"desktop"===g;y&&(b=(0,u.jsx)(c.A,{options:[["plain","Plain"],["interactive","Interactive"]],defaultValue:r,value:p,variant:"primary",size:"medium",onChange:e=>m(e)}));let v=null;void 0!==x&&y&&"interactive"===p&&(v=(0,u.jsx)("code",{style:{float:"right",paddingRight:"0.5em",paddingLeft:"0.5em"},children:x}));let E=null;(null!==b||null!==v)&&(E=(0,u.jsxs)("div",{style:{marginBottom:"1em"},children:[b,v]}));let A=(0,s.useMemo)(()=>y&&"interactive"===p?null:"string"!=typeof n?JSON.stringify(n,null,2):n,[i,p,n]);return(0,u.jsxs)(s.Fragment,{children:[E,y&&"plain"!==p?null:(0,u.jsx)(t(),{title:x,language:"json5",children:A}),y&&"interactive"===p?(0,u.jsx)(d.A,{configContent:n,schemaName:l}):null]})},j=e=>(0,u.jsx)(l.A,{fallback:({error:e})=>(0,u.jsx)("div",{children:(0,u.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,u.jsx)(x,{...e})})},1922(e,n,i){i.d(n,{A:()=>m});var s=i(6540),r=i(6025),t=i(8478),l=i(5293),o=i(4020),a=i(7433),c=i.n(a),d=i(8182),h=i.n(d),u=i(1219),x=i.n(u),j=i(4848);function f(e){let n=(0,s.useMemo)(()=>{if(void 0!==e.schema)return(0,o.IM)({schema:e.schema,ajvOptions:{strict:"log",strictSchema:"log",allowUnionTypes:!0},onCreateAjv:e=>{let n=new(c());return n.addKeyword("deprecationMessage"),n.addKeyword("zockerId"),h().default(n),n}})},[e.schema]),i=(0,s.useMemo)(()=>({json:"string"==typeof e.config?x().parse(e.config):e.config}),[e.config]),{colorMode:r}=(0,l.G)();return(0,j.jsx)(o.t$,{validator:n,theme:r,mode:"text",content:i,style:{height:"initial"}})}function p(e){return(0,j.jsx)(t.default,{fallback:(0,j.jsx)("div",{children:"Loading..."}),children:()=>(0,j.jsx)(f,{...e})})}function m(e){let{schemaName:n}=e,[i,t]=(0,s.useState)(void 0),[l,o]=(0,s.useState)(void 0),a=void 0===n?void 0:(0,r.Ay)(`schemas/${e.schemaName}.json`);return(0,s.useEffect)(()=>{void 0===a?t(!1):fetch(a,{headers:{Accept:"application/json"}}).then(e=>e.json()).then(e=>t(e)).catch(e=>t(e))},[t,a]),(0,j.jsxs)(s.Fragment,{children:[void 0===i&&(0,j.jsx)("div",{children:"Loading ..."}),void 0!==i&&i instanceof Error&&(0,j.jsxs)("div",{children:["Houston we have a problem : ",i.message]}),void 0!==i&&!(i instanceof Error)&&(0,j.jsx)(p,{schema:!1===i?void 0:i,config:e.configContent})]})}},2709(e,n,i){i.d(n,{A:()=>t});var s=i(6540),r=i(4848);let t=e=>{let{children:n,lower:i,client:t=!1}=e,l=n;void 0===l&&(l=(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=${t?"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})}},3096(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/files/multiscrobbler-dashboard-814b740dbbd83aba08598320999b9f67.json"},6434(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/grafana-004a8d8d2ec395ad949e9f5b79406a32.png"}}]); \ No newline at end of file diff --git a/assets/js/04d926a5.ec6f4fcd.js b/assets/js/04d926a5.ec6f4fcd.js new file mode 100644 index 00000000..04775b6d --- /dev/null +++ b/assets/js/04d926a5.ec6f4fcd.js @@ -0,0 +1,13 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["4461"],{7265(e,n,i){i.d(n,{Ay:()=>c,RM:()=>o});var s=i(4848),r=i(8453),t=i(2170),l=i.n(t);let o=[];function a(e){let n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...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 Listening Activity 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)(l(),{language:"json5",title:`${e.filename}.json`,children:`{ + "data": { + // ... + }, + "options": { + // highlight-start + "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 + } + // highlight-end + } +}`})]})}function c(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},9625(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>f,frontMatter:()=>d,contentTitle:()=>h,toc:()=>x,assets:()=>u});var s=JSON.parse('{"id":"configuration/configuration","title":"Overview","description":"Configuration","source":"@site/docs/configuration/configuration.mdx","sourceDirName":"configuration","slug":"/configuration/","permalink":"/multi-scrobbler/configuration/","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","description":"Configuration","toc_max_heading_level":3},"sidebar":"tutorialSidebar","previous":{"title":"From < 0.14.0","permalink":"/multi-scrobbler/updating/upgrade-path/0140"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/clients/"}}'),r=i(4848),t=i(8453),l=i(8194),o=i(698),a=i(2170),c=i.n(a);i(2709),i(9461),i(8675),i(7265);let d={sidebar_position:2,title:"Overview",description:"Configuration",toc_max_heading_level:3},h,u={},x=[{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:"Base URL",id:"base-url",level:2},{value:"Caching",id:"caching",level:2},{value:"Secondary Caching Store",id:"secondary-caching",level:3},{value:"Database",id:"database",level:2},{value:"Retention",id:"retention",level:3},{value:"Configuring Compaction Policy",id:"configuring-compaction-policy",level:4},{value:"Configuring Deletion Policy",id:"configuring-deletion-policy",level:4},{value:"Debug Mode",id:"debug-mode",level:2},{value:"Disable Web",id:"disable-web",level:2},{value:"Monitoring",id:"monitoring",level:2},{value:"Upstream Services Status",id:"upstream-services-status",level:3},{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},{value:"Prometheus",id:"prometheus",level:3}];function j(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",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,t.R)(),...e.components},{Details:s,DetailsAdmo:a}=n;return s||p("Details",!0),a||p("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 type."]}),"\n",(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsx)(n.p,{children:"MS will parse environmental variables present in the OS/container when it is run."}),(0,r.jsxs)(n.p,{children:["This method means MS ",(0,r.jsx)(n.strong,{children:"does not require config files"})," but it will still create and use data files in the ",(0,r.jsx)(n.a,{href:"/installation/#config-and-data-directories",children:"local"})," or ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:"docker"})," data directory."]}),(0,r.jsxs)(s,{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 or"}),"\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 Jellyfin -> Koito, or"]}),"\n",(0,r.jsx)(n.li,{children:"You are not comfortable editing JSON files"}),"\n"]})]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(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 - JELLYFIN_URL=192.168.0.110:8096\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b\n - JELLYFIN_USER=MyUser\n - JELLYFIN_ID=myJellyin\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.A,{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 -> See ",(0,r.jsx)(n.a,{href:"/installation/#config-and-data-directories",children:"Config and Data Directories"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config"})," (in the container) -- see the ",(0,r.jsxs)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:[(0,r.jsx)(n.strong,{children:"Storage"})," tab in the Docker installation docs"]})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Use File-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You are comfortable editing JSON files"}),"\n",(0,r.jsxs)(n.li,{children:["You have more than one of the same type of ",(0,r.jsx)(n.strong,{children:"Source/Client"})," you want to use EX 2x Last.fm accounts, 3x Jellyfin accounts"]}),"\n",(0,r.jsxs)(n.li,{children:["You want activity from specific ",(0,r.jsx)(n.strong,{children:"Sources"})," 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, more configuration is possible using File. AIO enables complete configuration."}),"\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.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["These are the same examples you will find in the ",(0,r.jsx)(n.strong,{children:"Configuration"})," section of each Source/Client"]}),"\n"]}),"\n"]}),"\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 config file is named after the ",(0,r.jsx)(n.strong,{children:"type"})," of the Client/Source. Within each file, a JSON ",(0,r.jsx)(n.strong,{children:"array"})," defines all of the instances for 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 jellyfin.json\n lastfm.json\n koito.json\n"})}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="jellyfin.json"',children:'[\n {\n "name": "Foxx JF Server",\n "id": "foxxJf",\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n }\n]\n'})})]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Multiple of Same Config Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="jellyfin.json"',children:'[\n {\n "name": "Foxx JF Server",\n "id": "foxxJf",\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n },\n // highlight-start\n {\n "name": "Foo\'s JF Server",\n "id": "fooJf",\n "data": {\n "url": "http://192.168.0.150:8096",\n "user": "foo",\n "apiKey": "9c5bb56bd6540c756fbf481ebd9c5c40"\n }\n }\n // highlight-end\n]\n'})})]}),(0,r.jsxs)(n.p,{children:["You can find an example of the file name that should be used under the ",(0,r.jsx)(n.strong,{children:"File"})," Configuration for each Source/Client. Note: this is the same value that is used for ",(0,r.jsx)(n.code,{children:"type"})," in AIO configs."]})]}),(0,r.jsxs)(o.A,{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 (",(0,r.jsx)(n.code,{children:"config.json"}),") located in the directory specified by the ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"})," environmental variable. The file's location defaults to:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Local installation -> See ",(0,r.jsx)(n.a,{href:"/installation/#config-and-data-directories",children:"Config and Data Directories"})]}),"\n",(0,r.jsxs)(n.li,{children:["Docker -> ",(0,r.jsx)(n.code,{children:"/config/config.json"})," (in the container) -- see the ",(0,r.jsxs)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:[(0,r.jsx)(n.strong,{children:"Storage"})," tab in the Docker installation docs"]})," for how to configure this correctly"]}),"\n"]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Use AIO-based configuration if..."}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["...All of the reasons listed in ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})]}),"\n",(0,r.jsxs)(n.li,{children:["You want to setup ",(0,r.jsx)(n.a,{href:"#monitoring",children:"monitoring/webhooks"}),", default settings for all Sources/Clients, or global config options"]}),"\n",(0,r.jsxs)(n.li,{children:["You want to use ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Transformers"})," (other than what is provided for ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz/#env-configuration",children:"Musicbrainz ENV"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"You want complete control over all potential MS configuration"}),"\n"]})]}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:'AIO config is the "complete" way to configure MS.'}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["All settings available in File/ENV are available in AIO and AIO has ",(0,r.jsx)(n.em,{children:"more"})," exclusive settings."]}),"\n",(0,r.jsxs)(n.li,{children:["AIO enables configuring ",(0,r.jsx)(n.strong,{children:"default settings"})," for all Sources/Clients"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["There is 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.li,{children:["Use the ",(0,r.jsx)(n.a,{href:"/playground",children:(0,r.jsx)(n.strong,{children:"Config Playground"})})," to explore the entire config schema with an editable example","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The example used can also be found in the repo 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"})})," in the example below"]}),"\n"]}),"\n"]}),"\n"]})}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Config Example"}),(0,r.jsx)(c(),{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": "Cool Spotify Name",\n "id": "mySpotifyId",\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": "Foxx Maloja",\n "id": "myMalojaId",\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'})]}),(0,r.jsxs)(a,{type:"important",summary:"Source/Client AIO Configs require a 'type' property",children:[(0,r.jsxs)(n.p,{children:["Compared to their ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," equivalent, Sources/Clients configured using AIO require an additional ",(0,r.jsx)(n.code,{children:"type"})," property."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="config.json"',children:'{\n "sources": [\n {\n "name": "Foxx JF Server",\n // highlight-start\n "type: "jellyfin",\n // highlight-end\n "id": "foxxJf",\n "data": {\n "url": "http://localhost:8096",\n "user": "FoxxMD",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["You can find an example of the required ",(0,r.jsx)(n.code,{children:"type"})," value by referring to the ",(0,r.jsx)(n.strong,{children:"AIO"})," tab in each Source/Client's Configuration section example. This is the same value that is used as the name of individual ",(0,r.jsx)(n.a,{href:"./?configType=file#configuration-types",children:"File"})," config files."]})]})]})]}),"\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:"/configuration/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)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(n.p,{children:["Given this ",(0,r.jsx)(n.a,{href:"/configuration/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)(a,{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)(a,{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)(a,{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:"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 for services like ",(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)(s,{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.h2,{id:"caching",children:"Caching"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler implements caching to reduce external API calls and make some actions faster."}),"\n",(0,r.jsxs)(n.p,{children:["A default ",(0,r.jsx)(n.strong,{children:"in-memory"})," cache store is used so that you always benefit from some caching. An optional, ",(0,r.jsxs)(n.a,{href:"#secondary-caching",children:[(0,r.jsx)(n.strong,{children:"secondary"})," store"]})," can be configured for greater caching capabilities."]}),"\n",(0,r.jsx)(a,{type:"note",summary:"What is Cached?",children:(0,r.jsxs)(l.A,{groupId:"cachedThings",children:[(0,r.jsx)(o.A,{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.jsx)(o.A,{value:"transform",label:"Scrobble Transforms",children:(0,r.jsxs)(n.p,{children:["The results of ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"transform rules"})," are cached so that if a scrobble with identical data (track/artists/album) is identified and it has the same set of transform rules then the cached transform results can be applied."]})}),(0,r.jsx)(o.A,{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."]})})]})}),"\n",(0,r.jsxs)(a,{type:"important",summary:"Auth Cache Configuration",children:[(0,r.jsxs)(n.p,{children:["Auth caching defaults to a ",(0,r.jsx)(n.strong,{children:"file"})," that is stored in the ",(0,r.jsx)(n.code,{children:"DATA_DIR"})," directory using the pre-defined file name ",(0,r.jsx)(n.code,{children:"ms-auth.cache"}),"."]}),(0,r.jsxs)(n.p,{children:["This provides automatic persistence across restarts for long-lived auth data/credentials if you have configured a ",(0,r.jsx)(n.a,{href:"/installation?dockerSetting=storage#recommended-settings",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"}),")."]}),(0,r.jsxs)(n.p,{children:["If you wish to use the ",(0,r.jsx)(n.a,{href:"#secondary-caching",children:"secondary store"})," for caching Auth you must explicitly configure it. This is because valkey can potentially be ",(0,r.jsx)(n.em,{children:"ephemeral"})," if you do not provide a volume for its data directory."]}),(0,r.jsx)(n.p,{children:"To explicitly configure auth to use the secondary store:"}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(o.A,{value:"env",label:"ENV",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n // highlight-start\n - CACHE_AUTH=valkey\n // highlight-end\n # ...\n"})})}),(0,r.jsx)(o.A,{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": "valkey"\n }\n },\n // ...\n}\n'})})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"secondary-caching",children:"Secondary Caching Store"}),"\n",(0,r.jsx)(n.p,{children:"Using a secondary store enables:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"persistence of cached data across restarts"}),"\n",(0,r.jsx)(n.li,{children:"a larger store (more data is saved)"}),"\n",(0,r.jsx)(n.li,{children:"a longer time-to-live in the store (cached data is fetchable for a longer period)"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["These benefits are particularly beneficial when using ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"transforms"})," like Musicbrainz and it is ",(0,r.jsx)(n.strong,{children:"strongly recommended"})," for these scenarios."]}),"\n",(0,r.jsxs)(n.p,{children:["Currently, Multi-scrobbler only supports ",(0,r.jsx)(n.a,{href:"https://valkey.io/",children:(0,r.jsx)(n.strong,{children:"Valkey"})}),", an open-source fork of Redis, as a secondary store."]}),"\n",(0,r.jsxs)(s,{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.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{value:"named",label:"Named Volume",children:(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 // 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.jsx)(o.A,{value:"bind",label:"Bind Mount",children:(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 // highlight-start\n valkey:\n image: valkey/valkey\n volumes:\n - ./valkeyData:/data\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."]})]}),"\n",(0,r.jsx)(n.p,{children:"The connection string used by multi-scrobbler to connect to your Valkey instance must be in the form:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"redis://HOST_IP:HOST_PORT\n"})}),"\n",(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(o.A,{value:"env",label:"ENV",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n // highlight-start\n - CACHE_VALKEY=redis://192.168.0.120:6379\n // highlight-end\n # ...\n"})})}),(0,r.jsxs)(o.A,{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 "valkey": "redis://192.168.0.120:6379"\n },\n // ...\n}\n'})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"database",children:"Database"}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler depends on a SQLite database (",(0,r.jsx)(n.code,{children:"ms.db"}),") that is created on first run and stored in the ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:(0,r.jsx)(n.code,{children:"CONFIG_DIR"})}),". When upgrading Multi-scrobbler version, if there are any required database changes than this database is ",(0,r.jsx)(n.a,{href:"/updating#database",children:"automatically backed up and migrated."})]}),"\n",(0,r.jsxs)(n.p,{children:["The database stores ",(0,r.jsx)(n.em,{children:"all"})," Plays for your Sources/Clients as well as metadata and debugging information to help troubleshoot issues. Each Play is associated with a Source/Config in the database based on your configuration."]}),"\n",(0,r.jsxs)(n.p,{children:["You ",(0,r.jsx)(n.strong,{children:"must set IDs for each Source/Client"})," so that the database can identify these even when the configuration is changed."]}),"\n",(0,r.jsx)(n.h3,{id:"retention",children:"Retention"}),"\n",(0,r.jsxs)(a,{status:"note",summary:"How much storage does the database use?",children:[(0,r.jsx)(n.p,{children:"The amount of data stored for each Play can widely vary based on a few factors:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"how much data the Source service exposes"}),"\n",(0,r.jsx)(n.li,{children:"how many clients each Source is scrobble to (Plays are duplicated for each Client a Source sends a scrobble to)"}),"\n",(0,r.jsxs)(n.li,{children:["if you are using any ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Transforms"})," the diff of each step is stored, along with any external request/response data (like ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz queries"}),")"]}),"\n"]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/tests/database/drizzle.test.ts#L551",children:"MS repository contains a benchmark"})," to measure an average database size in a few common scenarios."]}),(0,r.jsxs)(l.A,{groupId:"dbSize",children:[(0,r.jsxs)(o.A,{label:"Minimal",value:"minimal",children:[(0,r.jsx)(n.p,{children:"Assuming your Sources send a minimal amount of data or you have compacted all plays:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Play Count"}),(0,r.jsx)(n.th,{children:"DB Size"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"160kb"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"1MB"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"10k"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"10.2MB"})})]})]})]})]}),(0,r.jsxs)(o.A,{label:"With Original Input",value:"input",children:[(0,r.jsx)(n.p,{children:"Assuming your Sources have a non-trivial amount of input data (like Spotify or Listenbrainz) that is not compacted:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Play Count"}),(0,r.jsx)(n.th,{children:"DB Size"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"356kb"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"3MB"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"10k"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"29.6MB"})})]})]})]})]}),(0,r.jsxs)(o.A,{label:"All Debug Deta",value:"all",children:[(0,r.jsx)(n.p,{children:"Assuming your Sources/Clients:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"have a non-trivial amount of input data (like Spotify or Listenbrainz)"}),"\n",(0,r.jsxs)(n.li,{children:["and has many ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"Transforms"})," steps that include requests"]}),"\n",(0,r.jsx)(n.li,{children:"nothing is compacted"}),"\n"]}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Play Count"}),(0,r.jsx)(n.th,{children:"DB Size"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"684kb"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"6.28MB"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"10k"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"61.3MB"})})]})]})]})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"A retention policy can be configured to delete Plays, or unused debug data, from the database after a certain amount of time. If no configuration is provided then a default policy is used that should be reasonable for most users."}),"\n",(0,r.jsxs)(l.A,{groupId:"policy",queryString:!0,children:[(0,r.jsxs)(o.A,{label:"Compaction",value:"compaction",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Compaction"})," Retention Policy is used to delete different types of debug data from your stored Plays."]}),(0,r.jsx)(n.p,{children:"This is a useful way to reduce used storage space when you are not having problems with your Plays, or iterating on a configuration, that requires referencing all this extra data."}),(0,r.jsx)(n.p,{children:"There are two types of data that can be compacted (deleted from the Play):"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"input"})," - this is the untouched data retrieved by Multi-scrobbler, from a Source, and used to generate a Play/scrobble. This can be used to reconstruct and replay a Play, when used from troubleshooting or reporting an issue"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"transform"})," - this is all of the steps generated by ",(0,r.jsx)(n.a,{href:"/configuration/transforms",children:"transforms"}),", the diff of the Play resulting from the step, and any request/responses used to complete the step"]}),"\n"]}),(0,r.jsxs)(n.admonition,{title:"Defaults",type:"note",children:[(0,r.jsx)(n.p,{children:"When no Compact configuration is provided, Multi-scrobbler uses this policy:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Compact (delete) ",(0,r.jsx)(n.code,{children:"input"})," and ",(0,r.jsx)(n.code,{children:"transform"})," data on all Plays after 3 days"]}),"\n"]})]}),(0,r.jsx)(n.h4,{id:"configuring-compaction-policy",children:"Configuring Compaction Policy"}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Details"}),(0,r.jsx)(n.p,{children:"Each value in the configuration properties below can be either"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["a number of seconds EX ",(0,r.jsx)(n.code,{children:"3600"})," = 10 minutes"]}),"\n",(0,r.jsxs)(n.li,{children:["a unit of a common duration with the pattern ",(0,r.jsx)(n.code,{children:"X unit"})," EX","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"30 minutes"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"5 hours"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"2 days"})}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"COMPACT_PROPERTIES"})," - which properties to compact"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_AFTER"})," - Default to use for all Plays"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_COMPLETED_AFTER"})," - Compact only completed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_FAILED_AFTER"})," - Compact only failed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_COMPACT_DUPED_AFTER"})," - Compact only duped/discard Plays after..."]}),"\n"]}),(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ini",children:"# only delete input when compacting\nCOMPACT_PROPERTIES=input\n# compact all plays after 3 days \nRETENTION_COMPACT_AFTER=3 days\n# specifically compact completed plays after 30 minutes\nRETENTION_COMPACT_COMPLETED_AFTER=30 minutes\n"})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Compacting all Play types and deleting both input and transform:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "compactAfter": "3 days",\n "compact": [\n "input",\n "transform"\n ]\n }\n }\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Delete only input during compacting"}),"\n",(0,r.jsx)(n.li,{children:"Compact all after 3 days except completed which compacts after 30 minutes"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "compactAfter": {\n "completed": "30 minutes",\n "duped": "3 days",\n "failed": "3 days"\n },\n "compact": [\n "input"\n ]\n }\n }\n}\n'})})]})]})]})]}),(0,r.jsxs)(o.A,{label:"Deletion",value:"deletion",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Deletion"})," Retention Policy is used to delete different types of stored Plays from Multi-scrobbler database."]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"This does not delete Plays from your Clients."}),' It\'s only deleting the "in-flight" data MS used to create the scrobble that was eventually sent to your clients.']}),(0,r.jsxs)(n.admonition,{title:"Plays Should be Ephemeral",type:"warning",children:[(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Multi-Scrobbler is not designed to store Plays/Scrobbles indefinitely."})}),(0,r.jsx)(n.p,{children:"It should scale fine for thousands of scrobbles but it not meant to store 10's of thousands of scrobbles forever. It is not a scrobbler server."}),(0,r.jsxs)(n.p,{children:["You ",(0,r.jsx)(n.strong,{children:"should"})," set a reasonable deletion policy so that MS stores less than 1000 scrobbles at a time, ideally less."]})]}),(0,r.jsxs)(n.admonition,{title:"Defaults",type:"note",children:[(0,r.jsx)(n.p,{children:"When no Deletion policy configuration is provided, Multi-scrobbler uses this policy:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Delete all Plays after 7 days"}),"\n"]})]}),(0,r.jsx)(n.h4,{id:"configuring-deletion-policy",children:"Configuring Deletion Policy"}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Details"}),(0,r.jsx)(n.p,{children:"Each value in the configuration properties below can be either"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["a number of seconds EX ",(0,r.jsx)(n.code,{children:"3600"})," = 10 minutes"]}),"\n",(0,r.jsxs)(n.li,{children:["a unit of a common duration with the pattern ",(0,r.jsx)(n.code,{children:"X unit"})," EX","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"30 minutes"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"5 hours"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"2 days"})}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_AFTER"})," - Default to use for all Plays"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_COMPLETED_AFTER"})," - Delete only completed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_FAILED_AFTER"})," - Delete only failed Plays after..."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"RETENTION_DELETE_DUPED_AFTER"})," - Delete only duped/discard Plays after..."]}),"\n"]}),(0,r.jsx)(n.p,{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ini",children:"# delete all plays after 3 days \nRETENTION_DELETE_AFTER=3 days\n# specifically, delete completed plays after 30 minutes\nRETENTIOND_DELETE_COMPLETED_AFTER=30 minutes\n"})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"AIO",children:[(0,r.jsx)(n.p,{children:"Deleting all Play types after 3 days:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "deleteAfter": "3 days"\n }\n }\n}\n'})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Delete all after 3 days except completed which are deleted after 30 minutes"}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "database": {\n "retention": {\n "deleteAfter": {\n "completed": "30 minutes",\n "duped": "3 days",\n "failed": "3 days"\n },\n }\n }\n}\n'})})]})]})]})]})]}),"\n",(0,r.jsx)(n.h2,{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.h2,{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?sourceComm=ingress#by-communication-method",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.h3,{id:"upstream-services-status",children:"Upstream Services Status"}),"\n",(0,r.jsx)(n.p,{children:"A status page for monitoring the reachability of public services used by some Sources/Clients is available at"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://status.multi-scrobbler.app",children:"https://status.multi-scrobbler.app"})})}),"\n",(0,r.jsxs)(n.p,{children:["This monitor runs on a VPS and checks the uptime of ",(0,r.jsx)(n.em,{children:"actual"})," APIs for these services, not just landing pages. On a ~minute interval it checks:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Listenbrainz API"}),"\n",(0,r.jsx)(n.li,{children:"Musicbrainz API"}),"\n",(0,r.jsx)(n.li,{children:"CoverArtArchive API"}),"\n",(0,r.jsx)(n.li,{children:"Last.fm API"}),"\n",(0,r.jsx)(n.li,{children:"A few MS-hosted support services"}),"\n"]}),"\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)(s,{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:"/playground",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)(s,{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:"/playground",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)(s,{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:"/playground",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)(s,{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/api/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:"/api/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:"/api/health?type=spotify"})," or ",(0,r.jsx)(n.code,{children:"/api/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:"/api/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:"/api/health"})," will 500 if they are ",(0,r.jsx)(n.strong,{children:"not polling"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"prometheus",children:"Prometheus"}),"\n",(0,r.jsxs)(n.p,{children:["A ",(0,r.jsx)(n.a,{href:"https://prometheus.io/",children:"Prometheus"})," export endpoint is available at GET ",(0,r.jsx)(n.code,{children:"http://YourMultiScrobblerDomain/api/metrics"})]}),"\n",(0,r.jsx)(n.p,{children:"It includes metrics for:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Count of discovered plays per ",(0,r.jsx)(n.a,{href:"/configuration/sources",children:"Source"})]}),"\n",(0,r.jsxs)(n.li,{children:["Count of Queued/Scrobbled/Deadletter scrobbles per ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"})]}),"\n",(0,r.jsxs)(n.li,{children:["Number of issues per Source/Client","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"If any of these metrics is > 0 it means your Source/Client is not operating normally"}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:"Caching metrics"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Additionally, general process metrics like cpu and memory usage can be enabled with the env ",(0,r.jsx)(n.code,{children:"PROMETHEUS_FULL=true"})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example Usage"}),(0,r.jsxs)(n.p,{children:["Update your ",(0,r.jsx)(n.a,{href:"https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file",children:"Prometheus Configuration file"})," (usually at ",(0,r.jsx)(n.code,{children:"/etc/prometheus.yml"}),") to add a job to the ",(0,r.jsx)(n.code,{children:"scrape_configs"}),(0,r.jsx)(n.a,{href:"https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config",children:"section"})," like this:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"scrape_configs:\n #\n # ...your other jobs are here\n # \n - job_name: multi-scrobbler\n scrape_interval: 30s\n metrics_path: '/api/metrics'\n static_configs:\n - targets: ['myMultiscrobblerIp:9078']\n"})})]}),"\n",(0,r.jsxs)(a,{status:"tip",summary:"Grafana Dashboard",children:[(0,r.jsxs)(n.p,{children:["Github user ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/507#issuecomment-4144982295",children:"4rft5"})," created a Grafana dashboard that uses the Prometheus metrics from above."]}),(0,r.jsx)("img",{src:i(6434).A,height:"800"}),(0,r.jsxs)(n.p,{children:["Download the json dashboard here: ",(0,r.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:i(3096).A+"",children:(0,r.jsx)(n.code,{children:"multiscrobbler-dashboard.json"})})]})]})]})}function f(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(j,{...e})}):j(e)}function p(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9461(e,n,i){i.d(n,{A:()=>h}),i(6540);var s=i(2170),r=i.n(s),t=i(5548),l=i(349),o=i(1219),a=i.n(o),c=i(4848);let d=e=>{let n,{data:i,name:s,client:l=!1}=e;try{n=a().parse(i)}catch(e){return console.error(e),(0,c.jsxs)(t.A,{type:"danger",title:"Unexpected Error",children:[(0,c.jsx)("p",{children:"Example component crashed because of error!"}),(0,c.jsx)(r(),{children:e.message})]})}n=(n=n.filter(e=>void 0===e.configureAs||e.configureAs===(l?"client":"source"))).map(e=>({...e,type:s}));let o={[l?"clients":"sources"]:n};return(0,c.jsx)(r(),{title:"CONFIG_DIR/config.json",language:"json5",children:JSON.stringify(o,null,2)})},h=e=>(0,c.jsx)(l.A,{fallback:({error:e})=>(0,c.jsx)("div",{children:(0,c.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,c.jsx)(d,{...e})})},1672(e,n,i){i.d(n,{A:()=>l}),i(6540);var s=i(4164),r=i(8774),t=i(4848);function l({size:e=null,outline:n=!1,variant:i="primary",block:o=!1,disabled:a=!1,className:c,style:d={},link:h,label:u,onClick:x=()=>null,...j}){let f=e?({sm:"sm",small:"sm",lg:"lg",large:"lg",medium:null})[e]:"",p=f?`button--${f}`:"",m=i?`button--${i}`:"";return(0,t.jsx)(r.A,{to:a?null:h,children:(0,t.jsx)("button",{className:(0,s.A)("button",p,n?"button--outline":"",m,o?"button--block":"",a?"disabled":"",c),style:d,role:"button","aria-disabled":a,onClick:e=>{e.preventDefault(),x()},...j,children:u})})}},9643(e,n,i){i.d(n,{A:()=>a}),i(6540);var s=i(1672),r=i(4848);let t={borderRadius:"var(--ifm-button-border-radius) 0 0 var(--ifm-button-border-radius)"},l={borderRadius:"0 var(--ifm-button-border-radius) var(--ifm-button-border-radius) 0"},o={borderRadius:"0"};function a({size:e=null,variant:n="primary",block:i=!1,disabled:c=!1,className:d,style:h,options:u,value:x,defaultValue:j,onChange:f=()=>null}){if(void 0===u||0===u.length)return null;let p=u.map((i,a)=>{let c={style:o,outline:!0,size:e,variant:n,label:i[1],link:"#",onClick:()=>f(i[0])};return 0===a?c.style=t:a===u.length-1&&(c.style=l),(x??j)===i[0]&&(c.outline=!1),(0,r.jsx)(s.A,{...c},a)});return(0,r.jsx)("span",{children:p})}},8675(e,n,i){i.d(n,{A:()=>j});var s=i(6540),r=i(2170),t=i.n(r),l=i(349),o=i(8193);let a={};var c=i(9643),d=i(1922),h=i(4581),u=i(4848);let x=e=>{let{data:n,interactive:i=!0,defaultDisplay:r="interactive",schemaName:l,filePathName:x,readOnlyAtWidth:j=1,...f}=e,[p,m]=((e,n,i)=>{let r;return e in a?a[e]():o.A.canUseDOM?(a[e]=(r=[],()=>{let[t,l]=((e,n,i=!0)=>{let[r,t]=(0,s.useState)(()=>{let s=window.localStorage.getItem(e);if(i)try{return s?JSON.parse(s):n}catch(e){return console.error(e),n}try{let e;if(null===s)return n;if("true"===s)return!0;if("false"===s)return!1;if(e=s,("number"==typeof e||"string"==typeof e&&""!==e.trim())&&!isNaN(e)){if(s.includes("."))return parseFloat(s);return parseInt(s)}return s}catch(e){return console.error(e),n}}),l=(0,s.useCallback)(n=>{t(()=>(i?localStorage.setItem(e,JSON.stringify(n)):localStorage.setItem(e,n),n))},[e]);return(0,s.useEffect)(()=>{let i=i=>{i.storageArea===localStorage&&i.key===e&&t(null===i.newValue?n:i.newValue)};return window.addEventListener("storage",i),()=>window.removeEventListener("storage",i)}),[r,l]})(e,n,i),o=(0,s.useCallback)(e=>{for(let n of r)n(e)},[]);return(0,s.useEffect)(()=>(r.push(l),()=>{r.splice(r.indexOf(l),1)}),[l]),[t,o]}),a[e]()):[n,()=>null]})("docusaurus.tab.fileExampleShow",r,!1),g=(0,h.l)({desktopBreakpoint:j}),b=null,y=i&&"desktop"===g;y&&(b=(0,u.jsx)(c.A,{options:[["plain","Plain"],["interactive","Interactive"]],defaultValue:r,value:p,variant:"primary",size:"medium",onChange:e=>m(e)}));let v=null;void 0!==x&&y&&"interactive"===p&&(v=(0,u.jsx)("code",{style:{float:"right",paddingRight:"0.5em",paddingLeft:"0.5em"},children:x}));let E=null;(null!==b||null!==v)&&(E=(0,u.jsxs)("div",{style:{marginBottom:"1em"},children:[b,v]}));let A=(0,s.useMemo)(()=>y&&"interactive"===p?null:"string"!=typeof n?JSON.stringify(n,null,2):n,[i,p,n]);return(0,u.jsxs)(s.Fragment,{children:[E,y&&"plain"!==p?null:(0,u.jsx)(t(),{title:x,language:"json5",children:A}),y&&"interactive"===p?(0,u.jsx)(d.A,{configContent:n,schemaName:l}):null]})},j=e=>(0,u.jsx)(l.A,{fallback:({error:e})=>(0,u.jsx)("div",{children:(0,u.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,u.jsx)(x,{...e})})},1922(e,n,i){i.d(n,{A:()=>m});var s=i(6540),r=i(6025),t=i(8478),l=i(5293),o=i(4020),a=i(7433),c=i.n(a),d=i(8182),h=i.n(d),u=i(1219),x=i.n(u),j=i(4848);function f(e){let n=(0,s.useMemo)(()=>{if(void 0!==e.schema)return(0,o.IM)({schema:e.schema,ajvOptions:{strict:"log",strictSchema:"log",allowUnionTypes:!0},onCreateAjv:e=>{let n=new(c());return n.addKeyword("deprecationMessage"),n.addKeyword("zockerId"),h().default(n),n}})},[e.schema]),i=(0,s.useMemo)(()=>({json:"string"==typeof e.config?x().parse(e.config):e.config}),[e.config]),{colorMode:r}=(0,l.G)();return(0,j.jsx)(o.t$,{validator:n,theme:r,mode:"text",content:i,style:{height:"initial"}})}function p(e){return(0,j.jsx)(t.default,{fallback:(0,j.jsx)("div",{children:"Loading..."}),children:()=>(0,j.jsx)(f,{...e})})}function m(e){let{schemaName:n}=e,[i,t]=(0,s.useState)(void 0),[l,o]=(0,s.useState)(void 0),a=void 0===n?void 0:(0,r.Ay)(`schemas/${e.schemaName}.json`);return(0,s.useEffect)(()=>{void 0===a?t(!1):fetch(a,{headers:{Accept:"application/json"}}).then(e=>e.json()).then(e=>t(e)).catch(e=>t(e))},[t,a]),(0,j.jsxs)(s.Fragment,{children:[void 0===i&&(0,j.jsx)("div",{children:"Loading ..."}),void 0!==i&&i instanceof Error&&(0,j.jsxs)("div",{children:["Houston we have a problem : ",i.message]}),void 0!==i&&!(i instanceof Error)&&(0,j.jsx)(p,{schema:!1===i?void 0:i,config:e.configContent})]})}},2709(e,n,i){i.d(n,{A:()=>t});var s=i(6540),r=i(4848);let t=e=>{let{children:n,lower:i,client:t=!1}=e,l=n;void 0===l&&(l=(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=${t?"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})}},3096(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/files/multiscrobbler-dashboard-814b740dbbd83aba08598320999b9f67.json"},6434(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/grafana-004a8d8d2ec395ad949e9f5b79406a32.png"}}]); \ No newline at end of file diff --git a/assets/js/08938dd7.64df4ca4.js b/assets/js/08938dd7.64df4ca4.js new file mode 100644 index 00000000..560cb4ef --- /dev/null +++ b/assets/js/08938dd7.64df4ca4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7417"],{1938(e,n,s){s.r(n),s.d(n,{metadata:()=>o,default:()=>k,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var o=JSON.parse('{"id":"configuration/sources/rocksky-source","title":"Rocksky","description":"Rocksky (Source)","source":"@site/docs/configuration/sources/rocksky-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/rocksky-source","permalink":"/multi-scrobbler/configuration/sources/rocksky-source","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/rocksky-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Rocksky","description":"Rocksky (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Plex","permalink":"/multi-scrobbler/configuration/sources/plex"},"next":{"title":"Sonos","permalink":"/multi-scrobbler/configuration/sources/sonos"}}'),r=s(4848),i=s(8453);s(8194),s(698),s(2170);var c=s(8165);function t(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_KEY"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["API Key generated from ",(0,r.jsx)(n.a,{href:"https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0",children:"API Applications"})," in Rocksky for your account"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_HANDLE"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The ",(0,r.jsx)(n.strong,{children:"fully-qualified"})," handle for your ATPRoto/Bluesky account"]})]})]})]})}function l(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(t,{...e})}):t(e)}let d={title:"Rocksky",description:"Rocksky (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...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,r.jsxs)(r.Fragment,{children:[(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"})," Rocksky, create a ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky (Client)"})]}),"\n"]})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://rocksky.app/",children:(0,r.jsx)(n.strong,{children:"Rocksky"})})," is music tracking and discovery platform built on the AT Protocol (Bluesky)."]}),"\n",(0,r.jsx)(n.p,{children:"This Source monitors the Rocksky scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients."}),"\n",(0,r.jsxs)(n.p,{children:["Learn more about how Rocksky scrobbles work in the ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky (Client)"})," docs."]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsxs)(n.p,{children:["Follow the ",(0,r.jsx)(n.strong,{children:"Setup"})," instructions in the ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky#setup",children:"Rocksky (Client)"})," docs to get access to your Bluesky PDS repository and scrobble data."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["See the ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky#setup",children:"Rocksky (Client)"})," configuration for general setup. The only difference for ",(0,r.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,r.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,r.jsx)(s,{config:"RockskySourceConfig",fileContent:c.A,configureAs:!0,ambiguous:!0,name:"rocksky",children:(0,r.jsx)(l,{})})]})}function k(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}},8165(e,n,s){s.d(n,{A:()=>o});let o='[\n {\n "id": "myRockskyClient",\n "name": "FoxxMD Rocksky Client",\n "configureAs": "client",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n },\n {\n "id": "myRockskySource",\n "name": "FoxxMD Rocksky Source",\n "configureAs": "source",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n }\n]'}}]); \ No newline at end of file diff --git a/assets/js/08938dd7.9aaf2469.js b/assets/js/08938dd7.9aaf2469.js deleted file mode 100644 index 31161ef6..00000000 --- a/assets/js/08938dd7.9aaf2469.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7417"],{1938(e,n,s){s.r(n),s.d(n,{metadata:()=>o,default:()=>k,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var o=JSON.parse('{"id":"configuration/sources/rocksky-source","title":"Rocksky","description":"Rocksky (Source)","source":"@site/docs/configuration/sources/rocksky-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/rocksky-source","permalink":"/multi-scrobbler/configuration/sources/rocksky-source","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/rocksky-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Rocksky","description":"Rocksky (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Plex","permalink":"/multi-scrobbler/configuration/sources/plex"},"next":{"title":"Sonos","permalink":"/multi-scrobbler/configuration/sources/sonos"}}'),r=s(4848),i=s(8453);s(8194),s(698),s(2170);var c=s(8165);function t(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_KEY"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["API Key generated from ",(0,r.jsx)(n.a,{href:"https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0",children:"API Applications"})," in Rocksky for your account"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"SOURCE_ROCKSKY_HANDLE"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The ",(0,r.jsx)(n.strong,{children:"fully-qualified"})," handle for your ATPRoto/Bluesky account"]})]})]})]})}function l(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(t,{...e})}):t(e)}let d={title:"Rocksky",description:"Rocksky (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...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,r.jsxs)(r.Fragment,{children:[(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"})," Rocksky, create a ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky (Client)"})]}),"\n"]})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://rocksky.app/",children:(0,r.jsx)(n.strong,{children:"Rocksky"})})," is music tracking and discovery platform built on the AT Protocol (Bluesky)."]}),"\n",(0,r.jsx)(n.p,{children:"This Source monitors the Rocksky scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients."}),"\n",(0,r.jsxs)(n.p,{children:["Learn more about how Rocksky scrobbles work in the ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky",children:"Rocksky (Client)"})," docs."]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsxs)(n.p,{children:["Follow the ",(0,r.jsx)(n.strong,{children:"Setup"})," instructions in the ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky#setup",children:"Rocksky (Client)"})," docs to get access to your Bluesky PDS repository and scrobble data."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["See the ",(0,r.jsx)(n.a,{href:"/configuration/clients/rocksky#setup",children:"Rocksky (Client)"})," configuration for general setup. The only difference for ",(0,r.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,r.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,r.jsx)(s,{config:"RockskySourceConfig",fileContent:c.A,configureAs:!0,ambiguous:!0,name:"rocksky",children:(0,r.jsx)(l,{})})]})}function k(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}},8165(e,n,s){s.d(n,{A:()=>o});let o='[\n {\n "id": "myRockskyClient",\n "name": "FoxxMD Rocksky Client",\n "configureAs": "client",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n },\n {\n "id": "myRockskySource",\n "name": "FoxxMD Rocksky Source",\n "configureAs": "source",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n }\n]'}}]); \ No newline at end of file diff --git a/assets/js/094000d3.145fb8c1.js b/assets/js/094000d3.145fb8c1.js new file mode 100644 index 00000000..70e62321 --- /dev/null +++ b/assets/js/094000d3.145fb8c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8270"],{938(e,n,s){s.r(n),s.d(n,{metadata:()=>i,default:()=>h,frontMatter:()=>t,contentTitle:()=>o,toc:()=>c,assets:()=>l});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/transforms.mdx?plain=1","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Enhancing Scrobbles","toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Youtube Music","permalink":"/multi-scrobbler/configuration/sources/youtube-music"},"next":{"title":"Musicbrainz Stage","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz"}}'),r=s(4848),a=s(8453);let t={sidebar_position:3,title:"Enhancing Scrobbles",toc_max_heading_level:5},o,l={},c=[{value:"Journey of a Scrobble",id:"journey-of-a-scrobble",level:2},{value:"Lifecycle Hooks",id:"lifecycle-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:"Best Practices",id:"best-practices",level:2},{value:"Caching",id:"caching",level:3},{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,a.R)(),...e.components},{Details:s,DetailsAdmo:i}=n;return s||u("Details",!0),i||u("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.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,r.jsx)(n.strong,{children:"title, artists, and album"})," at many different times in multi-scrobbler's lifecycle."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Why Would I Do This?"}),(0,r.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,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ID3 tags in your music collection are dirty or have repeating garbage IE ",(0,r.jsx)(n.code,{children:"[YourMusicSource.com] My Artist - My Title"})]}),"\n",(0,r.jsxs)(n.li,{children:["A Source's service often incorrectly adds data to some field IE ",(0,r.jsx)(n.code,{children:"My Artist - My Title (Album Version)"})," when the title should just be ",(0,r.jsx)(n.code,{children:"My Title"})]}),"\n",(0,r.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,r.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,r.jsx)(n.h2,{id:"journey-of-a-scrobble",children:"Journey of a Scrobble"}),"\n",(0,r.jsx)(n.p,{children:"First, let's recap the lifecycle of a scrobble in multi-scrobbler:"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Sources"})," are the beginning of the journey for a ",(0,r.jsx)(n.strong,{children:"Play"})," (song you've listened to long enough to be scrobblable)"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Source finds a new valid ",(0,r.jsx)(n.strong,{children:"Play"})]}),"\n",(0,r.jsxs)(n.li,{children:["The Source ",(0,r.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,r.jsxs)(n.li,{children:["The Source ",(0,r.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,r.jsxs)(n.p,{children:["Scrobble ",(0,r.jsx)(n.strong,{children:"Clients"})," listen for discovered Plays from Sources, then..."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Client receives a ",(0,r.jsx)(n.strong,{children:"Play"})," from a Source"]}),"\n",(0,r.jsxs)(n.li,{children:["The Client ",(0,r.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,r.jsxs)(n.li,{children:["The Client ",(0,r.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,r.jsx)(n.h2,{id:"lifecycle-hooks",children:"Lifecycle Hooks"}),"\n",(0,r.jsx)(n.p,{children:"You'll notice there is a pattern above that looks like this:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Before"})," data is compared"]}),"\n",(0,r.jsxs)(n.li,{children:["Data is ",(0,r.jsx)(n.strong,{children:"compared"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"After"})," data is compared"]}),"\n"]}),"\n",(0,r.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,r.jsx)(n.h5,{id:"tldr",children:"TLDR"}),"\n",(0,r.jsxs)(n.p,{children:["In more concrete terms this is the structure of hooks within a configuration (can be used in any ",(0,r.jsx)(n.strong,{children:"Source"})," or ",(0,r.jsx)(n.strong,{children:"Client"}),"):"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h3,{id:"hook",children:"Hook"}),"\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"Sources"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if Play was already discovered"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"postCompare"})," - modify Play data before sending to scrobble ",(0,r.jsx)(n.strong,{children:"Clients"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"Clients"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if it was already scrobbled"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"postCompare"})," - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles"]}),"\n"]}),"\n",(0,r.jsxs)(i,{type:"tip",summary:"Transformed Scrobbles Are Permanently Modified",children:[(0,r.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,r.jsx)(n.strong,{children:"compare"})," hook)."]}),(0,r.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,r.jsx)(n.strong,{children:"Source's"})," ",(0,r.jsx)(n.code,{children:"preCompare"})," hook because all later processes will receive the data with the modified track."]})]}),"\n",(0,r.jsx)(n.admonition,{title:"TLDR",type:"tip",children:(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.strong,{children:["To modify a scrobble coming from one of your Sources use the ",(0,r.jsx)(n.code,{children:"preCompare"})," hook."]})})}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Using ",(0,r.jsx)(n.code,{children:"compare"})," hook"]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"compare"})," ",(0,r.jsx)(n.a,{href:"#hook",children:"hook"})," is slightly different than ",(0,r.jsx)(n.code,{children:"preCompare"})," and ",(0,r.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,r.jsx)(n.strong,{children:"does not modify downstream data!"})," Instead, the modifications are made only for use in the comparison."]}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h2,{id:"stage",children:"Modification Stage"}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.a,{href:"#hook",children:(0,r.jsx)(n.strong,{children:"hook"})})," is made up of one or more ",(0,r.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,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The ",(0,r.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,r.jsxs)(n.li,{children:["The ",(0,r.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,r.jsxs)(n.li,{children:["The ",(0,r.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,r.jsx)(n.p,{children:"Each Stage in a Hook receives Play data from the previous Stage."}),"\n",(0,r.jsxs)(n.p,{children:["Within a hook, each Stage minimally consists of a ",(0,r.jsx)(n.code,{children:"type"})," to identify what Stage it is along with any other data specific to that stage:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n "type": "native"\n // optional, stage specific data here...\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"configuring-stages",children:"Configuring Stages"}),"\n",(0,r.jsxs)(n.p,{children:["Stages may be globally configured using ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"})," ",(0,r.jsx)(n.code,{children:"config.json"})," file in the top-level ",(0,r.jsx)(n.code,{children:"transformers"})," block."]}),"\n",(0,r.jsx)(n.p,{children:"Each Stage consists of:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"})," the type of Stage"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"name"})," a unique name for the Stage, to be (potentially) used with hooks"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"defaults"})," - An object defining default configuration for this stage, when used in a Hook."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.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,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": "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,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": "native"\n "name": "MyNativeTransformer" // when "name" is not defined, uses first found "native" transformer\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"Multiple stages of the same type may be configured, allowing you to define several sets of default behavior."}),"\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": "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,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": "native"\n "name": "DotTransformer"\n }\n ]\n }\n }\n }\n]\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/vlc",children:"VLC"})," ",(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="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,r.jsx)(n.h4,{id:"overriding-configuration",children:"Overriding Configuration"}),"\n",(0,r.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,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": "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,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": "native"\n "name": "MyNativeTransformer",\n // overrides property from "defaults"\n "artistsParseFrom": ["artists", "title"]\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"stage-rules",children:"Rules for Play Data"}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.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,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"artists"})," and/or ",(0,r.jsx)(n.code,{children:"album"})," in the Stage object."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.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,r.jsxs)(n.p,{children:["Generically, though, each property may be some value ",(0,r.jsx)(n.strong,{children:"or"})," an object combining a ",(0,r.jsxs)(n.a,{href:"#conditional-modification",children:[(0,r.jsx)(n.code,{children:"when"})," condition"]})," and that value."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.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,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Specifying these Rules is ",(0,r.jsx)(n.strong,{children:"not"})," the same as ",(0,r.jsx)(n.a,{href:"#configuring-stages",children:"configuring the Stage"}),". Rules only determine if the ",(0,r.jsx)(n.em,{children:"result"})," of the transformation should be used (replace) the existing Play Data."]})}),"\n",(0,r.jsx)(n.h2,{id:"flow-control",children:"Stage Flow Control"}),"\n",(0,r.jsxs)(n.p,{children:["Stages may be optionally configured to ",(0,r.jsx)(n.strong,{children:"continue"})," to the next Stage or ",(0,r.jsx)(n.strong,{children:"stop"})," (end early) all subsequent Stages, based on the outcome of the currently running Stage."]}),"\n",(0,r.jsxs)(n.p,{children:["These three properties can be added to the ",(0,r.jsx)(n.a,{href:"#stage",children:"Modification Stage"})," data, alongside ",(0,r.jsx)(n.a,{href:"#stage-rules",children:"Rules"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"onSuccess"})," (default ",(0,r.jsx)(n.code,{children:"continue"}),") - If the Stage successfully finishes processing"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"onFailure"})," (default ",(0,r.jsx)(n.code,{children:"stop"}),") - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"onSkip"})," (default ",(0,r.jsx)(n.code,{children:"continue"}),") - If the Stage does not process the Play data due to stage-level ",(0,r.jsx)(n.a,{href:"#conditional-modification",children:(0,r.jsx)(n.code,{children:"when"})})," or other stage-specific skip conditions"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.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,r.jsx)(n.p,{children:"Specifying Flow Control is only necessary if the above assumptions are not true for your scenario."}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Default Flow Control Example"}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Customized Flow Control Example"}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h3,{id:"conditional-modification",children:"Conditionally Run"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"#stage",children:"Stages"})," within a ",(0,r.jsx)(n.a,{href:"#hook",children:"Hook"}),", and ",(0,r.jsx)(n.a,{href:"#stage-rules",children:"Rules"})," within each Stage, support a ",(0,r.jsx)(n.code,{children:"when"})," object for testing ",(0,r.jsx)(n.strong,{children:"if they should be run."})]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.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,r.jsx)(n.strong,{children:"pre-transformation"})," values from Play data."]}),"\n",(0,r.jsxs)(n.p,{children:["All parts of an individual ",(0,r.jsx)(n.code,{children:"when"}),' clause must test true to "pass" but if ',(0,r.jsx)(n.strong,{children:"any"})," ",(0,r.jsx)(n.code,{children:"when"})," clauses pass the Stage/Rule is processed."]}),"\n",(0,r.jsxs)(n.p,{children:["If the ",(0,r.jsx)(n.code,{children:"when"})," test does not pass then the Stage is ",(0,r.jsx)(n.a,{href:"#flow-control",children:(0,r.jsxs)(n.strong,{children:["skipped (",(0,r.jsx)(n.code,{children:"onSkip"}),")"]})}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.p,{children:"More succinctly:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["All parts (",(0,r.jsx)(n.code,{children:"artist"})," ",(0,r.jsx)(n.code,{children:"album"})," ",(0,r.jsx)(n.code,{children:"albumArtist"})," ",(0,r.jsx)(n.code,{children:"duration"})," ",(0,r.jsx)(n.code,{children:"meta"})," ",(0,r.jsx)(n.code,{children:"title"}),") of a ",(0,r.jsx)(n.code,{children:"when"})," are ",(0,r.jsx)(n.code,{children:"AND"})," conditions"]}),"\n",(0,r.jsxs)(n.li,{children:["All part-objects in the ",(0,r.jsx)(n.code,{children:"when"})," array are ",(0,r.jsx)(n.code,{children:"OR"})," conditions"]}),"\n"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Example of Stage with ",(0,r.jsx)(n.code,{children:"when"})," condition"]}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example of individual rule with when condition"}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsxs)(n.p,{children:["MS can log a diff of Stage transformations if/when they occur. In the ",(0,r.jsx)(n.code,{children:"playTransform"})," object of a Source/Client config use ",(0,r.jsx)(n.code,{children:"log"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"log": true'})," => Output original play + final transformed output of last Stage in the array","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["This can also be enabled by using ",(0,r.jsx)(n.a,{href:"/configuration/#debug-mode",children:(0,r.jsx)(n.code,{children:"DEBUG_MODE=true"})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"log": "all"'})," => Output original play + final transformed output of ",(0,r.jsx)(n.strong,{children:"each"})," Stage in the array"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.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,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,r.jsx)(n.h3,{id:"caching",children:"Caching"}),"\n",(0,r.jsxs)(n.p,{children:["MS uses ",(0,r.jsx)(n.a,{href:"/configuration/#caching",children:"caching"})," to reduce the number of API calls needed for stages like ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," and to speed up all transforms by caching steps and results. However, the default caching strategy uses a small cache size and very short ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Time_to_live",children:"TTLs"})," because it is ",(0,r.jsx)(n.em,{children:"in-memory"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsxs)(n.strong,{children:["If you are using any Transform stages you should configure ",(0,r.jsx)(n.a,{href:"/configuration#secondary-caching",children:"secondary caching"})]})," to increase the cache size and lifetime of cached items. This will also reduce memory usage in MS."]}),"\n",(0,r.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsxs)(n.p,{children:["See ",(0,r.jsx)(n.strong,{children:"Examples"})," sections in specific Stage docs (also in the sidebar):"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/user#examples",children:"User Stage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/native#examples",children:"Native Stage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#examples",children:"Musicbrainz Stage"})}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,a.R)(),...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.")}}}]); \ No newline at end of file diff --git a/assets/js/094000d3.256efb93.js b/assets/js/094000d3.256efb93.js deleted file mode 100644 index 72504f20..00000000 --- a/assets/js/094000d3.256efb93.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8270"],{938(e,n,s){s.r(n),s.d(n,{metadata:()=>i,default:()=>h,frontMatter:()=>t,contentTitle:()=>o,toc:()=>c,assets:()=>l});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/transforms.mdx?plain=1","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Enhancing Scrobbles","toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Youtube Music","permalink":"/multi-scrobbler/configuration/sources/youtube-music"},"next":{"title":"Musicbrainz Stage","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz"}}'),r=s(4848),a=s(8453);let t={sidebar_position:3,title:"Enhancing Scrobbles",toc_max_heading_level:5},o,l={},c=[{value:"Journey of a Scrobble",id:"journey-of-a-scrobble",level:2},{value:"Lifecycle Hooks",id:"lifecycle-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:"Best Practices",id:"best-practices",level:2},{value:"Caching",id:"caching",level:3},{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,a.R)(),...e.components},{Details:s,DetailsAdmo:i}=n;return s||u("Details",!0),i||u("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.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,r.jsx)(n.strong,{children:"title, artists, and album"})," at many different times in multi-scrobbler's lifecycle."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Why Would I Do This?"}),(0,r.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,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ID3 tags in your music collection are dirty or have repeating garbage IE ",(0,r.jsx)(n.code,{children:"[YourMusicSource.com] My Artist - My Title"})]}),"\n",(0,r.jsxs)(n.li,{children:["A Source's service often incorrectly adds data to some field IE ",(0,r.jsx)(n.code,{children:"My Artist - My Title (Album Version)"})," when the title should just be ",(0,r.jsx)(n.code,{children:"My Title"})]}),"\n",(0,r.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,r.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,r.jsx)(n.h2,{id:"journey-of-a-scrobble",children:"Journey of a Scrobble"}),"\n",(0,r.jsx)(n.p,{children:"First, let's recap the lifecycle of a scrobble in multi-scrobbler:"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Sources"})," are the beginning of the journey for a ",(0,r.jsx)(n.strong,{children:"Play"})," (song you've listened to long enough to be scrobblable)"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Source finds a new valid ",(0,r.jsx)(n.strong,{children:"Play"})]}),"\n",(0,r.jsxs)(n.li,{children:["The Source ",(0,r.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,r.jsxs)(n.li,{children:["The Source ",(0,r.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,r.jsxs)(n.p,{children:["Scrobble ",(0,r.jsx)(n.strong,{children:"Clients"})," listen for discovered Plays from Sources, then..."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Client receives a ",(0,r.jsx)(n.strong,{children:"Play"})," from a Source"]}),"\n",(0,r.jsxs)(n.li,{children:["The Client ",(0,r.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,r.jsxs)(n.li,{children:["The Client ",(0,r.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,r.jsx)(n.h2,{id:"lifecycle-hooks",children:"Lifecycle Hooks"}),"\n",(0,r.jsx)(n.p,{children:"You'll notice there is a pattern above that looks like this:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Before"})," data is compared"]}),"\n",(0,r.jsxs)(n.li,{children:["Data is ",(0,r.jsx)(n.strong,{children:"compared"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"After"})," data is compared"]}),"\n"]}),"\n",(0,r.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,r.jsx)(n.h5,{id:"tldr",children:"TLDR"}),"\n",(0,r.jsxs)(n.p,{children:["In more concrete terms this is the structure of hooks within a configuration (can be used in any ",(0,r.jsx)(n.strong,{children:"Source"})," or ",(0,r.jsx)(n.strong,{children:"Client"}),"):"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h3,{id:"hook",children:"Hook"}),"\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"Sources"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if Play was already discovered"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"postCompare"})," - modify Play data before sending to scrobble ",(0,r.jsx)(n.strong,{children:"Clients"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"Clients"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"preCompare"})," - modify Play data immediately when received"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"compare"})," - temporarily modify Play data when it is being compared to see if it was already scrobbled"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"postCompare"})," - modify Play data before scrobbling it to downstream service and adding to already seen scrobbles"]}),"\n"]}),"\n",(0,r.jsxs)(i,{type:"tip",summary:"Transformed Scrobbles Are Permanently Modified",children:[(0,r.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,r.jsx)(n.strong,{children:"compare"})," hook)."]}),(0,r.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,r.jsx)(n.strong,{children:"Source's"})," ",(0,r.jsx)(n.code,{children:"preCompare"})," hook because all later processes will receive the data with the modified track."]})]}),"\n",(0,r.jsx)(n.admonition,{title:"TLDR",type:"tip",children:(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.strong,{children:["To modify a scrobble coming from one of your Sources use the ",(0,r.jsx)(n.code,{children:"preCompare"})," hook."]})})}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Using ",(0,r.jsx)(n.code,{children:"compare"})," hook"]}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"compare"})," ",(0,r.jsx)(n.a,{href:"#hook",children:"hook"})," is slightly different than ",(0,r.jsx)(n.code,{children:"preCompare"})," and ",(0,r.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,r.jsx)(n.strong,{children:"does not modify downstream data!"})," Instead, the modifications are made only for use in the comparison."]}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h2,{id:"stage",children:"Modification Stage"}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.a,{href:"#hook",children:(0,r.jsx)(n.strong,{children:"hook"})})," is made up of one or more ",(0,r.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,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The ",(0,r.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,r.jsxs)(n.li,{children:["The ",(0,r.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,r.jsxs)(n.li,{children:["The ",(0,r.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,r.jsx)(n.p,{children:"Each Stage in a Hook receives Play data from the previous Stage."}),"\n",(0,r.jsxs)(n.p,{children:["Within a hook, each Stage minimally consists of a ",(0,r.jsx)(n.code,{children:"type"})," to identify what Stage it is along with any other data specific to that stage:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json5",children:'{\n "type": "native"\n // optional, stage specific data here...\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"configuring-stages",children:"Configuring Stages"}),"\n",(0,r.jsxs)(n.p,{children:["Stages may be globally configured using ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"})," ",(0,r.jsx)(n.code,{children:"config.json"})," file in the top-level ",(0,r.jsx)(n.code,{children:"transformers"})," block."]}),"\n",(0,r.jsx)(n.p,{children:"Each Stage consists of:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"})," the type of Stage"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"name"})," a unique name for the Stage, to be (potentially) used with hooks"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"defaults"})," - An object defining default configuration for this stage, when used in a Hook."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.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,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": "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,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": "native"\n "name": "MyNativeTransformer" // when "name" is not defined, uses first found "native" transformer\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.p,{children:"Multiple stages of the same type may be configured, allowing you to define several sets of default behavior."}),"\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": "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,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": "native"\n "name": "DotTransformer"\n }\n ]\n }\n }\n }\n]\n'})}),(0,r.jsxs)(n.p,{children:["In a ",(0,r.jsx)(n.a,{href:"/configuration/sources/vlc",children:"VLC"})," ",(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="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,r.jsx)(n.h4,{id:"overriding-configuration",children:"Overriding Configuration"}),"\n",(0,r.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,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": "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,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": "native"\n "name": "MyNativeTransformer",\n // overrides property from "defaults"\n "artistsParseFrom": ["artists", "title"]\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,r.jsx)(n.h3,{id:"stage-rules",children:"Rules for Play Data"}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.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,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"artists"})," and/or ",(0,r.jsx)(n.code,{children:"album"})," in the Stage object."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.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,r.jsxs)(n.p,{children:["Generically, though, each property may be some value ",(0,r.jsx)(n.strong,{children:"or"})," an object combining a ",(0,r.jsxs)(n.a,{href:"#conditional-modification",children:[(0,r.jsx)(n.code,{children:"when"})," condition"]})," and that value."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.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,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Specifying these Rules is ",(0,r.jsx)(n.strong,{children:"not"})," the same as ",(0,r.jsx)(n.a,{href:"#configuring-stages",children:"configuring the Stage"}),". Rules only determine if the ",(0,r.jsx)(n.em,{children:"result"})," of the transformation should be used (replace) the existing Play Data."]})}),"\n",(0,r.jsx)(n.h2,{id:"flow-control",children:"Stage Flow Control"}),"\n",(0,r.jsxs)(n.p,{children:["Stages may be optionally configured to ",(0,r.jsx)(n.strong,{children:"continue"})," to the next Stage or ",(0,r.jsx)(n.strong,{children:"stop"})," (end early) all subsequent Stages, based on the outcome of the currently running Stage."]}),"\n",(0,r.jsxs)(n.p,{children:["These three properties can be added to the ",(0,r.jsx)(n.a,{href:"#stage",children:"Modification Stage"})," data, alongside ",(0,r.jsx)(n.a,{href:"#stage-rules",children:"Rules"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"onSuccess"})," (default ",(0,r.jsx)(n.code,{children:"continue"}),") - If the Stage successfully finishes processing"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"onFailure"})," (default ",(0,r.jsx)(n.code,{children:"stop"}),") - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"onSkip"})," (default ",(0,r.jsx)(n.code,{children:"continue"}),") - If the Stage does not process the Play data due to stage-level ",(0,r.jsx)(n.a,{href:"#conditional-modification",children:(0,r.jsx)(n.code,{children:"when"})})," or other stage-specific skip conditions"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.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,r.jsx)(n.p,{children:"Specifying Flow Control is only necessary if the above assumptions are not true for your scenario."}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Default Flow Control Example"}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Customized Flow Control Example"}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h3,{id:"conditional-modification",children:"Conditionally Run"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"#stage",children:"Stages"})," within a ",(0,r.jsx)(n.a,{href:"#hook",children:"Hook"}),", and ",(0,r.jsx)(n.a,{href:"#stage-rules",children:"Rules"})," within each Stage, support a ",(0,r.jsx)(n.code,{children:"when"})," object for testing ",(0,r.jsx)(n.strong,{children:"if they should be run."})]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.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,r.jsx)(n.strong,{children:"pre-transformation"})," values from Play data."]}),"\n",(0,r.jsxs)(n.p,{children:["All parts of an individual ",(0,r.jsx)(n.code,{children:"when"}),' clause must test true to "pass" but if ',(0,r.jsx)(n.strong,{children:"any"})," ",(0,r.jsx)(n.code,{children:"when"})," clauses pass the Stage/Rule is processed."]}),"\n",(0,r.jsxs)(n.p,{children:["If the ",(0,r.jsx)(n.code,{children:"when"})," test does not pass then the Stage is ",(0,r.jsx)(n.a,{href:"#flow-control",children:(0,r.jsxs)(n.strong,{children:["skipped (",(0,r.jsx)(n.code,{children:"onSkip"}),")"]})}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.p,{children:"More succinctly:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["All parts (",(0,r.jsx)(n.code,{children:"artist"})," ",(0,r.jsx)(n.code,{children:"album"})," ",(0,r.jsx)(n.code,{children:"albumArtist"})," ",(0,r.jsx)(n.code,{children:"duration"})," ",(0,r.jsx)(n.code,{children:"meta"})," ",(0,r.jsx)(n.code,{children:"title"}),") of a ",(0,r.jsx)(n.code,{children:"when"})," are ",(0,r.jsx)(n.code,{children:"AND"})," conditions"]}),"\n",(0,r.jsxs)(n.li,{children:["All part-objects in the ",(0,r.jsx)(n.code,{children:"when"})," array are ",(0,r.jsx)(n.code,{children:"OR"})," conditions"]}),"\n"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Example of Stage with ",(0,r.jsx)(n.code,{children:"when"})," condition"]}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example of individual rule with when condition"}),(0,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsxs)(n.p,{children:["MS can log a diff of Stage transformations if/when they occur. In the ",(0,r.jsx)(n.code,{children:"playTransform"})," object of a Source/Client config use ",(0,r.jsx)(n.code,{children:"log"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"log": true'})," => Output original play + final transformed output of last Stage in the array","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["This can also be enabled by using ",(0,r.jsx)(n.a,{href:"/configuration/#debug-mode",children:(0,r.jsx)(n.code,{children:"DEBUG_MODE=true"})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"log": "all"'})," => Output original play + final transformed output of ",(0,r.jsx)(n.strong,{children:"each"})," Stage in the array"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.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,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.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,r.jsx)(n.pre,{children:(0,r.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,r.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,r.jsx)(n.h3,{id:"caching",children:"Caching"}),"\n",(0,r.jsxs)(n.p,{children:["MS uses ",(0,r.jsx)(n.a,{href:"/configuration/#caching",children:"caching"})," to reduce the number of API calls needed for stages like ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," and to speed up all transforms by caching steps and results. However, the default caching strategy uses a small cache size and very short ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Time_to_live",children:"TTLs"})," because it is ",(0,r.jsx)(n.em,{children:"in-memory"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsxs)(n.strong,{children:["If you are using any Transform stages you should configure ",(0,r.jsx)(n.a,{href:"/configuration#secondary-caching",children:"secondary caching"})]})," to increase the cache size and lifetime of cached items. This will also reduce memory usage in MS."]}),"\n",(0,r.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsxs)(n.p,{children:["See ",(0,r.jsx)(n.strong,{children:"Examples"})," sections in specific Stage docs (also in the sidebar):"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/user#examples",children:"User Stage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/native#examples",children:"Native Stage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#examples",children:"Musicbrainz Stage"})}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,a.R)(),...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.")}}}]); \ No newline at end of file diff --git a/assets/js/153c3ceb.8bccd2a2.js b/assets/js/153c3ceb.8bccd2a2.js deleted file mode 100644 index d70ce07f..00000000 --- a/assets/js/153c3ceb.8bccd2a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1309"],{9127(e,t,l){l.r(t),l.d(t,{metadata:()=>r,default:()=>p,frontMatter:()=>n,contentTitle:()=>i,toc:()=>d,assets:()=>o});var r=JSON.parse('{"id":"development/flatpak","title":"Flatpak","description":"Building Flatpak App","source":"@site/docs/development/flatpak.md","sourceDirName":"development","slug":"/development/flatpak","permalink":"/multi-scrobbler/development/flatpak","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/development/flatpak.md?plain=1","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"sidebar_position":4,"title":"Flatpak","description":"Building Flatpak App"},"sidebar":"tutorialSidebar","previous":{"title":"Source Development/Tutorial","permalink":"/multi-scrobbler/development/dev-source"},"next":{"title":"FAQ","permalink":"/multi-scrobbler/FAQ"}}'),a=l(4848),s=l(8453);let n={toc_min_heading_level:2,toc_max_heading_level:5,sidebar_position:4,title:"Flatpak",description:"Building Flatpak App"},i,o={},d=[{value:"Install Requirements",id:"install-requirements",level:2},{value:"Flatpak and flatpak-builder",id:"flatpak-and-flatpak-builder",level:3},{value:"flatpak-node-generator",id:"flatpak-node-generator",level:4},{value:"Update Project source",id:"update-project-source",level:2},{value:"Generate Sources and Build",id:"generate-sources-and-build",level:2},{value:"Use Setup Script",id:"use-setup-script",level:3},{value:"Manual Setup",id:"manual-setup",level:3},{value:"Use flatpak-node-generator to generate sources",id:"use-flatpak-node-generator-to-generate-sources",level:4},{value:"Build flatpak",id:"build-flatpak",level:4}];function c(e){let t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,s.R)(),...e.components},{Details:l}=t;return l||function(e,t){throw Error("Expected "+(t?"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.jsx)(t.h2,{id:"install-requirements",children:"Install Requirements"}),"\n",(0,a.jsx)(t.h3,{id:"flatpak-and-flatpak-builder",children:"Flatpak and flatpak-builder"}),"\n",(0,a.jsxs)(t.p,{children:["Install ",(0,a.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"Flatpak"})]}),"\n",(0,a.jsxs)(t.p,{children:["Install ",(0,a.jsx)(t.a,{href:"https://docs.flatpak.org/en/latest/first-build.html#building-your-first-flatpak",children:"flatpak-builder"})]}),"\n",(0,a.jsx)(t.h4,{id:"flatpak-node-generator",children:(0,a.jsx)(t.a,{href:"https://github.com/flatpak/flatpak-builder-tools/tree/master/node",children:"flatpak-node-generator"})}),"\n",(0,a.jsxs)(t.p,{children:["Requires python 3.7+, ",(0,a.jsx)(t.a,{href:"https://pip.pypa.io/en/stable/",children:"pip"}),"/",(0,a.jsx)(t.a,{href:"https://pypa.github.io/pipx/",children:"pipx"})]}),"\n",(0,a.jsx)(t.h2,{id:"update-project-source",children:"Update Project source"}),"\n",(0,a.jsxs)(t.p,{children:["Set the ",(0,a.jsx)(t.code,{children:"branch"})," ",(0,a.jsx)(t.code,{children:"tag"})," or ",(0,a.jsx)(t.code,{children:"commit"})," to use for MS in the ",(0,a.jsx)(t.code,{children:"source"})," section of ",(0,a.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/flatpak/io.github.foxxmd.multiscrobbler.yml",children:(0,a.jsx)(t.code,{children:"io.github.foxxmd.multiscrobbler.yml"})})]}),"\n",(0,a.jsx)(t.h2,{id:"generate-sources-and-build",children:"Generate Sources and Build"}),"\n",(0,a.jsx)(t.h3,{id:"use-setup-script",children:"Use Setup Script"}),"\n",(0,a.jsx)(t.p,{children:"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."}),"\n",(0,a.jsxs)(t.p,{children:["Located in the project at ",(0,a.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/flatpak/setup.sh",children:(0,a.jsx)(t.code,{children:"flatpak/setup.sh"})}),", run it from the ",(0,a.jsx)(t.code,{children:"flatpak"})," directory with this syntax:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"./setup.sh -o -b /path/to/flatpak/build/dir\n"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"Args:\n\n-o => Delete and overwrite any existing generated sources\n-b => The absolute path to the directory that should be used for flatpak build/artifacts. If not defined will use `CWD/build`\n-y => Proceed without confirming settings\n"})}),"\n",(0,a.jsx)(t.h3,{id:"manual-setup",children:"Manual Setup"}),"\n",(0,a.jsxs)(t.p,{children:["If you cannot use ",(0,a.jsx)(t.code,{children:"setup.sh"})," follow the below to manually generate sources and build the flatpak app:"]}),"\n",(0,a.jsxs)(l,{children:[(0,a.jsx)("summary",{children:"Instructions"}),(0,a.jsxs)(t.h4,{id:"use-flatpak-node-generator-to-generate-sources",children:["Use ",(0,a.jsx)(t.code,{children:"flatpak-node-generator"})," to generate sources"]}),(0,a.jsxs)(t.p,{children:["First, ",(0,a.jsxs)(t.a,{href:"https://github.com/flatpak/flatpak-builder-tools/issues/354#issuecomment-1478518442",children:["make sure ",(0,a.jsx)(t.code,{children:"node_modules"})," is deleted or empty"]})," for both the project and ",(0,a.jsx)(t.code,{children:"docsite"})," directories."]}),(0,a.jsx)(t.p,{children:"Then, from MS project root:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="PROJECT_DIR"',children:"flatpak-node-generator npm package-lock.json\n"})}),(0,a.jsxs)(t.p,{children:["Move ",(0,a.jsx)(t.code,{children:"generated-sources.json"})," into ",(0,a.jsx)(t.code,{children:"PROJECT_DIR/flatpak"})," and rename ",(0,a.jsx)(t.code,{children:"generated-sources.0.json"})]}),(0,a.jsxs)(t.p,{children:["Then, generate ",(0,a.jsx)(t.code,{children:"docsite"})," sources:"]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="PROJECT_DIR"',children:"flatpak-node-generator npm docsite/package-lock.json\n"})}),(0,a.jsxs)(t.p,{children:["Move ",(0,a.jsx)(t.code,{children:"generated-sources.json"})," into ",(0,a.jsx)(t.code,{children:"PROJECT_DIR/flatpak"})," and rename ",(0,a.jsx)(t.code,{children:"generated-sources.1.json"})]}),(0,a.jsx)(t.h4,{id:"build-flatpak",children:"Build flatpak"}),(0,a.jsxs)(t.p,{children:["In the below command replace ",(0,a.jsx)(t.code,{children:"/home/yourUser/multi-scrobbler-flatpak"})," with a directory to use for storing flatpak build/artifacts."]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="PROJECT_DIR/flatpak"',children:"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\n"})}),(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["Append ",(0,a.jsx)(t.code,{children:"--install --user"})," to the above command to have the app installed immediately."]})})]}),"\n",(0,a.jsx)(t.h1,{id:"run-app",children:"Run App"}),"\n",(0,a.jsxs)(t.p,{children:["If built with ",(0,a.jsx)(t.code,{children:"--install --user"})," (default when using ",(0,a.jsx)(t.code,{children:"setup.sh"}),") you can now run MS using the command"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"flatpak run -u io.github.foxxmd.multiscrobbler\n"})})]})}function p(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/153c3ceb.d314d9bc.js b/assets/js/153c3ceb.d314d9bc.js new file mode 100644 index 00000000..e2881de0 --- /dev/null +++ b/assets/js/153c3ceb.d314d9bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1309"],{9127(e,t,l){l.r(t),l.d(t,{metadata:()=>r,default:()=>p,frontMatter:()=>n,contentTitle:()=>i,toc:()=>d,assets:()=>o});var r=JSON.parse('{"id":"development/flatpak","title":"Flatpak","description":"Building Flatpak App","source":"@site/docs/development/flatpak.md","sourceDirName":"development","slug":"/development/flatpak","permalink":"/multi-scrobbler/development/flatpak","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/development/flatpak.md?plain=1","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"sidebar_position":4,"title":"Flatpak","description":"Building Flatpak App"},"sidebar":"tutorialSidebar","previous":{"title":"Source Development/Tutorial","permalink":"/multi-scrobbler/development/dev-source"},"next":{"title":"FAQ","permalink":"/multi-scrobbler/FAQ"}}'),a=l(4848),s=l(8453);let n={toc_min_heading_level:2,toc_max_heading_level:5,sidebar_position:4,title:"Flatpak",description:"Building Flatpak App"},i,o={},d=[{value:"Install Requirements",id:"install-requirements",level:2},{value:"Flatpak and flatpak-builder",id:"flatpak-and-flatpak-builder",level:3},{value:"flatpak-node-generator",id:"flatpak-node-generator",level:4},{value:"Update Project source",id:"update-project-source",level:2},{value:"Generate Sources and Build",id:"generate-sources-and-build",level:2},{value:"Use Setup Script",id:"use-setup-script",level:3},{value:"Manual Setup",id:"manual-setup",level:3},{value:"Use flatpak-node-generator to generate sources",id:"use-flatpak-node-generator-to-generate-sources",level:4},{value:"Build flatpak",id:"build-flatpak",level:4}];function c(e){let t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,s.R)(),...e.components},{Details:l}=t;return l||function(e,t){throw Error("Expected "+(t?"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.jsx)(t.h2,{id:"install-requirements",children:"Install Requirements"}),"\n",(0,a.jsx)(t.h3,{id:"flatpak-and-flatpak-builder",children:"Flatpak and flatpak-builder"}),"\n",(0,a.jsxs)(t.p,{children:["Install ",(0,a.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"Flatpak"})]}),"\n",(0,a.jsxs)(t.p,{children:["Install ",(0,a.jsx)(t.a,{href:"https://docs.flatpak.org/en/latest/first-build.html#building-your-first-flatpak",children:"flatpak-builder"})]}),"\n",(0,a.jsx)(t.h4,{id:"flatpak-node-generator",children:(0,a.jsx)(t.a,{href:"https://github.com/flatpak/flatpak-builder-tools/tree/master/node",children:"flatpak-node-generator"})}),"\n",(0,a.jsxs)(t.p,{children:["Requires python 3.7+, ",(0,a.jsx)(t.a,{href:"https://pip.pypa.io/en/stable/",children:"pip"}),"/",(0,a.jsx)(t.a,{href:"https://pypa.github.io/pipx/",children:"pipx"})]}),"\n",(0,a.jsx)(t.h2,{id:"update-project-source",children:"Update Project source"}),"\n",(0,a.jsxs)(t.p,{children:["Set the ",(0,a.jsx)(t.code,{children:"branch"})," ",(0,a.jsx)(t.code,{children:"tag"})," or ",(0,a.jsx)(t.code,{children:"commit"})," to use for MS in the ",(0,a.jsx)(t.code,{children:"source"})," section of ",(0,a.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/flatpak/io.github.foxxmd.multiscrobbler.yml",children:(0,a.jsx)(t.code,{children:"io.github.foxxmd.multiscrobbler.yml"})})]}),"\n",(0,a.jsx)(t.h2,{id:"generate-sources-and-build",children:"Generate Sources and Build"}),"\n",(0,a.jsx)(t.h3,{id:"use-setup-script",children:"Use Setup Script"}),"\n",(0,a.jsx)(t.p,{children:"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."}),"\n",(0,a.jsxs)(t.p,{children:["Located in the project at ",(0,a.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/flatpak/setup.sh",children:(0,a.jsx)(t.code,{children:"flatpak/setup.sh"})}),", run it from the ",(0,a.jsx)(t.code,{children:"flatpak"})," directory with this syntax:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"./setup.sh -o -b /path/to/flatpak/build/dir\n"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"Args:\n\n-o => Delete and overwrite any existing generated sources\n-b => The absolute path to the directory that should be used for flatpak build/artifacts. If not defined will use `CWD/build`\n-y => Proceed without confirming settings\n"})}),"\n",(0,a.jsx)(t.h3,{id:"manual-setup",children:"Manual Setup"}),"\n",(0,a.jsxs)(t.p,{children:["If you cannot use ",(0,a.jsx)(t.code,{children:"setup.sh"})," follow the below to manually generate sources and build the flatpak app:"]}),"\n",(0,a.jsxs)(l,{children:[(0,a.jsx)("summary",{children:"Instructions"}),(0,a.jsxs)(t.h4,{id:"use-flatpak-node-generator-to-generate-sources",children:["Use ",(0,a.jsx)(t.code,{children:"flatpak-node-generator"})," to generate sources"]}),(0,a.jsxs)(t.p,{children:["First, ",(0,a.jsxs)(t.a,{href:"https://github.com/flatpak/flatpak-builder-tools/issues/354#issuecomment-1478518442",children:["make sure ",(0,a.jsx)(t.code,{children:"node_modules"})," is deleted or empty"]})," for both the project and ",(0,a.jsx)(t.code,{children:"docsite"})," directories."]}),(0,a.jsx)(t.p,{children:"Then, from MS project root:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="PROJECT_DIR"',children:"flatpak-node-generator npm package-lock.json\n"})}),(0,a.jsxs)(t.p,{children:["Move ",(0,a.jsx)(t.code,{children:"generated-sources.json"})," into ",(0,a.jsx)(t.code,{children:"PROJECT_DIR/flatpak"})," and rename ",(0,a.jsx)(t.code,{children:"generated-sources.0.json"})]}),(0,a.jsxs)(t.p,{children:["Then, generate ",(0,a.jsx)(t.code,{children:"docsite"})," sources:"]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="PROJECT_DIR"',children:"flatpak-node-generator npm docsite/package-lock.json\n"})}),(0,a.jsxs)(t.p,{children:["Move ",(0,a.jsx)(t.code,{children:"generated-sources.json"})," into ",(0,a.jsx)(t.code,{children:"PROJECT_DIR/flatpak"})," and rename ",(0,a.jsx)(t.code,{children:"generated-sources.1.json"})]}),(0,a.jsx)(t.h4,{id:"build-flatpak",children:"Build flatpak"}),(0,a.jsxs)(t.p,{children:["In the below command replace ",(0,a.jsx)(t.code,{children:"/home/yourUser/multi-scrobbler-flatpak"})," with a directory to use for storing flatpak build/artifacts."]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",metastring:'title="PROJECT_DIR/flatpak"',children:"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\n"})}),(0,a.jsx)(t.admonition,{type:"info",children:(0,a.jsxs)(t.p,{children:["Append ",(0,a.jsx)(t.code,{children:"--install --user"})," to the above command to have the app installed immediately."]})})]}),"\n",(0,a.jsx)(t.h1,{id:"run-app",children:"Run App"}),"\n",(0,a.jsxs)(t.p,{children:["If built with ",(0,a.jsx)(t.code,{children:"--install --user"})," (default when using ",(0,a.jsx)(t.code,{children:"setup.sh"}),") you can now run MS using the command"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"flatpak run -u io.github.foxxmd.multiscrobbler\n"})})]})}function p(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/1bb2dc41.a7345fdd.js b/assets/js/1bb2dc41.a7345fdd.js new file mode 100644 index 00000000..12f7858c --- /dev/null +++ b/assets/js/1bb2dc41.a7345fdd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2609"],{442(e,i,n){n.r(i),n.d(i,{metadata:()=>s,default:()=>p,frontMatter:()=>d,contentTitle:()=>a,toc:()=>h,assets:()=>c});var s=JSON.parse('{"id":"configuration/clients/discord/discord-headless","title":"Discord (Headless)","description":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","source":"@site/docs/configuration/clients/discord/discord-headless.mdx","sourceDirName":"configuration/clients/discord","slug":"/configuration/clients/discord/discord-headless","permalink":"/multi-scrobbler/configuration/clients/discord/discord-headless","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-headless.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Discord (Headless)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Discord (App)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-app"},"next":{"title":"Koito","permalink":"/multi-scrobbler/configuration/clients/koito"}}'),t=n(4848),r=n(8453),o=n(8194),l=n(698);let d={title:"Discord (Headless)",toc_min_heading_level:2,toc_max_heading_level:5},a,c={},h=[{value:"Required Setup",id:"required-setup",level:2},{value:"User Token",id:"user-token",level:3},{value:"Optional Setup",id:"optional-setup",level:2},{value:"Configure When Presence Is Used",id:"configure-when-presence-is-used",level:3},{value:"Online Status",id:"online-status",level:4},{value:"Other Listening Activities",id:"other-listening-activities",level:4},{value:"Discord Application",id:"discord-application",level:3},{value:"Artwork",id:"artwork",level:3},{value:"Artwork URL Types",id:"artwork-url-types",level:4},{value:"Configuration",id:"configuration",level:2}];function u(e){let i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",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,r.R)(),...e.components},{Config:s,Details:d,DetailsAdmo:a}=i;return s||j("Config",!0),d||j("Details",!0),a||j("DetailsAdmo",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(i.p,{children:["This scrobbler uses ",(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})})," functionality to set your Discord ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/rich-presence/overview",children:"Rich Presence"})," to the music you are currently monitoring with multi-scrobbler."]}),"\n",(0,t.jsx)("img",{src:n(6170).A,height:"127"}),"\n",(0,t.jsxs)(i.p,{children:["This integration is ",(0,t.jsx)(i.strong,{children:"headless"}),", it does not depend on any specific Discord application to be running."]}),"\n",(0,t.jsx)(i.admonition,{type:"tip",children:(0,t.jsxs)(i.p,{children:["Check the ",(0,t.jsx)(i.a,{href:"/configuration/clients/discord",children:"main Discord docs page"})," for a comparison between ",(0,t.jsx)(i.strong,{children:"App"})," and ",(0,t.jsx)(i.strong,{children:"Headless"}),"."]})}),"\n",(0,t.jsxs)(a,{type:"note",summary:"How MS Uses Discord API",children:[(0,t.jsxs)(i.p,{children:["Multi-scrobbler does its utmost to implement, to-spec, ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/events/gateway",children:"Gateway API communication"})," and respect usage. It requires no ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/events/gateway#gateway-intents",children:"permissions"})," and reads no data other than monitoring what other user sessions are active."]}),(0,t.jsx)(i.p,{children:"Aside from the on-paper violation of using a user token programmatically (on your behalf), there is no misuse of the API to achieve rich presence."}),(0,t.jsxs)(i.p,{children:["Additionally, MS uses the state of non-MS sessions to conservatively update presence. ",(0,t.jsx)(i.a,{href:"#configure-when-presence-is-used",children:"By default it will not conflict"})," with any other official presence activities and is only used when you are actually active on a device."]})]}),"\n",(0,t.jsxs)(a,{type:"note",summary:"REQUIRED Interaction after Starting Multi-Scrobbler",children:[(0,t.jsxs)(i.p,{children:["Every time multi-scrobbler is started a discord session update needs to be triggered so that ",(0,t.jsx)(i.a,{href:"#configure-when-presence-is-used",children:"MS can capture the signals it uses to determine if presence can be updated."})," This only needs to be ",(0,t.jsx)(i.em,{children:"once"}),", after starting multi-scrobbler. But it does need to be ",(0,t.jsx)(i.em,{children:"every time"})," multi-scrobbler is (re)started. Without these signals MS will not update presence."]}),(0,t.jsxs)(i.p,{children:["This session update can happen automatically after ",(0,t.jsx)(i.em,{children:"some"})," time so you may not need to do anything. If you want to force the update then do one of the following:"]}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Open discord on a device it was not recently active on"}),"\n",(0,t.jsx)(i.li,{children:"Exit discord on an active device"}),"\n",(0,t.jsx)(i.li,{children:"Change your status (online, idle, etc...)"}),"\n",(0,t.jsx)(i.li,{children:"Set a custom status"}),"\n",(0,t.jsx)(i.li,{children:"Cause a presence update with a different app (listening to..., playing..., etc.)"}),"\n"]})]}),"\n",(0,t.jsx)(i.h2,{id:"required-setup",children:"Required Setup"}),"\n",(0,t.jsx)(i.h3,{id:"user-token",children:"User Token"}),"\n",(0,t.jsxs)(i.p,{children:["You must provide a ",(0,t.jsx)(i.strong,{children:"Discord User Token"})," for your account in order to authenticate with Discord."]}),"\n",(0,t.jsxs)(a,{type:"warning",summary:"User Token usage violates Discord TOS",children:[(0,t.jsxs)(i.p,{children:["This functionality requires you to use your own ",(0,t.jsx)(i.strong,{children:"Discord User Token"})," in a way that is ",(0,t.jsx)(i.strong,{children:"against Discord's policies/terms of service."})," If you use this scrobbler you do so ",(0,t.jsx)(i.strong,{children:"at your risk"}),"."]}),(0,t.jsx)(i.p,{children:"There is no precedent for Discord punishing users who use their own token for non-abuse/spam reasons but there is also no guarantee this lack of enforcement will continue."}),(0,t.jsxs)(i.p,{children:["Refer to the ",(0,t.jsx)(i.strong,{children:"How MS Uses Discord API"})," section above to gauge whether this risk is acceptable to you."]})]}),"\n",(0,t.jsxs)(a,{type:"warning",summary:"User Token is a Sensitive Credential",children:[(0,t.jsx)(i.p,{children:"Treat your User Token like a login credential. Anyone who has your token can access Discord as you."}),(0,t.jsx)(i.p,{children:"When finding instructions for obtaining this token only run commands, or follow steps, that you can understand and trust. Do not run commands you do not understand. Never give your token to someone else."})]}),"\n",(0,t.jsx)(i.p,{children:'No instructions will be provided for obtaining a User Token because it is against Discord\'s policies to use it. Instead, you can search online for "how to obtain discord user token".'}),"\n",(0,t.jsx)(i.h2,{id:"optional-setup",children:"Optional Setup"}),"\n",(0,t.jsx)(i.h3,{id:"configure-when-presence-is-used",children:"Configure When Presence Is Used"}),"\n",(0,t.jsx)(i.p,{children:'MS uses several signals from your "real" Discord sessions to determine if it should update presence. The default configuration is conservative to ensure that MS does not conflict with other apps using presence. Additionally, it only updates if a "real" user device is active on discord.'}),"\n",(0,t.jsxs)(i.admonition,{title:"TLDR",type:"tip",children:[(0,t.jsx)(i.p,{children:"Without any additional configuration, MS will only update presence if:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"you have discord open on a real device"}),"\n",(0,t.jsx)(i.li,{children:"your status is either: online, idle, or dnd (not invisible)"}),"\n",(0,t.jsx)(i.li,{children:"no other apps are broadcasting listening activities (listening to spotify, etc...)"}),"\n"]})]}),"\n",(0,t.jsx)(i.h4,{id:"online-status",children:"Online Status"}),"\n",(0,t.jsxs)(i.p,{children:["Configure if MS is allowed to update presence based on your online status. If this setting is not defined MS will only update if your status is ",(0,t.jsx)(i.strong,{children:"online"}),", ",(0,t.jsx)(i.strong,{children:"idle"}),", or ",(0,t.jsx)(i.strong,{children:"dnd"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Allowed Values: ",(0,t.jsx)(i.code,{children:"online"})," ",(0,t.jsx)(i.code,{children:"idle"})," ",(0,t.jsx)(i.code,{children:"dnd"})," ",(0,t.jsx)(i.code,{children:"invisible"})]}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(i.p,{children:'Only allow presence updating when all of your "real" sessions are either online or idle.'}),(0,t.jsx)(i.p,{children:"In File/AIO:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-json",children:'[\n {\n "name": "MS",\n "enable": true,\n "data": {\n "token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",\n "applicationId": "8190211179716453570",\n "statusOverrideAllow": ["online", "idle"]\n }\n }\n ]\n'})}),(0,t.jsx)(i.p,{children:"In ENV:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"DISCORD_STATUS_OVERRIDE_ALLOW=online,idle\n"})})]}),"\n",(0,t.jsx)(i.h4,{id:"other-listening-activities",children:"Other Listening Activities"}),"\n",(0,t.jsxs)(i.p,{children:["Without any additional configuration, MS will not set Rich Presence if ",(0,t.jsx)(i.strong,{children:"other"})," apps are broadcasting ",(0,t.jsx)(i.strong,{children:"listening"}),' activities EX "Listening to Spotify".']}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"What about other activity types?"}),(0,t.jsxs)(i.p,{children:['Discord uses an undocumented activity type priority to determine what activity is shown "first" for your profile. The Listening activity type has the ',(0,t.jsx)(i.em,{children:"lowest priority"}),"."]}),(0,t.jsx)(i.p,{children:"This means that if you start any other type of activity (streaming, watching, competing, etc...) it will take precedence over MS's listening activity."}),(0,t.jsx)(i.p,{children:"Your listening activity will still be visible by clicking into your full profile."})]}),"\n",(0,t.jsxs)(i.p,{children:["Configure the names of ",(0,t.jsx)(i.strong,{children:"other"})," listening activities that MS ",(0,t.jsx)(i.strong,{children:"is allowed"})," to broadcast at the same time as."]}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(i.p,{children:"You want to allow MS to update presence even if Spotify is also broadcasting a listening activity."}),(0,t.jsx)(i.p,{children:"In File/AIO:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-json",children:'[\n {\n "name": "MS",\n "enable": true,\n "data": {\n "token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",\n "applicationId": "8190211179716453570",\n "listeningActivityAllow": ["spotify"]\n }\n }\n ]\n'})}),(0,t.jsx)(i.p,{children:"In ENV:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"DISCORD_LISTENING_ACTIVITY_ALLOW=spotify\n"})})]}),"\n",(0,t.jsx)(i.h3,{id:"discord-application",children:"Discord Application"}),"\n",(0,t.jsxs)(i.p,{children:["Creating a ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/quick-start/overview-of-apps",children:"Discord App"})," enables you to use custom album cover art and secondary status images for more links. Creating an App is free and simple, it is recommended you do this to get the most functionality from Rich Presence."]}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Create An Application"}),(0,t.jsxs)(i.p,{children:["Go to the ",(0,t.jsx)(i.a,{href:"https://discord.com/developers/applications",children:"Discord Developer Portal"})]}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:'Click on "New Application" and give it a name'}),"\n",(0,t.jsxs)(i.li,{children:["Copy the ",(0,t.jsx)(i.strong,{children:"Application Id"})," (Client Id) shown after creation"]}),"\n",(0,t.jsxs)(i.li,{children:["Add this Id to your Multi-Scrobbler config","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Env Config => ",(0,t.jsx)(i.code,{children:"DISCORD_APPLICATION_ID=12345678"})]}),"\n",(0,t.jsxs)(i.li,{children:["File Config => ",(0,t.jsx)(i.code,{children:'"applicationId": "12345678"'})]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,t.jsx)(i.h3,{id:"artwork",children:"Artwork"}),"\n",(0,t.jsx)(i.p,{children:"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible."}),"\n",(0,t.jsx)(i.admonition,{type:"note",children:(0,t.jsxs)(i.p,{children:["If no ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," is configured the status art will ",(0,t.jsx)(i.strong,{children:"always"})," be the ",(0,t.jsx)(i.a,{href:"./?artworkUrl=discord-default#artwork-url-types",children:"Discord Default"}),"."]})}),"\n",(0,t.jsx)(i.p,{children:"The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below."}),"\n",(0,t.jsx)(i.h4,{id:"artwork-url-types",children:"Artwork URL Types"}),"\n",(0,t.jsxs)(o.A,{groupId:"artworkUrl",queryString:!0,children:[(0,t.jsxs)(l.A,{label:"External URLs",value:"external",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," ",(0,t.jsx)(i.strong,{children:"is"})," configured MS can use external URLs for artwork."]}),(0,t.jsx)("img",{src:n(6170).A,height:"127"}),(0,t.jsxs)(i.p,{children:["External URLs that are not from known music services are ",(0,t.jsx)(i.strong,{children:"disabled by default."})," This is to preserve ",(0,t.jsx)(i.em,{children:"your"})," privacy because Discord does not host images, it only links to them and the URL is visible to other users."]}),(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Why Should I Care?"}),(0,t.jsx)(i.p,{children:"There are some scenarios where you may not want your artwork URLs to be visible, for example:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["A Source may be accessible only on your LAN (Jellyfin at ",(0,t.jsx)(i.code,{children:"http://192.168.0.101"}),")"]}),"\n",(0,t.jsx)(i.li,{children:"A Source may be internet-facing but you do not want to expose this information to discord/other users"}),"\n",(0,t.jsx)(i.li,{children:"A Source may be internet-facing but requires authentication to view the image"}),"\n"]})]}),(0,t.jsx)(i.p,{children:"MS will use your artwork URLs only if:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["artwork url is from a known music service/",(0,t.jsx)(i.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," or"]}),"\n",(0,t.jsxs)(i.li,{children:["artwork url starts with ",(0,t.jsx)(i.code,{children:"https"})," and","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"artwork"})," (",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK"}),") is","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"true"})," => always uses the url"]}),"\n",(0,t.jsxs)(i.li,{children:["a list of custom domains keywords an external artwork url should contain EX","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["ENV => ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),"\n",(0,t.jsxs)(i.li,{children:["File Config => ",(0,t.jsx)(i.code,{children:'"artwork": ["mycdn","jellyfin"]'})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Examples"}),(0,t.jsxs)(i.p,{children:["None of the below URLs will ",(0,t.jsx)(i.strong,{children:"ever"})," be used because they are not ",(0,t.jsx)(i.code,{children:"https"})]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"http://foobar.com/cool.jpg <-- NOT allowed, not http\nhttp://192.168.0.112/fun.png <-- NOT allowed, not http\n"})}),(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK"})," is not set:"]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service\nhttps://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service\nhttps://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\nhttps://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\n"})}),(0,t.jsxs)(i.p,{children:["Setting ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK=true"})]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- allowed, is https\nhttps://anything.com/neat.jpg <-- allowed, is https\n"})}),(0,t.jsxs)(i.p,{children:["Setting ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- NOT allowed, is https but does not contain "mycdn" or "jellyfin"\nhttps://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains "jellyfin"\n'})})]})]}),(0,t.jsxs)(l.A,{label:"Musicbrainz/Cover Art Achive",value:"caa",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," ",(0,t.jsx)(i.strong,{children:"is"})," configured MS can try to use ",(0,t.jsx)(i.a,{href:"http://coverartarchive.org/",children:"Cover Art Archive"})," to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you."]}),(0,t.jsx)("img",{src:n(6170).A,height:"127"}),(0,t.jsx)(i.p,{children:"MS will try to use Cover Art Archive if:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an ",(0,t.jsx)(i.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," condition"]}),"\n",(0,t.jsxs)(i.li,{children:["and ",(0,t.jsxs)(i.strong,{children:["the scrobble data contains a ",(0,t.jsx)(i.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," Release (Album) MBID"]})]}),"\n"]}),(0,t.jsxs)(i.p,{children:["Basically, if MS would normally use the ",(0,t.jsx)(i.a,{href:"./?artworkUrl=ms-default#artwork-url-types",children:"MS Default"})," art, it will first try to use Cover Art Archive if the scrobble has a Release MBID."]}),(0,t.jsxs)(i.p,{children:["Some Source, like ",(0,t.jsx)(i.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})," and ",(0,t.jsx)(i.a,{href:"/configuration/sources/plex",children:"Plex"}),', can automatically provide this ID if the music is "matched" in your library.']}),(0,t.jsxs)(i.p,{children:["For all others, you can ",(0,t.jsx)(i.a,{href:"/configuration/transforms/musicbrainz#use-metadata-for-discord-album-art",children:(0,t.jsx)(i.strong,{children:"configure MS to use the Musicbrainz Stage"})})," for Discord to try to get this MBID."]})]}),(0,t.jsxs)(l.A,{label:"MS Default",value:"ms-default",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," ",(0,t.jsx)(i.strong,{children:"is"})," configured and these conditions are true:"]}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Cannot use an ",(0,t.jsx)(i.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," and"]}),"\n",(0,t.jsxs)(i.li,{children:["Cannot get album art from ",(0,t.jsx)(i.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," and"]}),"\n",(0,t.jsx)(i.li,{children:"Play does not contain artwork information (no artwork shown in dashboard)"}),"\n"]}),(0,t.jsx)(i.p,{children:"The status artwork will use a default URL instead of your artwork URL."}),(0,t.jsxs)(i.p,{children:["Without any other configuration, the default URL is an icon from the ",(0,t.jsx)(i.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/assets/default-artwork.png",children:"multi-scrobbler repository"}),":"]}),(0,t.jsx)("img",{src:n(8239).A,height:"127"}),(0,t.jsx)(i.p,{children:"This default image can be customized:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["ENV Config => ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png"})]}),"\n",(0,t.jsxs)(i.li,{children:["File Config => ",(0,t.jsx)(i.code,{children:'"artworkDefaultUrl": "https://cooldomain.com/art.png"'})]}),"\n"]}),(0,t.jsx)(i.p,{children:"Remember, this URL need to be accessible on the public internet."})]}),(0,t.jsxs)(l.A,{label:"Discord Default",value:"discord-default",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," is ",(0,t.jsx)(i.strong,{children:"not"})," configured Discord will show its own image. No custom artwork can be used in this configuration."]}),(0,t.jsx)(i.p,{children:"This is also the image Discord will display if the artwork URL cannot be fetched."}),(0,t.jsx)("img",{src:n(2867).A,height:"127"})]})]}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(s,{config:"DiscordClientConfig",fileContent:'[\n {\n "name": "Discord",\n "enable": true,\n "id": "myDiscordRemote",\n "data": {\n "token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",\n "applicationId": "8190211179716453570"\n }\n }\n]',client:!0,name:"discord",children:(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Default"}),(0,t.jsx)(i.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.em,{children:(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.code,{children:"DISCORD_ID"})})})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A globally unique ID EX ",(0,t.jsx)(i.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_NAME"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsxs)(i.td,{children:["Value of ",(0,t.jsx)(i.code,{children:"DISCORD_ID"})]}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A vanity name EX ",(0,t.jsx)(i.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.em,{children:(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.code,{children:"DISCORD_TOKEN"})})})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"User Token acquired from an active Discord sessions"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_APPLICATION_ID"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"Application ID used to display album art"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK_DEFAULT_URL"})}),(0,t.jsx)(i.td,{children:"string or boolean"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A URL of an image to use as a fallback if the album art URL cannot be used. Or ",(0,t.jsx)(i.code,{children:"false"})," to use discord's default."]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_STATUS_OVERRIDE_ALLOW"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"online,idle,dnd"})}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"A comma-separated list of statuses are allowed to have presence."})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_LISTENING_ACTIVITY_ALLOW"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A commera-seperated list of listening activity names MS ",(0,t.jsx)(i.strong,{children:"is allowed"})," to broadcast presence at the same time as."]})]})]})]})})]})}function p(e={}){let{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}function j(e,i){throw Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},6170(e,i,n){n.d(i,{A:()=>s});let s=n.p+"assets/images/discord_presence_art-3260bd6302b2f0d1f13b45762cc908de.png"},2867(e,i,n){n.d(i,{A:()=>s});let s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAAB/CAYAAAC3zOThAAAALXRFWHRDcmVhdGlvbiBUaW1lAFR1ZSAxNyBGZWIgMjAyNiAwMjoyMzozNiBQTSBFU1Tw59AbAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAHBdJREFUeJztnQd8FNUTx38pkBAghJqQ0AJIL0oREBGQKh3pVRRQVIpIs/0BFRAFAVFEFAHpghRpopTQm/ROCAYIhJ6EEgLkkvzfzLHHXXLpuWQvme/nc97e7tvdd4v3y8y892acq1StERMTAwX/Bx4eeWAwGLcFQRD0gjMEQRDsABErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsgnQRKwcHRzg5OfK7g4MDBEHIWtCavpiYaERFRfN7SrC5WDk7O8PR0QmCIGRdyEhxcHBiLYiOjoLBYEBycYQNcXbOJkIlCIIFpAmkDck+DzbCaFHZVAsFQbBTSBtII5J1DmwAxabEohIEISFII0grktweNoCC6YIgCImRHK2wSYA9OWopCELWJTlaYSOxkukJgiAkTnK0QiaFCoJgF4hYCYJgF4hYCYJgF2RIJDynmxu2+f0Fb+/CcY61a9sKU76dCFuSHvdIiF9nz8DyZQuQzWyeycD338Hnn3+KlLBg/mzUqlUjzv7mzZvg51nTIQiZAd0N250+fRZbtvgl2GbSN+Pxyisvw5b3SCop7Uv+/PnQuUsHpAUbNvyNCxcCIQiZGd2Jlf/5AKxXP76E8PQsiNQMOCblHrHx9S2BBg3qIS36QnUa//lnCzp3eh3uuXMjtSxZuhy3b9+BIGRmdBezatOmJRo3aoDBQ0awa9OnT0/4liiOo8dOYMKEycp9mg8XFxd8PvZTPH78GM2at4OPj7dyo95G1apVcPLUaUyb+gOCr13HZ5+NZJczu2pfqGBBrFm7HsuXr7K4B223bNEMoWFh3ObChf8wfsIk7st77/XHy3Vfwr1795A9e3b4+W236OvfG1fH6UvNGtUwcOAA5eJ6ISjoKiZNnoYzZ87F+Z5k3RUsVBA9enTBzJ9mWxwj93jYsMGoUL4sbt26jT9W/Iljx47jl59/QPvXuyM8PBwvvlgDo0YORadOPbFo0RxMUd/5338P8fNq3641IiMjcT7ggsVzpe/5QJ1b0rc4unTtg44d2+H19m2QK1cu7s/Yzyfwd6Xn5pbDDdmyZYNvyeJYu2YDyqm+eBYqhODgaxgzdjyioqLife5C5iBvXg+EhobF2UeY76d9efPmxX//2da61/XszV69umH+/CXo138gbt68xaklSBAuXw7iHwxtE19+8T/8rSyV7j3exJHDx5QIvWdxnWHDPsaX475G717drd6HHvaE8ZPQr997qKHEpkKFcvxDbNmiOYYP/xhTp/0ALy9PLFi41OI8a30ZOnQQ9uzdh169++P4iZMYPPjdeL/frFlz0LZtSxQokN9i/5MnT/Dn6nVo2bID5s5diAHv9MWlS0G4ePESGjY0Wnf1X6mr7rMf0THPqmcXL14U3bt1Utf9lYU4OtoyFUfRokUwadI0FjxPJZT0PH5SbQe8OwTOzk7qczdTW+dszhgx8lNMnDgFb7zRA3PnLMBbfd9FwYIF8Eq9ukl67oL9Uq3aCxgx4kN+maPtK1nS17SvQ4f26rfzJho1aghbouvRQP9zAejduxtOnjiNHTt24/79B3HalC5dUj24Ehg75hPTPrJGNAIDL/H79es3kDt3LraQYkPH7t2/z9thysKiH2RISKgx/050NMz0IEGoL3nyuCsLaC6LyMyZv2DD+pUcn7pzJ8TUjt1G9R9///PYvXsf3nyzFyIeRpiOk0vn6OSI776bpNzP4nBzy4G8Hh7YuWsv6r5UG+vWbUSt2jUxfvwki/vXrvUiTp48gw1//cOfd+7coyyn1qbj587583clXlLXOXnyFDZvNsbufl+2Eu+8/SYww9g24LzRKrt79y4ePnzIrjPx4MED5C+QL9HnLmQOQkNDTduaVRV7/7N9YbAluhar6d/PRKlSJdVf9u4YP240Ro8Zh/37D1q0oRmw4eEP0bJV2gSrNR4/esyisXDBbE4c9svseYmeQ32JijKYrJ3IJ5Gm/fFB15039yfs2bNfBbOM++rVewl933oD076bwdbUij8WsXhtUcLSq2dX1KxZnd2wI0eOWVyL3DbanyRUlyLNcgqR25icpQ+2eu6CPjh8+Ij6Qx9oIUC0PWnSFNO2xooVq8QNfHdAP4Qoi2T06HHqQVxki4cIC7vLcRZS+vPKAiArqGePrip+lJ2D1iOGD0FqqV79BXa9mjRtg6bN2nKsyxqx+xIaehetWjXnY12VS0bxqoSC32TpkKXEwfunmlapYgW2eg4dOoKKaluD4kH+/gF4/723sWP77jjXorgRubDaX8AqVSrFe1+y6MqVLYMyZZ6DoxKe9u1aqX17kVRs9dwF/WDNUqJ9sffTZ1sLFZGhYrVYBYZpvpX2qlbteYvjQVeuYPHiOVi3djkHdv227uD9q1atRR8VR5n9i9Fn+fiTMepHXU4Fgpeja9eO2LQ59dMSLgddQf36L5v6RnOZKKgdm9h9+eLLiWwV0TkUj5rw1eRE7zV//mJERDxzA2mkkmJkP//8Peq9XIeD9xo7d+1BiRLFVKxoc5zrHD16XP2VW40fZ0zluVyuKvgfH1euXMVsZdX98P1kbN26gd3jpFiP5tjiuQtCfDhUqVojxui1GH0QD488MBiSGKSJh+zZXWDvDFejcWQ5zJm7gD+PHv2xcg0f4etvpkIQhLTjyZPHSWonYhUPNBrYv18fuLi6ICY6Bo+UdfPzz3NMAWpBENIGEStBEOyCpIqVLGQWBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELHSCTN+mApXV1fT5ydPInHx0iWsWrWGc7UnBCXOm/njd9i4cROW/7ESGU3HDu3x2mtNOcXyoMHDTMkDmzZphC5dOvI27afc7slBe0bz5y/C9h27TPs/+WQkPPLkwchRKSsSK9gHuhWr55+vYnxVrczvekHLZ0VZOak8GAlEWnHz1i0cPnSUt719CqNypYqcwnjkqM8ssoXqHY+8efjdyckJ1V6oir37DvDnSpUrmtpQiupLly4jJbRr15qvSVWAhKyD7sSK0vl+NOpDXQmUOdQ/gkqz04vEdN5vi9IkKd/NG7csLKMOHdqhxWvNuOzRmTNnYS94eHggJCQEOXPmROUqlVhYqJgF5Xy/HBSEYkWLIl/evCkSK7LG3N3d+bms/nMthKyD7sRq6ZJ5sCdYsJSwfjB0VJpnEX306BG/U00/omHD+qhbtw68C3tx4Yg5c+dzUVJrlCtXRv2gm3PJrBs3b2LhwqVcwJXKevXo3pULReTKlZP3Lf39D87JTpD79lKd2lzL8OrVYCxesoyLAZDYtG3bigtpuOXIwQVV6Vjs2oQEuWShYXe5pD0Vv6BKOFWrVGZLi8qD9ejeBfny50u0r7GhJJFUqIISRDZt2ghbt24zlVAzJ1++vGjfrg2qqj8kd5RoUnGMzZu3onjxYhj9v4/V912OTZu2olatmni7/1vYtWsP5s5bgEKFCuKrCV/wH4y0tJiFtEFX1W2mTf0a9ghZW1Q0IrUU8iyITh1f59egge+iXdvWuHv3HgsTCQhVkrl18xb+WLEaPspNpHqD1vD0LIQPhgxkYfpdCVFkpAFDBr/HgkMxn7LKwtm1e4+yTNahRIniGPBOPz6vsBJBijcFBl7E0qXLuX2B/MYCrD17dkOjVxviwP6DHC+iuoPNmzWxen+qnUgieuToMbauypQpzcJB+6iyNEF1EBPra3wsWvw7V8Lu0LF9nGM5crji449G8P1WrV6LK0FX0a1rJ7ZSyZKjuoelS5XitmTpEaVLP/1criy/nzx5GoL+0I1lpcWo7BWysFIbw6Ly9XQdDYphzZu3kONVjRo14B/brJ9/5WNUjPX9997hwq2PH1vGbho2qM9WzJSp05XbFIED/x7E99OnqPjR89h/4F/8b/TniIgwWm35lRVClXTpx+/sbPzfgWJBVN1nzNhx/DmHsqReqlMLW/22KwFYw/uofe06L2LDX39b3Jv2u7m54Z4SWYrrUZCdystXqlSBn4+xeGwMWz9J6as1yOo6ePAw9+mfWFV+6F507d9UEH6HElU/1eciRX3wsrJIqfLPuXPn4etbgtuWUpYcDV6QlUnPkUSLxEyzMgV9oRuxat6ssdX95FpRTIhEgCwY+jGnhRWTHOj+JBp0fy2mpsWuzKHvkBqxor/oU6d9z6JB7kg252wmd4jiQOT+/Dp7psU5np6eXMLeHKob6OjoyD96y7aF+L3ey3VRuXIldns00XB1dUGQEqhfZs9lF4pczuMnTrKFRW4cXa+xErXGZiXCrQX98z9178Lu3uXjZ8/5s1CQhUXiRUJFlbXJ+kpKX82hWrFawdhly1fwH7fOnSyLrNJ9CPM6dkGXr8Cntjdvnzl7jl1Zb+/Cyp0ujOnf/8jWJbmrJX1LcH8FfaIryyo29D83xYI0WLiUaNA7CUZ6QPenfmj3pxftszYIYE3AUoLBYMC69X+hd6/uaN26BU9fIBeKXitX/WnRNjg42LStFX6mku90jR9m/GTR9sb1m6hRvRpPHzhw4CC7ZFTx2rweIgnmPhUQ9/UtwZZb926d8dMsY1XqvXv3s+WjYS1eVbCAsRDtXRWzIo4ra6pihfIsXCeU+BH3VZyJKvgm1teEuHMnBJtUHOq15k056K5ZiloBThIjzUIi4Qt72h/6tyR3um2bVlyF+tSpMwgI+A9VlNtIbvCWLVL7UK/oJmZl7YdOFo01yHrRBMSW8PQEK/fRrD1bsnPnbv6BUZyILC0qFV+0aBGOXdG8KnJ3XmvejH+k5LZRbIuqN5PwHFDBbzqnVasWyKNGzry9vdGlc0cua+/pZbRYNv69CeHh4ShfvpzpnuQOffP1OA5ea1WdKahN96DK0lSEtoJqT9du2qQxx75ik/eppRYaZhQN6gv9ey1bvtIkbmR1kZWoHY+vr4mxdu0G/g7kdmqQIJIr10vF2Mg67Ne3D7t3hw4dNvYrNJTda/ouZLWSm3pOWVMk4sTxp4Iq6A9dl49PSJAo/mFrEhrds3YsrSwrgn7YFASngDEJ0F8b/8GaNet5lI4C4vTj8tu2HU/rqGHdug0cdymvgsQBARfYnXukRKa7Gnl7vX0b9byO4/bt2xzHocD3R6OG83wlaqtB8RsaOaMAP1lVkYZI01SKufPm86gZuY8D3x+APB7ubJ3FJt9Ti0mzcMgapGts27bD1IbiWRTboldCfU0MstZWr7acvkDW0vTvZ+LEyVPKnW2NIkV8sGbteh5M0DivBizI9aT4FXHq1Gn+fOvWbbbYBH2im7qBVG49NuYuWGzIDTMPRtuC2G5obKz1uUHD1yAIQtJJat1AXVtWCY0O2lqoCC2gbo0+fXpCEIT0Q9diRaNrsUWBxCO95mPFN/JHIpreI5KCkNXRtRuoQe4Yj8TduJlskaDz+Hx1rpcaFSLhSe58LvNrkIAmFJsSN1AQkkemKh+fksmi2twoayR3vpbWXhCEjEPXbmBKICuoa7c+8QqV1oaOU7u0Xs8nCIJtyFRipQlVUgVIm+ApgiUI+idTidXEr6ck9xSTYGUknTu9zgttzaHsB2+92Tvecz4f+xlPDk0qNWtW59nogmCvZCqxim9OFmdFUKOK8cWdSLAyMiXI2nUbeGa6tq6NMg40erUBZw0QBMFIphIra2v1aJoD5ciiYDpNQ6BtawH7jX9vRkZBy1loZnmrVsaRxGZNG/PyGloaIgiCkUyVg53EiFxBsrBIqKwl8tPmTlFsy5yMjlvRcprx48Zgy5ZtvKZt9JgvOcNAjx5dUea50krQInD69Fn8uebZspHOnTvwesHcuXKxdUYLjWnJTd+3+sDdPTcvR9m8xQ+HDh3h9l5eXhg54kPOHXXv3n3M+HEWt6lfvx4aNKiHKEMUbt++g1/n/MbLVgRBT2QqsUrqhFFtZrq5QGkZFdJyfV9yoMXIm5VQjRwxFHv27uMFuiRW/ufOY9GipbwGcNiHQzilC+WEIs6fD8DChUuQS4nVR6OGcfbO6OgYFqiTJ0+xO0n7NbGizKBffzOFBYqyDjRu3BDr129kC27SpKmcT6pN65ao9WIN7Nq9F4KgJzLd1IWkYuuFyClh06YtvHB5w4aN/JkE6tLly2jRohne6N2DMyFomTsJchUJyjJw4b9AzppAIhcZ+YQD9t1UQF1LxULQomEtB9W27Tu4IIW2vw5lIu3ZDc8pK8485bAg6IUsKVbWRv/0kKWUMi1Q/ErLzUQB9wED+rGYLFAWVGIZLMmSopQvrVu1wJ49+7hklZbH3RpaZtABA/ojQllVy5b9oQTwKARBj2QJsdJcPJrVHl8mBz2mVPbxLswVbyiVSc6cbiheopjFca3P5AZSahjKz/Tcc6VwWFlc165d58R65PppUF4nSstCNGjwiimbJqVT3rtvP+c/r1CxPARBj2T6IqeJpXnR0OPC5AAlPlTNZtTID9kKuhZ8zXSMAuCehQrxfCvKkU5lqcgdpJxT3bt14VTClJ+JAuYaly4H8bUcHB2UxfUY06fP4P1btvph+LAhyK2C8pQ1UxD0iF0sZE4NCeXE0qCgfFpZVrKQWRCSR6ZayJwaEpuSkJZCJQiC7cj0Mav4Rvi0aQ4iVIJgH2R6y4rEKLYbmB4pkQVBSFsyv1hVrRxnX0bPpxIEIflkejeQUxA/TY2sLWgW108Q7I9Mb1kRNC1BcqYLgn2TJcSKU8D8vZlzsOs1VjXzx+kIunKFt11dXLgk/PwFi9SwbvovKKaZ85Rjy6eID7Jny8bzvVau/JPncb1YswZKlvTF0t+XxzmP5nvR2sbPv5gAQUhrsoRYmWcDpVns1rIxZDS0pm/ChG94mxYwUyHRV19tkOw8WyOGf4BJk6eZPjdu/CqLDJWETwq0ZOfDoYOwe/de/DZ/EfeFBH7QwAH4auJkLpB6zt8fgpDeZPqYFf3YY2dXsHXp99RCs3T/2bQFpUqWRHJxd3e3+JwnjzscHZL+z0zpYoKDr2Gr33Zeq0jl1Skzw4wZs/g4zZynUvWCkN5k/kmhN27G2UfuoN6JMhjYqiE++3QUAgMvoljxYti//1/s2rUbHTu0h4+PtxKTaPy+7A8WuD59enF5+U8+GcmpZZycnVCzRjV2JRs0fAULFixG//5vYvToL/m6+fLlQ9+3eltYYqWUi6ellDHn3v37/E7pkZ8rXQqLlyzjLA1Ojo4oXNgL19QfgWXLVkAQbEWmFyuq82duXdlDWS0SqSZNGuF8wAX+TK4ZZVxYtPh3/tznjZ7w27YDly5d5jzsgwe9i8nffsdu5JdfjDa5k4RBid614OucI4ug51C27HO8OLpxowZx8lZR3Ck0LIy3y5Uro9zKoaZjQz4YEaevdP+JX39rOlcQbIVdiJV5gJymHSRnnpQ2U10rUpqSUUGtyKl2PVtMfSB37dfZM3mbck4dPnwUfn7bTMf3msWcjHmrHnKwmzAYoljgni7yTBBKHVP3pTrw9w9AlSqVsXLVGovjD8IfwD13bt4+e9Yfffu9y9uUxM8ahw5LShkhfdC9WMVeiMxzpZTgJMc6So01ZS1rA12LZsGnJRQHGj7i4yS1pQwMlGUhJamHjx07oUb6OqCGcg/PnvNny8ucCxcCUb58WQ6kx76nIGQkug6wUyA89lIZLUCeXjnTraWXIbcyI4P0p06fQZ06tXibMot2MyuxpeWr0ohU8apcuZ/ltCLr69jxE+jRvSt2bN8Z59o0alit2guoXv0F/kwuaPv2bTjXe2JQQB4OEASboGuxim/YXkuml1H3T+yYrVmigtsUXB/6wSCM+3Is7t17NjpHUw7GjvmUc6wT+/YfQI3q1TBKuXGUZI+gIH1ISAguB12Jc20qTPHd9Bl4rXlTfDt5IiZPmgBnJ2cuVpEY5L5Gq4A/pWAWhLRG1/msEsoNlR6Lkcl6SqgMfXL7rBcoP3toaBi2bt0GQchokprPSteWVUKB7PRYjGxtEbSGPWZt8PYujCGD34ebGrXbuXM3BMGe0I1YWcvmGV8Qm0QsPRYj0z3iEyWaEhGbxDKSZjQ02ZNcPCo+IXUBBXtDN0M88ZXGoqUx5oVLSTzSc1Ey3Yvuy1MfnvaRRNSaWGZ0oVRByMzoJmZli+kA6U1S8r0LgmCJ3cWsaHQtI0fYUguJlAiVINgOXQXY03P+VFpCfU5KuS9BEFKOk6eX91jzHa6urqC5fam6qFPKQmEPHoTzWrUH4eF2k82TrKl+/QdCEISUQZk9koLu1lDwDPV5C/mdpg7Yai1eatDWKorrJwjph24C7IIgZE0yxaTQrIhLXlfk9s0LQRAskaX0OqPMW9VZsB6HPsKdI9dwPzCUX4nh5OKE4u3KI7u7C6IeR+Hy+nN4fCcCSSFfZU8UrFUElOsv7OxtXN95KU6bwvVLwKdJKZz4djf3TRDSGxErnaEJFb17v+qr9viahCt463/xnlesVVncCwjB7UPByOnjjpIdK+HMrH8TvZ9rATd4KSE6O+sgoiOjULpXVXjcfoiwM7ee9Sl/DuSr6oVHdx4iJnURAkFIMeIG6hCyXugVvDXQQrgKVCtstb2TizO7jiRURPjVezA8ikTuknkt2lQZXhe+HSpYnFuodlHcOnCFhYq45hcIz7rFLNqU7FgRl9ecRUxUDBwkBYyQQYhlpVNIpMiSunMkGNk9crBY0bs1cnjlwpMwS9fssbKC3Dxz4f5/z1xIR+UqOrpY/pO7FnRD6OlneeojbobzPo1CtYsoiyoC9y+GQRAyErGsdA6JljFuFb9YOGZzRNSTKE58V+mDOsoSy4GoRwY4ZncytYl6bMDR8TtwYbHlVAtHZ0duW7Cmj4p5lUO0uo5TNuN52XK7wOvl4hz/EoSMRiwrnZCaUUAKqFOAnWafBC4/pQQuAk45siHyfnji5ypxclZtQ0/d5JgXuYskXgS5jGTdRUUYIAgZjYiVDiCRKtu3GlJKxPUHHCgny4riVQS5gCHHrid67qMb4XArnAv3LoTA8NAY5yJX0MHJAe6l8/GrxOvP4lyVh9VF0AZ/3NgTBEFIT0SsdEbsaQoUVNfEggLu1qDgePjV+6qtt3E0sIg7u3APgp6lOyaLqeKgWnz9wBWnTftDTtyAb8cKuLlPBdkN0ez2hZ68ycH0g59tsbhPxcG1EbDgqExdEDIEESsdQAJCo388onf4msUxc6vmSVj886YurjqD0j2q8EgexaEuLDmB2PMMrAXYyRIjoaqsRgpjlFjRlIVbh65CEPSGLLfROWRZFW5oLCNPgiYImY2kLrcRy0rnkKUV29oShKyIiJUgCHaBiJUgCHaBiJUgCHaBTWawx8hqV0EQkkBytMJGYpXKvMiCIGQJkqMVNhGrqCgRK0EQEic5WmEzyyo6OmlJ4AVByJqQRmS4ZUUYDAbVGbGwBEGIC2kDaURysGmKGIMhUiwsQRAsIE0gbUguNp+6QOrp4BANJydH9U4vSTUpCFkNGvUjl49iVCkdgEuXeVbUOYNBXEJBEFKOTAoVBMEuELESBMEuELESBMEuELESBMEuELESBMEu+D/4FKPnngdRgwAAAABJRU5ErkJggg=="},8239(e,i,n){n.d(i,{A:()=>s});let s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAAB/CAYAAAC3zOThAAAALXRFWHRDcmVhdGlvbiBUaW1lAFR1ZSAxNyBGZWIgMjAyNiAwMzo1MzoxMiBQTSBFU1SzzP6eAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAJChJREFUeJztnQd8FNUWxk96hYSSAIHQe0kAQ1NEpAsIAqIUaVKkIwI+8SnwaCqgFEEFQWkiSpMuIIQmvffeQighEEJ6skne/U6yyyYk2Y1JyA6e/++3MjuZndmNs1/OOffe79j6+PolJiaSgv9D7u5upNMlbQuCIFgKtiQIgqABRKwEQdAEIlaCIGgCEStBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0ATPRaysrKzJxsaa/7WysiJBEP5dYE1fYmICxccn8L//hBwXK1tbW7K2tiFBEP69IEixsrJhLUhIiCedTkeZxZpyEFtbOxEqQRBSAE2ANmT6dZRDJEVUOaqFgiBoFGgDNCJTr6EcALUpiagEQcgIaAS0wuzjKQdAMV0QBMEUmdGKHCmwZ0YtBUH495IZrcghsZLpCYIgmCYzWiGTQgVB0AQiVoIgaAIRK0EQNEGuVMJdnJ1pp/9m8vIq8szP3mrbmr75+kvKSZ7HNcxl+IeD6bPPPs7wmDZtWtGsmVN5G7+zbVvXkylq+dWkefO+5d9zIU9PWrliKVWuXJEEQatY3LDduXMXaPt2/wyPmTplEjVoUJ9y8hrmktX3klO0b9+Gzpw+R40ataT7QUG0YeOfdDsgkARBq1hcGnjp8hV+ZEShQh6UlQFHc66RmlKlSlKJEt60c+ceys73klM4OjpSwO3blJDUFJIWLlxKgqBlLE6skPI0adyQhg4bRXXq+FHPnu9RqZIl6MTJ0zR58jRa8fticnBwoP+N+y/FxMRQ8xZvUdGiXjR4UD/y9fWhM2fP0Yzps+nO3XucXiHltFfHe3p40Lr1G2nFijUproHtVi2bU8jjx3zM1avXaNLkpJRr4MC+VP+Vl+nJkydkb29P/v67UrzXLX/+8cx7Qfo1eHB/la4VpgAVyUydNoPOn79o1md3cLCnQYM+oNdUpPbgQTD9MHcBHTlyLN3jmzR5nbp360zde/Tj50OG9OfPi3SveHFvqlHDlzq0b0vvdetDmzaupkGDP+L3OW/uLNp/4DB5FytKcXFxNGHiVxQU9IAEwZh8+dwpJOTxM/uA8X7sy5cvH127dp1yEouevdlNfREXL/6V+vQdzF8mWEtAEG7dCqCx4ybxNpgw/nPasnU7denai44fO6lEaGCK84wYMZq/kN27dUnzOvhlT540lfr0GUh+SmzwZYcAtmrZgkaOHE3TZ8ymwoUL0ZKly1O8Lq33Mnz4ENq3/wB1696XTp0+Q0OHDiBzGTZsEAtjz14f0I/zf6ZRI4eRjU36y5b8/XeTu7s7+fpU5eMaN2pIq9esZ/E6fvwkzZz1HQtValxcXGj1qrXUf8AwCgsLp2ZNG5MgGFOzZg0aNeojfhij31e6dCnDvg4d2qnvTi9q3Ph1ykksejTw0sUr1L17Z6697N79N3+xUlO2bGn1iytJ48Z+atiHqETP9es3+d979+5TnjyuHCGlBj97EhbG249VhOXhUZAePQpJ8t9JgP8OmQXei5tbXvpx3s+cfn3//Y8c0RQokJ8ePnxk8vV169Si/Pnz0XtdOxn2IfpJj/j4eNqhor3mLZqq9+zB17h06TKZQqeLp/MXkqK9R48e8TUFIS1CQkIM2/qoKvX+p/seU05i0WI169vvqUyZ0tSjRxeaNHEMjRk7kQ4ePJLiGMyAjYiIpFatO1B2EhMdQ8HBD2npkvlsHPbj/IUmX4P3Eh+vM9SJ4mLjDPuNcXd3U6IYytuuri4cTSUdRzR4yAg6c+ZciuN9fKule821azfSzBlTVO3Mk7aq6FIQsoNjx46rP/TXUwgQtqdO/cawrWfVqjWSBg7o34ceqWhhzJiJ6hdxgyMegC+6q6srK/3ly1c5CkI0gprPOx3bc/qUVV56qQbdvBlATZu1oWbN23KtKy1Sv5eQkFBq3boF/6xT545cr4Lo6SmjwufFi+ZxnaxatSp8nVOnzvLPDqg6Utcu73BKh3odpitgGxGU3k4jXkVFWPxpl/z8+vUbdO/+fapapRJt3ryVBCG7SCtSwr7U+/E8p4UK5KpYLfvlJ54HpH/UrFk9xc8xmrVs2U+0Yf0KunPnLvnv2M3716i6TM8eXWn+j3P4+ehPx1KVKhVp/boV1KnT27Ttr6xPS7gVcJtee62+4b0tWTyfatf2e+a41O9l/IQvqff7Pfg1bdu2oslfTEtx/FX1P3Wlqhd17NhO1cnG0fYdO8l/Z9LnmjFzDj1QwrZ61TKuw+3e8zcL1dmz59VoZAma8tUEleI+oMDAu+q6vxrOeezoCfp730FDKisILyJWPr5+iUlZS1LqghRFpzOzSJMO9vYOpHVGjhjKEdtPPy/h52PGjFapYTR9NWU6WRKI6L6dNY2+USOgx46dIEHQGrGxMWYdJ2KVDhgN7NunJzk4OlBiQiJFY8h/3k9cjLcUMK2jbZtW9Mcf62nR4mUkCFpExEoQBE1grljJQmZBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0AQiVoIgaAIRK0EQNIGIlSAImsCixArrfpLW/mRtuU/OYsX+VNJ1WhCeLxYhVrBBiYmOosioCPYIT0xIIIvEKslIz97ekVxcXNl/3cZGglNBeB7k+jctLi6WgoLu0Z3AmxQZGUFaAILl6ORMXl7e5OnplaZVsiAI2Uuumu8hooJQ3bh+STNCBZCqRqn3G3DrOt27d5vidTrKKlWrVKYF87/nB7rS6ClWrKhhf1rmfxkB73c98Fmf/s1X1L59W8oqaDiBqFIQnie5KlZI/RBR6bLhy54bwNriYXAQhYU/oayS30hYfH2eeq7XqP5UuDLT2GHSxHH07rtvp9gHgbG3y1oUWP+VejRj+pQUQigIz4NcSwMRnaBGpaWIKi34M0SEk7t71r68+dyTOofcCgggX6MGEVWrVuZ9xb29yd3N3ezz5c2bhwLvPH0O19OBgz6krJJHndfa2qKt+4UXFJtChb3GGe9AJ9+s1rfNKTpDrB4/DlFfIm0318TnyJPXPctiVbdubW5MunHDZqpV6yU6efI0R5ydO79D27fv5DZfT8KeGJqeIsrq0vld6tWzG9Wu40d2dnZs2u/tXYzTPTz3KlKE2rZpTQnxCXTj5i2aN3c2Odg7UHBwMM2a+TVHWefOX+DzfdCvN/Xt04v+2u5Pb77Zkrp2eZc6qcgMDS3Cw8Pp7t17NGTwAGrUqCEf3+j116h5sya0adMWft6gQX3q9l5n6tixPb+HgIDb3HUI9Txc16NgQXqr7Zvc2GPbXzuoikp7e7/fnbqo69StU5s/K3owCv8+UA4yh1z8E5louaN+meDpdIusAYfW8PAIOnL0OJ+venUflQL6cBRz8NBhevIkzBB9OTk50uhPRnEEtuaP9XQ7IJA6d+pIHTq8xc1gZ8yczaOqly5f4W283hgcc/t2IHfXARgwqFKlEjemwOuqVa1Cl69cpV9+Wc7i1q/v+yyO6GiNJhZg8eJfaM5383i7efOm1KN7V+5ysmLlGqpYoTz999OP+TPpgRgfOnyEFi9ZxsKEhrP4nDhPaGioEtbCJAgZIePu2UxcbCzFJ8Sr+pBjpuZiQYjQPxAPtNeCYCB1Q0SD5qXY754sVr6+Piwei9QXfffuvdzWvph3Ua4nrVr1B50+fZb/WoWFhfE2SD1iieYSbdq04tqTp6cnF82PJgvl1GnTKSoqmo8LV9HRoIH9qGTJktxLLigoiPdDzNBxCLxa/2VuLPvd9/P49RERETRwQD+OEHft2svH7Nt3gDZu/NNwfbQWQ39FNK79+ptZ2SL4wouNiFU2AqG6eesqRYSHUclS5VTdyN1swcqbN6/68icVmU6dOsNCgsale/fu432hoU84TQQQFmDcqy3g1m0qWteLzGX/gYN8jZdq1qCCBQtQXFwcHVViBMqVK0sNXq1PnoU8qJASMuCYweifk5MTXb9xwyA4V69e43/RT1EPokZjZs6awz0ehw8fomprd+j331fTmTNnSRDSQyql2UhMbLSKgB6rWtwjFixzowU0MkVBHIIEkC4h/XN2dqYTJ0/xPqRKiEbQnl7fZNLLq4jhHBA2fZdngGtbUfpCiVQQhXsfn6qqiF+Fzp27wClg3jx5VCT1AeVV19m//2CKaCjpxEn/GIswoj5PTw/Dc3QGAogMM7r+l199TSNHfUrhYREq1exlaOQqCGkhd0c2gpZdlCxQCVyPM0+sCuTPz19+CBK4fz+I1q7dQPYO9nTx4mXepxeigqpQffr0GS56o6CNKAtdnsuWLUNbt/5lOCeEr0KFctS48eucuunPY8zxYye5mA5h3LBxc9L5PQqyaBxXaeLFS5e5tmTMo5AkAWrd6g0KVMONeB3Sx3bt2tDgQf3plHpvKOpD+I6n08fQ2dmJp1YcUrU0HI/fEz6/uYVW4d+JRFYWQAGVhgF9ZAVQzF658mnLer2QQdiQss369ns6rdKmdm+9yRNHcfwfSuD0bNq8hdOzLmo0sUCBAmle98DBQyxUEAkIDkC9bNu2HdRMjfR9pFK0GzdupngNal0Y6cMEVXSsBn9u2ca9C9FwtePb7eiKqmchzUuvQ3RkZBT99ttKekXV2D4cNpjT2yVLfpW6lZAhudY3MEEVoe8EBqj6xgXSOiVKllUF6LIU9iSULl8+q4rGT6hMmYrkVdRbiYENCYKQPv/qvoFIY8qUraTqKIXNEouIiHBe8hMcHESCIFgmL2Qa6OTkwq4I5kY1ONbFNS8JgmC5vJgFdivDfwRBeEGQ0UBBEDSBiJUgCJpAxEoQBE0gYkVJbqVYKmMJjB37KV28cJmW/7bimZ+98UYzqlGjOm+XKO5NN5NdCnb676Z9+w+kOBYLiWd9+x3pdPH08ajh9L/xk+mfUrZMaWrTpjW5urrwer7jx0/Q5s1bkye+ps3/xn1GkyZPUcPSsSm2zWXC+DH0+Zjxz+zH4uumTRqTg4M9zw87dPgo7dy5m4QXnxderB49CqbwsFD+kqUHhOrx44eU2xQpUpiKFS1Krmp0Mi2xgkDgAaZ8NYkmKwFIjx/mzudFwpgYmhUKFy5E3bt3pZ9/XkzXb9zk5Th9+vbinz2zFCeHKVGiOHV8uz3NmDlH/X99xIuzMWs+Nib2GbHOCqVKlaSX69WhX5b9RoLl8MKLVUhIME8+xSRUS+fll+uqL91BqlypIlWsWJ4uXLhE/xQ4NWQHEIf1GzaxUAHMSl+wYKHBAeJ5gmU8EEgIFUCktmTpMhr+4ZBsFSsIvL3YNlsckgZaEHVq16IFPy3khcH16tYxW6xgxeLnV5MFxNrKilMufeoFYMQ3dMgAyuvmRjY21kpsFrGfFWjWrDFVqVxJHWNP/jt30WGVVhmDpTBz5y1IsQ/LgvDAer6uXTtR+XJlKSoqihdDr123IcP3ioXTMOrDmsbLl67Q6jVreX+lihWoc5d3KCY6hhc5p+VWgcgq9XuBNQ2AwMBVtVzZMrTs1995H0Rs2a+/8VrL9K77esMGvHQI+7GA/NHDEGrxRlPK4+pKn6pU+q+/dtChQ0dIyH1ErCyEMqouhC8oFhw/VF+YsWNGs19VgpkGhd7FitHYcRN53WBq4NQAryn4T2FxM9bvTZ8xWwlibXZ8wDYYOmSgEsiLnD7qwXvKqNZ0Sb1fmPRhzdaIj4axz1Z6bgseHgV5PeDs2T/wc1jU1KxZg32y4Bc/Z85cFhYsyoYfVlpggXRqIO5wrUiPjK5bv/7LNGHilyzoELvjx0/S49BQqlOnFqe+guUgYmUh1FM1EnhMAdgOw3SvenVf/kKZA7yg0hKqpPM9NBjlQQwRDUGEfHyqsWsnUj2A12PRs7FYQYTQaCItkcDPbt66RS1bNqeC6nVYyIx/0xMrdPBxVRGM/nrOLs4cocFJIjIykoUKYCE0DPxSE6sGQiCuqd0Z4AVm/J7NvS5ARAjraCzkhlAJloumxcrW1o7c3POpGzGpiUF0TLS6CUM01y0Z77eW30s82taqZQvD/jp1/MwWq8xgY21jaPoAG+WTyZ5ZaQFfdDiBwptdD8TF2cmRHipR6t+/Dy1fvoIL/7A/NgXOt2Ll6hT7UMQ3x3Hh2tXr7AlvnJZ5JFvaQOwye10w7euZVLp0KXZmbfNmS34uWCaaXBuIL3f+Ah7k4+unCtHVyLt4aSpWrKRKpSqoaMFP1TbKaqrxKNKPhw8fUu8+AwyP4cM/5kJ7dnwOOIFCEECFCuU5QkF0cvLUaVXvqmk4rn27tpwyGrNx05+cNqEJBMBo4AAlUMVU2lnUqwgF3X/A0ZqLilZKlCxueB2b/yX/0dBvnz5zjhtF6IXy5Xp1qZL6jKhRFSpUiA0EAaZK6N1Qjdm9Zy83ndC3JMPvptt7XWj7jp38HNGSR7IJIF5fJNnXPb3r4vX4bHBcRa3NjWt6Npz24vMIloXmIivc9AULelIFJVJpddHBPjQ5IA1FV6iP6Bsx6MGoGzrPoHj+99/7KSsgBWz3VhuOQpycnbg2BA4cOMSWQAP691VCX0qlX9eeSafwRV7w02KuZyFlhJj9sXY9j77hy49a0H8+/oijm7vJqSaAtTH2j5/wRYrtlavWUO/3e3CxPDo6mgvmqMst+GkR+2dFqrTs+rUbFPzw2akkEMUtW7bRfz/9D5sPIu3crz4D9oHLl68owW3Dc7TweqTSAGl1WteFKEGwxo//nIJVoX7nrj0s4vjMMFL87LNP1OjjZkkPLQTN+VmhEcNLfq9wQdQccP6cnrogflbPFwgjvOMxAoqGF8eOn6ANGzaToE1eWD+rosVKmC1UwosJIjy0F8MD6R6mPQgvPpoTqwIFPEkQ9GDU8MjRYyS8+GhOrBwdM7l8xCjFFQRBu2huNDCzHVB0ujgSBEH7aE6s0JfPXCBsUVGR0jVFEF4ANCdW9+8Fmr0EBU4K0dFRIlaC8AKguZrVo5BgehB0lzwLeWU4Uz0yMoLu3rnNXlVa4PvvZlHA7du8nc/djXbt3psrw/Gf/GcEOTg6qN+bjhdFYy7Vb7+v5DlOmPNlvFBY66CjNZbgoMehMfgdLF6yzLBESU++fPnog37vcydpUP+VelRG/T6wZOf331eRkLNoTqzi1bD1rVvXOLry8ChMtqmmMSCKCgsLVTdaAD0OfWR2FGYu+fIVpPz5C1KevG7k7OxCdrZ2hgmozi6uPJP+3r07lFkwqqX3p8JavFEjP6TTp8/SzZu3KLOUKpU1P6Yff/zZ8EX19PCgTz4ZQR+N+IT+7YSEhND8BYsMz5s3b0pjxk6QyP05ocm1gahD3bx1lUJV/cotrzs5OjlzBAATvfDwJ0qkQthwLzvbkXt5Fec5XhCo9MBSDUR8eOji4pSG/bMsG4uGL1+5SkWLev0jscpOP6agBw+4dX3+/PlJSJoNb4wI1fNDk2KFGyQmOprTwcchD3lBM1LC+IR4Fqz4eF223UR58uTlhqlubknr0QpaxVM5mziKTbSiCwl2FJGYJEguVglU0TqO7K0S6XK8HQVnYeIqIiusj9Pb9WKZDJbLYHkJHA2W/rKcU4/XXnuVGjZ8VUWb8eysgCUrWBCd2o8Ja+Zat3qDbVQQMeE4TKw0ByxadnR0VIKVNLBRuHBhXjpjY2vLreZ/VSkh7F0CbwfS3uRlQf1UqrRr1x52Q6hcuZJKa93J09ODl62wM4P6PPCtWrhoCZsE2tvb0dsd2rE4x8cncNoZGHiH1zFm9L5hJfPOOx34DxUWMmNBNY5jf6+XavLCcAg31kCuXZvks4Vo6LUG9dlW5u69+5QZcC5YRGOx87Bhg3jNJX7HsJU+cvRomp9ByD407bqAFC8mJpofOYGnZxGqVMmH07yC1vH0um0U+dom1cCQXJbR2dO6OBfuUNjKLpKqqp/pY6mT6mf+OicKTjBvuQ3W3C2Y/73hOWZn6y1TevZ4T9VVvuO1bDC6a/fWm1w3Qloydep09UWNojZvtqI6tf1YMFL7McFnCjbHSDXxJTaVGmNtnR5EVosXPfXVwgLfKeqaiP4+Gj6U6z4Qpm7vdeZrOzk5sjWzvsblqYTp629m8R+TaVMn08KFS1k8IBpYV7hu3Ubq0vld8lfCjCgSa/VgFAhBgFBl9L5REsBnxBpACNcbLZqxoAEsG5s6bQaL26SJ4+jPP7fxe4eH17j/TeLfJTzt3d3cKLPoU3b8nvSpO/4fpfUZhOxD/KzSgYWqsi9v+9nGUFv7iBRtUyFKlW1i6bAuKd3CtnHSB1HzUY+1sS50RGc6JUP0M3LUaN52dnaiFs2bUdOmjejkydOUv0B+tvQFKI9Z2yQJIHyf6tWry+4ChTw9Vep4Jc1zX7t+nXq/35327NnHQmFKrNCoAREKFv1ikfPFS5cNP8OiZL23FZwisDYPtTVEgxAIPxXZGVu4ILrQXw/p5PkLF3kbDp8VK5Tj7fLlyykBiKTatfz4OZpcQNxMvW9YLUOUGzZswFEPojY9EA19FIaoE++toorU8PvUmwliu3y5cpQdpPcZJE3MPkSs0gCpH0dUivp20eRlpaMolfY5W6W88WyVcBS1jjdspwavKa1SQ0e7RNob50jmgkjp8JGktAJfqIjwiDS9mPorITmw/5AaiVqpRqZeJtc8rmmeb82adVwor1S5Iqdws+f8wMJhCnzh76lUCemmv/+uDI+Fg0ODV+uTj281mj79W8oMWJgMJ4fU5oGm3nfbtq3JWYnUhg2blMA7c3SXEUhdc0o80vsMQvahST+rnAY1KoQwiKheU6lfcKINxafTjt6GEvmRFngNXotz4FyZAZ7hQUFB7PVk72DPX1pQrFhRat6sCW9jH9xFMc2gcpVKhtem9mNq3foNNRjxhNO1QBUxIU3DYIA5RfPtO/yVCL1i8jg0unhVHfdEpaBpuXxmxNlz59kpFSCNhHNneu/bGEyjQOoFW5vqvj4mr4OosGbN6gaPMF8lrNlFep9ByD4kskoFRv1QTEeNqpVdBOmMRCpeaZK1emrKKQvSlZBKv3CuGwm26daw4B6AYi3IgwgpES6WM/g5/KdatWrB9SFET8uSpyRASEaOGEZ5VAEaXlR6UvsxofY15vPRPJKFgrbeJws1HtRvMuLMmXPUvVtXk8KGAjeaUOzZu48yC4r0HTq8xQ0eIMY7/Hfy/rTetzGbNm+hzp06cqMMvE9TIFJEBDhh/OcUrQr8BzNoBNG3by/+I6Bn69a/6OzZ85TZzyBkH7nrZ3UngK5eyZyfVU5Tq/arPD0BNaoLOjVK5RBB+3WOVEtFRnvjHKiGqkMVtn46JWJbbNLC6qb2UYZ995QgHVcF9vp2MVzTqmcbTStjXKiibRzXsCwBOH5269aF5nw3l7IDpGGYjzV27ESp0wiZQgN+VlYW55WOCZ8QKkRVlVTB/JwupaUw0jpzppgmJB+bcp8Vn/Nva0ezRwhzEhc1rL9pU/Y0KW3fvi1HfcuXrxShEnKMXBMrCJW9vaNFjZhgZjqoYmPeEh2IUgxENzFp25wCIM69KyFrXZKzA73lb3awevVaEoScJtcK7BApFxdXnn1uKWAJDShtbXrC5MMEa1qlUrvQRGt6TEnbD82ImMw5tyAIz5Kro4GYm1NUFbTNqXE9D/RLaTytTS/TuaeK5TVVHetN+0h+VFe1rB1xjibTRHPOLQjCs+TqaCA60WDyJYrtwcFBFBkVwbOScyst5EXJClerBIpIfLaeFqve1hlVxwqwTiTER4kqutoSZ0/2anDiHVWIj1Up4e44Jz4uNp2PgHMLgpB5cn3qgp29PXkVLa5SMHeKjAinOF1c7tWwMlnwf+ZoqS0LQo5hEfOsEGG5u+fnhyUQrupQVmkoj71SJ6z/81KpHCIsJ+sEqpa8VjBIRVkOqtLewC6Kpy4cS2eJTXiizMMVhH+CRU8KhYNCTGw0T3B8HsCPCjO7g5TYFDJRCC+ifr4DKR/iK/X2IFSv20WbLAIGWcC0BUHQIhYrVhAqeFax5/pzSgthnAcvqmuqeG5KrAqoqKqDqlNtjk0azXzDIdKs0QqcWxCEzGOx3xx4U0WEh3GX4+cFHD4hVmfj7XnWuSkgTiiuI7gyN7nDuQVByDwWK1ZoE1+yVDkWrOy2Js4IOHzCOO+8EpXUC5Tx3BxRsk4+NuW+RD5nerPXsfi1Z49uvNwpKiqafl3+u8HPCmDdWYXy5dj2ZOu27XTixCkyh09Hj6IyZUobnm/f7m/wUIedSfPmTdQghx2v61uyZBlfW9A+Gd1PmDLUq2c3NbBVhEssa9dtpGPHjpt1XlgVYTE4XCZOnT7D3vP6ATFYCuE+xfmD1LXgY5+dLhQWK1aYNJpXjRDmyYOJms9vmE1vRfy3zpEGOYSmWMjcTBXPrc0YMCykCvA41jgx7OQQTnNi0jd669q1E507d54bRZQuXYr69ulFEyd9xT9r0KA+5c+XjyZ/MdWwBu/WrQB2DTWFm5sb9e4z4Jn98H+Cw+fX38xk7yo4kbZRN+Jvv60kQftkdD+92bolhUdE0Lhxk9j08eOPP6JLly5TeHh4huesVq0KO0uMn/AFixAWe8ORA9eAePXu3YPmzl3AHmZYJN/x7XbZ2lzEooemrJK7q1hb2zy3h369IiKgjXEpFx3bmOG4wO87+VhjcK70oyonFTWV5//pAK4JMHKrXLkiP2/cqCGtW7+Rt+FucOjgETacM2bI4AH0xeTxfNPogV1wejdgdHQ0ffnVNENjiOMnTpK3dzEStI+p+wkOEitWrOaMJSTkMd27e5/XdhqT1v1048ZN+nnhYr4HIVZwofAu7s0/q17dh+4E3jVYOSP6r127VorXZxUZR88AOHzu0jmx73pGnlUZeV3htThHRm6hxYsXY9dNY+BjBasR4OnpmSIlhCFe6pvL0dHB4NOkx9vbm6xtrGnc2P/SjOlTqV27NoafIXSHWyfADYW/hMeOmpcKCJaNqfvpSViYwe21QoVylD9/PvbTNyat+wm+YbCr1oPyQlDyfQnv+QdGzTTQrAW+/YULF6LsQoamTACHTxjn6edTGQMnncDkaAnbqd1CnawS1eifnUlbY8ych78Sojr4hc+YMZuioqPIIXkZEmb4gw8+6E2nTp2h0NDQZ24k+I2nBh7tAbdu085deziSeq9rZ7ZK3rZth+GYihXL06iRw1m40OTAHOb+MItv8pwCX4hBg4aT8Cz4k2mqa5Op+0kPml+gKQccWVM3EEnrftKDyA0+YqVKlqClS381XDMyKooFsU/vnuyTFqXuOUeH7FtKJ5GVGUBsZka7cRMIPSj5n1MF83uJtvzAtvEwAI7Fa8zxX4eQoCCKaGf+goXcpAG1KfzPB7jp8ECHlpMnT7FRX1RUlMnzoqb108+LOQ1Aurd+wyby9UnpjnnhwiXqP2Ao16pQjBe0j6n7SQ8af3wy+nOuaTVq1NCsc0OMJk0cy9uTv5hi8LNHpIZrIg1ctPgX3gfL6QiVMmYXElmZCepNK2JdyT8uqRVXTKIVXVRRU1TyGsKNcc50Nd7uaSuuRPMnfwaokTiEy9wkQQkLKKbC6kMHD/P2nbv3eKQFNQNQXNUJzGnzhPOhjZZe2LDuUl+TQ4stj4IFuIED6g+oWXXv3oX/apoSwg/6DyXBcjF1P6FIDsdUfSng/IUL3HTEFJgwPXBAP9q0aQv9pUaVU17zNr3W4FU+J1JKOzWijvTSuHyRVSSyyiQQITiHHot3MPQMBNg+qvbhZ5kRKoC/ShCiV5O9zlELcFNDzleuJlkVHz9+gpo0eZ23EVVhysHB5BtPT1oFURThMQqElBEDFWh/dfjIMf4ZahLde3TloW2A/n4owpoTsQmWjan7qWaN6tRC3QsA90a1qlXp2tXrKc6R1v3k51eTbgcGPiNUAMV2RF2oXYEmjV+n02fOZuu0o1yzNRZSgjZSgwb1V3UFe7K1s+UhYH0khRume7cuVK58Wa4BrFixhvbtP5Di9Wg3zw1IP/nMUH+AQLVv15ZHgeBTfvbsOUNfPdCyZQs1jP0GjwjhJoDFsX50UNA2Gd1PaJ/24bDB/AcLkTdGDVeuXJPi9WndT3CEfbleXXoU8nTKjL7RLUD9C/UqiOWTJ2F8P5nTPMRcW2MRK0EQchUNeLALgiCYj4iVIAiaQMRKEARNIGIlCIImyJGpC9I7ThAEc8iMVuSQWElTBEEQTJMZrcgRsYqPF7ESBME0mdGKHIus9ItvBUEQ0gIakeuRFcCs1+fp8CkIgnaANqR2ejBFjq4N1OniJMISBCEF0ARoQ2bJ8akLOl7pn0A2NtZsGWyVyUaigiBoH4z6IeVDjeqfDsA9l3lWeHM6naSEgiD8c2RSqCAImkDEShAETSBiJQiCJhCxEgRBE4hYCYKgCf4P4EyqXjAsEDEAAAAASUVORK5CYII="}}]); \ No newline at end of file diff --git a/assets/js/1bb2dc41.e8fa8674.js b/assets/js/1bb2dc41.e8fa8674.js deleted file mode 100644 index 0f0ccd28..00000000 --- a/assets/js/1bb2dc41.e8fa8674.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2609"],{442(e,i,n){n.r(i),n.d(i,{metadata:()=>s,default:()=>p,frontMatter:()=>d,contentTitle:()=>a,toc:()=>h,assets:()=>c});var s=JSON.parse('{"id":"configuration/clients/discord/discord-headless","title":"Discord (Headless)","description":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","source":"@site/docs/configuration/clients/discord/discord-headless.mdx","sourceDirName":"configuration/clients/discord","slug":"/configuration/clients/discord/discord-headless","permalink":"/multi-scrobbler/configuration/clients/discord/discord-headless","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-headless.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Discord (Headless)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Discord (App)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-app"},"next":{"title":"Koito","permalink":"/multi-scrobbler/configuration/clients/koito"}}'),t=n(4848),r=n(8453),o=n(8194),l=n(698);let d={title:"Discord (Headless)",toc_min_heading_level:2,toc_max_heading_level:5},a,c={},h=[{value:"Required Setup",id:"required-setup",level:2},{value:"User Token",id:"user-token",level:3},{value:"Optional Setup",id:"optional-setup",level:2},{value:"Configure When Presence Is Used",id:"configure-when-presence-is-used",level:3},{value:"Online Status",id:"online-status",level:4},{value:"Other Listening Activities",id:"other-listening-activities",level:4},{value:"Discord Application",id:"discord-application",level:3},{value:"Artwork",id:"artwork",level:3},{value:"Artwork URL Types",id:"artwork-url-types",level:4},{value:"Configuration",id:"configuration",level:2}];function u(e){let i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",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,r.R)(),...e.components},{Config:s,Details:d,DetailsAdmo:a}=i;return s||j("Config",!0),d||j("Details",!0),a||j("DetailsAdmo",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(i.p,{children:["This scrobbler uses ",(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})})," functionality to set your Discord ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/rich-presence/overview",children:"Rich Presence"})," to the music you are currently monitoring with multi-scrobbler."]}),"\n",(0,t.jsx)("img",{src:n(6170).A,height:"127"}),"\n",(0,t.jsxs)(i.p,{children:["This integration is ",(0,t.jsx)(i.strong,{children:"headless"}),", it does not depend on any specific Discord application to be running."]}),"\n",(0,t.jsx)(i.admonition,{type:"tip",children:(0,t.jsxs)(i.p,{children:["Check the ",(0,t.jsx)(i.a,{href:"/configuration/clients/discord",children:"main Discord docs page"})," for a comparison between ",(0,t.jsx)(i.strong,{children:"App"})," and ",(0,t.jsx)(i.strong,{children:"Headless"}),"."]})}),"\n",(0,t.jsxs)(a,{type:"note",summary:"How MS Uses Discord API",children:[(0,t.jsxs)(i.p,{children:["Multi-scrobbler does its utmost to implement, to-spec, ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/events/gateway",children:"Gateway API communication"})," and respect usage. It requires no ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/events/gateway#gateway-intents",children:"permissions"})," and reads no data other than monitoring what other user sessions are active."]}),(0,t.jsx)(i.p,{children:"Aside from the on-paper violation of using a user token programmatically (on your behalf), there is no misuse of the API to achieve rich presence."}),(0,t.jsxs)(i.p,{children:["Additionally, MS uses the state of non-MS sessions to conservatively update presence. ",(0,t.jsx)(i.a,{href:"#configure-when-presence-is-used",children:"By default it will not conflict"})," with any other official presence activities and is only used when you are actually active on a device."]})]}),"\n",(0,t.jsxs)(a,{type:"note",summary:"REQUIRED Interaction after Starting Multi-Scrobbler",children:[(0,t.jsxs)(i.p,{children:["Every time multi-scrobbler is started a discord session update needs to be triggered so that ",(0,t.jsx)(i.a,{href:"#configure-when-presence-is-used",children:"MS can capture the signals it uses to determine if presence can be updated."})," This only needs to be ",(0,t.jsx)(i.em,{children:"once"}),", after starting multi-scrobbler. But it does need to be ",(0,t.jsx)(i.em,{children:"every time"})," multi-scrobbler is (re)started. Without these signals MS will not update presence."]}),(0,t.jsxs)(i.p,{children:["This session update can happen automatically after ",(0,t.jsx)(i.em,{children:"some"})," time so you may not need to do anything. If you want to force the update then do one of the following:"]}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Open discord on a device it was not recently active on"}),"\n",(0,t.jsx)(i.li,{children:"Exit discord on an active device"}),"\n",(0,t.jsx)(i.li,{children:"Change your status (online, idle, etc...)"}),"\n",(0,t.jsx)(i.li,{children:"Set a custom status"}),"\n",(0,t.jsx)(i.li,{children:"Cause a presence update with a different app (listening to..., playing..., etc.)"}),"\n"]})]}),"\n",(0,t.jsx)(i.h2,{id:"required-setup",children:"Required Setup"}),"\n",(0,t.jsx)(i.h3,{id:"user-token",children:"User Token"}),"\n",(0,t.jsxs)(i.p,{children:["You must provide a ",(0,t.jsx)(i.strong,{children:"Discord User Token"})," for your account in order to authenticate with Discord."]}),"\n",(0,t.jsxs)(a,{type:"warning",summary:"User Token usage violates Discord TOS",children:[(0,t.jsxs)(i.p,{children:["This functionality requires you to use your own ",(0,t.jsx)(i.strong,{children:"Discord User Token"})," in a way that is ",(0,t.jsx)(i.strong,{children:"against Discord's policies/terms of service."})," If you use this scrobbler you do so ",(0,t.jsx)(i.strong,{children:"at your risk"}),"."]}),(0,t.jsx)(i.p,{children:"There is no precedent for Discord punishing users who use their own token for non-abuse/spam reasons but there is also no guarantee this lack of enforcement will continue."}),(0,t.jsxs)(i.p,{children:["Refer to the ",(0,t.jsx)(i.strong,{children:"How MS Uses Discord API"})," section above to gauge whether this risk is acceptable to you."]})]}),"\n",(0,t.jsxs)(a,{type:"warning",summary:"User Token is a Sensitive Credential",children:[(0,t.jsx)(i.p,{children:"Treat your User Token like a login credential. Anyone who has your token can access Discord as you."}),(0,t.jsx)(i.p,{children:"When finding instructions for obtaining this token only run commands, or follow steps, that you can understand and trust. Do not run commands you do not understand. Never give your token to someone else."})]}),"\n",(0,t.jsx)(i.p,{children:'No instructions will be provided for obtaining a User Token because it is against Discord\'s policies to use it. Instead, you can search online for "how to obtain discord user token".'}),"\n",(0,t.jsx)(i.h2,{id:"optional-setup",children:"Optional Setup"}),"\n",(0,t.jsx)(i.h3,{id:"configure-when-presence-is-used",children:"Configure When Presence Is Used"}),"\n",(0,t.jsx)(i.p,{children:'MS uses several signals from your "real" Discord sessions to determine if it should update presence. The default configuration is conservative to ensure that MS does not conflict with other apps using presence. Additionally, it only updates if a "real" user device is active on discord.'}),"\n",(0,t.jsxs)(i.admonition,{title:"TLDR",type:"tip",children:[(0,t.jsx)(i.p,{children:"Without any additional configuration, MS will only update presence if:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"you have discord open on a real device"}),"\n",(0,t.jsx)(i.li,{children:"your status is either: online, idle, or dnd (not invisible)"}),"\n",(0,t.jsx)(i.li,{children:"no other apps are broadcasting listening activities (listening to spotify, etc...)"}),"\n"]})]}),"\n",(0,t.jsx)(i.h4,{id:"online-status",children:"Online Status"}),"\n",(0,t.jsxs)(i.p,{children:["Configure if MS is allowed to update presence based on your online status. If this setting is not defined MS will only update if your status is ",(0,t.jsx)(i.strong,{children:"online"}),", ",(0,t.jsx)(i.strong,{children:"idle"}),", or ",(0,t.jsx)(i.strong,{children:"dnd"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Allowed Values: ",(0,t.jsx)(i.code,{children:"online"})," ",(0,t.jsx)(i.code,{children:"idle"})," ",(0,t.jsx)(i.code,{children:"dnd"})," ",(0,t.jsx)(i.code,{children:"invisible"})]}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(i.p,{children:'Only allow presence updating when all of your "real" sessions are either online or idle.'}),(0,t.jsx)(i.p,{children:"In File/AIO:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-json",children:'[\n {\n "name": "MS",\n "enable": true,\n "data": {\n "token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",\n "applicationId": "8190211179716453570",\n "statusOverrideAllow": ["online", "idle"]\n }\n }\n ]\n'})}),(0,t.jsx)(i.p,{children:"In ENV:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"DISCORD_STATUS_OVERRIDE_ALLOW=online,idle\n"})})]}),"\n",(0,t.jsx)(i.h4,{id:"other-listening-activities",children:"Other Listening Activities"}),"\n",(0,t.jsxs)(i.p,{children:["Without any additional configuration, MS will not set Rich Presence if ",(0,t.jsx)(i.strong,{children:"other"})," apps are broadcasting ",(0,t.jsx)(i.strong,{children:"listening"}),' activities EX "Listening to Spotify".']}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"What about other activity types?"}),(0,t.jsxs)(i.p,{children:['Discord uses an undocumented activity type priority to determine what activity is shown "first" for your profile. The Listening activity type has the ',(0,t.jsx)(i.em,{children:"lowest priority"}),"."]}),(0,t.jsx)(i.p,{children:"This means that if you start any other type of activity (streaming, watching, competing, etc...) it will take precedence over MS's listening activity."}),(0,t.jsx)(i.p,{children:"Your listening activity will still be visible by clicking into your full profile."})]}),"\n",(0,t.jsxs)(i.p,{children:["Configure the names of ",(0,t.jsx)(i.strong,{children:"other"})," listening activities that MS ",(0,t.jsx)(i.strong,{children:"is allowed"})," to broadcast at the same time as."]}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(i.p,{children:"You want to allow MS to update presence even if Spotify is also broadcasting a listening activity."}),(0,t.jsx)(i.p,{children:"In File/AIO:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-json",children:'[\n {\n "name": "MS",\n "enable": true,\n "data": {\n "token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",\n "applicationId": "8190211179716453570",\n "listeningActivityAllow": ["spotify"]\n }\n }\n ]\n'})}),(0,t.jsx)(i.p,{children:"In ENV:"}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"DISCORD_LISTENING_ACTIVITY_ALLOW=spotify\n"})})]}),"\n",(0,t.jsx)(i.h3,{id:"discord-application",children:"Discord Application"}),"\n",(0,t.jsxs)(i.p,{children:["Creating a ",(0,t.jsx)(i.a,{href:"https://docs.discord.com/developers/quick-start/overview-of-apps",children:"Discord App"})," enables you to use custom album cover art and secondary status images for more links. Creating an App is free and simple, it is recommended you do this to get the most functionality from Rich Presence."]}),"\n",(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Create An Application"}),(0,t.jsxs)(i.p,{children:["Go to the ",(0,t.jsx)(i.a,{href:"https://discord.com/developers/applications",children:"Discord Developer Portal"})]}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:'Click on "New Application" and give it a name'}),"\n",(0,t.jsxs)(i.li,{children:["Copy the ",(0,t.jsx)(i.strong,{children:"Application Id"})," (Client Id) shown after creation"]}),"\n",(0,t.jsxs)(i.li,{children:["Add this Id to your Multi-Scrobbler config","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Env Config => ",(0,t.jsx)(i.code,{children:"DISCORD_APPLICATION_ID=12345678"})]}),"\n",(0,t.jsxs)(i.li,{children:["File Config => ",(0,t.jsx)(i.code,{children:'"applicationId": "12345678"'})]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,t.jsx)(i.h3,{id:"artwork",children:"Artwork"}),"\n",(0,t.jsx)(i.p,{children:"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible."}),"\n",(0,t.jsx)(i.admonition,{type:"note",children:(0,t.jsxs)(i.p,{children:["If no ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," is configured the status art will ",(0,t.jsx)(i.strong,{children:"always"})," be the ",(0,t.jsx)(i.a,{href:"./?artworkUrl=discord-default#artwork-url-types",children:"Discord Default"}),"."]})}),"\n",(0,t.jsx)(i.p,{children:"The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below."}),"\n",(0,t.jsx)(i.h4,{id:"artwork-url-types",children:"Artwork URL Types"}),"\n",(0,t.jsxs)(o.A,{groupId:"artworkUrl",queryString:!0,children:[(0,t.jsxs)(l.A,{label:"External URLs",value:"external",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," ",(0,t.jsx)(i.strong,{children:"is"})," configured MS can use external URLs for artwork."]}),(0,t.jsx)("img",{src:n(6170).A,height:"127"}),(0,t.jsxs)(i.p,{children:["External URLs that are not from known music services are ",(0,t.jsx)(i.strong,{children:"disabled by default."})," This is to preserve ",(0,t.jsx)(i.em,{children:"your"})," privacy because Discord does not host images, it only links to them and the URL is visible to other users."]}),(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Why Should I Care?"}),(0,t.jsx)(i.p,{children:"There are some scenarios where you may not want your artwork URLs to be visible, for example:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["A Source may be accessible only on your LAN (Jellyfin at ",(0,t.jsx)(i.code,{children:"http://192.168.0.101"}),")"]}),"\n",(0,t.jsx)(i.li,{children:"A Source may be internet-facing but you do not want to expose this information to discord/other users"}),"\n",(0,t.jsx)(i.li,{children:"A Source may be internet-facing but requires authentication to view the image"}),"\n"]})]}),(0,t.jsx)(i.p,{children:"MS will use your artwork URLs only if:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["artwork url is from a known music service/",(0,t.jsx)(i.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," or"]}),"\n",(0,t.jsxs)(i.li,{children:["artwork url starts with ",(0,t.jsx)(i.code,{children:"https"})," and","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"artwork"})," (",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK"}),") is","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"true"})," => always uses the url"]}),"\n",(0,t.jsxs)(i.li,{children:["a list of custom domains keywords an external artwork url should contain EX","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["ENV => ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),"\n",(0,t.jsxs)(i.li,{children:["File Config => ",(0,t.jsx)(i.code,{children:'"artwork": ["mycdn","jellyfin"]'})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,t.jsxs)(d,{children:[(0,t.jsx)("summary",{children:"Examples"}),(0,t.jsxs)(i.p,{children:["None of the below URLs will ",(0,t.jsx)(i.strong,{children:"ever"})," be used because they are not ",(0,t.jsx)(i.code,{children:"https"})]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"http://foobar.com/cool.jpg <-- NOT allowed, not http\nhttp://192.168.0.112/fun.png <-- NOT allowed, not http\n"})}),(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK"})," is not set:"]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service\nhttps://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service\nhttps://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\nhttps://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\n"})}),(0,t.jsxs)(i.p,{children:["Setting ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK=true"})]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- allowed, is https\nhttps://anything.com/neat.jpg <-- allowed, is https\n"})}),(0,t.jsxs)(i.p,{children:["Setting ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- NOT allowed, is https but does not contain "mycdn" or "jellyfin"\nhttps://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains "jellyfin"\n'})})]})]}),(0,t.jsxs)(l.A,{label:"Musicbrainz/Cover Art Achive",value:"caa",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," ",(0,t.jsx)(i.strong,{children:"is"})," configured MS can try to use ",(0,t.jsx)(i.a,{href:"http://coverartarchive.org/",children:"Cover Art Archive"})," to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you."]}),(0,t.jsx)("img",{src:n(6170).A,height:"127"}),(0,t.jsx)(i.p,{children:"MS will try to use Cover Art Archive if:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an ",(0,t.jsx)(i.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," condition"]}),"\n",(0,t.jsxs)(i.li,{children:["and ",(0,t.jsxs)(i.strong,{children:["the scrobble data contains a ",(0,t.jsx)(i.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," Release (Album) MBID"]})]}),"\n"]}),(0,t.jsxs)(i.p,{children:["Basically, if MS would normally use the ",(0,t.jsx)(i.a,{href:"./?artworkUrl=ms-default#artwork-url-types",children:"MS Default"})," art, it will first try to use Cover Art Archive if the scrobble has a Release MBID."]}),(0,t.jsxs)(i.p,{children:["Some Source, like ",(0,t.jsx)(i.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})," and ",(0,t.jsx)(i.a,{href:"/configuration/sources/plex",children:"Plex"}),', can automatically provide this ID if the music is "matched" in your library.']}),(0,t.jsxs)(i.p,{children:["For all others, you can ",(0,t.jsx)(i.a,{href:"/configuration/transforms/musicbrainz#use-metadata-for-discord-album-art",children:(0,t.jsx)(i.strong,{children:"configure MS to use the Musicbrainz Stage"})})," for Discord to try to get this MBID."]})]}),(0,t.jsxs)(l.A,{label:"MS Default",value:"ms-default",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," ",(0,t.jsx)(i.strong,{children:"is"})," configured and these conditions are true:"]}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Cannot use an ",(0,t.jsx)(i.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," and"]}),"\n",(0,t.jsxs)(i.li,{children:["Cannot get album art from ",(0,t.jsx)(i.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," and"]}),"\n",(0,t.jsx)(i.li,{children:"Play does not contain artwork information (no artwork shown in dashboard)"}),"\n"]}),(0,t.jsx)(i.p,{children:"The status artwork will use a default URL instead of your artwork URL."}),(0,t.jsxs)(i.p,{children:["Without any other configuration, the default URL is an icon from the ",(0,t.jsx)(i.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/assets/default-artwork.png",children:"multi-scrobbler repository"}),":"]}),(0,t.jsx)("img",{src:n(8239).A,height:"127"}),(0,t.jsx)(i.p,{children:"This default image can be customized:"}),(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["ENV Config => ",(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png"})]}),"\n",(0,t.jsxs)(i.li,{children:["File Config => ",(0,t.jsx)(i.code,{children:'"artworkDefaultUrl": "https://cooldomain.com/art.png"'})]}),"\n"]}),(0,t.jsx)(i.p,{children:"Remember, this URL need to be accessible on the public internet."})]}),(0,t.jsxs)(l.A,{label:"Discord Default",value:"discord-default",children:[(0,t.jsxs)(i.p,{children:["When ",(0,t.jsx)(i.a,{href:"#discord-application",children:(0,t.jsx)(i.strong,{children:"Application Id"})})," is ",(0,t.jsx)(i.strong,{children:"not"})," configured Discord will show its own image. No custom artwork can be used in this configuration."]}),(0,t.jsx)(i.p,{children:"This is also the image Discord will display if the artwork URL cannot be fetched."}),(0,t.jsx)("img",{src:n(2867).A,height:"127"})]})]}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(s,{config:"DiscordClientConfig",fileContent:'[\n {\n "name": "Discord",\n "enable": true,\n "id": "myDiscordRemote",\n "data": {\n "token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",\n "applicationId": "8190211179716453570"\n }\n }\n]',client:!0,name:"discord",children:(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{style:{textAlign:"left"},children:"Environmental Variable"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Default"}),(0,t.jsx)(i.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.em,{children:(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.code,{children:"DISCORD_ID"})})})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A globally unique ID EX ",(0,t.jsx)(i.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_NAME"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsxs)(i.td,{children:["Value of ",(0,t.jsx)(i.code,{children:"DISCORD_ID"})]}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A vanity name EX ",(0,t.jsx)(i.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.em,{children:(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.code,{children:"DISCORD_TOKEN"})})})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"User Token acquired from an active Discord sessions"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_APPLICATION_ID"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"Application ID used to display album art"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_ARTWORK_DEFAULT_URL"})}),(0,t.jsx)(i.td,{children:"string or boolean"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A URL of an image to use as a fallback if the album art URL cannot be used. Or ",(0,t.jsx)(i.code,{children:"false"})," to use discord's default."]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_STATUS_OVERRIDE_ALLOW"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"online,idle,dnd"})}),(0,t.jsx)(i.td,{style:{textAlign:"left"},children:"A comma-separated list of statuses are allowed to have presence."})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{style:{textAlign:"left"},children:(0,t.jsx)(i.code,{children:"DISCORD_LISTENING_ACTIVITY_ALLOW"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{style:{textAlign:"left"},children:["A commera-seperated list of listening activity names MS ",(0,t.jsx)(i.strong,{children:"is allowed"})," to broadcast presence at the same time as."]})]})]})]})})]})}function p(e={}){let{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}function j(e,i){throw Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},6170(e,i,n){n.d(i,{A:()=>s});let s=n.p+"assets/images/discord_presence_art-3260bd6302b2f0d1f13b45762cc908de.png"},2867(e,i,n){n.d(i,{A:()=>s});let s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAAB/CAYAAAC3zOThAAAALXRFWHRDcmVhdGlvbiBUaW1lAFR1ZSAxNyBGZWIgMjAyNiAwMjoyMzozNiBQTSBFU1Tw59AbAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAHBdJREFUeJztnQd8FNUTx38pkBAghJqQ0AJIL0oREBGQKh3pVRRQVIpIs/0BFRAFAVFEFAHpghRpopTQm/ROCAYIhJ6EEgLkkvzfzLHHXXLpuWQvme/nc97e7tvdd4v3y8y892acq1StERMTAwX/Bx4eeWAwGLcFQRD0gjMEQRDsABErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsAhErQRDsgnQRKwcHRzg5OfK7g4MDBEHIWtCavpiYaERFRfN7SrC5WDk7O8PR0QmCIGRdyEhxcHBiLYiOjoLBYEBycYQNcXbOJkIlCIIFpAmkDck+DzbCaFHZVAsFQbBTSBtII5J1DmwAxabEohIEISFII0grktweNoCC6YIgCImRHK2wSYA9OWopCELWJTlaYSOxkukJgiAkTnK0QiaFCoJgF4hYCYJgF4hYCYJgF2RIJDynmxu2+f0Fb+/CcY61a9sKU76dCFuSHvdIiF9nz8DyZQuQzWyeycD338Hnn3+KlLBg/mzUqlUjzv7mzZvg51nTIQiZAd0N250+fRZbtvgl2GbSN+Pxyisvw5b3SCop7Uv+/PnQuUsHpAUbNvyNCxcCIQiZGd2Jlf/5AKxXP76E8PQsiNQMOCblHrHx9S2BBg3qIS36QnUa//lnCzp3eh3uuXMjtSxZuhy3b9+BIGRmdBezatOmJRo3aoDBQ0awa9OnT0/4liiOo8dOYMKEycp9mg8XFxd8PvZTPH78GM2at4OPj7dyo95G1apVcPLUaUyb+gOCr13HZ5+NZJczu2pfqGBBrFm7HsuXr7K4B223bNEMoWFh3ObChf8wfsIk7st77/XHy3Vfwr1795A9e3b4+W236OvfG1fH6UvNGtUwcOAA5eJ6ISjoKiZNnoYzZ87F+Z5k3RUsVBA9enTBzJ9mWxwj93jYsMGoUL4sbt26jT9W/Iljx47jl59/QPvXuyM8PBwvvlgDo0YORadOPbFo0RxMUd/5338P8fNq3641IiMjcT7ggsVzpe/5QJ1b0rc4unTtg44d2+H19m2QK1cu7s/Yzyfwd6Xn5pbDDdmyZYNvyeJYu2YDyqm+eBYqhODgaxgzdjyioqLife5C5iBvXg+EhobF2UeY76d9efPmxX//2da61/XszV69umH+/CXo138gbt68xaklSBAuXw7iHwxtE19+8T/8rSyV7j3exJHDx5QIvWdxnWHDPsaX475G717drd6HHvaE8ZPQr997qKHEpkKFcvxDbNmiOYYP/xhTp/0ALy9PLFi41OI8a30ZOnQQ9uzdh169++P4iZMYPPjdeL/frFlz0LZtSxQokN9i/5MnT/Dn6nVo2bID5s5diAHv9MWlS0G4ePESGjY0Wnf1X6mr7rMf0THPqmcXL14U3bt1Utf9lYU4OtoyFUfRokUwadI0FjxPJZT0PH5SbQe8OwTOzk7qczdTW+dszhgx8lNMnDgFb7zRA3PnLMBbfd9FwYIF8Eq9ukl67oL9Uq3aCxgx4kN+maPtK1nS17SvQ4f26rfzJho1aghbouvRQP9zAejduxtOnjiNHTt24/79B3HalC5dUj24Ehg75hPTPrJGNAIDL/H79es3kDt3LraQYkPH7t2/z9thysKiH2RISKgx/050NMz0IEGoL3nyuCsLaC6LyMyZv2DD+pUcn7pzJ8TUjt1G9R9///PYvXsf3nyzFyIeRpiOk0vn6OSI776bpNzP4nBzy4G8Hh7YuWsv6r5UG+vWbUSt2jUxfvwki/vXrvUiTp48gw1//cOfd+7coyyn1qbj587583clXlLXOXnyFDZvNsbufl+2Eu+8/SYww9g24LzRKrt79y4ePnzIrjPx4MED5C+QL9HnLmQOQkNDTduaVRV7/7N9YbAluhar6d/PRKlSJdVf9u4YP240Ro8Zh/37D1q0oRmw4eEP0bJV2gSrNR4/esyisXDBbE4c9svseYmeQ32JijKYrJ3IJ5Gm/fFB15039yfs2bNfBbOM++rVewl933oD076bwdbUij8WsXhtUcLSq2dX1KxZnd2wI0eOWVyL3DbanyRUlyLNcgqR25icpQ+2eu6CPjh8+Ij6Qx9oIUC0PWnSFNO2xooVq8QNfHdAP4Qoi2T06HHqQVxki4cIC7vLcRZS+vPKAiArqGePrip+lJ2D1iOGD0FqqV79BXa9mjRtg6bN2nKsyxqx+xIaehetWjXnY12VS0bxqoSC32TpkKXEwfunmlapYgW2eg4dOoKKaluD4kH+/gF4/723sWP77jjXorgRubDaX8AqVSrFe1+y6MqVLYMyZZ6DoxKe9u1aqX17kVRs9dwF/WDNUqJ9sffTZ1sLFZGhYrVYBYZpvpX2qlbteYvjQVeuYPHiOVi3djkHdv227uD9q1atRR8VR5n9i9Fn+fiTMepHXU4Fgpeja9eO2LQ59dMSLgddQf36L5v6RnOZKKgdm9h9+eLLiWwV0TkUj5rw1eRE7zV//mJERDxzA2mkkmJkP//8Peq9XIeD9xo7d+1BiRLFVKxoc5zrHD16XP2VW40fZ0zluVyuKvgfH1euXMVsZdX98P1kbN26gd3jpFiP5tjiuQtCfDhUqVojxui1GH0QD488MBiSGKSJh+zZXWDvDFejcWQ5zJm7gD+PHv2xcg0f4etvpkIQhLTjyZPHSWonYhUPNBrYv18fuLi6ICY6Bo+UdfPzz3NMAWpBENIGEStBEOyCpIqVLGQWBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELESBMEuELHSCTN+mApXV1fT5ydPInHx0iWsWrWGc7UnBCXOm/njd9i4cROW/7ESGU3HDu3x2mtNOcXyoMHDTMkDmzZphC5dOvI27afc7slBe0bz5y/C9h27TPs/+WQkPPLkwchRKSsSK9gHuhWr55+vYnxVrczvekHLZ0VZOak8GAlEWnHz1i0cPnSUt719CqNypYqcwnjkqM8ssoXqHY+8efjdyckJ1V6oir37DvDnSpUrmtpQiupLly4jJbRr15qvSVWAhKyD7sSK0vl+NOpDXQmUOdQ/gkqz04vEdN5vi9IkKd/NG7csLKMOHdqhxWvNuOzRmTNnYS94eHggJCQEOXPmROUqlVhYqJgF5Xy/HBSEYkWLIl/evCkSK7LG3N3d+bms/nMthKyD7sRq6ZJ5sCdYsJSwfjB0VJpnEX306BG/U00/omHD+qhbtw68C3tx4Yg5c+dzUVJrlCtXRv2gm3PJrBs3b2LhwqVcwJXKevXo3pULReTKlZP3Lf39D87JTpD79lKd2lzL8OrVYCxesoyLAZDYtG3bigtpuOXIwQVV6Vjs2oQEuWShYXe5pD0Vv6BKOFWrVGZLi8qD9ejeBfny50u0r7GhJJFUqIISRDZt2ghbt24zlVAzJ1++vGjfrg2qqj8kd5RoUnGMzZu3onjxYhj9v4/V912OTZu2olatmni7/1vYtWsP5s5bgEKFCuKrCV/wH4y0tJiFtEFX1W2mTf0a9ghZW1Q0IrUU8iyITh1f59egge+iXdvWuHv3HgsTCQhVkrl18xb+WLEaPspNpHqD1vD0LIQPhgxkYfpdCVFkpAFDBr/HgkMxn7LKwtm1e4+yTNahRIniGPBOPz6vsBJBijcFBl7E0qXLuX2B/MYCrD17dkOjVxviwP6DHC+iuoPNmzWxen+qnUgieuToMbauypQpzcJB+6iyNEF1EBPra3wsWvw7V8Lu0LF9nGM5crji449G8P1WrV6LK0FX0a1rJ7ZSyZKjuoelS5XitmTpEaVLP/1criy/nzx5GoL+0I1lpcWo7BWysFIbw6Ly9XQdDYphzZu3kONVjRo14B/brJ9/5WNUjPX9997hwq2PH1vGbho2qM9WzJSp05XbFIED/x7E99OnqPjR89h/4F/8b/TniIgwWm35lRVClXTpx+/sbPzfgWJBVN1nzNhx/DmHsqReqlMLW/22KwFYw/uofe06L2LDX39b3Jv2u7m54Z4SWYrrUZCdystXqlSBn4+xeGwMWz9J6as1yOo6ePAw9+mfWFV+6F507d9UEH6HElU/1eciRX3wsrJIqfLPuXPn4etbgtuWUpYcDV6QlUnPkUSLxEyzMgV9oRuxat6ssdX95FpRTIhEgCwY+jGnhRWTHOj+JBp0fy2mpsWuzKHvkBqxor/oU6d9z6JB7kg252wmd4jiQOT+/Dp7psU5np6eXMLeHKob6OjoyD96y7aF+L3ey3VRuXIldns00XB1dUGQEqhfZs9lF4pczuMnTrKFRW4cXa+xErXGZiXCrQX98z9178Lu3uXjZ8/5s1CQhUXiRUJFlbXJ+kpKX82hWrFawdhly1fwH7fOnSyLrNJ9CPM6dkGXr8Cntjdvnzl7jl1Zb+/Cyp0ujOnf/8jWJbmrJX1LcH8FfaIryyo29D83xYI0WLiUaNA7CUZ6QPenfmj3pxftszYIYE3AUoLBYMC69X+hd6/uaN26BU9fIBeKXitX/WnRNjg42LStFX6mku90jR9m/GTR9sb1m6hRvRpPHzhw4CC7ZFTx2rweIgnmPhUQ9/UtwZZb926d8dMsY1XqvXv3s+WjYS1eVbCAsRDtXRWzIo4ra6pihfIsXCeU+BH3VZyJKvgm1teEuHMnBJtUHOq15k056K5ZiloBThIjzUIi4Qt72h/6tyR3um2bVlyF+tSpMwgI+A9VlNtIbvCWLVL7UK/oJmZl7YdOFo01yHrRBMSW8PQEK/fRrD1bsnPnbv6BUZyILC0qFV+0aBGOXdG8KnJ3XmvejH+k5LZRbIuqN5PwHFDBbzqnVasWyKNGzry9vdGlc0cua+/pZbRYNv69CeHh4ShfvpzpnuQOffP1OA5ea1WdKahN96DK0lSEtoJqT9du2qQxx75ik/eppRYaZhQN6gv9ey1bvtIkbmR1kZWoHY+vr4mxdu0G/g7kdmqQIJIr10vF2Mg67Ne3D7t3hw4dNvYrNJTda/ouZLWSm3pOWVMk4sTxp4Iq6A9dl49PSJAo/mFrEhrds3YsrSwrgn7YFASngDEJ0F8b/8GaNet5lI4C4vTj8tu2HU/rqGHdug0cdymvgsQBARfYnXukRKa7Gnl7vX0b9byO4/bt2xzHocD3R6OG83wlaqtB8RsaOaMAP1lVkYZI01SKufPm86gZuY8D3x+APB7ubJ3FJt9Ti0mzcMgapGts27bD1IbiWRTboldCfU0MstZWr7acvkDW0vTvZ+LEyVPKnW2NIkV8sGbteh5M0DivBizI9aT4FXHq1Gn+fOvWbbbYBH2im7qBVG49NuYuWGzIDTMPRtuC2G5obKz1uUHD1yAIQtJJat1AXVtWCY0O2lqoCC2gbo0+fXpCEIT0Q9diRaNrsUWBxCO95mPFN/JHIpreI5KCkNXRtRuoQe4Yj8TduJlskaDz+Hx1rpcaFSLhSe58LvNrkIAmFJsSN1AQkkemKh+fksmi2twoayR3vpbWXhCEjEPXbmBKICuoa7c+8QqV1oaOU7u0Xs8nCIJtyFRipQlVUgVIm+ApgiUI+idTidXEr6ck9xSTYGUknTu9zgttzaHsB2+92Tvecz4f+xlPDk0qNWtW59nogmCvZCqxim9OFmdFUKOK8cWdSLAyMiXI2nUbeGa6tq6NMg40erUBZw0QBMFIphIra2v1aJoD5ciiYDpNQ6BtawH7jX9vRkZBy1loZnmrVsaRxGZNG/PyGloaIgiCkUyVg53EiFxBsrBIqKwl8tPmTlFsy5yMjlvRcprx48Zgy5ZtvKZt9JgvOcNAjx5dUea50krQInD69Fn8uebZspHOnTvwesHcuXKxdUYLjWnJTd+3+sDdPTcvR9m8xQ+HDh3h9l5eXhg54kPOHXXv3n3M+HEWt6lfvx4aNKiHKEMUbt++g1/n/MbLVgRBT2QqsUrqhFFtZrq5QGkZFdJyfV9yoMXIm5VQjRwxFHv27uMFuiRW/ufOY9GipbwGcNiHQzilC+WEIs6fD8DChUuQS4nVR6OGcfbO6OgYFqiTJ0+xO0n7NbGizKBffzOFBYqyDjRu3BDr129kC27SpKmcT6pN65ao9WIN7Nq9F4KgJzLd1IWkYuuFyClh06YtvHB5w4aN/JkE6tLly2jRohne6N2DMyFomTsJchUJyjJw4b9AzppAIhcZ+YQD9t1UQF1LxULQomEtB9W27Tu4IIW2vw5lIu3ZDc8pK8485bAg6IUsKVbWRv/0kKWUMi1Q/ErLzUQB9wED+rGYLFAWVGIZLMmSopQvrVu1wJ49+7hklZbH3RpaZtABA/ojQllVy5b9oQTwKARBj2QJsdJcPJrVHl8mBz2mVPbxLswVbyiVSc6cbiheopjFca3P5AZSahjKz/Tcc6VwWFlc165d58R65PppUF4nSstCNGjwiimbJqVT3rtvP+c/r1CxPARBj2T6IqeJpXnR0OPC5AAlPlTNZtTID9kKuhZ8zXSMAuCehQrxfCvKkU5lqcgdpJxT3bt14VTClJ+JAuYaly4H8bUcHB2UxfUY06fP4P1btvph+LAhyK2C8pQ1UxD0iF0sZE4NCeXE0qCgfFpZVrKQWRCSR6ZayJwaEpuSkJZCJQiC7cj0Mav4Rvi0aQ4iVIJgH2R6y4rEKLYbmB4pkQVBSFsyv1hVrRxnX0bPpxIEIflkejeQUxA/TY2sLWgW108Q7I9Mb1kRNC1BcqYLgn2TJcSKU8D8vZlzsOs1VjXzx+kIunKFt11dXLgk/PwFi9SwbvovKKaZ85Rjy6eID7Jny8bzvVau/JPncb1YswZKlvTF0t+XxzmP5nvR2sbPv5gAQUhrsoRYmWcDpVns1rIxZDS0pm/ChG94mxYwUyHRV19tkOw8WyOGf4BJk6eZPjdu/CqLDJWETwq0ZOfDoYOwe/de/DZ/EfeFBH7QwAH4auJkLpB6zt8fgpDeZPqYFf3YY2dXsHXp99RCs3T/2bQFpUqWRHJxd3e3+JwnjzscHZL+z0zpYoKDr2Gr33Zeq0jl1Skzw4wZs/g4zZynUvWCkN5k/kmhN27G2UfuoN6JMhjYqiE++3QUAgMvoljxYti//1/s2rUbHTu0h4+PtxKTaPy+7A8WuD59enF5+U8+GcmpZZycnVCzRjV2JRs0fAULFixG//5vYvToL/m6+fLlQ9+3eltYYqWUi6ellDHn3v37/E7pkZ8rXQqLlyzjLA1Ojo4oXNgL19QfgWXLVkAQbEWmFyuq82duXdlDWS0SqSZNGuF8wAX+TK4ZZVxYtPh3/tznjZ7w27YDly5d5jzsgwe9i8nffsdu5JdfjDa5k4RBid614OucI4ug51C27HO8OLpxowZx8lZR3Ck0LIy3y5Uro9zKoaZjQz4YEaevdP+JX39rOlcQbIVdiJV5gJymHSRnnpQ2U10rUpqSUUGtyKl2PVtMfSB37dfZM3mbck4dPnwUfn7bTMf3msWcjHmrHnKwmzAYoljgni7yTBBKHVP3pTrw9w9AlSqVsXLVGovjD8IfwD13bt4+e9Yfffu9y9uUxM8ahw5LShkhfdC9WMVeiMxzpZTgJMc6So01ZS1rA12LZsGnJRQHGj7i4yS1pQwMlGUhJamHjx07oUb6OqCGcg/PnvNny8ucCxcCUb58WQ6kx76nIGQkug6wUyA89lIZLUCeXjnTraWXIbcyI4P0p06fQZ06tXibMot2MyuxpeWr0ohU8apcuZ/ltCLr69jxE+jRvSt2bN8Z59o0alit2guoXv0F/kwuaPv2bTjXe2JQQB4OEASboGuxim/YXkuml1H3T+yYrVmigtsUXB/6wSCM+3Is7t17NjpHUw7GjvmUc6wT+/YfQI3q1TBKuXGUZI+gIH1ISAguB12Jc20qTPHd9Bl4rXlTfDt5IiZPmgBnJ2cuVpEY5L5Gq4A/pWAWhLRG1/msEsoNlR6Lkcl6SqgMfXL7rBcoP3toaBi2bt0GQchokprPSteWVUKB7PRYjGxtEbSGPWZt8PYujCGD34ebGrXbuXM3BMGe0I1YWcvmGV8Qm0QsPRYj0z3iEyWaEhGbxDKSZjQ02ZNcPCo+IXUBBXtDN0M88ZXGoqUx5oVLSTzSc1Ey3Yvuy1MfnvaRRNSaWGZ0oVRByMzoJmZli+kA6U1S8r0LgmCJ3cWsaHQtI0fYUguJlAiVINgOXQXY03P+VFpCfU5KuS9BEFKOk6eX91jzHa6urqC5fam6qFPKQmEPHoTzWrUH4eF2k82TrKl+/QdCEISUQZk9koLu1lDwDPV5C/mdpg7Yai1eatDWKorrJwjph24C7IIgZE0yxaTQrIhLXlfk9s0LQRAskaX0OqPMW9VZsB6HPsKdI9dwPzCUX4nh5OKE4u3KI7u7C6IeR+Hy+nN4fCcCSSFfZU8UrFUElOsv7OxtXN95KU6bwvVLwKdJKZz4djf3TRDSGxErnaEJFb17v+qr9viahCt463/xnlesVVncCwjB7UPByOnjjpIdK+HMrH8TvZ9rATd4KSE6O+sgoiOjULpXVXjcfoiwM7ee9Sl/DuSr6oVHdx4iJnURAkFIMeIG6hCyXugVvDXQQrgKVCtstb2TizO7jiRURPjVezA8ikTuknkt2lQZXhe+HSpYnFuodlHcOnCFhYq45hcIz7rFLNqU7FgRl9ecRUxUDBwkBYyQQYhlpVNIpMiSunMkGNk9crBY0bs1cnjlwpMwS9fssbKC3Dxz4f5/z1xIR+UqOrpY/pO7FnRD6OlneeojbobzPo1CtYsoiyoC9y+GQRAyErGsdA6JljFuFb9YOGZzRNSTKE58V+mDOsoSy4GoRwY4ZncytYl6bMDR8TtwYbHlVAtHZ0duW7Cmj4p5lUO0uo5TNuN52XK7wOvl4hz/EoSMRiwrnZCaUUAKqFOAnWafBC4/pQQuAk45siHyfnji5ypxclZtQ0/d5JgXuYskXgS5jGTdRUUYIAgZjYiVDiCRKtu3GlJKxPUHHCgny4riVQS5gCHHrid67qMb4XArnAv3LoTA8NAY5yJX0MHJAe6l8/GrxOvP4lyVh9VF0AZ/3NgTBEFIT0SsdEbsaQoUVNfEggLu1qDgePjV+6qtt3E0sIg7u3APgp6lOyaLqeKgWnz9wBWnTftDTtyAb8cKuLlPBdkN0ez2hZ68ycH0g59tsbhPxcG1EbDgqExdEDIEESsdQAJCo388onf4msUxc6vmSVj886YurjqD0j2q8EgexaEuLDmB2PMMrAXYyRIjoaqsRgpjlFjRlIVbh65CEPSGLLfROWRZFW5oLCNPgiYImY2kLrcRy0rnkKUV29oShKyIiJUgCHaBiJUgCHaBiJUgCHaBTWawx8hqV0EQkkBytMJGYpXKvMiCIGQJkqMVNhGrqCgRK0EQEic5WmEzyyo6OmlJ4AVByJqQRmS4ZUUYDAbVGbGwBEGIC2kDaURysGmKGIMhUiwsQRAsIE0gbUguNp+6QOrp4BANJydH9U4vSTUpCFkNGvUjl49iVCkdgEuXeVbUOYNBXEJBEFKOTAoVBMEuELESBMEuELESBMEuELESBMEuELESBMEu+D/4FKPnngdRgwAAAABJRU5ErkJggg=="},8239(e,i,n){n.d(i,{A:()=>s});let s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAAB/CAYAAAC3zOThAAAALXRFWHRDcmVhdGlvbiBUaW1lAFR1ZSAxNyBGZWIgMjAyNiAwMzo1MzoxMiBQTSBFU1SzzP6eAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAJChJREFUeJztnQd8FNUWxk96hYSSAIHQe0kAQ1NEpAsIAqIUaVKkIwI+8SnwaCqgFEEFQWkiSpMuIIQmvffeQighEEJ6skne/U6yyyYk2Y1JyA6e/++3MjuZndmNs1/OOffe79j6+PolJiaSgv9D7u5upNMlbQuCIFgKtiQIgqABRKwEQdAEIlaCIGgCEStBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0ATPRaysrKzJxsaa/7WysiJBEP5dYE1fYmICxccn8L//hBwXK1tbW7K2tiFBEP69IEixsrJhLUhIiCedTkeZxZpyEFtbOxEqQRBSAE2ANmT6dZRDJEVUOaqFgiBoFGgDNCJTr6EcALUpiagEQcgIaAS0wuzjKQdAMV0QBMEUmdGKHCmwZ0YtBUH495IZrcghsZLpCYIgmCYzWiGTQgVB0AQiVoIgaAIRK0EQNEGuVMJdnJ1pp/9m8vIq8szP3mrbmr75+kvKSZ7HNcxl+IeD6bPPPs7wmDZtWtGsmVN5G7+zbVvXkylq+dWkefO+5d9zIU9PWrliKVWuXJEEQatY3LDduXMXaPt2/wyPmTplEjVoUJ9y8hrmktX3klO0b9+Gzpw+R40ataT7QUG0YeOfdDsgkARBq1hcGnjp8hV+ZEShQh6UlQFHc66RmlKlSlKJEt60c+ceys73klM4OjpSwO3blJDUFJIWLlxKgqBlLE6skPI0adyQhg4bRXXq+FHPnu9RqZIl6MTJ0zR58jRa8fticnBwoP+N+y/FxMRQ8xZvUdGiXjR4UD/y9fWhM2fP0Yzps+nO3XucXiHltFfHe3p40Lr1G2nFijUproHtVi2bU8jjx3zM1avXaNLkpJRr4MC+VP+Vl+nJkydkb29P/v67UrzXLX/+8cx7Qfo1eHB/la4VpgAVyUydNoPOn79o1md3cLCnQYM+oNdUpPbgQTD9MHcBHTlyLN3jmzR5nbp360zde/Tj50OG9OfPi3SveHFvqlHDlzq0b0vvdetDmzaupkGDP+L3OW/uLNp/4DB5FytKcXFxNGHiVxQU9IAEwZh8+dwpJOTxM/uA8X7sy5cvH127dp1yEouevdlNfREXL/6V+vQdzF8mWEtAEG7dCqCx4ybxNpgw/nPasnU7denai44fO6lEaGCK84wYMZq/kN27dUnzOvhlT540lfr0GUh+SmzwZYcAtmrZgkaOHE3TZ8ymwoUL0ZKly1O8Lq33Mnz4ENq3/wB1696XTp0+Q0OHDiBzGTZsEAtjz14f0I/zf6ZRI4eRjU36y5b8/XeTu7s7+fpU5eMaN2pIq9esZ/E6fvwkzZz1HQtValxcXGj1qrXUf8AwCgsLp2ZNG5MgGFOzZg0aNeojfhij31e6dCnDvg4d2qnvTi9q3Ph1ykksejTw0sUr1L17Z6697N79N3+xUlO2bGn1iytJ48Z+atiHqETP9es3+d979+5TnjyuHCGlBj97EhbG249VhOXhUZAePQpJ8t9JgP8OmQXei5tbXvpx3s+cfn3//Y8c0RQokJ8ePnxk8vV169Si/Pnz0XtdOxn2IfpJj/j4eNqhor3mLZqq9+zB17h06TKZQqeLp/MXkqK9R48e8TUFIS1CQkIM2/qoKvX+p/seU05i0WI169vvqUyZ0tSjRxeaNHEMjRk7kQ4ePJLiGMyAjYiIpFatO1B2EhMdQ8HBD2npkvlsHPbj/IUmX4P3Eh+vM9SJ4mLjDPuNcXd3U6IYytuuri4cTSUdRzR4yAg6c+ZciuN9fKule821azfSzBlTVO3Mk7aq6FIQsoNjx46rP/TXUwgQtqdO/cawrWfVqjWSBg7o34ceqWhhzJiJ6hdxgyMegC+6q6srK/3ly1c5CkI0gprPOx3bc/qUVV56qQbdvBlATZu1oWbN23KtKy1Sv5eQkFBq3boF/6xT545cr4Lo6SmjwufFi+ZxnaxatSp8nVOnzvLPDqg6Utcu73BKh3odpitgGxGU3k4jXkVFWPxpl/z8+vUbdO/+fapapRJt3ryVBCG7SCtSwr7U+/E8p4UK5KpYLfvlJ54HpH/UrFk9xc8xmrVs2U+0Yf0KunPnLvnv2M3716i6TM8eXWn+j3P4+ehPx1KVKhVp/boV1KnT27Ttr6xPS7gVcJtee62+4b0tWTyfatf2e+a41O9l/IQvqff7Pfg1bdu2oslfTEtx/FX1P3Wlqhd17NhO1cnG0fYdO8l/Z9LnmjFzDj1QwrZ61TKuw+3e8zcL1dmz59VoZAma8tUEleI+oMDAu+q6vxrOeezoCfp730FDKisILyJWPr5+iUlZS1LqghRFpzOzSJMO9vYOpHVGjhjKEdtPPy/h52PGjFapYTR9NWU6WRKI6L6dNY2+USOgx46dIEHQGrGxMWYdJ2KVDhgN7NunJzk4OlBiQiJFY8h/3k9cjLcUMK2jbZtW9Mcf62nR4mUkCFpExEoQBE1grljJQmZBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0AQiVoIgaAIRK0EQNIGIlSAImsCixArrfpLW/mRtuU/OYsX+VNJ1WhCeLxYhVrBBiYmOosioCPYIT0xIIIvEKslIz97ekVxcXNl/3cZGglNBeB7k+jctLi6WgoLu0Z3AmxQZGUFaAILl6ORMXl7e5OnplaZVsiAI2Uuumu8hooJQ3bh+STNCBZCqRqn3G3DrOt27d5vidTrKKlWrVKYF87/nB7rS6ClWrKhhf1rmfxkB73c98Fmf/s1X1L59W8oqaDiBqFIQnie5KlZI/RBR6bLhy54bwNriYXAQhYU/oayS30hYfH2eeq7XqP5UuDLT2GHSxHH07rtvp9gHgbG3y1oUWP+VejRj+pQUQigIz4NcSwMRnaBGpaWIKi34M0SEk7t71r68+dyTOofcCgggX6MGEVWrVuZ9xb29yd3N3ezz5c2bhwLvPH0O19OBgz6krJJHndfa2qKt+4UXFJtChb3GGe9AJ9+s1rfNKTpDrB4/DlFfIm0318TnyJPXPctiVbdubW5MunHDZqpV6yU6efI0R5ydO79D27fv5DZfT8KeGJqeIsrq0vld6tWzG9Wu40d2dnZs2u/tXYzTPTz3KlKE2rZpTQnxCXTj5i2aN3c2Odg7UHBwMM2a+TVHWefOX+DzfdCvN/Xt04v+2u5Pb77Zkrp2eZc6qcgMDS3Cw8Pp7t17NGTwAGrUqCEf3+j116h5sya0adMWft6gQX3q9l5n6tixPb+HgIDb3HUI9Txc16NgQXqr7Zvc2GPbXzuoikp7e7/fnbqo69StU5s/K3owCv8+UA4yh1z8E5louaN+meDpdIusAYfW8PAIOnL0OJ+venUflQL6cBRz8NBhevIkzBB9OTk50uhPRnEEtuaP9XQ7IJA6d+pIHTq8xc1gZ8yczaOqly5f4W283hgcc/t2IHfXARgwqFKlEjemwOuqVa1Cl69cpV9+Wc7i1q/v+yyO6GiNJhZg8eJfaM5383i7efOm1KN7V+5ysmLlGqpYoTz999OP+TPpgRgfOnyEFi9ZxsKEhrP4nDhPaGioEtbCJAgZIePu2UxcbCzFJ8Sr+pBjpuZiQYjQPxAPtNeCYCB1Q0SD5qXY754sVr6+Piwei9QXfffuvdzWvph3Ua4nrVr1B50+fZb/WoWFhfE2SD1iieYSbdq04tqTp6cnF82PJgvl1GnTKSoqmo8LV9HRoIH9qGTJktxLLigoiPdDzNBxCLxa/2VuLPvd9/P49RERETRwQD+OEHft2svH7Nt3gDZu/NNwfbQWQ39FNK79+ptZ2SL4wouNiFU2AqG6eesqRYSHUclS5VTdyN1swcqbN6/68icVmU6dOsNCgsale/fu432hoU84TQQQFmDcqy3g1m0qWteLzGX/gYN8jZdq1qCCBQtQXFwcHVViBMqVK0sNXq1PnoU8qJASMuCYweifk5MTXb9xwyA4V69e43/RT1EPokZjZs6awz0ehw8fomprd+j331fTmTNnSRDSQyql2UhMbLSKgB6rWtwjFixzowU0MkVBHIIEkC4h/XN2dqYTJ0/xPqRKiEbQnl7fZNLLq4jhHBA2fZdngGtbUfpCiVQQhXsfn6qqiF+Fzp27wClg3jx5VCT1AeVV19m//2CKaCjpxEn/GIswoj5PTw/Dc3QGAogMM7r+l199TSNHfUrhYREq1exlaOQqCGkhd0c2gpZdlCxQCVyPM0+sCuTPz19+CBK4fz+I1q7dQPYO9nTx4mXepxeigqpQffr0GS56o6CNKAtdnsuWLUNbt/5lOCeEr0KFctS48eucuunPY8zxYye5mA5h3LBxc9L5PQqyaBxXaeLFS5e5tmTMo5AkAWrd6g0KVMONeB3Sx3bt2tDgQf3plHpvKOpD+I6n08fQ2dmJp1YcUrU0HI/fEz6/uYVW4d+JRFYWQAGVhgF9ZAVQzF658mnLer2QQdiQss369ns6rdKmdm+9yRNHcfwfSuD0bNq8hdOzLmo0sUCBAmle98DBQyxUEAkIDkC9bNu2HdRMjfR9pFK0GzdupngNal0Y6cMEVXSsBn9u2ca9C9FwtePb7eiKqmchzUuvQ3RkZBT99ttKekXV2D4cNpjT2yVLfpW6lZAhudY3MEEVoe8EBqj6xgXSOiVKllUF6LIU9iSULl8+q4rGT6hMmYrkVdRbiYENCYKQPv/qvoFIY8qUraTqKIXNEouIiHBe8hMcHESCIFgmL2Qa6OTkwq4I5kY1ONbFNS8JgmC5vJgFdivDfwRBeEGQ0UBBEDSBiJUgCJpAxEoQBE0gYkVJbqVYKmMJjB37KV28cJmW/7bimZ+98UYzqlGjOm+XKO5NN5NdCnb676Z9+w+kOBYLiWd9+x3pdPH08ajh9L/xk+mfUrZMaWrTpjW5urrwer7jx0/Q5s1bkye+ps3/xn1GkyZPUcPSsSm2zWXC+DH0+Zjxz+zH4uumTRqTg4M9zw87dPgo7dy5m4QXnxderB49CqbwsFD+kqUHhOrx44eU2xQpUpiKFS1Krmp0Mi2xgkDgAaZ8NYkmKwFIjx/mzudFwpgYmhUKFy5E3bt3pZ9/XkzXb9zk5Th9+vbinz2zFCeHKVGiOHV8uz3NmDlH/X99xIuzMWs+Nib2GbHOCqVKlaSX69WhX5b9RoLl8MKLVUhIME8+xSRUS+fll+uqL91BqlypIlWsWJ4uXLhE/xQ4NWQHEIf1GzaxUAHMSl+wYKHBAeJ5gmU8EEgIFUCktmTpMhr+4ZBsFSsIvL3YNlsckgZaEHVq16IFPy3khcH16tYxW6xgxeLnV5MFxNrKilMufeoFYMQ3dMgAyuvmRjY21kpsFrGfFWjWrDFVqVxJHWNP/jt30WGVVhmDpTBz5y1IsQ/LgvDAer6uXTtR+XJlKSoqihdDr123IcP3ioXTMOrDmsbLl67Q6jVreX+lihWoc5d3KCY6hhc5p+VWgcgq9XuBNQ2AwMBVtVzZMrTs1995H0Rs2a+/8VrL9K77esMGvHQI+7GA/NHDEGrxRlPK4+pKn6pU+q+/dtChQ0dIyH1ErCyEMqouhC8oFhw/VF+YsWNGs19VgpkGhd7FitHYcRN53WBq4NQAryn4T2FxM9bvTZ8xWwlibXZ8wDYYOmSgEsiLnD7qwXvKqNZ0Sb1fmPRhzdaIj4axz1Z6bgseHgV5PeDs2T/wc1jU1KxZg32y4Bc/Z85cFhYsyoYfVlpggXRqIO5wrUiPjK5bv/7LNGHilyzoELvjx0/S49BQqlOnFqe+guUgYmUh1FM1EnhMAdgOw3SvenVf/kKZA7yg0hKqpPM9NBjlQQwRDUGEfHyqsWsnUj2A12PRs7FYQYTQaCItkcDPbt66RS1bNqeC6nVYyIx/0xMrdPBxVRGM/nrOLs4cocFJIjIykoUKYCE0DPxSE6sGQiCuqd0Z4AVm/J7NvS5ARAjraCzkhlAJloumxcrW1o7c3POpGzGpiUF0TLS6CUM01y0Z77eW30s82taqZQvD/jp1/MwWq8xgY21jaPoAG+WTyZ5ZaQFfdDiBwptdD8TF2cmRHipR6t+/Dy1fvoIL/7A/NgXOt2Ll6hT7UMQ3x3Hh2tXr7AlvnJZ5JFvaQOwye10w7euZVLp0KXZmbfNmS34uWCaaXBuIL3f+Ah7k4+unCtHVyLt4aSpWrKRKpSqoaMFP1TbKaqrxKNKPhw8fUu8+AwyP4cM/5kJ7dnwOOIFCEECFCuU5QkF0cvLUaVXvqmk4rn27tpwyGrNx05+cNqEJBMBo4AAlUMVU2lnUqwgF3X/A0ZqLilZKlCxueB2b/yX/0dBvnz5zjhtF6IXy5Xp1qZL6jKhRFSpUiA0EAaZK6N1Qjdm9Zy83ndC3JMPvptt7XWj7jp38HNGSR7IJIF5fJNnXPb3r4vX4bHBcRa3NjWt6Npz24vMIloXmIivc9AULelIFJVJpddHBPjQ5IA1FV6iP6Bsx6MGoGzrPoHj+99/7KSsgBWz3VhuOQpycnbg2BA4cOMSWQAP691VCX0qlX9eeSafwRV7w02KuZyFlhJj9sXY9j77hy49a0H8+/oijm7vJqSaAtTH2j5/wRYrtlavWUO/3e3CxPDo6mgvmqMst+GkR+2dFqrTs+rUbFPzw2akkEMUtW7bRfz/9D5sPIu3crz4D9oHLl68owW3Dc7TweqTSAGl1WteFKEGwxo//nIJVoX7nrj0s4vjMMFL87LNP1OjjZkkPLQTN+VmhEcNLfq9wQdQccP6cnrogflbPFwgjvOMxAoqGF8eOn6ANGzaToE1eWD+rosVKmC1UwosJIjy0F8MD6R6mPQgvPpoTqwIFPEkQ9GDU8MjRYyS8+GhOrBwdM7l8xCjFFQRBu2huNDCzHVB0ujgSBEH7aE6s0JfPXCBsUVGR0jVFEF4ANCdW9+8Fmr0EBU4K0dFRIlaC8AKguZrVo5BgehB0lzwLeWU4Uz0yMoLu3rnNXlVa4PvvZlHA7du8nc/djXbt3psrw/Gf/GcEOTg6qN+bjhdFYy7Vb7+v5DlOmPNlvFBY66CjNZbgoMehMfgdLF6yzLBESU++fPnog37vcydpUP+VelRG/T6wZOf331eRkLNoTqzi1bD1rVvXOLry8ChMtqmmMSCKCgsLVTdaAD0OfWR2FGYu+fIVpPz5C1KevG7k7OxCdrZ2hgmozi6uPJP+3r07lFkwqqX3p8JavFEjP6TTp8/SzZu3KLOUKpU1P6Yff/zZ8EX19PCgTz4ZQR+N+IT+7YSEhND8BYsMz5s3b0pjxk6QyP05ocm1gahD3bx1lUJV/cotrzs5OjlzBAATvfDwJ0qkQthwLzvbkXt5Fec5XhCo9MBSDUR8eOji4pSG/bMsG4uGL1+5SkWLev0jscpOP6agBw+4dX3+/PlJSJoNb4wI1fNDk2KFGyQmOprTwcchD3lBM1LC+IR4Fqz4eF223UR58uTlhqlubknr0QpaxVM5mziKTbSiCwl2FJGYJEguVglU0TqO7K0S6XK8HQVnYeIqIiusj9Pb9WKZDJbLYHkJHA2W/rKcU4/XXnuVGjZ8VUWb8eysgCUrWBCd2o8Ja+Zat3qDbVQQMeE4TKw0ByxadnR0VIKVNLBRuHBhXjpjY2vLreZ/VSkh7F0CbwfS3uRlQf1UqrRr1x52Q6hcuZJKa93J09ODl62wM4P6PPCtWrhoCZsE2tvb0dsd2rE4x8cncNoZGHiH1zFm9L5hJfPOOx34DxUWMmNBNY5jf6+XavLCcAg31kCuXZvks4Vo6LUG9dlW5u69+5QZcC5YRGOx87Bhg3jNJX7HsJU+cvRomp9ByD407bqAFC8mJpofOYGnZxGqVMmH07yC1vH0um0U+dom1cCQXJbR2dO6OBfuUNjKLpKqqp/pY6mT6mf+OicKTjBvuQ3W3C2Y/73hOWZn6y1TevZ4T9VVvuO1bDC6a/fWm1w3Qloydep09UWNojZvtqI6tf1YMFL7McFnCjbHSDXxJTaVGmNtnR5EVosXPfXVwgLfKeqaiP4+Gj6U6z4Qpm7vdeZrOzk5sjWzvsblqYTp629m8R+TaVMn08KFS1k8IBpYV7hu3Ubq0vld8lfCjCgSa/VgFAhBgFBl9L5REsBnxBpACNcbLZqxoAEsG5s6bQaL26SJ4+jPP7fxe4eH17j/TeLfJTzt3d3cKLPoU3b8nvSpO/4fpfUZhOxD/KzSgYWqsi9v+9nGUFv7iBRtUyFKlW1i6bAuKd3CtnHSB1HzUY+1sS50RGc6JUP0M3LUaN52dnaiFs2bUdOmjejkydOUv0B+tvQFKI9Z2yQJIHyf6tWry+4ChTw9Vep4Jc1zX7t+nXq/35327NnHQmFKrNCoAREKFv1ikfPFS5cNP8OiZL23FZwisDYPtTVEgxAIPxXZGVu4ILrQXw/p5PkLF3kbDp8VK5Tj7fLlyykBiKTatfz4OZpcQNxMvW9YLUOUGzZswFEPojY9EA19FIaoE++toorU8PvUmwliu3y5cpQdpPcZJE3MPkSs0gCpH0dUivp20eRlpaMolfY5W6W88WyVcBS1jjdspwavKa1SQ0e7RNob50jmgkjp8JGktAJfqIjwiDS9mPorITmw/5AaiVqpRqZeJtc8rmmeb82adVwor1S5Iqdws+f8wMJhCnzh76lUCemmv/+uDI+Fg0ODV+uTj281mj79W8oMWJgMJ4fU5oGm3nfbtq3JWYnUhg2blMA7c3SXEUhdc0o80vsMQvahST+rnAY1KoQwiKheU6lfcKINxafTjt6GEvmRFngNXotz4FyZAZ7hQUFB7PVk72DPX1pQrFhRat6sCW9jH9xFMc2gcpVKhtem9mNq3foNNRjxhNO1QBUxIU3DYIA5RfPtO/yVCL1i8jg0unhVHfdEpaBpuXxmxNlz59kpFSCNhHNneu/bGEyjQOoFW5vqvj4mr4OosGbN6gaPMF8lrNlFep9ByD4kskoFRv1QTEeNqpVdBOmMRCpeaZK1emrKKQvSlZBKv3CuGwm26daw4B6AYi3IgwgpES6WM/g5/KdatWrB9SFET8uSpyRASEaOGEZ5VAEaXlR6UvsxofY15vPRPJKFgrbeJws1HtRvMuLMmXPUvVtXk8KGAjeaUOzZu48yC4r0HTq8xQ0eIMY7/Hfy/rTetzGbNm+hzp06cqMMvE9TIFJEBDhh/OcUrQr8BzNoBNG3by/+I6Bn69a/6OzZ85TZzyBkH7nrZ3UngK5eyZyfVU5Tq/arPD0BNaoLOjVK5RBB+3WOVEtFRnvjHKiGqkMVtn46JWJbbNLC6qb2UYZ995QgHVcF9vp2MVzTqmcbTStjXKiibRzXsCwBOH5269aF5nw3l7IDpGGYjzV27ESp0wiZQgN+VlYW55WOCZ8QKkRVlVTB/JwupaUw0jpzppgmJB+bcp8Vn/Nva0ezRwhzEhc1rL9pU/Y0KW3fvi1HfcuXrxShEnKMXBMrCJW9vaNFjZhgZjqoYmPeEh2IUgxENzFp25wCIM69KyFrXZKzA73lb3awevVaEoScJtcK7BApFxdXnn1uKWAJDShtbXrC5MMEa1qlUrvQRGt6TEnbD82ImMw5tyAIz5Kro4GYm1NUFbTNqXE9D/RLaTytTS/TuaeK5TVVHetN+0h+VFe1rB1xjibTRHPOLQjCs+TqaCA60WDyJYrtwcFBFBkVwbOScyst5EXJClerBIpIfLaeFqve1hlVxwqwTiTER4kqutoSZ0/2anDiHVWIj1Up4e44Jz4uNp2PgHMLgpB5cn3qgp29PXkVLa5SMHeKjAinOF1c7tWwMlnwf+ZoqS0LQo5hEfOsEGG5u+fnhyUQrupQVmkoj71SJ6z/81KpHCIsJ+sEqpa8VjBIRVkOqtLewC6Kpy4cS2eJTXiizMMVhH+CRU8KhYNCTGw0T3B8HsCPCjO7g5TYFDJRCC+ifr4DKR/iK/X2IFSv20WbLAIGWcC0BUHQIhYrVhAqeFax5/pzSgthnAcvqmuqeG5KrAqoqKqDqlNtjk0azXzDIdKs0QqcWxCEzGOx3xx4U0WEh3GX4+cFHD4hVmfj7XnWuSkgTiiuI7gyN7nDuQVByDwWK1ZoE1+yVDkWrOy2Js4IOHzCOO+8EpXUC5Tx3BxRsk4+NuW+RD5nerPXsfi1Z49uvNwpKiqafl3+u8HPCmDdWYXy5dj2ZOu27XTixCkyh09Hj6IyZUobnm/f7m/wUIedSfPmTdQghx2v61uyZBlfW9A+Gd1PmDLUq2c3NbBVhEssa9dtpGPHjpt1XlgVYTE4XCZOnT7D3vP6ATFYCuE+xfmD1LXgY5+dLhQWK1aYNJpXjRDmyYOJms9vmE1vRfy3zpEGOYSmWMjcTBXPrc0YMCykCvA41jgx7OQQTnNi0jd669q1E507d54bRZQuXYr69ulFEyd9xT9r0KA+5c+XjyZ/MdWwBu/WrQB2DTWFm5sb9e4z4Jn98H+Cw+fX38xk7yo4kbZRN+Jvv60kQftkdD+92bolhUdE0Lhxk9j08eOPP6JLly5TeHh4huesVq0KO0uMn/AFixAWe8ORA9eAePXu3YPmzl3AHmZYJN/x7XbZ2lzEooemrJK7q1hb2zy3h369IiKgjXEpFx3bmOG4wO87+VhjcK70oyonFTWV5//pAK4JMHKrXLkiP2/cqCGtW7+Rt+FucOjgETacM2bI4AH0xeTxfNPogV1wejdgdHQ0ffnVNENjiOMnTpK3dzEStI+p+wkOEitWrOaMJSTkMd27e5/XdhqT1v1048ZN+nnhYr4HIVZwofAu7s0/q17dh+4E3jVYOSP6r127VorXZxUZR88AOHzu0jmx73pGnlUZeV3htThHRm6hxYsXY9dNY+BjBasR4OnpmSIlhCFe6pvL0dHB4NOkx9vbm6xtrGnc2P/SjOlTqV27NoafIXSHWyfADYW/hMeOmpcKCJaNqfvpSViYwe21QoVylD9/PvbTNyat+wm+YbCr1oPyQlDyfQnv+QdGzTTQrAW+/YULF6LsQoamTACHTxjn6edTGQMnncDkaAnbqd1CnawS1eifnUlbY8ych78Sojr4hc+YMZuioqPIIXkZEmb4gw8+6E2nTp2h0NDQZ24k+I2nBh7tAbdu085deziSeq9rZ7ZK3rZth+GYihXL06iRw1m40OTAHOb+MItv8pwCX4hBg4aT8Cz4k2mqa5Op+0kPml+gKQccWVM3EEnrftKDyA0+YqVKlqClS381XDMyKooFsU/vnuyTFqXuOUeH7FtKJ5GVGUBsZka7cRMIPSj5n1MF83uJtvzAtvEwAI7Fa8zxX4eQoCCKaGf+goXcpAG1KfzPB7jp8ECHlpMnT7FRX1RUlMnzoqb108+LOQ1Aurd+wyby9UnpjnnhwiXqP2Ao16pQjBe0j6n7SQ8af3wy+nOuaTVq1NCsc0OMJk0cy9uTv5hi8LNHpIZrIg1ctPgX3gfL6QiVMmYXElmZCepNK2JdyT8uqRVXTKIVXVRRU1TyGsKNcc50Nd7uaSuuRPMnfwaokTiEy9wkQQkLKKbC6kMHD/P2nbv3eKQFNQNQXNUJzGnzhPOhjZZe2LDuUl+TQ4stj4IFuIED6g+oWXXv3oX/apoSwg/6DyXBcjF1P6FIDsdUfSng/IUL3HTEFJgwPXBAP9q0aQv9pUaVU17zNr3W4FU+J1JKOzWijvTSuHyRVSSyyiQQITiHHot3MPQMBNg+qvbhZ5kRKoC/ShCiV5O9zlELcFNDzleuJlkVHz9+gpo0eZ23EVVhysHB5BtPT1oFURThMQqElBEDFWh/dfjIMf4ZahLde3TloW2A/n4owpoTsQmWjan7qWaN6tRC3QsA90a1qlXp2tXrKc6R1v3k51eTbgcGPiNUAMV2RF2oXYEmjV+n02fOZuu0o1yzNRZSgjZSgwb1V3UFe7K1s+UhYH0khRume7cuVK58Wa4BrFixhvbtP5Di9Wg3zw1IP/nMUH+AQLVv15ZHgeBTfvbsOUNfPdCyZQs1jP0GjwjhJoDFsX50UNA2Gd1PaJ/24bDB/AcLkTdGDVeuXJPi9WndT3CEfbleXXoU8nTKjL7RLUD9C/UqiOWTJ2F8P5nTPMRcW2MRK0EQchUNeLALgiCYj4iVIAiaQMRKEARNIGIlCIImyJGpC9I7ThAEc8iMVuSQWElTBEEQTJMZrcgRsYqPF7ESBME0mdGKHIus9ItvBUEQ0gIakeuRFcCs1+fp8CkIgnaANqR2ejBFjq4N1OniJMISBCEF0ARoQ2bJ8akLOl7pn0A2NtZsGWyVyUaigiBoH4z6IeVDjeqfDsA9l3lWeHM6naSEgiD8c2RSqCAImkDEShAETSBiJQiCJhCxEgRBE4hYCYKgCf4P4EyqXjAsEDEAAAAASUVORK5CYII="}}]); \ No newline at end of file diff --git a/assets/js/1fb61236.1db46805.js b/assets/js/1fb61236.1db46805.js deleted file mode 100644 index 8c6a1196..00000000 --- a/assets/js/1fb61236.1db46805.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5093"],{6098(e,n,s){s.r(n),s.d(n,{metadata:()=>i,default:()=>m,frontMatter:()=>a,contentTitle:()=>h,toc:()=>u,assets:()=>x});var i=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/plex.mdx?plain=1","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"}}'),r=s(4848),t=s(8453),l=s(8194),o=s(698);function c(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"PLEX_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"PLEX_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"PLEX_URL"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["http(s)://HOST",":PORT"," of the Plex server to connect to"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_TOKEN"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Only scrobble for specific users from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_BLOCK"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Do not scrobble for users from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_DEVICES_ALLOW"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Do not scrobble if device or application name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_DEVICES_BLOCK"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Only scrobble if device or application name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_LIBRARIES_ALLOW"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Only scrobble if library name contains string from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_LIBRARIES_BLOCK"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Do not scrobble if library name contains strings from this comma-delimited list"})]})]})]})}function d(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}s(2170);let a={title:"Plex",toc_min_heading_level:2,toc_max_heading_level:5},h,x={},u=[{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 j(e){let n={a:"a",code:"code",h4:"h4",h6:"h6",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Config:i,Details:c,DetailsAdmo:a}=n;return i||f("Config",!0),c||f("Details",!0),a||f("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Find your ",(0,r.jsx)(n.a,{href:"https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/",children:(0,r.jsx)(n.strong,{children:"Plex Token"})})," and make note of the ",(0,r.jsx)(n.strong,{children:"URL"})," and ",(0,r.jsx)(n.strong,{children:"Port"})," used to connect to your Plex instance."]}),"\n",(0,r.jsxs)(c,{children:[(0,r.jsx)("summary",{children:"Allowed Users and Defaults"}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Multi-scrobbler will automatically scrobble for these users by default:"})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The User authenticated with the Plex Token"}),"\n",(0,r.jsxs)(n.li,{children:["and the ",(0,r.jsx)(n.strong,{children:"Local User"})]}),"\n"]}),(0,r.jsxs)(n.p,{children:["The Local User (",(0,r.jsx)(n.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,r.jsxs)(n.p,{children:["To allow MS to scrobble for other users use ",(0,r.jsx)(n.code,{children:"usersAllow"})," or ",(0,r.jsx)(n.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,r.jsxs)(c,{children:[(0,r.jsx)("summary",{children:"Examples"}),(0,r.jsx)(n.h6,{id:"defaults",children:"Defaults"}),(0,r.jsxs)(n.p,{children:["If ",(0,r.jsx)(n.code,{children:"usersallow"})," and ",(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW"})," are not defined then the Plex Token authenticated User and Local User will be scrobbled for."]}),(0,r.jsx)(n.h6,{id:"only-a-specific-user",children:"Only A Specific User"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"usersallow": ["SomeUser"]'})," or"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW: SomeUser"})}),"\n"]}),(0,r.jsxs)(n.p,{children:["Only the Plex user ",(0,r.jsx)(n.code,{children:"SomeUser"})," will be scrobbled for. The Plex Token authenticated user and the Local User will not be scrobbled for."]}),(0,r.jsx)(n.h6,{id:"a-specific-user--defaults",children:"A Specific User + Defaults"}),(0,r.jsxs)(n.p,{children:["(Assuming the plex authenticated user is ",(0,r.jsx)(n.code,{children:"FoxxMD"}),")"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"usersallow": ["FoxxMD", "PLEX_LOCAL_USER", "SomeUser"]'})," or"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW: FoxxMD,PLEX_LOCAL_USER,SomeUser"})}),"\n"]}),(0,r.jsx)(n.p,{children:"The Plex user SomeUser, the Plex Token authenticated user (FoxxMD) and the Local User will be scrobbled for."})]})]}),"\n",(0,r.jsxs)(c,{children:[(0,r.jsx)("summary",{children:"Allowed Libraries and Defaults"}),(0,r.jsxs)(n.p,{children:["By default multi-scrobbler will only scrobble media found in Plex libraries that are labelled as ",(0,r.jsx)(n.strong,{children:"Music."})]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"librariesAllow"})," or ",(0,r.jsx)(n.code,{children:"PLEX_LIBRARIES_ALLOW"})," will override this"]}),"\n"]})]}),"\n",(0,r.jsxs)(a,{type:"tip",summary:"Use Plex metadata with Musicbrainz for better scrobbling",children:[(0,r.jsx)("h3",{children:"Matching With Plex"}),(0,r.jsxs)(n.p,{children:["In Plex, if the ",(0,r.jsx)(n.strong,{children:"Plex Music"})," Agent is set on a Music Library then Plex attempts to match your music with Musicbrainz when it is first imported."]}),(0,r.jsx)("img",{src:s(4281).A,height:"400"}),(0,r.jsxs)(n.p,{children:["Plex uses ID3/metdata tags to match or falls back to matching based on file name and folder names. If it cannot find a match it can be fixed through a ",(0,r.jsx)(n.strong,{children:"Fix Match"})," option in the album/track context menu. See ",(0,r.jsx)(n.a,{href:"https://support.plex.tv/articles/correcting-your-music-content-matches/",children:"plex documentation for more information"}),"."]}),(0,r.jsx)(n.p,{children:"You can verify if an Item has been matched by:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Clicking on the Item context menu (...)"}),"\n",(0,r.jsx)(n.li,{children:"Get Info"}),"\n",(0,r.jsx)(n.li,{children:"View XML"}),"\n"]}),(0,r.jsxs)(n.p,{children:["If a node like this is present then it has been matched: ",(0,r.jsx)(n.code,{children:''})]}),(0,r.jsx)("h3",{children:"Using Musicbrainz With Multi-Scrobbler"}),(0,r.jsxs)(n.p,{children:["The MBID from the above ",(0,r.jsx)(n.code,{children:""})," node is a ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Track",children:"Track"}),", a special type of ID that specifically identifies a song on a specific album. If this is present then Multi-scrobbler can use it to gaurantee your scrobble, and all its metadata, is matched 1:1 with what is in your Plex library when using the ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz Stage"})," to enrich your scrobble."]}),(0,r.jsx)(n.p,{children:"To configure MS to use Musicbrainz with your Plex metadata use one of the methods below:"}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["Add to your multi-scrobbler docker compose file ",(0,r.jsx)(n.code,{children:"environment"})," section for ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#env-configuration",children:"Musicbrainz ENV Configuration"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"# a real email that Musicbrainz can use to contact you in case of issues\n- MB_CONTACT=myEmail@myEmailProvider.com\n- MB_PRESETS=id,default\n- PLEX_TRANSFORMS=musicbrainz\n"})})]}),(0,r.jsxs)(o.A,{value:"file",label:"File",children:[(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 // a real email that Musicbrainz can use to contact you in case of issues\n "contact": "myEmail@myEmailProvider.com"\n }\n ]\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In your ",(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="plex.json"',children:'[\n { \n "name": "MyPlex",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n "searchOrder": ["mbidrecording", "basicOrIds", "basic"]\n }\n ]\n }\n }\n }\n]\n'})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"File AIO",children:[(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 // a real email that Musicbrainz can use to contact you in case of issues\n "contact": "myEmail@myEmailProvider.com"\n }\n ]\n }\n }\n ]\n // ...\n "sources": [\n // ...\n { \n "name": "MyPlex",\n "type": "plex",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "searchOrder": ["mbidrecording", "basicOrIds", "basic"]\n }\n ]\n }\n }\n }\n ]\n}\n'})})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i,{config:"PlexApiSourceConfig",fileContent:'[\n {\n "name": "Foxx Plex",\n "id": "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,r.jsx)(d,{})})]})}function m(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(j,{...e})}):j(e)}function f(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4281(e,n,s){s.d(n,{A:()=>i});let i=s.p+"assets/images/plex_music_agent-6fb6f39c8d48f0de5e69571211c90f9e.jpg"}}]); \ No newline at end of file diff --git a/assets/js/1fb61236.67d54122.js b/assets/js/1fb61236.67d54122.js new file mode 100644 index 00000000..e58682d4 --- /dev/null +++ b/assets/js/1fb61236.67d54122.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5093"],{6098(e,n,s){s.r(n),s.d(n,{metadata:()=>i,default:()=>m,frontMatter:()=>a,contentTitle:()=>h,toc:()=>u,assets:()=>x});var i=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/plex.mdx?plain=1","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"}}'),r=s(4848),t=s(8453),l=s(8194),o=s(698);function c(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"PLEX_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"PLEX_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"PLEX_URL"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["http(s)://HOST",":PORT"," of the Plex server to connect to"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_TOKEN"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Only scrobble for specific users from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_BLOCK"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Do not scrobble for users from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_DEVICES_ALLOW"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Do not scrobble if device or application name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_DEVICES_BLOCK"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Only scrobble if device or application name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_LIBRARIES_ALLOW"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Only scrobble if library name contains string from this comma-delimited list"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PLEX_LIBRARIES_BLOCK"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Do not scrobble if library name contains strings from this comma-delimited list"})]})]})]})}function d(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}s(2170);let a={title:"Plex",toc_min_heading_level:2,toc_max_heading_level:5},h,x={},u=[{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 j(e){let n={a:"a",code:"code",h4:"h4",h6:"h6",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Config:i,Details:c,DetailsAdmo:a}=n;return i||f("Config",!0),c||f("Details",!0),a||f("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Find your ",(0,r.jsx)(n.a,{href:"https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/",children:(0,r.jsx)(n.strong,{children:"Plex Token"})})," and make note of the ",(0,r.jsx)(n.strong,{children:"URL"})," and ",(0,r.jsx)(n.strong,{children:"Port"})," used to connect to your Plex instance."]}),"\n",(0,r.jsxs)(c,{children:[(0,r.jsx)("summary",{children:"Allowed Users and Defaults"}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Multi-scrobbler will automatically scrobble for these users by default:"})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The User authenticated with the Plex Token"}),"\n",(0,r.jsxs)(n.li,{children:["and the ",(0,r.jsx)(n.strong,{children:"Local User"})]}),"\n"]}),(0,r.jsxs)(n.p,{children:["The Local User (",(0,r.jsx)(n.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,r.jsxs)(n.p,{children:["To allow MS to scrobble for other users use ",(0,r.jsx)(n.code,{children:"usersAllow"})," or ",(0,r.jsx)(n.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,r.jsxs)(c,{children:[(0,r.jsx)("summary",{children:"Examples"}),(0,r.jsx)(n.h6,{id:"defaults",children:"Defaults"}),(0,r.jsxs)(n.p,{children:["If ",(0,r.jsx)(n.code,{children:"usersallow"})," and ",(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW"})," are not defined then the Plex Token authenticated User and Local User will be scrobbled for."]}),(0,r.jsx)(n.h6,{id:"only-a-specific-user",children:"Only A Specific User"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"usersallow": ["SomeUser"]'})," or"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW: SomeUser"})}),"\n"]}),(0,r.jsxs)(n.p,{children:["Only the Plex user ",(0,r.jsx)(n.code,{children:"SomeUser"})," will be scrobbled for. The Plex Token authenticated user and the Local User will not be scrobbled for."]}),(0,r.jsx)(n.h6,{id:"a-specific-user--defaults",children:"A Specific User + Defaults"}),(0,r.jsxs)(n.p,{children:["(Assuming the plex authenticated user is ",(0,r.jsx)(n.code,{children:"FoxxMD"}),")"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:'"usersallow": ["FoxxMD", "PLEX_LOCAL_USER", "SomeUser"]'})," or"]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"PLEX_USERS_ALLOW: FoxxMD,PLEX_LOCAL_USER,SomeUser"})}),"\n"]}),(0,r.jsx)(n.p,{children:"The Plex user SomeUser, the Plex Token authenticated user (FoxxMD) and the Local User will be scrobbled for."})]})]}),"\n",(0,r.jsxs)(c,{children:[(0,r.jsx)("summary",{children:"Allowed Libraries and Defaults"}),(0,r.jsxs)(n.p,{children:["By default multi-scrobbler will only scrobble media found in Plex libraries that are labelled as ",(0,r.jsx)(n.strong,{children:"Music."})]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"librariesAllow"})," or ",(0,r.jsx)(n.code,{children:"PLEX_LIBRARIES_ALLOW"})," will override this"]}),"\n"]})]}),"\n",(0,r.jsxs)(a,{type:"tip",summary:"Use Plex metadata with Musicbrainz for better scrobbling",children:[(0,r.jsx)("h3",{children:"Matching With Plex"}),(0,r.jsxs)(n.p,{children:["In Plex, if the ",(0,r.jsx)(n.strong,{children:"Plex Music"})," Agent is set on a Music Library then Plex attempts to match your music with Musicbrainz when it is first imported."]}),(0,r.jsx)("img",{src:s(4281).A,height:"400"}),(0,r.jsxs)(n.p,{children:["Plex uses ID3/metdata tags to match or falls back to matching based on file name and folder names. If it cannot find a match it can be fixed through a ",(0,r.jsx)(n.strong,{children:"Fix Match"})," option in the album/track context menu. See ",(0,r.jsx)(n.a,{href:"https://support.plex.tv/articles/correcting-your-music-content-matches/",children:"plex documentation for more information"}),"."]}),(0,r.jsx)(n.p,{children:"You can verify if an Item has been matched by:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Clicking on the Item context menu (...)"}),"\n",(0,r.jsx)(n.li,{children:"Get Info"}),"\n",(0,r.jsx)(n.li,{children:"View XML"}),"\n"]}),(0,r.jsxs)(n.p,{children:["If a node like this is present then it has been matched: ",(0,r.jsx)(n.code,{children:''})]}),(0,r.jsx)("h3",{children:"Using Musicbrainz With Multi-Scrobbler"}),(0,r.jsxs)(n.p,{children:["The MBID from the above ",(0,r.jsx)(n.code,{children:""})," node is a ",(0,r.jsx)(n.a,{href:"https://musicbrainz.org/doc/Track",children:"Track"}),", a special type of ID that specifically identifies a song on a specific album. If this is present then Multi-scrobbler can use it to gaurantee your scrobble, and all its metadata, is matched 1:1 with what is in your Plex library when using the ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz Stage"})," to enrich your scrobble."]}),(0,r.jsx)(n.p,{children:"To configure MS to use Musicbrainz with your Plex metadata use one of the methods below:"}),(0,r.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["Add to your multi-scrobbler docker compose file ",(0,r.jsx)(n.code,{children:"environment"})," section for ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#env-configuration",children:"Musicbrainz ENV Configuration"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"# a real email that Musicbrainz can use to contact you in case of issues\n- MB_CONTACT=myEmail@myEmailProvider.com\n- MB_PRESETS=id,default\n- PLEX_TRANSFORMS=musicbrainz\n"})})]}),(0,r.jsxs)(o.A,{value:"file",label:"File",children:[(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 // a real email that Musicbrainz can use to contact you in case of issues\n "contact": "myEmail@myEmailProvider.com"\n }\n ]\n }\n }\n ]\n}\n'})}),(0,r.jsxs)(n.p,{children:["In your ",(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="plex.json"',children:'[\n { \n "name": "MyPlex",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n "searchOrder": ["mbidrecording", "basicOrIds", "basic"]\n }\n ]\n }\n }\n }\n]\n'})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"File AIO",children:[(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 // a real email that Musicbrainz can use to contact you in case of issues\n "contact": "myEmail@myEmailProvider.com"\n }\n ]\n }\n }\n ]\n // ...\n "sources": [\n // ...\n { \n "name": "MyPlex",\n "type": "plex",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB",\n "searchOrder": ["mbidrecording", "basicOrIds", "basic"]\n }\n ]\n }\n }\n }\n ]\n}\n'})})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i,{config:"PlexApiSourceConfig",fileContent:'[\n {\n "name": "Foxx Plex",\n "id": "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,r.jsx)(d,{})})]})}function m(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(j,{...e})}):j(e)}function f(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4281(e,n,s){s.d(n,{A:()=>i});let i=s.p+"assets/images/plex_music_agent-6fb6f39c8d48f0de5e69571211c90f9e.jpg"}}]); \ No newline at end of file diff --git a/assets/js/202c4968.54d0bed6.js b/assets/js/202c4968.54d0bed6.js deleted file mode 100644 index 34d6df52..00000000 --- a/assets/js/202c4968.54d0bed6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2068"],{3285(e,n,o){o.r(n),o.d(n,{metadata:()=>t,default:()=>j,frontMatter:()=>l,contentTitle:()=>h,toc:()=>u,assets:()=>a});var t=JSON.parse('{"id":"configuration/sources/koito-source","title":"Koito","description":"Koito (Source)","source":"@site/docs/configuration/sources/koito-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/koito-source","permalink":"/multi-scrobbler/configuration/sources/koito-source","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/koito-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Koito","description":"Koito (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Kodi","permalink":"/multi-scrobbler/configuration/sources/kodi"},"next":{"title":"Lastfm (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/lastfm-endpoint"}}'),i=o(4848),r=o(8453);o(8194),o(698),o(2170);var s=o(7419);function c(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environmental Variable"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_ID"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["A globally unique ID EX ",(0,i.jsx)(n.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_NAME"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsxs)(n.td,{children:["Value of ",(0,i.jsx)(n.code,{children:"SOURCE_KOITO_ID"})]}),(0,i.jsxs)(n.td,{children:["A vanity name EX ",(0,i.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_ENABLE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_URL"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"URL for the Koito server"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_TOKEN"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"User token for the user to scrobble for"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_USER"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Username of the user to scrobble for"})]})]})]})}function d(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}let l={title:"Koito",description:"Koito (Source)",toc_min_heading_level:2,toc_max_heading_level:5},h,a={},u=[{value:"Configuration",id:"configuration",level:4}];function x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Config:o}=n;return o||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,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["This Source monitors a Koito account's scrobble history and then re-scrobbles discovered tracks to configured ",(0,i.jsx)(n.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,i.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(n.p,{children:["To ",(0,i.jsx)(n.em,{children:"scrobble to"})," a Koito server, create a ",(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito (Client)"})]})}),"\n",(0,i.jsxs)(n.p,{children:["See the ",(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito (Client)"})," configuration for general setup. The only difference for ",(0,i.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,i.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(o,{config:"KoitoSourceConfig",fileContent:s.A,configureAs:!0,ambiguous:!0,name:"koito",children:(0,i.jsx)(d,{})})]})}function j(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}},7419(e,n,o){o.d(n,{A:()=>t});let t='[\n {\n "name": "Koito Client A",\n "id": "myKoitoClient",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n },\n {\n "name": "Koito Source B",\n "id": "myKoitoSource",\n "configureAs": "source",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/202c4968.c6902699.js b/assets/js/202c4968.c6902699.js new file mode 100644 index 00000000..2ad9429c --- /dev/null +++ b/assets/js/202c4968.c6902699.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2068"],{3285(e,n,o){o.r(n),o.d(n,{metadata:()=>t,default:()=>j,frontMatter:()=>l,contentTitle:()=>h,toc:()=>u,assets:()=>a});var t=JSON.parse('{"id":"configuration/sources/koito-source","title":"Koito","description":"Koito (Source)","source":"@site/docs/configuration/sources/koito-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/koito-source","permalink":"/multi-scrobbler/configuration/sources/koito-source","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/koito-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Koito","description":"Koito (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Kodi","permalink":"/multi-scrobbler/configuration/sources/kodi"},"next":{"title":"Lastfm (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/lastfm-endpoint"}}'),i=o(4848),r=o(8453);o(8194),o(698),o(2170);var s=o(7419);function c(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environmental Variable"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_ID"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["A globally unique ID EX ",(0,i.jsx)(n.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_NAME"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsxs)(n.td,{children:["Value of ",(0,i.jsx)(n.code,{children:"SOURCE_KOITO_ID"})]}),(0,i.jsxs)(n.td,{children:["A vanity name EX ",(0,i.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_ENABLE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_URL"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"URL for the Koito server"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_TOKEN"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"User token for the user to scrobble for"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_KOITO_USER"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Username of the user to scrobble for"})]})]})]})}function d(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}let l={title:"Koito",description:"Koito (Source)",toc_min_heading_level:2,toc_max_heading_level:5},h,a={},u=[{value:"Configuration",id:"configuration",level:4}];function x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Config:o}=n;return o||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,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["This Source monitors a Koito account's scrobble history and then re-scrobbles discovered tracks to configured ",(0,i.jsx)(n.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,i.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(n.p,{children:["To ",(0,i.jsx)(n.em,{children:"scrobble to"})," a Koito server, create a ",(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito (Client)"})]})}),"\n",(0,i.jsxs)(n.p,{children:["See the ",(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito (Client)"})," configuration for general setup. The only difference for ",(0,i.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,i.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(o,{config:"KoitoSourceConfig",fileContent:s.A,configureAs:!0,ambiguous:!0,name:"koito",children:(0,i.jsx)(d,{})})]})}function j(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}},7419(e,n,o){o.d(n,{A:()=>t});let t='[\n {\n "name": "Koito Client A",\n "id": "myKoitoClient",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n },\n {\n "name": "Koito Source B",\n "id": "myKoitoSource",\n "configureAs": "source",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/24a5b6e6.a9742041.js b/assets/js/24a5b6e6.a9742041.js deleted file mode 100644 index 44ea0106..00000000 --- a/assets/js/24a5b6e6.a9742041.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1499"],{7360(e,n,t){t.d(n,{Ay:()=>h,RM:()=>a});var s=t(4848),i=t(8453),o=t(2170),r=t.n(o);function c(e){let n={a:"a",code:"code",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This ",(0,s.jsx)(n.strong,{children:"Source"})," supports toggling ",(0,s.jsx)(n.a,{href:"/configuration/sources#monitoring",children:"monitoring on or off manually."})," This action can be taken on the Web Dashboard by clicking the link next to ",(0,s.jsx)(n.strong,{children:"Monitoring"})," found in each Source's status card."]}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, the ",(0,s.jsx)(n.strong,{children:"default monitoring behavior"})," can be explicitly set by adding the following value to a Source's ",(0,s.jsx)(n.code,{children:"options"})," in ",(0,s.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ - "data": { - // ... - }, - "options": { - // highlight-start - // set to true to always monitor (unless manually invoked) - // set to false to never monitor (unless manually invoked) - "autoMonitor": true - // highlight-end - } -}}`}),"\n",!0===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"always"})," monitor."]}):void 0,"\n",!1===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"never"})," monitor."]}):void 0]})}function l(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}let a=[];function d(e){let{DetailsAdmo:n}={...(0,i.R)(),...e.components};return n||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("DetailsAdmo",!0),(0,s.jsx)(n,{type:"note",summary:"Auto Monitoring Behavior",children:(0,s.jsx)(l,{...e})})}function h(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},9003(e,n,t){t.r(n),t.d(n,{metadata:()=>s,default:()=>p,frontMatter:()=>h,contentTitle:()=>u,toc:()=>j,assets:()=>x});var s=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/azuracast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Azuracast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Apple Music","permalink":"/multi-scrobbler/configuration/sources/applemusic"},"next":{"title":"Deezer","permalink":"/multi-scrobbler/configuration/sources/deezer"}}'),i=t(4848),o=t(8453),r=t(8194),c=t(698);function l(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environmental Variable"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"AZURA_ID"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["A globally unique ID EX ",(0,i.jsx)(n.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_NAME"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsxs)(n.td,{children:["Value of ",(0,i.jsx)(n.code,{children:"AZURA_ID"})]}),(0,i.jsxs)(n.td,{children:["A vanity name EX ",(0,i.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_ENABLE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"AZURA_STATION"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"The specific station to monitor"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"AZURA_URL"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Base URL of the Azuracast instance"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_KEY"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"API Key used to access data about private streams"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_LISTENERS_NUM"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_LIVE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{})]})]})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}t(2170);var d=t(7360);let h={title:"Azuracast",toc_min_heading_level:2,toc_max_heading_level:5},u,x={},j=[{value:"URL",id:"url",level:3},...d.RM,{value:"Station",id:"station",level:3},{value:"Station Identifier",id:"station-identifier",level:4},{value:"Station Access",id:"station-access",level:4},{value:"Configuration",id:"configuration",level:2}];function m(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Config:t,Details:s}=n;return t||g("Config",!0),s||g("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,i.jsxs)(n.p,{children:['Azuracast may not correctly report track length or position. If this is the case you should reduce the "listened to" ',(0,i.jsx)(n.strong,{children:"duration"})," using ",(0,i.jsx)(n.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds"})," so that multi-scrobbler scrobbles correctly."]})}),"\n",(0,i.jsxs)(n.p,{children:["The Azuracast server should have ",(0,i.jsxs)(n.strong,{children:["Use ",(0,i.jsx)(n.a,{href:"https://www.azuracast.com/docs/developers/now-playing-data/#high-performance-updates",children:"High-Performance Now Playing Updates"})]})," enabled in ",(0,i.jsx)(n.em,{children:"Administration -> System Settings"})]}),"\n",(0,i.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,i.jsx)(n.p,{children:"The URL used by MS to connect to Azuracast has the syntax:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[ws|wss]://HOST:[PORT]\n"})}),"\n",(0,i.jsxs)(n.p,{children:["MS will automatically add the path required for websockets, ",(0,i.jsx)(n.a,{href:"https://www.azuracast.com/docs/developers/now-playing-data/#websockets",children:(0,i.jsx)(n.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,i.jsx)(n.pre,{children:(0,i.jsx)(n.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,i.jsx)(d.Ay,{filename:"azuracast"}),"\n",(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"autoMonitor"})," is not explicitly set, Multi-scrobbler will set the ",(0,i.jsx)(n.strong,{children:"default monitoring behavior"})," based on if either of these settings is configured:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["live status (",(0,i.jsx)(n.code,{children:"AZURA_LIVE"})," or ",(0,i.jsx)(n.code,{children:"monitorWhenLive"}),") or"]}),"\n",(0,i.jsxs)(n.li,{children:["listener count (",(0,i.jsx)(n.code,{children:"AZURA_LISTENERS_NUM"})," or ",(0,i.jsx)(n.code,{children:"monitorWhenListeners"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If either is configured then MS will automatically monitor based on when these conditions are met."}),"\n",(0,i.jsxs)(n.p,{children:["If neither is configured automatic monitoring defaults to ",(0,i.jsx)(n.strong,{children:"off"})," and you should either manually initiate it or explicitly set the default behavior."]}),"\n",(0,i.jsx)(n.h3,{id:"station",children:"Station"}),"\n",(0,i.jsx)(n.h4,{id:"station-identifier",children:"Station Identifier"}),"\n",(0,i.jsxs)(n.p,{children:["The station identifier multi-scrobbler uses (ENV ",(0,i.jsx)(n.code,{children:"AZURA_STATION"})," or ",(0,i.jsx)(n.code,{children:"station"})," in File/AIO config) needs to be the ",(0,i.jsx)(n.strong,{children:"URL Stub"})," or ",(0,i.jsx)(n.strong,{children:"shortcode"})," of the Azuracast station, ",(0,i.jsx)(n.strong,{children:"not"})," its display name. Use of the methods below to find an apprioriate station identifier."]}),"\n",(0,i.jsxs)(r.A,{groupId:"stationId",queryString:!0,children:[(0,i.jsxs)(c.A,{value:"stub",label:"URL Stub",children:[(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"URL Stub"})," is the value used in the URL to access the station EX"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"https://azura.mydomain.com/public/my-cool-station\n ^^^^ url stub ^^\n"})}),(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"my-cool-station"})," as the station identifier."]})]}),(0,i.jsxs)(c.A,{value:"shortcode",label:"Shortcode",children:[(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"shortcode"})," can be found in the raw JSON response for your station. Navigate to this URL in your browser:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"https://azura.mydomain.com/api/stations\n"})}),(0,i.jsxs)(n.p,{children:["Find your station in the returned data (by ",(0,i.jsx)(n.code,{children:"name"}),") and then locate the value of the ",(0,i.jsx)(n.code,{children:"shortcode"})," property in that object."]}),(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'[\n {\n "id": 1,\n "name": "My Cool Station",\n "shortcode": "my-cool-station",\n "description": "Re-broadcasts of my cool music",\n "frontend": "icecast",\n "backend": "liquidsoap",\n ...\n'})}),(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"my-cool-station"})," as the station identifier."]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"station-access",children:"Station Access"}),"\n",(0,i.jsxs)(n.p,{children:["Multi-Scrobbler does not use authentication to communicate with Azuracast. Your station will likely need some form of ",(0,i.jsx)(n.strong,{children:"Public Pages"})," in order for you to monitor it."]}),"\n",(0,i.jsxs)(n.p,{children:["In your station's ",(0,i.jsx)(n.strong,{children:"Edit Station Settings"})," -> ",(0,i.jsx)(n.strong,{children:"Public Pages"})," make sure that at least one of these is enabled:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Enable Public Pages"}),"\n",(0,i.jsx)(n.li,{children:"Enable Public APIs"}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["For users who aren't administrators of Azuracast: if you can access the station using ",(0,i.jsx)(n.code,{children:"https://azura.mydomain.com/public/xxxxxx"})," then it is public."]})}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(t,{config:"AzuracastSourceConfig",fileContent:'[\n {\n "type": "azuracast",\n "enable": true,\n "name": "Cool Station",\n "id": "myAzura",\n "data": {\n "url": "ws://192.168.0.101",\n "station": "my-station-name",\n "monitorWhenLive": true,\n "monitorWhenListeners": 1\n }\n }\n]\n',name:"azuracast",children:(0,i.jsx)(a,{})})]})}function p(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}function g(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/24a5b6e6.efe1a012.js b/assets/js/24a5b6e6.efe1a012.js new file mode 100644 index 00000000..b838513d --- /dev/null +++ b/assets/js/24a5b6e6.efe1a012.js @@ -0,0 +1,12 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1499"],{7360(e,n,t){t.d(n,{Ay:()=>h,RM:()=>a});var s=t(4848),i=t(8453),o=t(2170),r=t.n(o);function c(e){let n={a:"a",code:"code",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This ",(0,s.jsx)(n.strong,{children:"Source"})," supports toggling ",(0,s.jsx)(n.a,{href:"/configuration/sources#monitoring",children:"monitoring on or off manually."})," This action can be taken on the Web Dashboard by clicking the link next to ",(0,s.jsx)(n.strong,{children:"Monitoring"})," found in each Source's status card."]}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, the ",(0,s.jsx)(n.strong,{children:"default monitoring behavior"})," can be explicitly set by adding the following value to a Source's ",(0,s.jsx)(n.code,{children:"options"})," in ",(0,s.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ + "data": { + // ... + }, + "options": { + // highlight-start + // set to true to always monitor (unless manually invoked) + // set to false to never monitor (unless manually invoked) + "autoMonitor": true + // highlight-end + } +}}`}),"\n",!0===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"always"})," monitor."]}):void 0,"\n",!1===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"never"})," monitor."]}):void 0]})}function l(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}let a=[];function d(e){let{DetailsAdmo:n}={...(0,i.R)(),...e.components};return n||function(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("DetailsAdmo",!0),(0,s.jsx)(n,{type:"note",summary:"Auto Monitoring Behavior",children:(0,s.jsx)(l,{...e})})}function h(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},9003(e,n,t){t.r(n),t.d(n,{metadata:()=>s,default:()=>p,frontMatter:()=>h,contentTitle:()=>u,toc:()=>j,assets:()=>x});var s=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/azuracast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Azuracast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Apple Music","permalink":"/multi-scrobbler/configuration/sources/applemusic"},"next":{"title":"Deezer","permalink":"/multi-scrobbler/configuration/sources/deezer"}}'),i=t(4848),o=t(8453),r=t(8194),c=t(698);function l(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environmental Variable"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"AZURA_ID"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["A globally unique ID EX ",(0,i.jsx)(n.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_NAME"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsxs)(n.td,{children:["Value of ",(0,i.jsx)(n.code,{children:"AZURA_ID"})]}),(0,i.jsxs)(n.td,{children:["A vanity name EX ",(0,i.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_ENABLE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"AZURA_STATION"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"The specific station to monitor"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"AZURA_URL"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Base URL of the Azuracast instance"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_KEY"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"API Key used to access data about private streams"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_LISTENERS_NUM"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"AZURA_LIVE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{})]})]})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}t(2170);var d=t(7360);let h={title:"Azuracast",toc_min_heading_level:2,toc_max_heading_level:5},u,x={},j=[{value:"URL",id:"url",level:3},...d.RM,{value:"Station",id:"station",level:3},{value:"Station Identifier",id:"station-identifier",level:4},{value:"Station Access",id:"station-access",level:4},{value:"Configuration",id:"configuration",level:2}];function m(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Config:t,Details:s}=n;return t||g("Config",!0),s||g("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,i.jsxs)(n.p,{children:['Azuracast may not correctly report track length or position. If this is the case you should reduce the "listened to" ',(0,i.jsx)(n.strong,{children:"duration"})," using ",(0,i.jsx)(n.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds"})," so that multi-scrobbler scrobbles correctly."]})}),"\n",(0,i.jsxs)(n.p,{children:["The Azuracast server should have ",(0,i.jsxs)(n.strong,{children:["Use ",(0,i.jsx)(n.a,{href:"https://www.azuracast.com/docs/developers/now-playing-data/#high-performance-updates",children:"High-Performance Now Playing Updates"})]})," enabled in ",(0,i.jsx)(n.em,{children:"Administration -> System Settings"})]}),"\n",(0,i.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,i.jsx)(n.p,{children:"The URL used by MS to connect to Azuracast has the syntax:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[ws|wss]://HOST:[PORT]\n"})}),"\n",(0,i.jsxs)(n.p,{children:["MS will automatically add the path required for websockets, ",(0,i.jsx)(n.a,{href:"https://www.azuracast.com/docs/developers/now-playing-data/#websockets",children:(0,i.jsx)(n.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,i.jsx)(n.pre,{children:(0,i.jsx)(n.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,i.jsx)(d.Ay,{filename:"azuracast"}),"\n",(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"autoMonitor"})," is not explicitly set, Multi-scrobbler will set the ",(0,i.jsx)(n.strong,{children:"default monitoring behavior"})," based on if either of these settings is configured:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["live status (",(0,i.jsx)(n.code,{children:"AZURA_LIVE"})," or ",(0,i.jsx)(n.code,{children:"monitorWhenLive"}),") or"]}),"\n",(0,i.jsxs)(n.li,{children:["listener count (",(0,i.jsx)(n.code,{children:"AZURA_LISTENERS_NUM"})," or ",(0,i.jsx)(n.code,{children:"monitorWhenListeners"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If either is configured then MS will automatically monitor based on when these conditions are met."}),"\n",(0,i.jsxs)(n.p,{children:["If neither is configured automatic monitoring defaults to ",(0,i.jsx)(n.strong,{children:"off"})," and you should either manually initiate it or explicitly set the default behavior."]}),"\n",(0,i.jsx)(n.h3,{id:"station",children:"Station"}),"\n",(0,i.jsx)(n.h4,{id:"station-identifier",children:"Station Identifier"}),"\n",(0,i.jsxs)(n.p,{children:["The station identifier multi-scrobbler uses (ENV ",(0,i.jsx)(n.code,{children:"AZURA_STATION"})," or ",(0,i.jsx)(n.code,{children:"station"})," in File/AIO config) needs to be the ",(0,i.jsx)(n.strong,{children:"URL Stub"})," or ",(0,i.jsx)(n.strong,{children:"shortcode"})," of the Azuracast station, ",(0,i.jsx)(n.strong,{children:"not"})," its display name. Use of the methods below to find an apprioriate station identifier."]}),"\n",(0,i.jsxs)(r.A,{groupId:"stationId",queryString:!0,children:[(0,i.jsxs)(c.A,{value:"stub",label:"URL Stub",children:[(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"URL Stub"})," is the value used in the URL to access the station EX"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"https://azura.mydomain.com/public/my-cool-station\n ^^^^ url stub ^^\n"})}),(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"my-cool-station"})," as the station identifier."]})]}),(0,i.jsxs)(c.A,{value:"shortcode",label:"Shortcode",children:[(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"shortcode"})," can be found in the raw JSON response for your station. Navigate to this URL in your browser:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"https://azura.mydomain.com/api/stations\n"})}),(0,i.jsxs)(n.p,{children:["Find your station in the returned data (by ",(0,i.jsx)(n.code,{children:"name"}),") and then locate the value of the ",(0,i.jsx)(n.code,{children:"shortcode"})," property in that object."]}),(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'[\n {\n "id": 1,\n "name": "My Cool Station",\n "shortcode": "my-cool-station",\n "description": "Re-broadcasts of my cool music",\n "frontend": "icecast",\n "backend": "liquidsoap",\n ...\n'})}),(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"my-cool-station"})," as the station identifier."]})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"station-access",children:"Station Access"}),"\n",(0,i.jsxs)(n.p,{children:["Multi-Scrobbler does not use authentication to communicate with Azuracast. Your station will likely need some form of ",(0,i.jsx)(n.strong,{children:"Public Pages"})," in order for you to monitor it."]}),"\n",(0,i.jsxs)(n.p,{children:["In your station's ",(0,i.jsx)(n.strong,{children:"Edit Station Settings"})," -> ",(0,i.jsx)(n.strong,{children:"Public Pages"})," make sure that at least one of these is enabled:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Enable Public Pages"}),"\n",(0,i.jsx)(n.li,{children:"Enable Public APIs"}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["For users who aren't administrators of Azuracast: if you can access the station using ",(0,i.jsx)(n.code,{children:"https://azura.mydomain.com/public/xxxxxx"})," then it is public."]})}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(t,{config:"AzuracastSourceConfig",fileContent:'[\n {\n "type": "azuracast",\n "enable": true,\n "name": "Cool Station",\n "id": "myAzura",\n "data": {\n "url": "ws://192.168.0.101",\n "station": "my-station-name",\n "monitorWhenLive": true,\n "monitorWhenListeners": 1\n }\n }\n]\n',name:"azuracast",children:(0,i.jsx)(a,{})})]})}function p(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(m,{...e})}):m(e)}function g(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/294f31e2.20b72f2a.js b/assets/js/294f31e2.20b72f2a.js new file mode 100644 index 00000000..927f6be8 --- /dev/null +++ b/assets/js/294f31e2.20b72f2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1920"],{5870(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>p,frontMatter:()=>l,contentTitle:()=>a,toc:()=>h,assets:()=>d});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/subsonic.mdx?plain=1","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(4848),i=s(8453);function o(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SUBSONIC_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_USER"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Username to login to the server with"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_PASSWORD"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Password for the user to login to the server with"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"URL of the subsonic media server to query"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let l={title:"Subsonic",toc_min_heading_level:2,toc_max_heading_level:5},a,d={},h=[{value:"Enhanced Playback Reporting",id:"enhanced-playback-reporting",level:2},{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:s,DetailsAdmo:r}=n;return s||x("Config",!0),r||x("DetailsAdmo",!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)(r,{type:"warning",summary:"Known Issues",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)(r,{type:"tip",summary:"Recommended Alternative Sources",children:[(0,t.jsxs)(n.p,{children:["If your service 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:"enhanced-playback-reporting",children:"Enhanced Playback Reporting"}),"\n",(0,t.jsxs)(n.p,{children:["Multi-Scrobbler supports the new ",(0,t.jsx)(n.a,{href:"https://opensubsonic.netlify.app",children:"Open Subsonic"})," extension, ",(0,t.jsx)(n.a,{href:"https://opensubsonic.netlify.app/docs/extensions/playbackreport/",children:"Playback Report"}),", that enables millisecond-accurate player position and state reporting."]}),"\n",(0,t.jsxs)(n.p,{children:["To use this new data, your Subsonic server must support the extension ",(0,t.jsx)(n.strong,{children:"and"})," the active playback Client must report it. The UI for your Subsonic Source and active Player will indicate support using contextual icons."]}),"\n",(0,t.jsx)(n.p,{children:"Usage of Enhanced Playback Reporting is optional: MS will fallback to classic, less accurate Subsonic Now Playing when it is not available."}),"\n",(0,t.jsxs)(r,{type:"info",summary:"Stale Players without Playback Reporting",children:[(0,t.jsxs)(n.p,{children:["For Subsonic server/client combinations that do not support ",(0,t.jsx)(n.a,{href:"#enhanced-playback-reporting",children:"Enhanced Playback Reporting"}),", multi-scrobbler will cleanup players that report they are playing for much longer period of time than the track's length (when length is reported). This prevents repeated scrobbles from Subsonic-compatible servers that continue returning a track after playback stops."]}),(0,t.jsxs)(n.p,{children:["If the server properly reports no playing song when playback has stopped or this causes issues for your setup, the detection can be disabled by setting ",(0,t.jsx)(n.code,{children:"detectStaleNowPlayingFromMinutesAgo"})," to ",(0,t.jsx)(n.code,{children:"false"})," in File/AIO config."]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(s,{config:"SubSonicSourceConfig",fileContent:'[\n {\n "id": "mySubsonic",\n "name": "Airsonic Server",\n "enable": true,\n "data": {\n "url": "http://localhost:4040/airsonic",\n "user": "yourUser",\n "password": "yourPassword",\n "usersAllow": ["yourUser"],\n "detectStaleNowPlayingFromMinutesAgo": true\n }\n }\n]\n',name:"subsonic",children:(0,t.jsx)(c,{})})]})}function p(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}function x(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/294f31e2.fad893ae.js b/assets/js/294f31e2.fad893ae.js deleted file mode 100644 index be42a695..00000000 --- a/assets/js/294f31e2.fad893ae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1920"],{5870(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>p,frontMatter:()=>l,contentTitle:()=>a,toc:()=>h,assets:()=>d});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/subsonic.mdx?plain=1","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(4848),i=s(8453);function o(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SUBSONIC_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_USER"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Username to login to the server with"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_PASSWORD"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Password for the user to login to the server with"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SUBSONIC_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"URL of the subsonic media server to query"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let l={title:"Subsonic",toc_min_heading_level:2,toc_max_heading_level:5},a,d={},h=[{value:"Enhanced Playback Reporting",id:"enhanced-playback-reporting",level:2},{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:s,DetailsAdmo:r}=n;return s||x("Config",!0),r||x("DetailsAdmo",!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)(r,{type:"warning",summary:"Known Issues",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)(r,{type:"tip",summary:"Recommended Alternative Sources",children:[(0,t.jsxs)(n.p,{children:["If your service 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:"enhanced-playback-reporting",children:"Enhanced Playback Reporting"}),"\n",(0,t.jsxs)(n.p,{children:["Multi-Scrobbler supports the new ",(0,t.jsx)(n.a,{href:"https://opensubsonic.netlify.app",children:"Open Subsonic"})," extension, ",(0,t.jsx)(n.a,{href:"https://opensubsonic.netlify.app/docs/extensions/playbackreport/",children:"Playback Report"}),", that enables millisecond-accurate player position and state reporting."]}),"\n",(0,t.jsxs)(n.p,{children:["To use this new data, your Subsonic server must support the extension ",(0,t.jsx)(n.strong,{children:"and"})," the active playback Client must report it. The UI for your Subsonic Source and active Player will indicate support using contextual icons."]}),"\n",(0,t.jsx)(n.p,{children:"Usage of Enhanced Playback Reporting is optional: MS will fallback to classic, less accurate Subsonic Now Playing when it is not available."}),"\n",(0,t.jsxs)(r,{type:"info",summary:"Stale Players without Playback Reporting",children:[(0,t.jsxs)(n.p,{children:["For Subsonic server/client combinations that do not support ",(0,t.jsx)(n.a,{href:"#enhanced-playback-reporting",children:"Enhanced Playback Reporting"}),", multi-scrobbler will cleanup players that report they are playing for much longer period of time than the track's length (when length is reported). This prevents repeated scrobbles from Subsonic-compatible servers that continue returning a track after playback stops."]}),(0,t.jsxs)(n.p,{children:["If the server properly reports no playing song when playback has stopped or this causes issues for your setup, the detection can be disabled by setting ",(0,t.jsx)(n.code,{children:"detectStaleNowPlayingFromMinutesAgo"})," to ",(0,t.jsx)(n.code,{children:"false"})," in File/AIO config."]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(s,{config:"SubSonicSourceConfig",fileContent:'[\n {\n "id": "mySubsonic",\n "name": "Airsonic Server",\n "enable": true,\n "data": {\n "url": "http://localhost:4040/airsonic",\n "user": "yourUser",\n "password": "yourPassword",\n "usersAllow": ["yourUser"],\n "detectStaleNowPlayingFromMinutesAgo": true\n }\n }\n]\n',name:"subsonic",children:(0,t.jsx)(c,{})})]})}function p(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}function x(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/2a24ad03.3ae318a5.js b/assets/js/2a24ad03.3ae318a5.js new file mode 100644 index 00000000..b2dc8797 --- /dev/null +++ b/assets/js/2a24ad03.3ae318a5.js @@ -0,0 +1,13 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["899"],{7265(e,t,i){i.d(t,{Ay:()=>d,RM:()=>c});var s=i(4848),l=i(8453),n=i(2170),r=i.n(n);let c=[];function o(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["A ",(0,s.jsx)(t.strong,{children:"Source"})," that monitors Listening Activity uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,s.jsxs)(t.li,{children:["or amount of time (",(0,s.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["These default values are based on ",(0,s.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,s.jsxs)(t.p,{children:["These values can be customized in the ",(0,s.jsx)(t.code,{children:"options"})," of Source's ",(0,s.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ + "data": { + // ... + }, + "options": { + // highlight-start + "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 + } + // highlight-end + } +}`})]})}function d(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},9052(e,t,i){i.r(t),i.d(t,{metadata:()=>s,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>x,assets:()=>a});var s=JSON.parse('{"id":"configuration/sources/sources","title":"Overview","description":"Scrobble Sources","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/sources.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","description":"Scrobble Sources","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/clients/tealfm"},"next":{"title":"Apple Music","permalink":"/multi-scrobbler/configuration/sources/applemusic"}}'),l=i(4848),n=i(8453),r=i(7265),c=i(8194),o=i(698);let d={sidebar_position:2,title:"Overview",description:"Scrobble Sources",toc_max_heading_level:4},h,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:"When Is Activity Scrobbled?",id:"when-is-activity-scrobbled",level:3},{value:"From Listening History",id:"from-listening-history",level:5},{value:"From Ingress",id:"from-ingress",level:5},{value:"From Listening Activity",id:"from-listening-activity",level:5},{value:"Scrobble Thresholds",id:"scrobble-thresholds",level:4},...r.RM,{value:"Monitoring",id:"monitoring",level:3}];function f(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",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.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["A ",(0,l.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,l.jsx)(t.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Airsonic"}),", etc..."]}),"\n",(0,l.jsx)(t.h2,{id:"sources",children:"Sources"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Networking"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Scrobble SOT"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#multi-deviceuser",children:"Multi Device/User"})}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#limiting-scrobble-destination",children:"Scrobble Destination"})}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#scrobble-thresholds",children:"Thresholds"})}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#monitoring",children:"Auto Monitoring"})})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/applemusic",children:"Apple Music"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u26A0\uFE0F"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u26A0\uFE0F"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/plex",children:"Plex"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/sonos",children:"Sonos"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Ingress"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/vlc",children:"VLC"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/yandex-music",children:"Yandex Music"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"}}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]})]})]}),"\n",(0,l.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,l.jsx)(t.h3,{id:"types-of-sources",children:"Types of Sources"}),"\n",(0,l.jsx)(t.p,{children:"The Sources implemented in multi-scrobbler can be broken down into two categories."}),"\n",(0,l.jsx)(t.h4,{id:"by-communication-method",children:"By Communication Method"}),"\n",(0,l.jsx)(t.p,{children:"How does this Source get data from the service/application?"}),"\n",(0,l.jsxs)(c.A,{groupId:"sourceComm",queryString:!0,children:[(0,l.jsx)(o.A,{value:"active",label:"Active",children:(0,l.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,l.jsxs)(o.A,{value:"ingress",label:"Ingress",children:[(0,l.jsx)(t.p,{children:"The MS Source waits for the service/application to send data to multi-scrobbler."}),(0,l.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,l.jsx)(t.h4,{id:"by-data-source-of-truth",children:"By Data Source of Truth"}),"\n",(0,l.jsx)(t.p,{children:"How does MS determine if/when a song has been played and is scrobbable?"}),"\n",(0,l.jsxs)(c.A,{groupId:"sot",queryString:!0,children:[(0,l.jsxs)(o.A,{value:"activity",label:"Listening Activity",children:[(0,l.jsx)(t.p,{children:"These Sources expose some kind of real-time listening data for users, like:"}),(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"player state (paused, stopped, playing)"}),"\n",(0,l.jsx)(t.li,{children:"player position (1:50/2:40)"}),"\n",(0,l.jsx)(t.li,{children:"current listened duration (Track A playing for 1m:20s)"}),"\n"]}),(0,l.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,l.jsx)(t.a,{href:"#scrobble-thresholds",children:"scrobble thresholds"}),"."]})]}),(0,l.jsxs)(o.A,{value:"history",label:"Listening History",children:[(0,l.jsx)(t.p,{children:'Some Sources expose their own version of "this track has been scrobbled."'}),(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:'Listenbrainz, Koito, and Last.fm are all scrobble services that have "definitive" histories of scrobbled tracks.'}),"\n"]}),(0,l.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,l.jsx)(t.h3,{id:"multi-deviceuser",children:"Multi-Device/User"}),"\n",(0,l.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,l.jsx)(t.h3,{id:"limiting-scrobble-destination",children:"Limiting Scrobble Destination"}),"\n",(0,l.jsxs)(t.p,{children:["To limit which Clients a Source will scrobble to use the ",(0,l.jsx)(t.code,{children:"clients"})," property in a Source's ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO configuration"})," to specify the ",(0,l.jsx)(t.strong,{children:"name"})," property of the Clients that it should scrobble to:"]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.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,l.jsx)(t.admonition,{type:"note",children:(0,l.jsxs)(t.p,{children:["If ",(0,l.jsx)(t.code,{children:"clients"})," is empty (",(0,l.jsx)(t.code,{children:'"clients": []'}),") or is omitted then the default is for the Source to scrobble to ",(0,l.jsx)(t.strong,{children:"all"})," configured Clients."]})}),"\n",(0,l.jsxs)(t.admonition,{type:"note",children:[(0,l.jsxs)(t.p,{children:["If a Client is configured using ",(0,l.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,l.jsx)(t.p,{children:(0,l.jsx)(t.img,{alt:"Client Name Subheader",src:i(4400).A+"",width:"177",height:"101"})}),(0,l.jsxs)(t.p,{children:["Otherwise, use the ",(0,l.jsx)(t.code,{children:"name"})," property you gave the client in it's File/AIO config."]})]}),"\n",(0,l.jsx)(t.h3,{id:"when-is-activity-scrobbled",children:"When Is Activity Scrobbled?"}),"\n",(0,l.jsx)(t.h5,{id:"from-listening-history",children:"From Listening History"}),"\n",(0,l.jsxs)(t.p,{children:["For ",(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:(0,l.jsx)(t.strong,{children:"Listening History"})})," Source-Of-Truth based Sources, like Listenbrainz and Last.fm, newely discovered history is immediately forwarded to relevant Clients."]}),"\n",(0,l.jsx)(t.h5,{id:"from-ingress",children:"From Ingress"}),"\n",(0,l.jsxs)(t.p,{children:["For ",(0,l.jsx)(t.a,{href:"./?sot=activity&sourceComm=ingress#by-communication-method",children:(0,l.jsx)(t.strong,{children:"Ingress"})})," communication based Sources, like ",(0,l.jsx)(t.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})," and ",(0,l.jsx)(t.a,{href:"/configuration/sources/webscrobbler",children:"Webscrobbler"}),', the client sending data to Multi-Scrobbler is what determines when activity is scrobbled. This means that it up to the behavior and implementation of whatever application you point at these Source endpoints: when the client sends "this is scrobbled", MS immediately forwards it to relevant Clients.']}),"\n",(0,l.jsx)(t.h5,{id:"from-listening-activity",children:"From Listening Activity"}),"\n",(0,l.jsxs)(t.p,{children:["For Sources that use ",(0,l.jsx)(t.a,{href:"./?sot=activity&sourceComm=active#by-communication-method",children:(0,l.jsx)(t.strong,{children:"Active"})})," communication with ",(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:(0,l.jsx)(t.strong,{children:"Listening Activity"})})," as the Source-Of-Truth -- like Jellyfin, Plex, Spotify, Subsonic, etc... -- ",(0,l.jsx)(t.em,{children:"Multi-Scrobbler waits until the track changes or the active player becomes stale/disappears"})," before determining if the activity should be scrobbled."]}),"\n",(0,l.jsxs)(t.p,{children:["This allows MS to record how long you listened to the track for as well as more accurately determine if ",(0,l.jsx)(t.strong,{children:"Scrobble Thresholds"})," have been met."]}),"\n",(0,l.jsx)(t.h4,{id:"scrobble-thresholds",children:"Scrobble Thresholds"}),"\n",(0,l.jsx)(r.Ay,{filename:"spotify"}),"\n",(0,l.jsxs)(t.p,{children:["These can also be configured ",(0,l.jsx)(t.strong,{children:"globally"})," for all Sources using ENVs:"]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.jsx)(t.code,{children:"SOURCE_SCROBBLE_DURATION=40\nSOURCE_SCROBBLE_PERCENT=20\n"})}),"\n",(0,l.jsx)(t.h3,{id:"monitoring",children:"Monitoring"}),"\n",(0,l.jsx)(t.admonition,{type:"note",children:(0,l.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,l.jsxs)(t.p,{children:["For ",(0,l.jsx)(t.em,{children:"most"})," Sources multi-scrobbler can determine if a user is listening and monitor activity 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 monitor activity. This action can be taken on the Web Dashboard by clicking the link next to ",(0,l.jsx)(t.strong,{children:"Monitoring"})," found in each Source's status card."]}),"\n",(0,l.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,l.jsx)(t.code,{children:"options"})," in ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.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 "autoMonitor": true\n }\n}\n'})})]})}function j(e={}){let{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(f,{...e})}):f(e)}},4400(e,t,i){i.d(t,{A:()=>s});let s="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"}}]); \ No newline at end of file diff --git a/assets/js/2a24ad03.f7468792.js b/assets/js/2a24ad03.f7468792.js deleted file mode 100644 index 4d731cbd..00000000 --- a/assets/js/2a24ad03.f7468792.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["899"],{7265(e,t,i){i.d(t,{Ay:()=>d,RM:()=>c});var s=i(4848),l=i(8453),n=i(2170),r=i.n(n);let c=[];function o(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["A ",(0,s.jsx)(t.strong,{children:"Source"})," that monitors Listening Activity uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,s.jsxs)(t.li,{children:["or amount of time (",(0,s.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["These default values are based on ",(0,s.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,s.jsxs)(t.p,{children:["These values can be customized in the ",(0,s.jsx)(t.code,{children:"options"})," of Source's ",(0,s.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,s.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ - "data": { - // ... - }, - "options": { - // highlight-start - "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 - } - // highlight-end - } -}`})]})}function d(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},9052(e,t,i){i.r(t),i.d(t,{metadata:()=>s,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>x,assets:()=>a});var s=JSON.parse('{"id":"configuration/sources/sources","title":"Overview","description":"Scrobble Sources","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/sources.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","description":"Scrobble Sources","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Teal.fm","permalink":"/multi-scrobbler/configuration/clients/tealfm"},"next":{"title":"Apple Music","permalink":"/multi-scrobbler/configuration/sources/applemusic"}}'),l=i(4848),n=i(8453),r=i(7265),c=i(8194),o=i(698);let d={sidebar_position:2,title:"Overview",description:"Scrobble Sources",toc_max_heading_level:4},h,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:"When Is Activity Scrobbled?",id:"when-is-activity-scrobbled",level:3},{value:"From Listening History",id:"from-listening-history",level:5},{value:"From Ingress",id:"from-ingress",level:5},{value:"From Listening Activity",id:"from-listening-activity",level:5},{value:"Scrobble Thresholds",id:"scrobble-thresholds",level:4},...r.RM,{value:"Monitoring",id:"monitoring",level:3}];function f(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",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.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["A ",(0,l.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,l.jsx)(t.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Airsonic"}),", etc..."]}),"\n",(0,l.jsx)(t.h2,{id:"sources",children:"Sources"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Networking"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Scrobble SOT"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#multi-deviceuser",children:"Multi Device/User"})}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#limiting-scrobble-destination",children:"Scrobble Destination"})}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#scrobble-thresholds",children:"Thresholds"})}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"#monitoring",children:"Auto Monitoring"})})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/applemusic",children:"Apple Music"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u26A0\uFE0F"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u26A0\uFE0F"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=ingress#by-communication-method",children:"Ingress"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/plex",children:"Plex"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/sonos",children:"Sonos"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Ingress"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/vlc",children:"VLC"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/yandex-music",children:"Yandex Music"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:"Activity"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"}}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sourceComm=active#by-communication-method",children:"Active"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:"History"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]})]})]}),"\n",(0,l.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,l.jsx)(t.h3,{id:"types-of-sources",children:"Types of Sources"}),"\n",(0,l.jsx)(t.p,{children:"The Sources implemented in multi-scrobbler can be broken down into two categories."}),"\n",(0,l.jsx)(t.h4,{id:"by-communication-method",children:"By Communication Method"}),"\n",(0,l.jsx)(t.p,{children:"How does this Source get data from the service/application?"}),"\n",(0,l.jsxs)(c.A,{groupId:"sourceComm",queryString:!0,children:[(0,l.jsx)(o.A,{value:"active",label:"Active",children:(0,l.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,l.jsxs)(o.A,{value:"ingress",label:"Ingress",children:[(0,l.jsx)(t.p,{children:"The MS Source waits for the service/application to send data to multi-scrobbler."}),(0,l.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,l.jsx)(t.h4,{id:"by-data-source-of-truth",children:"By Data Source of Truth"}),"\n",(0,l.jsx)(t.p,{children:"How does MS determine if/when a song has been played and is scrobbable?"}),"\n",(0,l.jsxs)(c.A,{groupId:"sot",queryString:!0,children:[(0,l.jsxs)(o.A,{value:"activity",label:"Listening Activity",children:[(0,l.jsx)(t.p,{children:"These Sources expose some kind of real-time listening data for users, like:"}),(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"player state (paused, stopped, playing)"}),"\n",(0,l.jsx)(t.li,{children:"player position (1:50/2:40)"}),"\n",(0,l.jsx)(t.li,{children:"current listened duration (Track A playing for 1m:20s)"}),"\n"]}),(0,l.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,l.jsx)(t.a,{href:"#scrobble-thresholds",children:"scrobble thresholds"}),"."]})]}),(0,l.jsxs)(o.A,{value:"history",label:"Listening History",children:[(0,l.jsx)(t.p,{children:'Some Sources expose their own version of "this track has been scrobbled."'}),(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:'Listenbrainz, Koito, and Last.fm are all scrobble services that have "definitive" histories of scrobbled tracks.'}),"\n"]}),(0,l.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,l.jsx)(t.h3,{id:"multi-deviceuser",children:"Multi-Device/User"}),"\n",(0,l.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,l.jsx)(t.h3,{id:"limiting-scrobble-destination",children:"Limiting Scrobble Destination"}),"\n",(0,l.jsxs)(t.p,{children:["To limit which Clients a Source will scrobble to use the ",(0,l.jsx)(t.code,{children:"clients"})," property in a Source's ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO configuration"})," to specify the ",(0,l.jsx)(t.strong,{children:"name"})," property of the Clients that it should scrobble to:"]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.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,l.jsx)(t.admonition,{type:"note",children:(0,l.jsxs)(t.p,{children:["If ",(0,l.jsx)(t.code,{children:"clients"})," is empty (",(0,l.jsx)(t.code,{children:'"clients": []'}),") or is omitted then the default is for the Source to scrobble to ",(0,l.jsx)(t.strong,{children:"all"})," configured Clients."]})}),"\n",(0,l.jsxs)(t.admonition,{type:"note",children:[(0,l.jsxs)(t.p,{children:["If a Client is configured using ",(0,l.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,l.jsx)(t.p,{children:(0,l.jsx)(t.img,{alt:"Client Name Subheader",src:i(4400).A+"",width:"177",height:"101"})}),(0,l.jsxs)(t.p,{children:["Otherwise, use the ",(0,l.jsx)(t.code,{children:"name"})," property you gave the client in it's File/AIO config."]})]}),"\n",(0,l.jsx)(t.h3,{id:"when-is-activity-scrobbled",children:"When Is Activity Scrobbled?"}),"\n",(0,l.jsx)(t.h5,{id:"from-listening-history",children:"From Listening History"}),"\n",(0,l.jsxs)(t.p,{children:["For ",(0,l.jsx)(t.a,{href:"./?sot=history#by-data-source-of-truth",children:(0,l.jsx)(t.strong,{children:"Listening History"})})," Source-Of-Truth based Sources, like Listenbrainz and Last.fm, newely discovered history is immediately forwarded to relevant Clients."]}),"\n",(0,l.jsx)(t.h5,{id:"from-ingress",children:"From Ingress"}),"\n",(0,l.jsxs)(t.p,{children:["For ",(0,l.jsx)(t.a,{href:"./?sot=activity&sourceComm=ingress#by-communication-method",children:(0,l.jsx)(t.strong,{children:"Ingress"})})," communication based Sources, like ",(0,l.jsx)(t.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})," and ",(0,l.jsx)(t.a,{href:"/configuration/sources/webscrobbler",children:"Webscrobbler"}),', the client sending data to Multi-Scrobbler is what determines when activity is scrobbled. This means that it up to the behavior and implementation of whatever application you point at these Source endpoints: when the client sends "this is scrobbled", MS immediately forwards it to relevant Clients.']}),"\n",(0,l.jsx)(t.h5,{id:"from-listening-activity",children:"From Listening Activity"}),"\n",(0,l.jsxs)(t.p,{children:["For Sources that use ",(0,l.jsx)(t.a,{href:"./?sot=activity&sourceComm=active#by-communication-method",children:(0,l.jsx)(t.strong,{children:"Active"})})," communication with ",(0,l.jsx)(t.a,{href:"./?sot=activity#by-data-source-of-truth",children:(0,l.jsx)(t.strong,{children:"Listening Activity"})})," as the Source-Of-Truth -- like Jellyfin, Plex, Spotify, Subsonic, etc... -- ",(0,l.jsx)(t.em,{children:"Multi-Scrobbler waits until the track changes or the active player becomes stale/disappears"})," before determining if the activity should be scrobbled."]}),"\n",(0,l.jsxs)(t.p,{children:["This allows MS to record how long you listened to the track for as well as more accurately determine if ",(0,l.jsx)(t.strong,{children:"Scrobble Thresholds"})," have been met."]}),"\n",(0,l.jsx)(t.h4,{id:"scrobble-thresholds",children:"Scrobble Thresholds"}),"\n",(0,l.jsx)(r.Ay,{filename:"spotify"}),"\n",(0,l.jsxs)(t.p,{children:["These can also be configured ",(0,l.jsx)(t.strong,{children:"globally"})," for all Sources using ENVs:"]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.jsx)(t.code,{children:"SOURCE_SCROBBLE_DURATION=40\nSOURCE_SCROBBLE_PERCENT=20\n"})}),"\n",(0,l.jsx)(t.h3,{id:"monitoring",children:"Monitoring"}),"\n",(0,l.jsx)(t.admonition,{type:"note",children:(0,l.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,l.jsxs)(t.p,{children:["For ",(0,l.jsx)(t.em,{children:"most"})," Sources multi-scrobbler can determine if a user is listening and monitor activity 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 monitor activity. This action can be taken on the Web Dashboard by clicking the link next to ",(0,l.jsx)(t.strong,{children:"Monitoring"})," found in each Source's status card."]}),"\n",(0,l.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,l.jsx)(t.code,{children:"options"})," in ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.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 "autoMonitor": true\n }\n}\n'})})]})}function j(e={}){let{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(f,{...e})}):f(e)}},4400(e,t,i){i.d(t,{A:()=>s});let s="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"}}]); \ No newline at end of file diff --git a/assets/js/2ecbbad4.2f08c93b.js b/assets/js/2ecbbad4.2f08c93b.js new file mode 100644 index 00000000..4cb4583f --- /dev/null +++ b/assets/js/2ecbbad4.2f08c93b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6473"],{8378(e,n,t){t.r(n),t.d(n,{metadata:()=>i,default:()=>m,frontMatter:()=>a,contentTitle:()=>h,toc:()=>j,assets:()=>u});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/youtube-music.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Youtube Music","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Yandex Music","permalink":"/multi-scrobbler/configuration/sources/yandex-music"},"next":{"title":"Enhancing Scrobbles","permalink":"/multi-scrobbler/configuration/transforms/"}}'),s=t(4848),o=t(8453),r=t(8194),c=t(698);function l(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Environmental Variable"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"YTM_ID"})})})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["A globally unique ID EX ",(0,s.jsx)(n.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_NAME"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsxs)(n.td,{children:["Value of ",(0,s.jsx)(n.code,{children:"YTM_ID"})]}),(0,s.jsxs)(n.td,{children:["A vanity name EX ",(0,s.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_ENABLE"})}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"true"}),(0,s.jsx)(n.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_REDIRECT_URI"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Google Cloud Console project OAuth Client Authorized redirect URI"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_CLIENT_ID"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Google Cloud Console project OAuth Client ID"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_CLIENT_SECRET"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Google Cloud Console project OAuth Client Secret"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_COOKIE"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"The cookie retrieved from the Request Headers of music.youtube.com after logging in."})]})]})]})}function d(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}t(2170);let a={title:"Youtube Music",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},j=[{value:"Authentication",id:"ytm-auth",level:4},{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Config:t,Details:i}=n;return t||p("Config",!0),i||p("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Communication with YT Music is ",(0,s.jsx)(n.strong,{children:"unofficial"})," and not supported or endorsed by Google. This means that ",(0,s.jsx)(n.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)(n.admonition,{title:"Scrobble Troubleshooting",type:"tip",children:[(0,s.jsx)(n.p,{children:"Due to monitoring being unofficial, listening history from YTM can be inconsistent and can cause missed scrobbles."}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"/multi-scrobbler/FAQ#youtube-music-misses-or-duplicates-scrobbles",children:(0,s.jsx)(n.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)(n.h4,{id:"ytm-auth",children:"Authentication"}),"\n",(0,s.jsx)(n.p,{children:"Only one of these methods needs to be used."}),"\n",(0,s.jsxs)(r.A,{groupId:"ytmAuth",queryString:!0,children:[(0,s.jsxs)(c.A,{value:"cookie",label:"Cookies",children:[(0,s.jsx)(n.p,{children:"Use instructions from"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.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)(n.li,{children:(0,s.jsx)(n.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)(n.p,{children:["to get the ",(0,s.jsx)(n.strong,{children:"Cookie"})," value from a browser."]}),(0,s.jsxs)(n.p,{children:["It is highly recommended to ",(0,s.jsx)(n.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)(n.p,{children:["Add the cookie to your ",(0,s.jsx)(n.code,{children:"ytmusic.json"})," config in ",(0,s.jsx)(n.code,{children:"data"})," or as an ENV:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.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.A,{value:"oauth",label:"OAuth Client",children:[(0,s.jsxs)(n.admonition,{type:"warning",children:[(0,s.jsxs)(n.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)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/345#issuecomment-3258518769",children:"several other users."})]}),(0,s.jsx)(n.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)(n.p,{children:["If you are setting up the YTM Source for the first time you should first try to use ",(0,s.jsx)(n.a,{href:"./?ytmAuth=cookie#ytm-auth",children:"Cookies"}),"."]})]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2479689924",children:"Based on the instructions from here..."})}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Login to ",(0,s.jsx)(n.a,{href:"https://console.cloud.google.com/",children:"Google Cloud console"})," (create an account, if necessary)","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://console.cloud.google.com/projectcreate",children:"Create a new project"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Go to APIs and services.","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Configure the OAuth consent screen","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Use the old experience if possible"}),"\n",(0,s.jsx)(n.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)(n.li,{children:"Add yourself as an authorized user"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Navigate to Credentials","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['Create Credentials -> choose "OAuth client ID"',"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Application Type is ",(0,s.jsx)(n.strong,{children:"Web Application"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Name"})," is whatever you want, leave Authorization Javascript origins blank"]}),"\n",(0,s.jsxs)(n.li,{children:["Authorized redirect URIs","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["This must be ",(0,s.jsx)(n.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)(n.li,{children:["Create","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["In the newly created client popup save the ",(0,s.jsx)(n.strong,{children:"Client ID"})," and ",(0,s.jsx)(n.strong,{children:"Client Secret"}),", then copy them into ",(0,s.jsx)(n.code,{children:"ytmusic.json"})," or appropriate ENVs:"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.p,{children:"Now, start MS and during the YTMusic startup it will log something like this:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.p,{children:["If the beginning of the Redirect URI (before ",(0,s.jsx)(n.code,{children:"api"}),") is EXACTLY how you would reach the MS dashboard from your browser (EX ",(0,s.jsx)(n.code,{children:"http://localhost:9078"}),") then edit your google oauth client section for ",(0,s.jsx)(n.code,{children:"Authorized redirect URIs"})," and add the URL MS has displayed."]}),(0,s.jsxs)(n.p,{children:["If it is NOT EXACTLY the same you either need to set MS's ",(0,s.jsx)(n.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)(n.code,{children:"ytmusic.json"})," or ENV."]}),(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:"Using a Custom Redirect URI"}),(0,s.jsx)(n.p,{children:"The three parts of the URL that must be the same:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["it must start with ",(0,s.jsx)(n.code,{children:"api"})," (after domain or subdirectory IE ",(0,s.jsx)(n.code,{children:"my.domain.tld/api..."})," or ",(0,s.jsx)(n.code,{children:"whatever.tld/subDir/api..."})]}),"\n",(0,s.jsxs)(n.li,{children:["it must end in ",(0,s.jsx)(n.code,{children:"ytmusic/callback"})]}),"\n",(0,s.jsxs)(n.li,{children:["It must include ",(0,s.jsx)(n.code,{children:"name=[NameOfSource]"})," in the query string"]}),"\n"]}),(0,s.jsxs)(n.p,{children:["Remember to add your custom URL to the ",(0,s.jsx)(n.code,{children:"Authorized redirect URIs"})," section in the google oauth client!"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.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)(n.code,{children:"(Re)authenticate"})," on the YTmusic source card and follow the auth flow:"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['On the screen about "testing" make sure you hit ',(0,s.jsx)(n.strong,{children:"Continue"})," (not Back To Safety)"]}),"\n",(0,s.jsxs)(n.li,{children:["Make sure to select ALL scopes/permissions/grants it asks you about","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Select what [YourAppName] can access"})," -> Select all"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsxs)(n.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)(n.code,{children:"/config"})," folder."]})]}),(0,s.jsxs)(c.A,{value:"ytt",label:"YoutubeTV",children:[(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Using the built-in YoutubeTV authentication is unlikely to work due to ",(0,s.jsx)(n.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)(n.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)(n.pre,{children:(0,s.jsx)(n.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)(n.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)(n.code,{children:"Auth success"})," and the YT Music dashboard card will display as ",(0,s.jsx)(n.strong,{children:"Idle"})," after refreshing. Click the ",(0,s.jsx)(n.strong,{children:"Start"})," link to begin monitoring."]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(t,{config:"YTMusicSourceConfig",fileContent:'[\n {\n "id": "myYtMusic",\n "name": "Foxx YT Music",\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.jsx)(d,{})})]})}function m(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(x,{...e})}):x(e)}function p(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/2ecbbad4.b0403b88.js b/assets/js/2ecbbad4.b0403b88.js deleted file mode 100644 index df822d82..00000000 --- a/assets/js/2ecbbad4.b0403b88.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6473"],{8378(e,n,t){t.r(n),t.d(n,{metadata:()=>i,default:()=>m,frontMatter:()=>a,contentTitle:()=>h,toc:()=>j,assets:()=>u});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/youtube-music.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Youtube Music","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Yandex Music","permalink":"/multi-scrobbler/configuration/sources/yandex-music"},"next":{"title":"Enhancing Scrobbles","permalink":"/multi-scrobbler/configuration/transforms/"}}'),s=t(4848),o=t(8453),r=t(8194),c=t(698);function l(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Environmental Variable"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"YTM_ID"})})})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["A globally unique ID EX ",(0,s.jsx)(n.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_NAME"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsxs)(n.td,{children:["Value of ",(0,s.jsx)(n.code,{children:"YTM_ID"})]}),(0,s.jsxs)(n.td,{children:["A vanity name EX ",(0,s.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_ENABLE"})}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"true"}),(0,s.jsx)(n.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_REDIRECT_URI"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Google Cloud Console project OAuth Client Authorized redirect URI"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_CLIENT_ID"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Google Cloud Console project OAuth Client ID"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_CLIENT_SECRET"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Google Cloud Console project OAuth Client Secret"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"YTM_COOKIE"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"The cookie retrieved from the Request Headers of music.youtube.com after logging in."})]})]})]})}function d(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}t(2170);let a={title:"Youtube Music",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},j=[{value:"Authentication",id:"ytm-auth",level:4},{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Config:t,Details:i}=n;return t||p("Config",!0),i||p("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Communication with YT Music is ",(0,s.jsx)(n.strong,{children:"unofficial"})," and not supported or endorsed by Google. This means that ",(0,s.jsx)(n.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)(n.admonition,{title:"Scrobble Troubleshooting",type:"tip",children:[(0,s.jsx)(n.p,{children:"Due to monitoring being unofficial, listening history from YTM can be inconsistent and can cause missed scrobbles."}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"/multi-scrobbler/FAQ#youtube-music-misses-or-duplicates-scrobbles",children:(0,s.jsx)(n.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)(n.h4,{id:"ytm-auth",children:"Authentication"}),"\n",(0,s.jsx)(n.p,{children:"Only one of these methods needs to be used."}),"\n",(0,s.jsxs)(r.A,{groupId:"ytmAuth",queryString:!0,children:[(0,s.jsxs)(c.A,{value:"cookie",label:"Cookies",children:[(0,s.jsx)(n.p,{children:"Use instructions from"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.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)(n.li,{children:(0,s.jsx)(n.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)(n.p,{children:["to get the ",(0,s.jsx)(n.strong,{children:"Cookie"})," value from a browser."]}),(0,s.jsxs)(n.p,{children:["It is highly recommended to ",(0,s.jsx)(n.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)(n.p,{children:["Add the cookie to your ",(0,s.jsx)(n.code,{children:"ytmusic.json"})," config in ",(0,s.jsx)(n.code,{children:"data"})," or as an ENV:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.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.A,{value:"oauth",label:"OAuth Client",children:[(0,s.jsxs)(n.admonition,{type:"warning",children:[(0,s.jsxs)(n.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)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/345#issuecomment-3258518769",children:"several other users."})]}),(0,s.jsx)(n.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)(n.p,{children:["If you are setting up the YTM Source for the first time you should first try to use ",(0,s.jsx)(n.a,{href:"./?ytmAuth=cookie#ytm-auth",children:"Cookies"}),"."]})]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2479689924",children:"Based on the instructions from here..."})}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Login to ",(0,s.jsx)(n.a,{href:"https://console.cloud.google.com/",children:"Google Cloud console"})," (create an account, if necessary)","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://console.cloud.google.com/projectcreate",children:"Create a new project"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Go to APIs and services.","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Configure the OAuth consent screen","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Use the old experience if possible"}),"\n",(0,s.jsx)(n.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)(n.li,{children:"Add yourself as an authorized user"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Navigate to Credentials","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['Create Credentials -> choose "OAuth client ID"',"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Application Type is ",(0,s.jsx)(n.strong,{children:"Web Application"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Name"})," is whatever you want, leave Authorization Javascript origins blank"]}),"\n",(0,s.jsxs)(n.li,{children:["Authorized redirect URIs","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["This must be ",(0,s.jsx)(n.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)(n.li,{children:["Create","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["In the newly created client popup save the ",(0,s.jsx)(n.strong,{children:"Client ID"})," and ",(0,s.jsx)(n.strong,{children:"Client Secret"}),", then copy them into ",(0,s.jsx)(n.code,{children:"ytmusic.json"})," or appropriate ENVs:"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.p,{children:"Now, start MS and during the YTMusic startup it will log something like this:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.p,{children:["If the beginning of the Redirect URI (before ",(0,s.jsx)(n.code,{children:"api"}),") is EXACTLY how you would reach the MS dashboard from your browser (EX ",(0,s.jsx)(n.code,{children:"http://localhost:9078"}),") then edit your google oauth client section for ",(0,s.jsx)(n.code,{children:"Authorized redirect URIs"})," and add the URL MS has displayed."]}),(0,s.jsxs)(n.p,{children:["If it is NOT EXACTLY the same you either need to set MS's ",(0,s.jsx)(n.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)(n.code,{children:"ytmusic.json"})," or ENV."]}),(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:"Using a Custom Redirect URI"}),(0,s.jsx)(n.p,{children:"The three parts of the URL that must be the same:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["it must start with ",(0,s.jsx)(n.code,{children:"api"})," (after domain or subdirectory IE ",(0,s.jsx)(n.code,{children:"my.domain.tld/api..."})," or ",(0,s.jsx)(n.code,{children:"whatever.tld/subDir/api..."})]}),"\n",(0,s.jsxs)(n.li,{children:["it must end in ",(0,s.jsx)(n.code,{children:"ytmusic/callback"})]}),"\n",(0,s.jsxs)(n.li,{children:["It must include ",(0,s.jsx)(n.code,{children:"name=[NameOfSource]"})," in the query string"]}),"\n"]}),(0,s.jsxs)(n.p,{children:["Remember to add your custom URL to the ",(0,s.jsx)(n.code,{children:"Authorized redirect URIs"})," section in the google oauth client!"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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)(n.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)(n.code,{children:"(Re)authenticate"})," on the YTmusic source card and follow the auth flow:"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['On the screen about "testing" make sure you hit ',(0,s.jsx)(n.strong,{children:"Continue"})," (not Back To Safety)"]}),"\n",(0,s.jsxs)(n.li,{children:["Make sure to select ALL scopes/permissions/grants it asks you about","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Select what [YourAppName] can access"})," -> Select all"]}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsxs)(n.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)(n.code,{children:"/config"})," folder."]})]}),(0,s.jsxs)(c.A,{value:"ytt",label:"YoutubeTV",children:[(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Using the built-in YoutubeTV authentication is unlikely to work due to ",(0,s.jsx)(n.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)(n.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)(n.pre,{children:(0,s.jsx)(n.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)(n.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)(n.code,{children:"Auth success"})," and the YT Music dashboard card will display as ",(0,s.jsx)(n.strong,{children:"Idle"})," after refreshing. Click the ",(0,s.jsx)(n.strong,{children:"Start"})," link to begin monitoring."]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(t,{config:"YTMusicSourceConfig",fileContent:'[\n {\n "id": "myYtMusic",\n "name": "Foxx YT Music",\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.jsx)(d,{})})]})}function m(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(x,{...e})}):x(e)}function p(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/30829cd8.c41b385a.js b/assets/js/30829cd8.c41b385a.js new file mode 100644 index 00000000..90d5f708 --- /dev/null +++ b/assets/js/30829cd8.c41b385a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5077"],{874(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>x,frontMatter:()=>a,contentTitle:()=>d,toc:()=>u,assets:()=>h});var r=JSON.parse('{"id":"configuration/sources/tealfm-source","title":"Teal.fm","description":"Teal.fm (Source)","source":"@site/docs/configuration/sources/tealfm-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/tealfm-source","permalink":"/multi-scrobbler/configuration/sources/tealfm-source","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/tealfm-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Teal.fm","description":"Teal.fm (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic"},"next":{"title":"VLC","permalink":"/multi-scrobbler/configuration/sources/vlc"}}'),i=s(4848),t=s(8453);s(8194),s(698),s(2170);var o=s(3242);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environmental Variable"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_ID"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["A globally unique ID EX ",(0,i.jsx)(n.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_NAME"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsxs)(n.td,{children:["Value of ",(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_ID"})]}),(0,i.jsxs)(n.td,{children:["A vanity name EX ",(0,i.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_ENABLE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_IDENTIFIER"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Identify the account to login as"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_APP_PW"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["The ",(0,i.jsx)(n.a,{href:"https://atproto.com/specs/xrpc#app-passwords",children:"App Password"})," you created for your account"]})]})]})]})}function c(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}let a={title:"Teal.fm",description:"Teal.fm (Source)",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},u=[{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Service Filtering",id:"service-filtering",level:3}];function f(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Config:s,Details:r}=n;return s||j("Config",!0),r||j("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To ",(0,i.jsx)(n.strong,{children:"scrobble to"})," an ATProto PDS, create a ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"teal.fm (Client)"})]}),"\n"]})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://teal.fm/",children:(0,i.jsx)(n.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,i.jsx)(n.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"This Source monitors the teal.fm scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients."}),"\n",(0,i.jsxs)(n.p,{children:["Learn more about how teal.fm scrobbles work in the ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"teal.fm (Client)"})," docs."]}),"\n",(0,i.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,i.jsxs)(n.p,{children:["Follow the ",(0,i.jsx)(n.strong,{children:"Setup"})," instructions in the ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm#setup",children:"teal.fm (Client)"})," docs to get access to your Bluesky PDS repository and scrobble data."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["See the ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm#setup",children:"teal.fm (Client)"})," configuration for general setup. The main differences for ",(0,i.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,i.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"service-filtering",children:"Service Filtering"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"serviceAllow"})," and ",(0,i.jsx)(n.code,{children:"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)."]}),"\n",(0,i.jsxs)(n.p,{children:["Only one filter can be used at a time. If ",(0,i.jsx)(n.code,{children:"serviceAllow"})," is configured then ",(0,i.jsx)(n.code,{children:"serviceDeny"})," will be ignored."]}),"\n",(0,i.jsxs)(n.p,{children:["If a Play does not have an associated music service it can be allowed/denied using the special keyword ",(0,i.jsx)(n.code,{children:"unknown"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"If you are unsure what services are being used for your scrobbles you can check this by:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["use ",(0,i.jsx)(n.a,{href:"https://atproto.at/",children:"atproto.at"})," to lookup your DID/handle"]}),"\n",(0,i.jsxs)(n.li,{children:["View the ",(0,i.jsx)(n.strong,{children:"Raw Data"})," for the PDS Collection ",(0,i.jsx)(n.code,{children:"fm.teal.alpha.feed.play"})]}),"\n",(0,i.jsxs)(n.li,{children:["Check the ",(0,i.jsx)(n.code,{children:"musicServiceBaseDomain"})," property for each record"]}),"\n"]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.p,{children:["Allowing only scrobbles from ",(0,i.jsx)(n.a,{href:"https://plyr.fm/",children:"plyr.fm"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="tealfm.json"',children:'[\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n "serviceAllow": ["plyr"],\n }\n }\n]\n'})}),(0,i.jsx)(n.p,{children:"Deny scrobbles from last.fm:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="tealfm.json"',children:'[\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n "serviceDeny": ["last"],\n }\n }\n]\n'})}),(0,i.jsx)(n.p,{children:"Allow scrobbles from plyr.fm and unknown services:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="tealfm.json"',children:'[\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n "serviceAllow": ["plyr", "unknown"],\n }\n }\n]\n'})})]}),"\n",(0,i.jsx)(s,{config:"TealClientConfig",fileContent:o.A,configureAs:!0,ambiguous:!0,name:"tealfm",children:(0,i.jsx)(c,{})})]})}function x(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(f,{...e})}):f(e)}function j(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},3242(e,n,s){s.d(n,{A:()=>r});let r='[\n {\n "id": "myTealClient",\n "name": "Foxx Teal Client",\n "configureAs": "client",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3"\n }\n },\n {\n "id": "myTealSource",\n "name": "Foxx Teal Source",\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]'}}]); \ No newline at end of file diff --git a/assets/js/30829cd8.ec4d59dc.js b/assets/js/30829cd8.ec4d59dc.js deleted file mode 100644 index 830fe152..00000000 --- a/assets/js/30829cd8.ec4d59dc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5077"],{874(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>x,frontMatter:()=>a,contentTitle:()=>d,toc:()=>u,assets:()=>h});var r=JSON.parse('{"id":"configuration/sources/tealfm-source","title":"Teal.fm","description":"Teal.fm (Source)","source":"@site/docs/configuration/sources/tealfm-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/tealfm-source","permalink":"/multi-scrobbler/configuration/sources/tealfm-source","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/tealfm-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Teal.fm","description":"Teal.fm (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic"},"next":{"title":"VLC","permalink":"/multi-scrobbler/configuration/sources/vlc"}}'),i=s(4848),t=s(8453);s(8194),s(698),s(2170);var o=s(3242);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environmental Variable"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_ID"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["A globally unique ID EX ",(0,i.jsx)(n.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_NAME"})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsxs)(n.td,{children:["Value of ",(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_ID"})]}),(0,i.jsxs)(n.td,{children:["A vanity name EX ",(0,i.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_ENABLE"})}),(0,i.jsx)(n.td,{children:"boolean"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_IDENTIFIER"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Identify the account to login as"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"SOURCE_TEALFM_APP_PW"})})})}),(0,i.jsx)(n.td,{children:"string"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["The ",(0,i.jsx)(n.a,{href:"https://atproto.com/specs/xrpc#app-passwords",children:"App Password"})," you created for your account"]})]})]})]})}function c(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}let a={title:"Teal.fm",description:"Teal.fm (Source)",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},u=[{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Service Filtering",id:"service-filtering",level:3}];function f(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Config:s,Details:r}=n;return s||j("Config",!0),r||j("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To ",(0,i.jsx)(n.strong,{children:"scrobble to"})," an ATProto PDS, create a ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"teal.fm (Client)"})]}),"\n"]})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://teal.fm/",children:(0,i.jsx)(n.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,i.jsx)(n.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"This Source monitors the teal.fm scrobbles in your PDS and then re-scrobbles discovered tracks to configured clients."}),"\n",(0,i.jsxs)(n.p,{children:["Learn more about how teal.fm scrobbles work in the ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm",children:"teal.fm (Client)"})," docs."]}),"\n",(0,i.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,i.jsxs)(n.p,{children:["Follow the ",(0,i.jsx)(n.strong,{children:"Setup"})," instructions in the ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm#setup",children:"teal.fm (Client)"})," docs to get access to your Bluesky PDS repository and scrobble data."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["See the ",(0,i.jsx)(n.a,{href:"/configuration/clients/tealfm#setup",children:"teal.fm (Client)"})," configuration for general setup. The main differences for ",(0,i.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,i.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"service-filtering",children:"Service Filtering"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"serviceAllow"})," and ",(0,i.jsx)(n.code,{children:"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)."]}),"\n",(0,i.jsxs)(n.p,{children:["Only one filter can be used at a time. If ",(0,i.jsx)(n.code,{children:"serviceAllow"})," is configured then ",(0,i.jsx)(n.code,{children:"serviceDeny"})," will be ignored."]}),"\n",(0,i.jsxs)(n.p,{children:["If a Play does not have an associated music service it can be allowed/denied using the special keyword ",(0,i.jsx)(n.code,{children:"unknown"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"If you are unsure what services are being used for your scrobbles you can check this by:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["use ",(0,i.jsx)(n.a,{href:"https://atproto.at/",children:"atproto.at"})," to lookup your DID/handle"]}),"\n",(0,i.jsxs)(n.li,{children:["View the ",(0,i.jsx)(n.strong,{children:"Raw Data"})," for the PDS Collection ",(0,i.jsx)(n.code,{children:"fm.teal.alpha.feed.play"})]}),"\n",(0,i.jsxs)(n.li,{children:["Check the ",(0,i.jsx)(n.code,{children:"musicServiceBaseDomain"})," property for each record"]}),"\n"]}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.p,{children:["Allowing only scrobbles from ",(0,i.jsx)(n.a,{href:"https://plyr.fm/",children:"plyr.fm"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="tealfm.json"',children:'[\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n "serviceAllow": ["plyr"],\n }\n }\n]\n'})}),(0,i.jsx)(n.p,{children:"Deny scrobbles from last.fm:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="tealfm.json"',children:'[\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n "serviceDeny": ["last"],\n }\n }\n]\n'})}),(0,i.jsx)(n.p,{children:"Allow scrobbles from plyr.fm and unknown services:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="tealfm.json"',children:'[\n {\n "name": "myTealSource",\n "configureAs": "source",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3",\n\n "serviceAllow": ["plyr", "unknown"],\n }\n }\n]\n'})})]}),"\n",(0,i.jsx)(s,{config:"TealClientConfig",fileContent:o.A,configureAs:!0,ambiguous:!0,name:"tealfm",children:(0,i.jsx)(c,{})})]})}function x(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(f,{...e})}):f(e)}function j(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},3242(e,n,s){s.d(n,{A:()=>r});let r='[\n {\n "id": "myTealClient",\n "name": "Foxx Teal Client",\n "configureAs": "client",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3"\n }\n },\n {\n "id": "myTealSource",\n "name": "Foxx Teal Source",\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]'}}]); \ No newline at end of file diff --git a/assets/js/33c4ed3f.368cddb1.js b/assets/js/33c4ed3f.368cddb1.js new file mode 100644 index 00000000..6f206331 --- /dev/null +++ b/assets/js/33c4ed3f.368cddb1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["429"],{8779(e,n,r){r.r(n),r.d(n,{metadata:()=>t,default:()=>h,frontMatter:()=>i,contentTitle:()=>a,toc:()=>c,assets:()=>l});var t=JSON.parse('{"id":"development/dev-source","title":"Source Development/Tutorial","description":"Developing a new Source","source":"@site/docs/development/dev-source.md","sourceDirName":"development","slug":"/development/dev-source","permalink":"/multi-scrobbler/development/dev-source","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/development/dev-source.md?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"sidebar_position":2,"title":"Source Development/Tutorial","description":"Developing a new Source"},"sidebar":"tutorialSidebar","previous":{"title":"Common Development","permalink":"/multi-scrobbler/development/dev-common"},"next":{"title":"Flatpak","permalink":"/multi-scrobbler/development/flatpak"}}'),o=r(4848),s=r(8453);let i={toc_min_heading_level:2,toc_max_heading_level:5,sidebar_position:2,title:"Source Development/Tutorial",description:"Developing a new Source"},a,l={},c=[{value:"Scenario",id:"scenario",level:2},{value:"Minimal Implementation",id:"minimal-implementation",level:2},{value:"Define and Implement Config",id:"define-and-implement-config",level:3},{value:"Create CoolPlayer Source",id:"create-coolplayer-source",level:3},{value:"Initialize Source from Config",id:"initialize-source-from-config",level:3},{value:"Implement Play Object Transform",id:"implement-play-object-transform",level:3},{value:"Implement Stages",id:"implement-stages",level:3},{value:"Build Data",id:"build-data",level:4},{value:"Check Connection",id:"check-connection",level:4},{value:"Test Auth",id:"test-auth",level:4},{value:"Implement Polling",id:"implement-polling",level:3},{value:"Further Implementation",id:"further-implementation",level:2},{value:"Backlog",id:"backlog",level:3},{value:"Other Source Types",id:"other-source-types",level:3},{value:"Music History Source",id:"music-history-source",level:4},{value:"Non-Polling Source",id:"non-polling-source",level:4},{value:"Basic Source",id:"basic-source",level:4},{value:"Discovery",id:"discovery",level:5},{value:"Scrobbling",id:"scrobbling",level:5}];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,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["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 ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#common-development",children:"Common Development"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"scenario",children:"Scenario"}),"\n",(0,o.jsxs)(n.p,{children:["You are the developer of a fancy, new self-hosted web-based media player called ",(0,o.jsx)(n.strong,{children:"Cool Player."})," Cool Player has a slick interface and many bells and whistles, but most importantly it has an API. The API:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Has an unauthenticated health endpoint at ",(0,o.jsx)(n.code,{children:"/api/health"})," that returns ",(0,o.jsx)(n.code,{children:"200"})," if the service is running properly"]}),"\n",(0,o.jsxs)(n.li,{children:["Has authenticated endpoints that require a user-generated token in the header ",(0,o.jsx)(n.code,{children:"Authorization MY_TOKEN"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Has a ",(0,o.jsx)(n.code,{children:"/api/recent"})," endpoint that lists recently played tracks with a timestamp"]}),"\n",(0,o.jsxs)(n.li,{children:["Has a ",(0,o.jsx)(n.code,{children:"/api/now-playing"})," endpoint that returns information about the state of the player like current track, player position in the track, etc..."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["Cool Player is by default accessed on port ",(0,o.jsx)(n.code,{children:"6969"})]}),"\n",(0,o.jsxs)(n.li,{children:["Your personal instance of Cool Player is hosted at ",(0,o.jsx)(n.code,{children:"http://192.168.0.100:6969"})," and the api is accessed at ",(0,o.jsx)(n.code,{children:"http://192.168.0.100:6969/api"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Because there is an API that MS can actively read this will be a ",(0,o.jsx)(n.strong,{children:"polling"})," Source where MS sends requests to Cool Player to get scrobble information -- as opposed to an ",(0,o.jsx)(n.strong,{children:"ingress"})," Source like Jellyfin/Plex that uses webhooks from the service to send data to MS."]}),"\n",(0,o.jsx)(n.h2,{id:"minimal-implementation",children:"Minimal Implementation"}),"\n",(0,o.jsx)(n.h3,{id:"define-and-implement-config",children:"Define and Implement Config"}),"\n",(0,o.jsxs)(n.p,{children:["We will create a new config interface for Cool Player using the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#config",children:"Common Config"})," and tell MS it is a valid config that can be used."]}),"\n",(0,o.jsx)(n.p,{children:"Create a new file for your config:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="/src/backend/common/infrastructure/config/source/coolplayer.ts"',children:"import { PollingOptions } from \"../common.js\";\nimport { CommonSourceConfig, CommonSourceData } from \"./index.js\";\n\n// all of the required data for the Build Data and Test Auth stages (from Common Development docs)\n// should go here\nexport interface CoolPlayerSourceData extends CommonSourceData, PollingOptions {\n// remember to annotation your properties!\n\n /**\n * The user-generated token for Cool Player auth created in Cool Player -> Settings -> User -> Tokens\n *\n * @example f243331e-cf5b-49d7-846b-0845bdc965b4\n * */\n token: string\n /**\n * The host and port where Cool Player is hosted\n *\n * @example http://192.168.0.100:6969\n * */\n baseUrl: string\n}\n\nexport interface CoolPlayerSourceConfig extends CommonSourceConfig {\n data: CoolPlayerSourceData\n}\n\nexport interface CoolPlayerSourceAIOConfig extends CoolPlayerSourceConfig {\n // when using the all-in-one 'config.json' this is how users will identify this source\n type: 'coolplayer'\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Add the new interface to the list of valid interfaces for sources:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/common/infrastructure/config/source/sources.ts"',children:'import { ChromecastSourceAIOConfig, ChromecastSourceConfig } from "./chromecast.js";\n// ...\n// highlight-next-line\nimport { CoolPlayerSourceAIOConfig, CoolPlayerSourceConfig } from "./coolplayer.js";\n\nexport type SourceConfig =\n SpotifySourceConfig\n // ...\n // highlight-next-line\n | CoolPlayerSourceConfig;\n\nexport type SourceAIOConfig =\n SpotifySourceAIOConfig\n // ...\n // highlight-next-line\n | CoolPlayerSourceAIOConfig;\n'})}),"\n",(0,o.jsx)(n.p,{children:"Finally, add the source type identifier to the list of valid identifiers"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/common/infrastructure/Atomic.ts"',children:"export type SourceType =\n 'spotify'\n // ...\n // highlight-next-line\n | 'coolplayer';\n\nexport const sourceTypes: SourceType[] = [\n 'spotify',\n // ...\n // highlight-next-line\n 'coolplayer'\n];\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Now we will create a new Source inheriting from ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#concrete-class",children:(0,o.jsx)(n.code,{children:"AbstractComponent"})})," that:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"accepts our config interface"}),"\n",(0,o.jsxs)(n.li,{children:["implements a function to transform CoolPlayer's track data into a ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#play-object",children:(0,o.jsx)(n.strong,{children:"PlayObject"})})]}),"\n",(0,o.jsxs)(n.li,{children:["implements required ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stages",children:"stages"})]}),"\n",(0,o.jsx)(n.li,{children:"implements required methods to current player state and/or now playing track"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"create-coolplayer-source",children:"Create CoolPlayer Source"}),"\n",(0,o.jsxs)(n.p,{children:["First we create a new Source called ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," and setup our constructor to accept the config and ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-test-auth",children:"specify Auth behavior."})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/SpotifySource.ts"',children:'import { CoolPlayerSourceConfig } from "../common/infrastructure/config/source/coolplayer.js";\nimport MemorySource from "./MemorySource.js";\nimport {\n InternalConfig,\n} from "../common/infrastructure/Atomic.js";\n\n// MemorySource is the base class used for polling-type Sources\nexport default class CoolPlayerSource extends MemorySource {\n\n // type hints for TS to know what the base class config looks like\n declare config: CoolPlayerSourceConfig;\n\n constructor(name: any, config: CoolPlayerSourceConfig, internal: InternalConfig, emitter: EventEmitter) {\n super(\'coolplayer\', name, config, internal, emitter);\n\n // Cool Player required authentication\n this.requiresAuth = true;\n // but does not require user interaction for auth to work\n this.requiresAuthInteraction = false;\n // tells MS this is a Source that can be activity monitored through API\n this.canPoll = true;\n }\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"initialize-source-from-config",children:"Initialize Source from Config"}),"\n",(0,o.jsxs)(n.p,{children:["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 ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," when a ",(0,o.jsx)(n.code,{children:"coolplayer"})," config type is found."]}),"\n",(0,o.jsxs)(n.p,{children:["We modify ",(0,o.jsx)(n.code,{children:"ScrobbleSources.ts"})," to add ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," as an option:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/ScrobbleSources.ts"',children:"// ...\nimport { CoolPlayerSource, CoolPlayerData } from \"./CoolPlayerSource.js\";\n\nexport default class ScrobbleSources {\n // ...\n buildSourcesFromConfig = async (additionalConfigs: ParsedConfig[] = []) => {\n // ...\n\n // if CoolPlayerSource should be able to be built from ENVs only \n // then add it as a case statement here\n for (const sourceType of sourceTypes) {\n switch (sourceType) {\n // ...\n case 'musikcube':\n // ...\n break;\n // highlight-start\n case 'coolplayer':\n const cp = {\n baseUrl: process.env.COOL_URL,\n token: process.env.COOL_TOKEN\n }\n if (!Object.values(cp).every(x => x === undefined)) {\n configs.push({\n type: 'coolplayer',\n name: 'unnamed',\n source: 'ENV',\n mode: 'single',\n configureAs: defaultConfigureAs,\n data: cp as CoolPlayerData\n });\n }\n break;\n // highlight-end\n default:\n break;\n }\n }\n }\n\n // ...\n\n // (required) create new CoolPlayerSource if source config type is 'coolplayer'\n addSource = async (clientConfig: ParsedConfig, defaults: SourceDefaults = {}) => {\n // ...\n let newSource: AbstractSource;\n switch (type) {\n // ...\n case 'musikcube':\n // ...\n break;\n // highlight-start\n case 'coolplayer':\n newSource = await new CoolPlayerSource(name, compositeConfig as CoolPlayerSourceConfig, internal, this.emitter);\n break;\n // highlight-end\n default:\n break;\n }\n }\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"implement-play-object-transform",children:"Implement Play Object Transform"}),"\n",(0,o.jsxs)(n.p,{children:["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 ",(0,o.jsxs)(n.a,{href:"/multi-scrobbler/development/dev-common#play-object",children:[(0,o.jsx)(n.code,{children:"PlayObject"}),"."]})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:'import dayjs from "dayjs";\nimport {\n FormatPlayObjectOptions,\n} from "../common/infrastructure/Atomic.js";\nimport { PlayObject } from "../../core/Atomic.js";\n\nexport default class CoolPlayerSource extends MemorySource {\n // ...\n\n // \'obj\' should ideally be a real TS interface\n // if CoolPlayer has a ts/js client we would use that otherwise\n // we should build our own interfaces to represent track data from Cool Player\'s API\n static formatPlayObj(obj: any, options: FormatPlayObjectOptions = {}): PlayObject {\n const {\n trackName,\n artistName,\n albumName,\n duration,\n playedAt,\n } = obj;\n\n return {\n data: {\n artists: [artistName],\n album: albumName,\n track: trackName,\n // assuming seconds\n duration,\n // assuming playedAt is an ISO8601 timestamp\n playDate: dayjs(playedAt)\n },\n meta: {\n source: \'CoolPlayer\'\n }\n }\n }\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"implement-stages",children:"Implement Stages"}),"\n",(0,o.jsxs)(n.p,{children:["Next we will implement the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stages",children:"Stages"})," required to get CoolPlayerSource running."]}),"\n",(0,o.jsx)(n.h4,{id:"build-data",children:"Build Data"}),"\n",(0,o.jsxs)(n.p,{children:["First we implement the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-build-data",children:"Build Data Stage"}),". We will check that the ",(0,o.jsx)(n.code,{children:"token"})," and ",(0,o.jsx)(n.code,{children:"baseUrl"})," properties have been provided by the user. Additionally, we will parse the baseUrl and add default ports/prefix."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import { URL } from \"url\";\n// ...\n\nexport default class CoolPlayerSource extends MemorySource {\n\n baseUrl!: URL;\n\n // ...\n\n static parseConnectionUrl(val: string) {\n const normal = normalizeUrl(val, {removeTrailingSlash: false, normalizeProtocol: true})\n const url = new URL(normal);\n\n if (url.port === null || url.port === '') {\n url.port = '6969';\n }\n if (url.pathname === '/') {\n url.pathname = '/api/';\n }\n return url;\n }\n\n protected async doBuildInitData(): Promise {\n const {\n token,\n baseUrl\n } = this.config;\n if (token === null || token === undefined || (typeof token === 'string' && token.trim() === '')) {\n throw new Error(`'token' must be defined`);\n }\n\n if (baseUrl === null || baseUrl === undefined || (typeof baseUrl === 'string' && baseUrl.trim() === '')) {\n throw new Error(`'baseUrl' must be defined`);\n }\n try {\n this.baseUrl = CoolPlayerSource.parseConnectionUrl(baseUrl);\n } catch (e) {\n throw new Error(`Could not parse baseUrl: ${baseUrl}`, {cause: e});\n }\n\n this.logger.verbose(`Config URL: ${baseUrl} => Normalized: '${this.url.toString()}'`);\n return true;\n }\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"check-connection",children:"Check Connection"}),"\n",(0,o.jsxs)(n.p,{children:["Second we will implement the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-check-connection",children:"Check Connection Stage"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport { UpstreamError } from \"../common/errors/UpstreamError.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n // ...\n\n protected async doCheckConnection(): Promise {\n try {\n const resp = await request.get(`${this.baseUrl}/health`);\n return true;\n // if /health returned version info we could instead read response and return a string with version info for visibility to the user\n // return `Cool Player Version: ${resp.body.version}`;\n } catch (e) {\n throw e;\n }\n }\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"test-auth",children:"Test Auth"}),"\n",(0,o.jsxs)(n.p,{children:["Finally, we will implement ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-test-auth",children:"Auth Test Stage"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport { UpstreamError } from \"../common/errors/UpstreamError.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n // ...\n\n doAuthentication = async () => {\n try {\n const resp = await request\n .get(`${this.baseUrl}/recent`)\n .set('Authorization', `Token ${this.config.token}`);\n return true;\n } catch (e) {\n // if Cool Player returned an error as json we could parse it from error body and throw new Error with the message\n throw e;\n }\n }\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"implement-polling",children:"Implement Polling"}),"\n",(0,o.jsxs)(n.p,{children:["The majority of Sources MS monitors primarily operate as a source of truth for a ",(0,o.jsx)(n.strong,{children:"music player"})," rather than a ",(0,o.jsx)(n.strong,{children:"played music history."})," Only Listenbrainz and Last.fm operate as a source of music history."]}),"\n",(0,o.jsxs)(n.p,{children:["To this end, MS implements a ",(0,o.jsx)(n.a,{href:"https://www.freecodecamp.org/news/state-machines-basics-of-computer-science-d42855debc66/",children:"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 ',(0,o.jsx)(n.code,{children:"MemorySource"})," which our ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," inherits from."]}),"\n",(0,o.jsxs)(n.p,{children:["For a polling Source to work properly we need to implement a function, ",(0,o.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/sources/AbstractSource.ts#L92",children:(0,o.jsx)(n.code,{children:"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.']}),"\n",(0,o.jsxs)(n.p,{children:["To take advantage of the ",(0,o.jsx)(n.code,{children:"MemorySource"})," state machine we will additionally use ",(0,o.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/sources/MemorySource.ts#L113",children:(0,o.jsx)(n.code,{children:"processRecentPlays"})})," from ",(0,o.jsx)(n.code,{children:"MemorySource"})," inside ",(0,o.jsx)(n.code,{children:"getRecentlyPlayed"}),". We pass track and/or player state returned from the Source service to ",(0,o.jsx)(n.code,{children:"processRecentPlayers"}),". It then takes care of deriving Source player state based on how this data changes over time. The advantage to using ",(0,o.jsx)(n.code,{children:"processRecentPlays"})," is that our Source service does not necessarily need to pass any player information -- as long as the track info has a ",(0,o.jsx)(n.strong,{children:"duration"})," we can more-or-less determine if it has been played long enough to scrobble."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport {\n SourceData,\n PlayerStateData,\n SINGLE_USER_PLATFORM_ID\n} from \"../common/infrastructure/Atomic.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n // ...\n\n protected async getRecentlyPlayed(options: RecentlyPlayedOptions = {}): Promise {\n const plays: SourceData[] = [];\n try {\n // currently playing tracks/player state data\n const resp = await request\n .get(`${this.baseUrl}/now-playing`)\n .set('Authorization', `Token ${this.config.token}`);\n const {\n body: {\n playerState, // 'playing' or 'stopped' or 'paused'...\n position, // number of seconds into the track IE at position 48 -> ( 0:48/3:56 in player UI )\n play: { /* track data */}\n }\n } = resp;\n\n // transform into standard player state data\n const playerData: PlayerStateData = {\n platformId: SINGLE_USER_PLATFORM_ID,\n play: CoolPlayerSource.formatPlayObj(play),\n position\n };\n\n // if Cool Player does return player state we can also push a regular PlayObject to this list\n plays.push(playerData);\n } catch (e) {\n throw e;\n }\n\n // process player state through state machine\n // if the track changes or player state changes\n // and currently played track has been listened to long enough to be scrobbled it will return in newPlays\n const newPlays = this.processRecentPlays(plays);\n\n // finally, we return new plays and MS checks to see if they have been previously seen \n // before signalling to Clients that they can be scrobbled\n return newPlays;\n }\n}\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Congratulations! Your ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," has been minimally implemented and can now be used in multi-scrobbler."]}),"\n",(0,o.jsx)(n.h2,{id:"further-implementation",children:"Further Implementation"}),"\n",(0,o.jsx)(n.h3,{id:"backlog",children:"Backlog"}),"\n",(0,o.jsx)(n.p,{children:'To have your Source try to scrobble "missed" tracks when MS starts up the Source\'s service must be able to provide:'}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"track information"}),"\n",(0,o.jsx)(n.li,{children:"timestamp of when the track was played"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["In your Source implement ",(0,o.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/sources/AbstractSource.ts#L235",children:(0,o.jsx)(n.code,{children:"getBackloggedPlays"})})," and set setting in constructor indicating it has backlogging capabilities:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport {\n PlayObject,\n} from \"../common/infrastructure/Atomic.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n constructor(/* ... */) {\n super(/* ... */);\n // ...\n\n // tell MS it should try to get backlogged tracks on startup\n this.canBacklog = true;\n }\n\n // ...\n\n protected getBackloggedPlays = async (options: RecentlyPlayedOptions): Promise => {\n try {\n const resp = await request\n .get(`${this.baseUrl}/recent`)\n .set('Authorization', `Token ${this.config.token}`);\n\n // assuming list from body looks like track info returned in \n // \"Implement Play Object Transform\" section\n const {\n body = []\n } = resp;\n\n return body.map(x => CoolPlayerSource.formatPlayObj(x));\n } catch (e) {\n throw new Error('Error occurred while getting recently played', {cause: e});\n }\n\n }\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"other-source-types",children:"Other Source Types"}),"\n",(0,o.jsx)(n.p,{children:"There are some scenarios where polling and/or state machine is not the right tool to handle determining if incoming data should be scrobbled:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"The Source service handles scrobble threshold internally, the data being received should always be scrobbled (WebScrobbler, Plex, Tautulli, Listenbrainz, Last.fm)"}),"\n",(0,o.jsx)(n.li,{children:"You prefer to handle the scrobble determination yourself"}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"music-history-source",children:"Music History Source"}),"\n",(0,o.jsxs)(n.p,{children:["If the Source is still polling but the track returned should always be scrobbled if not already seen IE the Source service is a ",(0,o.jsx)(n.strong,{children:"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:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:'import { SOURCE_SOT } from "../../core/Atomic.js";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n constructor(/* ... */) {\n super(/* ... */);\n // ...\n\n // tell MS it should immediately scrobble any new, unseen tracks from the upstream service\n this.playerSourceOfTruth = SOURCE_SOT.HISTORY;\n }\n}\n'})}),"\n",(0,o.jsx)(n.h4,{id:"non-polling-source",children:"Non-Polling Source"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"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."]}),"\n",(0,o.jsxs)(n.p,{children:["For these Sources you will need to implement endpoints in ",(0,o.jsx)(n.code,{children:"src/service/api.ts"})," and corresponding files. See the existing Sources in the project as references for how to do this."]}),"\n",(0,o.jsxs)(n.p,{children:["You may still wish to use the state machine ",(0,o.jsx)(n.code,{children:"MemorySource"}),' (like Jellyfin) if the events received are not "scrobble" events but instead of implementing ',(0,o.jsx)(n.code,{children:"getRecentlyPlayed"})," you will implement your own function in your Source class, like ",(0,o.jsx)(n.code,{children:"handle()"}),", that receives data and then uses ",(0,o.jsx)(n.code,{children:"processRecentPlays"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"After new plays have been determined see the next section for how to scrobble..."}),"\n",(0,o.jsx)(n.h4,{id:"basic-source",children:"Basic Source"}),"\n",(0,o.jsxs)(n.p,{children:["At the core of a Source that implements ",(0,o.jsx)(n.code,{children:"AbstractSource"}),"'s functionality is the ability to ",(0,o.jsx)(n.strong,{children:"Discover"})," and ",(0,o.jsx)(n.strong,{children:"Scrobble"})," plays."]}),"\n",(0,o.jsxs)(n.p,{children:["These functions are not seen in the MVP ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," because they are automatically done by the polling functionality after being returned from ",(0,o.jsx)(n.code,{children:"getRecentlyPlayed"}),"."]}),"\n",(0,o.jsx)(n.h5,{id:"discovery",children:"Discovery"}),"\n",(0,o.jsxs)(n.p,{children:['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 -- ',(0,o.jsx)(n.code,{children:"AbstractSource"})," and ",(0,o.jsx)(n.code,{children:"discover()"})," will take care of that for you."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/MyBasicSource.ts"',children:'export default class MyBasicSource extends AbstractSource {\n handle(somePlay: PlayObject) {\n // if the track is "new" and not seen before it is returned in the discovered list\n // we then know it is OK to be sent to Clients for scrobbling\n const discovered: PlayObject[] = this.discover([somePlay]);\n }\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:'This additionally will be surfaced to the user in the Dashboard in the "Tracks Discovered" page.'}),"\n",(0,o.jsx)(n.h5,{id:"scrobbling",children:"Scrobbling"}),"\n",(0,o.jsx)(n.p,{children:"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."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/MyBasicSource.ts"',children:"export default class MyBasicSourceSource extends AbstractSource {\n handle(somePlay: PlayObject) {\n const discovered: PlayObject[] = this.discover([somePlay]);\n // emit plays that can be scrobbled by clients\n this.scrobble(discovered);\n }\n}\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If your service only emits an event when a play is scrobbled you can ",(0,o.jsx)(n.em,{children:"technically"})," skip using ",(0,o.jsx)(n.code,{children:"discover()"})," but it is good practice to use it unless you have a very good reason not to."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["Using ",(0,o.jsx)(n.code,{children:"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.']})})]})}function h(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/33c4ed3f.96b3612f.js b/assets/js/33c4ed3f.96b3612f.js deleted file mode 100644 index e8ed2571..00000000 --- a/assets/js/33c4ed3f.96b3612f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["429"],{8779(e,n,r){r.r(n),r.d(n,{metadata:()=>t,default:()=>h,frontMatter:()=>i,contentTitle:()=>a,toc:()=>c,assets:()=>l});var t=JSON.parse('{"id":"development/dev-source","title":"Source Development/Tutorial","description":"Developing a new Source","source":"@site/docs/development/dev-source.md","sourceDirName":"development","slug":"/development/dev-source","permalink":"/multi-scrobbler/development/dev-source","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/development/dev-source.md?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"sidebar_position":2,"title":"Source Development/Tutorial","description":"Developing a new Source"},"sidebar":"tutorialSidebar","previous":{"title":"Common Development","permalink":"/multi-scrobbler/development/dev-common"},"next":{"title":"Flatpak","permalink":"/multi-scrobbler/development/flatpak"}}'),o=r(4848),s=r(8453);let i={toc_min_heading_level:2,toc_max_heading_level:5,sidebar_position:2,title:"Source Development/Tutorial",description:"Developing a new Source"},a,l={},c=[{value:"Scenario",id:"scenario",level:2},{value:"Minimal Implementation",id:"minimal-implementation",level:2},{value:"Define and Implement Config",id:"define-and-implement-config",level:3},{value:"Create CoolPlayer Source",id:"create-coolplayer-source",level:3},{value:"Initialize Source from Config",id:"initialize-source-from-config",level:3},{value:"Implement Play Object Transform",id:"implement-play-object-transform",level:3},{value:"Implement Stages",id:"implement-stages",level:3},{value:"Build Data",id:"build-data",level:4},{value:"Check Connection",id:"check-connection",level:4},{value:"Test Auth",id:"test-auth",level:4},{value:"Implement Polling",id:"implement-polling",level:3},{value:"Further Implementation",id:"further-implementation",level:2},{value:"Backlog",id:"backlog",level:3},{value:"Other Source Types",id:"other-source-types",level:3},{value:"Music History Source",id:"music-history-source",level:4},{value:"Non-Polling Source",id:"non-polling-source",level:4},{value:"Basic Source",id:"basic-source",level:4},{value:"Discovery",id:"discovery",level:5},{value:"Scrobbling",id:"scrobbling",level:5}];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,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["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 ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#common-development",children:"Common Development"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"scenario",children:"Scenario"}),"\n",(0,o.jsxs)(n.p,{children:["You are the developer of a fancy, new self-hosted web-based media player called ",(0,o.jsx)(n.strong,{children:"Cool Player."})," Cool Player has a slick interface and many bells and whistles, but most importantly it has an API. The API:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Has an unauthenticated health endpoint at ",(0,o.jsx)(n.code,{children:"/api/health"})," that returns ",(0,o.jsx)(n.code,{children:"200"})," if the service is running properly"]}),"\n",(0,o.jsxs)(n.li,{children:["Has authenticated endpoints that require a user-generated token in the header ",(0,o.jsx)(n.code,{children:"Authorization MY_TOKEN"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Has a ",(0,o.jsx)(n.code,{children:"/api/recent"})," endpoint that lists recently played tracks with a timestamp"]}),"\n",(0,o.jsxs)(n.li,{children:["Has a ",(0,o.jsx)(n.code,{children:"/api/now-playing"})," endpoint that returns information about the state of the player like current track, player position in the track, etc..."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["Cool Player is by default accessed on port ",(0,o.jsx)(n.code,{children:"6969"})]}),"\n",(0,o.jsxs)(n.li,{children:["Your personal instance of Cool Player is hosted at ",(0,o.jsx)(n.code,{children:"http://192.168.0.100:6969"})," and the api is accessed at ",(0,o.jsx)(n.code,{children:"http://192.168.0.100:6969/api"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Because there is an API that MS can actively read this will be a ",(0,o.jsx)(n.strong,{children:"polling"})," Source where MS sends requests to Cool Player to get scrobble information -- as opposed to an ",(0,o.jsx)(n.strong,{children:"ingress"})," Source like Jellyfin/Plex that uses webhooks from the service to send data to MS."]}),"\n",(0,o.jsx)(n.h2,{id:"minimal-implementation",children:"Minimal Implementation"}),"\n",(0,o.jsx)(n.h3,{id:"define-and-implement-config",children:"Define and Implement Config"}),"\n",(0,o.jsxs)(n.p,{children:["We will create a new config interface for Cool Player using the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#config",children:"Common Config"})," and tell MS it is a valid config that can be used."]}),"\n",(0,o.jsx)(n.p,{children:"Create a new file for your config:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="/src/backend/common/infrastructure/config/source/coolplayer.ts"',children:"import { PollingOptions } from \"../common.js\";\nimport { CommonSourceConfig, CommonSourceData } from \"./index.js\";\n\n// all of the required data for the Build Data and Test Auth stages (from Common Development docs)\n// should go here\nexport interface CoolPlayerSourceData extends CommonSourceData, PollingOptions {\n// remember to annotation your properties!\n\n /**\n * The user-generated token for Cool Player auth created in Cool Player -> Settings -> User -> Tokens\n *\n * @example f243331e-cf5b-49d7-846b-0845bdc965b4\n * */\n token: string\n /**\n * The host and port where Cool Player is hosted\n *\n * @example http://192.168.0.100:6969\n * */\n baseUrl: string\n}\n\nexport interface CoolPlayerSourceConfig extends CommonSourceConfig {\n data: CoolPlayerSourceData\n}\n\nexport interface CoolPlayerSourceAIOConfig extends CoolPlayerSourceConfig {\n // when using the all-in-one 'config.json' this is how users will identify this source\n type: 'coolplayer'\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Add the new interface to the list of valid interfaces for sources:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/common/infrastructure/config/source/sources.ts"',children:'import { ChromecastSourceAIOConfig, ChromecastSourceConfig } from "./chromecast.js";\n// ...\n// highlight-next-line\nimport { CoolPlayerSourceAIOConfig, CoolPlayerSourceConfig } from "./coolplayer.js";\n\nexport type SourceConfig =\n SpotifySourceConfig\n // ...\n // highlight-next-line\n | CoolPlayerSourceConfig;\n\nexport type SourceAIOConfig =\n SpotifySourceAIOConfig\n // ...\n // highlight-next-line\n | CoolPlayerSourceAIOConfig;\n'})}),"\n",(0,o.jsx)(n.p,{children:"Finally, add the source type identifier to the list of valid identifiers"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/common/infrastructure/Atomic.ts"',children:"export type SourceType =\n 'spotify'\n // ...\n // highlight-next-line\n | 'coolplayer';\n\nexport const sourceTypes: SourceType[] = [\n 'spotify',\n // ...\n // highlight-next-line\n 'coolplayer'\n];\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Now we will create a new Source inheriting from ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#concrete-class",children:(0,o.jsx)(n.code,{children:"AbstractComponent"})})," that:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"accepts our config interface"}),"\n",(0,o.jsxs)(n.li,{children:["implements a function to transform CoolPlayer's track data into a ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#play-object",children:(0,o.jsx)(n.strong,{children:"PlayObject"})})]}),"\n",(0,o.jsxs)(n.li,{children:["implements required ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stages",children:"stages"})]}),"\n",(0,o.jsx)(n.li,{children:"implements required methods to current player state and/or now playing track"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"create-coolplayer-source",children:"Create CoolPlayer Source"}),"\n",(0,o.jsxs)(n.p,{children:["First we create a new Source called ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," and setup our constructor to accept the config and ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-test-auth",children:"specify Auth behavior."})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/SpotifySource.ts"',children:'import { CoolPlayerSourceConfig } from "../common/infrastructure/config/source/coolplayer.js";\nimport MemorySource from "./MemorySource.js";\nimport {\n InternalConfig,\n} from "../common/infrastructure/Atomic.js";\n\n// MemorySource is the base class used for polling-type Sources\nexport default class CoolPlayerSource extends MemorySource {\n\n // type hints for TS to know what the base class config looks like\n declare config: CoolPlayerSourceConfig;\n\n constructor(name: any, config: CoolPlayerSourceConfig, internal: InternalConfig, emitter: EventEmitter) {\n super(\'coolplayer\', name, config, internal, emitter);\n\n // Cool Player required authentication\n this.requiresAuth = true;\n // but does not require user interaction for auth to work\n this.requiresAuthInteraction = false;\n // tells MS this is a Source that can be activity monitored through API\n this.canPoll = true;\n }\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"initialize-source-from-config",children:"Initialize Source from Config"}),"\n",(0,o.jsxs)(n.p,{children:["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 ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," when a ",(0,o.jsx)(n.code,{children:"coolplayer"})," config type is found."]}),"\n",(0,o.jsxs)(n.p,{children:["We modify ",(0,o.jsx)(n.code,{children:"ScrobbleSources.ts"})," to add ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," as an option:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/ScrobbleSources.ts"',children:"// ...\nimport { CoolPlayerSource, CoolPlayerData } from \"./CoolPlayerSource.js\";\n\nexport default class ScrobbleSources {\n // ...\n buildSourcesFromConfig = async (additionalConfigs: ParsedConfig[] = []) => {\n // ...\n\n // if CoolPlayerSource should be able to be built from ENVs only \n // then add it as a case statement here\n for (const sourceType of sourceTypes) {\n switch (sourceType) {\n // ...\n case 'musikcube':\n // ...\n break;\n // highlight-start\n case 'coolplayer':\n const cp = {\n baseUrl: process.env.COOL_URL,\n token: process.env.COOL_TOKEN\n }\n if (!Object.values(cp).every(x => x === undefined)) {\n configs.push({\n type: 'coolplayer',\n name: 'unnamed',\n source: 'ENV',\n mode: 'single',\n configureAs: defaultConfigureAs,\n data: cp as CoolPlayerData\n });\n }\n break;\n // highlight-end\n default:\n break;\n }\n }\n }\n\n // ...\n\n // (required) create new CoolPlayerSource if source config type is 'coolplayer'\n addSource = async (clientConfig: ParsedConfig, defaults: SourceDefaults = {}) => {\n // ...\n let newSource: AbstractSource;\n switch (type) {\n // ...\n case 'musikcube':\n // ...\n break;\n // highlight-start\n case 'coolplayer':\n newSource = await new CoolPlayerSource(name, compositeConfig as CoolPlayerSourceConfig, internal, this.emitter);\n break;\n // highlight-end\n default:\n break;\n }\n }\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"implement-play-object-transform",children:"Implement Play Object Transform"}),"\n",(0,o.jsxs)(n.p,{children:["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 ",(0,o.jsxs)(n.a,{href:"/multi-scrobbler/development/dev-common#play-object",children:[(0,o.jsx)(n.code,{children:"PlayObject"}),"."]})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:'import dayjs from "dayjs";\nimport {\n FormatPlayObjectOptions,\n} from "../common/infrastructure/Atomic.js";\nimport { PlayObject } from "../../core/Atomic.js";\n\nexport default class CoolPlayerSource extends MemorySource {\n // ...\n\n // \'obj\' should ideally be a real TS interface\n // if CoolPlayer has a ts/js client we would use that otherwise\n // we should build our own interfaces to represent track data from Cool Player\'s API\n static formatPlayObj(obj: any, options: FormatPlayObjectOptions = {}): PlayObject {\n const {\n trackName,\n artistName,\n albumName,\n duration,\n playedAt,\n } = obj;\n\n return {\n data: {\n artists: [artistName],\n album: albumName,\n track: trackName,\n // assuming seconds\n duration,\n // assuming playedAt is an ISO8601 timestamp\n playDate: dayjs(playedAt)\n },\n meta: {\n source: \'CoolPlayer\'\n }\n }\n }\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"implement-stages",children:"Implement Stages"}),"\n",(0,o.jsxs)(n.p,{children:["Next we will implement the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stages",children:"Stages"})," required to get CoolPlayerSource running."]}),"\n",(0,o.jsx)(n.h4,{id:"build-data",children:"Build Data"}),"\n",(0,o.jsxs)(n.p,{children:["First we implement the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-build-data",children:"Build Data Stage"}),". We will check that the ",(0,o.jsx)(n.code,{children:"token"})," and ",(0,o.jsx)(n.code,{children:"baseUrl"})," properties have been provided by the user. Additionally, we will parse the baseUrl and add default ports/prefix."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import { URL } from \"url\";\n// ...\n\nexport default class CoolPlayerSource extends MemorySource {\n\n baseUrl!: URL;\n\n // ...\n\n static parseConnectionUrl(val: string) {\n const normal = normalizeUrl(val, {removeTrailingSlash: false, normalizeProtocol: true})\n const url = new URL(normal);\n\n if (url.port === null || url.port === '') {\n url.port = '6969';\n }\n if (url.pathname === '/') {\n url.pathname = '/api/';\n }\n return url;\n }\n\n protected async doBuildInitData(): Promise {\n const {\n token,\n baseUrl\n } = this.config;\n if (token === null || token === undefined || (typeof token === 'string' && token.trim() === '')) {\n throw new Error(`'token' must be defined`);\n }\n\n if (baseUrl === null || baseUrl === undefined || (typeof baseUrl === 'string' && baseUrl.trim() === '')) {\n throw new Error(`'baseUrl' must be defined`);\n }\n try {\n this.baseUrl = CoolPlayerSource.parseConnectionUrl(baseUrl);\n } catch (e) {\n throw new Error(`Could not parse baseUrl: ${baseUrl}`, {cause: e});\n }\n\n this.logger.verbose(`Config URL: ${baseUrl} => Normalized: '${this.url.toString()}'`);\n return true;\n }\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"check-connection",children:"Check Connection"}),"\n",(0,o.jsxs)(n.p,{children:["Second we will implement the ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-check-connection",children:"Check Connection Stage"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport { UpstreamError } from \"../common/errors/UpstreamError.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n // ...\n\n protected async doCheckConnection(): Promise {\n try {\n const resp = await request.get(`${this.baseUrl}/health`);\n return true;\n // if /health returned version info we could instead read response and return a string with version info for visibility to the user\n // return `Cool Player Version: ${resp.body.version}`;\n } catch (e) {\n throw e;\n }\n }\n}\n"})}),"\n",(0,o.jsx)(n.h4,{id:"test-auth",children:"Test Auth"}),"\n",(0,o.jsxs)(n.p,{children:["Finally, we will implement ",(0,o.jsx)(n.a,{href:"/multi-scrobbler/development/dev-common#stage-test-auth",children:"Auth Test Stage"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport { UpstreamError } from \"../common/errors/UpstreamError.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n // ...\n\n doAuthentication = async () => {\n try {\n const resp = await request\n .get(`${this.baseUrl}/recent`)\n .set('Authorization', `Token ${this.config.token}`);\n return true;\n } catch (e) {\n // if Cool Player returned an error as json we could parse it from error body and throw new Error with the message\n throw e;\n }\n }\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"implement-polling",children:"Implement Polling"}),"\n",(0,o.jsxs)(n.p,{children:["The majority of Sources MS monitors primarily operate as a source of truth for a ",(0,o.jsx)(n.strong,{children:"music player"})," rather than a ",(0,o.jsx)(n.strong,{children:"played music history."})," Only Listenbrainz and Last.fm operate as a source of music history."]}),"\n",(0,o.jsxs)(n.p,{children:["To this end, MS implements a ",(0,o.jsx)(n.a,{href:"https://www.freecodecamp.org/news/state-machines-basics-of-computer-science-d42855debc66/",children:"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 ',(0,o.jsx)(n.code,{children:"MemorySource"})," which our ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," inherits from."]}),"\n",(0,o.jsxs)(n.p,{children:["For a polling Source to work properly we need to implement a function, ",(0,o.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/sources/AbstractSource.ts#L92",children:(0,o.jsx)(n.code,{children:"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.']}),"\n",(0,o.jsxs)(n.p,{children:["To take advantage of the ",(0,o.jsx)(n.code,{children:"MemorySource"})," state machine we will additionally use ",(0,o.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/sources/MemorySource.ts#L113",children:(0,o.jsx)(n.code,{children:"processRecentPlays"})})," from ",(0,o.jsx)(n.code,{children:"MemorySource"})," inside ",(0,o.jsx)(n.code,{children:"getRecentlyPlayed"}),". We pass track and/or player state returned from the Source service to ",(0,o.jsx)(n.code,{children:"processRecentPlayers"}),". It then takes care of deriving Source player state based on how this data changes over time. The advantage to using ",(0,o.jsx)(n.code,{children:"processRecentPlays"})," is that our Source service does not necessarily need to pass any player information -- as long as the track info has a ",(0,o.jsx)(n.strong,{children:"duration"})," we can more-or-less determine if it has been played long enough to scrobble."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport {\n SourceData,\n PlayerStateData,\n SINGLE_USER_PLATFORM_ID\n} from \"../common/infrastructure/Atomic.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n // ...\n\n protected async getRecentlyPlayed(options: RecentlyPlayedOptions = {}): Promise {\n const plays: SourceData[] = [];\n try {\n // currently playing tracks/player state data\n const resp = await request\n .get(`${this.baseUrl}/now-playing`)\n .set('Authorization', `Token ${this.config.token}`);\n const {\n body: {\n playerState, // 'playing' or 'stopped' or 'paused'...\n position, // number of seconds into the track IE at position 48 -> ( 0:48/3:56 in player UI )\n play: { /* track data */}\n }\n } = resp;\n\n // transform into standard player state data\n const playerData: PlayerStateData = {\n platformId: SINGLE_USER_PLATFORM_ID,\n play: CoolPlayerSource.formatPlayObj(play),\n position\n };\n\n // if Cool Player does return player state we can also push a regular PlayObject to this list\n plays.push(playerData);\n } catch (e) {\n throw e;\n }\n\n // process player state through state machine\n // if the track changes or player state changes\n // and currently played track has been listened to long enough to be scrobbled it will return in newPlays\n const newPlays = this.processRecentPlays(plays);\n\n // finally, we return new plays and MS checks to see if they have been previously seen \n // before signalling to Clients that they can be scrobbled\n return newPlays;\n }\n}\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Congratulations! Your ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," has been minimally implemented and can now be used in multi-scrobbler."]}),"\n",(0,o.jsx)(n.h2,{id:"further-implementation",children:"Further Implementation"}),"\n",(0,o.jsx)(n.h3,{id:"backlog",children:"Backlog"}),"\n",(0,o.jsx)(n.p,{children:'To have your Source try to scrobble "missed" tracks when MS starts up the Source\'s service must be able to provide:'}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"track information"}),"\n",(0,o.jsx)(n.li,{children:"timestamp of when the track was played"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["In your Source implement ",(0,o.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/sources/AbstractSource.ts#L235",children:(0,o.jsx)(n.code,{children:"getBackloggedPlays"})})," and set setting in constructor indicating it has backlogging capabilities:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:"import request from 'superagent';\nimport {\n PlayObject,\n} from \"../common/infrastructure/Atomic.js\";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n constructor(/* ... */) {\n super(/* ... */);\n // ...\n\n // tell MS it should try to get backlogged tracks on startup\n this.canBacklog = true;\n }\n\n // ...\n\n protected getBackloggedPlays = async (options: RecentlyPlayedOptions): Promise => {\n try {\n const resp = await request\n .get(`${this.baseUrl}/recent`)\n .set('Authorization', `Token ${this.config.token}`);\n\n // assuming list from body looks like track info returned in \n // \"Implement Play Object Transform\" section\n const {\n body = []\n } = resp;\n\n return body.map(x => CoolPlayerSource.formatPlayObj(x));\n } catch (e) {\n throw new Error('Error occurred while getting recently played', {cause: e});\n }\n\n }\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"other-source-types",children:"Other Source Types"}),"\n",(0,o.jsx)(n.p,{children:"There are some scenarios where polling and/or state machine is not the right tool to handle determining if incoming data should be scrobbled:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"The Source service handles scrobble threshold internally, the data being received should always be scrobbled (WebScrobbler, Plex, Tautulli, Listenbrainz, Last.fm)"}),"\n",(0,o.jsx)(n.li,{children:"You prefer to handle the scrobble determination yourself"}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"music-history-source",children:"Music History Source"}),"\n",(0,o.jsxs)(n.p,{children:["If the Source is still polling but the track returned should always be scrobbled if not already seen IE the Source service is a ",(0,o.jsx)(n.strong,{children:"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:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/CoolPlayerSource.ts"',children:'import { SOURCE_SOT } from "../../core/Atomic.js";\n// ...\nexport default class CoolPlayerSource extends MemorySource {\n\n constructor(/* ... */) {\n super(/* ... */);\n // ...\n\n // tell MS it should immediately scrobble any new, unseen tracks from the upstream service\n this.playerSourceOfTruth = SOURCE_SOT.HISTORY;\n }\n}\n'})}),"\n",(0,o.jsx)(n.h4,{id:"non-polling-source",children:"Non-Polling Source"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"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."]}),"\n",(0,o.jsxs)(n.p,{children:["For these Sources you will need to implement endpoints in ",(0,o.jsx)(n.code,{children:"src/service/api.ts"})," and corresponding files. See the existing Sources in the project as references for how to do this."]}),"\n",(0,o.jsxs)(n.p,{children:["You may still wish to use the state machine ",(0,o.jsx)(n.code,{children:"MemorySource"}),' (like Jellyfin) if the events received are not "scrobble" events but instead of implementing ',(0,o.jsx)(n.code,{children:"getRecentlyPlayed"})," you will implement your own function in your Source class, like ",(0,o.jsx)(n.code,{children:"handle()"}),", that receives data and then uses ",(0,o.jsx)(n.code,{children:"processRecentPlays"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"After new plays have been determined see the next section for how to scrobble..."}),"\n",(0,o.jsx)(n.h4,{id:"basic-source",children:"Basic Source"}),"\n",(0,o.jsxs)(n.p,{children:["At the core of a Source that implements ",(0,o.jsx)(n.code,{children:"AbstractSource"}),"'s functionality is the ability to ",(0,o.jsx)(n.strong,{children:"Discover"})," and ",(0,o.jsx)(n.strong,{children:"Scrobble"})," plays."]}),"\n",(0,o.jsxs)(n.p,{children:["These functions are not seen in the MVP ",(0,o.jsx)(n.code,{children:"CoolPlayerSource"})," because they are automatically done by the polling functionality after being returned from ",(0,o.jsx)(n.code,{children:"getRecentlyPlayed"}),"."]}),"\n",(0,o.jsx)(n.h5,{id:"discovery",children:"Discovery"}),"\n",(0,o.jsxs)(n.p,{children:['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 -- ',(0,o.jsx)(n.code,{children:"AbstractSource"})," and ",(0,o.jsx)(n.code,{children:"discover()"})," will take care of that for you."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/MyBasicSource.ts"',children:'export default class MyBasicSource extends AbstractSource {\n handle(somePlay: PlayObject) {\n // if the track is "new" and not seen before it is returned in the discovered list\n // we then know it is OK to be sent to Clients for scrobbling\n const discovered: PlayObject[] = this.discover([somePlay]);\n }\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:'This additionally will be surfaced to the user in the Dashboard in the "Tracks Discovered" page.'}),"\n",(0,o.jsx)(n.h5,{id:"scrobbling",children:"Scrobbling"}),"\n",(0,o.jsx)(n.p,{children:"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."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ts",metastring:'title="src/backend/sources/MyBasicSource.ts"',children:"export default class MyBasicSourceSource extends AbstractSource {\n handle(somePlay: PlayObject) {\n const discovered: PlayObject[] = this.discover([somePlay]);\n // emit plays that can be scrobbled by clients\n this.scrobble(discovered);\n }\n}\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If your service only emits an event when a play is scrobbled you can ",(0,o.jsx)(n.em,{children:"technically"})," skip using ",(0,o.jsx)(n.code,{children:"discover()"})," but it is good practice to use it unless you have a very good reason not to."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["Using ",(0,o.jsx)(n.code,{children:"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.']})})]})}function h(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/3827a595.6079a539.js b/assets/js/3827a595.6079a539.js deleted file mode 100644 index 154c267a..00000000 --- a/assets/js/3827a595.6079a539.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6412"],{1046(e,s,n){n.r(s),n.d(s,{metadata:()=>r,default:()=>x,frontMatter:()=>h,contentTitle:()=>d,toc:()=>f,assets:()=>u});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/lastfm-endpoint.mdx?plain=1","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"}}'),t=n(4848),i=n(8453),o=n(8194),l=n(698);function a(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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:(0,t.jsx)(s.em,{children:(0,t.jsx)(s.strong,{children:(0,t.jsx)(s.code,{children:"LFM_ID"})})})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsxs)(s.td,{children:["A globally unique ID EX ",(0,t.jsx)(s.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_NAME"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsxs)(s.td,{children:["Value of ",(0,t.jsx)(s.code,{children:"LFM_ID"})]}),(0,t.jsxs)(s.td,{children:["A vanity name EX ",(0,t.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_ENABLE"})}),(0,t.jsx)(s.td,{children:"boolean"}),(0,t.jsx)(s.td,{children:"true"}),(0,t.jsx)(s.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_SLUG"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsxs)(s.td,{children:["When using ",(0,t.jsx)(s.strong,{children:"multiple sources without apikey/user"}),", or ",(0,t.jsx)(s.strong,{children:"not"})," using the standard base URL, this is the URL base path that should be used to identify scrobbles for this source"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_USERNAME"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"A fake username to differentiate LFM Endpoint Sources"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_API_KEY"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"A fake api key to differentiate LFM Endpoint Sources"})]})]})]})}function c(e={}){let{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}n(2170);let h={title:"Lastfm (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},d,u={},f=[{value:"Setup",id:"setup",level:2},{value:"Standard Base URL",id:"standard-base-url",level:3},{value:"Authentication",id:"authentication",level:3},{value:"Multiple Sources",id:"multiple-sources",level:3},{value:"Troubleshooting URL",id:"troubleshooting-url",level:2},{value:"Verify URL Format",id:"verify-url-format",level:4},{value:"Is MS is Reachable?",id:"is-ms-is-reachable",level:4},{value:"Service Logging",id:"service-logging",level:4},{value:"Configuration",id:"configuration",level:2}];function p(e){let s={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:n,DetailsAdmo:r}=s;return n||m("Config",!0),r||m("DetailsAdmo",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server."}),"\n",(0,t.jsx)(s.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To ",(0,t.jsx)(s.strong,{children:"scrobble to"})," Last.fm, create a ",(0,t.jsx)(s.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,t.jsxs)(s.li,{children:["To monitor and re-scrobble activity from your Last.fm account, create a ",(0,t.jsx)(s.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n"]})}),"\n",(0,t.jsxs)(r,{type:"tip",summary:"Recommended Alternative",children:[(0,t.jsxs)(s.p,{children:["This Source has the same data limitations as the ",(0,t.jsx)(s.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})," and ",(0,t.jsx)(s.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})," have: Last.fm does not support separating artists/album artists fields which means any multi-artist tracks will have all artists combined into one string. This makes scrobbling to other services, and using metadata corrections like ",(0,t.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"}),", more difficult."]}),(0,t.jsxs)(s.p,{children:["If your application has the option to scrobble using Listenbrainz then use the ",(0,t.jsx)(s.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})," Source instead."]})]}),"\n",(0,t.jsx)(s.h2,{id:"setup",children:"Setup"}),"\n",(0,t.jsxs)(s.admonition,{title:"Scenario Picker",type:"tip",children:[(0,t.jsxs)(s.p,{children:["Use ",(0,t.jsx)(s.strong,{children:"one"}),' of the scenarios below based on how on your service(s) (things "scrobbling" to Multi-Scrobbler using this Source) will need to interact with MS.']}),(0,t.jsxs)(o.A,{groupId:"scenario",queryString:!0,children:[(0,t.jsxs)(l.A,{value:"single",label:"One Service",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"one"})," service, like Panoscrobbler, that will scrobble to Multi-Scrobbler."]}),"\n"]}),(0,t.jsxs)(s.p,{children:["Configure ",(0,t.jsx)(s.strong,{children:"one"})," Last.fm Endpoint Source. Use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"}),", if necessary. Use the same apikey/user in MS as you do in your service."]})]}),(0,t.jsxs)(l.A,{value:"multiple",label:"Many Services, Same User",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You may have ",(0,t.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same ",(0,t.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),"."]}),"\n"]}),(0,t.jsxs)(s.p,{children:["Configure ",(0,t.jsx)(s.strong,{children:"one"})," Lastfm Endpoint Source. Use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and configure ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})," in MS, if necessary. Use the same apikey/user for all your services as you configure in MS."]})]}),(0,t.jsxs)(l.A,{value:"multiple-tokens",label:"Many Services, Many Users, Can use LFM Account",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,t.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"All"})," of these services can accept a ",(0,t.jsx)(s.a,{href:"#authentication",children:(0,t.jsx)(s.strong,{children:"apikey/user"})})," to authenticate a Last.fm user/account."]}),"\n"]}),(0,t.jsxs)(s.p,{children:["Configure one Last.fm Endpoint Sources ",(0,t.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,t.jsxs)(s.p,{children:["For each Lastfm Endpoint Source, configure a different ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"}),". Use that same apikey/user when configuring Last.fm for the associated service."]}),(0,t.jsxs)(s.p,{children:["All Last.fm Endpoint Sources should use the same ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),"."]})]}),(0,t.jsxs)(l.A,{value:"multiple-slug",label:"Many Services, Many Users, Cannot use LFM Account",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,t.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,t.jsxs)(s.p,{children:["All, or some, of these services ",(0,t.jsx)(s.strong,{children:"cannot"})," accept an ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})," to authenticate a Last.fm user/account."]}),"\n"]}),(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"This is not a common scenario"})," but if it fits your usecase then use these guidelines to differentiate your services:"]}),(0,t.jsxs)(s.p,{children:["Configure one Last.fm Endpoint Sources ",(0,t.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["For any groups of services that ",(0,t.jsxs)(s.strong,{children:["can use ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})]}),", use the instructions for ",(0,t.jsx)(s.a,{href:"./?scenario=multiple-tokens#setup",children:"Many Services, Many Users, Can use LFM Account"})]}),"\n",(0,t.jsxs)(s.li,{children:["For any groups of services that ",(0,t.jsx)(s.strong,{children:"cannot accept"})," an apikey/user...","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You can still configure a Source ",(0,t.jsxs)(s.strong,{children:["without an ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})]}),'. Any services not using an account will use this "default" Source.']}),"\n",(0,t.jsxs)(s.li,{children:["If multiple groups cannot use an apikey/user, or the groups cannot use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),", then use different ",(0,t.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,t.jsx)(s.strong,{children:"Slugs"})]}),"."]}),"\n"]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(l.A,{value:"slug",label:"Service cannot use standard URL",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"one"})," service, like PanoScrobbler, that will scrobble to Multi-Scrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["You have already tried the ",(0,t.jsx)(s.a,{href:"./?scenario=single#setup",children:(0,t.jsx)(s.strong,{children:"One Service"})})," scenario with the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," but it is not working."]}),"\n"]}),(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"This is not a common scenario."})," Check the ",(0,t.jsx)(s.a,{href:"#troubleshooting-url",children:(0,t.jsx)(s.strong,{children:"Troubleshooting URL"})})," section before trying this."]}),(0,t.jsxs)(s.p,{children:["At this point, you can try to use a different ",(0,t.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,t.jsx)(s.strong,{children:"Slug"})]}),'. Your service must be able to set a "fully custom" URL for Last.fm IE it must allow you to set more than just a domain/host.']})]})]})]}),"\n",(0,t.jsx)(s.h3,{id:"standard-base-url",children:"Standard Base URL"}),"\n",(0,t.jsx)(s.p,{children:"When setting up your Last.fm client to communicate with Multi-Scrobbler replace the Last.fm domain with your Multi-Scrobbler domain:"}),"\n",(0,t.jsxs)(s.p,{children:["https://",(0,t.jsx)(s.strong,{children:"last.fm"})," => https://",(0,t.jsx)(s.strong,{children:"yourMSDomain"})]}),"\n",(0,t.jsxs)(s.p,{children:["MS accepts Last.fm API calls with the same ",(0,t.jsx)(s.strong,{children:"url base"})," and structure as the ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/intro",children:"last.fm api"}),", IE ",(0,t.jsx)(s.code,{children:"http://yourMSDomain/2.0/"})]}),"\n",(0,t.jsx)(s.h3,{id:"authentication",children:"Authentication"}),"\n",(0,t.jsxs)(s.p,{children:["If you are only setting up ",(0,t.jsx)(s.strong,{children:"one"})," Lastfm Endpoint Source then you do not need to configure any explicit username/apiKey/password for MS. If your Last.fm Client requires these credentials use any fake values you want."]}),"\n",(0,t.jsxs)(r,{type:"important",summary:"Supported Auth Types",children:[(0,t.jsxs)(s.p,{children:["Currently, Multi-Scrobbler only supports the ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/mobileauth",children:(0,t.jsx)(s.strong,{children:"Mobile Application"})})," auth flow. If your client requires one of the other authentication flows please ",(0,t.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=02-feature-request.yml",children:"open an issue"}),"."]}),(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Note:"})," Your client does not ",(0,t.jsx)(s.strong,{children:"need"})," to implement any auth in order to use a Lastfm Endpoint Source. You can directly make ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/show/track.scrobble",children:(0,t.jsx)(s.code,{children:"track.scrobble"})})," or ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/show/track.updateNowPlaying",children:(0,t.jsx)(s.code,{children:"track.updateNowPlaying"})})," api calls to ",(0,t.jsx)(s.code,{children:"http://yourMSDomain/2.0/"})," with any fake auth data you want."]})]}),"\n",(0,t.jsx)(s.h3,{id:"multiple-sources",children:"Multiple Sources"}),"\n",(0,t.jsxs)(s.p,{children:["If you need configure ",(0,t.jsx)(s.strong,{children:"more than one"})," Lastfm Endpoint Source then you should configure username/apiKey for MS, per Source. This enables MS to differentiate scrobbles for each Source."]}),"\n",(0,t.jsxs)(s.p,{children:["Use the same ",(0,t.jsx)(s.strong,{children:"username"})," and/or ",(0,t.jsx)(s.strong,{children:"API Key"})," you configure with MS when setting up your Last.fm Client. These values can be anything you want, as long as they match between MS and your client. Password can be anything and is not checked."]}),"\n",(0,t.jsxs)(s.p,{children:["However, if you cannot configure username/apiKeys for your scenario you may also use a URL ",(0,t.jsx)(s.strong,{children:"Slug"})," to tell MS which Source belongs to a specific user. ",(0,t.jsx)(s.strong,{children:"This is not a common scenario"})," and should only be used if username/apiKey configuration is not sufficient or not possible."]}),"\n",(0,t.jsxs)(r,{type:"tip",summary:"Different URL Base (Slug)",children:[(0,t.jsxs)(s.p,{children:["If you cannot use different username/apiKey per Source (or Last.fm Client) you can still differentiate Sources by using a different ",(0,t.jsx)(s.strong,{children:"url base (slug)"})," for Last.fm communication."]}),(0,t.jsxs)(s.p,{children:["Setting a ",(0,t.jsx)(s.strong,{children:"slug"})," in config will change the ",(0,t.jsx)(s.strong,{children:"url base"})," for MS like this:"]}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:'slug: "mySlug"\n'})}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"http://yourMsDomain/api/lastfm/mySlug\n"})}),(0,t.jsxs)(s.p,{children:["The above url base is equivalent to making calls to ",(0,t.jsx)(s.code,{children:"http://yourMSDomain/2.0/"})]})]}),"\n",(0,t.jsx)(s.h2,{id:"troubleshooting-url",children:"Troubleshooting URL"}),"\n",(0,t.jsxs)(s.p,{children:["If you think your service should be able to use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," but it is not working follow these steps before trying the ",(0,t.jsx)(s.a,{href:"#multiple-sources",children:"the base URL Slug"}),"."]}),"\n",(0,t.jsx)(s.h4,{id:"verify-url-format",children:"Verify URL Format"}),"\n",(0,t.jsxs)(s.p,{children:["Some service may require ",(0,t.jsx)(s.code,{children:"http/https"})," in the URL format (",(0,t.jsx)(s.code,{children:"http://myMSDomainOrIp:9078"}),") while others may not (",(0,t.jsx)(s.code,{children:"myDomainOrIp:9078"}),"). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works."]}),"\n",(0,t.jsx)(r,{type:"note",summary:"Some Services Require HTTPS",children:(0,t.jsxs)(s.p,{children:["Some services that can scrobble to a custom Last.fm URL may require the URL to have a real domain (",(0,t.jsx)(s.code,{children:"example.com"}),") and/or use SSL (",(0,t.jsx)(s.code,{children:"https://"}),"). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality."]})}),"\n",(0,t.jsx)(s.h4,{id:"is-ms-is-reachable",children:"Is MS is Reachable?"}),"\n",(0,t.jsxs)(s.p,{children:["Verify that MS can be accessed by your service, or from the same host as the service is running. See the ",(0,t.jsx)(s.a,{href:"/FAQ/#ingress-connection",children:(0,t.jsx)(s.strong,{children:"FAQ"})})," for guidance on troubleshooting ingress connection issues."]}),"\n",(0,t.jsx)(s.h4,{id:"service-logging",children:"Service Logging"}),"\n",(0,t.jsx)(s.p,{children:"If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Last.fm apiKey/user, or trying to make a scrobble request."}),"\n",(0,t.jsx)(s.p,{children:"If you decide to report this issue, please include this logging in your issue."}),"\n",(0,t.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n,{config:"LastFMEndpointSourceConfig",fileContent:'[\n {\n "name": "LFM For App",\n "enable": true,\n "id": "myLfmApp",\n "data": {\n "slug": "mySlug"\n }\n }\n]\n',name:"endpointlfm",children:(0,t.jsx)(c,{})})]})}function x(e={}){let{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}function m(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/3827a595.db3b6819.js b/assets/js/3827a595.db3b6819.js new file mode 100644 index 00000000..7ef07c0e --- /dev/null +++ b/assets/js/3827a595.db3b6819.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6412"],{1046(e,s,n){n.r(s),n.d(s,{metadata:()=>r,default:()=>x,frontMatter:()=>h,contentTitle:()=>d,toc:()=>f,assets:()=>u});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/lastfm-endpoint.mdx?plain=1","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"}}'),t=n(4848),i=n(8453),o=n(8194),l=n(698);function a(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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:(0,t.jsx)(s.em,{children:(0,t.jsx)(s.strong,{children:(0,t.jsx)(s.code,{children:"LFM_ID"})})})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsxs)(s.td,{children:["A globally unique ID EX ",(0,t.jsx)(s.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_NAME"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsxs)(s.td,{children:["Value of ",(0,t.jsx)(s.code,{children:"LFM_ID"})]}),(0,t.jsxs)(s.td,{children:["A vanity name EX ",(0,t.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_ENABLE"})}),(0,t.jsx)(s.td,{children:"boolean"}),(0,t.jsx)(s.td,{children:"true"}),(0,t.jsx)(s.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_SLUG"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsxs)(s.td,{children:["When using ",(0,t.jsx)(s.strong,{children:"multiple sources without apikey/user"}),", or ",(0,t.jsx)(s.strong,{children:"not"})," using the standard base URL, this is the URL base path that should be used to identify scrobbles for this source"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_USERNAME"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"A fake username to differentiate LFM Endpoint Sources"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"LFM_API_KEY"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"A fake api key to differentiate LFM Endpoint Sources"})]})]})]})}function c(e={}){let{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}n(2170);let h={title:"Lastfm (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},d,u={},f=[{value:"Setup",id:"setup",level:2},{value:"Standard Base URL",id:"standard-base-url",level:3},{value:"Authentication",id:"authentication",level:3},{value:"Multiple Sources",id:"multiple-sources",level:3},{value:"Troubleshooting URL",id:"troubleshooting-url",level:2},{value:"Verify URL Format",id:"verify-url-format",level:4},{value:"Is MS is Reachable?",id:"is-ms-is-reachable",level:4},{value:"Service Logging",id:"service-logging",level:4},{value:"Configuration",id:"configuration",level:2}];function p(e){let s={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:n,DetailsAdmo:r}=s;return n||m("Config",!0),r||m("DetailsAdmo",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Last.fm server."}),"\n",(0,t.jsx)(s.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To ",(0,t.jsx)(s.strong,{children:"scrobble to"})," Last.fm, create a ",(0,t.jsx)(s.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,t.jsxs)(s.li,{children:["To monitor and re-scrobble activity from your Last.fm account, create a ",(0,t.jsx)(s.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n"]})}),"\n",(0,t.jsxs)(r,{type:"tip",summary:"Recommended Alternative",children:[(0,t.jsxs)(s.p,{children:["This Source has the same data limitations as the ",(0,t.jsx)(s.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})," and ",(0,t.jsx)(s.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})," have: Last.fm does not support separating artists/album artists fields which means any multi-artist tracks will have all artists combined into one string. This makes scrobbling to other services, and using metadata corrections like ",(0,t.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"}),", more difficult."]}),(0,t.jsxs)(s.p,{children:["If your application has the option to scrobble using Listenbrainz then use the ",(0,t.jsx)(s.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})," Source instead."]})]}),"\n",(0,t.jsx)(s.h2,{id:"setup",children:"Setup"}),"\n",(0,t.jsxs)(s.admonition,{title:"Scenario Picker",type:"tip",children:[(0,t.jsxs)(s.p,{children:["Use ",(0,t.jsx)(s.strong,{children:"one"}),' of the scenarios below based on how on your service(s) (things "scrobbling" to Multi-Scrobbler using this Source) will need to interact with MS.']}),(0,t.jsxs)(o.A,{groupId:"scenario",queryString:!0,children:[(0,t.jsxs)(l.A,{value:"single",label:"One Service",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"one"})," service, like Panoscrobbler, that will scrobble to Multi-Scrobbler."]}),"\n"]}),(0,t.jsxs)(s.p,{children:["Configure ",(0,t.jsx)(s.strong,{children:"one"})," Last.fm Endpoint Source. Use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"}),", if necessary. Use the same apikey/user in MS as you do in your service."]})]}),(0,t.jsxs)(l.A,{value:"multiple",label:"Many Services, Same User",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You may have ",(0,t.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same ",(0,t.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),"."]}),"\n"]}),(0,t.jsxs)(s.p,{children:["Configure ",(0,t.jsx)(s.strong,{children:"one"})," Lastfm Endpoint Source. Use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and configure ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})," in MS, if necessary. Use the same apikey/user for all your services as you configure in MS."]})]}),(0,t.jsxs)(l.A,{value:"multiple-tokens",label:"Many Services, Many Users, Can use LFM Account",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,t.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"All"})," of these services can accept a ",(0,t.jsx)(s.a,{href:"#authentication",children:(0,t.jsx)(s.strong,{children:"apikey/user"})})," to authenticate a Last.fm user/account."]}),"\n"]}),(0,t.jsxs)(s.p,{children:["Configure one Last.fm Endpoint Sources ",(0,t.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,t.jsxs)(s.p,{children:["For each Lastfm Endpoint Source, configure a different ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"}),". Use that same apikey/user when configuring Last.fm for the associated service."]}),(0,t.jsxs)(s.p,{children:["All Last.fm Endpoint Sources should use the same ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),"."]})]}),(0,t.jsxs)(l.A,{value:"multiple-slug",label:"Many Services, Many Users, Cannot use LFM Account",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,t.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,t.jsxs)(s.p,{children:["All, or some, of these services ",(0,t.jsx)(s.strong,{children:"cannot"})," accept an ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})," to authenticate a Last.fm user/account."]}),"\n"]}),(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"This is not a common scenario"})," but if it fits your usecase then use these guidelines to differentiate your services:"]}),(0,t.jsxs)(s.p,{children:["Configure one Last.fm Endpoint Sources ",(0,t.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["For any groups of services that ",(0,t.jsxs)(s.strong,{children:["can use ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})]}),", use the instructions for ",(0,t.jsx)(s.a,{href:"./?scenario=multiple-tokens#setup",children:"Many Services, Many Users, Can use LFM Account"})]}),"\n",(0,t.jsxs)(s.li,{children:["For any groups of services that ",(0,t.jsx)(s.strong,{children:"cannot accept"})," an apikey/user...","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You can still configure a Source ",(0,t.jsxs)(s.strong,{children:["without an ",(0,t.jsx)(s.a,{href:"#authentication",children:"apikey/user"})]}),'. Any services not using an account will use this "default" Source.']}),"\n",(0,t.jsxs)(s.li,{children:["If multiple groups cannot use an apikey/user, or the groups cannot use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),", then use different ",(0,t.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,t.jsx)(s.strong,{children:"Slugs"})]}),"."]}),"\n"]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(l.A,{value:"slug",label:"Service cannot use standard URL",children:[(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsxs)(s.p,{children:["You have ",(0,t.jsx)(s.strong,{children:"one"})," service, like PanoScrobbler, that will scrobble to Multi-Scrobbler."]}),"\n",(0,t.jsxs)(s.p,{children:["You have already tried the ",(0,t.jsx)(s.a,{href:"./?scenario=single#setup",children:(0,t.jsx)(s.strong,{children:"One Service"})})," scenario with the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," but it is not working."]}),"\n"]}),(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"This is not a common scenario."})," Check the ",(0,t.jsx)(s.a,{href:"#troubleshooting-url",children:(0,t.jsx)(s.strong,{children:"Troubleshooting URL"})})," section before trying this."]}),(0,t.jsxs)(s.p,{children:["At this point, you can try to use a different ",(0,t.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,t.jsx)(s.strong,{children:"Slug"})]}),'. Your service must be able to set a "fully custom" URL for Last.fm IE it must allow you to set more than just a domain/host.']})]})]})]}),"\n",(0,t.jsx)(s.h3,{id:"standard-base-url",children:"Standard Base URL"}),"\n",(0,t.jsx)(s.p,{children:"When setting up your Last.fm client to communicate with Multi-Scrobbler replace the Last.fm domain with your Multi-Scrobbler domain:"}),"\n",(0,t.jsxs)(s.p,{children:["https://",(0,t.jsx)(s.strong,{children:"last.fm"})," => https://",(0,t.jsx)(s.strong,{children:"yourMSDomain"})]}),"\n",(0,t.jsxs)(s.p,{children:["MS accepts Last.fm API calls with the same ",(0,t.jsx)(s.strong,{children:"url base"})," and structure as the ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/intro",children:"last.fm api"}),", IE ",(0,t.jsx)(s.code,{children:"http://yourMSDomain/2.0/"})]}),"\n",(0,t.jsx)(s.h3,{id:"authentication",children:"Authentication"}),"\n",(0,t.jsxs)(s.p,{children:["If you are only setting up ",(0,t.jsx)(s.strong,{children:"one"})," Lastfm Endpoint Source then you do not need to configure any explicit username/apiKey/password for MS. If your Last.fm Client requires these credentials use any fake values you want."]}),"\n",(0,t.jsxs)(r,{type:"important",summary:"Supported Auth Types",children:[(0,t.jsxs)(s.p,{children:["Currently, Multi-Scrobbler only supports the ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/mobileauth",children:(0,t.jsx)(s.strong,{children:"Mobile Application"})})," auth flow. If your client requires one of the other authentication flows please ",(0,t.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=02-feature-request.yml",children:"open an issue"}),"."]}),(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Note:"})," Your client does not ",(0,t.jsx)(s.strong,{children:"need"})," to implement any auth in order to use a Lastfm Endpoint Source. You can directly make ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/show/track.scrobble",children:(0,t.jsx)(s.code,{children:"track.scrobble"})})," or ",(0,t.jsx)(s.a,{href:"https://www.last.fm/api/show/track.updateNowPlaying",children:(0,t.jsx)(s.code,{children:"track.updateNowPlaying"})})," api calls to ",(0,t.jsx)(s.code,{children:"http://yourMSDomain/2.0/"})," with any fake auth data you want."]})]}),"\n",(0,t.jsx)(s.h3,{id:"multiple-sources",children:"Multiple Sources"}),"\n",(0,t.jsxs)(s.p,{children:["If you need configure ",(0,t.jsx)(s.strong,{children:"more than one"})," Lastfm Endpoint Source then you should configure username/apiKey for MS, per Source. This enables MS to differentiate scrobbles for each Source."]}),"\n",(0,t.jsxs)(s.p,{children:["Use the same ",(0,t.jsx)(s.strong,{children:"username"})," and/or ",(0,t.jsx)(s.strong,{children:"API Key"})," you configure with MS when setting up your Last.fm Client. These values can be anything you want, as long as they match between MS and your client. Password can be anything and is not checked."]}),"\n",(0,t.jsxs)(s.p,{children:["However, if you cannot configure username/apiKeys for your scenario you may also use a URL ",(0,t.jsx)(s.strong,{children:"Slug"})," to tell MS which Source belongs to a specific user. ",(0,t.jsx)(s.strong,{children:"This is not a common scenario"})," and should only be used if username/apiKey configuration is not sufficient or not possible."]}),"\n",(0,t.jsxs)(r,{type:"tip",summary:"Different URL Base (Slug)",children:[(0,t.jsxs)(s.p,{children:["If you cannot use different username/apiKey per Source (or Last.fm Client) you can still differentiate Sources by using a different ",(0,t.jsx)(s.strong,{children:"url base (slug)"})," for Last.fm communication."]}),(0,t.jsxs)(s.p,{children:["Setting a ",(0,t.jsx)(s.strong,{children:"slug"})," in config will change the ",(0,t.jsx)(s.strong,{children:"url base"})," for MS like this:"]}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:'slug: "mySlug"\n'})}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"http://yourMsDomain/api/lastfm/mySlug\n"})}),(0,t.jsxs)(s.p,{children:["The above url base is equivalent to making calls to ",(0,t.jsx)(s.code,{children:"http://yourMSDomain/2.0/"})]})]}),"\n",(0,t.jsx)(s.h2,{id:"troubleshooting-url",children:"Troubleshooting URL"}),"\n",(0,t.jsxs)(s.p,{children:["If you think your service should be able to use the ",(0,t.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," but it is not working follow these steps before trying the ",(0,t.jsx)(s.a,{href:"#multiple-sources",children:"the base URL Slug"}),"."]}),"\n",(0,t.jsx)(s.h4,{id:"verify-url-format",children:"Verify URL Format"}),"\n",(0,t.jsxs)(s.p,{children:["Some service may require ",(0,t.jsx)(s.code,{children:"http/https"})," in the URL format (",(0,t.jsx)(s.code,{children:"http://myMSDomainOrIp:9078"}),") while others may not (",(0,t.jsx)(s.code,{children:"myDomainOrIp:9078"}),"). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works."]}),"\n",(0,t.jsx)(r,{type:"note",summary:"Some Services Require HTTPS",children:(0,t.jsxs)(s.p,{children:["Some services that can scrobble to a custom Last.fm URL may require the URL to have a real domain (",(0,t.jsx)(s.code,{children:"example.com"}),") and/or use SSL (",(0,t.jsx)(s.code,{children:"https://"}),"). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality."]})}),"\n",(0,t.jsx)(s.h4,{id:"is-ms-is-reachable",children:"Is MS is Reachable?"}),"\n",(0,t.jsxs)(s.p,{children:["Verify that MS can be accessed by your service, or from the same host as the service is running. See the ",(0,t.jsx)(s.a,{href:"/FAQ/#ingress-connection",children:(0,t.jsx)(s.strong,{children:"FAQ"})})," for guidance on troubleshooting ingress connection issues."]}),"\n",(0,t.jsx)(s.h4,{id:"service-logging",children:"Service Logging"}),"\n",(0,t.jsx)(s.p,{children:"If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Last.fm apiKey/user, or trying to make a scrobble request."}),"\n",(0,t.jsx)(s.p,{children:"If you decide to report this issue, please include this logging in your issue."}),"\n",(0,t.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n,{config:"LastFMEndpointSourceConfig",fileContent:'[\n {\n "name": "LFM For App",\n "enable": true,\n "id": "myLfmApp",\n "data": {\n "slug": "mySlug"\n }\n }\n]\n',name:"endpointlfm",children:(0,t.jsx)(c,{})})]})}function x(e={}){let{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}function m(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/41cd626a.319629aa.js b/assets/js/41cd626a.319629aa.js new file mode 100644 index 00000000..0bb3eb26 --- /dev/null +++ b/assets/js/41cd626a.319629aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3841"],{1149(e,n,t){t.r(n),t.d(n,{metadata:()=>i,default:()=>x,frontMatter:()=>c,contentTitle:()=>a,toc:()=>h,assets:()=>d});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/vlc.mdx?plain=1","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(4848),s=t(8453);function l(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"VLC_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"VLC_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(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:"string"}),(0,r.jsx)(n.td,{children:"localhost:8080"}),(0,r.jsxs)(n.td,{children:["URL",":PORT"," of the VLC server to connect to"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"VLC_PASSWORD"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Password for the server"})]})]})]})}function o(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}t(8194),t(698),t(2170);let c={title:"VLC",toc_min_heading_level:2,toc_max_heading_level:5},a,d={},h=[{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 u(e){let n={a:"a",code:"code",em:"em",h2:"h2",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config:t,Details:i}=n;return t||m("Config",!0),i||m("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*(?.+?) - (?.+?)\\\\.\\\\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 "id": "myVlc",\n "name": "Desktop",\n "data": {\n "url": "localhost:8080",\n "password": "changeme"\n }\n }\n]\n',name:"vlc",children:(0,r.jsx)(o,{})})]})}function x(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/41cd626a.990a1161.js b/assets/js/41cd626a.990a1161.js deleted file mode 100644 index 856e1f07..00000000 --- a/assets/js/41cd626a.990a1161.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3841"],{1149(e,n,t){t.r(n),t.d(n,{metadata:()=>i,default:()=>x,frontMatter:()=>c,contentTitle:()=>a,toc:()=>h,assets:()=>d});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/vlc.mdx?plain=1","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(4848),s=t(8453);function l(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"VLC_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"VLC_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"VLC_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(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:"string"}),(0,r.jsx)(n.td,{children:"localhost:8080"}),(0,r.jsxs)(n.td,{children:["URL",":PORT"," of the VLC server to connect to"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"VLC_PASSWORD"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Password for the server"})]})]})]})}function o(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}t(8194),t(698),t(2170);let c={title:"VLC",toc_min_heading_level:2,toc_max_heading_level:5},a,d={},h=[{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 u(e){let n={a:"a",code:"code",em:"em",h2:"h2",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config:t,Details:i}=n;return t||m("Config",!0),i||m("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 "id": "myVlc",\n "name": "Desktop",\n "data": {\n "url": "localhost:8080",\n "password": "changeme"\n }\n }\n]\n',name:"vlc",children:(0,r.jsx)(o,{})})]})}function x(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/425b8dd3.32de60d8.js b/assets/js/425b8dd3.32de60d8.js new file mode 100644 index 00000000..deb5aeb4 --- /dev/null +++ b/assets/js/425b8dd3.32de60d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2072"],{2453(e,s,t){t.r(s),t.d(s,{metadata:()=>n,default:()=>x,frontMatter:()=>d,contentTitle:()=>l,toc:()=>h,assets:()=>u});var n=JSON.parse('{"id":"configuration/sources/musikcube","title":"Musikcube","description":"In order to use Musikcube configure it to accept websocket connections in server setup:","source":"@site/docs/configuration/sources/musikcube.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/musikcube","permalink":"/multi-scrobbler/configuration/sources/musikcube","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/musikcube.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Musikcube","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"MPRIS","permalink":"/multi-scrobbler/configuration/sources/mpris"},"next":{"title":"Plex","permalink":"/multi-scrobbler/configuration/sources/plex"}}'),i=t(4848),r=t(8453);function c(e){let s={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"MC_ID"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["A globally unique ID EX ",(0,i.jsx)(s.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MC_NAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsxs)(s.td,{children:["Value of ",(0,i.jsx)(s.code,{children:"MC_ID"})]}),(0,i.jsxs)(s.td,{children:["A vanity name EX ",(0,i.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MC_ENABLE"})}),(0,i.jsx)(s.td,{children:"boolean"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MC_URL"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{children:"ws://localhost:7905"}),(0,i.jsx)(s.td,{children:"URL of the Musikcube Websocket (Metadata) server to connect to"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"MC_PASSWORD"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["Password set in Musikcube ",(0,i.jsx)(s.a,{href:"https://github.com/clangen/musikcube/wiki/remote-api-documentation",children:"https://github.com/clangen/musikcube/wiki/remote-api-documentation"})]})]})]})]})}function o(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}t(8194),t(698),t(2170);let d={title:"Musikcube",toc_min_heading_level:2,toc_max_heading_level:5},l,u={},h=[{value:"Configuration",id:"configuration",level:2}];function a(e){let s={a:"a",code:"code",em:"em",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Config:n}=s;return n||function(e,s){throw Error("Expected "+(s?"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.jsxs)(s.p,{children:["In order to use ",(0,i.jsx)(s.a,{href:"https://musikcube.com",children:"Musikcube"})," configure it to accept ",(0,i.jsx)(s.a,{href:"https://github.com/clangen/musikcube/wiki/remote-api-documentation",children:"websocket connections"})," in ",(0,i.jsx)(s.strong,{children:"server setup"}),":"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Enable the ",(0,i.jsx)(s.strong,{children:"Metadata Server"})]}),"\n",(0,i.jsxs)(s.li,{children:["Set a ",(0,i.jsx)(s.strong,{children:"Password"})]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Both of these settings are found in ",(0,i.jsx)(s.em,{children:"Musikcube -> (s)ettings -> server setup"})]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Server Setup",src:t(4465).A+"",width:"822",height:"666"})}),"\n",(0,i.jsx)(s.p,{children:"The URL used by MS has the syntax:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"[ws|wss]://HOST:[PORT]\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.strong,{children:"port"})," is the same as shown in the server setup screenshot from above, under ",(0,i.jsx)(s.strong,{children:"metadata server enabled"}),". If no port is provided to MS it will default to ",(0,i.jsx)(s.code,{children:"7905"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["If no URL is provided to MS it will try to use ",(0,i.jsx)(s.code,{children:"ws://localhost:7905"})]}),"\n",(0,i.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n,{config:"MusikcubeSourceConfig",fileContent:'[\n {\n "type": "musikcube",\n "enable": true,\n "name": "Desktop",\n "id": "myMusikcube",\n "data": {\n "url": "ws://localhost:7905",\n "password": "MY_PASSWORD"\n }\n }\n]\n',name:"musikcube",children:(0,i.jsx)(o,{})})]})}function x(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},4465(e,s,t){t.d(s,{A:()=>n});let n=t.p+"assets/images/musikcube-67f806e04d12c6b3b65b3d73e732dd9b.jpg"}}]); \ No newline at end of file diff --git a/assets/js/425b8dd3.cea8b1a2.js b/assets/js/425b8dd3.cea8b1a2.js deleted file mode 100644 index 085309e3..00000000 --- a/assets/js/425b8dd3.cea8b1a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2072"],{2453(e,s,t){t.r(s),t.d(s,{metadata:()=>n,default:()=>x,frontMatter:()=>d,contentTitle:()=>l,toc:()=>h,assets:()=>u});var n=JSON.parse('{"id":"configuration/sources/musikcube","title":"Musikcube","description":"In order to use Musikcube configure it to accept websocket connections in server setup:","source":"@site/docs/configuration/sources/musikcube.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/musikcube","permalink":"/multi-scrobbler/configuration/sources/musikcube","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/musikcube.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Musikcube","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"MPRIS","permalink":"/multi-scrobbler/configuration/sources/mpris"},"next":{"title":"Plex","permalink":"/multi-scrobbler/configuration/sources/plex"}}'),i=t(4848),r=t(8453);function c(e){let s={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"MC_ID"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["A globally unique ID EX ",(0,i.jsx)(s.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MC_NAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsxs)(s.td,{children:["Value of ",(0,i.jsx)(s.code,{children:"MC_ID"})]}),(0,i.jsxs)(s.td,{children:["A vanity name EX ",(0,i.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MC_ENABLE"})}),(0,i.jsx)(s.td,{children:"boolean"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MC_URL"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{children:"ws://localhost:7905"}),(0,i.jsx)(s.td,{children:"URL of the Musikcube Websocket (Metadata) server to connect to"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"MC_PASSWORD"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["Password set in Musikcube ",(0,i.jsx)(s.a,{href:"https://github.com/clangen/musikcube/wiki/remote-api-documentation",children:"https://github.com/clangen/musikcube/wiki/remote-api-documentation"})]})]})]})]})}function o(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}t(8194),t(698),t(2170);let d={title:"Musikcube",toc_min_heading_level:2,toc_max_heading_level:5},l,u={},h=[{value:"Configuration",id:"configuration",level:2}];function a(e){let s={a:"a",code:"code",em:"em",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Config:n}=s;return n||function(e,s){throw Error("Expected "+(s?"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.jsxs)(s.p,{children:["In order to use ",(0,i.jsx)(s.a,{href:"https://musikcube.com",children:"Musikcube"})," configure it to accept ",(0,i.jsx)(s.a,{href:"https://github.com/clangen/musikcube/wiki/remote-api-documentation",children:"websocket connections"})," in ",(0,i.jsx)(s.strong,{children:"server setup"}),":"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Enable the ",(0,i.jsx)(s.strong,{children:"Metadata Server"})]}),"\n",(0,i.jsxs)(s.li,{children:["Set a ",(0,i.jsx)(s.strong,{children:"Password"})]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Both of these settings are found in ",(0,i.jsx)(s.em,{children:"Musikcube -> (s)ettings -> server setup"})]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Server Setup",src:t(4465).A+"",width:"822",height:"666"})}),"\n",(0,i.jsx)(s.p,{children:"The URL used by MS has the syntax:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"[ws|wss]://HOST:[PORT]\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.strong,{children:"port"})," is the same as shown in the server setup screenshot from above, under ",(0,i.jsx)(s.strong,{children:"metadata server enabled"}),". If no port is provided to MS it will default to ",(0,i.jsx)(s.code,{children:"7905"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["If no URL is provided to MS it will try to use ",(0,i.jsx)(s.code,{children:"ws://localhost:7905"})]}),"\n",(0,i.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n,{config:"MusikcubeSourceConfig",fileContent:'[\n {\n "type": "musikcube",\n "enable": true,\n "name": "Desktop",\n "id": "myMusikcube",\n "data": {\n "url": "ws://localhost:7905",\n "password": "MY_PASSWORD"\n }\n }\n]\n',name:"musikcube",children:(0,i.jsx)(o,{})})]})}function x(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},4465(e,s,t){t.d(s,{A:()=>n});let n=t.p+"assets/images/musikcube-67f806e04d12c6b3b65b3d73e732dd9b.jpg"}}]); \ No newline at end of file diff --git a/assets/js/44b2647e.24c4f22d.js b/assets/js/44b2647e.24c4f22d.js new file mode 100644 index 00000000..785ad774 --- /dev/null +++ b/assets/js/44b2647e.24c4f22d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6942"],{5077(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>h,frontMatter:()=>t,contentTitle:()=>l,toc:()=>c,assets:()=>o});var r=JSON.parse('{"id":"configuration/transforms/user","title":"User Stage","description":"Enhancing Scrobbles with Regex Parsing","source":"@site/docs/configuration/transforms/user.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/user","permalink":"/multi-scrobbler/configuration/transforms/user","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/user.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"User Stage","description":"Enhancing Scrobbles with Regex Parsing","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Native Stage","permalink":"/multi-scrobbler/configuration/transforms/native"},"next":{"title":"Duplicate Scrobble Guidance","permalink":"/multi-scrobbler/configuration/duplicates"}}'),i=s(4848),a=s(8453);let t={title:"User Stage",description:"Enhancing Scrobbles with Regex Parsing",toc_min_heading_level:2,toc_max_heading_level:5},l,o={},c=[{value:"Configuration",id:"configuration",level:2},{value:"Default Stage",id:"default-stage",level:4},{value:"Search-And-Replace Expression",id:"search-and-replace-expression",level:3},{value:"Rules",id:"rules",level:3},{value:"Examples",id:"examples",level:2},{value:"Usage with <code>when</code> condition",id:"usage-with-when-condition",level:3},{value:"Remove phrase from Title in all new Plays",id:"remove-phrase-from-title-in-all-new-plays",level:3},{value:"Remove all parenthesized content from the end of a title",id:"remove-all-parenthesized-content-from-the-end-of-a-title",level:3},{value:"Rename misspelled artist in all new Plays",id:"rename-misspelled-artist-in-all-new-plays",level:3},{value:"Remove "Various Artists" albums in all new Plays",id:"remove-various-artists-albums-in-all-new-plays",level:3},{value:"Extract primary Artist from delimited, multi-Artist string",id:"extract-primary-artist-from-delimited-multi-artist-string",level:3}];function d(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...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,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"User"})," ",(0,i.jsx)(n.a,{href:"/configuration/transforms#stage",children:"Stage"})," uses ",(0,i.jsxs)(n.a,{href:"#search-and-replace-expression",children:[(0,i.jsx)(n.strong,{children:"search-and-replace"})," expressions"]}),", provided by you, to modify/replace parts of Play data."]}),"\n",(0,i.jsx)(n.p,{children:"This Stage is most useful for correcting individual instances of bad data, or patterns, in your known data. Example scenarios:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Removing ",(0,i.jsx)(n.code,{children:"(Album Version)"})," from all Titles"]}),"\n",(0,i.jsxs)(n.li,{children:["Removing ",(0,i.jsx)(n.code,{children:"Various Artists"})," from Artist data"]}),"\n",(0,i.jsx)(n.li,{children:"Correcting spelling mistakes for individual Artist names"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The user ",(0,i.jsxs)(n.a,{href:"/configuration/transforms#stage",children:["Stage ",(0,i.jsx)(n.code,{children:"type"})]})," is ",(0,i.jsx)(n.code,{children:"user"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["All ",(0,i.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," is done using ",(0,i.jsxs)(n.a,{href:"#search-and-replace-expression",children:[(0,i.jsx)(n.strong,{children:"search-and-replace"})," expressions"]})," inside individual ",(0,i.jsx)(n.a,{href:"#rules",children:"rules"}),". Default configuration for all Rules can still be done using Stage ",(0,i.jsx)(n.code,{children:"defaults"}),"."]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "user",\n "name": "Normalizer",\n "defaults": {\n "title": [\n "(Album Version)"\n ],\n "artists": [\n "Various Artists"\n ]\n }\n }\n ]\n}\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"default-stage",children:"Default Stage"}),"\n",(0,i.jsxs)(n.p,{children:["For your convenience, if you do not define any User ",(0,i.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configurations"})," then multi-scrobbler automatically builds an empty one for you."]}),"\n",(0,i.jsxs)(n.p,{children:["This can be used by omitting the ",(0,i.jsx)(n.code,{children:"name"})," in your ",(0,i.jsx)(n.a,{href:"/configuration/transforms#stage",children:"modification Stage"}),"."]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(n.p,{children:["In a ",(0,i.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,i.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.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": "user",\n "title": [\n // removes badterm from track title\n "badterm"\n ]\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"search-and-replace-expression",children:"Search-And-Replace Expression"}),"\n",(0,i.jsx)(n.p,{children:"A Search-And-Replace Expression can be a plain string that matches a literal, then removes it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Expression: "badTerm"\n\n"this is badTerm cool string" => "this is a cool string"\n'})}),"\n",(0,i.jsx)(n.p,{children:"or a regular expression that matches and removes the match:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Expression: "/bad\\w+/i"\n\n"this is badSomething cool string" => "this is a cool string"\n'})}),"\n",(0,i.jsx)(n.p,{children:"Or it may be an object that specifies what to match (using either plain string or regular expression) and what to replace it with:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "search": "anotherBadTerm", // match all instances of \'anotherBadTerm\'\n "replace": "goodTerm" // replace with the string \'goodTerm\'\n}\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'"this is anotherBadTerm cool string" => "this is goodTerm cool string"\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "search": "/^\\(\\w+.com)/i", // matches any string that starts with EX \'(YourMusic.com)\'\n "replace": "[MySite.com]" // replace with the string \'[MySite.com]\'\n}\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'"(Foo.com) this is a cool string" => "[MySite.com] this is a cool string"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"replace"})," property uses javascript's ",(0,i.jsxs)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement",children:[(0,i.jsx)(n.code,{children:"replace()"})," function and so can use any special string characters."]})]}),"\n",(0,i.jsx)(n.h3,{id:"rules",children:"Rules"}),"\n",(0,i.jsxs)(n.p,{children:["Each ",(0,i.jsx)(n.a,{href:"/configuration/transforms#stage-rules",children:"Rule"})," must be an array of ",(0,i.jsx)(n.a,{href:"#search-and-replace-expression",children:"search-and-replace expressions"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFm",\n "configureAs": "source",\n "data": {\n // ...\n },\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "user",\n "title": [\n // removes "badTerm" from title\n "badTerm",\n {\n // removes "fooTerm" from title and replaces it with "barTerm"\n "search": "fooTerm",\n "replace": "barTerm"\n }\n ]\n }\n ],\n }\n }\n }\n]\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the value of the field (title, an artist, album) is an empty string after transforming then the field is ",(0,i.jsx)(n.strong,{children:"removed."})]})}),"\n",(0,i.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,i.jsxs)(n.h3,{id:"usage-with-when-condition",children:["Usage with ",(0,i.jsx)(n.code,{children:"when"})," condition"]}),"\n",(0,i.jsxs)(n.p,{children:["Using ",(0,i.jsx)(n.code,{children:"when"})," for ",(0,i.jsx)(n.a,{href:"/configuration/transforms#conditional-modification",children:"Conditional Modification"})]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'// On search-replace in title...\n// IF artist matches "Elephant Gym"\n// THEN Run regex search-replace ELSE skip this rule\n//\n// Run live|remastered regex remove on title\n{\n "type": "user",\n "title": [\n {\n "search": "/\\\\s\\\\-\\\\s\u6EFE\u77F340\\\\s\u6EFE\u77F3\u649E\u6A02\u968A\\\\s40\u5718\u62DA\u7D93\u5178(.+)$/i",\n "replace": "",\n "when": [\n {\n "artist": "/Elephant Gym/"\n }\n ]\n },\n "/(\\\\s\\\\-\\\\s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i"\n ],\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"remove-phrase-from-title-in-all-new-plays",children:"Remove phrase from Title in all new Plays"}),"\n",(0,i.jsxs)(n.p,{children:["Removes the phrase ",(0,i.jsx)(n.code,{children:"(Album Version)"})," from the Title of a Play"]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "type": "user",\n "title": [\n "(Album Version)"\n ]\n}\n\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"remove-all-parenthesized-content-from-the-end-of-a-title",children:"Remove all parenthesized content from the end of a title"}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n"compare": {\n "candidate": {\n "type": "user",\n "title": [\n "/(\\(.+\\))\\s*$/"\n ]\n },\n "existing": {\n "type": "user",\n "title": [\n "/(\\(.+\\))\\s*$/"\n ]\n },\n },\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"rename-misspelled-artist-in-all-new-plays",children:"Rename misspelled artist in all new Plays"}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "type": "user",\n "artists": [\n {\n "search": "Boz Skaggs",\n "replace": "Boz Scaggs"\n }\n ]\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"remove-various-artists-albums-in-all-new-plays",children:'Remove "Various Artists" albums in all new Plays'}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "type": "user",\n "album": [\n {\n "search": "Various Artists",\n "replace": ""\n }\n ]\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"extract-primary-artist-from-delimited-multi-artist-string",children:"Extract primary Artist from delimited, multi-Artist string"}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)(n.p,{children:"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."}),(0,i.jsx)(n.p,{children:"Ex"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"My Artist One / My Artist Two / Another Guy\nMy Artist One\n"})}),(0,i.jsxs)(n.p,{children:["Artists are delimited with a spaced forward slash (",(0,i.jsx)(n.code,{children:"/"}),") in the regex below. Replace the contents of the ",(0,i.jsx)(n.code,{children:"delim"})," capture group with the delimiter for your use case. Some more common scenarios:"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"(?<delim>\\\\/)"})," No spaces between slash IE ",(0,i.jsx)(n.code,{children:"My Artist One/My Artist Two/Another Guy"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"(?<delim>\\\\s*\\\\\\\\\\s*)"})," Backslash instead of forward slash IE ",(0,i.jsx)(n.code,{children:"My Artist One \\ My Artist Two \\ Another Guy"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"(?<delim>,)"})," Comma IE ",(0,i.jsx)(n.code,{children:"My Artist One, My Artist Two, Another Guy"})]}),"\n"]}),(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\n "type": "user",\n "artists": [\n {\n "search": "(.*?)(?<delim>\\\\s*\\\\/\\\\s*)(.*$)",\n "replace": "$1"\n }\n ]\n}\n'})})]})]})]})}function h(e={}){let{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/44b2647e.35013e97.js b/assets/js/44b2647e.35013e97.js deleted file mode 100644 index e1098964..00000000 --- a/assets/js/44b2647e.35013e97.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6942"],{5077(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>h,frontMatter:()=>t,contentTitle:()=>l,toc:()=>c,assets:()=>o});var r=JSON.parse('{"id":"configuration/transforms/user","title":"User Stage","description":"Enhancing Scrobbles with Regex Parsing","source":"@site/docs/configuration/transforms/user.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/user","permalink":"/multi-scrobbler/configuration/transforms/user","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/user.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"User Stage","description":"Enhancing Scrobbles with Regex Parsing","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Native Stage","permalink":"/multi-scrobbler/configuration/transforms/native"},"next":{"title":"Duplicate Scrobble Guidance","permalink":"/multi-scrobbler/configuration/duplicates"}}'),i=s(4848),a=s(8453);let t={title:"User Stage",description:"Enhancing Scrobbles with Regex Parsing",toc_min_heading_level:2,toc_max_heading_level:5},l,o={},c=[{value:"Configuration",id:"configuration",level:2},{value:"Default Stage",id:"default-stage",level:4},{value:"Search-And-Replace Expression",id:"search-and-replace-expression",level:3},{value:"Rules",id:"rules",level:3},{value:"Examples",id:"examples",level:2},{value:"Usage with <code>when</code> condition",id:"usage-with-when-condition",level:3},{value:"Remove phrase from Title in all new Plays",id:"remove-phrase-from-title-in-all-new-plays",level:3},{value:"Remove all parenthesized content from the end of a title",id:"remove-all-parenthesized-content-from-the-end-of-a-title",level:3},{value:"Rename misspelled artist in all new Plays",id:"rename-misspelled-artist-in-all-new-plays",level:3},{value:"Remove "Various Artists" albums in all new Plays",id:"remove-various-artists-albums-in-all-new-plays",level:3},{value:"Extract primary Artist from delimited, multi-Artist string",id:"extract-primary-artist-from-delimited-multi-artist-string",level:3}];function d(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...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,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"User"})," ",(0,i.jsx)(n.a,{href:"/configuration/transforms#stage",children:"Stage"})," uses ",(0,i.jsxs)(n.a,{href:"#search-and-replace-expression",children:[(0,i.jsx)(n.strong,{children:"search-and-replace"})," expressions"]}),", provided by you, to modify/replace parts of Play data."]}),"\n",(0,i.jsx)(n.p,{children:"This Stage is most useful for correcting individual instances of bad data, or patterns, in your known data. Example scenarios:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Removing ",(0,i.jsx)(n.code,{children:"(Album Version)"})," from all Titles"]}),"\n",(0,i.jsxs)(n.li,{children:["Removing ",(0,i.jsx)(n.code,{children:"Various Artists"})," from Artist data"]}),"\n",(0,i.jsx)(n.li,{children:"Correcting spelling mistakes for individual Artist names"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The user ",(0,i.jsxs)(n.a,{href:"/configuration/transforms#stage",children:["Stage ",(0,i.jsx)(n.code,{children:"type"})]})," is ",(0,i.jsx)(n.code,{children:"user"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["All ",(0,i.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"})," is done using ",(0,i.jsxs)(n.a,{href:"#search-and-replace-expression",children:[(0,i.jsx)(n.strong,{children:"search-and-replace"})," expressions"]})," inside individual ",(0,i.jsx)(n.a,{href:"#rules",children:"rules"}),". Default configuration for all Rules can still be done using Stage ",(0,i.jsx)(n.code,{children:"defaults"}),"."]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "user",\n "name": "Normalizer",\n "defaults": {\n "title": [\n "(Album Version)"\n ],\n "artists": [\n "Various Artists"\n ]\n }\n }\n ]\n}\n'})})]}),"\n",(0,i.jsx)(n.h4,{id:"default-stage",children:"Default Stage"}),"\n",(0,i.jsxs)(n.p,{children:["For your convenience, if you do not define any User ",(0,i.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configurations"})," then multi-scrobbler automatically builds an empty one for you."]}),"\n",(0,i.jsxs)(n.p,{children:["This can be used by omitting the ",(0,i.jsx)(n.code,{children:"name"})," in your ",(0,i.jsx)(n.a,{href:"/configuration/transforms#stage",children:"modification Stage"}),"."]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsxs)(n.p,{children:["In a ",(0,i.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,i.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.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": "user",\n "title": [\n // removes badterm from track title\n "badterm"\n ]\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"search-and-replace-expression",children:"Search-And-Replace Expression"}),"\n",(0,i.jsx)(n.p,{children:"A Search-And-Replace Expression can be a plain string that matches a literal, then removes it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Expression: "badTerm"\n\n"this is badTerm cool string" => "this is a cool string"\n'})}),"\n",(0,i.jsx)(n.p,{children:"or a regular expression that matches and removes the match:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Expression: "/bad\\w+/i"\n\n"this is badSomething cool string" => "this is a cool string"\n'})}),"\n",(0,i.jsx)(n.p,{children:"Or it may be an object that specifies what to match (using either plain string or regular expression) and what to replace it with:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "search": "anotherBadTerm", // match all instances of \'anotherBadTerm\'\n "replace": "goodTerm" // replace with the string \'goodTerm\'\n}\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'"this is anotherBadTerm cool string" => "this is goodTerm cool string"\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "search": "/^\\(\\w+.com)/i", // matches any string that starts with EX \'(YourMusic.com)\'\n "replace": "[MySite.com]" // replace with the string \'[MySite.com]\'\n}\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'"(Foo.com) this is a cool string" => "[MySite.com] this is a cool string"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"replace"})," property uses javascript's ",(0,i.jsxs)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement",children:[(0,i.jsx)(n.code,{children:"replace()"})," function and so can use any special string characters."]})]}),"\n",(0,i.jsx)(n.h3,{id:"rules",children:"Rules"}),"\n",(0,i.jsxs)(n.p,{children:["Each ",(0,i.jsx)(n.a,{href:"/configuration/transforms#stage-rules",children:"Rule"})," must be an array of ",(0,i.jsx)(n.a,{href:"#search-and-replace-expression",children:"search-and-replace expressions"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json"',children:'[\n {\n "name": "myLastFm",\n "configureAs": "source",\n "data": {\n // ...\n },\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "user",\n "title": [\n // removes "badTerm" from title\n "badTerm",\n {\n // removes "fooTerm" from title and replaces it with "barTerm"\n "search": "fooTerm",\n "replace": "barTerm"\n }\n ]\n }\n ],\n }\n }\n }\n]\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the value of the field (title, an artist, album) is an empty string after transforming then the field is ",(0,i.jsx)(n.strong,{children:"removed."})]})}),"\n",(0,i.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,i.jsxs)(n.h3,{id:"usage-with-when-condition",children:["Usage with ",(0,i.jsx)(n.code,{children:"when"})," condition"]}),"\n",(0,i.jsxs)(n.p,{children:["Using ",(0,i.jsx)(n.code,{children:"when"})," for ",(0,i.jsx)(n.a,{href:"/configuration/transforms#conditional-modification",children:"Conditional Modification"})]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'// On search-replace in title...\n// IF artist matches "Elephant Gym"\n// THEN Run regex search-replace ELSE skip this rule\n//\n// Run live|remastered regex remove on title\n{\n "type": "user",\n "title": [\n {\n "search": "/\\\\s\\\\-\\\\s\u6EFE\u77F340\\\\s\u6EFE\u77F3\u649E\u6A02\u968A\\\\s40\u5718\u62DA\u7D93\u5178(.+)$/i",\n "replace": "",\n "when": [\n {\n "artist": "/Elephant Gym/"\n }\n ]\n },\n "/(\\\\s\\\\-\\\\s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i"\n ],\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"remove-phrase-from-title-in-all-new-plays",children:"Remove phrase from Title in all new Plays"}),"\n",(0,i.jsxs)(n.p,{children:["Removes the phrase ",(0,i.jsx)(n.code,{children:"(Album Version)"})," from the Title of a Play"]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "type": "user",\n "title": [\n "(Album Version)"\n ]\n}\n\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"remove-all-parenthesized-content-from-the-end-of-a-title",children:"Remove all parenthesized content from the end of a title"}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n"compare": {\n "candidate": {\n "type": "user",\n "title": [\n "/(\\(.+\\))\\s*$/"\n ]\n },\n "existing": {\n "type": "user",\n "title": [\n "/(\\(.+\\))\\s*$/"\n ]\n },\n },\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"rename-misspelled-artist-in-all-new-plays",children:"Rename misspelled artist in all new Plays"}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "type": "user",\n "artists": [\n {\n "search": "Boz Skaggs",\n "replace": "Boz Scaggs"\n }\n ]\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"remove-various-artists-albums-in-all-new-plays",children:'Remove "Various Artists" albums in all new Plays'}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json5",children:'{\n "type": "user",\n "album": [\n {\n "search": "Various Artists",\n "replace": ""\n }\n ]\n}\n'})})]}),"\n",(0,i.jsx)(n.h3,{id:"extract-primary-artist-from-delimited-multi-artist-string",children:"Extract primary Artist from delimited, multi-Artist string"}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)(n.p,{children:"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."}),(0,i.jsx)(n.p,{children:"Ex"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"My Artist One / My Artist Two / Another Guy\nMy Artist One\n"})}),(0,i.jsxs)(n.p,{children:["Artists are delimited with a spaced forward slash (",(0,i.jsx)(n.code,{children:"/"}),") in the regex below. Replace the contents of the ",(0,i.jsx)(n.code,{children:"delim"})," capture group with the delimiter for your use case. Some more common scenarios:"]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"(?<delim>\\\\/)"})," No spaces between slash IE ",(0,i.jsx)(n.code,{children:"My Artist One/My Artist Two/Another Guy"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"(?<delim>\\\\s*\\\\\\\\\\s*)"})," Backslash instead of forward slash IE ",(0,i.jsx)(n.code,{children:"My Artist One \\ My Artist Two \\ Another Guy"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"(?<delim>,)"})," Comma IE ",(0,i.jsx)(n.code,{children:"My Artist One, My Artist Two, Another Guy"})]}),"\n"]}),(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Example"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\n "type": "user",\n "artists": [\n {\n "search": "(.*?)(?<delim>\\\\s*\\\\/\\\\s*)(.*$)",\n "replace": "$1"\n }\n ]\n}\n'})})]})]})]})}function h(e={}){let{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/490e20a0.13e19275.js b/assets/js/490e20a0.13e19275.js new file mode 100644 index 00000000..aa94043f --- /dev/null +++ b/assets/js/490e20a0.13e19275.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["4479"],{2989(e,s,t){t.r(s),t.d(s,{metadata:()=>i,default:()=>c,frontMatter:()=>r,contentTitle:()=>o,toc:()=>d,assets:()=>a});var i=JSON.parse('{"id":"help","title":"Help","description":"Getting Useful Data","source":"@site/docs/help.mdx","sourceDirName":".","slug":"/help","permalink":"/multi-scrobbler/help","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/help.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Help"},"sidebar":"tutorialSidebar","previous":{"title":"FAQ","permalink":"/multi-scrobbler/FAQ"}}'),n=t(4848),l=t(8453);let r={title:"Help"},o,a={},d=[{value:"Getting Useful Data",id:"getting-useful-data",level:2},{value:"Logs",id:"logs",level:3},{value:"Debug Mode",id:"debug-mode",level:3},{value:"Copy Play Debug Data",id:"copy-play-debug-data",level:3},{value:"Finding Help",id:"finding-help",level:2},{value:"FAQ",id:"faq",level:3},{value:"Existing Issues",id:"existing-issues",level:3},{value:"Reporting an Issue",id:"reporting-an-issue",level:2}];function h(e){let s={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h2,{id:"getting-useful-data",children:"Getting Useful Data"}),"\n",(0,n.jsx)(s.h3,{id:"logs",children:"Logs"}),"\n",(0,n.jsx)(s.p,{children:"Multi-scrobbeler has a real-time log shown in the dashboard. These are the same logs you would find in docker logs. In the dashboard, logs can be filtered by LEVELS to give you a better view of errors/warnings."}),"\n",(0,n.jsxs)(s.p,{children:["When creating an issue please include all logs at the lowest level possible (DEBUG) to help provide context for your issue. You should try to include logs that occurred ",(0,n.jsx)(s.em,{children:"before"})," and ",(0,n.jsx)(s.em,{children:"after"})," your issue/error occurs as this can help determine if MS was behaving normally."]}),"\n",(0,n.jsx)(s.h3,{id:"debug-mode",children:"Debug Mode"}),"\n",(0,n.jsxs)(s.p,{children:["If possible, turn on ",(0,n.jsx)(s.a,{href:"/configuration#debug-mode",children:(0,n.jsx)(s.strong,{children:"Debug Mode"})})," and replicate your issue. Debug Mode enables ",(0,n.jsx)(s.em,{children:"much more"})," logging that can reveal additional data for troubleshooting."]}),"\n",(0,n.jsx)(s.p,{children:"This mode will make your logs very noisy, though, so it's recommended to turn it off after collecting logs."}),"\n",(0,n.jsx)(s.h3,{id:"copy-play-debug-data",children:"Copy Play Debug Data"}),"\n",(0,n.jsx)(s.p,{children:"From the dashboard, each Source/Client has a few details page links:"}),"\n",(0,n.jsx)("img",{src:t(3880).A,height:"400"}),"\n",(0,n.jsx)(s.p,{children:"Opening the details page for the Source/Client reveals a lists all of the Plays that were discovered (Sources) or scrobbled (Clients)."}),"\n",(0,n.jsx)(s.p,{children:"Click on the Debug icon to copy debugging data relevant to that Play. This data should be included in any issue you create."}),"\n",(0,n.jsx)("img",{src:t(164).A,height:"400"}),"\n",(0,n.jsxs)(s.p,{children:["To include this data in an issue either paste the copied data into a text file and save as ",(0,n.jsx)(s.code,{children:"debugdata.json"}),", attaching to the issue."]}),"\n",(0,n.jsxs)(s.p,{children:["Or directly paste the copied data into an issue/comment using ",(0,n.jsx)(s.a,{href:"https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks#fenced-code-blocks",children:(0,n.jsx)(s.strong,{children:"fenced code blocks"})})," markdown to preserve the structure like:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{children:'This is the contents of my comment/issue text on github.\n\nI am explaining my issue here. Here is the debug data:\n\n```json\n{\n "input": {\n "aProperty: 123,\n "foo": "bar"\n }\n}\n```\n\nThank you for your time.\n\n'})}),"\n",(0,n.jsx)(s.h2,{id:"finding-help",children:"Finding Help"}),"\n",(0,n.jsx)(s.h3,{id:"faq",children:"FAQ"}),"\n",(0,n.jsxs)(s.p,{children:["Check the ",(0,n.jsx)(s.a,{href:"/FAQ",children:"FAQ"})," to see if your issue is a known issue or a commonly-experienced issue with Multi-Scrobbler. The FAQ also includes fixes or ways to help troubleshoot these common issues."]}),"\n",(0,n.jsx)(s.h3,{id:"existing-issues",children:"Existing Issues"}),"\n",(0,n.jsxs)(s.p,{children:["On the github repository for Multi-Scrobbler, search ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues?q=sort%3Aupdated-desc",children:"existing issues"})," and ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/discussions",children:"discussions"})," to see if anyone else has had this issue and if it has already been solved."]}),"\n",(0,n.jsx)(s.h2,{id:"reporting-an-issue",children:"Reporting an Issue"}),"\n",(0,n.jsx)(s.p,{children:"Before reporting an issue please consider:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["If this a how-do-I question, troublehooting, or generally ",(0,n.jsx)(s.strong,{children:"not"})," a bug/error with multi-scrobbler please consider ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/discussions",children:(0,n.jsx)(s.strong,{children:"starting a discussion"})})," instead of opening an issue"]}),"\n",(0,n.jsxs)(s.li,{children:["If you want to request new functionality use the ",(0,n.jsxs)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=02-feature-request.yml",children:[(0,n.jsx)(s.strong,{children:"Feature Request issue"})," template"]})]}),"\n",(0,n.jsxs)(s.li,{children:["If you want to request a new Source/Client implementation use the ",(0,n.jsxs)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=03-new-source-client.yml",children:[(0,n.jsx)(s.strong,{children:"New Source/Client issue"})," template"]})]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["If none of the above apply to you then create a new ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=01-bug-report.yml",children:(0,n.jsx)(s.strong,{children:"bug report"})}),". Please include all ",(0,n.jsx)(s.a,{href:"#logs",children:"logs"})," and ",(0,n.jsx)(s.a,{href:"#copy-play-debug-data",children:"play debug data"})," relevant to your issue. The more logs the better. If possible, replicate the issue with ",(0,n.jsxs)(s.a,{href:"#debug-mode",children:[(0,n.jsx)(s.strong,{children:"debug mode"})," turned on"]}),"."]})]})}function c(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},164(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/debug_button-b336d3ce9c4a04fc90acdaa9af4d2755.jpg"},3880(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/details-77dc2c8ece5ee9561b334fcc7a086b95.jpg"}}]); \ No newline at end of file diff --git a/assets/js/490e20a0.2f2af6ce.js b/assets/js/490e20a0.2f2af6ce.js deleted file mode 100644 index ff2efe7e..00000000 --- a/assets/js/490e20a0.2f2af6ce.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["4479"],{2989(e,s,t){t.r(s),t.d(s,{metadata:()=>i,default:()=>c,frontMatter:()=>r,contentTitle:()=>o,toc:()=>d,assets:()=>a});var i=JSON.parse('{"id":"help","title":"Help","description":"Getting Useful Data","source":"@site/docs/help.mdx","sourceDirName":".","slug":"/help","permalink":"/multi-scrobbler/help","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/help.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Help"},"sidebar":"tutorialSidebar","previous":{"title":"FAQ","permalink":"/multi-scrobbler/FAQ"}}'),n=t(4848),l=t(8453);let r={title:"Help"},o,a={},d=[{value:"Getting Useful Data",id:"getting-useful-data",level:2},{value:"Logs",id:"logs",level:3},{value:"Debug Mode",id:"debug-mode",level:3},{value:"Copy Play Debug Data",id:"copy-play-debug-data",level:3},{value:"Finding Help",id:"finding-help",level:2},{value:"FAQ",id:"faq",level:3},{value:"Existing Issues",id:"existing-issues",level:3},{value:"Reporting an Issue",id:"reporting-an-issue",level:2}];function h(e){let s={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h2,{id:"getting-useful-data",children:"Getting Useful Data"}),"\n",(0,n.jsx)(s.h3,{id:"logs",children:"Logs"}),"\n",(0,n.jsx)(s.p,{children:"Multi-scrobbeler has a real-time log shown in the dashboard. These are the same logs you would find in docker logs. In the dashboard, logs can be filtered by LEVELS to give you a better view of errors/warnings."}),"\n",(0,n.jsxs)(s.p,{children:["When creating an issue please include all logs at the lowest level possible (DEBUG) to help provide context for your issue. You should try to include logs that occurred ",(0,n.jsx)(s.em,{children:"before"})," and ",(0,n.jsx)(s.em,{children:"after"})," your issue/error occurs as this can help determine if MS was behaving normally."]}),"\n",(0,n.jsx)(s.h3,{id:"debug-mode",children:"Debug Mode"}),"\n",(0,n.jsxs)(s.p,{children:["If possible, turn on ",(0,n.jsx)(s.a,{href:"/configuration#debug-mode",children:(0,n.jsx)(s.strong,{children:"Debug Mode"})})," and replicate your issue. Debug Mode enables ",(0,n.jsx)(s.em,{children:"much more"})," logging that can reveal additional data for troubleshooting."]}),"\n",(0,n.jsx)(s.p,{children:"This mode will make your logs very noisy, though, so it's recommended to turn it off after collecting logs."}),"\n",(0,n.jsx)(s.h3,{id:"copy-play-debug-data",children:"Copy Play Debug Data"}),"\n",(0,n.jsx)(s.p,{children:"From the dashboard, each Source/Client has a few details page links:"}),"\n",(0,n.jsx)("img",{src:t(3880).A,height:"400"}),"\n",(0,n.jsx)(s.p,{children:"Opening the details page for the Source/Client reveals a lists all of the Plays that were discovered (Sources) or scrobbled (Clients)."}),"\n",(0,n.jsx)(s.p,{children:"Click on the Debug icon to copy debugging data relevant to that Play. This data should be included in any issue you create."}),"\n",(0,n.jsx)("img",{src:t(164).A,height:"400"}),"\n",(0,n.jsxs)(s.p,{children:["To include this data in an issue either paste the copied data into a text file and save as ",(0,n.jsx)(s.code,{children:"debugdata.json"}),", attaching to the issue."]}),"\n",(0,n.jsxs)(s.p,{children:["Or directly paste the copied data into an issue/comment using ",(0,n.jsx)(s.a,{href:"https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks#fenced-code-blocks",children:(0,n.jsx)(s.strong,{children:"fenced code blocks"})})," markdown to preserve the structure like:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{children:'This is the contents of my comment/issue text on github.\n\nI am explaining my issue here. Here is the debug data:\n\n```json\n{\n "input": {\n "aProperty: 123,\n "foo": "bar"\n }\n}\n```\n\nThank you for your time.\n\n'})}),"\n",(0,n.jsx)(s.h2,{id:"finding-help",children:"Finding Help"}),"\n",(0,n.jsx)(s.h3,{id:"faq",children:"FAQ"}),"\n",(0,n.jsxs)(s.p,{children:["Check the ",(0,n.jsx)(s.a,{href:"/FAQ",children:"FAQ"})," to see if your issue is a known issue or a commonly-experienced issue with Multi-Scrobbler. The FAQ also includes fixes or ways to help troubleshoot these common issues."]}),"\n",(0,n.jsx)(s.h3,{id:"existing-issues",children:"Existing Issues"}),"\n",(0,n.jsxs)(s.p,{children:["On the github repository for Multi-Scrobbler, search ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues?q=sort%3Aupdated-desc",children:"existing issues"})," and ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/discussions",children:"discussions"})," to see if anyone else has had this issue and if it has already been solved."]}),"\n",(0,n.jsx)(s.h2,{id:"reporting-an-issue",children:"Reporting an Issue"}),"\n",(0,n.jsx)(s.p,{children:"Before reporting an issue please consider:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["If this a how-do-I question, troublehooting, or generally ",(0,n.jsx)(s.strong,{children:"not"})," a bug/error with multi-scrobbler please consider ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/discussions",children:(0,n.jsx)(s.strong,{children:"starting a discussion"})})," instead of opening an issue"]}),"\n",(0,n.jsxs)(s.li,{children:["If you want to request new functionality use the ",(0,n.jsxs)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=02-feature-request.yml",children:[(0,n.jsx)(s.strong,{children:"Feature Request issue"})," template"]})]}),"\n",(0,n.jsxs)(s.li,{children:["If you want to request a new Source/Client implementation use the ",(0,n.jsxs)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=03-new-source-client.yml",children:[(0,n.jsx)(s.strong,{children:"New Source/Client issue"})," template"]})]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["If none of the above apply to you then create a new ",(0,n.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=01-bug-report.yml",children:(0,n.jsx)(s.strong,{children:"bug report"})}),". Please include all ",(0,n.jsx)(s.a,{href:"#logs",children:"logs"})," and ",(0,n.jsx)(s.a,{href:"#copy-play-debug-data",children:"play debug data"})," relevant to your issue. The more logs the better. If possible, replicate the issue with ",(0,n.jsxs)(s.a,{href:"#debug-mode",children:[(0,n.jsx)(s.strong,{children:"debug mode"})," turned on"]}),"."]})]})}function c(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},164(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/debug_button-b336d3ce9c4a04fc90acdaa9af4d2755.jpg"},3880(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/details-77dc2c8ece5ee9561b334fcc7a086b95.jpg"}}]); \ No newline at end of file diff --git a/assets/js/49117d77.5bb5222b.js b/assets/js/49117d77.5bb5222b.js new file mode 100644 index 00000000..229197de --- /dev/null +++ b/assets/js/49117d77.5bb5222b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["676"],{2080(e,t,r){r.r(t),r.d(t,{metadata:()=>i,default:()=>h,frontMatter:()=>d,contentTitle:()=>l,toc:()=>u,assets:()=>p});var i=JSON.parse('{"id":"updating/upgrade-path/upgrade-path","title":"Upgrade Path","description":"Updating Multi-Scrobbler","source":"@site/docs/updating/upgrade-path/upgrade-path.mdx","sourceDirName":"updating/upgrade-path","slug":"/updating/upgrade-path/","permalink":"/multi-scrobbler/updating/upgrade-path/","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/updating/upgrade-path/upgrade-path.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Upgrade Path","description":"Updating Multi-Scrobbler"},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/updating/"},"next":{"title":"From < 0.14.0","permalink":"/multi-scrobbler/updating/upgrade-path/0140"}}'),a=r(4848),n=r(8453),s=r(8194),o=r(698);r(2170);let d={sidebar_position:1,title:"Upgrade Path",description:"Updating Multi-Scrobbler"},l,p={},u=[];function c(e){let t={a:"a",admonition:"admonition",em:"em",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t.p,{children:["The majority of changes are detailed in ",(0,a.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,a.jsx)(t.strong,{children:"Github Release Notes"})}),", including ",(0,a.jsx)(t.em,{children:"most"})," breaking changes. You should consult the release notes for each version you will be updating through/to."]}),"\n",(0,a.jsx)(t.p,{children:"Upgrade paths for specific version, detailed here, are reserved for:"}),"\n",(0,a.jsxs)(s.A,{groupId:"upgradeType",queryString:!0,children:[(0,a.jsx)(o.A,{value:"required",label:"Required Upgrades",children:(0,a.jsx)(t.admonition,{title:"Required Upgrade",type:"warning",children:(0,a.jsxs)(t.p,{children:["Versions you ",(0,a.jsx)(t.strong,{children:"must"})," upgrade to ",(0,a.jsx)(t.strong,{children:"before"})," upgrading to a newer version. Likely due to the codebase containing functionality to upgrade persistent data that cannot be migrating across multiple versions."]})})}),(0,a.jsx)(o.A,{value:"depth",label:"In Depth Upgrades",children:(0,a.jsx)(t.admonition,{title:"Optional Upgrade",type:"note",children:(0,a.jsx)(t.p,{children:"(Breaking) Changes to configuration/data that require more detail or formatting than is feasible in Github release notes. These upgrades may be skipped."})})})]}),"\n",(0,a.jsx)(t.p,{children:"The type of upgrade is shown at the top of each page with the same colored callout shown above."})]})}function h(e={}){let{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/49117d77.ecb7b006.js b/assets/js/49117d77.ecb7b006.js deleted file mode 100644 index 1be925cf..00000000 --- a/assets/js/49117d77.ecb7b006.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["676"],{2080(e,t,r){r.r(t),r.d(t,{metadata:()=>i,default:()=>h,frontMatter:()=>d,contentTitle:()=>l,toc:()=>u,assets:()=>p});var i=JSON.parse('{"id":"updating/upgrade-path/upgrade-path","title":"Upgrade Path","description":"Updating Multi-Scrobbler","source":"@site/docs/updating/upgrade-path/upgrade-path.mdx","sourceDirName":"updating/upgrade-path","slug":"/updating/upgrade-path/","permalink":"/multi-scrobbler/updating/upgrade-path/","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/updating/upgrade-path/upgrade-path.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Upgrade Path","description":"Updating Multi-Scrobbler"},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/updating/"},"next":{"title":"From < 0.14.0","permalink":"/multi-scrobbler/updating/upgrade-path/0140"}}'),a=r(4848),n=r(8453),s=r(8194),o=r(698);r(2170);let d={sidebar_position:1,title:"Upgrade Path",description:"Updating Multi-Scrobbler"},l,p={},u=[];function c(e){let t={a:"a",admonition:"admonition",em:"em",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t.p,{children:["The majority of changes are detailed in ",(0,a.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,a.jsx)(t.strong,{children:"Github Release Notes"})}),", including ",(0,a.jsx)(t.em,{children:"most"})," breaking changes. You should consult the release notes for each version you will be updating through/to."]}),"\n",(0,a.jsx)(t.p,{children:"Upgrade paths for specific version, detailed here, are reserved for:"}),"\n",(0,a.jsxs)(s.A,{groupId:"upgradeType",queryString:!0,children:[(0,a.jsx)(o.A,{value:"required",label:"Required Upgrades",children:(0,a.jsx)(t.admonition,{title:"Required Upgrade",type:"warning",children:(0,a.jsxs)(t.p,{children:["Versions you ",(0,a.jsx)(t.strong,{children:"must"})," upgrade to ",(0,a.jsx)(t.strong,{children:"before"})," upgrading to a newer version. Likely due to the codebase containing functionality to upgrade persistent data that cannot be migrating across multiple versions."]})})}),(0,a.jsx)(o.A,{value:"depth",label:"In Depth Upgrades",children:(0,a.jsx)(t.admonition,{title:"Optional Upgrade",type:"note",children:(0,a.jsx)(t.p,{children:"(Breaking) Changes to configuration/data that require more detail or formatting than is feasible in Github release notes. These upgrades may be skipped."})})})]}),"\n",(0,a.jsx)(t.p,{children:"The type of upgrade is shown at the top of each page with the same colored callout shown above."})]})}function h(e={}){let{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/493c00ca.c9ab1381.js b/assets/js/493c00ca.c9ab1381.js new file mode 100644 index 00000000..d0517348 --- /dev/null +++ b/assets/js/493c00ca.c9ab1381.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["941"],{2001(e,t,s){s.r(t),s.d(t,{metadata:()=>r,default:()=>x,frontMatter:()=>d,contentTitle:()=>l,toc:()=>h,assets:()=>a});var r=JSON.parse('{"id":"configuration/sources/yamaha-musiccast","title":"Yamaha MusicCast","description":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","source":"@site/docs/configuration/sources/yamaha-musiccast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/yamaha-musiccast","permalink":"/multi-scrobbler/configuration/sources/yamaha-musiccast","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/yamaha-musiccast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Yamaha MusicCast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Webscrobbler","permalink":"/multi-scrobbler/configuration/sources/webscrobbler"},"next":{"title":"Yandex Music","permalink":"/multi-scrobbler/configuration/sources/yandex-music"}}'),n=s(4848),i=s(8453);function o(e){let t={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Environmental Variable"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"MCAST_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsxs)(t.td,{children:["A globally unique ID EX ",(0,n.jsx)(t.code,{children:"myComponentId"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"MCAST_NAME"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsxs)(t.td,{children:["Value of ",(0,n.jsx)(t.code,{children:"MCAST_ID"})]}),(0,n.jsxs)(t.td,{children:["A vanity name EX ",(0,n.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"MCAST_ENABLE"})}),(0,n.jsx)(t.td,{children:"boolean"}),(0,n.jsx)(t.td,{children:"true"}),(0,n.jsx)(t.td,{children:"Should this component be used?"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"MCAST_URL"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"The host or URL of the YamahaExtendedControl endpoint to use"})]})]})]})}function c(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let d={title:"Yamaha MusicCast",toc_min_heading_level:2,toc_max_heading_level:5},l,a={},h=[{value:"URL",id:"url",level:5},{value:"Configuration",id:"configuration",level:2}];function u(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h5:"h5",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components},{Config:s}=t;return s||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,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Monitor ",(0,n.jsx)(t.a,{href:"https://usa.yamaha.com/products/contents/audio_visual/musiccast/index.html",children:"MusicCast"})," device/receivers for music played on Network/USB/CD inputs."]}),"\n",(0,n.jsx)(t.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,n.jsxs)(t.p,{children:['Musiccast may not correctly report track length. If this is the case you should reduce the "listened to" ',(0,n.jsx)(t.strong,{children:"duration"})," using ",(0,n.jsx)(t.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds"})," so that multi-scrobbler scrobbles correctly."]})}),"\n",(0,n.jsx)(t.h5,{id:"url",children:"URL"}),"\n",(0,n.jsxs)(t.p,{children:["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."]}),"\n",(0,n.jsx)(t.p,{children:"EX"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:(0,n.jsx)(t.code,{children:"url"})}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Transformed URL"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"http://192.168.0.101"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"http://192.168.0.101/YamahaExtendedControl/v1"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"http://mydomain.com/reverseProxy/cast"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"http://mydomain.com/reverseProxy/cast"})})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(s,{config:"MusicCastSourceConfig",fileContent:'[\n {\n "name": "Livingroom Reciever",\n "id": "myYamaha",\n "enable": true,\n "data": {\n "url": "192.168.0.101"\n }\n }\n]\n',name:"musiccast",children:(0,n.jsx)(c,{})})]})}function x(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/493c00ca.d188969b.js b/assets/js/493c00ca.d188969b.js deleted file mode 100644 index aa69678d..00000000 --- a/assets/js/493c00ca.d188969b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["941"],{2001(e,t,s){s.r(t),s.d(t,{metadata:()=>r,default:()=>x,frontMatter:()=>d,contentTitle:()=>l,toc:()=>h,assets:()=>a});var r=JSON.parse('{"id":"configuration/sources/yamaha-musiccast","title":"Yamaha MusicCast","description":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","source":"@site/docs/configuration/sources/yamaha-musiccast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/yamaha-musiccast","permalink":"/multi-scrobbler/configuration/sources/yamaha-musiccast","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/yamaha-musiccast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Yamaha MusicCast","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Webscrobbler","permalink":"/multi-scrobbler/configuration/sources/webscrobbler"},"next":{"title":"Yandex Music","permalink":"/multi-scrobbler/configuration/sources/yandex-music"}}'),n=s(4848),i=s(8453);function o(e){let t={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Environmental Variable"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"MCAST_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsxs)(t.td,{children:["A globally unique ID EX ",(0,n.jsx)(t.code,{children:"myComponentId"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"MCAST_NAME"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsxs)(t.td,{children:["Value of ",(0,n.jsx)(t.code,{children:"MCAST_ID"})]}),(0,n.jsxs)(t.td,{children:["A vanity name EX ",(0,n.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"MCAST_ENABLE"})}),(0,n.jsx)(t.td,{children:"boolean"}),(0,n.jsx)(t.td,{children:"true"}),(0,n.jsx)(t.td,{children:"Should this component be used?"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"MCAST_URL"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"The host or URL of the YamahaExtendedControl endpoint to use"})]})]})]})}function c(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let d={title:"Yamaha MusicCast",toc_min_heading_level:2,toc_max_heading_level:5},l,a={},h=[{value:"URL",id:"url",level:5},{value:"Configuration",id:"configuration",level:2}];function u(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h5:"h5",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components},{Config:s}=t;return s||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,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Monitor ",(0,n.jsx)(t.a,{href:"https://usa.yamaha.com/products/contents/audio_visual/musiccast/index.html",children:"MusicCast"})," device/receivers for music played on Network/USB/CD inputs."]}),"\n",(0,n.jsx)(t.admonition,{title:"Scrobbling Threshold",type:"tip",children:(0,n.jsxs)(t.p,{children:['Musiccast may not correctly report track length. If this is the case you should reduce the "listened to" ',(0,n.jsx)(t.strong,{children:"duration"})," using ",(0,n.jsx)(t.a,{href:"/configuration/sources#scrobble-thresholds",children:"Scrobble Thresholds"})," so that multi-scrobbler scrobbles correctly."]})}),"\n",(0,n.jsx)(t.h5,{id:"url",children:"URL"}),"\n",(0,n.jsxs)(t.p,{children:["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."]}),"\n",(0,n.jsx)(t.p,{children:"EX"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:(0,n.jsx)(t.code,{children:"url"})}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Transformed URL"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"http://192.168.0.101"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"http://192.168.0.101/YamahaExtendedControl/v1"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"http://mydomain.com/reverseProxy/cast"})}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:(0,n.jsx)(t.code,{children:"http://mydomain.com/reverseProxy/cast"})})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(s,{config:"MusicCastSourceConfig",fileContent:'[\n {\n "name": "Livingroom Reciever",\n "id": "myYamaha",\n "enable": true,\n "data": {\n "url": "192.168.0.101"\n }\n }\n]\n',name:"musiccast",children:(0,n.jsx)(c,{})})]})}function x(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/498c77bd.493fa519.js b/assets/js/498c77bd.493fa519.js deleted file mode 100644 index f201516f..00000000 --- a/assets/js/498c77bd.493fa519.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7430"],{7118(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>x,frontMatter:()=>l,contentTitle:()=>c,toc:()=>a,assets:()=>h});var i=JSON.parse('{"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 be found in the JRiver GUI:","source":"@site/docs/configuration/sources/jriver.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/jriver","permalink":"/multi-scrobbler/configuration/sources/jriver","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/jriver.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"JRiver","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin"},"next":{"title":"Kodi","permalink":"/multi-scrobbler/configuration/sources/kodi"}}'),t=r(4848),s=r(8453);function o(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"JRIVER_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"JRIVER_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"JRIVER_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:52199/MCWS/v1/",children:"http://localhost:52199/MCWS/v1/"})}),(0,t.jsx)(n.td,{children:"URL of the JRiver HTTP server to connect to"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_USER"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"If you have enabled authentication, the username you set"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_PASSWORD"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"If you have enabled authentication, the password you set"})]})]})]})}function d(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}r(8194),r(698),r(2170);let l={title:"JRiver",toc_min_heading_level:2,toc_max_heading_level:5},c,h={},a=[{value:"URL",id:"url",level:3},{value:"Configuration",id:"configuration",level:2}];function j(e){let n={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,s.R)(),...e.components},{Config:r,Details:i}=n;return r||u("Config",!0),i||u("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["In order for multi-scrobbler to communicate with JRiver you must have ",(0,t.jsx)(n.a,{href:"https://wiki.jriver.com/index.php/Web_Service_Interface#Documentation_of_Functions",children:"Web Server Interface"})," enabled. This can be found in the JRiver GUI:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Tools -> Options -> Media Network","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.code,{children:"Use Media Network to share this library..."})]}),"\n",(0,t.jsxs)(n.li,{children:["If you have ",(0,t.jsx)(n.code,{children:"Authentication"})," checked you will need to provide the ",(0,t.jsx)(n.strong,{children:"Username"})," and ",(0,t.jsx)(n.strong,{children:"Password"})," in the ENV/File configuration below."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,t.jsxs)(n.p,{children:["The URL used to connect to JRiver, set in your ",(0,t.jsxs)(n.a,{href:"#configuration",children:["file config as ",(0,t.jsx)(n.code,{children:"url"}),"."]})," The URL used to connect ultimately must be formed like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Syntax => [protocol]://[hostname]:[port]/[path]\nDefault => http://localhost:52199/MCWS/v1/\n"})}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.strong,{children:"not"})," standard you must explicitly define it."]}),"\n",(0,t.jsx)(n.admonition,{title:"Jriver Settings",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Make sure the port number matches what is found in ",(0,t.jsx)(n.code,{children:"Advanced"})," section in the Media Network options."]}),"\n",(0,t.jsxs)(n.li,{children:["If your installation is on the same machine but you cannot connect using ",(0,t.jsx)(n.code,{children:"localhost"})," try ",(0,t.jsx)(n.code,{children:"0.0.0.0"})," instead."]}),"\n"]})}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:"URL Transform Examples"}),(0,t.jsxs)(n.p,{children:["Examples of a given ",(0,t.jsx)(n.code,{children:"url"})," in your file config and the final URL multi-scrobbler will use to connect to JRiver:"]}),(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:(0,t.jsx)(n.code,{children:"url"})}),(0,t.jsx)(n.th,{children:"Transformed URL"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"(none set)"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:52199/MCWS/v1/"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"jriver.mydomain.com"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://jriver.mydomain.com:52199/MCWS/v1/"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"192.168.0.101:3456"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://192.168.0.101:3456/MCWS/v1/"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"mydomain.com:80/jriverReverse/MCWS/v1/"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"mydomain.com:80/jriverReverse/MCWS/v1/"})})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"JRiverSourceConfig",fileContent:'[\n {\n "name": "My JRiver Server",\n "id": "myRiver",\n "enable": true,\n "data": {\n "url": "0.0.0.0",\n "username": "auser",\n "password": "apassword"\n }\n }\n]\n',name:"jriver",children:(0,t.jsx)(d,{})})]})}function x(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(j,{...e})}):j(e)}function u(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/498c77bd.5d01d565.js b/assets/js/498c77bd.5d01d565.js new file mode 100644 index 00000000..8ec06857 --- /dev/null +++ b/assets/js/498c77bd.5d01d565.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7430"],{7118(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>x,frontMatter:()=>l,contentTitle:()=>c,toc:()=>a,assets:()=>h});var i=JSON.parse('{"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 be found in the JRiver GUI:","source":"@site/docs/configuration/sources/jriver.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/jriver","permalink":"/multi-scrobbler/configuration/sources/jriver","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/jriver.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"JRiver","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin"},"next":{"title":"Kodi","permalink":"/multi-scrobbler/configuration/sources/kodi"}}'),t=r(4848),s=r(8453);function o(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"JRIVER_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"JRIVER_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"JRIVER_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:52199/MCWS/v1/",children:"http://localhost:52199/MCWS/v1/"})}),(0,t.jsx)(n.td,{children:"URL of the JRiver HTTP server to connect to"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_USER"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"If you have enabled authentication, the username you set"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"JRIVER_PASSWORD"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"If you have enabled authentication, the password you set"})]})]})]})}function d(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}r(8194),r(698),r(2170);let l={title:"JRiver",toc_min_heading_level:2,toc_max_heading_level:5},c,h={},a=[{value:"URL",id:"url",level:3},{value:"Configuration",id:"configuration",level:2}];function j(e){let n={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,s.R)(),...e.components},{Config:r,Details:i}=n;return r||u("Config",!0),i||u("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["In order for multi-scrobbler to communicate with JRiver you must have ",(0,t.jsx)(n.a,{href:"https://wiki.jriver.com/index.php/Web_Service_Interface#Documentation_of_Functions",children:"Web Server Interface"})," enabled. This can be found in the JRiver GUI:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Tools -> Options -> Media Network","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.code,{children:"Use Media Network to share this library..."})]}),"\n",(0,t.jsxs)(n.li,{children:["If you have ",(0,t.jsx)(n.code,{children:"Authentication"})," checked you will need to provide the ",(0,t.jsx)(n.strong,{children:"Username"})," and ",(0,t.jsx)(n.strong,{children:"Password"})," in the ENV/File configuration below."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,t.jsxs)(n.p,{children:["The URL used to connect to JRiver, set in your ",(0,t.jsxs)(n.a,{href:"#configuration",children:["file config as ",(0,t.jsx)(n.code,{children:"url"}),"."]})," The URL used to connect ultimately must be formed like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Syntax => [protocol]://[hostname]:[port]/[path]\nDefault => http://localhost:52199/MCWS/v1/\n"})}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.strong,{children:"not"})," standard you must explicitly define it."]}),"\n",(0,t.jsx)(n.admonition,{title:"Jriver Settings",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Make sure the port number matches what is found in ",(0,t.jsx)(n.code,{children:"Advanced"})," section in the Media Network options."]}),"\n",(0,t.jsxs)(n.li,{children:["If your installation is on the same machine but you cannot connect using ",(0,t.jsx)(n.code,{children:"localhost"})," try ",(0,t.jsx)(n.code,{children:"0.0.0.0"})," instead."]}),"\n"]})}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:"URL Transform Examples"}),(0,t.jsxs)(n.p,{children:["Examples of a given ",(0,t.jsx)(n.code,{children:"url"})," in your file config and the final URL multi-scrobbler will use to connect to JRiver:"]}),(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:(0,t.jsx)(n.code,{children:"url"})}),(0,t.jsx)(n.th,{children:"Transformed URL"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"(none set)"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:52199/MCWS/v1/"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"jriver.mydomain.com"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://jriver.mydomain.com:52199/MCWS/v1/"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"192.168.0.101:3456"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://192.168.0.101:3456/MCWS/v1/"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"mydomain.com:80/jriverReverse/MCWS/v1/"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"mydomain.com:80/jriverReverse/MCWS/v1/"})})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"JRiverSourceConfig",fileContent:'[\n {\n "name": "My JRiver Server",\n "id": "myRiver",\n "enable": true,\n "data": {\n "url": "0.0.0.0",\n "username": "auser",\n "password": "apassword"\n }\n }\n]\n',name:"jriver",children:(0,t.jsx)(d,{})})]})}function x(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(j,{...e})}):j(e)}function u(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/4edc808e.01dc77ad.js b/assets/js/4edc808e.01dc77ad.js deleted file mode 100644 index c19b470e..00000000 --- a/assets/js/4edc808e.01dc77ad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2677"],{9832(e,s,i){i.r(s),i.d(s,{metadata:()=>n,default:()=>S,frontMatter:()=>v,contentTitle:()=>y,toc:()=>w,assets:()=>_});var n=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/index.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","title":"Overview","sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"}}'),r=i(4848),l=i(8453),t=i(6540),o=i(8478),a=i(3878);let c=e=>{let{children:s,disabled:i,...n}=e;return(0,r.jsxs)("button",{className:"embla__button embla__button--prev".concat(i?" embla__button--disabled":""),type:"button",...n,children:[(0,r.jsx)("svg",{className:"embla__button__svg",viewBox:"0 0 532 532",children:(0,r.jsx)("path",{fill:"currentColor",d:"M355.66 11.354c13.793-13.805 36.208-13.805 50.001 0 13.785 13.804 13.785 36.238 0 50.034L201.22 266l204.442 204.61c13.785 13.805 13.785 36.239 0 50.044-13.793 13.796-36.208 13.796-50.002 0a5994246.277 5994246.277 0 0 0-229.332-229.454 35.065 35.065 0 0 1-10.326-25.126c0-9.2 3.393-18.26 10.326-25.2C172.192 194.973 332.731 34.31 355.66 11.354Z"})}),s]})},d=e=>{let{children:s,disabled:i,...n}=e;return(0,r.jsxs)("button",{className:"embla__button embla__button--next".concat(i?" embla__button--disabled":""),type:"button",...n,children:[(0,r.jsx)("svg",{className:"embla__button__svg",viewBox:"0 0 532 532",children:(0,r.jsx)("path",{fill:"currentColor",d:"M176.34 520.646c-13.793 13.805-36.208 13.805-50.001 0-13.785-13.804-13.785-36.238 0-50.034L330.78 266 126.34 61.391c-13.785-13.805-13.785-36.239 0-50.044 13.793-13.796 36.208-13.796 50.002 0 22.928 22.947 206.395 206.507 229.332 229.454a35.065 35.065 0 0 1 10.326 25.126c0 9.2-3.393 18.26-10.326 25.2-45.865 45.901-206.404 206.564-229.332 229.52Z"})}),s]})},h=e=>{let{selectedSnap:s,snapCount:i}=e;return(0,r.jsxs)("div",{className:"embla__selected-snap-display",children:[s+1," / ",i]})},u=i.p+"assets/images/ms-componentlist-2a77a42fc8ffcbb769b674ce610a4372.png",x=i.p+"assets/images/ms-componentlistdesktop-31a7dd1a58d76a62639d2be79bc02aab.png",f=i.p+"assets/images/ms-componentdetailed-57d8c74f2f7ed444101e1e0702f17455.png",j=i.p+"assets/images/ms-playlist-a5d067cf3fd1a763a659b1d5688cf8e9.jpg",m=i.p+"assets/images/ms-mbemptyquery-d0c753c8783453ee3f92adafad236fef.png",g=i.p+"assets/images/ms-logs-395c4d8ce62757f35e7c13d6ae9c0cf6.jpg",p=e=>{let{options:s}=e,[i,n]=(0,a.A)(s),{prevBtnDisabled:l,nextBtnDisabled:o,onPrevButtonClick:p,onNextButtonClick:b}=(e=>{let[s,i]=(0,t.useState)(!0),[n,r]=(0,t.useState)(!0),l=(0,t.useCallback)(()=>{e&&e.goToPrev()},[e]),o=(0,t.useCallback)(()=>{e&&e.goToNext()},[e]),a=(0,t.useCallback)(e=>{i(!e.canGoToPrev()),r(!e.canGoToNext())},[]);return(0,t.useEffect)(()=>{e&&(a(e),e.on("reinit",a).on("select",a))},[e,a]),{prevBtnDisabled:s,nextBtnDisabled:n,onPrevButtonClick:l,onNextButtonClick:o}})(n),{selectedSnap:v,snapCount:y}=(e=>{let[s,i]=(0,t.useState)(0),[n,r]=(0,t.useState)(0),l=(0,t.useCallback)(e=>{r(e.snapList().length),i(e.selectedSnap())},[]);return(0,t.useEffect)(()=>{e&&(l(e),e.on("select",l),e.on("reinit",l))},[e,l]),{selectedSnap:s,snapCount:n}})(n);return(0,r.jsxs)("div",{className:"embla",children:[(0,r.jsx)("div",{className:"embla__viewport",ref:i,children:(0,r.jsxs)("div",{className:"embla__container",children:[(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:x}),(0,r.jsx)("div",{className:"imageCaption",children:"Source/Client List on desktop"})]})},"1"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:u}),(0,r.jsx)("div",{className:"imageCaption",children:"Source/Client List on mobile"})]})},"2"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:f}),(0,r.jsx)("div",{className:"imageCaption",children:"Source/Client Details"})]})},"3"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:j}),(0,r.jsx)("div",{className:"imageCaption",children:"Search for Plays/Scrobbles with live updates"})]})},"4"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:m}),(0,r.jsx)("div",{className:"imageCaption",children:"Scrobble timeline audit trail with detailed errors"})]})},"5"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:g}),(0,r.jsx)("div",{className:"imageCaption",children:"Floating logs for dev-level troubleshooting"})]})},"6")]})}),(0,r.jsxs)("div",{className:"embla__controls",children:[(0,r.jsxs)("div",{className:"embla__buttons",children:[(0,r.jsx)(c,{onClick:p,disabled:l}),(0,r.jsx)(d,{onClick:b,disabled:o})]}),(0,r.jsx)(h,{selectedSnap:v,snapCount:y})]})]})},b=()=>(0,r.jsx)(o.default,{children:()=>(0,r.jsx)(p,{})}),v={slug:"/",title:"Overview",sidebar_position:1},y,_={},w=[{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 k(e){let s={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components},{Details:n,DetailsAdmo:t}=s;return n||C("Details",!0),t||C("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.img,{src:"https://img.shields.io/github/v/release/foxxmd/multi-scrobbler",alt:"Latest Release"}),"\n",(0,r.jsx)(s.img,{src:"https://img.shields.io/badge/License-MIT-yellow.svg",alt:"License: MIT"}),"\n",(0,r.jsx)(s.img,{src:"https://img.shields.io/docker/pulls/foxxmd/multi-scrobbler",alt:"Docker Pulls"})]}),"\n",(0,r.jsx)("img",{src:i(323).A,align:"right",alt:"multi-scrobbler logo",width:"180",height:"180"}),"\n",(0,r.jsxs)(s.p,{children:["A dockerized app that monitors your music listening activity from ",(0,r.jsx)(s.em,{children:"everywhere"})," and scrobbles it ",(0,r.jsx)(s.em,{children:"anywhere"}),"."]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Supports monitoring activity from many ",(0,r.jsx)(s.a,{href:"/configuration/sources",children:(0,r.jsx)(s.strong,{children:"Sources"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/applemusic",children:"Apple Music"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/mpris",children:"MPRIS (Linux Desktop)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/listenbrainz-endpoint#setup-for-popular-apps",children:"Music Assistant"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/plex",children:"Plex"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/sonos",children:"Sonos"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})," (like ",(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)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/vlc",children:"VLC"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/yandex-music",children:"Yandex Music"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["Supports scrobbling to many ",(0,r.jsx)(s.a,{href:"/configuration/clients",children:(0,r.jsx)(s.strong,{children:"Clients"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/configuration/clients/discord",children:"Discord"})," (Now Playing)"]}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/koito",children:"Koito"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/librefm",children:"Libre.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/listenbrainz",children:"ListenBrainz"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/tealfm",children:"teal.fm"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["Enhance/correct scrobble data with ",(0,r.jsx)(s.a,{href:"/configuration/transforms",children:"search patterns"}),", ",(0,r.jsx)(s.a,{href:"/configuration/transforms",children:"built-in corrections"}),", or the ",(0,r.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database"]}),"\n",(0,r.jsxs)(s.li,{children:["Monitor status of Sources and Clients using ",(0,r.jsx)(s.a,{href:"/configuration#webhook-configurations",children:"webhooks (Gotify, Ntfy, Apprise)"})," or ",(0,r.jsx)(s.a,{href:"/configuration#health-endpoint",children:"healthcheck endpoint"})]}),"\n",(0,r.jsxs)(s.li,{children:["Supports ",(0,r.jsx)(s.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})," for scrobble Clients"]}),"\n",(0,r.jsx)(s.li,{children:"Supports configuring for single or multiple users (scrobbling for your friends and family!)"}),"\n",(0,r.jsx)(s.li,{children:"Web server interface for stats, basic control, and detailed logs"}),"\n",(0,r.jsx)(s.li,{children:"Graceful network and client failure handling (queued scrobbles that auto-retry)"}),"\n",(0,r.jsx)(s.li,{children:"Smart handling of credentials (persistent, authorization through app)"}),"\n",(0,r.jsxs)(s.li,{children:["Easy configuration through ",(0,r.jsx)(s.a,{href:"/configuration#configuration-types",children:"ENVs or JSON"})]}),"\n",(0,r.jsxs)(s.li,{children:["Install using ",(0,r.jsx)(s.a,{href:"/installation#docker",children:"Docker images for x86/ARM"})," or ",(0,r.jsx)(s.a,{href:"/installation#nodejs",children:"locally with NodeJS"})]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.a,{href:"/quickstart",children:(0,r.jsx)(s.strong,{children:"Quick Start Guide"})})}),"\n",(0,r.jsxs)(t,{type:"tip",summary:"New UI Preview",children:[(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.strong,{children:"full rewrite"})," of the UI is now available for preview. The new UI modernizes Multi-Scrobbler and gives you in depth insight into how your scrobbles are handled end-to-end."]}),(0,r.jsx)(b,{}),(0,r.jsxs)(s.p,{children:["To try out the stable-release preview navigate to ",(0,r.jsx)(s.code,{children:"http://yourMSDomain:9078/next"})]}),(0,r.jsxs)(s.p,{children:["Or to try out the ",(0,r.jsx)(s.strong,{children:"latest preview snapshot"})," see the docker image pinned ",(0,r.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/500#issuecomment-4917525794",children:"in this comment."})]})]}),"\n",(0,r.jsx)("img",{src:i(547).A,width:"800"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Why should I use this over a browser extension and/or mobile app scrobbler?"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.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)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Open-source"})," -- Get peace of mind knowing exactly how your personal data is being handled."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.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)(s.li,{children:[(0,r.jsx)(s.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)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Standardize your data"})," -- Match your scrobbles with the ",(0,r.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database to ensure scrobbled data is as correct and rich as possible."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"But I already scrobble my music to Last.fm/ListenBrainz, is multi-scrobbler for me?"})}),"\n",(0,r.jsxs)(s.p,{children:["Yes! You can use ",(0,r.jsxs)(s.a,{href:"/configuration/sources/lastfm-source",children:["Last.fm as a ",(0,r.jsx)(s.strong,{children:"Source"})]})," or ",(0,r.jsxs)(s.a,{href:"configuration/sources/listenbrainz-source",children:["Listenbrainz as a ",(0,r.jsx)(s.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)(s.p,{children:["Use the ",(0,r.jsx)(s.strong,{children:"Last.fm"})," tab in the ",(0,r.jsx)(s.a,{href:"/quickstart/#setup-sources",children:"Quickstart Sources"})," to get started."]}),"\n",(0,r.jsx)(s.h2,{id:"how-does-multi-scrobbler-ms-work",children:"How Does multi-scrobbler (MS) Work?"}),"\n",(0,r.jsxs)(s.p,{children:["You set up ",(0,r.jsx)(s.a,{href:"/configuration",children:"configurations"})," for one or more ",(0,r.jsx)(s.a,{href:"/configuration/sources",children:(0,r.jsx)(s.strong,{children:"Sources"})})," and one or more ",(0,r.jsx)(s.a,{href:"/configuration/clients",children:(0,r.jsx)(s.strong,{children:"Clients"})}),". MS monitors all of your configured ",(0,r.jsx)(s.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)(s.strong,{children:"Clients"})," that Source is configured to forward to."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Diagram"}),(0,r.jsx)("img",{className:"image-center",src:i(8113).A})]}),"\n",(0,r.jsx)(s.h3,{id:"source",children:"Source"}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.a,{href:"/configuration/sources",children:(0,r.jsx)(s.strong,{children:"Source"})})," is a data source that contains information about music you are playing or have listened to, such as: a desktop player, web music player, or cloud music service. Examples are ",(0,r.jsx)(s.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Navidrome"}),", etc..."]}),"\n",(0,r.jsx)(s.p,{children:"Source configurations consist of:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"A friendly name."}),"\n",(0,r.jsx)(s.li,{children:"Any data needed to communicate or authenticate with the Source."}),"\n",(0,r.jsx)(s.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)(s.h3,{id:"client",children:"Client"}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.a,{href:"/configuration/clients",children:(0,r.jsx)(s.strong,{children:"Client"})})," is an application that stores the historical information about what music you have played (scrobbles). Examples are ",(0,r.jsx)(s.strong,{children:"Koito, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,r.jsx)(s.p,{children:"Client configurations consist of:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"A friendly name."}),"\n",(0,r.jsx)(s.li,{children:"Any data needed to communicate or authenticate with the Client."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsxs)(s.a,{href:"/quickstart",children:["See the ",(0,r.jsx)(s.strong,{children:"Quick Start Guide"})]})}),"\n",(0,r.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsxs)(s.a,{href:"/installation",children:["See the ",(0,r.jsx)(s.strong,{children:"Installation"})," documentation"]})}),"\n",(0,r.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsxs)(s.a,{href:"/configuration",children:["See the ",(0,r.jsx)(s.strong,{children:"Configuration"})," documentation"]})}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(s.p,{children:"A status page with statistics, recent logs, and some runtime configuration options can be found at"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:"http://localhost:9078\n"})}),"\n",(0,r.jsx)(s.p,{children:"Output is also provided to stdout/stderr as well as file if specified in configuration."}),"\n",(0,r.jsx)(s.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)(s.h2,{id:"helpfaq",children:"Help/FAQ"}),"\n",(0,r.jsxs)(s.p,{children:["Having issues with connections or configuration? Check the ",(0,r.jsx)(s.a,{href:"/FAQ",children:"FAQ"})," before creating an issue!"]}),"\n",(0,r.jsx)(s.h2,{id:"development",children:"Development"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.a,{href:"/development/dev-common",children:"Detailed architecture and development guides for Sources/Clients"})}),"\n",(0,r.jsx)(s.h2,{id:"license",children:"License"}),"\n",(0,r.jsx)(s.p,{children:"MIT"})]})}function S(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(k,{...e})}):k(e)}function C(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8113(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/ms-visual-0609a849be6007ed7ced7e5237c33f68.png"},323(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/icon-ae97f2044a6600a69b9c4eeb60cef68e.png"},547(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/status-ui-c53e36a6c223e03ed8da8d27a9e39d8a.png"}}]); \ No newline at end of file diff --git a/assets/js/4edc808e.56f2ac9b.js b/assets/js/4edc808e.56f2ac9b.js new file mode 100644 index 00000000..615d1c78 --- /dev/null +++ b/assets/js/4edc808e.56f2ac9b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2677"],{9832(e,s,i){i.r(s),i.d(s,{metadata:()=>n,default:()=>S,frontMatter:()=>v,contentTitle:()=>y,toc:()=>w,assets:()=>_});var n=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/index.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"slug":"/","title":"Overview","sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"}}'),r=i(4848),l=i(8453),t=i(6540),o=i(8478),a=i(3878);let c=e=>{let{children:s,disabled:i,...n}=e;return(0,r.jsxs)("button",{className:"embla__button embla__button--prev".concat(i?" embla__button--disabled":""),type:"button",...n,children:[(0,r.jsx)("svg",{className:"embla__button__svg",viewBox:"0 0 532 532",children:(0,r.jsx)("path",{fill:"currentColor",d:"M355.66 11.354c13.793-13.805 36.208-13.805 50.001 0 13.785 13.804 13.785 36.238 0 50.034L201.22 266l204.442 204.61c13.785 13.805 13.785 36.239 0 50.044-13.793 13.796-36.208 13.796-50.002 0a5994246.277 5994246.277 0 0 0-229.332-229.454 35.065 35.065 0 0 1-10.326-25.126c0-9.2 3.393-18.26 10.326-25.2C172.192 194.973 332.731 34.31 355.66 11.354Z"})}),s]})},d=e=>{let{children:s,disabled:i,...n}=e;return(0,r.jsxs)("button",{className:"embla__button embla__button--next".concat(i?" embla__button--disabled":""),type:"button",...n,children:[(0,r.jsx)("svg",{className:"embla__button__svg",viewBox:"0 0 532 532",children:(0,r.jsx)("path",{fill:"currentColor",d:"M176.34 520.646c-13.793 13.805-36.208 13.805-50.001 0-13.785-13.804-13.785-36.238 0-50.034L330.78 266 126.34 61.391c-13.785-13.805-13.785-36.239 0-50.044 13.793-13.796 36.208-13.796 50.002 0 22.928 22.947 206.395 206.507 229.332 229.454a35.065 35.065 0 0 1 10.326 25.126c0 9.2-3.393 18.26-10.326 25.2-45.865 45.901-206.404 206.564-229.332 229.52Z"})}),s]})},h=e=>{let{selectedSnap:s,snapCount:i}=e;return(0,r.jsxs)("div",{className:"embla__selected-snap-display",children:[s+1," / ",i]})},u=i.p+"assets/images/ms-componentlist-2a77a42fc8ffcbb769b674ce610a4372.png",x=i.p+"assets/images/ms-componentlistdesktop-31a7dd1a58d76a62639d2be79bc02aab.png",f=i.p+"assets/images/ms-componentdetailed-57d8c74f2f7ed444101e1e0702f17455.png",j=i.p+"assets/images/ms-playlist-a5d067cf3fd1a763a659b1d5688cf8e9.jpg",m=i.p+"assets/images/ms-mbemptyquery-d0c753c8783453ee3f92adafad236fef.png",g=i.p+"assets/images/ms-logs-395c4d8ce62757f35e7c13d6ae9c0cf6.jpg",p=e=>{let{options:s}=e,[i,n]=(0,a.A)(s),{prevBtnDisabled:l,nextBtnDisabled:o,onPrevButtonClick:p,onNextButtonClick:b}=(e=>{let[s,i]=(0,t.useState)(!0),[n,r]=(0,t.useState)(!0),l=(0,t.useCallback)(()=>{e&&e.goToPrev()},[e]),o=(0,t.useCallback)(()=>{e&&e.goToNext()},[e]),a=(0,t.useCallback)(e=>{i(!e.canGoToPrev()),r(!e.canGoToNext())},[]);return(0,t.useEffect)(()=>{e&&(a(e),e.on("reinit",a).on("select",a))},[e,a]),{prevBtnDisabled:s,nextBtnDisabled:n,onPrevButtonClick:l,onNextButtonClick:o}})(n),{selectedSnap:v,snapCount:y}=(e=>{let[s,i]=(0,t.useState)(0),[n,r]=(0,t.useState)(0),l=(0,t.useCallback)(e=>{r(e.snapList().length),i(e.selectedSnap())},[]);return(0,t.useEffect)(()=>{e&&(l(e),e.on("select",l),e.on("reinit",l))},[e,l]),{selectedSnap:s,snapCount:n}})(n);return(0,r.jsxs)("div",{className:"embla",children:[(0,r.jsx)("div",{className:"embla__viewport",ref:i,children:(0,r.jsxs)("div",{className:"embla__container",children:[(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:x}),(0,r.jsx)("div",{className:"imageCaption",children:"Source/Client List on desktop"})]})},"1"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:u}),(0,r.jsx)("div",{className:"imageCaption",children:"Source/Client List on mobile"})]})},"2"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:f}),(0,r.jsx)("div",{className:"imageCaption",children:"Source/Client Details"})]})},"3"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:j}),(0,r.jsx)("div",{className:"imageCaption",children:"Search for Plays/Scrobbles with live updates"})]})},"4"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:m}),(0,r.jsx)("div",{className:"imageCaption",children:"Scrobble timeline audit trail with detailed errors"})]})},"5"),(0,r.jsx)("div",{className:"embla__slide",children:(0,r.jsxs)("div",{className:"embla__slide__container",children:[(0,r.jsx)("img",{src:g}),(0,r.jsx)("div",{className:"imageCaption",children:"Floating logs for dev-level troubleshooting"})]})},"6")]})}),(0,r.jsxs)("div",{className:"embla__controls",children:[(0,r.jsxs)("div",{className:"embla__buttons",children:[(0,r.jsx)(c,{onClick:p,disabled:l}),(0,r.jsx)(d,{onClick:b,disabled:o})]}),(0,r.jsx)(h,{selectedSnap:v,snapCount:y})]})]})},b=()=>(0,r.jsx)(o.default,{children:()=>(0,r.jsx)(p,{})}),v={slug:"/",title:"Overview",sidebar_position:1},y,_={},w=[{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 k(e){let s={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components},{Details:n,DetailsAdmo:t}=s;return n||C("Details",!0),t||C("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.img,{src:"https://img.shields.io/github/v/release/foxxmd/multi-scrobbler",alt:"Latest Release"}),"\n",(0,r.jsx)(s.img,{src:"https://img.shields.io/badge/License-MIT-yellow.svg",alt:"License: MIT"}),"\n",(0,r.jsx)(s.img,{src:"https://img.shields.io/docker/pulls/foxxmd/multi-scrobbler",alt:"Docker Pulls"})]}),"\n",(0,r.jsx)("img",{src:i(323).A,align:"right",alt:"multi-scrobbler logo",width:"180",height:"180"}),"\n",(0,r.jsxs)(s.p,{children:["A dockerized app that monitors your music listening activity from ",(0,r.jsx)(s.em,{children:"everywhere"})," and scrobbles it ",(0,r.jsx)(s.em,{children:"anywhere"}),"."]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Supports monitoring activity from many ",(0,r.jsx)(s.a,{href:"/configuration/sources",children:(0,r.jsx)(s.strong,{children:"Sources"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/applemusic",children:"Apple Music"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/azuracast",children:"Azuracast"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/deezer",children:"Deezer"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/google-cast",children:"Google Cast (Chromecast)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/icecast",children:"Icecast"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/jriver",children:"JRiver"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/kodi",children:"Kodi"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/koito-source",children:"Koito"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/listenbrainz-source",children:"ListenBrainz"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"ListenBrainz (Endpoint)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/mopidy",children:"Mopidy"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/mpd",children:"MPD (Music Player Daemon)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/mpris",children:"MPRIS (Linux Desktop)"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/musikcube",children:"Musikcube"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/listenbrainz-endpoint#setup-for-popular-apps",children:"Music Assistant"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/plex",children:"Plex"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/sonos",children:"Sonos"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/spotify",children:"Spotify"})}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/configuration/sources/subsonic",children:"Subsonic-compatible APIs"})," (like ",(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)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/webscrobbler",children:"WebScrobbler"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/vlc",children:"VLC"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/yamaha-musiccast",children:"Yamaha MusicCast"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/yandex-music",children:"Yandex Music"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/sources/youtube-music",children:"Youtube Music"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["Supports scrobbling to many ",(0,r.jsx)(s.a,{href:"/configuration/clients",children:(0,r.jsx)(s.strong,{children:"Clients"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/configuration/clients/discord",children:"Discord"})," (Now Playing)"]}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/koito",children:"Koito"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/librefm",children:"Libre.fm"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/listenbrainz",children:"ListenBrainz"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/configuration/clients/tealfm",children:"teal.fm"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["Enhance/correct scrobble data with ",(0,r.jsx)(s.a,{href:"/configuration/transforms",children:"search patterns"}),", ",(0,r.jsx)(s.a,{href:"/configuration/transforms",children:"built-in corrections"}),", or the ",(0,r.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database"]}),"\n",(0,r.jsxs)(s.li,{children:["Monitor status of Sources and Clients using ",(0,r.jsx)(s.a,{href:"/configuration#webhook-configurations",children:"webhooks (Gotify, Ntfy, Apprise)"})," or ",(0,r.jsx)(s.a,{href:"/configuration#health-endpoint",children:"healthcheck endpoint"})]}),"\n",(0,r.jsxs)(s.li,{children:["Supports ",(0,r.jsx)(s.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})," for scrobble Clients"]}),"\n",(0,r.jsx)(s.li,{children:"Supports configuring for single or multiple users (scrobbling for your friends and family!)"}),"\n",(0,r.jsx)(s.li,{children:"Web server interface for stats, basic control, and detailed logs"}),"\n",(0,r.jsx)(s.li,{children:"Graceful network and client failure handling (queued scrobbles that auto-retry)"}),"\n",(0,r.jsx)(s.li,{children:"Smart handling of credentials (persistent, authorization through app)"}),"\n",(0,r.jsxs)(s.li,{children:["Easy configuration through ",(0,r.jsx)(s.a,{href:"/configuration#configuration-types",children:"ENVs or JSON"})]}),"\n",(0,r.jsxs)(s.li,{children:["Install using ",(0,r.jsx)(s.a,{href:"/installation#docker",children:"Docker images for x86/ARM"})," or ",(0,r.jsx)(s.a,{href:"/installation#nodejs",children:"locally with NodeJS"})]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.a,{href:"/quickstart",children:(0,r.jsx)(s.strong,{children:"Quick Start Guide"})})}),"\n",(0,r.jsxs)(t,{type:"tip",summary:"New UI Preview",children:[(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.strong,{children:"full rewrite"})," of the UI is now available for preview. The new UI modernizes Multi-Scrobbler and gives you in depth insight into how your scrobbles are handled end-to-end."]}),(0,r.jsx)(b,{}),(0,r.jsxs)(s.p,{children:["To try out the stable-release preview navigate to ",(0,r.jsx)(s.code,{children:"http://yourMSDomain:9078/next"})]}),(0,r.jsxs)(s.p,{children:["Or to try out the ",(0,r.jsx)(s.strong,{children:"latest preview snapshot"})," see the docker image pinned ",(0,r.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/500#issuecomment-4917525794",children:"in this comment."})]})]}),"\n",(0,r.jsx)("img",{src:i(547).A,width:"800"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Why should I use this over a browser extension and/or mobile app scrobbler?"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.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)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Open-source"})," -- Get peace of mind knowing exactly how your personal data is being handled."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.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)(s.li,{children:[(0,r.jsx)(s.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)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Standardize your data"})," -- Match your scrobbles with the ",(0,r.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," database to ensure scrobbled data is as correct and rich as possible."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"But I already scrobble my music to Last.fm/ListenBrainz, is multi-scrobbler for me?"})}),"\n",(0,r.jsxs)(s.p,{children:["Yes! You can use ",(0,r.jsxs)(s.a,{href:"/configuration/sources/lastfm-source",children:["Last.fm as a ",(0,r.jsx)(s.strong,{children:"Source"})]})," or ",(0,r.jsxs)(s.a,{href:"configuration/sources/listenbrainz-source",children:["Listenbrainz as a ",(0,r.jsx)(s.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)(s.p,{children:["Use the ",(0,r.jsx)(s.strong,{children:"Last.fm"})," tab in the ",(0,r.jsx)(s.a,{href:"/quickstart/#setup-sources",children:"Quickstart Sources"})," to get started."]}),"\n",(0,r.jsx)(s.h2,{id:"how-does-multi-scrobbler-ms-work",children:"How Does multi-scrobbler (MS) Work?"}),"\n",(0,r.jsxs)(s.p,{children:["You set up ",(0,r.jsx)(s.a,{href:"/configuration",children:"configurations"})," for one or more ",(0,r.jsx)(s.a,{href:"/configuration/sources",children:(0,r.jsx)(s.strong,{children:"Sources"})})," and one or more ",(0,r.jsx)(s.a,{href:"/configuration/clients",children:(0,r.jsx)(s.strong,{children:"Clients"})}),". MS monitors all of your configured ",(0,r.jsx)(s.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)(s.strong,{children:"Clients"})," that Source is configured to forward to."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:"Diagram"}),(0,r.jsx)("img",{className:"image-center",src:i(8113).A})]}),"\n",(0,r.jsx)(s.h3,{id:"source",children:"Source"}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.a,{href:"/configuration/sources",children:(0,r.jsx)(s.strong,{children:"Source"})})," is a data source that contains information about music you are playing or have listened to, such as: a desktop player, web music player, or cloud music service. Examples are ",(0,r.jsx)(s.strong,{children:"Spotify, Jellyfin, Plex, Youtube Music, Navidrome"}),", etc..."]}),"\n",(0,r.jsx)(s.p,{children:"Source configurations consist of:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"A friendly name."}),"\n",(0,r.jsx)(s.li,{children:"Any data needed to communicate or authenticate with the Source."}),"\n",(0,r.jsx)(s.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)(s.h3,{id:"client",children:"Client"}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.a,{href:"/configuration/clients",children:(0,r.jsx)(s.strong,{children:"Client"})})," is an application that stores the historical information about what music you have played (scrobbles). Examples are ",(0,r.jsx)(s.strong,{children:"Koito, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,r.jsx)(s.p,{children:"Client configurations consist of:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"A friendly name."}),"\n",(0,r.jsx)(s.li,{children:"Any data needed to communicate or authenticate with the Client."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsxs)(s.a,{href:"/quickstart",children:["See the ",(0,r.jsx)(s.strong,{children:"Quick Start Guide"})]})}),"\n",(0,r.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsxs)(s.a,{href:"/installation",children:["See the ",(0,r.jsx)(s.strong,{children:"Installation"})," documentation"]})}),"\n",(0,r.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsxs)(s.a,{href:"/configuration",children:["See the ",(0,r.jsx)(s.strong,{children:"Configuration"})," documentation"]})}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(s.p,{children:"A status page with statistics, recent logs, and some runtime configuration options can be found at"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:"http://localhost:9078\n"})}),"\n",(0,r.jsx)(s.p,{children:"Output is also provided to stdout/stderr as well as file if specified in configuration."}),"\n",(0,r.jsx)(s.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)(s.h2,{id:"helpfaq",children:"Help/FAQ"}),"\n",(0,r.jsxs)(s.p,{children:["Having issues with connections or configuration? Check the ",(0,r.jsx)(s.a,{href:"/FAQ",children:"FAQ"})," before creating an issue!"]}),"\n",(0,r.jsx)(s.h2,{id:"development",children:"Development"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.a,{href:"/development/dev-common",children:"Detailed architecture and development guides for Sources/Clients"})}),"\n",(0,r.jsx)(s.h2,{id:"license",children:"License"}),"\n",(0,r.jsx)(s.p,{children:"MIT"})]})}function S(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(k,{...e})}):k(e)}function C(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8113(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/ms-visual-0609a849be6007ed7ced7e5237c33f68.png"},323(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/icon-ae97f2044a6600a69b9c4eeb60cef68e.png"},547(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/status-ui-c53e36a6c223e03ed8da8d27a9e39d8a.png"}}]); \ No newline at end of file diff --git a/assets/js/4f7d60c5.1123e42a.js b/assets/js/4f7d60c5.1123e42a.js deleted file mode 100644 index 5b9d95fc..00000000 --- a/assets/js/4f7d60c5.1123e42a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9515"],{7040(e,n,i){i.r(n),i.d(n,{metadata:()=>t,default:()=>b,frontMatter:()=>a,contentTitle:()=>d,toc:()=>x,assets:()=>h});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/listenbrainz.mdx?plain=1","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(4848),s=i(8453);i(8194),i(698),i(2170);var o=i(5248);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"LZ_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LZ_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"LZ_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LZ_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LZ_URL"})}),(0,r.jsx)(n.td,{children:"string"}),(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:"URL for the ListenBrainz server, if not using the default"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"LZ_TOKEN"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"User token for the user to scrobble for"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"LZ_USER"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Username of the user to scrobble for"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}let a={title:"Listenbrainz",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},x=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",admonition:"admonition",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...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.A,client:!0,ambiguous:!0,name:"listenbrainz",children:(0,r.jsx)(c,{})})]})}function b(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},5248(e,n,i){i.d(n,{A:()=>t});let t='[\n {\n "name": "Foxx LZ Client",\n "id": "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": "Foxx LZ Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/4f7d60c5.81c82ae0.js b/assets/js/4f7d60c5.81c82ae0.js new file mode 100644 index 00000000..f5c529db --- /dev/null +++ b/assets/js/4f7d60c5.81c82ae0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9515"],{7040(e,n,i){i.r(n),i.d(n,{metadata:()=>t,default:()=>b,frontMatter:()=>a,contentTitle:()=>d,toc:()=>x,assets:()=>h});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/listenbrainz.mdx?plain=1","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(4848),s=i(8453);i(8194),i(698),i(2170);var o=i(5248);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"LZ_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LZ_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"LZ_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LZ_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LZ_URL"})}),(0,r.jsx)(n.td,{children:"string"}),(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:"URL for the ListenBrainz server, if not using the default"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"LZ_TOKEN"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"User token for the user to scrobble for"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"LZ_USER"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Username of the user to scrobble for"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}let a={title:"Listenbrainz",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},x=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",admonition:"admonition",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...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.A,client:!0,ambiguous:!0,name:"listenbrainz",children:(0,r.jsx)(c,{})})]})}function b(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},5248(e,n,i){i.d(n,{A:()=>t});let t='[\n {\n "name": "Foxx LZ Client",\n "id": "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": "Foxx LZ Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/5930ad03.ad7a7ac4.js b/assets/js/5930ad03.ad7a7ac4.js new file mode 100644 index 00000000..9883437a --- /dev/null +++ b/assets/js/5930ad03.ad7a7ac4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9077"],{3244(e,s,i){i.r(s),i.d(s,{metadata:()=>n,default:()=>x,frontMatter:()=>d,contentTitle:()=>c,toc:()=>h,assets:()=>a});var n=JSON.parse('{"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.","source":"@site/docs/configuration/sources/mopidy.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/mopidy","permalink":"/multi-scrobbler/configuration/sources/mopidy","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mopidy.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Mopidy","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/sources/maloja"},"next":{"title":"MPD (Music Player Daemon)","permalink":"/multi-scrobbler/configuration/sources/mpd"}}'),t=i(4848),r=i(8453);function l(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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:(0,t.jsx)(s.em,{children:(0,t.jsx)(s.strong,{children:(0,t.jsx)(s.code,{children:"MOPIDY_ID"})})})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsxs)(s.td,{children:["A globally unique ID EX ",(0,t.jsx)(s.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_NAME"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsxs)(s.td,{children:["Value of ",(0,t.jsx)(s.code,{children:"MOPIDY_ID"})]}),(0,t.jsxs)(s.td,{children:["A vanity name EX ",(0,t.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_ENABLE"})}),(0,t.jsx)(s.td,{children:"boolean"}),(0,t.jsx)(s.td,{children:"true"}),(0,t.jsx)(s.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_URL"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{children:"ws://localhost:6680/mopidy/ws/"}),(0,t.jsx)(s.td,{children:"URL of the Mopidy HTTP server to connect to"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_URI_DENYLIST"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Do not scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_URI_ALLOWLIST"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Only scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_ALBUM_DENYLIST"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{children:"Soundcloud"}),(0,t.jsx)(s.td,{children:"Remove album data that matches any case-insensitive string from this list when scrobbling,"})]})]})]})}function o(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}i(8194),i(698),i(2170);let d={title:"Mopidy",toc_min_heading_level:2,toc_max_heading_level:5},c,a={},h=[{value:"URL",id:"url",level:4},{value:"URI Blacklist/Whitelist",id:"uri-blacklistwhitelist",level:3},{value:"Album Blacklist",id:"album-blacklist",level:3},{value:"Configuration",id:"configuration",level:2}];function u(e){let s={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components},{Config:i,Details:n}=s;return i||m("Config",!0),n||m("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.p,{children:["Mopidy is a headless music server that supports playing music from many ",(0,t.jsx)(s.a,{href:"https://mopidy.com/ext/",children:"standard and non-standard sources such as Pandora, Bandcamp, and Tunein."})]}),"\n",(0,t.jsx)(s.p,{children:"multi-scrobbler can scrobble tracks played from any Mopidy backend source, regardless of where you listen to them."}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.p,{children:["You must have ",(0,t.jsx)(s.a,{href:"https://mopidy.com/ext/http",children:"Mopidy-HTTP extension"})," enabled for this integration to work."]})}),"\n",(0,t.jsx)(s.h4,{id:"url",children:"URL"}),"\n",(0,t.jsxs)(s.p,{children:["The URL used to connect to the Mopidy server, set in your ",(0,t.jsxs)(s.a,{href:"#configuration",children:["file config as ",(0,t.jsx)(s.code,{children:"url"}),"."]})," The URL used to connect ultimately must be formed like this:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Syntax => [protocol]://[hostname]:[port]/[path]\nDefault => ws://localhost:6680/mopidy/ws\n"})}),"\n",(0,t.jsxs)(s.p,{children:["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 ",(0,t.jsx)(s.strong,{children:"not"})," standard you must explicitly define it."]}),"\n",(0,t.jsxs)(s.admonition,{title:"Mopidy Configuration",type:"tip",children:[(0,t.jsxs)(s.p,{children:["Make sure the hostname and port number match what is found in the Mopidy configuration file ",(0,t.jsx)(s.code,{children:"mopidy.conf"}),":"]}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-ini",children:"[http]\nhostname = localhost\nport = 6680\n"})})]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"URL Transform Examples"}),(0,t.jsxs)(s.p,{children:["Examples of a given ",(0,t.jsx)(s.code,{children:"url"})," in your file config and the final URL multi-scrobbler will use to connect to Mopidy:"]}),(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:(0,t.jsx)(s.code,{children:"url"})}),(0,t.jsx)(s.th,{children:"Transformed URL"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"(none set)"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://localhost:6680/mopidy/ws"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"mopidy.mydomain.com"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://mopidy.mydomain.com:6680/mopidy/ws/"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"192.168.0.101:3456"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://192.168.0.101:3456/mopidy/ws/"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"mopidy.mydomain.com:80/MOPWS"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://mopidy.mydomain.com:80/MOPWS"})})]})]})]})]}),"\n",(0,t.jsx)(s.h3,{id:"uri-blacklistwhitelist",children:"URI Blacklist/Whitelist"}),"\n",(0,t.jsxs)(s.p,{children:["If you wish to disallow or only allow scrobbling from some sources played through Mopidy you can specify these using ",(0,t.jsx)(s.code,{children:"uriBlacklist"})," or ",(0,t.jsx)(s.code,{children:"uriWhitelist"})," in your config. multi-scrobbler will check the list to see if any string matches the START of the ",(0,t.jsx)(s.code,{children:"uri"})," on a track. If whitelist is used then blacklist is ignored. All strings are case-insensitive."]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "uriBlacklist": ["soundcloud"]\n}\n'})}),(0,t.jsxs)(s.p,{children:["Will prevent multi-scrobbler from scrobbling any Mopidy track that start with a ",(0,t.jsx)(s.code,{children:"uri"})," like ",(0,t.jsx)(s.code,{children:"soundcloud:song:MySong-1234"})]})]}),"\n",(0,t.jsx)(s.h3,{id:"album-blacklist",children:"Album Blacklist"}),"\n",(0,t.jsx)(s.p,{children:'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.'}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "albumBlacklist": ["SoundCloud", "Mixcloud"]\n}\n'})}),(0,t.jsx)(s.p,{children:"If a track would be scrobbled like"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Album: Soundcloud, Track: My Cool Track, Artist: A Cool Artist\n"})}),(0,t.jsx)(s.p,{children:"then multi-scrobbler will instead scrobble"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Track: My Cool Track, Artist: A Cool Artist\n"})})]}),"\n",(0,t.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(i,{config:"MopidySourceConfig",fileContent:'[\n {\n "name": "Mopidy Desktop",\n "id": "MyMopidy",\n "enable": true,\n "data": {\n "url": "localhost",\n "uriBlacklist": [],\n "uriWhitelist": [],\n "albumBlacklist": []\n }\n }\n]\n',name:"mopidy",children:(0,t.jsx)(o,{})})]})}function x(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}function m(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/5930ad03.bc7160d6.js b/assets/js/5930ad03.bc7160d6.js deleted file mode 100644 index 47a92da5..00000000 --- a/assets/js/5930ad03.bc7160d6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9077"],{3244(e,s,i){i.r(s),i.d(s,{metadata:()=>n,default:()=>x,frontMatter:()=>d,contentTitle:()=>c,toc:()=>h,assets:()=>a});var n=JSON.parse('{"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.","source":"@site/docs/configuration/sources/mopidy.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/mopidy","permalink":"/multi-scrobbler/configuration/sources/mopidy","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mopidy.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Mopidy","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/sources/maloja"},"next":{"title":"MPD (Music Player Daemon)","permalink":"/multi-scrobbler/configuration/sources/mpd"}}'),t=i(4848),r=i(8453);function l(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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:(0,t.jsx)(s.em,{children:(0,t.jsx)(s.strong,{children:(0,t.jsx)(s.code,{children:"MOPIDY_ID"})})})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsxs)(s.td,{children:["A globally unique ID EX ",(0,t.jsx)(s.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_NAME"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsxs)(s.td,{children:["Value of ",(0,t.jsx)(s.code,{children:"MOPIDY_ID"})]}),(0,t.jsxs)(s.td,{children:["A vanity name EX ",(0,t.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_ENABLE"})}),(0,t.jsx)(s.td,{children:"boolean"}),(0,t.jsx)(s.td,{children:"true"}),(0,t.jsx)(s.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_URL"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{children:"ws://localhost:6680/mopidy/ws/"}),(0,t.jsx)(s.td,{children:"URL of the Mopidy HTTP server to connect to"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_URI_DENYLIST"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Do not scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_URI_ALLOWLIST"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Only scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"MOPIDY_ALBUM_DENYLIST"})}),(0,t.jsx)(s.td,{children:"string"}),(0,t.jsx)(s.td,{children:"Soundcloud"}),(0,t.jsx)(s.td,{children:"Remove album data that matches any case-insensitive string from this list when scrobbling,"})]})]})]})}function o(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}i(8194),i(698),i(2170);let d={title:"Mopidy",toc_min_heading_level:2,toc_max_heading_level:5},c,a={},h=[{value:"URL",id:"url",level:4},{value:"URI Blacklist/Whitelist",id:"uri-blacklistwhitelist",level:3},{value:"Album Blacklist",id:"album-blacklist",level:3},{value:"Configuration",id:"configuration",level:2}];function u(e){let s={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components},{Config:i,Details:n}=s;return i||m("Config",!0),n||m("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.p,{children:["Mopidy is a headless music server that supports playing music from many ",(0,t.jsx)(s.a,{href:"https://mopidy.com/ext/",children:"standard and non-standard sources such as Pandora, Bandcamp, and Tunein."})]}),"\n",(0,t.jsx)(s.p,{children:"multi-scrobbler can scrobble tracks played from any Mopidy backend source, regardless of where you listen to them."}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.p,{children:["You must have ",(0,t.jsx)(s.a,{href:"https://mopidy.com/ext/http",children:"Mopidy-HTTP extension"})," enabled for this integration to work."]})}),"\n",(0,t.jsx)(s.h4,{id:"url",children:"URL"}),"\n",(0,t.jsxs)(s.p,{children:["The URL used to connect to the Mopidy server, set in your ",(0,t.jsxs)(s.a,{href:"#configuration",children:["file config as ",(0,t.jsx)(s.code,{children:"url"}),"."]})," The URL used to connect ultimately must be formed like this:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Syntax => [protocol]://[hostname]:[port]/[path]\nDefault => ws://localhost:6680/mopidy/ws\n"})}),"\n",(0,t.jsxs)(s.p,{children:["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 ",(0,t.jsx)(s.strong,{children:"not"})," standard you must explicitly define it."]}),"\n",(0,t.jsxs)(s.admonition,{title:"Mopidy Configuration",type:"tip",children:[(0,t.jsxs)(s.p,{children:["Make sure the hostname and port number match what is found in the Mopidy configuration file ",(0,t.jsx)(s.code,{children:"mopidy.conf"}),":"]}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-ini",children:"[http]\nhostname = localhost\nport = 6680\n"})})]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"URL Transform Examples"}),(0,t.jsxs)(s.p,{children:["Examples of a given ",(0,t.jsx)(s.code,{children:"url"})," in your file config and the final URL multi-scrobbler will use to connect to Mopidy:"]}),(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:(0,t.jsx)(s.code,{children:"url"})}),(0,t.jsx)(s.th,{children:"Transformed URL"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"(none set)"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://localhost:6680/mopidy/ws"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"mopidy.mydomain.com"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://mopidy.mydomain.com:6680/mopidy/ws/"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"192.168.0.101:3456"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://192.168.0.101:3456/mopidy/ws/"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"mopidy.mydomain.com:80/MOPWS"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"ws://mopidy.mydomain.com:80/MOPWS"})})]})]})]})]}),"\n",(0,t.jsx)(s.h3,{id:"uri-blacklistwhitelist",children:"URI Blacklist/Whitelist"}),"\n",(0,t.jsxs)(s.p,{children:["If you wish to disallow or only allow scrobbling from some sources played through Mopidy you can specify these using ",(0,t.jsx)(s.code,{children:"uriBlacklist"})," or ",(0,t.jsx)(s.code,{children:"uriWhitelist"})," in your config. multi-scrobbler will check the list to see if any string matches the START of the ",(0,t.jsx)(s.code,{children:"uri"})," on a track. If whitelist is used then blacklist is ignored. All strings are case-insensitive."]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "uriBlacklist": ["soundcloud"]\n}\n'})}),(0,t.jsxs)(s.p,{children:["Will prevent multi-scrobbler from scrobbling any Mopidy track that start with a ",(0,t.jsx)(s.code,{children:"uri"})," like ",(0,t.jsx)(s.code,{children:"soundcloud:song:MySong-1234"})]})]}),"\n",(0,t.jsx)(s.h3,{id:"album-blacklist",children:"Album Blacklist"}),"\n",(0,t.jsx)(s.p,{children:'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.'}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "albumBlacklist": ["SoundCloud", "Mixcloud"]\n}\n'})}),(0,t.jsx)(s.p,{children:"If a track would be scrobbled like"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Album: Soundcloud, Track: My Cool Track, Artist: A Cool Artist\n"})}),(0,t.jsx)(s.p,{children:"then multi-scrobbler will instead scrobble"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Track: My Cool Track, Artist: A Cool Artist\n"})})]}),"\n",(0,t.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(i,{config:"MopidySourceConfig",fileContent:'[\n {\n "name": "Mopidy Desktop",\n "id": "MyMopidy",\n "enable": true,\n "data": {\n "url": "localhost",\n "uriBlacklist": [],\n "uriWhitelist": [],\n "albumBlacklist": []\n }\n }\n]\n',name:"mopidy",children:(0,t.jsx)(o,{})})]})}function x(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}function m(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/5a378701.abc8db86.js b/assets/js/5a378701.abc8db86.js new file mode 100644 index 00000000..16f7ab73 --- /dev/null +++ b/assets/js/5a378701.abc8db86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3922"],{1843(e,s,n){n.r(s),n.d(s,{metadata:()=>i,default:()=>j,frontMatter:()=>o,contentTitle:()=>c,toc:()=>a,assets:()=>h});var i=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/jellyfin.mdx?plain=1","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=n(4848),l=n(8453);function t(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_ID"})})})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["A globally unique ID EX ",(0,r.jsx)(s.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_NAME"})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Value of ",(0,r.jsx)(s.code,{children:"JELLYFIN_ID"})]}),(0,r.jsxs)(s.td,{children:["A vanity name EX ",(0,r.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_ENABLE"})}),(0,r.jsx)(s.td,{children:"boolean"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.em,{children:(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_USER"})})})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"The username of the user to authenticate for or track scrobbles for"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Password of the username to authenticate for"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"API Key to authenticate with."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.em,{children:(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_URL"})})})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["HOST",":PORT"," of the Jellyfin server to connect to"]})]}),(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:"string OR true"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["Only scrobble for specific users from this comma-delimited list. If ",(0,r.jsx)(s.code,{children:"true"}),", scrobble for all users."]})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Do not scrobble for users from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Only scrobble if device or application name contains strings from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Do not scrobble if device or application name contains strings from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Only scrobble if library name contains string from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Do not scrobble if library name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_FRONTEND_URL_OVERRIDE"})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["HOST",":PORT"," of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_MEDIATYPES_ALLOW"})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Allow media types from this comma-delimited list to be scrobbled"})]})]})]})}function d(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(t,{...e})}):t(e)}n(8194),n(698),n(2170);let o={title:"Jellyfin",toc_min_heading_level:2,toc_max_heading_level:5},c,h={},a=[{value:"Configuration",id:"configuration",level:4}];function x(e){let s={a:"a",code:"code",em:"em",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components},{Config:n,DetailsAdmo:i}=s;return n||u("Config",!0),i||u("DetailsAdmo",!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)(i,{type:"tip",summary:"Important Defaults",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 ",(0,r.jsx)(s.em,{children:"library"})," types (like those labelled as ",(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 allow other media types to be scrobbled set ",(0,r.jsx)(s.code,{children:"allowMediaTypes"})," or ",(0,r.jsx)(s.code,{children:"JELLYFIN_MEDIATYPES_ALLOW"})," with a list of ",(0,r.jsx)(s.a,{href:"https://github.com/jellyfin/jellyfin-sdk-typescript/blob/master/src/generated-client/models/media-type.ts#L22",children:"official types"}),".","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["One or more of: ",(0,r.jsx)(s.code,{children:"Unknown"}),", ",(0,r.jsx)(s.code,{children:"Video"}),", ",(0,r.jsx)(s.code,{children:"Audio"}),", ",(0,r.jsx)(s.code,{children:"Photo"}),", ",(0,r.jsx)(s.code,{children:"Book"})]}),"\n",(0,r.jsxs)(s.li,{children:["If you use this setting ",(0,r.jsxs)(s.strong,{children:["you must explicitly specify ",(0,r.jsx)(s.code,{children:"Audio"})]}),", it will no longer be provided as a default"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,r.jsxs)(i,{type:"tip",summary:"External Asset URL",children:[(0,r.jsxs)(s.p,{children:["If you use MS and Jellyfin on an internal or otherwise inaccessible network but still want album art assets used in the UI or for ",(0,r.jsx)(s.a,{href:"/configuration/clients/discord",children:"Discord"})," to be accessible you can specify a URL to replace your internal url."]}),(0,r.jsxs)(s.p,{children:["Use (file) ",(0,r.jsx)(s.code,{children:"frontendUrlOverride"})," or (env) ",(0,r.jsx)(s.code,{children:"JELLYFIN_FRONTEND_URL_OVERRIDE"})," to replace ",(0,r.jsx)(s.code,{children:"url"}),"/",(0,r.jsx)(s.code,{children:"JELLYFIN_URL"}),", respectively, when rendering links for the dashboard UI or other resources."]}),(0,r.jsx)(s.p,{children:"Example:"}),(0,r.jsxs)(s.p,{children:["Your ",(0,r.jsx)(s.code,{children:"JELLYFIN_URL"})," is ",(0,r.jsx)(s.code,{children:"http://jellyfin:8096"})," but your Jellyfin instance is externally accessible (by MS or in general) at ",(0,r.jsx)(s.code,{children:"https://jellyfin.mydomain.com"}),"."]}),(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"JELLYFIN_FRONTEND_URL_OVERRIDE=https://jellyfin.mydomain.com"})," in order for the MS dashboard to use ",(0,r.jsx)(s.code,{children:"https://jellyfin.mydomain.com/art/1234.jpg"})," when linking to album art."]})]}),"\n",(0,r.jsx)(s.h4,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n,{config:"JellyApiSourceConfig",fileContent:'[\n {\n "name": "Cool JF Server",\n "enable": true,\n "id": "myJellyfin",\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 "allowMediaTypes": ["audio"],\n "frontendUrlOverride": "https://myJellyfinExternal.tld"\n },\n "options": {\n "logPayload": true,\n "logFilterFailure": "debug"\n }\n }\n]\n',name:"jellyfin",children:(0,r.jsx)(d,{})})]})}function j(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function u(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/5a378701.f804e785.js b/assets/js/5a378701.f804e785.js deleted file mode 100644 index 505866cf..00000000 --- a/assets/js/5a378701.f804e785.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3922"],{1843(e,s,n){n.r(s),n.d(s,{metadata:()=>i,default:()=>j,frontMatter:()=>o,contentTitle:()=>c,toc:()=>a,assets:()=>h});var i=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/jellyfin.mdx?plain=1","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=n(4848),l=n(8453);function t(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_ID"})})})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["A globally unique ID EX ",(0,r.jsx)(s.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_NAME"})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsxs)(s.td,{children:["Value of ",(0,r.jsx)(s.code,{children:"JELLYFIN_ID"})]}),(0,r.jsxs)(s.td,{children:["A vanity name EX ",(0,r.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_ENABLE"})}),(0,r.jsx)(s.td,{children:"boolean"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.em,{children:(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_USER"})})})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"The username of the user to authenticate for or track scrobbles for"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Password of the username to authenticate for"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"API Key to authenticate with."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.em,{children:(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_URL"})})})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["HOST",":PORT"," of the Jellyfin server to connect to"]})]}),(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:"string OR true"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["Only scrobble for specific users from this comma-delimited list. If ",(0,r.jsx)(s.code,{children:"true"}),", scrobble for all users."]})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Do not scrobble for users from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Only scrobble if device or application name contains strings from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Do not scrobble if device or application name contains strings from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Only scrobble if library name contains string from this comma-delimited list"})]}),(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:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Do not scrobble if library name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_FRONTEND_URL_OVERRIDE"})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["HOST",":PORT"," of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from)"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"JELLYFIN_MEDIATYPES_ALLOW"})}),(0,r.jsx)(s.td,{children:"string"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Allow media types from this comma-delimited list to be scrobbled"})]})]})]})}function d(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(t,{...e})}):t(e)}n(8194),n(698),n(2170);let o={title:"Jellyfin",toc_min_heading_level:2,toc_max_heading_level:5},c,h={},a=[{value:"Configuration",id:"configuration",level:4}];function x(e){let s={a:"a",code:"code",em:"em",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components},{Config:n,DetailsAdmo:i}=s;return n||u("Config",!0),i||u("DetailsAdmo",!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)(i,{type:"tip",summary:"Important Defaults",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 ",(0,r.jsx)(s.em,{children:"library"})," types (like those labelled as ",(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 allow other media types to be scrobbled set ",(0,r.jsx)(s.code,{children:"allowMediaTypes"})," or ",(0,r.jsx)(s.code,{children:"JELLYFIN_MEDIATYPES_ALLOW"})," with a list of ",(0,r.jsx)(s.a,{href:"https://github.com/jellyfin/jellyfin-sdk-typescript/blob/master/src/generated-client/models/media-type.ts#L22",children:"official types"}),".","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["One or more of: ",(0,r.jsx)(s.code,{children:"Unknown"}),", ",(0,r.jsx)(s.code,{children:"Video"}),", ",(0,r.jsx)(s.code,{children:"Audio"}),", ",(0,r.jsx)(s.code,{children:"Photo"}),", ",(0,r.jsx)(s.code,{children:"Book"})]}),"\n",(0,r.jsxs)(s.li,{children:["If you use this setting ",(0,r.jsxs)(s.strong,{children:["you must explicitly specify ",(0,r.jsx)(s.code,{children:"Audio"})]}),", it will no longer be provided as a default"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,r.jsxs)(i,{type:"tip",summary:"External Asset URL",children:[(0,r.jsxs)(s.p,{children:["If you use MS and Jellyfin on an internal or otherwise inaccessible network but still want album art assets used in the UI or for ",(0,r.jsx)(s.a,{href:"/configuration/clients/discord",children:"Discord"})," to be accessible you can specify a URL to replace your internal url."]}),(0,r.jsxs)(s.p,{children:["Use (file) ",(0,r.jsx)(s.code,{children:"frontendUrlOverride"})," or (env) ",(0,r.jsx)(s.code,{children:"JELLYFIN_FRONTEND_URL_OVERRIDE"})," to replace ",(0,r.jsx)(s.code,{children:"url"}),"/",(0,r.jsx)(s.code,{children:"JELLYFIN_URL"}),", respectively, when rendering links for the dashboard UI or other resources."]}),(0,r.jsx)(s.p,{children:"Example:"}),(0,r.jsxs)(s.p,{children:["Your ",(0,r.jsx)(s.code,{children:"JELLYFIN_URL"})," is ",(0,r.jsx)(s.code,{children:"http://jellyfin:8096"})," but your Jellyfin instance is externally accessible (by MS or in general) at ",(0,r.jsx)(s.code,{children:"https://jellyfin.mydomain.com"}),"."]}),(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"JELLYFIN_FRONTEND_URL_OVERRIDE=https://jellyfin.mydomain.com"})," in order for the MS dashboard to use ",(0,r.jsx)(s.code,{children:"https://jellyfin.mydomain.com/art/1234.jpg"})," when linking to album art."]})]}),"\n",(0,r.jsx)(s.h4,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n,{config:"JellyApiSourceConfig",fileContent:'[\n {\n "name": "Cool JF Server",\n "enable": true,\n "id": "myJellyfin",\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 "allowMediaTypes": ["audio"],\n "frontendUrlOverride": "https://myJellyfinExternal.tld"\n },\n "options": {\n "logPayload": true,\n "logFilterFailure": "debug"\n }\n }\n]\n',name:"jellyfin",children:(0,r.jsx)(d,{})})]})}function j(e={}){let{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function u(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/5a6ebb5c.0af53e22.js b/assets/js/5a6ebb5c.0af53e22.js deleted file mode 100644 index bbb723aa..00000000 --- a/assets/js/5a6ebb5c.0af53e22.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7211"],{2558(i,e,s){s.r(e),s.d(e,{metadata:()=>n,default:()=>h,frontMatter:()=>c,contentTitle:()=>t,toc:()=>d,assets:()=>l});var n=JSON.parse('{"id":"configuration/clients/discord/discord","title":"Discord","description":"Discord Client Overview","source":"@site/docs/configuration/clients/discord/discord.mdx","sourceDirName":"configuration/clients/discord","slug":"/configuration/clients/discord/","permalink":"/multi-scrobbler/configuration/clients/discord/","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Discord","description":"Discord Client Overview","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/clients/"},"next":{"title":"Discord (App)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-app"}}'),r=s(4848),o=s(8453);let c={sidebar_position:2,title:"Discord",description:"Discord Client Overview",toc_max_heading_level:4},t,l={},d=[{value:"App",id:"app",level:2},{value:"Headless",id:"headless",level:2}];function a(i){let e={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...i.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(e.p,{children:["This scrobbler uses ",(0,r.jsx)(e.strong,{children:(0,r.jsx)(e.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})})," functionality to set your Discord ",(0,r.jsx)(e.a,{href:"https://docs.discord.com/developers/rich-presence/overview",children:"Rich Presence"})," to the music you are currently monitoring with multi-scrobbler."]}),"\n",(0,r.jsx)("img",{src:s(6170).A,height:"127"}),"\n",(0,r.jsx)(e.p,{children:"There are two types of Discord integrations to choose from:"}),"\n",(0,r.jsx)(e.h2,{id:"app",children:"App"}),"\n",(0,r.jsxs)(e.p,{children:["The ",(0,r.jsx)(e.strong,{children:"App"})," integration uses an ",(0,r.jsx)(e.strong,{children:"existing"})," Discord application on a desktop computer to set Rich Presence."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:'Uses "permitted" access to Discord, no TOS issues'}),"\n",(0,r.jsx)(e.li,{children:"More restricted customization compared to Headless"}),"\n",(0,r.jsx)(e.li,{children:"Only active when your existing Discord application is open"}),"\n",(0,r.jsxs)(e.li,{children:["For most scenarios it requires additional, OS-specific steps to setup correctly","\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"May require an additional program on your machine to relay the Discord connection"}),"\n",(0,r.jsx)(e.li,{children:"This is potentially insecure, or less secure, then Headless"}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsxs)(e.strong,{children:["Can use ",(0,r.jsx)(e.a,{href:"/configuration/clients/discord/discord-app#discord-connection",children:"discord in a container"})," as an easy alternative"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"This is a Headless-like experience"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.a,{href:"/configuration/clients/discord/discord-app",children:(0,r.jsx)(e.strong,{children:"App Docs"})})}),"\n",(0,r.jsx)(e.h2,{id:"headless",children:"Headless"}),"\n",(0,r.jsxs)(e.p,{children:["The ",(0,r.jsx)(e.strong,{children:"Headless"})," integration uses Discord cloud Gateway/API, directly, to set Rich Presence."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Does not require an existing Discord application (uses Discord cloud API)"}),"\n",(0,r.jsxs)(e.li,{children:["Using this ",(0,r.jsx)(e.strong,{children:"Violates Discord TOS"})," because it requires a user token"]}),"\n",(0,r.jsx)(e.li,{children:"More customization than App integration"}),"\n",(0,r.jsxs)(e.li,{children:["Active if ",(0,r.jsx)(e.strong,{children:"any"})," Discord application is online"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.a,{href:"/configuration/clients/discord/discord-headless",children:(0,r.jsx)(e.strong,{children:"Headless Docs"})})})]})}function h(i={}){let{wrapper:e}={...(0,o.R)(),...i.components};return e?(0,r.jsx)(e,{...i,children:(0,r.jsx)(a,{...i})}):a(i)}},6170(i,e,s){s.d(e,{A:()=>n});let n=s.p+"assets/images/discord_presence_art-3260bd6302b2f0d1f13b45762cc908de.png"}}]); \ No newline at end of file diff --git a/assets/js/5a6ebb5c.127bc10c.js b/assets/js/5a6ebb5c.127bc10c.js new file mode 100644 index 00000000..c45082be --- /dev/null +++ b/assets/js/5a6ebb5c.127bc10c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7211"],{2558(i,e,s){s.r(e),s.d(e,{metadata:()=>n,default:()=>h,frontMatter:()=>c,contentTitle:()=>t,toc:()=>d,assets:()=>l});var n=JSON.parse('{"id":"configuration/clients/discord/discord","title":"Discord","description":"Discord Client Overview","source":"@site/docs/configuration/clients/discord/discord.mdx","sourceDirName":"configuration/clients/discord","slug":"/configuration/clients/discord/","permalink":"/multi-scrobbler/configuration/clients/discord/","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Discord","description":"Discord Client Overview","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/clients/"},"next":{"title":"Discord (App)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-app"}}'),r=s(4848),o=s(8453);let c={sidebar_position:2,title:"Discord",description:"Discord Client Overview",toc_max_heading_level:4},t,l={},d=[{value:"App",id:"app",level:2},{value:"Headless",id:"headless",level:2}];function a(i){let e={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...i.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(e.p,{children:["This scrobbler uses ",(0,r.jsx)(e.strong,{children:(0,r.jsx)(e.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})})," functionality to set your Discord ",(0,r.jsx)(e.a,{href:"https://docs.discord.com/developers/rich-presence/overview",children:"Rich Presence"})," to the music you are currently monitoring with multi-scrobbler."]}),"\n",(0,r.jsx)("img",{src:s(6170).A,height:"127"}),"\n",(0,r.jsx)(e.p,{children:"There are two types of Discord integrations to choose from:"}),"\n",(0,r.jsx)(e.h2,{id:"app",children:"App"}),"\n",(0,r.jsxs)(e.p,{children:["The ",(0,r.jsx)(e.strong,{children:"App"})," integration uses an ",(0,r.jsx)(e.strong,{children:"existing"})," Discord application on a desktop computer to set Rich Presence."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:'Uses "permitted" access to Discord, no TOS issues'}),"\n",(0,r.jsx)(e.li,{children:"More restricted customization compared to Headless"}),"\n",(0,r.jsx)(e.li,{children:"Only active when your existing Discord application is open"}),"\n",(0,r.jsxs)(e.li,{children:["For most scenarios it requires additional, OS-specific steps to setup correctly","\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"May require an additional program on your machine to relay the Discord connection"}),"\n",(0,r.jsx)(e.li,{children:"This is potentially insecure, or less secure, then Headless"}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsxs)(e.strong,{children:["Can use ",(0,r.jsx)(e.a,{href:"/configuration/clients/discord/discord-app#discord-connection",children:"discord in a container"})," as an easy alternative"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"This is a Headless-like experience"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.a,{href:"/configuration/clients/discord/discord-app",children:(0,r.jsx)(e.strong,{children:"App Docs"})})}),"\n",(0,r.jsx)(e.h2,{id:"headless",children:"Headless"}),"\n",(0,r.jsxs)(e.p,{children:["The ",(0,r.jsx)(e.strong,{children:"Headless"})," integration uses Discord cloud Gateway/API, directly, to set Rich Presence."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Does not require an existing Discord application (uses Discord cloud API)"}),"\n",(0,r.jsxs)(e.li,{children:["Using this ",(0,r.jsx)(e.strong,{children:"Violates Discord TOS"})," because it requires a user token"]}),"\n",(0,r.jsx)(e.li,{children:"More customization than App integration"}),"\n",(0,r.jsxs)(e.li,{children:["Active if ",(0,r.jsx)(e.strong,{children:"any"})," Discord application is online"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.a,{href:"/configuration/clients/discord/discord-headless",children:(0,r.jsx)(e.strong,{children:"Headless Docs"})})})]})}function h(i={}){let{wrapper:e}={...(0,o.R)(),...i.components};return e?(0,r.jsx)(e,{...i,children:(0,r.jsx)(a,{...i})}):a(i)}},6170(i,e,s){s.d(e,{A:()=>n});let n=s.p+"assets/images/discord_presence_art-3260bd6302b2f0d1f13b45762cc908de.png"}}]); \ No newline at end of file diff --git a/assets/js/5f7452e4.26462546.js b/assets/js/5f7452e4.26462546.js deleted file mode 100644 index 4e1c5903..00000000 --- a/assets/js/5f7452e4.26462546.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9818"],{5210(e,s,i){i.r(s),i.d(s,{metadata:()=>n,default:()=>h,frontMatter:()=>o,contentTitle:()=>a,toc:()=>c,assets:()=>l});var n=JSON.parse('{"id":"configuration/duplicates","title":"Duplicate Scrobble Guidance","description":"Common Scenarios and Solutions for Duplicate Scrobbles","source":"@site/docs/configuration/duplicates.mdx","sourceDirName":"configuration","slug":"/configuration/duplicates","permalink":"/multi-scrobbler/configuration/duplicates","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/duplicates.mdx?plain=1","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Duplicate Scrobble Guidance","description":"Common Scenarios and Solutions for Duplicate Scrobbles"},"sidebar":"tutorialSidebar","previous":{"title":"User Stage","permalink":"/multi-scrobbler/configuration/transforms/user"},"next":{"title":"Kitchen Sink","permalink":"/multi-scrobbler/configuration/kitchensink"}}'),t=i(4848),r=i(8453);let o={sidebar_position:4,title:"Duplicate Scrobble Guidance",description:"Common Scenarios and Solutions for Duplicate Scrobbles"},a,l={},c=[{value:"How Duplicates Are Detected",id:"how-duplicates-are-detected",level:2},{value:"Configurations Where Duplicates DO NOT Occur",id:"valid-configs",level:2},{value:"Configurations Where Duplicates CAN Occur",id:"invalid-configs",level:2},{value:"Upstream Scrobbles Sent to Multiple Sources",id:"upstream-scrobbles-sent-to-multiple-sources",level:3},{value:"Sources and Clients are Dependent",id:"dependent-source-client",level:3},{value:"Configuration Solutions to Avoid Duplicates",id:"configuration-solutions-to-avoid-duplicates",level:2},{value:"Independent Sources",id:"independent-sources",level:3},{value:"Alternative Sources",id:"alternative-sources",level:3},{value:"Mirror-Only Clients or Limiting Scrobble Destination",id:"isolated-sources",level:3},{value:"Normalize All Scrobbles",id:"normalize-all-scrobbles",level:3},{value:"The Last.fm Problem",id:"lastfm",level:2}];function d(e){let s={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:n}=s;return n||function(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"Multi-scrobbler's flexibility in configuration allows you to build some complex pipelines for scrobbling but it can also be a footgun for duplicating scrobbles."}),"\n",(0,t.jsx)(s.h2,{id:"how-duplicates-are-detected",children:"How Duplicates Are Detected"}),"\n",(0,t.jsxs)(s.p,{children:["Multi-scrobbler uses multiple techniques for evaluating the ",(0,t.jsx)(s.strong,{children:"similarity"})," of text in scrobbles against existing data."]}),"\n",(0,t.jsx)(s.p,{children:"These techniques are used on all text from a scrobble (title, artist, album...):"}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Character and string normalization"}),(0,t.jsx)(s.p,{children:"Symbols and multiple whitespaces are removed. All characters are converted to lowercase. Non ascii characters are converted to their ascii counterparts."}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"this string! is the. same => this string is the same\nthis string is the same => this string is the same\nThIs STRING iS THe SAMe => this string is the same\n\nDina \xd6gon => Dina Ogon\nNan\xe3 => Nana\n"})})]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Word-order invariant text similarity"}),(0,t.jsx)(s.p,{children:"Strings with multiple words (tokens) are re-arranged so that tokens are ordered to be as close to other, similar tokens are possible:"}),(0,t.jsx)(s.p,{children:"Example 1"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"String A: there change is => there change is\nString B: there is change => there change is\n"})}),(0,t.jsx)(s.p,{children:"Example 2"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"String A: you, doin hwat are => you doin hwat are\nString B: what are you doing => you doing what are\n"})}),(0,t.jsxs)(s.p,{children:["Then, the strings are independently compared using ",(0,t.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Levenshtein_distance",children:"Levenshtein Distance"})," and ",(0,t.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient",children:"Dice's Coefficient"}),". The algorithm that gives the highest score for similarity is used so that matching is aggressive."]})]}),"\n",(0,t.jsxs)(s.p,{children:["For ",(0,t.jsx)(s.strong,{children:"Artists"}),", Multi-scrobbler attempts to extract unique Artists from common patterns in ",(0,t.jsx)(s.strong,{children:"single-string"})," artist values and track ",(0,t.jsx)(s.strong,{children:"titles"}),"."]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Matching Common Artist Patterns"}),(0,t.jsxs)(s.p,{children:["Common joiners and patterns are detected in artist/track strings and the artists are extracted. Example of common joiners are: ",(0,t.jsx)(s.code,{children:"ft."})," ",(0,t.jsx)(s.code,{children:"feat"})," ",(0,t.jsx)(s.code,{children:"vs."})," etc..."]}),(0,t.jsx)(s.p,{children:"Example 1"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Melendi, Ryan Lewis, The Righteous Brothers (featuring Joan Jett & The Blackhearts, Robin Schulz)\n\nbecomes\n\nMelendi, Ryan Lewis, The Righteous Brothers, Joan Jett, The Blackhearts, Robin Schulz\n"})}),(0,t.jsx)(s.p,{children:"Example 2"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Childish Gambino - 12.38 (feat. 21 Savage, Ink & Kadhja Bonet)\n\nbecomes\n\nChildish Gambino, 21 Savage, Ink, Kadhja Bonet - 12.38\n"})}),(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:['MS uses "smart" heuristics to prevent artists with actual punctuation (',(0,t.jsx)(s.code,{children:"Tyler, The Creator"}),") from accidentally being separated"]}),"\n",(0,t.jsxs)(s.li,{children:["The extraction examples above are done ",(0,t.jsx)(s.strong,{children:"only for matching"})," other scrobble data (which is also parsed like the above), the resulting scrobble data is never transformed unless the user explicitly configures it via a ",(0,t.jsx)(s.a,{href:"/configuration/transforms/native",children:"native transform"})]}),"\n"]})})]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"timestamps"})," for Scrobbles are compared at different levels of granularity based on where they originate from."]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Temporally Comparing Scrobbles"}),(0,t.jsx)(s.p,{children:"Timestamp closeness for two scrobbles can be classified in one of these states:"}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Exact"})}),(0,t.jsx)(s.p,{children:"Timestamps differ by 1 seconds or less."}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Close"})}),(0,t.jsx)(s.p,{children:'Timestamps differ by less than the known granularity of the Source they are from. For most Sources (and all Clients) this is 10 seconds or less. For some sources (subsonic) the granularity is 60 seconds because they only report "now playing" changes every 60 seconds.'}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"During"})}),(0,t.jsxs)(s.p,{children:["If the Play was monitoring in real-time by Multi-scrobbler then it knows the time range during which the Play was listened to. If an existing scrobble with similar artist/track/album has a timestamp that occurred ",(0,t.jsx)(s.em,{children:"during"})," the known listening time then it is classified as during."]}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Fuzzy"})}),(0,t.jsxs)(s.p,{children:["If the timestamp occurs within a few seconds +/- of (existing scrobble + track duration) then, potentially, the Source timestamped the existing scrobble at the ",(0,t.jsx)(s.em,{children:"end"})," of when the user listened to it, rather than when the user ",(0,t.jsx)(s.em,{children:"started"})," listening to it. This is common for Spotify plays."]}),(0,t.jsx)(s.hr,{}),(0,t.jsxs)(s.p,{children:["Each of the above classification results in a different score that is ",(0,t.jsx)(s.em,{children:"roughly"})," descending from the order given above. Exact score is based on the Souce of the scrobble and if it was monitored in real-time by Multi-Scrobbler."]})]}),"\n",(0,t.jsx)(s.p,{children:'Finally, all of the above comparison/normalization techniques are combined when comparing a "new" Play/Scrobble against existing data. Each comparison is given a weighted score. If the score is above the match threshold then it is marked as a duplicated.'}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Match Scoring Example"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Fr\xe9d\xe9ric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 <-- New scrobble\nFr\xe9d\xe9ric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 <-- Existing scrobble from client\n"})}),(0,t.jsx)(s.p,{children:"After comparing against all existing scrobbles from the client, in a timerange around the new scrobble, MS finds a match and logs the match along with the score breakdown of the consistuent parts:"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Source: \nFr\xe9d\xe9ric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 (S) \n\nClosest Scrobble: \nFr\xe9d\xe9ric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 (S)\n\nArtist: (0.30 + Whole Match Bonus 0.52) * (0.3 + Whole Match Bonus 0.05) = 0.29\nTitle: 1.00 * 0.4 = 0.40\nTime: (Close) 1 * 0.5 = 0.50\nTime Detail => Existing: 13:01:48-04:00 - Candidate: 13:01:51-04:00 | Temporal Sameness: Close | Play Diff: 3s (Needed <10s) | Range Comparison N/A\nScore 1.19 => Matched!\n"})})]}),"\n",(0,t.jsxs)(s.p,{children:["All of the above techniques and scoring gives Multi-scrobbler a ",(0,t.jsx)(s.em,{children:"very good chance"})," of detecting duplicate scrobbles, regardless of where they were originally from. Of Multi-Scrobbler's ",(0,t.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/src/backend/tests",children:"400+ unit tests"}),", 70+ are related to testing scoring, artist extraction, and ",(0,t.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Fuzzing",children:"fuzzing"})," string normalization/simiarlity."]}),"\n",(0,t.jsxs)(s.p,{children:["The dupe detection is so good that it is virtually gauranteed for ",(0,t.jsx)(s.a,{href:"#valid-configs",children:"most configurations"})," and is used for ",(0,t.jsx)(s.em,{children:"backlogging"})," missed scrobbles for Sources that support fetching history."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"However"}),", it's not possible to gaurantee this for ",(0,t.jsx)(s.em,{children:"all"})," possible Multi-scrobbler configurations. See the below sections to learn more."]}),"\n",(0,t.jsx)(s.h2,{id:"valid-configs",children:"Configurations Where Duplicates DO NOT Occur"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Any Source/Client configuration where there is only one Source and one Client and they are not the same service/account"}),"\n",(0,t.jsxs)(s.li,{children:["Any Source/Client configuration where scrobbles only flow in ",(0,t.jsx)(s.strong,{children:"one direction"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["IE you ",(0,t.jsx)(s.em,{children:"do not"})," have a Last.fm ",(0,t.jsx)(s.strong,{children:"Client"})," Account A that is ",(0,t.jsx)(s.em,{children:"also"})," a Last.fm ",(0,t.jsx)(s.strong,{children:"Source"})," Account A"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"The majority of simple Multi-scrobbler configurations fall into these categories. If your workflow is straightforward you do not need to worry about duplicates at all."})})}),"\n",(0,t.jsxs)(s.p,{children:["Multi-scrobbler can handle recieving the same data from a Source multiple times. This is fine because the data is ",(0,t.jsx)(s.em,{children:"always the same"})," and ",(0,t.jsx)(s.em,{children:"always unique"})," to each Source. Since MS scrobbled the data to your clients you can be pretty confident that the ",(0,t.jsx)(s.em,{children:"same"})," cleanup/matching process for that data will result in an indentical/similar match to the existing scrobble."]}),"\n",(0,t.jsx)(s.p,{children:"IE Same inputs in -> same inputs out."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Even this scenario with multiple, mixed Sources is OK:"})}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(6272).A}),"\n",(0,t.jsxs)(s.p,{children:["Because the scrobbles coming from each ",(0,t.jsx)(s.strong,{children:"Source"})," are ",(0,t.jsx)(s.strong,{children:"independent"})," of each other. And they end up in Clients that are not ",(0,t.jsx)(s.em,{children:"also"})," used as Sources."]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["This is a common scenario when scrobbles are ",(0,t.jsx)(s.em,{children:"backlogged"})," from a Source IE on startup MS fetches the last 50 Plays from Spotify/Lastfm/Listenbrainz."]})}),"\n",(0,t.jsx)(s.h2,{id:"invalid-configs",children:"Configurations Where Duplicates CAN Occur"}),"\n",(0,t.jsx)(s.h3,{id:"upstream-scrobbles-sent-to-multiple-sources",children:"Upstream Scrobbles Sent to Multiple Sources"}),"\n",(0,t.jsxs)(s.p,{children:["In this scenario your device using Spotify is configured in MS as a Spotify ",(0,t.jsx)(s.strong,{children:"Source"})," but it ",(0,t.jsx)(s.strong,{children:"also"})," is scrobbling to Last.fm (via Pano Scrobbler, as an example)."]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(7977).A}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Time Race Condition"}),": Potentially, the scrobbles arrive in Multi-scrobbler at exactly the same time. There are no existing scrobbles in Koito to check against, yet. So Multi-scrobbler scrobbles both to Koito, resulting in duplicate scrobbles."]}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Different Scrobble Data"}),": Pano Scrobbler, or Last.fm, ",(0,t.jsx)(s.a,{href:"#lastfm",children:"may modify the scrobble data."})," When MS recieves the scrobble from Last.fm it may be ",(0,t.jsx)(s.em,{children:"just different enough"})," that it does not get detected as a duplicate."]}),"\n",(0,t.jsx)(s.h3,{id:"dependent-source-client",children:"Sources and Clients are Dependent"}),"\n",(0,t.jsxs)(s.p,{children:["In this scenario, you have a ",(0,t.jsx)(s.strong,{children:"Client"})," that is also a ",(0,t.jsx)(s.strong,{children:"Source"})," and that Source is feeding scrobbles to a different Client that receives scrobbles from everywhere (or has some overlap with the original Client)."]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(3763).A}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Different Scrobble Data"}),": ",(0,t.jsx)(s.a,{href:"#lastfm",children:"Last.fm may modify the scrobble data."})," When MS recieves the scrobble from Last.fm it may be ",(0,t.jsx)(s.em,{children:"just different enough"})," that it does not get detected as a duplicate."]}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Consistency Issues"}),": If the Koito Client has a backed up queue or is not currently scrobbling (imagine it was Last.fm or Listenbrainz, and they had upstream availability issues), then there is no existing scrobble yet and nothing to match against."]}),"\n",(0,t.jsx)(s.h2,{id:"configuration-solutions-to-avoid-duplicates",children:"Configuration Solutions to Avoid Duplicates"}),"\n",(0,t.jsx)(s.h3,{id:"independent-sources",children:"Independent Sources"}),"\n",(0,t.jsxs)(s.p,{children:["Use a configuration mentioned in ",(0,t.jsx)(s.a,{href:"#valid-configs",children:"Configurations Where Duplicates DO NOT Occur"}),": make sure all of your Sources are ",(0,t.jsx)(s.strong,{children:"independent"}),". The activity/scrobbles from each Source do not have any upstream duplicates of activity."]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(7334).A}),"\n",(0,t.jsx)(s.h3,{id:"alternative-sources",children:"Alternative Sources"}),"\n",(0,t.jsxs)(s.p,{children:["Imagine you have a scenario where a device/player can ",(0,t.jsx)(s.strong,{children:"only"}),' scrobble to Last.fm. But you want to use MS for all other devices/sources and still have all your scrobbles end up in your "main" Last.fm account for social reasons/stats.']}),"\n",(0,t.jsxs)(s.p,{children:["Instead of using the same Last.fm account for all activity and potentially having ",(0,t.jsx)(s.a,{href:"#dependent-source-client",children:"dependent client/sources"}),", create an ",(0,t.jsx)(s.em,{children:"additional"})," last.fm account that is used ",(0,t.jsx)(s.em,{children:"only for the device that needs it"}),". This ensures the scrobbles from that device are isolated from the main account and do not prevent duplicates, so you can continue to use the main account as an MS Client:"]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(2223).A}),"\n",(0,t.jsx)(s.h3,{id:"isolated-sources",children:"Mirror-Only Clients or Limiting Scrobble Destination"}),"\n",(0,t.jsxs)(s.p,{children:["In Multi-scrobbler, by default, all Sources scrobble to all Clients. Using ",(0,t.jsx)(s.a,{href:"/configuration/sources/#limiting-scrobble-destination",children:"Limit Scrobble Destinations"})," configuration can ensure that your dependent Source/Clients only scrobble to destinations where the scrobbles won't be duplicated. And/or limit other Sources to ",(0,t.jsx)(s.em,{children:"not"})," scrobble to dependent Sources/Clients."]}),"\n",(0,t.jsxs)(s.p,{children:["Here is an example where all Sources only scrobble to a ",(0,t.jsx)(s.em,{children:"dependent"})," Last.fm Client, and then the ",(0,t.jsx)(s.em,{children:"dependent"}),' Last.fm Source only scrobbles to a "mirror-only" (backup) Koito Client:']}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(8079).A}),"\n",(0,t.jsx)(s.h3,{id:"normalize-all-scrobbles",children:"Normalize All Scrobbles"}),"\n",(0,t.jsxs)(s.p,{children:["If using one of the above solutions is not possible you can also try to ",(0,t.jsx)(s.em,{children:"aggressively normalize all scrobble data"})," using ",(0,t.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"the Musicbrainz transform stage"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["In this scenario you still have ",(0,t.jsx)(s.a,{href:"#dependent-source-client",children:"dependent Source/Clients"})," that are ",(0,t.jsx)(s.a,{href:"#isolated-sources",children:"not isolated"})," but you can ",(0,t.jsx)(s.em,{children:"potentially"})," improve duplicate detection by first using a transform stage to match scrobbles against the Musibrainz database and normalize their track/artist/album data."]}),"\n",(0,t.jsx)(s.admonition,{type:"warning",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"There is no gaurantee this will work"})," but it is better than nothing. You should attempt to re-configure MS to use any of the other solutions before using this one."]})}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(3051).A}),"\n",(0,t.jsx)(s.h2,{id:"lastfm",children:"The Last.fm Problem"}),"\n",(0,t.jsx)(s.p,{children:"Last.fm will happily accept almost any scrobble data you throw at it."}),"\n",(0,t.jsxs)(s.p,{children:['It can then decide, opaquely, to match or modify that scrobble to some more "official" data it has server-side. This could be modifying the artists, title, or album sent in the scrobble. It can also mean modifying the ',(0,t.jsxs)(s.a,{href:"https://musicbrainz.org/doc/MusicBrainz_Identifier",children:[(0,t.jsx)(s.code,{children:"mbid"})," (unique identifier)"]})," or adding what it ",(0,t.jsx)(s.em,{children:"thinks"})," is the correct one."]}),"\n",(0,t.jsxs)(s.p,{children:["There is nothing in the scrobble history API response from Last.fm that identifies it has done any of this. And ",(0,t.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/333#issuecomment-3145161339",children:"it's not super great at being right about these modifications"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"What this means for you, the user, is that this is very plausible scenario:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You scrobble ",(0,t.jsx)(s.code,{children:"Artist Foo, Artist Bar - My Cool Track"})," to Last.fm via Pano Scrobbler (outside of Multi-scrobbler)","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Last.fm modifies the data to ",(0,t.jsx)(s.code,{children:"The Artist Foo - My Cool Track ft. Artist Bar (Album Version)"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["You ",(0,t.jsx)(s.em,{children:"also"})," scrobble ",(0,t.jsx)(s.code,{children:"Artist Foo, Artist Bar - My Cool Track"})," to Multi-scrobbler via Pano LFM endpoint ",(0,t.jsx)(s.strong,{children:"Source"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"MS forwards this to Koito Client as-is"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Soon after, MS polls your Last.fm ",(0,t.jsx)(s.strong,{children:"Source"})," for new scrobbles and finds ",(0,t.jsx)(s.code,{children:"The Artist Foo - My Cool Track ft. Artist Bar (Album Version)"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"It queries Koito to see if this was scrobbled"}),"\n",(0,t.jsxs)(s.li,{children:["It sees that a scrobble did happen at almost the same time BUT the track titles and artist strings are ",(0,t.jsx)(s.em,{children:"just different enough"})," that it decides it's not a duplicate"]}),"\n",(0,t.jsx)(s.li,{children:"MS forwards the scrobble to Koito and you now have a duplicate"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:["This behavior is unique to Last.fm. It's truly the ",(0,t.jsx)(s.strong,{children:"worst"})," out of all the scrobbler services in terms of preserving your data as-is, or providing a unqiue identifier for your data."]})]})}function h(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},2223(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/alt source-ad47c455160b8cc3d2cceb58d56b4097.png"},7977(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/dupe sources-b11720b2a8ff512005f3ed2c9c70ecb9.png"},3763(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/duped client source-d2e51c9d37d1d15084cbf54fa1e85bc5.png"},7334(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/independent source-21805f39574c84b80d0dbd7dac594b45.png"},8079(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/mirror source-892c785de1cbcf28a30a4e0c896e0422.png"},3051(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/normalized dupes-f7d9d9fa40da382a1cc42eef844643de.png"},6272(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/unidirectional-flow-a18659abb3fb85c24ee4dff0ea3a1c20.png"}}]); \ No newline at end of file diff --git a/assets/js/5f7452e4.38065108.js b/assets/js/5f7452e4.38065108.js new file mode 100644 index 00000000..00947e43 --- /dev/null +++ b/assets/js/5f7452e4.38065108.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9818"],{5210(e,s,i){i.r(s),i.d(s,{metadata:()=>n,default:()=>h,frontMatter:()=>o,contentTitle:()=>a,toc:()=>c,assets:()=>l});var n=JSON.parse('{"id":"configuration/duplicates","title":"Duplicate Scrobble Guidance","description":"Common Scenarios and Solutions for Duplicate Scrobbles","source":"@site/docs/configuration/duplicates.mdx","sourceDirName":"configuration","slug":"/configuration/duplicates","permalink":"/multi-scrobbler/configuration/duplicates","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/duplicates.mdx?plain=1","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Duplicate Scrobble Guidance","description":"Common Scenarios and Solutions for Duplicate Scrobbles"},"sidebar":"tutorialSidebar","previous":{"title":"User Stage","permalink":"/multi-scrobbler/configuration/transforms/user"},"next":{"title":"Kitchen Sink","permalink":"/multi-scrobbler/configuration/kitchensink"}}'),t=i(4848),r=i(8453);let o={sidebar_position:4,title:"Duplicate Scrobble Guidance",description:"Common Scenarios and Solutions for Duplicate Scrobbles"},a,l={},c=[{value:"How Duplicates Are Detected",id:"how-duplicates-are-detected",level:2},{value:"Configurations Where Duplicates DO NOT Occur",id:"valid-configs",level:2},{value:"Configurations Where Duplicates CAN Occur",id:"invalid-configs",level:2},{value:"Upstream Scrobbles Sent to Multiple Sources",id:"upstream-scrobbles-sent-to-multiple-sources",level:3},{value:"Sources and Clients are Dependent",id:"dependent-source-client",level:3},{value:"Configuration Solutions to Avoid Duplicates",id:"configuration-solutions-to-avoid-duplicates",level:2},{value:"Independent Sources",id:"independent-sources",level:3},{value:"Alternative Sources",id:"alternative-sources",level:3},{value:"Mirror-Only Clients or Limiting Scrobble Destination",id:"isolated-sources",level:3},{value:"Normalize All Scrobbles",id:"normalize-all-scrobbles",level:3},{value:"The Last.fm Problem",id:"lastfm",level:2}];function d(e){let s={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:n}=s;return n||function(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"Multi-scrobbler's flexibility in configuration allows you to build some complex pipelines for scrobbling but it can also be a footgun for duplicating scrobbles."}),"\n",(0,t.jsx)(s.h2,{id:"how-duplicates-are-detected",children:"How Duplicates Are Detected"}),"\n",(0,t.jsxs)(s.p,{children:["Multi-scrobbler uses multiple techniques for evaluating the ",(0,t.jsx)(s.strong,{children:"similarity"})," of text in scrobbles against existing data."]}),"\n",(0,t.jsx)(s.p,{children:"These techniques are used on all text from a scrobble (title, artist, album...):"}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Character and string normalization"}),(0,t.jsx)(s.p,{children:"Symbols and multiple whitespaces are removed. All characters are converted to lowercase. Non ascii characters are converted to their ascii counterparts."}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"this string! is the. same => this string is the same\nthis string is the same => this string is the same\nThIs STRING iS THe SAMe => this string is the same\n\nDina \xd6gon => Dina Ogon\nNan\xe3 => Nana\n"})})]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Word-order invariant text similarity"}),(0,t.jsx)(s.p,{children:"Strings with multiple words (tokens) are re-arranged so that tokens are ordered to be as close to other, similar tokens are possible:"}),(0,t.jsx)(s.p,{children:"Example 1"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"String A: there change is => there change is\nString B: there is change => there change is\n"})}),(0,t.jsx)(s.p,{children:"Example 2"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"String A: you, doin hwat are => you doin hwat are\nString B: what are you doing => you doing what are\n"})}),(0,t.jsxs)(s.p,{children:["Then, the strings are independently compared using ",(0,t.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Levenshtein_distance",children:"Levenshtein Distance"})," and ",(0,t.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient",children:"Dice's Coefficient"}),". The algorithm that gives the highest score for similarity is used so that matching is aggressive."]})]}),"\n",(0,t.jsxs)(s.p,{children:["For ",(0,t.jsx)(s.strong,{children:"Artists"}),", Multi-scrobbler attempts to extract unique Artists from common patterns in ",(0,t.jsx)(s.strong,{children:"single-string"})," artist values and track ",(0,t.jsx)(s.strong,{children:"titles"}),"."]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Matching Common Artist Patterns"}),(0,t.jsxs)(s.p,{children:["Common joiners and patterns are detected in artist/track strings and the artists are extracted. Example of common joiners are: ",(0,t.jsx)(s.code,{children:"ft."})," ",(0,t.jsx)(s.code,{children:"feat"})," ",(0,t.jsx)(s.code,{children:"vs."})," etc..."]}),(0,t.jsx)(s.p,{children:"Example 1"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Melendi, Ryan Lewis, The Righteous Brothers (featuring Joan Jett & The Blackhearts, Robin Schulz)\n\nbecomes\n\nMelendi, Ryan Lewis, The Righteous Brothers, Joan Jett, The Blackhearts, Robin Schulz\n"})}),(0,t.jsx)(s.p,{children:"Example 2"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Childish Gambino - 12.38 (feat. 21 Savage, Ink & Kadhja Bonet)\n\nbecomes\n\nChildish Gambino, 21 Savage, Ink, Kadhja Bonet - 12.38\n"})}),(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:['MS uses "smart" heuristics to prevent artists with actual punctuation (',(0,t.jsx)(s.code,{children:"Tyler, The Creator"}),") from accidentally being separated"]}),"\n",(0,t.jsxs)(s.li,{children:["The extraction examples above are done ",(0,t.jsx)(s.strong,{children:"only for matching"})," other scrobble data (which is also parsed like the above), the resulting scrobble data is never transformed unless the user explicitly configures it via a ",(0,t.jsx)(s.a,{href:"/configuration/transforms/native",children:"native transform"})]}),"\n"]})})]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"timestamps"})," for Scrobbles are compared at different levels of granularity based on where they originate from."]}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Temporally Comparing Scrobbles"}),(0,t.jsx)(s.p,{children:"Timestamp closeness for two scrobbles can be classified in one of these states:"}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Exact"})}),(0,t.jsx)(s.p,{children:"Timestamps differ by 1 seconds or less."}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Close"})}),(0,t.jsx)(s.p,{children:'Timestamps differ by less than the known granularity of the Source they are from. For most Sources (and all Clients) this is 10 seconds or less. For some sources (subsonic) the granularity is 60 seconds because they only report "now playing" changes every 60 seconds.'}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"During"})}),(0,t.jsxs)(s.p,{children:["If the Play was monitoring in real-time by Multi-scrobbler then it knows the time range during which the Play was listened to. If an existing scrobble with similar artist/track/album has a timestamp that occurred ",(0,t.jsx)(s.em,{children:"during"})," the known listening time then it is classified as during."]}),(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Fuzzy"})}),(0,t.jsxs)(s.p,{children:["If the timestamp occurs within a few seconds +/- of (existing scrobble + track duration) then, potentially, the Source timestamped the existing scrobble at the ",(0,t.jsx)(s.em,{children:"end"})," of when the user listened to it, rather than when the user ",(0,t.jsx)(s.em,{children:"started"})," listening to it. This is common for Spotify plays."]}),(0,t.jsx)(s.hr,{}),(0,t.jsxs)(s.p,{children:["Each of the above classification results in a different score that is ",(0,t.jsx)(s.em,{children:"roughly"})," descending from the order given above. Exact score is based on the Souce of the scrobble and if it was monitored in real-time by Multi-Scrobbler."]})]}),"\n",(0,t.jsx)(s.p,{children:'Finally, all of the above comparison/normalization techniques are combined when comparing a "new" Play/Scrobble against existing data. Each comparison is given a weighted score. If the score is above the match threshold then it is marked as a duplicated.'}),"\n",(0,t.jsxs)(n,{children:[(0,t.jsx)("summary",{children:"Match Scoring Example"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Fr\xe9d\xe9ric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 <-- New scrobble\nFr\xe9d\xe9ric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 <-- Existing scrobble from client\n"})}),(0,t.jsx)(s.p,{children:"After comparing against all existing scrobbles from the client, in a timerange around the new scrobble, MS finds a match and logs the match along with the score breakdown of the consistuent parts:"}),(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"Source: \nFr\xe9d\xe9ric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 (S) \n\nClosest Scrobble: \nFr\xe9d\xe9ric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 (S)\n\nArtist: (0.30 + Whole Match Bonus 0.52) * (0.3 + Whole Match Bonus 0.05) = 0.29\nTitle: 1.00 * 0.4 = 0.40\nTime: (Close) 1 * 0.5 = 0.50\nTime Detail => Existing: 13:01:48-04:00 - Candidate: 13:01:51-04:00 | Temporal Sameness: Close | Play Diff: 3s (Needed <10s) | Range Comparison N/A\nScore 1.19 => Matched!\n"})})]}),"\n",(0,t.jsxs)(s.p,{children:["All of the above techniques and scoring gives Multi-scrobbler a ",(0,t.jsx)(s.em,{children:"very good chance"})," of detecting duplicate scrobbles, regardless of where they were originally from. Of Multi-Scrobbler's ",(0,t.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/src/backend/tests",children:"400+ unit tests"}),", 70+ are related to testing scoring, artist extraction, and ",(0,t.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Fuzzing",children:"fuzzing"})," string normalization/simiarlity."]}),"\n",(0,t.jsxs)(s.p,{children:["The dupe detection is so good that it is virtually gauranteed for ",(0,t.jsx)(s.a,{href:"#valid-configs",children:"most configurations"})," and is used for ",(0,t.jsx)(s.em,{children:"backlogging"})," missed scrobbles for Sources that support fetching history."]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"However"}),", it's not possible to gaurantee this for ",(0,t.jsx)(s.em,{children:"all"})," possible Multi-scrobbler configurations. See the below sections to learn more."]}),"\n",(0,t.jsx)(s.h2,{id:"valid-configs",children:"Configurations Where Duplicates DO NOT Occur"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Any Source/Client configuration where there is only one Source and one Client and they are not the same service/account"}),"\n",(0,t.jsxs)(s.li,{children:["Any Source/Client configuration where scrobbles only flow in ",(0,t.jsx)(s.strong,{children:"one direction"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["IE you ",(0,t.jsx)(s.em,{children:"do not"})," have a Last.fm ",(0,t.jsx)(s.strong,{children:"Client"})," Account A that is ",(0,t.jsx)(s.em,{children:"also"})," a Last.fm ",(0,t.jsx)(s.strong,{children:"Source"})," Account A"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"The majority of simple Multi-scrobbler configurations fall into these categories. If your workflow is straightforward you do not need to worry about duplicates at all."})})}),"\n",(0,t.jsxs)(s.p,{children:["Multi-scrobbler can handle recieving the same data from a Source multiple times. This is fine because the data is ",(0,t.jsx)(s.em,{children:"always the same"})," and ",(0,t.jsx)(s.em,{children:"always unique"})," to each Source. Since MS scrobbled the data to your clients you can be pretty confident that the ",(0,t.jsx)(s.em,{children:"same"})," cleanup/matching process for that data will result in an indentical/similar match to the existing scrobble."]}),"\n",(0,t.jsx)(s.p,{children:"IE Same inputs in -> same inputs out."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Even this scenario with multiple, mixed Sources is OK:"})}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(6272).A}),"\n",(0,t.jsxs)(s.p,{children:["Because the scrobbles coming from each ",(0,t.jsx)(s.strong,{children:"Source"})," are ",(0,t.jsx)(s.strong,{children:"independent"})," of each other. And they end up in Clients that are not ",(0,t.jsx)(s.em,{children:"also"})," used as Sources."]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["This is a common scenario when scrobbles are ",(0,t.jsx)(s.em,{children:"backlogged"})," from a Source IE on startup MS fetches the last 50 Plays from Spotify/Lastfm/Listenbrainz."]})}),"\n",(0,t.jsx)(s.h2,{id:"invalid-configs",children:"Configurations Where Duplicates CAN Occur"}),"\n",(0,t.jsx)(s.h3,{id:"upstream-scrobbles-sent-to-multiple-sources",children:"Upstream Scrobbles Sent to Multiple Sources"}),"\n",(0,t.jsxs)(s.p,{children:["In this scenario your device using Spotify is configured in MS as a Spotify ",(0,t.jsx)(s.strong,{children:"Source"})," but it ",(0,t.jsx)(s.strong,{children:"also"})," is scrobbling to Last.fm (via Pano Scrobbler, as an example)."]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(7977).A}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Time Race Condition"}),": Potentially, the scrobbles arrive in Multi-scrobbler at exactly the same time. There are no existing scrobbles in Koito to check against, yet. So Multi-scrobbler scrobbles both to Koito, resulting in duplicate scrobbles."]}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Different Scrobble Data"}),": Pano Scrobbler, or Last.fm, ",(0,t.jsx)(s.a,{href:"#lastfm",children:"may modify the scrobble data."})," When MS recieves the scrobble from Last.fm it may be ",(0,t.jsx)(s.em,{children:"just different enough"})," that it does not get detected as a duplicate."]}),"\n",(0,t.jsx)(s.h3,{id:"dependent-source-client",children:"Sources and Clients are Dependent"}),"\n",(0,t.jsxs)(s.p,{children:["In this scenario, you have a ",(0,t.jsx)(s.strong,{children:"Client"})," that is also a ",(0,t.jsx)(s.strong,{children:"Source"})," and that Source is feeding scrobbles to a different Client that receives scrobbles from everywhere (or has some overlap with the original Client)."]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(3763).A}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Different Scrobble Data"}),": ",(0,t.jsx)(s.a,{href:"#lastfm",children:"Last.fm may modify the scrobble data."})," When MS recieves the scrobble from Last.fm it may be ",(0,t.jsx)(s.em,{children:"just different enough"})," that it does not get detected as a duplicate."]}),"\n",(0,t.jsxs)(s.p,{children:["\u274C ",(0,t.jsx)(s.strong,{children:"Consistency Issues"}),": If the Koito Client has a backed up queue or is not currently scrobbling (imagine it was Last.fm or Listenbrainz, and they had upstream availability issues), then there is no existing scrobble yet and nothing to match against."]}),"\n",(0,t.jsx)(s.h2,{id:"configuration-solutions-to-avoid-duplicates",children:"Configuration Solutions to Avoid Duplicates"}),"\n",(0,t.jsx)(s.h3,{id:"independent-sources",children:"Independent Sources"}),"\n",(0,t.jsxs)(s.p,{children:["Use a configuration mentioned in ",(0,t.jsx)(s.a,{href:"#valid-configs",children:"Configurations Where Duplicates DO NOT Occur"}),": make sure all of your Sources are ",(0,t.jsx)(s.strong,{children:"independent"}),". The activity/scrobbles from each Source do not have any upstream duplicates of activity."]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(7334).A}),"\n",(0,t.jsx)(s.h3,{id:"alternative-sources",children:"Alternative Sources"}),"\n",(0,t.jsxs)(s.p,{children:["Imagine you have a scenario where a device/player can ",(0,t.jsx)(s.strong,{children:"only"}),' scrobble to Last.fm. But you want to use MS for all other devices/sources and still have all your scrobbles end up in your "main" Last.fm account for social reasons/stats.']}),"\n",(0,t.jsxs)(s.p,{children:["Instead of using the same Last.fm account for all activity and potentially having ",(0,t.jsx)(s.a,{href:"#dependent-source-client",children:"dependent client/sources"}),", create an ",(0,t.jsx)(s.em,{children:"additional"})," last.fm account that is used ",(0,t.jsx)(s.em,{children:"only for the device that needs it"}),". This ensures the scrobbles from that device are isolated from the main account and do not prevent duplicates, so you can continue to use the main account as an MS Client:"]}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(2223).A}),"\n",(0,t.jsx)(s.h3,{id:"isolated-sources",children:"Mirror-Only Clients or Limiting Scrobble Destination"}),"\n",(0,t.jsxs)(s.p,{children:["In Multi-scrobbler, by default, all Sources scrobble to all Clients. Using ",(0,t.jsx)(s.a,{href:"/configuration/sources/#limiting-scrobble-destination",children:"Limit Scrobble Destinations"})," configuration can ensure that your dependent Source/Clients only scrobble to destinations where the scrobbles won't be duplicated. And/or limit other Sources to ",(0,t.jsx)(s.em,{children:"not"})," scrobble to dependent Sources/Clients."]}),"\n",(0,t.jsxs)(s.p,{children:["Here is an example where all Sources only scrobble to a ",(0,t.jsx)(s.em,{children:"dependent"})," Last.fm Client, and then the ",(0,t.jsx)(s.em,{children:"dependent"}),' Last.fm Source only scrobbles to a "mirror-only" (backup) Koito Client:']}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(8079).A}),"\n",(0,t.jsx)(s.h3,{id:"normalize-all-scrobbles",children:"Normalize All Scrobbles"}),"\n",(0,t.jsxs)(s.p,{children:["If using one of the above solutions is not possible you can also try to ",(0,t.jsx)(s.em,{children:"aggressively normalize all scrobble data"})," using ",(0,t.jsx)(s.a,{href:"/configuration/transforms/musicbrainz",children:"the Musicbrainz transform stage"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["In this scenario you still have ",(0,t.jsx)(s.a,{href:"#dependent-source-client",children:"dependent Source/Clients"})," that are ",(0,t.jsx)(s.a,{href:"#isolated-sources",children:"not isolated"})," but you can ",(0,t.jsx)(s.em,{children:"potentially"})," improve duplicate detection by first using a transform stage to match scrobbles against the Musibrainz database and normalize their track/artist/album data."]}),"\n",(0,t.jsx)(s.admonition,{type:"warning",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"There is no gaurantee this will work"})," but it is better than nothing. You should attempt to re-configure MS to use any of the other solutions before using this one."]})}),"\n",(0,t.jsx)("img",{className:"image-center",src:i(3051).A}),"\n",(0,t.jsx)(s.h2,{id:"lastfm",children:"The Last.fm Problem"}),"\n",(0,t.jsx)(s.p,{children:"Last.fm will happily accept almost any scrobble data you throw at it."}),"\n",(0,t.jsxs)(s.p,{children:['It can then decide, opaquely, to match or modify that scrobble to some more "official" data it has server-side. This could be modifying the artists, title, or album sent in the scrobble. It can also mean modifying the ',(0,t.jsxs)(s.a,{href:"https://musicbrainz.org/doc/MusicBrainz_Identifier",children:[(0,t.jsx)(s.code,{children:"mbid"})," (unique identifier)"]})," or adding what it ",(0,t.jsx)(s.em,{children:"thinks"})," is the correct one."]}),"\n",(0,t.jsxs)(s.p,{children:["There is nothing in the scrobble history API response from Last.fm that identifies it has done any of this. And ",(0,t.jsx)(s.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/333#issuecomment-3145161339",children:"it's not super great at being right about these modifications"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"What this means for you, the user, is that this is very plausible scenario:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["You scrobble ",(0,t.jsx)(s.code,{children:"Artist Foo, Artist Bar - My Cool Track"})," to Last.fm via Pano Scrobbler (outside of Multi-scrobbler)","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Last.fm modifies the data to ",(0,t.jsx)(s.code,{children:"The Artist Foo - My Cool Track ft. Artist Bar (Album Version)"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["You ",(0,t.jsx)(s.em,{children:"also"})," scrobble ",(0,t.jsx)(s.code,{children:"Artist Foo, Artist Bar - My Cool Track"})," to Multi-scrobbler via Pano LFM endpoint ",(0,t.jsx)(s.strong,{children:"Source"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"MS forwards this to Koito Client as-is"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Soon after, MS polls your Last.fm ",(0,t.jsx)(s.strong,{children:"Source"})," for new scrobbles and finds ",(0,t.jsx)(s.code,{children:"The Artist Foo - My Cool Track ft. Artist Bar (Album Version)"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"It queries Koito to see if this was scrobbled"}),"\n",(0,t.jsxs)(s.li,{children:["It sees that a scrobble did happen at almost the same time BUT the track titles and artist strings are ",(0,t.jsx)(s.em,{children:"just different enough"})," that it decides it's not a duplicate"]}),"\n",(0,t.jsx)(s.li,{children:"MS forwards the scrobble to Koito and you now have a duplicate"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:["This behavior is unique to Last.fm. It's truly the ",(0,t.jsx)(s.strong,{children:"worst"})," out of all the scrobbler services in terms of preserving your data as-is, or providing a unqiue identifier for your data."]})]})}function h(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},2223(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/alt source-ad47c455160b8cc3d2cceb58d56b4097.png"},7977(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/dupe sources-b11720b2a8ff512005f3ed2c9c70ecb9.png"},3763(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/duped client source-d2e51c9d37d1d15084cbf54fa1e85bc5.png"},7334(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/independent source-21805f39574c84b80d0dbd7dac594b45.png"},8079(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/mirror source-892c785de1cbcf28a30a4e0c896e0422.png"},3051(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/normalized dupes-f7d9d9fa40da382a1cc42eef844643de.png"},6272(e,s,i){i.d(s,{A:()=>n});let n=i.p+"assets/images/unidirectional-flow-a18659abb3fb85c24ee4dff0ea3a1c20.png"}}]); \ No newline at end of file diff --git a/assets/js/61856a46.2dde7a02.js b/assets/js/61856a46.2dde7a02.js deleted file mode 100644 index a4177498..00000000 --- a/assets/js/61856a46.2dde7a02.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2929"],{6649(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>g,frontMatter:()=>l,contentTitle:()=>a,toc:()=>h,assets:()=>d});var s=JSON.parse('{"id":"updating/upgrade-path/0140","title":"From < 0.14.0","description":"Upgrading to 0.14.0","source":"@site/docs/updating/upgrade-path/0140.mdx","sourceDirName":"updating/upgrade-path","slug":"/updating/upgrade-path/0140","permalink":"/multi-scrobbler/updating/upgrade-path/0140","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/updating/upgrade-path/0140.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"From < 0.14.0","description":"Upgrading to 0.14.0"},"sidebar":"tutorialSidebar","previous":{"title":"Upgrade Path","permalink":"/multi-scrobbler/updating/upgrade-path/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/"}}'),r=i(4848),o=i(8453),t=i(8194),c=i(698);i(2170);let l={sidebar_position:1,title:"From < 0.14.0",description:"Upgrading to 0.14.0"},a,d={},h=[{value:"Source/Client IDs",id:"sourceclient-ids",level:2},{value:"Configuring IDs",id:"configuring-ids",level:3},{value:"Cached Scrobble Migration",id:"cached-scrobble-migration",level:2},{value:"Cache Configuration",id:"cache-configuration",level:2},{value:"Scrobble Caching Removed",id:"scrobble-caching-removed",level:4},{value:"Metadata Config Simplified",id:"metadata-config-simplified",level:4},{value:"Auth Config Simplified",id:"auth-config-simplified",level:4},{value:"Renamed ENV Keys",id:"renamed-env-keys",level:2},{value:"(Optional) ENV Client/Source Names",id:"optional-env-clientsource-names",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.h2,{id:"sourceclient-ids",children:"Source/Client IDs"}),"\n",(0,r.jsxs)(n.p,{children:["MS ",(0,r.jsx)(n.code,{children:"0.14.0"})," introduces a database for persisting Plays/Scrobbles, queues, and other data ",(0,r.jsx)(n.strong,{children:"associated with a Source/Client"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To make this association atomic a Source/Client ",(0,r.jsx)(n.strong,{children:"ID"})," is now configurable. This ID is what MS will use to identify the Source/Client in your ",(0,r.jsx)(n.strong,{children:"config"})," with the Source/Client in the ",(0,r.jsx)(n.strong,{children:"database"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"This ID needs to be unique to the client or source type it is used on IE:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["two ",(0,r.jsx)(n.a,{href:"/configuration/clients/koito/",children:"Koito Clients"})," cannot both have the ID ",(0,r.jsx)(n.code,{children:"myKoitoID"})]}),"\n",(0,r.jsxs)(n.li,{children:["it is recommended that the ID be ",(0,r.jsx)(n.em,{children:"globally"})," unique among all sources/clients, but it's not required"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"configuring-ids",children:"Configuring IDs"}),"\n",(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(c.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["For each Source/Client in your environmental variables, add a key with the suffix ",(0,r.jsx)(n.code,{children:"_ID"})," and the ID value. EX"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n - KOTIO_TOKEN=...\n # ...more koito config\n // highlight-start\n - KOITO_ID=myKoitoID\n // highlight-end\n\n - JELLYFIN_URL=...\n # ...more jellyin config\n // highlight-start\n - JELLYFIN_ID=myJellyfinID\n // highlight-end \n"})})]}),(0,r.jsxs)(c.A,{value:"file",label:"File",children:[(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.code,{children:"id"})," to the top-level for each Source/Client configuration, next to ",(0,r.jsx)(n.code,{children:"data"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="koito.json"',children:'[\n {\n "name": "koito-source",\n "configureAs": "source",\n // highlight-start\n "id": "myKoitoID",\n // highlight-end \n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n]\n'})})]}),(0,r.jsxs)(c.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.code,{children:"id"})," to the top-level for each Source/Client configuration, next to ",(0,r.jsx)(n.code,{children:"data"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "sources": [\n {\n "name": "koito-source",\n "configureAs": "source",\n "type": "koito",\n // highlight-start\n "id": "myKoitoID",\n // highlight-end \n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n ]\n}\n'})})]})]}),"\n",(0,r.jsxs)(n.admonition,{title:"Default ID",type:"important",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"In 0.14.0, If you do not add an ID then Multi-Scrobbler will automatically use the name of the Source/Client as the ID."})," The name is shown in the Dashboard."]}),(0,r.jsx)(n.p,{children:"If you decide to add an ID later, you must use the Source/Client name as the ID in order to keep Plays/Scobbles associated with the same config."}),(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.strong,{children:["In ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases/tag/0.16.0",children:"0.16.0+"})," you are required to have an ID or a configuration error is thrown."]})})]}),"\n",(0,r.jsx)(n.h2,{id:"cached-scrobble-migration",children:"Cached Scrobble Migration"}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Before upgrading, if your MS dashboard shows 0 queued/failed for all ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Scrobble Clients"})," then you can ",(0,r.jsx)(n.strong,{children:"ignore this section."})]})}),"\n",(0,r.jsx)(n.admonition,{type:"important",children:(0,r.jsxs)(n.p,{children:["The cached scrobbles for a Client/Source were based on its ",(0,r.jsx)(n.strong,{children:"name"}),". If you plan on changing the name of a Client/Source with this upgrade you should do it ",(0,r.jsx)(n.strong,{children:"after"})," this migration has run or else MS will not be able to find any associated cached scrobbles."]})}),"\n",(0,r.jsxs)(n.p,{children:["MS ",(0,r.jsx)(n.code,{children:"0.14.0"})," introduces a database for persisting Plays/Scrobbles, queues, and other data. Prior to ",(0,r.jsx)(n.code,{children:"0.14.0"}),", queued/failed scrobbles were stored in a cache ",(0,r.jsx)(n.strong,{children:"file"})," inside your ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:(0,r.jsx)(n.code,{children:"CONFIG_DIR"})})," named ",(0,r.jsx)(n.code,{children:"ms-scrobble.cache"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["When a ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"})," is created and ",(0,r.jsx)(n.strong,{children:"enabled"})," in ",(0,r.jsx)(n.code,{children:"0.14.0"})," it will attempt to ",(0,r.jsx)(n.strong,{children:"automatically migrate scrobbles"})," from this cache into the database."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["You can see progress/results for this process by filtering logs for ",(0,r.jsx)(n.code,{children:"[Cached Scrobble Migration]"})]}),"\n",(0,r.jsx)(n.li,{children:"If the process fails MS will attempt to migrate failed scrobbles, again, the next time it is started"}),"\n",(0,r.jsxs)(n.li,{children:["Your cached scrobbles ",(0,r.jsx)(n.strong,{children:"are not deleted"})," in either the success or failure outcome","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"If the process succeeds then MS knows to ignore the cache on subsequent startups"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsxs)(n.p,{children:["This process only occurs for Clients that are ",(0,r.jsx)(n.strong,{children:"enabled."})]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"If you are using ENV for config then your Clients are automatically enabled"}),"\n",(0,r.jsxs)(n.li,{children:["If you are using File/AIO make sure that the ",(0,r.jsx)(n.code,{children:"enable"})," property is either ",(0,r.jsx)(n.code,{children:"true"})," or not present in your Client configs"]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Even if your Client does not start successfully (EX due to authentication) you should still enable and start ",(0,r.jsx)(n.strong,{children:"all"})," Clients in order to get all scrobbled migrated."]})]}),"\n",(0,r.jsx)(n.h2,{id:"cache-configuration",children:"Cache Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["In ",(0,r.jsx)(n.code,{children:"0.14.0"})," ",(0,r.jsx)(n.a,{href:"/configuration#caching",children:"Cache"})," has been simplified with much of the required configuration being removed."]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["This only applies to users who have ",(0,r.jsx)(n.code,{children:"cache"})," in their ",(0,r.jsx)(n.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})," ",(0,r.jsx)(n.code,{children:"config.json"})," or are using ",(0,r.jsx)(n.code,{children:"CACHE_*"})," ",(0,r.jsx)(n.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})]}),(0,r.jsxs)(n.p,{children:["If you do not have any of the above ",(0,r.jsx)(n.a,{href:"/configuration#caching",children:"Cache"})," configuration defined then you can ",(0,r.jsx)(n.strong,{children:"ignore this section."})]})]}),"\n",(0,r.jsx)(n.h4,{id:"scrobble-caching-removed",children:"Scrobble Caching Removed"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"#cached-scrobble-migration",children:"Scrobble caching has removed and replaced by the new database."})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Remove any ENV Config starting with ",(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE"})]}),"\n",(0,r.jsxs)(n.li,{children:["Remove ",(0,r.jsx)(n.code,{children:"cache.scrobble"})," from the AIO Config"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"metadata-config-simplified",children:"Metadata Config Simplified"}),"\n",(0,r.jsxs)(n.p,{children:["Metadata caching remains the same but the config has been simplified. If you were using ",(0,r.jsx)(n.a,{href:"/configuration/#secondary-caching",children:"Valkey for caching"})," update your config:"]}),"\n",(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(c.A,{value:"env",label:"ENV",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Remove ",(0,r.jsx)(n.code,{children:"CACHE_METADATA"})]}),"\n",(0,r.jsxs)(n.li,{children:["Rename ",(0,r.jsx)(n.code,{children:"CACHE_METADATA_CONN"})," to ",(0,r.jsx)(n.a,{href:"/configuration/#secondary-caching",children:(0,r.jsx)(n.code,{children:"CACHE_VALKEY"})})]}),"\n"]})}),(0,r.jsxs)(c.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(n.p,{children:["Remove ",(0,r.jsx)(n.code,{children:"cache.metadata"})," and add a new string key ",(0,r.jsx)(n.code,{children:"valkey"})," to the ",(0,r.jsx)(n.code,{children:"cache"})," object, containing your valkey connection string:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-diff",children:' "cache": {\n+ "valkey": "redis://valkey:6379"\n- "metadata": {\n- "provider": "valkey",\n- "connection": "redis://valkey:6379"\n- }\n }\n'})})]})]}),"\n",(0,r.jsx)(n.h4,{id:"auth-config-simplified",children:"Auth Config Simplified"}),"\n",(0,r.jsxs)(n.p,{children:["Auth caching remains the same but the config has been simplified. The connection option for Auth is no longer configurable. You may specify provider as either ",(0,r.jsx)(n.code,{children:"file"})," (default, uses ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"}),") or ",(0,r.jsx)(n.code,{children:"valkey"}),". If you want to use Valkey for auth it will use the same config as Metadata."]}),"\n",(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(c.A,{value:"env",label:"ENV",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Remove ",(0,r.jsx)(n.code,{children:"CACHE_AUTH_CONN"})]}),"\n",(0,r.jsxs)(n.li,{children:["Add ",(0,r.jsx)(n.a,{href:"/configuration/#secondary-caching",children:(0,r.jsx)(n.code,{children:"CACHE_VALKEY"})})," (if using valkey)"]}),"\n"]})}),(0,r.jsxs)(c.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(n.p,{children:["Remove the ",(0,r.jsx)(n.code,{children:"connection"})," property from the ",(0,r.jsx)(n.code,{children:"auth"})," object. If using ",(0,r.jsx)(n.code,{children:"file"})," the entire ",(0,r.jsx)(n.code,{children:"auth"})," object can be removed."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-diff",children:' "cache": {\n+ "valkey": "redis://valkey:6379",\n "auth": {\n "provider": "valkey",\n- "connection": "redis://valkey:6379"\n }\n }\n'})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"renamed-env-keys",children:"Renamed ENV Keys"}),"\n",(0,r.jsx)(n.p,{children:"In an effort to standard ENV prefixes some ENV keys have been renamed:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"LZENDPOINT_ENABLE"})," => ",(0,r.jsx)(n.code,{children:"LZE_ENABLE"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"LFMENDPOINT_ENABLE"})," => ",(0,r.jsx)(n.code,{children:"LFM_ENABLE"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"optional-env-clientsource-names",children:"(Optional) ENV Client/Source Names"}),"\n",(0,r.jsxs)(n.p,{children:["In the MS Dashboard, prior to 0.14.0, UI Client/Sources configured with ",(0,r.jsx)(n.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})," always had generated names like ",(0,r.jsx)(n.code,{children:"unnamed-koito"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["ENV Config Clients/Sources can now be configured with a name by using the ",(0,r.jsx)(n.code,{children:"_NAME"})," suffix, example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n - KOTIO_TOKEN=...\n # ...\n - KOITO_ID=myKoitoID\n // highlight-start\n - KOITO_NAME=Koito A\n // highlight-end\n\n - JELLYFIN_URL=...\n # ..\n - JELLYFIN_ID=myJellyfinID\n // highlight-start\n - JELLYFIN_NAME=Foxx Jelly\n // highlight-end \n"})}),"\n",(0,r.jsx)(n.admonition,{type:"important",children:(0,r.jsxs)(n.p,{children:["If you have ",(0,r.jsx)(n.strong,{children:"cached scrobbles"})," make sure to upgrade and run ",(0,r.jsx)(n.a,{href:"#cached-scrobble-migration",children:"Cached Scrobble Migration"})," ",(0,r.jsx)(n.strong,{children:"before"})," adding names to Client/Sources."]})})]})}function g(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/61856a46.d8bdfb0e.js b/assets/js/61856a46.d8bdfb0e.js new file mode 100644 index 00000000..730c86ac --- /dev/null +++ b/assets/js/61856a46.d8bdfb0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2929"],{6649(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>g,frontMatter:()=>l,contentTitle:()=>a,toc:()=>h,assets:()=>d});var s=JSON.parse('{"id":"updating/upgrade-path/0140","title":"From < 0.14.0","description":"Upgrading to 0.14.0","source":"@site/docs/updating/upgrade-path/0140.mdx","sourceDirName":"updating/upgrade-path","slug":"/updating/upgrade-path/0140","permalink":"/multi-scrobbler/updating/upgrade-path/0140","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/updating/upgrade-path/0140.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"From < 0.14.0","description":"Upgrading to 0.14.0"},"sidebar":"tutorialSidebar","previous":{"title":"Upgrade Path","permalink":"/multi-scrobbler/updating/upgrade-path/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/configuration/"}}'),r=i(4848),o=i(8453),t=i(8194),c=i(698);i(2170);let l={sidebar_position:1,title:"From < 0.14.0",description:"Upgrading to 0.14.0"},a,d={},h=[{value:"Source/Client IDs",id:"sourceclient-ids",level:2},{value:"Configuring IDs",id:"configuring-ids",level:3},{value:"Cached Scrobble Migration",id:"cached-scrobble-migration",level:2},{value:"Cache Configuration",id:"cache-configuration",level:2},{value:"Scrobble Caching Removed",id:"scrobble-caching-removed",level:4},{value:"Metadata Config Simplified",id:"metadata-config-simplified",level:4},{value:"Auth Config Simplified",id:"auth-config-simplified",level:4},{value:"Renamed ENV Keys",id:"renamed-env-keys",level:2},{value:"(Optional) ENV Client/Source Names",id:"optional-env-clientsource-names",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.h2,{id:"sourceclient-ids",children:"Source/Client IDs"}),"\n",(0,r.jsxs)(n.p,{children:["MS ",(0,r.jsx)(n.code,{children:"0.14.0"})," introduces a database for persisting Plays/Scrobbles, queues, and other data ",(0,r.jsx)(n.strong,{children:"associated with a Source/Client"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To make this association atomic a Source/Client ",(0,r.jsx)(n.strong,{children:"ID"})," is now configurable. This ID is what MS will use to identify the Source/Client in your ",(0,r.jsx)(n.strong,{children:"config"})," with the Source/Client in the ",(0,r.jsx)(n.strong,{children:"database"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"This ID needs to be unique to the client or source type it is used on IE:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["two ",(0,r.jsx)(n.a,{href:"/configuration/clients/koito/",children:"Koito Clients"})," cannot both have the ID ",(0,r.jsx)(n.code,{children:"myKoitoID"})]}),"\n",(0,r.jsxs)(n.li,{children:["it is recommended that the ID be ",(0,r.jsx)(n.em,{children:"globally"})," unique among all sources/clients, but it's not required"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"configuring-ids",children:"Configuring IDs"}),"\n",(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(c.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["For each Source/Client in your environmental variables, add a key with the suffix ",(0,r.jsx)(n.code,{children:"_ID"})," and the ID value. EX"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n - KOTIO_TOKEN=...\n # ...more koito config\n // highlight-start\n - KOITO_ID=myKoitoID\n // highlight-end\n\n - JELLYFIN_URL=...\n # ...more jellyin config\n // highlight-start\n - JELLYFIN_ID=myJellyfinID\n // highlight-end \n"})})]}),(0,r.jsxs)(c.A,{value:"file",label:"File",children:[(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.code,{children:"id"})," to the top-level for each Source/Client configuration, next to ",(0,r.jsx)(n.code,{children:"data"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="koito.json"',children:'[\n {\n "name": "koito-source",\n "configureAs": "source",\n // highlight-start\n "id": "myKoitoID",\n // highlight-end \n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n]\n'})})]}),(0,r.jsxs)(c.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.code,{children:"id"})," to the top-level for each Source/Client configuration, next to ",(0,r.jsx)(n.code,{children:"data"}),":"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",metastring:'title="config.json"',children:'{\n "sources": [\n {\n "name": "koito-source",\n "configureAs": "source",\n "type": "koito",\n // highlight-start\n "id": "myKoitoID",\n // highlight-end \n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n ]\n}\n'})})]})]}),"\n",(0,r.jsxs)(n.admonition,{title:"Default ID",type:"important",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"In 0.14.0, If you do not add an ID then Multi-Scrobbler will automatically use the name of the Source/Client as the ID."})," The name is shown in the Dashboard."]}),(0,r.jsx)(n.p,{children:"If you decide to add an ID later, you must use the Source/Client name as the ID in order to keep Plays/Scobbles associated with the same config."}),(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.strong,{children:["In ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases/tag/0.16.0",children:"0.16.0+"})," you are required to have an ID or a configuration error is thrown."]})})]}),"\n",(0,r.jsx)(n.h2,{id:"cached-scrobble-migration",children:"Cached Scrobble Migration"}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Before upgrading, if your MS dashboard shows 0 queued/failed for all ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Scrobble Clients"})," then you can ",(0,r.jsx)(n.strong,{children:"ignore this section."})]})}),"\n",(0,r.jsx)(n.admonition,{type:"important",children:(0,r.jsxs)(n.p,{children:["The cached scrobbles for a Client/Source were based on its ",(0,r.jsx)(n.strong,{children:"name"}),". If you plan on changing the name of a Client/Source with this upgrade you should do it ",(0,r.jsx)(n.strong,{children:"after"})," this migration has run or else MS will not be able to find any associated cached scrobbles."]})}),"\n",(0,r.jsxs)(n.p,{children:["MS ",(0,r.jsx)(n.code,{children:"0.14.0"})," introduces a database for persisting Plays/Scrobbles, queues, and other data. Prior to ",(0,r.jsx)(n.code,{children:"0.14.0"}),", queued/failed scrobbles were stored in a cache ",(0,r.jsx)(n.strong,{children:"file"})," inside your ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:(0,r.jsx)(n.code,{children:"CONFIG_DIR"})})," named ",(0,r.jsx)(n.code,{children:"ms-scrobble.cache"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["When a ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Client"})," is created and ",(0,r.jsx)(n.strong,{children:"enabled"})," in ",(0,r.jsx)(n.code,{children:"0.14.0"})," it will attempt to ",(0,r.jsx)(n.strong,{children:"automatically migrate scrobbles"})," from this cache into the database."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["You can see progress/results for this process by filtering logs for ",(0,r.jsx)(n.code,{children:"[Cached Scrobble Migration]"})]}),"\n",(0,r.jsx)(n.li,{children:"If the process fails MS will attempt to migrate failed scrobbles, again, the next time it is started"}),"\n",(0,r.jsxs)(n.li,{children:["Your cached scrobbles ",(0,r.jsx)(n.strong,{children:"are not deleted"})," in either the success or failure outcome","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"If the process succeeds then MS knows to ignore the cache on subsequent startups"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsxs)(n.p,{children:["This process only occurs for Clients that are ",(0,r.jsx)(n.strong,{children:"enabled."})]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"If you are using ENV for config then your Clients are automatically enabled"}),"\n",(0,r.jsxs)(n.li,{children:["If you are using File/AIO make sure that the ",(0,r.jsx)(n.code,{children:"enable"})," property is either ",(0,r.jsx)(n.code,{children:"true"})," or not present in your Client configs"]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Even if your Client does not start successfully (EX due to authentication) you should still enable and start ",(0,r.jsx)(n.strong,{children:"all"})," Clients in order to get all scrobbled migrated."]})]}),"\n",(0,r.jsx)(n.h2,{id:"cache-configuration",children:"Cache Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["In ",(0,r.jsx)(n.code,{children:"0.14.0"})," ",(0,r.jsx)(n.a,{href:"/configuration#caching",children:"Cache"})," has been simplified with much of the required configuration being removed."]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["This only applies to users who have ",(0,r.jsx)(n.code,{children:"cache"})," in their ",(0,r.jsx)(n.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})," ",(0,r.jsx)(n.code,{children:"config.json"})," or are using ",(0,r.jsx)(n.code,{children:"CACHE_*"})," ",(0,r.jsx)(n.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})]}),(0,r.jsxs)(n.p,{children:["If you do not have any of the above ",(0,r.jsx)(n.a,{href:"/configuration#caching",children:"Cache"})," configuration defined then you can ",(0,r.jsx)(n.strong,{children:"ignore this section."})]})]}),"\n",(0,r.jsx)(n.h4,{id:"scrobble-caching-removed",children:"Scrobble Caching Removed"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"#cached-scrobble-migration",children:"Scrobble caching has removed and replaced by the new database."})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Remove any ENV Config starting with ",(0,r.jsx)(n.code,{children:"CACHE_SCROBBLE"})]}),"\n",(0,r.jsxs)(n.li,{children:["Remove ",(0,r.jsx)(n.code,{children:"cache.scrobble"})," from the AIO Config"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"metadata-config-simplified",children:"Metadata Config Simplified"}),"\n",(0,r.jsxs)(n.p,{children:["Metadata caching remains the same but the config has been simplified. If you were using ",(0,r.jsx)(n.a,{href:"/configuration/#secondary-caching",children:"Valkey for caching"})," update your config:"]}),"\n",(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(c.A,{value:"env",label:"ENV",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Remove ",(0,r.jsx)(n.code,{children:"CACHE_METADATA"})]}),"\n",(0,r.jsxs)(n.li,{children:["Rename ",(0,r.jsx)(n.code,{children:"CACHE_METADATA_CONN"})," to ",(0,r.jsx)(n.a,{href:"/configuration/#secondary-caching",children:(0,r.jsx)(n.code,{children:"CACHE_VALKEY"})})]}),"\n"]})}),(0,r.jsxs)(c.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(n.p,{children:["Remove ",(0,r.jsx)(n.code,{children:"cache.metadata"})," and add a new string key ",(0,r.jsx)(n.code,{children:"valkey"})," to the ",(0,r.jsx)(n.code,{children:"cache"})," object, containing your valkey connection string:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-diff",children:' "cache": {\n+ "valkey": "redis://valkey:6379"\n- "metadata": {\n- "provider": "valkey",\n- "connection": "redis://valkey:6379"\n- }\n }\n'})})]})]}),"\n",(0,r.jsx)(n.h4,{id:"auth-config-simplified",children:"Auth Config Simplified"}),"\n",(0,r.jsxs)(n.p,{children:["Auth caching remains the same but the config has been simplified. The connection option for Auth is no longer configurable. You may specify provider as either ",(0,r.jsx)(n.code,{children:"file"})," (default, uses ",(0,r.jsx)(n.code,{children:"CONFIG_DIR"}),") or ",(0,r.jsx)(n.code,{children:"valkey"}),". If you want to use Valkey for auth it will use the same config as Metadata."]}),"\n",(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(c.A,{value:"env",label:"ENV",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Remove ",(0,r.jsx)(n.code,{children:"CACHE_AUTH_CONN"})]}),"\n",(0,r.jsxs)(n.li,{children:["Add ",(0,r.jsx)(n.a,{href:"/configuration/#secondary-caching",children:(0,r.jsx)(n.code,{children:"CACHE_VALKEY"})})," (if using valkey)"]}),"\n"]})}),(0,r.jsxs)(c.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(n.p,{children:["Remove the ",(0,r.jsx)(n.code,{children:"connection"})," property from the ",(0,r.jsx)(n.code,{children:"auth"})," object. If using ",(0,r.jsx)(n.code,{children:"file"})," the entire ",(0,r.jsx)(n.code,{children:"auth"})," object can be removed."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-diff",children:' "cache": {\n+ "valkey": "redis://valkey:6379",\n "auth": {\n "provider": "valkey",\n- "connection": "redis://valkey:6379"\n }\n }\n'})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"renamed-env-keys",children:"Renamed ENV Keys"}),"\n",(0,r.jsx)(n.p,{children:"In an effort to standard ENV prefixes some ENV keys have been renamed:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"LZENDPOINT_ENABLE"})," => ",(0,r.jsx)(n.code,{children:"LZE_ENABLE"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"LFMENDPOINT_ENABLE"})," => ",(0,r.jsx)(n.code,{children:"LFM_ENABLE"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"optional-env-clientsource-names",children:"(Optional) ENV Client/Source Names"}),"\n",(0,r.jsxs)(n.p,{children:["In the MS Dashboard, prior to 0.14.0, UI Client/Sources configured with ",(0,r.jsx)(n.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})," always had generated names like ",(0,r.jsx)(n.code,{children:"unnamed-koito"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["ENV Config Clients/Sources can now be configured with a name by using the ",(0,r.jsx)(n.code,{children:"_NAME"})," suffix, example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="compose.yaml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n - KOTIO_TOKEN=...\n # ...\n - KOITO_ID=myKoitoID\n // highlight-start\n - KOITO_NAME=Koito A\n // highlight-end\n\n - JELLYFIN_URL=...\n # ..\n - JELLYFIN_ID=myJellyfinID\n // highlight-start\n - JELLYFIN_NAME=Foxx Jelly\n // highlight-end \n"})}),"\n",(0,r.jsx)(n.admonition,{type:"important",children:(0,r.jsxs)(n.p,{children:["If you have ",(0,r.jsx)(n.strong,{children:"cached scrobbles"})," make sure to upgrade and run ",(0,r.jsx)(n.a,{href:"#cached-scrobble-migration",children:"Cached Scrobble Migration"})," ",(0,r.jsx)(n.strong,{children:"before"})," adding names to Client/Sources."]})})]})}function g(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/64837553.7ea1aa42.js b/assets/js/64837553.7ea1aa42.js new file mode 100644 index 00000000..bbe8fd0d --- /dev/null +++ b/assets/js/64837553.7ea1aa42.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3895"],{1383(e,t,s){s.r(t),s.d(t,{metadata:()=>r,default:()=>f,frontMatter:()=>a,contentTitle:()=>d,toc:()=>u,assets:()=>h});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/lastfm.mdx?plain=1","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"}}'),n=s(4848),i=s(8453);s(8194),s(698),s(2170);var l=s(1432);function c(e){let t={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Environmental Variable"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"LASTFM_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsxs)(t.td,{children:["A globally unique ID EX ",(0,n.jsx)(t.code,{children:"myComponentId"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_NAME"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsxs)(t.td,{children:["Value of ",(0,n.jsx)(t.code,{children:"LASTFM_ID"})]}),(0,n.jsxs)(t.td,{children:["A vanity name EX ",(0,n.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_ENABLE"})}),(0,n.jsx)(t.td,{children:"boolean"}),(0,n.jsx)(t.td,{children:"true"}),(0,n.jsx)(t.td,{children:"Should this component be used?"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"LASTFM_API_KEY"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"API Key generated from Last.fm/Libre.fm account"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"LASTFM_SECRET"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"Secret generated from Last.fm/Libre.fm account"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_REDIRECT_URI"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"http://localhost:9078/lastfm/callback",children:"http://localhost:9078/lastfm/callback"})}),(0,n.jsx)(t.td,{children:"Optional URI to use for callback."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_SESSION"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"Optional session id returned from a completed auth flow"})]})]})]})}function o(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}let a={title:"Last.fm",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},u=[{value:"Callback/Redirect URL",id:"callbackredirect-url",level:3},{value:"Configuration",id:"configuration",level:2}];function m(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:s,Details:r,DetailsAdmo:c}=t;return s||b("Config",!0),r||b("Details",!0),c||b("DetailsAdmo",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.admonition,{title:"Other Users",type:"tip",children:(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a ",(0,n.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n",(0,n.jsxs)(t.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,n.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,n.jsxs)(c,{type:"warning",summary:"Limits for Old Scrobbles",children:[(0,n.jsxs)(t.p,{children:["Last.fm will not accept scrobbles that are timestamped as ",(0,n.jsx)(t.strong,{children:"older than 2 weeks"})," from the current time."]}),(0,n.jsxs)(t.p,{children:["This is not officially documented but has been confirmed by multiple people/mods in the last.fm support forums: ",(0,n.jsx)(t.a,{href:"https://support.last.fm/t/importing-listening-history-spotify-apple-music-and-itunes-wmp/1424/3",children:"[1]"})," ",(0,n.jsx)(t.a,{href:"https://support.last.fm/t/suggestion-allow-last-fm-pro-members-to-use-the-api-to-submit-scrobbles-older-than-2-weeks/69190/2",children:"[2]"})," ",(0,n.jsx)(t.a,{href:"https://support.last.fm/t/how-to-scrobble-complete-spotify-history/44558",children:"[3]"})]}),(0,n.jsxs)(t.p,{children:["Multi-scrobbler can queue scrobbles for you if the Last.fm service is unavailable, or if there is an issue with a specific scrobble. However, you are responsible for making sure these scrobbles are eventually sent to Last.fm (by retrying in the UI or retarting Last.fm client in UI) before the two week window has passed or else they will not be scrobblable ",(0,n.jsx)(t.em,{children:"at all"})," unless the timestamp is changed."]}),(0,n.jsx)(t.p,{children:"A future update to Multi-scrobbler will enable editing of unsent scrobble data and modifying the timestamp from the UI."}),(0,n.jsxs)(t.p,{children:["If you have issues with specific scrobbles not being sent and retries/restarts do not fix it, please make sure to ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=01-bug-report.yml",children:"create a new issue"})," in a timely manner so that it can be resolved before the window has passed."]})]}),"\n",(0,n.jsxs)(t.p,{children:["You will need a ",(0,n.jsx)(t.a,{href:"https://www.last.fm",children:"Last.fm"})," account to use the Last.fm API."]}),"\n",(0,n.jsxs)(t.p,{children:["After creating your account, ",(0,n.jsx)(t.a,{href:"https://www.last.fm/api/account/create",children:"register for an API account here."})]}),"\n",(0,n.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,n.jsx)(t.a,{href:"#callbackredirect-url",children:"Callback/Redirect URL"})," section."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Take note of your API Key and Secret after account creation."})}),"\n",(0,n.jsx)(t.h3,{id:"callbackredirect-url",children:"Callback/Redirect URL"}),"\n",(0,n.jsxs)(t.p,{children:["The Redirect (Callback) URL is used to redirect your ",(0,n.jsx)(t.strong,{children:"browser"})," to multi-scrobbler after authentication has completed."]}),"\n",(0,n.jsxs)(t.p,{children:["So, the ",(0,n.jsx)(t.em,{children:"base of the URL"})," you use should be the ",(0,n.jsx)(t.em,{children:"same"})," as the URL you would use to navigate to the multi-scrobbler dashboard."]}),"\n",(0,n.jsxs)(r,{children:[(0,n.jsx)("summary",{children:"Example"}),(0,n.jsxs)(t.p,{children:["If you can visit the multi-scrobbler dashboard by navigating to ",(0,n.jsx)(t.a,{href:"http://192.168.0.100:9078",children:"http://192.168.0.100:9078"})," in your web browser..."]}),(0,n.jsxs)(t.p,{children:["then the ENV ",(0,n.jsx)(t.code,{children:"LASTFM_REDIRECT_URI"}),", or ",(0,n.jsx)(t.code,{children:"redirectUri"})," for last.fm/libre.fm json config, should be"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"http://192.168.0.100:9078/lastfm/callback\n"})})]}),"\n",(0,n.jsxs)(t.p,{children:["The Redirect URL can be explicitly specified in the configuration below, or by using the global ",(0,n.jsx)(t.a,{href:"/configuration#base-url",children:"Base URL"})," setting."]}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(s,{config:"LastfmClientConfig",fileContent:l.A,client:!0,ambiguous:!0,name:"lastfm",children:(0,n.jsx)(o,{})})]})}function f(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}function b(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1432(e,t,s){s.d(t,{A:()=>r});let r='[\n {\n "name": "Foxx LFM Client",\n "id": "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": "Foxx LFM Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/64837553.c7e6ef42.js b/assets/js/64837553.c7e6ef42.js deleted file mode 100644 index 0ac31395..00000000 --- a/assets/js/64837553.c7e6ef42.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3895"],{1383(e,t,s){s.r(t),s.d(t,{metadata:()=>r,default:()=>f,frontMatter:()=>a,contentTitle:()=>d,toc:()=>u,assets:()=>h});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/lastfm.mdx?plain=1","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"}}'),n=s(4848),i=s(8453);s(8194),s(698),s(2170);var l=s(1432);function c(e){let t={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Environmental Variable"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"LASTFM_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsxs)(t.td,{children:["A globally unique ID EX ",(0,n.jsx)(t.code,{children:"myComponentId"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_NAME"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsxs)(t.td,{children:["Value of ",(0,n.jsx)(t.code,{children:"LASTFM_ID"})]}),(0,n.jsxs)(t.td,{children:["A vanity name EX ",(0,n.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_ENABLE"})}),(0,n.jsx)(t.td,{children:"boolean"}),(0,n.jsx)(t.td,{children:"true"}),(0,n.jsx)(t.td,{children:"Should this component be used?"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"LASTFM_API_KEY"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"API Key generated from Last.fm/Libre.fm account"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"LASTFM_SECRET"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"Secret generated from Last.fm/Libre.fm account"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_REDIRECT_URI"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"http://localhost:9078/lastfm/callback",children:"http://localhost:9078/lastfm/callback"})}),(0,n.jsx)(t.td,{children:"Optional URI to use for callback."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"LASTFM_SESSION"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"Optional session id returned from a completed auth flow"})]})]})]})}function o(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}let a={title:"Last.fm",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},u=[{value:"Callback/Redirect URL",id:"callbackredirect-url",level:3},{value:"Configuration",id:"configuration",level:2}];function m(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:s,Details:r,DetailsAdmo:c}=t;return s||b("Config",!0),r||b("Details",!0),c||b("DetailsAdmo",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.admonition,{title:"Other Users",type:"tip",children:(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["To monitor and re-scrobble activity from your Last.fm/Libre.fm account create a ",(0,n.jsx)(t.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm (Source)"})]}),"\n",(0,n.jsxs)(t.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,n.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,n.jsxs)(c,{type:"warning",summary:"Limits for Old Scrobbles",children:[(0,n.jsxs)(t.p,{children:["Last.fm will not accept scrobbles that are timestamped as ",(0,n.jsx)(t.strong,{children:"older than 2 weeks"})," from the current time."]}),(0,n.jsxs)(t.p,{children:["This is not officially documented but has been confirmed by multiple people/mods in the last.fm support forums: ",(0,n.jsx)(t.a,{href:"https://support.last.fm/t/importing-listening-history-spotify-apple-music-and-itunes-wmp/1424/3",children:"[1]"})," ",(0,n.jsx)(t.a,{href:"https://support.last.fm/t/suggestion-allow-last-fm-pro-members-to-use-the-api-to-submit-scrobbles-older-than-2-weeks/69190/2",children:"[2]"})," ",(0,n.jsx)(t.a,{href:"https://support.last.fm/t/how-to-scrobble-complete-spotify-history/44558",children:"[3]"})]}),(0,n.jsxs)(t.p,{children:["Multi-scrobbler can queue scrobbles for you if the Last.fm service is unavailable, or if there is an issue with a specific scrobble. However, you are responsible for making sure these scrobbles are eventually sent to Last.fm (by retrying in the UI or retarting Last.fm client in UI) before the two week window has passed or else they will not be scrobblable ",(0,n.jsx)(t.em,{children:"at all"})," unless the timestamp is changed."]}),(0,n.jsx)(t.p,{children:"A future update to Multi-scrobbler will enable editing of unsent scrobble data and modifying the timestamp from the UI."}),(0,n.jsxs)(t.p,{children:["If you have issues with specific scrobbles not being sent and retries/restarts do not fix it, please make sure to ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=01-bug-report.yml",children:"create a new issue"})," in a timely manner so that it can be resolved before the window has passed."]})]}),"\n",(0,n.jsxs)(t.p,{children:["You will need a ",(0,n.jsx)(t.a,{href:"https://www.last.fm",children:"Last.fm"})," account to use the Last.fm API."]}),"\n",(0,n.jsxs)(t.p,{children:["After creating your account, ",(0,n.jsx)(t.a,{href:"https://www.last.fm/api/account/create",children:"register for an API account here."})]}),"\n",(0,n.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,n.jsx)(t.a,{href:"#callbackredirect-url",children:"Callback/Redirect URL"})," section."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Take note of your API Key and Secret after account creation."})}),"\n",(0,n.jsx)(t.h3,{id:"callbackredirect-url",children:"Callback/Redirect URL"}),"\n",(0,n.jsxs)(t.p,{children:["The Redirect (Callback) URL is used to redirect your ",(0,n.jsx)(t.strong,{children:"browser"})," to multi-scrobbler after authentication has completed."]}),"\n",(0,n.jsxs)(t.p,{children:["So, the ",(0,n.jsx)(t.em,{children:"base of the URL"})," you use should be the ",(0,n.jsx)(t.em,{children:"same"})," as the URL you would use to navigate to the multi-scrobbler dashboard."]}),"\n",(0,n.jsxs)(r,{children:[(0,n.jsx)("summary",{children:"Example"}),(0,n.jsxs)(t.p,{children:["If you can visit the multi-scrobbler dashboard by navigating to ",(0,n.jsx)(t.a,{href:"http://192.168.0.100:9078",children:"http://192.168.0.100:9078"})," in your web browser..."]}),(0,n.jsxs)(t.p,{children:["then the ENV ",(0,n.jsx)(t.code,{children:"LASTFM_REDIRECT_URI"}),", or ",(0,n.jsx)(t.code,{children:"redirectUri"})," for last.fm/libre.fm json config, should be"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"http://192.168.0.100:9078/lastfm/callback\n"})})]}),"\n",(0,n.jsxs)(t.p,{children:["The Redirect URL can be explicitly specified in the configuration below, or by using the global ",(0,n.jsx)(t.a,{href:"/configuration#base-url",children:"Base URL"})," setting."]}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(s,{config:"LastfmClientConfig",fileContent:l.A,client:!0,ambiguous:!0,name:"lastfm",children:(0,n.jsx)(o,{})})]})}function f(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}function b(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1432(e,t,s){s.d(t,{A:()=>r});let r='[\n {\n "name": "Foxx LFM Client",\n "id": "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": "Foxx LFM Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/72d905a9.6c664fe1.js b/assets/js/72d905a9.6c664fe1.js deleted file mode 100644 index cd996eaa..00000000 --- a/assets/js/72d905a9.6c664fe1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7227"],{7256(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>x,frontMatter:()=>d,contentTitle:()=>h,toc:()=>m,assets:()=>u});var s=JSON.parse('{"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.","source":"@site/docs/configuration/sources/google-cast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/google-cast","permalink":"/multi-scrobbler/configuration/sources/google-cast","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/google-cast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Google Cast (Chromecast)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Deezer","permalink":"/multi-scrobbler/configuration/sources/deezer"},"next":{"title":"Icecast","permalink":"/multi-scrobbler/configuration/sources/icecast"}}'),t=i(4848),o=i(8453),r=i(8194),a=i(698);function c(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"CC_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"CC_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_BLACKLIST_DEVICES"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"DO NOT scrobble from any cast devices on this comma-delimited list that START WITH these values"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_WHITELIST_DEVICES"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"ONLY scrobble from any cast device on this comma-delimited list that START WITH these values"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_BLACKLIST_APPS"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"DO NOT scrobble from any application on this comma-delimited list that START WITH these values"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_WHITELIST_APPS"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"ONLY scrobble from any application on this comma-delimited list that START WITH these values"})]})]})]})}function l(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}i(2170);let d={title:"Google Cast (Chromecast)",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},m=[{value:"Connecting Devices",id:"connecting-devices",level:4},{value:"mDNS Discovery",id:"mdns-discovery",level:6},{value:"What Media Does MS Scrobble?",id:"what-media-does-ms-scrobble",level:4},{value:"Allow Unknown Media Type",id:"allow-unknown-media-type",level:5},{value:"Forcing Media Tracking",id:"forcing-media-tracking",level:5},{value:"Cast Troubleshooting",id:"cast-troubleshooting",level:4},{value:"Configuration",id:"configuration",level:2}];function p(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",h5:"h5",h6:"h6",img:"img",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components},{Config:i,Details:s}=n;return i||g("Config",!0),s||g("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["If your media device can be ",(0,t.jsx)(n.strong,{children:"Cast"})," to using this button ",(0,t.jsx)(n.img,{src:"https://upload.wikimedia.org/wikipedia/commons/2/26/Chromecast_cast_button_icon.svg",alt:"Chromecast Icon"})," on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play."]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsx)(n.mdxAdmonitionTitle,{}),(0,t.jsxs)(n.p,{children:["Google Cast support is ",(0,t.jsx)(n.strong,{children:"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."]})]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsx)(n.mdxAdmonitionTitle,{}),(0,t.jsxs)(n.p,{children:["This source relies on common, ",(0,t.jsx)(n.strong,{children:"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 ",(0,t.jsx)(n.a,{href:"/configuration/sources",children:"Source"})," it is recommended to configure for it and blacklist the app on Google Cast, rather than relying solely on Google Cast for scrobbling."]})]}),"\n",(0,t.jsx)(n.h4,{id:"connecting-devices",children:"Connecting Devices"}),"\n",(0,t.jsxs)(n.p,{children:["Cast devices can be manually configured using file-based configuration OR automatically discovered using ",(0,t.jsx)(n.strong,{children:"mDNS."})]}),"\n",(0,t.jsx)(n.h6,{id:"mdns-discovery",children:"mDNS Discovery"}),"\n",(0,t.jsxs)(n.p,{children:["The host machine running multi-scrobbler must be configured to allow ",(0,t.jsx)(n.a,{href:"https://book.hacktricks.xyz/network-services-pentesting/5353-udp-multicast-dns-mdns",children:"mDNS traffic on port 5353/UDP"}),"."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"OS Specific Instructions"}),(0,t.jsxs)(r.A,{children:[(0,t.jsxs)(a.A,{value:"linux",label:"Linux",children:[(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Docker"})}),(0,t.jsxs)(n.p,{children:["The host machine must have ",(0,t.jsx)(n.a,{href:"https://avahi.org/",children:"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:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"docker run ... -v /var/run/dbus:/var/run/dbus -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket ... foxxmd/multi-scrobbler\n"})}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Flatpak/Nodejs"})}),(0,t.jsx)(n.p,{children:"No additional steps are required."})]}),(0,t.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Docker"})}),(0,t.jsx)(n.p,{children:"Unsupported at this time."}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Nodejs"})}),(0,t.jsx)(n.p,{children:"No additional steps are required."})]})]})]}),"\n",(0,t.jsx)(n.h4,{id:"what-media-does-ms-scrobble",children:"What Media Does MS Scrobble?"}),"\n",(0,t.jsxs)(n.p,{children:["Cast devices report what type of media the current activity is ",(0,t.jsxs)(n.a,{href:"https://developers.google.com/cast/docs/media/messages#MediaInformation",children:["(see ",(0,t.jsx)(n.code,{children:"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 ",(0,t.jsx)(n.code,{children:"unknown"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.strong,{children:["By default, MS will only track media that is reported as ",(0,t.jsx)(n.code,{children:"MusicTrack"}),"."]})}),"\n",(0,t.jsx)(n.h5,{id:"allow-unknown-media-type",children:"Allow Unknown Media Type"}),"\n",(0,t.jsxs)(n.p,{children:["Media with an Unknown (",(0,t.jsx)(n.code,{children:"Generic"}),") media type can be explicitly allowed by setting ",(0,t.jsx)(n.code,{children:'"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."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="chromecast.json"',children:'[\n {\n "name": "MyCast",\n "type": "chromecast",\n "data": {\n // only allow unknown if app name contains any of these phrases\n "allowUnknownMedia": ["smarttube", "default media receiver"]\n },\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h5,{id:"forcing-media-tracking",children:"Forcing Media Tracking"}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.code,{children:'"forceMediaRecognitionOn"'})," in the file-based configuration to a list of application names that should always be tracked."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="chromecast.json"',children:'[\n {\n "name": "MyCast",\n "type": "chromecast",\n "data": {\n // media from applications that contains these phrases will always be tracked, regardless of media type reported\n "forceMediaRecognitionOn": ["smarttube", "default media receiver"]\n },\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h4,{id:"cast-troubleshooting",children:"Cast Troubleshooting"}),"\n",(0,t.jsx)(n.p,{children:"Please include any/all logs with raw output if there are any errors encountered as this is critical to diagnosing issues."}),"\n",(0,t.jsxs)(n.p,{children:["To diagnose bad/incomplete track information or strange MS player behavior please turn on ",(0,t.jsx)(n.strong,{children:"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 ",(0,t.jsx)(n.a,{href:"/configuration#debug-mode",children:"Debug Mode."})]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="chromecast.json"',children:'[\n {\n "name": "MyCast",\n "type": "chromecast",\n "data": {\n //...\n },\n "options": {\n "logPayload": true\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(i,{config:"ChromecastSourceConfig",fileContent:'[\n {\n "name": "My Cast",\n "id": "myCast",\n "data": {\n "blacklistedDevices": [],\n "whitelistedDevices": [],\n "blacklistedApps": [],\n "whitelistedApps": []\n }\n }\n]\n',name:"chromecast",children:[(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"#connecting-devices",children:"Manually configuring cast device connections"})," is only available through file-based config."]})}),(0,t.jsx)(l,{})]})]})}function x(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}function g(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/72d905a9.fb69ac6f.js b/assets/js/72d905a9.fb69ac6f.js new file mode 100644 index 00000000..f0b5ee25 --- /dev/null +++ b/assets/js/72d905a9.fb69ac6f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7227"],{7256(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>x,frontMatter:()=>d,contentTitle:()=>h,toc:()=>m,assets:()=>u});var s=JSON.parse('{"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.","source":"@site/docs/configuration/sources/google-cast.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/google-cast","permalink":"/multi-scrobbler/configuration/sources/google-cast","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/google-cast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Google Cast (Chromecast)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Deezer","permalink":"/multi-scrobbler/configuration/sources/deezer"},"next":{"title":"Icecast","permalink":"/multi-scrobbler/configuration/sources/icecast"}}'),t=i(4848),o=i(8453),r=i(8194),a=i(698);function c(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"CC_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"CC_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_BLACKLIST_DEVICES"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"DO NOT scrobble from any cast devices on this comma-delimited list that START WITH these values"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_WHITELIST_DEVICES"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"ONLY scrobble from any cast device on this comma-delimited list that START WITH these values"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_BLACKLIST_APPS"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"DO NOT scrobble from any application on this comma-delimited list that START WITH these values"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CC_WHITELIST_APPS"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"ONLY scrobble from any application on this comma-delimited list that START WITH these values"})]})]})]})}function l(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}i(2170);let d={title:"Google Cast (Chromecast)",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},m=[{value:"Connecting Devices",id:"connecting-devices",level:4},{value:"mDNS Discovery",id:"mdns-discovery",level:6},{value:"What Media Does MS Scrobble?",id:"what-media-does-ms-scrobble",level:4},{value:"Allow Unknown Media Type",id:"allow-unknown-media-type",level:5},{value:"Forcing Media Tracking",id:"forcing-media-tracking",level:5},{value:"Cast Troubleshooting",id:"cast-troubleshooting",level:4},{value:"Configuration",id:"configuration",level:2}];function p(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",h5:"h5",h6:"h6",img:"img",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components},{Config:i,Details:s}=n;return i||g("Config",!0),s||g("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["If your media device can be ",(0,t.jsx)(n.strong,{children:"Cast"})," to using this button ",(0,t.jsx)(n.img,{src:"https://upload.wikimedia.org/wikipedia/commons/2/26/Chromecast_cast_button_icon.svg",alt:"Chromecast Icon"})," on your phone/computer then multi-scrobbler can monitor it in order to scrobble music you play."]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsx)(n.mdxAdmonitionTitle,{}),(0,t.jsxs)(n.p,{children:["Google Cast support is ",(0,t.jsx)(n.strong,{children:"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."]})]}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsx)(n.mdxAdmonitionTitle,{}),(0,t.jsxs)(n.p,{children:["This source relies on common, ",(0,t.jsx)(n.strong,{children:"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 ",(0,t.jsx)(n.a,{href:"/configuration/sources",children:"Source"})," it is recommended to configure for it and blacklist the app on Google Cast, rather than relying solely on Google Cast for scrobbling."]})]}),"\n",(0,t.jsx)(n.h4,{id:"connecting-devices",children:"Connecting Devices"}),"\n",(0,t.jsxs)(n.p,{children:["Cast devices can be manually configured using file-based configuration OR automatically discovered using ",(0,t.jsx)(n.strong,{children:"mDNS."})]}),"\n",(0,t.jsx)(n.h6,{id:"mdns-discovery",children:"mDNS Discovery"}),"\n",(0,t.jsxs)(n.p,{children:["The host machine running multi-scrobbler must be configured to allow ",(0,t.jsx)(n.a,{href:"https://book.hacktricks.xyz/network-services-pentesting/5353-udp-multicast-dns-mdns",children:"mDNS traffic on port 5353/UDP"}),"."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"OS Specific Instructions"}),(0,t.jsxs)(r.A,{children:[(0,t.jsxs)(a.A,{value:"linux",label:"Linux",children:[(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Docker"})}),(0,t.jsxs)(n.p,{children:["The host machine must have ",(0,t.jsx)(n.a,{href:"https://avahi.org/",children:"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:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"docker run ... -v /var/run/dbus:/var/run/dbus -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket ... foxxmd/multi-scrobbler\n"})}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Flatpak/Nodejs"})}),(0,t.jsx)(n.p,{children:"No additional steps are required."})]}),(0,t.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Docker"})}),(0,t.jsx)(n.p,{children:"Unsupported at this time."}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Nodejs"})}),(0,t.jsx)(n.p,{children:"No additional steps are required."})]})]})]}),"\n",(0,t.jsx)(n.h4,{id:"what-media-does-ms-scrobble",children:"What Media Does MS Scrobble?"}),"\n",(0,t.jsxs)(n.p,{children:["Cast devices report what type of media the current activity is ",(0,t.jsxs)(n.a,{href:"https://developers.google.com/cast/docs/media/messages#MediaInformation",children:["(see ",(0,t.jsx)(n.code,{children:"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 ",(0,t.jsx)(n.code,{children:"unknown"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.strong,{children:["By default, MS will only track media that is reported as ",(0,t.jsx)(n.code,{children:"MusicTrack"}),"."]})}),"\n",(0,t.jsx)(n.h5,{id:"allow-unknown-media-type",children:"Allow Unknown Media Type"}),"\n",(0,t.jsxs)(n.p,{children:["Media with an Unknown (",(0,t.jsx)(n.code,{children:"Generic"}),") media type can be explicitly allowed by setting ",(0,t.jsx)(n.code,{children:'"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."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="chromecast.json"',children:'[\n {\n "name": "MyCast",\n "type": "chromecast",\n "data": {\n // only allow unknown if app name contains any of these phrases\n "allowUnknownMedia": ["smarttube", "default media receiver"]\n },\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h5,{id:"forcing-media-tracking",children:"Forcing Media Tracking"}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.code,{children:'"forceMediaRecognitionOn"'})," in the file-based configuration to a list of application names that should always be tracked."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="chromecast.json"',children:'[\n {\n "name": "MyCast",\n "type": "chromecast",\n "data": {\n // media from applications that contains these phrases will always be tracked, regardless of media type reported\n "forceMediaRecognitionOn": ["smarttube", "default media receiver"]\n },\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h4,{id:"cast-troubleshooting",children:"Cast Troubleshooting"}),"\n",(0,t.jsx)(n.p,{children:"Please include any/all logs with raw output if there are any errors encountered as this is critical to diagnosing issues."}),"\n",(0,t.jsxs)(n.p,{children:["To diagnose bad/incomplete track information or strange MS player behavior please turn on ",(0,t.jsx)(n.strong,{children:"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 ",(0,t.jsx)(n.a,{href:"/configuration#debug-mode",children:"Debug Mode."})]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="chromecast.json"',children:'[\n {\n "name": "MyCast",\n "type": "chromecast",\n "data": {\n //...\n },\n "options": {\n "logPayload": true\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(i,{config:"ChromecastSourceConfig",fileContent:'[\n {\n "name": "My Cast",\n "id": "myCast",\n "data": {\n "blacklistedDevices": [],\n "whitelistedDevices": [],\n "blacklistedApps": [],\n "whitelistedApps": []\n }\n }\n]\n',name:"chromecast",children:[(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"#connecting-devices",children:"Manually configuring cast device connections"})," is only available through file-based config."]})}),(0,t.jsx)(l,{})]})]})}function x(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}function g(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/73287945.b4e4ba6e.js b/assets/js/73287945.b4e4ba6e.js new file mode 100644 index 00000000..912267cb --- /dev/null +++ b/assets/js/73287945.b4e4ba6e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8123"],{3485(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>f,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var i=JSON.parse('{"id":"configuration/sources/librefm-source","title":"Libre.fm","description":"Libre.fm (Source)","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/librefm-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Libre.fm","description":"Libre.fm (Source)","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=r(4848),s=r(8453);r(8194),r(698),r(2170);var o=r(4828);function c(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_API_KEY"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_SECRET"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_REDIRECT_URI"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:9078/librefm/callback",children:"http://localhost:9078/librefm/callback"})}),(0,t.jsx)(n.td,{children:"Optional URI to use for callback."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_SESSION"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Optional session id returned from a completed auth flow"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_URLBASE"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://libre.fm/2.0/",children:"https://libre.fm/2.0/"})}),(0,t.jsx)(n.td,{children:"(Optional) The host and path prefix for your Libre.fm instance"})]})]})]})}function l(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}let d={title:"Libre.fm",description:"Libre.fm (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config: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.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["This Source ",(0,t.jsx)(n.strong,{children:"monitors your Libre.fm scrobble history"})," and re-scrobbles new activity to configured ",(0,t.jsx)(n.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,t.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["To ",(0,t.jsx)(n.strong,{children:"scrobble to"})," Libre.fm, create a ",(0,t.jsx)(n.a,{href:"/configuration/clients/librefm",children:"Libre.fm (Client)"})]}),"\n"]})}),"\n",(0,t.jsxs)(n.p,{children:["To configure this Source use the same registration instructions and configuration data shown in ",(0,t.jsx)(n.a,{href:"/configuration/clients/librefm",children:"Libre.fm (Client)"})," with the difference being ",(0,t.jsx)(n.code,{children:'"configureAs": "source"'})," defined in the File/AIO configuration below."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"LibrefmSourceConfig",fileContent:o.A,configureAs:!0,ambiguous:!0,name:"librefm",children:(0,t.jsx)(l,{})})]})}function f(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},4828(e,n,r){r.d(n,{A:()=>i});let i='[\n {\n "name": "Foxx Libre Client",\n "id": "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": "Foxx Libre Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/73287945.e71cfce7.js b/assets/js/73287945.e71cfce7.js deleted file mode 100644 index 7446216d..00000000 --- a/assets/js/73287945.e71cfce7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8123"],{3485(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>f,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var i=JSON.parse('{"id":"configuration/sources/librefm-source","title":"Libre.fm","description":"Libre.fm (Source)","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/librefm-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Libre.fm","description":"Libre.fm (Source)","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=r(4848),s=r(8453);r(8194),r(698),r(2170);var o=r(4828);function c(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_API_KEY"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_SECRET"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_REDIRECT_URI"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:9078/librefm/callback",children:"http://localhost:9078/librefm/callback"})}),(0,t.jsx)(n.td,{children:"Optional URI to use for callback."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_SESSION"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Optional session id returned from a completed auth flow"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LIBREFM_URLBASE"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://libre.fm/2.0/",children:"https://libre.fm/2.0/"})}),(0,t.jsx)(n.td,{children:"(Optional) The host and path prefix for your Libre.fm instance"})]})]})]})}function l(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}let d={title:"Libre.fm",description:"Libre.fm (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config: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.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["This Source ",(0,t.jsx)(n.strong,{children:"monitors your Libre.fm scrobble history"})," and re-scrobbles new activity to configured ",(0,t.jsx)(n.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,t.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["To ",(0,t.jsx)(n.strong,{children:"scrobble to"})," Libre.fm, create a ",(0,t.jsx)(n.a,{href:"/configuration/clients/librefm",children:"Libre.fm (Client)"})]}),"\n"]})}),"\n",(0,t.jsxs)(n.p,{children:["To configure this Source use the same registration instructions and configuration data shown in ",(0,t.jsx)(n.a,{href:"/configuration/clients/librefm",children:"Libre.fm (Client)"})," with the difference being ",(0,t.jsx)(n.code,{children:'"configureAs": "source"'})," defined in the File/AIO configuration below."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"LibrefmSourceConfig",fileContent:o.A,configureAs:!0,ambiguous:!0,name:"librefm",children:(0,t.jsx)(l,{})})]})}function f(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},4828(e,n,r){r.d(n,{A:()=>i});let i='[\n {\n "name": "Foxx Libre Client",\n "id": "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": "Foxx Libre Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/74876495.15b0c1e9.js b/assets/js/74876495.15b0c1e9.js new file mode 100644 index 00000000..10e09106 --- /dev/null +++ b/assets/js/74876495.15b0c1e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7314"],{4591(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>m,frontMatter:()=>l,contentTitle:()=>a,toc:()=>h,assets:()=>d});var r=JSON.parse('{"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:","source":"@site/docs/quickstart.mdx","sourceDirName":".","slug":"/quickstart","permalink":"/multi-scrobbler/quickstart","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/quickstart.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Quickstart","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/installation/"}}'),i=s(4848),t=s(8453),o=s(8194),c=s(698);let l={title:"Quickstart",sidebar_position:2},a,d={},h=[{value:"Create Docker Compose File",id:"create-docker-compose-file",level:2},{value:"Setup Sources",id:"setup-sources",level:2},{value:"Create Listenbrainz Endpoint Source",id:"create-listenbrainz-endpoint-source",level:4},{value:"Configure Navidrome",id:"configure-navidrome",level:4},{value:"(Optional) Correct Scrobbles with Musicbrainz",id:"optional-correct-scrobbles-with-musicbrainz",level:2},{value:"Setup Clients",id:"setup-clients",level:2},{value:"Start Multi-Scrobbler",id:"start-multi-scrobbler",level:2},{value:"Next Steps",id:"next-steps",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...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,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["This guide will get you up and running with multi-scrobbler using ",(0,i.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," and ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/",children:(0,i.jsx)(n.code,{children:"docker compose"})}),". At the end of the guide you will have:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the dashboard served on port ",(0,i.jsx)(n.code,{children:"9078"})," of a host machine which has an IP of ",(0,i.jsx)(n.code,{children:"192.168.0.100"})]}),"\n",(0,i.jsxs)(n.li,{children:["data saved to the same directory as the ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,i.jsxs)(n.li,{children:["multi-scrobbler monitoring ",(0,i.jsx)(n.a,{href:"/configuration/sources/spotify",children:"Spotify"}),", ",(0,i.jsx)(n.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"}),", Navidrome, ",(0,i.jsx)(n.a,{href:"/configuration/sources/plex",children:"Plex"}),", and/or ",(0,i.jsx)(n.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})," for listening activity"]}),"\n",(0,i.jsxs)(n.li,{children:["multi-scrobbler scrobbling to ",(0,i.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"Lastfm"}),", ",(0,i.jsx)(n.a,{href:"/configuration/clients/maloja",children:"Maloja"}),", and/or ",(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito"})]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the multi-scrobbler container is on the same machine you will be viewing the dashboard from (IE ",(0,i.jsx)(n.code,{children:"localhost"}),") you can remove and ignore ",(0,i.jsx)(n.code,{children:"BASE_URL"})," usage below. Additionally, replace usage of ",(0,i.jsx)(n.code,{children:"192.168.0.100"})," with ",(0,i.jsx)(n.code,{children:"localhost"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"create-docker-compose-file",children:"Create Docker Compose File"}),"\n",(0,i.jsxs)(n.p,{children:["Create a new folder for multi-scrobbler related data and then create ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," with this content:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/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 - BASE_URL=http://192.168.0.100:9078\n # all Environmental Variables in below examples go here!\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})}),"\n",(0,i.jsx)(n.h2,{id:"setup-sources",children:"Setup Sources"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/configuration/sources",children:(0,i.jsx)(n.strong,{children:"Sources"})})," are the services/music players multi-scrobbler monitors to look for listening activity."]}),"\n",(0,i.jsxs)(o.A,{groupId:"qsSource",children:[(0,i.jsxs)(c.A,{value:"jellyfin",label:"Jellyfin",children:[(0,i.jsxs)(n.p,{children:["Follow the Jellyfin configuration ",(0,i.jsxs)(n.a,{href:"/configuration/sources/jellyfin",children:["instructions for setting up an ",(0,i.jsx)(n.strong,{children:"API Key"}),"."]})]}),(0,i.jsxs)(n.p,{children:["Then, add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- JELLYFIN_URL=192.168.0.110:8096 # URL to Jellyfin UI\n- JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b # Api Key created in previous step\n- JELLYFIN_USER=MyUser # Your username in Jellyfin\n- JELLYFIN_ID=myJellyin\n"})})]}),(0,i.jsxs)(c.A,{value:"spotify",label:"Spotify",children:[(0,i.jsxs)(n.p,{children:["To access your Spotify activity you must ",(0,i.jsx)(n.a,{href:"https://developer.spotify.com/dashboard",children:"create a Spotify App"})," to get a\n",(0,i.jsx)(n.strong,{children:"Client ID/Secret"})," and set a valid ",(0,i.jsx)(n.strong,{children:"Redirect URI"}),"."]}),(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"/configuration/sources/spotify#authenticate-spotify-with-multi-scrobbler",children:"Spotify Authentication instructions in the docs."})]}),(0,i.jsxs)(n.p,{children:["Assuming you used the ",(0,i.jsx)(n.strong,{children:"HTTPS"})," method for your ",(0,i.jsx)(n.strong,{children:"Redirect URI"})," from the instructions above...after the application is created add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- SPOTIFY_CLIENT_ID=yourClientId\n- SPOTIFY_CLIENT_SECRET=yourClientSecret\n- SPOTIFY_REDIRECT_URI=https://multi-scrobbler.mydomain.com/callback\n- SPOTIFY_ID=mySpotify\n"})}),(0,i.jsxs)(n.p,{children:["Later, after ",(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"starting multi-scrobbler"}),", visit the dashboard at ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078"})," and click ",(0,i.jsx)(n.strong,{children:"(Re)authenticate"})," on the Spotify card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete."]})]}),(0,i.jsxs)(c.A,{value:"navidrome",label:"Navidrome",children:[(0,i.jsxs)(n.p,{children:["Navidrome supports ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/scrobbling/#listenbrainz",children:"scrobbling using Listenbrainz"}),". You should use this, rather than a ",(0,i.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic Source"})," because Navidrome's internal scrobbling functionality supports providing multiple artists and offline scrobbling while the Subsonic Source does not."]}),(0,i.jsx)(n.p,{children:"To setup Navidrome to scrobble to multi-scrobbler via the Listenbrainz option:"}),(0,i.jsx)(n.h4,{id:"create-listenbrainz-endpoint-source",children:"Create Listenbrainz Endpoint Source"}),(0,i.jsxs)(n.p,{children:["Create a new ",(0,i.jsx)(n.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz Endpoint"})," ",(0,i.jsx)(n.a,{href:"/configuration/sources",children:"Source"})," in multi-scrobbler by creating a token to use with the endpoint via ",(0,i.jsx)(n.a,{href:"/configuration?configType=env#configuration-types",children:"ENV Config"})," in ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- LZE_TOKEN=myCoolToken\n- LZE_ID=navidromeLZ\n"})}),(0,i.jsxs)(n.p,{children:["The token can be anything. ",(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"(Re)start multi-scrobbler"})," after making this change."]}),(0,i.jsx)(n.h4,{id:"configure-navidrome",children:"Configure Navidrome"}),(0,i.jsxs)(n.p,{children:["Set the ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/configuration-options/#advanced-configuration",children:(0,i.jsx)(n.strong,{children:"ListenBrainz.BaseURL"})})," (env ",(0,i.jsx)(n.code,{children:"ND_LISTENBRAINZ_BASEURL"}),") to ",(0,i.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/"})," in your Navidrome installation. Assuming you are using the ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/installation/docker/",children:"docker installation"}),", modify ",(0,i.jsx)(n.code,{children:"environment"})," to add:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"- ND_LISTENBRAINZ_BASEURL=http://192.168.0.100:9078/1/\n"})}),(0,i.jsxs)(n.p,{children:["Restart Navidrome after making this change. Then, ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/scrobbling/#listenbrainz",children:"follow the directions for enabling Listenbrainz scrobbling in Navidrome"}),". The ",(0,i.jsx)(n.strong,{children:"Listenbrainz user token"})," is the token you created for ",(0,i.jsx)(n.code,{children:"LZE_TOKEN"})," earlier."]})]}),(0,i.jsxs)(c.A,{value:"plex",label:"Plex",children:[(0,i.jsxs)(n.p,{children:["Find your ",(0,i.jsx)(n.a,{href:"https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/",children:(0,i.jsx)(n.strong,{children:"Plex Token"})})," and make note of the ",(0,i.jsx)(n.strong,{children:"URL"})," and ",(0,i.jsx)(n.strong,{children:"Port"})," used to connect to your Plex instance."]}),(0,i.jsxs)(n.p,{children:["Add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- PLEX_URL=http://192.168.0.101:32400\n- PLEX_TOKEN=6c0ihz8j7__f5r18oa0zm8\n- PLEX_ID=myPlex\n# optional, restrict scrobbling to a list of comma-delimited users\n#- PLEX_USERS_ALLOW=myPlexUsername\n"})}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"Restart multi-scrobbler"})," to create the new Source. You may wish to refer to the ",(0,i.jsx)(n.a,{href:"/configuration/sources/plex",children:"User and Library defaults/filtering"})," in the Plex Source docs for a more granular setup."]})]}),(0,i.jsxs)(c.A,{value:"lastfm",label:"Last.fm",children:[(0,i.jsxs)(n.p,{children:["If you are already scrobbling to Last.fm and wish to mirror your scrobbling activity to one or more other ",(0,i.jsx)(n.a,{href:"#setup-clients",children:"Clients"}),", use this Source."]}),(0,i.jsxs)(n.p,{children:["If, instead, you want to scrobble ",(0,i.jsx)(n.strong,{children:"from"})," multi-scrobbler ",(0,i.jsx)(n.strong,{children:"to"})," Last.fm then see the Last.fm tab in the ",(0,i.jsx)(n.a,{href:"#setup-clients",children:"Setup Clients"})," section below."]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://www.last.fm/api/account/create",children:"Register for an API account at Last.fm."})}),(0,i.jsxs)(n.p,{children:["Use the following for ",(0,i.jsx)(n.strong,{children:"Callback URL"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078/lastfm/callback\n"})}),(0,i.jsxs)(n.p,{children:["After account creation make note of the ",(0,i.jsx)(n.strong,{children:"Api Key"})," and ",(0,i.jsx)(n.strong,{children:"Secret"})," that are displayed."]}),(0,i.jsxs)(n.p,{children:["Add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- SOURCE_LASTFM_API_KEY=MY_API_KEY_PLACEDHOLDER\n- SOURCE_LASTFM_SECRET=MY_SECRET_PLACEHOLDER\n- SOURCE_LASTFM_REDIRECT_URI=http://192.168.0.100:9078/lastfm/callback\n- SOURCE_LASTFM_ID=myLFMSource\n"})}),(0,i.jsxs)(n.p,{children:["Later, after ",(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"starting multi-scrobbler"}),", visit the dashboard at ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078"})," and click ",(0,i.jsx)(n.strong,{children:"(Re)authenticate"})," on the ",(0,i.jsx)(n.strong,{children:"Last.fm (Source)"})," card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete."]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"optional-correct-scrobbles-with-musicbrainz",children:"(Optional) Correct Scrobbles with Musicbrainz"}),"\n",(0,i.jsxs)(n.p,{children:["Multi-scrobbler can use ",(0,i.jsx)(n.a,{href:"https://musicbrainz.org/",children:"Musicbrainz"})," to match activity from your Sources in order to ",(0,i.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"fill in missing data"}),", or correct/normalize existing data, before it is scrobbled to the ",(0,i.jsx)(n.a,{href:"#setup-clients",children:"Clients"})," below. This step is optional."]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Musicbrainz Setup Instructions"}),(0,i.jsx)("h3",{children:"Configure Musicbrainz API"}),(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"This step only needs to be performed once"})," regardless of how many Sources you want to use Musicbrainz for."]})}),(0,i.jsxs)(n.p,{children:["You must provide a way for Musicbrainz to ",(0,i.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:"contact you."})]}),(0,i.jsxs)(n.p,{children:["Add these value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"# an email or personal website musicbrainz can use to contact you\n- MB_CONTACT=myCoolName@emailProvider.com \n# how musicbrainz searches and selects matches\n# isrc => then tries basic text fields => then tries extracted artists\n- MB_PRESETS=default,sensible,native\n"})}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Presets"})," are found ",(0,i.jsx)(n.a,{href:"/configuration/transforms/musicbrainz/#env-configuration",children:"here"}),"."]}),(0,i.jsx)("h3",{children:"Enable Musicbrainz For A Source"}),(0,i.jsx)(n.p,{children:"Musicbrainz can be enabled for multiple Sources. Follow the directions in each tab to enable it for that Source."}),(0,i.jsxs)(o.A,{groupId:"qsSource",children:[(0,i.jsxs)(c.A,{value:"jellyfin",label:"Jellyfin",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- JELLYFIN_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"spotify",label:"Spotify",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- SPOTIFY_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"navidrome",label:"Navidrome",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- LZE_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"plex",label:"Plex",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- PLEX_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"lastfm",label:"Last.fm",children:[(0,i.jsxs)(n.p,{children:["Modify the ",(0,i.jsx)(n.code,{children:"lastfm.json"})," file you created in the ",(0,i.jsx)(n.a,{href:"#setup-sources",children:"Setup Sources"})," step to add the highlighted section in the example below. The comma at the top highlighted section is important!"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="~/msData/config/lastfm.json"',children:'[\n {\n "name": "myLastFmSource",\n "configureAs": "source",\n "data": {\n "apiKey": "MY_API_KEY_PLACEDHOLDER",\n "secret": "MY_SECRET_PLACEHOLDER",\n "redirectUri": "http://192.168.0.100:9078/lastfm/callback"\n // highlight-start\n },\n "options": {\n "playTransform": {\n "preCompare": {\n "type": "musicbrainz"\n }\n }\n }\n // highlight-end\n }\n]\n'})})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"setup-clients",children:"Setup Clients"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/configuration/clients",children:(0,i.jsx)(n.strong,{children:"Clients"})})," are services that store scrobbles. Multi-scrobbler will scrobble all listening activity from the ",(0,i.jsx)(n.strong,{children:"Sources"})," you configured to all ",(0,i.jsx)(n.strong,{children:"Clients"})," you configure here."]}),"\n",(0,i.jsxs)(o.A,{groupId:"qsClient",children:[(0,i.jsxs)(c.A,{value:"koito",label:"Koito",children:[(0,i.jsxs)(n.p,{children:["Setup a ",(0,i.jsx)(n.a,{href:"https://koito.io/guides/installation/",children:"Koito server"})," if you have not already done this."]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://koito.io/guides/scrobbler/",children:"Create (or get) an API Key"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["From your Koito server dashboard navigate to ",(0,i.jsx)(n.strong,{children:"Settings"})," (bottom-left icon) => ",(0,i.jsx)(n.strong,{children:"API Keys"})]}),"\n",(0,i.jsxs)(n.li,{children:["Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["EX ",(0,i.jsx)(n.code,{children:"pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Take note of your Koito username (used below as ",(0,i.jsx)(n.code,{children:"myUser"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:["Determine your Koito URL","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance."}),"\n",(0,i.jsxs)(n.li,{children:["EX dashboard at ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:4110"})," => replace ",(0,i.jsx)(n.code,{children:"myURL"})," below with ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:4110"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"More info on the URL to use is the full docs"})}),"\n"]}),"\n"]}),"\n"]}),(0,i.jsxs)(n.p,{children:["Add/Substitute values above into these examples values and add them to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created for multi-scrobbler earlier."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- KOITO_TOKEN=myToken\n- KOITO_USER=myUser\n- KOITO_URL=myURL\n- KOITO_ID=myKoito\n"})}),(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["For Koito versions ",(0,i.jsx)(n.code,{children:"<=0.1.7"}),", you must have the environment variable ",(0,i.jsx)(n.code,{children:"KOITO_ALLOWED_HOSTS"})," set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. ",(0,i.jsx)(n.code,{children:"koito.mydomain.com"}),"."]})})]}),(0,i.jsxs)(c.A,{value:"lastfm",label:"Last.fm",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://www.last.fm/api/account/create",children:"Register for an API account at Last.fm."})}),(0,i.jsxs)(n.p,{children:["Use the following for ",(0,i.jsx)(n.strong,{children:"Callback URL"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078/lastfm/callback\n"})}),(0,i.jsxs)(n.p,{children:["After account creation use the displayed information and add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created for multi-scrobbler earlier."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- LASTFM_API_KEY=myApiKey\n- LASTFM_SECRET=myApiSecret\n- LASTFM_ID=myLfmClient\n"})})]}),(0,i.jsxs)(c.A,{value:"maloja",label:"Maloja",children:[(0,i.jsxs)(n.p,{children:["Setup a ",(0,i.jsx)(n.a,{href:"https://github.com/krateng/maloja?tab=readme-ov-file#how-to-install",children:"Maloja server"})," if you have not already done this."]}),(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Maloja Setup Intructions"}),(0,i.jsxs)(n.p,{children:["Using Maloja's example ",(0,i.jsx)(n.code,{children:"docker-compose.yml"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'reference title="~/malojaData/docker-compose.yml"',children:"https://github.com/krateng/maloja/blob/master/example-compose.yml\n"})}),(0,i.jsxs)(n.p,{children:["Uncomment ",(0,i.jsx)(n.code,{children:"environment"})," and add ",(0,i.jsx)(n.code,{children:"MALOJA_FORCE_PASSWORD=CHANGE_ME"})," to set an admin password"]}),(0,i.jsx)(n.p,{children:"Start the container:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:'title="~/malojaData"',children:"docker compose up -d\n"})})]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at ",(0,i.jsx)(n.a,{href:"http://192.168.0.100:42010/admin_apikeys",children:"http://192.168.0.100:42010/admin_apikeys"}),")","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Create a ",(0,i.jsx)(n.strong,{children:"New Key"})," and then copy the generated key value"]}),"\n"]}),"\n"]}),"\n"]}),(0,i.jsxs)(n.p,{children:["Finally, add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created for multi-scrobbler earlier."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- MALOJA_URL=http://192.168.0.100:42010\n- MALOJA_API_KEY=myApiKey\n- MALOJA_ID=myMaloja\n"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"start-multi-scrobbler",children:"Start Multi-Scrobbler"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["If you are running your multi-scrobbler container on a Linux host see ",(0,i.jsx)(n.a,{href:"/installation?dockerSetting=linuxHost#recommended-settings",children:"these instructions for setting proper file permissions."})]})}),"\n",(0,i.jsxs)(n.p,{children:["From the same directory as the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created earlier"]})," start the container:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:'title="~/msData"',children:"docker compose up -d\n"})}),"\n",(0,i.jsx)(n.p,{children:"You're done! Multi-scrobbler is now running. It will monitor the sources you configured and scrobble to clients you set up."}),"\n",(0,i.jsxs)(n.p,{children:["Visit ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078"})," to see the dashboard where"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["configured Sources/Clients","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"show current status and authentication options"}),"\n",(0,i.jsx)(n.li,{children:"display statistics about discovered/scrobbled tracks and Now Playing status"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"a real-time log shows multi-scrobbler's activity"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["See more advanced docker options as well as other install methods in the ",(0,i.jsx)(n.a,{href:"/installation#docker",children:(0,i.jsx)(n.strong,{children:"Installation"})})," docs","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Setup ",(0,i.jsx)(n.a,{href:"/configuration#secondary-caching",children:"secondary caching"})," with ",(0,i.jsx)(n.a,{href:"/installation?dockerSetting=caching#recommended-settings",children:"valkey"})," for increased performance and reduced memory usage"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Review the ",(0,i.jsx)(n.a,{href:"/configuration",children:(0,i.jsx)(n.strong,{children:"Configuration"})})," docs","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Learn about how to configure multi-scrobbler using files for more complicated Source/Client scenarios"}),"\n",(0,i.jsxs)(n.li,{children:["See all available ",(0,i.jsx)(n.a,{href:"/configuration/sources",children:(0,i.jsx)(n.strong,{children:"Sources"})})," and ",(0,i.jsx)(n.a,{href:"/configuration/clients",children:(0,i.jsx)(n.strong,{children:"Clients"})})," alongside configuration examples"]}),"\n",(0,i.jsxs)(n.li,{children:["Learn how to set up ",(0,i.jsx)(n.a,{href:"/configuration#webhook-configurations",children:"notification webhooks"})]}),"\n",(0,i.jsxs)(n.li,{children:["Check out the ",(0,i.jsx)(n.a,{href:"/configuration/kitchensink",children:"kitchensink example"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Setup ",(0,i.jsx)(n.a,{href:"/configuration/transforms",children:"Scrobble Enhancements"})," with ",(0,i.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," to automatically correct and fill in missing track information for your scrobbles"]}),"\n",(0,i.jsxs)(n.li,{children:["Consult the ",(0,i.jsx)(n.a,{href:"/FAQ",children:(0,i.jsx)(n.strong,{children:"FAQ"})})," for solutions to common problems"]}),"\n"]})]})}function m(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/74876495.3bfa055b.js b/assets/js/74876495.3bfa055b.js deleted file mode 100644 index 5042d233..00000000 --- a/assets/js/74876495.3bfa055b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7314"],{4591(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>m,frontMatter:()=>l,contentTitle:()=>a,toc:()=>h,assets:()=>d});var r=JSON.parse('{"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:","source":"@site/docs/quickstart.mdx","sourceDirName":".","slug":"/quickstart","permalink":"/multi-scrobbler/quickstart","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/quickstart.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Quickstart","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/installation/"}}'),i=s(4848),t=s(8453),o=s(8194),c=s(698);let l={title:"Quickstart",sidebar_position:2},a,d={},h=[{value:"Create Docker Compose File",id:"create-docker-compose-file",level:2},{value:"Setup Sources",id:"setup-sources",level:2},{value:"Create Listenbrainz Endpoint Source",id:"create-listenbrainz-endpoint-source",level:4},{value:"Configure Navidrome",id:"configure-navidrome",level:4},{value:"(Optional) Correct Scrobbles with Musicbrainz",id:"optional-correct-scrobbles-with-musicbrainz",level:2},{value:"Setup Clients",id:"setup-clients",level:2},{value:"Start Multi-Scrobbler",id:"start-multi-scrobbler",level:2},{value:"Next Steps",id:"next-steps",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...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,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["This guide will get you up and running with multi-scrobbler using ",(0,i.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," and ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/compose/",children:(0,i.jsx)(n.code,{children:"docker compose"})}),". At the end of the guide you will have:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the dashboard served on port ",(0,i.jsx)(n.code,{children:"9078"})," of a host machine which has an IP of ",(0,i.jsx)(n.code,{children:"192.168.0.100"})]}),"\n",(0,i.jsxs)(n.li,{children:["data saved to the same directory as the ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,i.jsxs)(n.li,{children:["multi-scrobbler monitoring ",(0,i.jsx)(n.a,{href:"/configuration/sources/spotify",children:"Spotify"}),", ",(0,i.jsx)(n.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"}),", Navidrome, ",(0,i.jsx)(n.a,{href:"/configuration/sources/plex",children:"Plex"}),", and/or ",(0,i.jsx)(n.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm"})," for listening activity"]}),"\n",(0,i.jsxs)(n.li,{children:["multi-scrobbler scrobbling to ",(0,i.jsx)(n.a,{href:"/configuration/clients/lastfm",children:"Lastfm"}),", ",(0,i.jsx)(n.a,{href:"/configuration/clients/maloja",children:"Maloja"}),", and/or ",(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"Koito"})]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If the multi-scrobbler container is on the same machine you will be viewing the dashboard from (IE ",(0,i.jsx)(n.code,{children:"localhost"}),") you can remove and ignore ",(0,i.jsx)(n.code,{children:"BASE_URL"})," usage below. Additionally, replace usage of ",(0,i.jsx)(n.code,{children:"192.168.0.100"})," with ",(0,i.jsx)(n.code,{children:"localhost"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"create-docker-compose-file",children:"Create Docker Compose File"}),"\n",(0,i.jsxs)(n.p,{children:["Create a new folder for multi-scrobbler related data and then create ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," with this content:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/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 - BASE_URL=http://192.168.0.100:9078\n # all Environmental Variables in below examples go here!\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})}),"\n",(0,i.jsx)(n.h2,{id:"setup-sources",children:"Setup Sources"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/configuration/sources",children:(0,i.jsx)(n.strong,{children:"Sources"})})," are the services/music players multi-scrobbler monitors to look for listening activity."]}),"\n",(0,i.jsxs)(o.A,{groupId:"qsSource",children:[(0,i.jsxs)(c.A,{value:"jellyfin",label:"Jellyfin",children:[(0,i.jsxs)(n.p,{children:["Follow the Jellyfin configuration ",(0,i.jsxs)(n.a,{href:"/configuration/sources/jellyfin",children:["instructions for setting up an ",(0,i.jsx)(n.strong,{children:"API Key"}),"."]})]}),(0,i.jsxs)(n.p,{children:["Then, add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- JELLYFIN_URL=192.168.0.110:8096 # URL to Jellyfin UI\n- JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b # Api Key created in previous step\n- JELLYFIN_USER=MyUser # Your username in Jellyfin\n- JELLYFIN_ID=myJellyin\n"})})]}),(0,i.jsxs)(c.A,{value:"spotify",label:"Spotify",children:[(0,i.jsxs)(n.p,{children:["To access your Spotify activity you must ",(0,i.jsx)(n.a,{href:"https://developer.spotify.com/dashboard",children:"create a Spotify App"})," to get a\n",(0,i.jsx)(n.strong,{children:"Client ID/Secret"})," and set a valid ",(0,i.jsx)(n.strong,{children:"Redirect URI"}),"."]}),(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"/configuration/sources/spotify#authenticate-spotify-with-multi-scrobbler",children:"Spotify Authentication instructions in the docs."})]}),(0,i.jsxs)(n.p,{children:["Assuming you used the ",(0,i.jsx)(n.strong,{children:"HTTPS"})," method for your ",(0,i.jsx)(n.strong,{children:"Redirect URI"})," from the instructions above...after the application is created add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- SPOTIFY_CLIENT_ID=yourClientId\n- SPOTIFY_CLIENT_SECRET=yourClientSecret\n- SPOTIFY_REDIRECT_URI=https://multi-scrobbler.mydomain.com/callback\n- SPOTIFY_ID=mySpotify\n"})}),(0,i.jsxs)(n.p,{children:["Later, after ",(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"starting multi-scrobbler"}),", visit the dashboard at ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078"})," and click ",(0,i.jsx)(n.strong,{children:"(Re)authenticate"})," on the Spotify card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete."]})]}),(0,i.jsxs)(c.A,{value:"navidrome",label:"Navidrome",children:[(0,i.jsxs)(n.p,{children:["Navidrome supports ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/scrobbling/#listenbrainz",children:"scrobbling using Listenbrainz"}),". You should use this, rather than a ",(0,i.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic Source"})," because Navidrome's internal scrobbling functionality supports providing multiple artists and offline scrobbling while the Subsonic Source does not."]}),(0,i.jsx)(n.p,{children:"To setup Navidrome to scrobble to multi-scrobbler via the Listenbrainz option:"}),(0,i.jsx)(n.h4,{id:"create-listenbrainz-endpoint-source",children:"Create Listenbrainz Endpoint Source"}),(0,i.jsxs)(n.p,{children:["Create a new ",(0,i.jsx)(n.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz Endpoint"})," ",(0,i.jsx)(n.a,{href:"/configuration/sources",children:"Source"})," in multi-scrobbler by creating a token to use with the endpoint via ",(0,i.jsx)(n.a,{href:"/configuration?configType=env#configuration-types",children:"ENV Config"})," in ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- LZE_TOKEN=myCoolToken\n- LZE_ID=navidromeLZ\n"})}),(0,i.jsxs)(n.p,{children:["The token can be anything. ",(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"(Re)start multi-scrobbler"})," after making this change."]}),(0,i.jsx)(n.h4,{id:"configure-navidrome",children:"Configure Navidrome"}),(0,i.jsxs)(n.p,{children:["Set the ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/configuration-options/#advanced-configuration",children:(0,i.jsx)(n.strong,{children:"ListenBrainz.BaseURL"})})," (env ",(0,i.jsx)(n.code,{children:"ND_LISTENBRAINZ_BASEURL"}),") to ",(0,i.jsx)(n.code,{children:"http://myMultiScrobblerIP:9078/1/"})," in your Navidrome installation. Assuming you are using the ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/installation/docker/",children:"docker installation"}),", modify ",(0,i.jsx)(n.code,{children:"environment"})," to add:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"- ND_LISTENBRAINZ_BASEURL=http://192.168.0.100:9078/1/\n"})}),(0,i.jsxs)(n.p,{children:["Restart Navidrome after making this change. Then, ",(0,i.jsx)(n.a,{href:"https://www.navidrome.org/docs/usage/scrobbling/#listenbrainz",children:"follow the directions for enabling Listenbrainz scrobbling in Navidrome"}),". The ",(0,i.jsx)(n.strong,{children:"Listenbrainz user token"})," is the token you created for ",(0,i.jsx)(n.code,{children:"LZE_TOKEN"})," earlier."]})]}),(0,i.jsxs)(c.A,{value:"plex",label:"Plex",children:[(0,i.jsxs)(n.p,{children:["Find your ",(0,i.jsx)(n.a,{href:"https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/",children:(0,i.jsx)(n.strong,{children:"Plex Token"})})," and make note of the ",(0,i.jsx)(n.strong,{children:"URL"})," and ",(0,i.jsx)(n.strong,{children:"Port"})," used to connect to your Plex instance."]}),(0,i.jsxs)(n.p,{children:["Add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- PLEX_URL=http://192.168.0.101:32400\n- PLEX_TOKEN=6c0ihz8j7__f5r18oa0zm8\n- PLEX_ID=myPlex\n# optional, restrict scrobbling to a list of comma-delimited users\n#- PLEX_USERS_ALLOW=myPlexUsername\n"})}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"Restart multi-scrobbler"})," to create the new Source. You may wish to refer to the ",(0,i.jsx)(n.a,{href:"/configuration/sources/plex",children:"User and Library defaults/filtering"})," in the Plex Source docs for a more granular setup."]})]}),(0,i.jsxs)(c.A,{value:"lastfm",label:"Last.fm",children:[(0,i.jsxs)(n.p,{children:["If you are already scrobbling to Last.fm and wish to mirror your scrobbling activity to one or more other ",(0,i.jsx)(n.a,{href:"#setup-clients",children:"Clients"}),", use this Source."]}),(0,i.jsxs)(n.p,{children:["If, instead, you want to scrobble ",(0,i.jsx)(n.strong,{children:"from"})," multi-scrobbler ",(0,i.jsx)(n.strong,{children:"to"})," Last.fm then see the Last.fm tab in the ",(0,i.jsx)(n.a,{href:"#setup-clients",children:"Setup Clients"})," section below."]}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://www.last.fm/api/account/create",children:"Register for an API account at Last.fm."})}),(0,i.jsxs)(n.p,{children:["Use the following for ",(0,i.jsx)(n.strong,{children:"Callback URL"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078/lastfm/callback\n"})}),(0,i.jsxs)(n.p,{children:["After account creation make note of the ",(0,i.jsx)(n.strong,{children:"Api Key"})," and ",(0,i.jsx)(n.strong,{children:"Secret"})," that are displayed."]}),(0,i.jsxs)(n.p,{children:["Add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- SOURCE_LASTFM_API_KEY=MY_API_KEY_PLACEDHOLDER\n- SOURCE_LASTFM_SECRET=MY_SECRET_PLACEHOLDER\n- SOURCE_LASTFM_REDIRECT_URI=http://192.168.0.100:9078/lastfm/callback\n- SOURCE_LASTFM_ID=myLFMSource\n"})}),(0,i.jsxs)(n.p,{children:["Later, after ",(0,i.jsx)(n.a,{href:"#start-multi-scrobbler",children:"starting multi-scrobbler"}),", visit the dashboard at ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078"})," and click ",(0,i.jsx)(n.strong,{children:"(Re)authenticate"})," on the ",(0,i.jsx)(n.strong,{children:"Last.fm (Source)"})," card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete."]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"optional-correct-scrobbles-with-musicbrainz",children:"(Optional) Correct Scrobbles with Musicbrainz"}),"\n",(0,i.jsxs)(n.p,{children:["Multi-scrobbler can use ",(0,i.jsx)(n.a,{href:"https://musicbrainz.org/",children:"Musicbrainz"})," to match activity from your Sources in order to ",(0,i.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"fill in missing data"}),", or correct/normalize existing data, before it is scrobbled to the ",(0,i.jsx)(n.a,{href:"#setup-clients",children:"Clients"})," below. This step is optional."]}),"\n",(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Musicbrainz Setup Instructions"}),(0,i.jsx)("h3",{children:"Configure Musicbrainz API"}),(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"This step only needs to be performed once"})," regardless of how many Sources you want to use Musicbrainz for."]})}),(0,i.jsxs)(n.p,{children:["You must provide a way for Musicbrainz to ",(0,i.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:"contact you."})]}),(0,i.jsxs)(n.p,{children:["Add these value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"# an email or personal website musicbrainz can use to contact you\n- MB_CONTACT=myCoolName@emailProvider.com \n# how musicbrainz searches and selects matches\n# isrc => then tries basic text fields => then tries extracted artists\n- MB_PRESETS=default,sensible,native\n"})}),(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Presets"})," are found ",(0,i.jsx)(n.a,{href:"/configuration/transforms/musicbrainz/#env-configuration",children:"here"}),"."]}),(0,i.jsx)("h3",{children:"Enable Musicbrainz For A Source"}),(0,i.jsx)(n.p,{children:"Musicbrainz can be enabled for multiple Sources. Follow the directions in each tab to enable it for that Source."}),(0,i.jsxs)(o.A,{groupId:"qsSource",children:[(0,i.jsxs)(c.A,{value:"jellyfin",label:"Jellyfin",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- JELLYFIN_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"spotify",label:"Spotify",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- SPOTIFY_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"navidrome",label:"Navidrome",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- LZE_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"plex",label:"Plex",children:[(0,i.jsxs)(n.p,{children:["Add this value to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- PLEX_TRANSFORMS=musicbrainz\n"})})]}),(0,i.jsxs)(c.A,{value:"lastfm",label:"Last.fm",children:[(0,i.jsxs)(n.p,{children:["Modify the ",(0,i.jsx)(n.code,{children:"lastfm.json"})," file you created in the ",(0,i.jsx)(n.a,{href:"#setup-sources",children:"Setup Sources"})," step to add the highlighted section in the example below. The comma at the top highlighted section is important!"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="~/msData/config/lastfm.json"',children:'[\n {\n "name": "myLastFmSource",\n "configureAs": "source",\n "data": {\n "apiKey": "MY_API_KEY_PLACEDHOLDER",\n "secret": "MY_SECRET_PLACEHOLDER",\n "redirectUri": "http://192.168.0.100:9078/lastfm/callback"\n // highlight-start\n },\n "options": {\n "playTransform": {\n "preCompare": {\n "type": "musicbrainz"\n }\n }\n }\n // highlight-end\n }\n]\n'})})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"setup-clients",children:"Setup Clients"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/configuration/clients",children:(0,i.jsx)(n.strong,{children:"Clients"})})," are services that store scrobbles. Multi-scrobbler will scrobble all listening activity from the ",(0,i.jsx)(n.strong,{children:"Sources"})," you configured to all ",(0,i.jsx)(n.strong,{children:"Clients"})," you configure here."]}),"\n",(0,i.jsxs)(o.A,{groupId:"qsClient",children:[(0,i.jsxs)(c.A,{value:"koito",label:"Koito",children:[(0,i.jsxs)(n.p,{children:["Setup a ",(0,i.jsx)(n.a,{href:"https://koito.io/guides/installation/",children:"Koito server"})," if you have not already done this."]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://koito.io/guides/scrobbler/",children:"Create (or get) an API Key"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["From your Koito server dashboard navigate to ",(0,i.jsx)(n.strong,{children:"Settings"})," (bottom-left icon) => ",(0,i.jsx)(n.strong,{children:"API Keys"})]}),"\n",(0,i.jsxs)(n.li,{children:["Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["EX ",(0,i.jsx)(n.code,{children:"pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Take note of your Koito username (used below as ",(0,i.jsx)(n.code,{children:"myUser"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:["Determine your Koito URL","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance."}),"\n",(0,i.jsxs)(n.li,{children:["EX dashboard at ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:4110"})," => replace ",(0,i.jsx)(n.code,{children:"myURL"})," below with ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:4110"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/configuration/clients/koito",children:"More info on the URL to use is the full docs"})}),"\n"]}),"\n"]}),"\n"]}),(0,i.jsxs)(n.p,{children:["Add/Substitute values above into these examples values and add them to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created for multi-scrobbler earlier."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- KOITO_TOKEN=myToken\n- KOITO_USER=myUser\n- KOITO_URL=myURL\n- KOITO_ID=myKoito\n"})}),(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["For Koito versions ",(0,i.jsx)(n.code,{children:"<=0.1.7"}),", you must have the environment variable ",(0,i.jsx)(n.code,{children:"KOITO_ALLOWED_HOSTS"})," set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. ",(0,i.jsx)(n.code,{children:"koito.mydomain.com"}),"."]})})]}),(0,i.jsxs)(c.A,{value:"lastfm",label:"Last.fm",children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://www.last.fm/api/account/create",children:"Register for an API account at Last.fm."})}),(0,i.jsxs)(n.p,{children:["Use the following for ",(0,i.jsx)(n.strong,{children:"Callback URL"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078/lastfm/callback\n"})}),(0,i.jsxs)(n.p,{children:["After account creation use the displayed information and add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created for multi-scrobbler earlier."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- LASTFM_API_KEY=myApiKey\n- LASTFM_SECRET=myApiSecret\n- LASTFM_ID=myLfmClient\n"})})]}),(0,i.jsxs)(c.A,{value:"maloja",label:"Maloja",children:[(0,i.jsxs)(n.p,{children:["Setup a ",(0,i.jsx)(n.a,{href:"https://github.com/krateng/maloja?tab=readme-ov-file#how-to-install",children:"Maloja server"})," if you have not already done this."]}),(0,i.jsxs)(s,{children:[(0,i.jsx)("summary",{children:"Maloja Setup Intructions"}),(0,i.jsxs)(n.p,{children:["Using Maloja's example ",(0,i.jsx)(n.code,{children:"docker-compose.yml"}),":"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'reference title="~/malojaData/docker-compose.yml"',children:"https://github.com/krateng/maloja/blob/master/example-compose.yml\n"})}),(0,i.jsxs)(n.p,{children:["Uncomment ",(0,i.jsx)(n.code,{children:"environment"})," and add ",(0,i.jsx)(n.code,{children:"MALOJA_FORCE_PASSWORD=CHANGE_ME"})," to set an admin password"]}),(0,i.jsx)(n.p,{children:"Start the container:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:'title="~/malojaData"',children:"docker compose up -d\n"})})]}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at ",(0,i.jsx)(n.a,{href:"http://192.168.0.100:42010/admin_apikeys",children:"http://192.168.0.100:42010/admin_apikeys"}),")","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Create a ",(0,i.jsx)(n.strong,{children:"New Key"})," and then copy the generated key value"]}),"\n"]}),"\n"]}),"\n"]}),(0,i.jsxs)(n.p,{children:["Finally, add these values to the ",(0,i.jsx)(n.code,{children:"environment"})," section in the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created for multi-scrobbler earlier."]})]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:"- MALOJA_URL=http://192.168.0.100:42010\n- MALOJA_API_KEY=myApiKey\n- MALOJA_ID=myMaloja\n"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"start-multi-scrobbler",children:"Start Multi-Scrobbler"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["If you are running your multi-scrobbler container on a Linux host see ",(0,i.jsx)(n.a,{href:"/installation?dockerSetting=linuxHost#recommended-settings",children:"these instructions for setting proper file permissions."})]})}),"\n",(0,i.jsxs)(n.p,{children:["From the same directory as the ",(0,i.jsxs)(n.a,{href:"#create-docker-compose-file",children:[(0,i.jsx)(n.code,{children:"docker-compose.yml"})," you created earlier"]})," start the container:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:'title="~/msData"',children:"docker compose up -d\n"})}),"\n",(0,i.jsx)(n.p,{children:"You're done! Multi-scrobbler is now running. It will monitor the sources you configured and scrobble to clients you set up."}),"\n",(0,i.jsxs)(n.p,{children:["Visit ",(0,i.jsx)(n.code,{children:"http://192.168.0.100:9078"})," to see the dashboard where"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["configured Sources/Clients","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"show current status and authentication options"}),"\n",(0,i.jsx)(n.li,{children:"display statistics about discovered/scrobbled tracks and Now Playing status"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"a real-time log shows multi-scrobbler's activity"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["See more advanced docker options as well as other install methods in the ",(0,i.jsx)(n.a,{href:"/installation#docker",children:(0,i.jsx)(n.strong,{children:"Installation"})})," docs","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Setup ",(0,i.jsx)(n.a,{href:"/configuration#secondary-caching",children:"secondary caching"})," with ",(0,i.jsx)(n.a,{href:"/installation?dockerSetting=caching#recommended-settings",children:"valkey"})," for increased performance and reduced memory usage"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Review the ",(0,i.jsx)(n.a,{href:"/configuration",children:(0,i.jsx)(n.strong,{children:"Configuration"})})," docs","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Learn about how to configure multi-scrobbler using files for more complicated Source/Client scenarios"}),"\n",(0,i.jsxs)(n.li,{children:["See all available ",(0,i.jsx)(n.a,{href:"/configuration/sources",children:(0,i.jsx)(n.strong,{children:"Sources"})})," and ",(0,i.jsx)(n.a,{href:"/configuration/clients",children:(0,i.jsx)(n.strong,{children:"Clients"})})," alongside configuration examples"]}),"\n",(0,i.jsxs)(n.li,{children:["Learn how to set up ",(0,i.jsx)(n.a,{href:"/configuration#webhook-configurations",children:"notification webhooks"})]}),"\n",(0,i.jsxs)(n.li,{children:["Check out the ",(0,i.jsx)(n.a,{href:"/configuration/kitchensink",children:"kitchensink example"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Setup ",(0,i.jsx)(n.a,{href:"/configuration/transforms",children:"Scrobble Enhancements"})," with ",(0,i.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," to automatically correct and fill in missing track information for your scrobbles"]}),"\n",(0,i.jsxs)(n.li,{children:["Consult the ",(0,i.jsx)(n.a,{href:"/FAQ",children:(0,i.jsx)(n.strong,{children:"FAQ"})})," for solutions to common problems"]}),"\n"]})]})}function m(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/778b0fa6.180c28af.js b/assets/js/778b0fa6.180c28af.js new file mode 100644 index 00000000..83fde609 --- /dev/null +++ b/assets/js/778b0fa6.180c28af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2613"],{1147(e,t,i){i.r(t),i.d(t,{metadata:()=>r,default:()=>f,frontMatter:()=>a,contentTitle:()=>d,toc:()=>u,assets:()=>p});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/spotify.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Spotify","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Sonos","permalink":"/multi-scrobbler/configuration/sources/sonos"},"next":{"title":"Subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic"}}'),n=i(4848),s=i(8453),o=i(8194),c=i(698);function l(e){let t={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Environmental Variable"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsxs)(t.td,{children:["A globally unique ID EX ",(0,n.jsx)(t.code,{children:"myComponentId"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_NAME"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsxs)(t.td,{children:["Value of ",(0,n.jsx)(t.code,{children:"SPOTIFY_ID"})]}),(0,n.jsxs)(t.td,{children:["A vanity name EX ",(0,n.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_ENABLE"})}),(0,n.jsx)(t.td,{children:"boolean"}),(0,n.jsx)(t.td,{children:"true"}),(0,n.jsx)(t.td,{children:"Should this component be used?"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_CLIENT_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"spotify client id"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_CLIENT_SECRET"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"spotify client secret"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"http://localhost:9078/callback",children:"http://localhost:9078/callback"})}),(0,n.jsx)(t.td,{children:"spotify redirect URI -- required only if not the default shown here."})]})]})]})}function h(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}i(2170),i(804);let a={title:"Spotify",toc_min_heading_level:2,toc_max_heading_level:5},d,p={},u=[{value:"Authenticate Spotify with Multi-Scrobbler",id:"authenticate-spotify-with-multi-scrobbler",level:4},{value:"Configuration",id:"configuration",level:2}];function x(e){let t={a:"a",code:"code",em:"em",h2:"h2",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config:r,Details:l,DetailsAdmo:a}=t;return r||j("Config",!0),l||j("Details",!0),a||j("DetailsAdmo",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a,{type:"note",summary:"Spotify and Automix",children:(0,n.jsxs)(t.p,{children:["If your Spotify player has ",(0,n.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,n.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,n.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,n.jsx)(t.h4,{id:"authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"}),"\n",(0,n.jsxs)(a,{type:"warning",summary:"Premium Account Required",children:[(0,n.jsxs)(t.p,{children:["Starting ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/blog/2026-02-06-update-on-developer-access-and-platform-security",children:"March 9th 2026"})," all applications on the Spotify Developer platform will only continue to work if they are ",(0,n.jsx)(t.strong,{children:"owned"})," by a ",(0,n.jsx)(t.strong,{children:"Spotify Premium"})," account."]}),(0,n.jsx)(t.p,{children:"If your App is not created by a Premium account you will likely recieve a 403 error when trying to use MS with Spotify."}),(0,n.jsxs)(t.p,{children:["If you do not have a Spotify Premium account ",(0,n.jsx)(t.em,{children:"you can still use Spotify with MS"})," but it will require you to coordinate with a (friend?) user who ",(0,n.jsx)(t.em,{children:"does"})," have Spotify Premium:"]}),(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Follow the steps below ",(0,n.jsx)(t.strong,{children:"logged in as the Spotify Premium account user"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["After completing App creation (step 4 or 5), navigate to the ",(0,n.jsx)(t.strong,{children:"User Management"})," page for the created App"]}),"\n",(0,n.jsxs)(t.li,{children:["Add ",(0,n.jsx)(t.strong,{children:"your"})," (non-premium) account here using your account email/name"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.li,{children:"Complete the rest of the authentication/configuration process normally"}),"\n"]}),(0,n.jsxs)(t.p,{children:["Assure your friend: ",(0,n.jsx)(t.strong,{children:"Creating a Spotify Developer app does not give anyone access to the owner's account."})," The authentication process within MS is where authorization is given: it requires clicking the link in MS's dashboard and following a separate auth flow. This auth flow only authorizes access to the specific account used in the flow, unrelated to the owner of the developer app."]})]}),"\n",(0,n.jsxs)(t.p,{children:["To access your Spotify history you must ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"create a Spotify App"})," to get a\nClient ID/Secret."]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsxs)(t.strong,{children:["Login to ",(0,n.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,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Navigate to your Spotify Developer ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"Dashboard"})," and start the ",(0,n.jsx)(t.strong,{children:"Create App"})," process"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Determine the correct ",(0,n.jsx)(t.strong,{children:"Redirect URI"})," to use and set it in your App settings"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(l,{children:[(0,n.jsx)("summary",{children:"Redirect URI Instructions"}),(0,n.jsxs)(t.p,{children:["A Redirect URI is the URL that Spotify will navigate your ",(0,n.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,n.jsxs)(t.p,{children:["Spotify ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/documentation/web-api/tutorials/migration-insecure-redirect-uri",children:(0,n.jsx)(t.strong,{children:"no longer allows insecure URIs"})})," (start with ",(0,n.jsx)(t.code,{children:"http://"}),") unless the address is ",(0,n.jsx)(t.code,{children:"127.0.0.1"})," -- so ",(0,n.jsx)(t.code,{children:"localhost"})," and internal IPs (",(0,n.jsx)(t.code,{children:"192.168.0.xxx"}),") no longer work."]}),(0,n.jsxs)(t.p,{children:["Use ",(0,n.jsx)(t.strong,{children:"one"})," of the following methods to specify a valid Redirect URI and complete Spotify authentication with multi-scrobbler:"]}),(0,n.jsxs)(o.A,{groupId:"spotifyRedirect",queryString:!0,children:[(0,n.jsxs)(c.A,{value:"https",label:"HTTPS",children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Use a domain you control, with SSL certificates/HTTPS enabled, to create a valid redirect URI."})}),(0,n.jsxs)(t.p,{children:["For example, if you are already running multi-scrobbler behind a reverse proxy (nginx/traefik/caddy) at ",(0,n.jsx)(t.code,{children:"https://scrobbler.mydomain.com"})," then set the Spotify Redirect URI for your Spotify App, and multi-scrobbler ",(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV, to ",(0,n.jsx)(t.code,{children:"https://scrobbler.mydomain.com/callback"})]}),(0,n.jsxs)(t.p,{children:["Alternatively, if multi-scrobbler is not accessible behind your domain, then use the ",(0,n.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,n.jsx)(t.strong,{children:"Echo"})})," method with your own domain instead of 127.0.0.1."]})]}),(0,n.jsxs)(c.A,{value:"local",label:"Run MS Locally",children:[(0,n.jsx)(t.p,{children:(0,n.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,n.jsxs)(t.p,{children:["In this scenario you can use ",(0,n.jsx)(t.code,{children:"http://127.0.0.1:9078/callback"})," as the Spotify Redirect URI and multi-scrobbler ",(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]}),(0,n.jsxs)(t.p,{children:["After completing authentication, copy the contents of local multi-scrobbler's ",(0,n.jsx)(t.a,{href:"/installation?dockerSetting=storage#recommended-settings",children:"configuration folder"})," to the final location of where multi-scrobbler will be run."]})]}),(0,n.jsxs)(c.A,{value:"echo",label:"Echo",children:[(0,n.jsx)(t.p,{children:(0,n.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,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Create a container on the same machine as your browser using the ",(0,n.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,n.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,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"docker run --rm -p 127.0.0.1:5079:8080 mendhak/http-https-echo:36\n"})}),(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Set the Spotify Redirect URI and multi-scrobbler ",(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV as ",(0,n.jsx)(t.code,{children:"http://127.0.0.1:5079/callback"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["In ",(0,n.jsx)(t.a,{href:"#authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"})," (outside these Redirect Instructions) go to ",(0,n.jsx)(t.strong,{children:"Step 4"})," and continue the instructions"]}),"\n"]}),"\n"]}),(0,n.jsxs)(t.p,{children:["Eventually, Spotify will redirect you to a web page with a URL like ",(0,n.jsx)(t.code,{children:"http://127.0.0.1:5079/callback?code=xxxxxx..."})]}),(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"echo",src:i(2456).A+"",width:"560",height:"521"})}),(0,n.jsxs)(t.ol,{start:"4",children:["\n",(0,n.jsxs)(t.li,{children:["In the URL, replace ",(0,n.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,n.jsx)(t.code,{children:"http://192.168.0.101:9078/callback?code=xxxxxx..."}),". Then navigate to this URL to complete authentication."]}),"\n"]})]}),(0,n.jsxs)(c.A,{value:"msEcho",label:"Echo from echo.multi-scrobbler.app",children:[(0,n.jsxs)(t.p,{children:["For your convenience, I run the ",(0,n.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,n.jsx)(t.code,{children:"mendhak/http-https-echo:36"})})," container from the ",(0,n.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,n.jsx)(t.strong,{children:"Echo"})})," approach on a domain I, the multi-scrobbler developer ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"}),", control and self-host. Please be aware:"]}),(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["I ",(0,n.jsx)(t.strong,{children:"do not collect personal data"})," or any querystrings/data sent in requests to this site"]}),"\n",(0,n.jsxs)(t.li,{children:["It's ",(0,n.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,n.jsxs)(t.li,{children:["However, there is ",(0,n.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,n.jsxs)(t.p,{children:["Use the ",(0,n.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,n.jsx)(t.strong,{children:"Echo"})})," approach, starting from ",(0,n.jsx)(t.strong,{children:"Step 2"}),", with ",(0,n.jsx)(t.strong,{children:(0,n.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,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]})]})]})]}),"\n",(0,n.jsxs)(t.ol,{start:"4",children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Save your new App, then copy the Client ID/Secret from the App's Basic Information page."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Add the Client ID, Secret, and Redirect URI to the respective field/ENV in the ",(0,n.jsx)(t.a,{href:"#configuration",children:"configuration section below"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Start multi-scrobbler, then visit the Web Dashboard and click ",(0,n.jsx)(t.strong,{children:"(Re)authenticate"})," on the Spotify card to start the auth process"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(r,{config:"SpotifySourceConfig",fileContent:'[\n {\n "id": "MySpotify",\n "name": "Foxx Spotify",\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',name:"spotify",children:(0,n.jsx)(h,{})})]})}function f(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(x,{...e})}):x(e)}function j(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},804(e,t,i){i.d(t,{A:()=>n}),i(6540);var r=i(4848);function n(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"})})}},2456(e,t,i){i.d(t,{A:()=>r});let r=i.p+"assets/images/echo-08989f35a8e831d1991e0aa90d40d07a.png"}}]); \ No newline at end of file diff --git a/assets/js/778b0fa6.f419d76e.js b/assets/js/778b0fa6.f419d76e.js deleted file mode 100644 index c653da6e..00000000 --- a/assets/js/778b0fa6.f419d76e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2613"],{1147(e,t,i){i.r(t),i.d(t,{metadata:()=>r,default:()=>f,frontMatter:()=>a,contentTitle:()=>d,toc:()=>u,assets:()=>p});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/spotify.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Spotify","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Sonos","permalink":"/multi-scrobbler/configuration/sources/sonos"},"next":{"title":"Subsonic","permalink":"/multi-scrobbler/configuration/sources/subsonic"}}'),n=i(4848),s=i(8453),o=i(8194),c=i(698);function l(e){let t={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Environmental Variable"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Default"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsxs)(t.td,{children:["A globally unique ID EX ",(0,n.jsx)(t.code,{children:"myComponentId"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_NAME"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsxs)(t.td,{children:["Value of ",(0,n.jsx)(t.code,{children:"SPOTIFY_ID"})]}),(0,n.jsxs)(t.td,{children:["A vanity name EX ",(0,n.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_ENABLE"})}),(0,n.jsx)(t.td,{children:"boolean"}),(0,n.jsx)(t.td,{children:"true"}),(0,n.jsx)(t.td,{children:"Should this component be used?"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_CLIENT_ID"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"spotify client id"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.em,{children:(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_CLIENT_SECRET"})})})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"spotify client secret"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})}),(0,n.jsx)(t.td,{children:"string"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"http://localhost:9078/callback",children:"http://localhost:9078/callback"})}),(0,n.jsx)(t.td,{children:"spotify redirect URI -- required only if not the default shown here."})]})]})]})}function h(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}i(2170),i(804);let a={title:"Spotify",toc_min_heading_level:2,toc_max_heading_level:5},d,p={},u=[{value:"Authenticate Spotify with Multi-Scrobbler",id:"authenticate-spotify-with-multi-scrobbler",level:4},{value:"Configuration",id:"configuration",level:2}];function x(e){let t={a:"a",code:"code",em:"em",h2:"h2",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config:r,Details:l,DetailsAdmo:a}=t;return r||j("Config",!0),l||j("Details",!0),a||j("DetailsAdmo",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a,{type:"note",summary:"Spotify and Automix",children:(0,n.jsxs)(t.p,{children:["If your Spotify player has ",(0,n.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,n.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,n.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,n.jsx)(t.h4,{id:"authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"}),"\n",(0,n.jsxs)(a,{type:"warning",summary:"Premium Account Required",children:[(0,n.jsxs)(t.p,{children:["Starting ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/blog/2026-02-06-update-on-developer-access-and-platform-security",children:"March 9th 2026"})," all applications on the Spotify Developer platform will only continue to work if they are ",(0,n.jsx)(t.strong,{children:"owned"})," by a ",(0,n.jsx)(t.strong,{children:"Spotify Premium"})," account."]}),(0,n.jsx)(t.p,{children:"If your App is not created by a Premium account you will likely recieve a 403 error when trying to use MS with Spotify."}),(0,n.jsxs)(t.p,{children:["If you do not have a Spotify Premium account ",(0,n.jsx)(t.em,{children:"you can still use Spotify with MS"})," but it will require you to coordinate with a (friend?) user who ",(0,n.jsx)(t.em,{children:"does"})," have Spotify Premium:"]}),(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Follow the steps below ",(0,n.jsx)(t.strong,{children:"logged in as the Spotify Premium account user"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["After completing App creation (step 4 or 5), navigate to the ",(0,n.jsx)(t.strong,{children:"User Management"})," page for the created App"]}),"\n",(0,n.jsxs)(t.li,{children:["Add ",(0,n.jsx)(t.strong,{children:"your"})," (non-premium) account here using your account email/name"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.li,{children:"Complete the rest of the authentication/configuration process normally"}),"\n"]}),(0,n.jsxs)(t.p,{children:["Assure your friend: ",(0,n.jsx)(t.strong,{children:"Creating a Spotify Developer app does not give anyone access to the owner's account."})," The authentication process within MS is where authorization is given: it requires clicking the link in MS's dashboard and following a separate auth flow. This auth flow only authorizes access to the specific account used in the flow, unrelated to the owner of the developer app."]})]}),"\n",(0,n.jsxs)(t.p,{children:["To access your Spotify history you must ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"create a Spotify App"})," to get a\nClient ID/Secret."]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsxs)(t.strong,{children:["Login to ",(0,n.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,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Navigate to your Spotify Developer ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/dashboard",children:"Dashboard"})," and start the ",(0,n.jsx)(t.strong,{children:"Create App"})," process"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Determine the correct ",(0,n.jsx)(t.strong,{children:"Redirect URI"})," to use and set it in your App settings"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(l,{children:[(0,n.jsx)("summary",{children:"Redirect URI Instructions"}),(0,n.jsxs)(t.p,{children:["A Redirect URI is the URL that Spotify will navigate your ",(0,n.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,n.jsxs)(t.p,{children:["Spotify ",(0,n.jsx)(t.a,{href:"https://developer.spotify.com/documentation/web-api/tutorials/migration-insecure-redirect-uri",children:(0,n.jsx)(t.strong,{children:"no longer allows insecure URIs"})})," (start with ",(0,n.jsx)(t.code,{children:"http://"}),") unless the address is ",(0,n.jsx)(t.code,{children:"127.0.0.1"})," -- so ",(0,n.jsx)(t.code,{children:"localhost"})," and internal IPs (",(0,n.jsx)(t.code,{children:"192.168.0.xxx"}),") no longer work."]}),(0,n.jsxs)(t.p,{children:["Use ",(0,n.jsx)(t.strong,{children:"one"})," of the following methods to specify a valid Redirect URI and complete Spotify authentication with multi-scrobbler:"]}),(0,n.jsxs)(o.A,{groupId:"spotifyRedirect",queryString:!0,children:[(0,n.jsxs)(c.A,{value:"https",label:"HTTPS",children:[(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Use a domain you control, with SSL certificates/HTTPS enabled, to create a valid redirect URI."})}),(0,n.jsxs)(t.p,{children:["For example, if you are already running multi-scrobbler behind a reverse proxy (nginx/traefik/caddy) at ",(0,n.jsx)(t.code,{children:"https://scrobbler.mydomain.com"})," then set the Spotify Redirect URI for your Spotify App, and multi-scrobbler ",(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV, to ",(0,n.jsx)(t.code,{children:"https://scrobbler.mydomain.com/callback"})]}),(0,n.jsxs)(t.p,{children:["Alternatively, if multi-scrobbler is not accessible behind your domain, then use the ",(0,n.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,n.jsx)(t.strong,{children:"Echo"})})," method with your own domain instead of 127.0.0.1."]})]}),(0,n.jsxs)(c.A,{value:"local",label:"Run MS Locally",children:[(0,n.jsx)(t.p,{children:(0,n.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,n.jsxs)(t.p,{children:["In this scenario you can use ",(0,n.jsx)(t.code,{children:"http://127.0.0.1:9078/callback"})," as the Spotify Redirect URI and multi-scrobbler ",(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]}),(0,n.jsxs)(t.p,{children:["After completing authentication, copy the contents of local multi-scrobbler's ",(0,n.jsx)(t.a,{href:"/installation?dockerSetting=storage#recommended-settings",children:"configuration folder"})," to the final location of where multi-scrobbler will be run."]})]}),(0,n.jsxs)(c.A,{value:"echo",label:"Echo",children:[(0,n.jsx)(t.p,{children:(0,n.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,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Create a container on the same machine as your browser using the ",(0,n.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,n.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,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"docker run --rm -p 127.0.0.1:5079:8080 mendhak/http-https-echo:36\n"})}),(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Set the Spotify Redirect URI and multi-scrobbler ",(0,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV as ",(0,n.jsx)(t.code,{children:"http://127.0.0.1:5079/callback"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["In ",(0,n.jsx)(t.a,{href:"#authenticate-spotify-with-multi-scrobbler",children:"Authenticate Spotify with Multi-Scrobbler"})," (outside these Redirect Instructions) go to ",(0,n.jsx)(t.strong,{children:"Step 4"})," and continue the instructions"]}),"\n"]}),"\n"]}),(0,n.jsxs)(t.p,{children:["Eventually, Spotify will redirect you to a web page with a URL like ",(0,n.jsx)(t.code,{children:"http://127.0.0.1:5079/callback?code=xxxxxx..."})]}),(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"echo",src:i(2456).A+"",width:"560",height:"521"})}),(0,n.jsxs)(t.ol,{start:"4",children:["\n",(0,n.jsxs)(t.li,{children:["In the URL, replace ",(0,n.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,n.jsx)(t.code,{children:"http://192.168.0.101:9078/callback?code=xxxxxx..."}),". Then navigate to this URL to complete authentication."]}),"\n"]})]}),(0,n.jsxs)(c.A,{value:"msEcho",label:"Echo from echo.multi-scrobbler.app",children:[(0,n.jsxs)(t.p,{children:["For your convenience, I run the ",(0,n.jsx)(t.a,{href:"https://github.com/mendhak/docker-http-https-echo",children:(0,n.jsx)(t.code,{children:"mendhak/http-https-echo:36"})})," container from the ",(0,n.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,n.jsx)(t.strong,{children:"Echo"})})," approach on a domain I, the multi-scrobbler developer ",(0,n.jsx)(t.a,{href:"https://github.com/FoxxMD",children:"FoxxMD"}),", control and self-host. Please be aware:"]}),(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["I ",(0,n.jsx)(t.strong,{children:"do not collect personal data"})," or any querystrings/data sent in requests to this site"]}),"\n",(0,n.jsxs)(t.li,{children:["It's ",(0,n.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,n.jsxs)(t.li,{children:["However, there is ",(0,n.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,n.jsxs)(t.p,{children:["Use the ",(0,n.jsx)(t.a,{href:"./?spotifyRedirect=echo",children:(0,n.jsx)(t.strong,{children:"Echo"})})," approach, starting from ",(0,n.jsx)(t.strong,{children:"Step 2"}),", with ",(0,n.jsx)(t.strong,{children:(0,n.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,n.jsx)(t.code,{children:"SPOTIFY_REDIRECT_URI"})," ENV."]})]})]})]}),"\n",(0,n.jsxs)(t.ol,{start:"4",children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Save your new App, then copy the Client ID/Secret from the App's Basic Information page."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Add the Client ID, Secret, and Redirect URI to the respective field/ENV in the ",(0,n.jsx)(t.a,{href:"#configuration",children:"configuration section below"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Start multi-scrobbler, then visit the Web Dashboard and click ",(0,n.jsx)(t.strong,{children:"(Re)authenticate"})," on the Spotify card to start the auth process"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(r,{config:"SpotifySourceConfig",fileContent:'[\n {\n "id": "MySpotify",\n "name": "Foxx Spotify",\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',name:"spotify",children:(0,n.jsx)(h,{})})]})}function f(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(x,{...e})}):x(e)}function j(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},804(e,t,i){i.d(t,{A:()=>n}),i(6540);var r=i(4848);function n(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"})})}},2456(e,t,i){i.d(t,{A:()=>r});let r=i.p+"assets/images/echo-08989f35a8e831d1991e0aa90d40d07a.png"}}]); \ No newline at end of file diff --git a/assets/js/7b4f75c2.3c5e2cf9.js b/assets/js/7b4f75c2.3c5e2cf9.js new file mode 100644 index 00000000..5627ce2f --- /dev/null +++ b/assets/js/7b4f75c2.3c5e2cf9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9494"],{8564(e,i,n){n.r(i),n.d(i,{metadata:()=>r,default:()=>b,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/librefm.mdx?plain=1","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"}}'),t=n(4848),c=n(8453);n(8194),n(698),n(2170);var l=n(4828);function s(e){let i={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.R)(),...e.components};return(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Environmental Variable"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Default"}),(0,t.jsx)(i.th,{children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.em,{children:(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.code,{children:"LIBREFM_ID"})})})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{children:["A globally unique ID EX ",(0,t.jsx)(i.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_NAME"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsxs)(i.td,{children:["Value of ",(0,t.jsx)(i.code,{children:"LIBREFM_ID"})]}),(0,t.jsxs)(i.td,{children:["A vanity name EX ",(0,t.jsx)(i.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_ENABLE"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{children:"true"}),(0,t.jsx)(i.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_API_KEY"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_SECRET"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_REDIRECT_URI"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.a,{href:"http://localhost:9078/librefm/callback",children:"http://localhost:9078/librefm/callback"})}),(0,t.jsx)(i.td,{children:"Optional URI to use for callback."})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_SESSION"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{children:"Optional session id returned from a completed auth flow"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_URLBASE"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.a,{href:"https://libre.fm/2.0/",children:"https://libre.fm/2.0/"})}),(0,t.jsx)(i.td,{children:"(Optional) The host and path prefix for your Libre.fm instance"})]})]})]})}function o(e={}){let{wrapper:i}={...(0,c.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(s,{...e})}):s(e)}let d={title:"Libre.fm",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{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 x(e){let i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,c.R)(),...e.components},{Config:n,Details:r}=i;return n||m("Config",!0),r||m("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.admonition,{title:"Other Users",type:"tip",children:(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["To monitor and re-scrobble activity from your Libre.fm account create a ",(0,t.jsx)(i.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm (Source)"})]}),"\n"]})}),"\n",(0,t.jsxs)(i.p,{children:["To use the official ",(0,t.jsx)(i.a,{href:"https://libre.fm/",children:"Libre.fm"})," website you will need an account. Or, you can run your own GNU FM instance ",(0,t.jsx)(i.a,{href:"https://github.com/foocorp/gnu-fm",children:"using the source code"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["No API account, ",(0,t.jsx)(i.a,{href:"https://github.com/libre-fm/developer/wiki/Libre.fm-fundamentals#api-keys",children:"API Key, or Secret"})," is currently needed to use the Libre.fm API. Instead, use ",(0,t.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,t.jsx)(i.h3,{id:"callbackredirect-url",children:"Callback/Redirect URL"}),"\n",(0,t.jsxs)(i.p,{children:["The Redirect (Callback) URL is used to redirect your ",(0,t.jsx)(i.strong,{children:"browser"})," to multi-scrobbler after authentication has completed."]}),"\n",(0,t.jsxs)(i.p,{children:["So, the ",(0,t.jsx)(i.em,{children:"base of the URL"})," you use should be the ",(0,t.jsx)(i.em,{children:"same"})," as the URL you would use to navigate to the multi-scrobbler dashboard."]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(i.p,{children:["If you can visit the multi-scrobbler dashboard by navigating to ",(0,t.jsx)(i.a,{href:"http://192.168.0.100:9078",children:"http://192.168.0.100:9078"})," in your web browser..."]}),(0,t.jsxs)(i.p,{children:["then the ENV ",(0,t.jsx)(i.code,{children:"LIBREFM_REDIRECT_URI"}),", or ",(0,t.jsx)(i.code,{children:"redirectUri"})," for libre.fm json config, should be"]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"http://192.168.0.100:9078/librefm/callback\n"})})]}),"\n",(0,t.jsxs)(i.p,{children:["The Redirect URL can be explicitly specified in the configuration below, or by using the global ",(0,t.jsx)(i.a,{href:"/configuration#base-url",children:"Base URL"})," setting."]}),"\n",(0,t.jsx)(i.h3,{id:"custom-librefm-instance",children:"Custom Libre.fm instance"}),"\n",(0,t.jsxs)(i.p,{children:["If you are ",(0,t.jsx)(i.strong,{children:"not"})," using the official Libre.fm instance then specify your custom instance using ENV ",(0,t.jsx)(i.code,{children:"LIBREFM_URLBASE"})," or ",(0,t.jsx)(i.code,{children:"urlBase"})," property in the ",(0,t.jsx)(i.code,{children:"data"})," section in File/AIO config."]}),"\n",(0,t.jsxs)(i.p,{children:["The value should be ",(0,t.jsx)(i.code,{children:"protocol://libre.tld/path/prefix"})," EX:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"https://my.cool.libre.com/2.0/\n"})}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n,{config:"LibrefmClientConfig",fileContent:l.A,client:!0,ambiguous:!0,name:"librefm",children:(0,t.jsx)(o,{})})]})}function b(e={}){let{wrapper:i}={...(0,c.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function m(e,i){throw Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4828(e,i,n){n.d(i,{A:()=>r});let r='[\n {\n "name": "Foxx Libre Client",\n "id": "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": "Foxx Libre Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/7b4f75c2.49dd4e62.js b/assets/js/7b4f75c2.49dd4e62.js deleted file mode 100644 index 654145c7..00000000 --- a/assets/js/7b4f75c2.49dd4e62.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9494"],{8564(e,i,n){n.r(i),n.d(i,{metadata:()=>r,default:()=>b,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/librefm.mdx?plain=1","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"}}'),t=n(4848),c=n(8453);n(8194),n(698),n(2170);var l=n(4828);function s(e){let i={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.R)(),...e.components};return(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Environmental Variable"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Default"}),(0,t.jsx)(i.th,{children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.em,{children:(0,t.jsx)(i.strong,{children:(0,t.jsx)(i.code,{children:"LIBREFM_ID"})})})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsxs)(i.td,{children:["A globally unique ID EX ",(0,t.jsx)(i.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_NAME"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsxs)(i.td,{children:["Value of ",(0,t.jsx)(i.code,{children:"LIBREFM_ID"})]}),(0,t.jsxs)(i.td,{children:["A vanity name EX ",(0,t.jsx)(i.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_ENABLE"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{children:"true"}),(0,t.jsx)(i.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_API_KEY"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_SECRET"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{children:"Optional Secret for Libre.fm account"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_REDIRECT_URI"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.a,{href:"http://localhost:9078/librefm/callback",children:"http://localhost:9078/librefm/callback"})}),(0,t.jsx)(i.td,{children:"Optional URI to use for callback."})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_SESSION"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{children:"Optional session id returned from a completed auth flow"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LIBREFM_URLBASE"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.a,{href:"https://libre.fm/2.0/",children:"https://libre.fm/2.0/"})}),(0,t.jsx)(i.td,{children:"(Optional) The host and path prefix for your Libre.fm instance"})]})]})]})}function o(e={}){let{wrapper:i}={...(0,c.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(s,{...e})}):s(e)}let d={title:"Libre.fm",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{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 x(e){let i={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,c.R)(),...e.components},{Config:n,Details:r}=i;return n||m("Config",!0),r||m("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.admonition,{title:"Other Users",type:"tip",children:(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["To monitor and re-scrobble activity from your Libre.fm account create a ",(0,t.jsx)(i.a,{href:"/configuration/sources/librefm-source",children:"Libre.fm (Source)"})]}),"\n"]})}),"\n",(0,t.jsxs)(i.p,{children:["To use the official ",(0,t.jsx)(i.a,{href:"https://libre.fm/",children:"Libre.fm"})," website you will need an account. Or, you can run your own GNU FM instance ",(0,t.jsx)(i.a,{href:"https://github.com/foocorp/gnu-fm",children:"using the source code"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["No API account, ",(0,t.jsx)(i.a,{href:"https://github.com/libre-fm/developer/wiki/Libre.fm-fundamentals#api-keys",children:"API Key, or Secret"})," is currently needed to use the Libre.fm API. Instead, use ",(0,t.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,t.jsx)(i.h3,{id:"callbackredirect-url",children:"Callback/Redirect URL"}),"\n",(0,t.jsxs)(i.p,{children:["The Redirect (Callback) URL is used to redirect your ",(0,t.jsx)(i.strong,{children:"browser"})," to multi-scrobbler after authentication has completed."]}),"\n",(0,t.jsxs)(i.p,{children:["So, the ",(0,t.jsx)(i.em,{children:"base of the URL"})," you use should be the ",(0,t.jsx)(i.em,{children:"same"})," as the URL you would use to navigate to the multi-scrobbler dashboard."]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(i.p,{children:["If you can visit the multi-scrobbler dashboard by navigating to ",(0,t.jsx)(i.a,{href:"http://192.168.0.100:9078",children:"http://192.168.0.100:9078"})," in your web browser..."]}),(0,t.jsxs)(i.p,{children:["then the ENV ",(0,t.jsx)(i.code,{children:"LIBREFM_REDIRECT_URI"}),", or ",(0,t.jsx)(i.code,{children:"redirectUri"})," for libre.fm json config, should be"]}),(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"http://192.168.0.100:9078/librefm/callback\n"})})]}),"\n",(0,t.jsxs)(i.p,{children:["The Redirect URL can be explicitly specified in the configuration below, or by using the global ",(0,t.jsx)(i.a,{href:"/configuration#base-url",children:"Base URL"})," setting."]}),"\n",(0,t.jsx)(i.h3,{id:"custom-librefm-instance",children:"Custom Libre.fm instance"}),"\n",(0,t.jsxs)(i.p,{children:["If you are ",(0,t.jsx)(i.strong,{children:"not"})," using the official Libre.fm instance then specify your custom instance using ENV ",(0,t.jsx)(i.code,{children:"LIBREFM_URLBASE"})," or ",(0,t.jsx)(i.code,{children:"urlBase"})," property in the ",(0,t.jsx)(i.code,{children:"data"})," section in File/AIO config."]}),"\n",(0,t.jsxs)(i.p,{children:["The value should be ",(0,t.jsx)(i.code,{children:"protocol://libre.tld/path/prefix"})," EX:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"https://my.cool.libre.com/2.0/\n"})}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n,{config:"LibrefmClientConfig",fileContent:l.A,client:!0,ambiguous:!0,name:"librefm",children:(0,t.jsx)(o,{})})]})}function b(e={}){let{wrapper:i}={...(0,c.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function m(e,i){throw Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4828(e,i,n){n.d(i,{A:()=>r});let r='[\n {\n "name": "Foxx Libre Client",\n "id": "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": "Foxx Libre Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/7ebd3339.c3c05102.js b/assets/js/7ebd3339.c3c05102.js deleted file mode 100644 index 7b944010..00000000 --- a/assets/js/7ebd3339.c3c05102.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9536"],{2227(e,o,n){n.r(o),n.d(o,{metadata:()=>s,default:()=>j,frontMatter:()=>a,contentTitle:()=>h,toc:()=>x,assets:()=>u});var s=JSON.parse('{"id":"configuration/sources/sonos","title":"Sonos","description":"Multi-scrobbler can use the Sonos local API to monitor what your Sonos system is playing.","source":"@site/docs/configuration/sources/sonos.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/sonos","permalink":"/multi-scrobbler/configuration/sources/sonos","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/sonos.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Sonos","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/sources/rocksky-source"},"next":{"title":"Spotify","permalink":"/multi-scrobbler/configuration/sources/spotify"}}'),r=n(4848),i=n(8453),t=n(8194),l=n(698);function c(e){let o={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(o.table,{children:[(0,r.jsx)(o.thead,{children:(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.th,{children:"Environmental Variable"}),(0,r.jsx)(o.th,{children:"Type"}),(0,r.jsx)(o.th,{children:"Default"}),(0,r.jsx)(o.th,{children:"Description"})]})}),(0,r.jsxs)(o.tbody,{children:[(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.em,{children:(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"SONOS_ID"})})})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsxs)(o.td,{children:["A globally unique ID EX ",(0,r.jsx)(o.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_NAME"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsxs)(o.td,{children:["Value of ",(0,r.jsx)(o.code,{children:"SONOS_ID"})]}),(0,r.jsxs)(o.td,{children:["A vanity name EX ",(0,r.jsx)(o.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_ENABLE"})}),(0,r.jsx)(o.td,{children:"boolean"}),(0,r.jsx)(o.td,{children:"true"}),(0,r.jsx)(o.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.em,{children:(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"SONOS_HOST"})})})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"IP address of any connected Sonos speaker or device"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_DEVICES_ALLOW"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Only scrobble if device name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_DEVICES_BLOCK"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Do not scrobble if device name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_GROUPS_ALLOW"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Only scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_GROUPS_BLOCK"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Do not scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list"})]})]})]})}function d(e={}){let{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}n(2170);let a={title:"Sonos",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},x=[{value:"Filtering Activity",id:"filtering-activity",level:3},{value:"Configuration",id:"configuration",level:2}];function g(e){let o={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:n,Details:s,DetailsAdmo:c}=o;return n||m("Config",!0),s||m("Details",!0),c||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(o.p,{children:["Multi-scrobbler can use the ",(0,r.jsx)(o.a,{href:"https://www.sonos.com",children:"Sonos"})," ",(0,r.jsx)(o.a,{href:"https://docs.sonos.com/docs/control",children:"local API"})," to monitor what your Sonos system is playing."]}),"\n",(0,r.jsx)(o.p,{children:"MS supports scrobbling simultaneous, different Plays based on what each Group/Zone is playing."}),"\n",(0,r.jsx)(c,{type:"tip",summary:"Use Musicbrainz for better scrobbling",children:(0,r.jsxs)(o.p,{children:["For some services, including Spotify, Sonos only reports the ",(0,r.jsx)(o.strong,{children:"first"})," artist for a Track. You will most likely want to enable ",(0,r.jsx)(o.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz scrobble enhancements"})," so that your plays have correct information, including all artists, when scrobbled."]})}),"\n",(0,r.jsxs)(c,{type:"note",summary:"Avoid Sonos activity through other Sources",children:[(0,r.jsxs)(o.p,{children:["Activity reporting for ",(0,r.jsxs)(o.strong,{children:["other ",(0,r.jsx)(o.a,{href:"/configuration/sources",children:"Sources"})]})," does not work well ",(0,r.jsx)(o.strong,{children:"when played through Sonos."})]}),(0,r.jsxs)(o.p,{children:["If you have other Sources configured for Multi-Scrobbler that you may play ",(0,r.jsx)(o.em,{children:"through Sonos"}),' you should try to add Sonos to the "deny" list for that Source so that it does not try to monitor Sonos activity. Check the documentation for each individual Source to see how to configure this exclusion.']}),(0,r.jsxs)(o.p,{children:["For example, to prevent the ",(0,r.jsx)(o.a,{href:"/configuration/sources/plex",children:"Plex"}),' Source from monitoring audio played through Sonos, add Sonos to the "block" list ENV EX: ',(0,r.jsx)(o.code,{children:"PLEX_DEVICES_BLOCK=sonos"})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"How to report issues"}),(0,r.jsxs)(o.p,{children:["If your Sonos Source is logging errors or the scrobble data is not as expected please ",(0,r.jsx)(o.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=01-bug-report.yml",children:"create a bug report"})," ",(0,r.jsx)(o.strong,{children:"after"})," enabling the following debug logging options based on the config type you have:"]}),(0,r.jsxs)(t.A,{groupdId:"sonosBugConfig",children:[(0,r.jsx)(l.A,{value:"env",label:"ENV",children:(0,r.jsxs)(o.p,{children:["Enable ",(0,r.jsx)(o.a,{href:"/configuration#debug-mode",children:"Debug Mode"})," using ",(0,r.jsx)(o.code,{children:"DEBUG_MODE=true"})]})}),(0,r.jsxs)(l.A,{value:"file",label:"File",children:[(0,r.jsxs)(o.p,{children:["Enable ",(0,r.jsx)(o.code,{children:"logPayload"})," and ",(0,r.jsx)(o.code,{children:"logFitlerFailure"})," in your ",(0,r.jsx)(o.code,{children:"sonos.json"}),", or AIO file, config:"]}),(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{className:"language-json",children:'[\n {\n "enable": true,\n "name": "MySonos",\n "data": {\n "host": "192.168.0.150"\n },\n "options": {\n "logFilterFailure": "warn",\n "logPayload": true\n }\n }\n]\n'})})]})]}),(0,r.jsx)(o.p,{children:"Additional logging for the Sonos library may be enabled by including this environmental variable (regardless of config type):"}),(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"DEBUG=sonos:*\n"})}),(0,r.jsx)(o.p,{children:"The above changes:"}),(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"Triggers multi-scrobbler to log the raw data recieved from Sonos when a new track/device/service is seen for the first time"}),"\n",(0,r.jsx)(o.li,{children:"Trigger multi-scrobbler to log the reason it considers a play from Sonos as invalid (and will not monitor it)"}),"\n",(0,r.jsx)(o.li,{children:"Logs low-level activity from the Sonos library"}),"\n"]}),(0,r.jsx)(o.p,{children:"Please include these additional logs when creating a bug report. They are essential to troubleshooting your issue."})]}),"\n",(0,r.jsx)(o.h3,{id:"filtering-activity",children:"Filtering Activity"}),"\n",(0,r.jsxs)(o.p,{children:["The ",(0,r.jsx)(o.strong,{children:"optional"})," ",(0,r.jsx)(o.code,{children:"devices"})," and ",(0,r.jsx)(o.code,{children:"groups"})," related properties found in the config below can be used to include or exclude Sonos devices/groups by name, case-insensitive."]}),"\n",(0,r.jsx)(o.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(o.p,{children:["You ",(0,r.jsx)(o.strong,{children:"must"})," define the IP address of at least one Sonos/accessory in order for Multi-scrobbler to connect to your Sonos system."]}),"\n",(0,r.jsx)(n,{config:"SonosSourceConfig",fileContent:'[\n {\n "enable": true,\n "id": "MySonos",\n "name": "Boom 2",\n "data": {\n "host": "192.168.0.150",\n "devicesAllow": ["move","beam"],\n "devicesBlock": ["roam"],\n "groupsAllow": ["family"],\n "groupsBlock": ["bedroom"]\n }\n }\n]\n',name:"sonos",children:(0,r.jsx)(d,{})})]})}function j(e={}){let{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(g,{...e})}):g(e)}function m(e,o){throw Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/7ebd3339.d6aa4b2e.js b/assets/js/7ebd3339.d6aa4b2e.js new file mode 100644 index 00000000..2e9c0795 --- /dev/null +++ b/assets/js/7ebd3339.d6aa4b2e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9536"],{2227(e,o,n){n.r(o),n.d(o,{metadata:()=>s,default:()=>j,frontMatter:()=>a,contentTitle:()=>h,toc:()=>x,assets:()=>u});var s=JSON.parse('{"id":"configuration/sources/sonos","title":"Sonos","description":"Multi-scrobbler can use the Sonos local API to monitor what your Sonos system is playing.","source":"@site/docs/configuration/sources/sonos.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/sonos","permalink":"/multi-scrobbler/configuration/sources/sonos","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/sonos.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Sonos","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/sources/rocksky-source"},"next":{"title":"Spotify","permalink":"/multi-scrobbler/configuration/sources/spotify"}}'),r=n(4848),i=n(8453),t=n(8194),l=n(698);function c(e){let o={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(o.table,{children:[(0,r.jsx)(o.thead,{children:(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.th,{children:"Environmental Variable"}),(0,r.jsx)(o.th,{children:"Type"}),(0,r.jsx)(o.th,{children:"Default"}),(0,r.jsx)(o.th,{children:"Description"})]})}),(0,r.jsxs)(o.tbody,{children:[(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.em,{children:(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"SONOS_ID"})})})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsxs)(o.td,{children:["A globally unique ID EX ",(0,r.jsx)(o.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_NAME"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsxs)(o.td,{children:["Value of ",(0,r.jsx)(o.code,{children:"SONOS_ID"})]}),(0,r.jsxs)(o.td,{children:["A vanity name EX ",(0,r.jsx)(o.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_ENABLE"})}),(0,r.jsx)(o.td,{children:"boolean"}),(0,r.jsx)(o.td,{children:"true"}),(0,r.jsx)(o.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.em,{children:(0,r.jsx)(o.strong,{children:(0,r.jsx)(o.code,{children:"SONOS_HOST"})})})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"IP address of any connected Sonos speaker or device"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_DEVICES_ALLOW"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Only scrobble if device name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_DEVICES_BLOCK"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Do not scrobble if device name contains strings from this comma-delimited list"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_GROUPS_ALLOW"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Only scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list"})]}),(0,r.jsxs)(o.tr,{children:[(0,r.jsx)(o.td,{children:(0,r.jsx)(o.code,{children:"SONOS_GROUPS_BLOCK"})}),(0,r.jsx)(o.td,{children:"string"}),(0,r.jsx)(o.td,{}),(0,r.jsx)(o.td,{children:"Do not scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list"})]})]})]})}function d(e={}){let{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}n(2170);let a={title:"Sonos",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},x=[{value:"Filtering Activity",id:"filtering-activity",level:3},{value:"Configuration",id:"configuration",level:2}];function g(e){let o={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:n,Details:s,DetailsAdmo:c}=o;return n||m("Config",!0),s||m("Details",!0),c||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(o.p,{children:["Multi-scrobbler can use the ",(0,r.jsx)(o.a,{href:"https://www.sonos.com",children:"Sonos"})," ",(0,r.jsx)(o.a,{href:"https://docs.sonos.com/docs/control",children:"local API"})," to monitor what your Sonos system is playing."]}),"\n",(0,r.jsx)(o.p,{children:"MS supports scrobbling simultaneous, different Plays based on what each Group/Zone is playing."}),"\n",(0,r.jsx)(c,{type:"tip",summary:"Use Musicbrainz for better scrobbling",children:(0,r.jsxs)(o.p,{children:["For some services, including Spotify, Sonos only reports the ",(0,r.jsx)(o.strong,{children:"first"})," artist for a Track. You will most likely want to enable ",(0,r.jsx)(o.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz scrobble enhancements"})," so that your plays have correct information, including all artists, when scrobbled."]})}),"\n",(0,r.jsxs)(c,{type:"note",summary:"Avoid Sonos activity through other Sources",children:[(0,r.jsxs)(o.p,{children:["Activity reporting for ",(0,r.jsxs)(o.strong,{children:["other ",(0,r.jsx)(o.a,{href:"/configuration/sources",children:"Sources"})]})," does not work well ",(0,r.jsx)(o.strong,{children:"when played through Sonos."})]}),(0,r.jsxs)(o.p,{children:["If you have other Sources configured for Multi-Scrobbler that you may play ",(0,r.jsx)(o.em,{children:"through Sonos"}),' you should try to add Sonos to the "deny" list for that Source so that it does not try to monitor Sonos activity. Check the documentation for each individual Source to see how to configure this exclusion.']}),(0,r.jsxs)(o.p,{children:["For example, to prevent the ",(0,r.jsx)(o.a,{href:"/configuration/sources/plex",children:"Plex"}),' Source from monitoring audio played through Sonos, add Sonos to the "block" list ENV EX: ',(0,r.jsx)(o.code,{children:"PLEX_DEVICES_BLOCK=sonos"})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"How to report issues"}),(0,r.jsxs)(o.p,{children:["If your Sonos Source is logging errors or the scrobble data is not as expected please ",(0,r.jsx)(o.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?template=01-bug-report.yml",children:"create a bug report"})," ",(0,r.jsx)(o.strong,{children:"after"})," enabling the following debug logging options based on the config type you have:"]}),(0,r.jsxs)(t.A,{groupdId:"sonosBugConfig",children:[(0,r.jsx)(l.A,{value:"env",label:"ENV",children:(0,r.jsxs)(o.p,{children:["Enable ",(0,r.jsx)(o.a,{href:"/configuration#debug-mode",children:"Debug Mode"})," using ",(0,r.jsx)(o.code,{children:"DEBUG_MODE=true"})]})}),(0,r.jsxs)(l.A,{value:"file",label:"File",children:[(0,r.jsxs)(o.p,{children:["Enable ",(0,r.jsx)(o.code,{children:"logPayload"})," and ",(0,r.jsx)(o.code,{children:"logFitlerFailure"})," in your ",(0,r.jsx)(o.code,{children:"sonos.json"}),", or AIO file, config:"]}),(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{className:"language-json",children:'[\n {\n "enable": true,\n "name": "MySonos",\n "data": {\n "host": "192.168.0.150"\n },\n "options": {\n "logFilterFailure": "warn",\n "logPayload": true\n }\n }\n]\n'})})]})]}),(0,r.jsx)(o.p,{children:"Additional logging for the Sonos library may be enabled by including this environmental variable (regardless of config type):"}),(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"DEBUG=sonos:*\n"})}),(0,r.jsx)(o.p,{children:"The above changes:"}),(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"Triggers multi-scrobbler to log the raw data recieved from Sonos when a new track/device/service is seen for the first time"}),"\n",(0,r.jsx)(o.li,{children:"Trigger multi-scrobbler to log the reason it considers a play from Sonos as invalid (and will not monitor it)"}),"\n",(0,r.jsx)(o.li,{children:"Logs low-level activity from the Sonos library"}),"\n"]}),(0,r.jsx)(o.p,{children:"Please include these additional logs when creating a bug report. They are essential to troubleshooting your issue."})]}),"\n",(0,r.jsx)(o.h3,{id:"filtering-activity",children:"Filtering Activity"}),"\n",(0,r.jsxs)(o.p,{children:["The ",(0,r.jsx)(o.strong,{children:"optional"})," ",(0,r.jsx)(o.code,{children:"devices"})," and ",(0,r.jsx)(o.code,{children:"groups"})," related properties found in the config below can be used to include or exclude Sonos devices/groups by name, case-insensitive."]}),"\n",(0,r.jsx)(o.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(o.p,{children:["You ",(0,r.jsx)(o.strong,{children:"must"})," define the IP address of at least one Sonos/accessory in order for Multi-scrobbler to connect to your Sonos system."]}),"\n",(0,r.jsx)(n,{config:"SonosSourceConfig",fileContent:'[\n {\n "enable": true,\n "id": "MySonos",\n "name": "Boom 2",\n "data": {\n "host": "192.168.0.150",\n "devicesAllow": ["move","beam"],\n "devicesBlock": ["roam"],\n "groupsAllow": ["family"],\n "groupsBlock": ["bedroom"]\n }\n }\n]\n',name:"sonos",children:(0,r.jsx)(d,{})})]})}function j(e={}){let{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(g,{...e})}):g(e)}function m(e,o){throw Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/812e048c.397090c1.js b/assets/js/812e048c.397090c1.js new file mode 100644 index 00000000..9bcaf9e0 --- /dev/null +++ b/assets/js/812e048c.397090c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9991"],{3954(e,n,t){t.d(n,{Ay:()=>a,RM:()=>o});var s=t(4848),r=t(8453),i=t(3230);let o=[];function l(e){let n={a:"a",em:"em",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Your ",(0,s.jsx)(n.a,{href:"https://atmosphereaccount.com",children:(0,s.jsx)(n.strong,{children:"Atmosphere Account"})})," consists of social data (it's just JSON) stored in a personal ",(0,s.jsx)(n.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," on a ",(0,s.jsx)(n.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", all of which is standardized under the ",(0,s.jsx)(n.a,{href:"https://atproto.com",children:(0,s.jsx)(n.strong,{children:"AT Protocol"})}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by ",(0,s.jsx)(n.em,{children:"indpendent"})," entities so your data and experience not locked behind a walled garden."]}),"\n",(0,s.jsxs)(n.p,{children:["Although each layer can be implemented separately (you can self-host everything!), it is normally a ",(0,s.jsx)(n.em,{children:"simple"})," process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a ",(0,s.jsx)(n.a,{href:"https://bsky.social/about",children:"Bluesky"}),", but there are other ",(0,s.jsx)(n.a,{href:"https://atmosphereaccount.com/explore",children:"public account providers"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"When Multi-Scrobbler uses the AT Protocol..."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['multi-scrobbler "scrobbles" (writes) 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.A,{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 their app"]}),"\n"]})]})}function a(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},4751(e,n,t){t.r(n),t.d(n,{metadata:()=>s,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>p,assets:()=>u});var s=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/tealfm.mdx?plain=1","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/"}}'),r=t(4848),i=t(8453);t(8194),t(698),t(2170);var o=t(3242),l=t(3954);function a(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"TEALFM_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEALFM_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"TEALFM_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEALFM_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"TEALFM_IDENTIFIER"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Identify the account to login as"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"TEALFM_APP_PW"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The ",(0,r.jsx)(n.a,{href:"https://atproto.com/specs/xrpc#app-passwords",children:"App Password"})," you created for your account"]})]})]})]})}function c(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}let d={title:"Teal.fm",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},p=[...l.RM,{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 x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:t,Details:s,DetailsAdmo:a}=n;return t||m("Config",!0),s||m("Details",!0),a||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,r.jsxs)(n.p,{children:["To monitor and re-scrobble activity from a ATProto Profile create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm (Source)"})]})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://teal.fm/",children:(0,r.jsx)(n.strong,{children:"teal.fm"})})," is a social discovery and browsing app for scrobbles stored in your ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"How does that work?"}),(0,r.jsx)(l.Ay,{name:"teal.fm",lexicon:"fm.teal"})]}),"\n",(0,r.jsx)(a,{type:"warning",summary:"Your Data Is Public",children:(0,r.jsxs)(n.p,{children:["The default Bluesky PDS is ",(0,r.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,r.jsxs)(a,{type:"note",summary:"teal.fm Is Still In Development",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://notes.teal.fm/3lzlwe6puis2l",children:"teal.fm is still in developement"})," and does not have a true production website, yet."]}),(0,r.jsx)(n.p,{children:"To view your teal.fm scrobble data you can:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["use ",(0,r.jsx)(n.a,{href:"https://teal-relay-production.up.railway.app",children:"teal-relay-production.up.railway.app"})," or ",(0,r.jsx)(n.a,{href:"https://tealfm-slice.wisp.place/",children:"teal-slice.wisp.place"})," for a preview of teal.fm"]}),"\n",(0,r.jsxs)(n.li,{children:["use ",(0,r.jsx)(n.a,{href:"https://yearinmusic.teal.fm",children:"yearinmusic.teal.fm"})," or ",(0,r.jsx)(n.a,{href:"https://wrapped.baileytownsend.dev/",children:"wrapped.baileytownsend.dev"})," for wrapped-style stats of your teal.fm scrobbles"]}),"\n",(0,r.jsxs)(n.li,{children:["use ",(0,r.jsx)(n.a,{href:"https://atproto.at",children:"atproto.at"})," to view the raw data (convenience URLs are generated in multi-scrobbler, per scrobble, for you to do this)"]}),"\n"]})]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Multi-scrobbler will work with ",(0,r.jsx)(n.em,{children:"any"})," Atmosphere Account, not just Bluesky. See ",(0,r.jsx)(n.a,{href:"#configuration",children:"Configuration"})," below for provider-agnostic config."]})}),"\n",(0,r.jsx)(n.h4,{id:"bluesky",children:"Bluesky"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a ",(0,r.jsx)(n.a,{href:"https://bsky.app",children:"Bluesky"})," account, if you don't already have one"]}),"\n",(0,r.jsxs)(n.li,{children:["Navigate to ",(0,r.jsx)(n.a,{href:"https://bsky.app/settings/app-passwords",children:"https://bsky.app/settings/app-passwords"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Settings -> Privacy and Security -> App passwords"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Create a new ",(0,r.jsx)(n.strong,{children:"App Password"})," and save it somewhere, it will not be shown again"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n.h3,{id:"identifier",children:"Identifier"}),"\n",(0,r.jsx)(n.p,{children:"The ATProto identifier used with multi-scrobbler should be either:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A valid ",(0,r.jsx)(n.a,{href:"https://atproto.com/specs/did#at-protocol-did-identifier-syntax",children:"DID"}),", starting with ",(0,r.jsx)(n.code,{children:"did:plc:..."})," or ",(0,r.jsx)(n.code,{children:"did:web:..."})]}),"\n",(0,r.jsxs)(n.li,{children:["Your ",(0,r.jsx)(n.strong,{children:"full"})," ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:"Atmosphere Account"})," ATProto handle, including TLD"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If using a handle:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For regular Bluesky account this will be like: ",(0,r.jsx)(n.code,{children:"alice.bsky.social"})]}),"\n",(0,r.jsxs)(n.li,{children:["For Bluesky accounts that ",(0,r.jsx)(n.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,r.jsx)(n.code,{children:"mydomain.com"})]}),"\n",(0,r.jsx)(n.li,{children:"For non-Bluesky-PDS users, you probably already know your handle"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["If your identifier does not look like a DID and does not include a TLD then multi-scrobbler will automatically append ",(0,r.jsx)(n.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,r.jsx)(t,{config:"TealClientConfig",fileContent:o.A,client:!0,ambiguous:!0,name:"tealfm",children:(0,r.jsx)(c,{})})]})}function j(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},3230(e,n,t){t.d(n,{A:()=>r}),t(6540);var s=t(4848);function r(e){return(0,s.jsx)("code",{...e})}},3242(e,n,t){t.d(n,{A:()=>s});let s='[\n {\n "id": "myTealClient",\n "name": "Foxx Teal Client",\n "configureAs": "client",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3"\n }\n },\n {\n "id": "myTealSource",\n "name": "Foxx Teal Source",\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]'}}]); \ No newline at end of file diff --git a/assets/js/812e048c.cc12e48d.js b/assets/js/812e048c.cc12e48d.js deleted file mode 100644 index 979af0b2..00000000 --- a/assets/js/812e048c.cc12e48d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9991"],{3954(e,n,t){t.d(n,{Ay:()=>a,RM:()=>o});var s=t(4848),r=t(8453),i=t(3230);let o=[];function l(e){let n={a:"a",em:"em",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Your ",(0,s.jsx)(n.a,{href:"https://atmosphereaccount.com",children:(0,s.jsx)(n.strong,{children:"Atmosphere Account"})})," consists of social data (it's just JSON) stored in a personal ",(0,s.jsx)(n.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," on a ",(0,s.jsx)(n.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", all of which is standardized under the ",(0,s.jsx)(n.a,{href:"https://atproto.com",children:(0,s.jsx)(n.strong,{children:"AT Protocol"})}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by ",(0,s.jsx)(n.em,{children:"indpendent"})," entities so your data and experience not locked behind a walled garden."]}),"\n",(0,s.jsxs)(n.p,{children:["Although each layer can be implemented separately (you can self-host everything!), it is normally a ",(0,s.jsx)(n.em,{children:"simple"})," process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a ",(0,s.jsx)(n.a,{href:"https://bsky.social/about",children:"Bluesky"}),", but there are other ",(0,s.jsx)(n.a,{href:"https://atmosphereaccount.com/explore",children:"public account providers"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"When Multi-Scrobbler uses the AT Protocol..."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['multi-scrobbler "scrobbles" (writes) 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.A,{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 their app"]}),"\n"]})]})}function a(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},4751(e,n,t){t.r(n),t.d(n,{metadata:()=>s,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>p,assets:()=>u});var s=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/tealfm.mdx?plain=1","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/"}}'),r=t(4848),i=t(8453);t(8194),t(698),t(2170);var o=t(3242),l=t(3954);function a(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"TEALFM_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEALFM_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"TEALFM_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEALFM_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"TEALFM_IDENTIFIER"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Identify the account to login as"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"TEALFM_APP_PW"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The ",(0,r.jsx)(n.a,{href:"https://atproto.com/specs/xrpc#app-passwords",children:"App Password"})," you created for your account"]})]})]})]})}function c(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}let d={title:"Teal.fm",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},p=[...l.RM,{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 x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:t,Details:s,DetailsAdmo:a}=n;return t||m("Config",!0),s||m("Details",!0),a||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,r.jsxs)(n.p,{children:["To monitor and re-scrobble activity from a ATProto Profile create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/tealfm-source",children:"teal.fm (Source)"})]})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://teal.fm/",children:(0,r.jsx)(n.strong,{children:"teal.fm"})})," is a social discovery and browsing app for scrobbles stored in your ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"How does that work?"}),(0,r.jsx)(l.Ay,{name:"teal.fm",lexicon:"fm.teal"})]}),"\n",(0,r.jsx)(a,{type:"warning",summary:"Your Data Is Public",children:(0,r.jsxs)(n.p,{children:["The default Bluesky PDS is ",(0,r.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,r.jsxs)(a,{type:"note",summary:"teal.fm Is Still In Development",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://notes.teal.fm/3lzlwe6puis2l",children:"teal.fm is still in developement"})," and does not have a true production website, yet."]}),(0,r.jsx)(n.p,{children:"To view your teal.fm scrobble data you can:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["use ",(0,r.jsx)(n.a,{href:"https://teal-relay-production.up.railway.app",children:"teal-relay-production.up.railway.app"})," or ",(0,r.jsx)(n.a,{href:"https://tealfm-slice.wisp.place/",children:"teal-slice.wisp.place"})," for a preview of teal.fm"]}),"\n",(0,r.jsxs)(n.li,{children:["use ",(0,r.jsx)(n.a,{href:"https://yearinmusic.teal.fm",children:"yearinmusic.teal.fm"})," or ",(0,r.jsx)(n.a,{href:"https://wrapped.baileytownsend.dev/",children:"wrapped.baileytownsend.dev"})," for wrapped-style stats of your teal.fm scrobbles"]}),"\n",(0,r.jsxs)(n.li,{children:["use ",(0,r.jsx)(n.a,{href:"https://atproto.at",children:"atproto.at"})," to view the raw data (convenience URLs are generated in multi-scrobbler, per scrobble, for you to do this)"]}),"\n"]})]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Multi-scrobbler will work with ",(0,r.jsx)(n.em,{children:"any"})," Atmosphere Account, not just Bluesky. See ",(0,r.jsx)(n.a,{href:"#configuration",children:"Configuration"})," below for provider-agnostic config."]})}),"\n",(0,r.jsx)(n.h4,{id:"bluesky",children:"Bluesky"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a ",(0,r.jsx)(n.a,{href:"https://bsky.app",children:"Bluesky"})," account, if you don't already have one"]}),"\n",(0,r.jsxs)(n.li,{children:["Navigate to ",(0,r.jsx)(n.a,{href:"https://bsky.app/settings/app-passwords",children:"https://bsky.app/settings/app-passwords"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Settings -> Privacy and Security -> App passwords"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Create a new ",(0,r.jsx)(n.strong,{children:"App Password"})," and save it somewhere, it will not be shown again"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n.h3,{id:"identifier",children:"Identifier"}),"\n",(0,r.jsx)(n.p,{children:"The ATProto identifier used with multi-scrobbler should be either:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A valid ",(0,r.jsx)(n.a,{href:"https://atproto.com/specs/did#at-protocol-did-identifier-syntax",children:"DID"}),", starting with ",(0,r.jsx)(n.code,{children:"did:plc:..."})," or ",(0,r.jsx)(n.code,{children:"did:web:..."})]}),"\n",(0,r.jsxs)(n.li,{children:["Your ",(0,r.jsx)(n.strong,{children:"full"})," ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:"Atmosphere Account"})," ATProto handle, including TLD"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If using a handle:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For regular Bluesky account this will be like: ",(0,r.jsx)(n.code,{children:"alice.bsky.social"})]}),"\n",(0,r.jsxs)(n.li,{children:["For Bluesky accounts that ",(0,r.jsx)(n.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,r.jsx)(n.code,{children:"mydomain.com"})]}),"\n",(0,r.jsx)(n.li,{children:"For non-Bluesky-PDS users, you probably already know your handle"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["If your identifier does not look like a DID and does not include a TLD then multi-scrobbler will automatically append ",(0,r.jsx)(n.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,r.jsx)(t,{config:"TealClientConfig",fileContent:o.A,client:!0,ambiguous:!0,name:"tealfm",children:(0,r.jsx)(c,{})})]})}function j(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},3230(e,n,t){t.d(n,{A:()=>r}),t(6540);var s=t(4848);function r(e){return(0,s.jsx)("code",{...e})}},3242(e,n,t){t.d(n,{A:()=>s});let s='[\n {\n "id": "myTealClient",\n "name": "Foxx Teal Client",\n "configureAs": "client",\n "data": {\n "identifier": "alice.bsky.social",\n "appPassword": "twog-phu7-4dhe-y4j3"\n }\n },\n {\n "id": "myTealSource",\n "name": "Foxx Teal Source",\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]'}}]); \ No newline at end of file diff --git a/assets/js/8b39be93.09830469.js b/assets/js/8b39be93.09830469.js new file mode 100644 index 00000000..b660d310 --- /dev/null +++ b/assets/js/8b39be93.09830469.js @@ -0,0 +1,12 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3963"],{7360(e,t,n){n.d(t,{Ay:()=>h,RM:()=>l});var s=n(4848),o=n(8453),i=n(2170),r=n.n(i);function c(e){let t={a:"a",code:"code",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["This ",(0,s.jsx)(t.strong,{children:"Source"})," supports toggling ",(0,s.jsx)(t.a,{href:"/configuration/sources#monitoring",children:"monitoring on or off manually."})," This action can be taken on the Web Dashboard by clicking the link next to ",(0,s.jsx)(t.strong,{children:"Monitoring"})," found in each Source's status card."]}),"\n",(0,s.jsxs)(t.p,{children:["Additionally, the ",(0,s.jsx)(t.strong,{children:"default monitoring behavior"})," 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)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ + "data": { + // ... + }, + "options": { + // highlight-start + // set to true to always monitor (unless manually invoked) + // set to false to never monitor (unless manually invoked) + "autoMonitor": true + // highlight-end + } +}}`}),"\n",!0===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"always"})," monitor."]}):void 0,"\n",!1===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"never"})," monitor."]}):void 0]})}function a(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}let l=[];function d(e){let{DetailsAdmo:t}={...(0,o.R)(),...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,s.jsx)(t,{type:"note",summary:"Auto Monitoring Behavior",children:(0,s.jsx)(a,{...e})})}function h(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1172(e,t,n){n.r(t),n.d(t,{metadata:()=>s,default:()=>x,frontMatter:()=>l,contentTitle:()=>d,toc:()=>u,assets:()=>h});var s=JSON.parse('{"id":"configuration/sources/icecast","title":"Icecast","description":"Icecast Source Configuration","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/icecast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Icecast","toc_min_heading_level":2,"toc_max_heading_level":5,"description":"Icecast Source Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Google Cast (Chromecast)","permalink":"/multi-scrobbler/configuration/sources/google-cast"},"next":{"title":"Jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin"}}'),o=n(4848),i=n(8453);function r(e){let t={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"Environmental Variable"}),(0,o.jsx)(t.th,{children:"Type"}),(0,o.jsx)(t.th,{children:"Default"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsxs)(t.tbody,{children:[(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.em,{children:(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.code,{children:"ICECAST_ID"})})})}),(0,o.jsx)(t.td,{children:"string"}),(0,o.jsx)(t.td,{}),(0,o.jsxs)(t.td,{children:["A globally unique ID EX ",(0,o.jsx)(t.code,{children:"myComponentId"})]})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"ICECAST_NAME"})}),(0,o.jsx)(t.td,{children:"string"}),(0,o.jsxs)(t.td,{children:["Value of ",(0,o.jsx)(t.code,{children:"ICECAST_ID"})]}),(0,o.jsxs)(t.td,{children:["A vanity name EX ",(0,o.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"ICECAST_ENABLE"})}),(0,o.jsx)(t.td,{children:"boolean"}),(0,o.jsx)(t.td,{children:"true"}),(0,o.jsx)(t.td,{children:"Should this component be used?"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.em,{children:(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.code,{children:"ICECAST_URL"})})})}),(0,o.jsx)(t.td,{children:"string"}),(0,o.jsx)(t.td,{}),(0,o.jsx)(t.td,{children:"The Icecast stream URL"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"ICECAST_AUTO_MONITOR"})}),(0,o.jsx)(t.td,{children:"boolean"}),(0,o.jsx)(t.td,{}),(0,o.jsx)(t.td,{})]})]})]})}function c(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(r,{...e})}):r(e)}n(8194),n(698),n(2170);var a=n(7360);let l={title:"Icecast",toc_min_heading_level:2,toc_max_heading_level:5,description:"Icecast Source Configuration"},d,h={},u=[...a.RM,{value:"URL and Sources",id:"url-and-sources",level:4},{value:"Configuration",id:"configuration",level:2}];function m(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components},{Config:n,Details:s}=t;return n||j("Config",!0),s||j("Details",!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 monitoring for Icecast Sources is off by default."})," Use ",(0,o.jsx)(t.strong,{children:"Monitoring Behavior"})," to initiate scrobbling or configure automatic scrobble."]}),"\n",(0,o.jsx)(a.Ay,{filename:"icecast",defaultBehavior:!1}),"\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)(s,{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.jsx)(n,{config:"IcecastSourceConfig",fileContent:'[\n {\n "name": "Station 1",\n "enable": true,\n "id": "myIceStation1",\n "data": {\n "url": "http://myIcecast.com/radio"\n }\n }\n ]\n ',name:"icecast",children:(0,o.jsx)(c,{})})]})}function x(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}function j(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/8b39be93.eb6d9d58.js b/assets/js/8b39be93.eb6d9d58.js deleted file mode 100644 index dd170d7c..00000000 --- a/assets/js/8b39be93.eb6d9d58.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3963"],{7360(e,t,n){n.d(t,{Ay:()=>h,RM:()=>l});var s=n(4848),o=n(8453),i=n(2170),r=n.n(i);function c(e){let t={a:"a",code:"code",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["This ",(0,s.jsx)(t.strong,{children:"Source"})," supports toggling ",(0,s.jsx)(t.a,{href:"/configuration/sources#monitoring",children:"monitoring on or off manually."})," This action can be taken on the Web Dashboard by clicking the link next to ",(0,s.jsx)(t.strong,{children:"Monitoring"})," found in each Source's status card."]}),"\n",(0,s.jsxs)(t.p,{children:["Additionally, the ",(0,s.jsx)(t.strong,{children:"default monitoring behavior"})," 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)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ - "data": { - // ... - }, - "options": { - // highlight-start - // set to true to always monitor (unless manually invoked) - // set to false to never monitor (unless manually invoked) - "autoMonitor": true - // highlight-end - } -}}`}),"\n",!0===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"always"})," monitor."]}):void 0,"\n",!1===e.defaultBehavior?(0,s.jsxs)("span",{children:["This component's default monitoring behavior, when the above is not set, is to ",(0,s.jsx)("strong",{children:"never"})," monitor."]}):void 0]})}function a(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}let l=[];function d(e){let{DetailsAdmo:t}={...(0,o.R)(),...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,s.jsx)(t,{type:"note",summary:"Auto Monitoring Behavior",children:(0,s.jsx)(a,{...e})})}function h(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1172(e,t,n){n.r(t),n.d(t,{metadata:()=>s,default:()=>x,frontMatter:()=>l,contentTitle:()=>d,toc:()=>u,assets:()=>h});var s=JSON.parse('{"id":"configuration/sources/icecast","title":"Icecast","description":"Icecast Source Configuration","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/icecast.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Icecast","toc_min_heading_level":2,"toc_max_heading_level":5,"description":"Icecast Source Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Google Cast (Chromecast)","permalink":"/multi-scrobbler/configuration/sources/google-cast"},"next":{"title":"Jellyfin","permalink":"/multi-scrobbler/configuration/sources/jellyfin"}}'),o=n(4848),i=n(8453);function r(e){let t={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"Environmental Variable"}),(0,o.jsx)(t.th,{children:"Type"}),(0,o.jsx)(t.th,{children:"Default"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsxs)(t.tbody,{children:[(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.em,{children:(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.code,{children:"ICECAST_ID"})})})}),(0,o.jsx)(t.td,{children:"string"}),(0,o.jsx)(t.td,{}),(0,o.jsxs)(t.td,{children:["A globally unique ID EX ",(0,o.jsx)(t.code,{children:"myComponentId"})]})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"ICECAST_NAME"})}),(0,o.jsx)(t.td,{children:"string"}),(0,o.jsxs)(t.td,{children:["Value of ",(0,o.jsx)(t.code,{children:"ICECAST_ID"})]}),(0,o.jsxs)(t.td,{children:["A vanity name EX ",(0,o.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"ICECAST_ENABLE"})}),(0,o.jsx)(t.td,{children:"boolean"}),(0,o.jsx)(t.td,{children:"true"}),(0,o.jsx)(t.td,{children:"Should this component be used?"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.em,{children:(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.code,{children:"ICECAST_URL"})})})}),(0,o.jsx)(t.td,{children:"string"}),(0,o.jsx)(t.td,{}),(0,o.jsx)(t.td,{children:"The Icecast stream URL"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:(0,o.jsx)(t.code,{children:"ICECAST_AUTO_MONITOR"})}),(0,o.jsx)(t.td,{children:"boolean"}),(0,o.jsx)(t.td,{}),(0,o.jsx)(t.td,{})]})]})]})}function c(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(r,{...e})}):r(e)}n(8194),n(698),n(2170);var a=n(7360);let l={title:"Icecast",toc_min_heading_level:2,toc_max_heading_level:5,description:"Icecast Source Configuration"},d,h={},u=[...a.RM,{value:"URL and Sources",id:"url-and-sources",level:4},{value:"Configuration",id:"configuration",level:2}];function m(e){let t={a:"a",admonition:"admonition",code:"code",h2:"h2",h4:"h4",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components},{Config:n,Details:s}=t;return n||j("Config",!0),s||j("Details",!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 monitoring for Icecast Sources is off by default."})," Use ",(0,o.jsx)(t.strong,{children:"Monitoring Behavior"})," to initiate scrobbling or configure automatic scrobble."]}),"\n",(0,o.jsx)(a.Ay,{filename:"icecast",defaultBehavior:!1}),"\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)(s,{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.jsx)(n,{config:"IcecastSourceConfig",fileContent:'[\n {\n "name": "Station 1",\n "enable": true,\n "id": "myIceStation1",\n "data": {\n "url": "http://myIcecast.com/radio"\n }\n }\n ]\n ',name:"icecast",children:(0,o.jsx)(c,{})})]})}function x(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}function j(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/91a78c9f.055787b3.js b/assets/js/91a78c9f.055787b3.js deleted file mode 100644 index be9f1c74..00000000 --- a/assets/js/91a78c9f.055787b3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2076"],{4355(e,n,s){s.r(n),s.d(n,{metadata:()=>t,default:()=>m,frontMatter:()=>c,contentTitle:()=>l,toc:()=>h,assets:()=>a});var t=JSON.parse('{"id":"configuration/sources/mpd","title":"MPD (Music Player Daemon)","description":"MS communicates with MPD using the TCP client connection.","source":"@site/docs/configuration/sources/mpd.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/mpd","permalink":"/multi-scrobbler/configuration/sources/mpd","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mpd.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"MPD (Music Player Daemon)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Mopidy","permalink":"/multi-scrobbler/configuration/sources/mopidy"},"next":{"title":"MPRIS","permalink":"/multi-scrobbler/configuration/sources/mpris"}}'),r=s(4848),i=s(8453);function o(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"MPD_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"MPD_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_URL"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"localhost:6600"}),(0,r.jsxs)(n.td,{children:["URL",":PORT"," of the MPD server to connect to"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_PASSWORD"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["Password for the server, if set ",(0,r.jsx)(n.a,{href:"https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords",children:"https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"})]})]})]})]})}function d(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let c={title:"MPD (Music Player Daemon)",toc_min_heading_level:2,toc_max_heading_level:5},l,a={},h=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...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,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["MS communicates with MPD using the ",(0,r.jsx)(n.a,{href:"https://mpd.readthedocs.io/en/stable/user.html#client-connections",children:"TCP client connection."})]}),"\n",(0,r.jsx)(n.p,{children:"You should uncomment/create the following settings in your mpd config:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'bind_to_address "any" # or a specific ipv4/v6 address\nport "6600"\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler requires only the ",(0,r.jsx)(n.a,{href:"https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords",children:(0,r.jsx)(n.code,{children:"read"})})," permission in order to monitor your activity."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(s,{config:"MPDSourceConfig",fileContent:'[\n {\n "enable": true,\n "id": "myMPD",\n "name": "Desktop",\n "data": {\n "url": "192.168.0.100:6600",\n "password": "MY_PASSWORD"\n },\n "options": {\n "disableDiscovery": false\n }\n }\n]\n',name:"mpd",children:(0,r.jsx)(d,{})})]})}function m(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/91a78c9f.f02c9e98.js b/assets/js/91a78c9f.f02c9e98.js new file mode 100644 index 00000000..897bd63d --- /dev/null +++ b/assets/js/91a78c9f.f02c9e98.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2076"],{4355(e,n,s){s.r(n),s.d(n,{metadata:()=>t,default:()=>m,frontMatter:()=>c,contentTitle:()=>l,toc:()=>h,assets:()=>a});var t=JSON.parse('{"id":"configuration/sources/mpd","title":"MPD (Music Player Daemon)","description":"MS communicates with MPD using the TCP client connection.","source":"@site/docs/configuration/sources/mpd.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/mpd","permalink":"/multi-scrobbler/configuration/sources/mpd","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mpd.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"MPD (Music Player Daemon)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Mopidy","permalink":"/multi-scrobbler/configuration/sources/mopidy"},"next":{"title":"MPRIS","permalink":"/multi-scrobbler/configuration/sources/mpris"}}'),r=s(4848),i=s(8453);function o(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"MPD_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"MPD_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_URL"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{children:"localhost:6600"}),(0,r.jsxs)(n.td,{children:["URL",":PORT"," of the MPD server to connect to"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MPD_PASSWORD"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["Password for the server, if set ",(0,r.jsx)(n.a,{href:"https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords",children:"https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords"})]})]})]})]})}function d(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let c={title:"MPD (Music Player Daemon)",toc_min_heading_level:2,toc_max_heading_level:5},l,a={},h=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...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,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["MS communicates with MPD using the ",(0,r.jsx)(n.a,{href:"https://mpd.readthedocs.io/en/stable/user.html#client-connections",children:"TCP client connection."})]}),"\n",(0,r.jsx)(n.p,{children:"You should uncomment/create the following settings in your mpd config:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'bind_to_address "any" # or a specific ipv4/v6 address\nport "6600"\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler requires only the ",(0,r.jsx)(n.a,{href:"https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords",children:(0,r.jsx)(n.code,{children:"read"})})," permission in order to monitor your activity."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(s,{config:"MPDSourceConfig",fileContent:'[\n {\n "enable": true,\n "id": "myMPD",\n "name": "Desktop",\n "data": {\n "url": "192.168.0.100:6600",\n "password": "MY_PASSWORD"\n },\n "options": {\n "disableDiscovery": false\n }\n }\n]\n',name:"mpd",children:(0,r.jsx)(d,{})})]})}function m(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/925abbc7.c3c17436.js b/assets/js/925abbc7.c3c17436.js deleted file mode 100644 index 453b1a99..00000000 --- a/assets/js/925abbc7.c3c17436.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["4123"],{4997(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>g,frontMatter:()=>u,contentTitle:()=>j,toc:()=>p,assets:()=>m});var i=JSON.parse('{"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.","source":"@site/docs/configuration/sources/deezer.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/deezer","permalink":"/multi-scrobbler/configuration/sources/deezer","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/deezer.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Deezer","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast"},"next":{"title":"Google Cast (Chromecast)","permalink":"/multi-scrobbler/configuration/sources/google-cast"}}'),s=r(4848),t=r(8453),l=r(8194),o=r(698),c=r(2170),d=r.n(c);let a='[\n {\n "name": "DeezerOfficalDeprecated",\n "enable": true,\n "clients": [],\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/deezer/callback",\n "interval": 60\n }\n }\n]\n';function h(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Environmental Variable"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"DEEZER_ID"})})})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["A globally unique ID EX ",(0,s.jsx)(n.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_NAME"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsxs)(n.td,{children:["Value of ",(0,s.jsx)(n.code,{children:"DEEZER_ID"})]}),(0,s.jsxs)(n.td,{children:["A vanity name EX ",(0,s.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_ENABLE"})}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"true"}),(0,s.jsx)(n.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"DEEZER_ARL"})})})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"ARL retrieved from Deezer response header"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_ACCOUNT_ID"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"The ID (USER_ID) of the linked account to monitor."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_USER_AGENT"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}),(0,s.jsx)(n.td,{children:"User agent"})]})]})]})}function x(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}let u={title:"Deezer",toc_min_heading_level:2,toc_max_heading_level:5},j,m={},p=[{value:"Retrieve ARL",id:"retrieve-arl",level:3},{value:"Duplicate detection",id:"duplicate-detection",level:3},{value:"Family account",id:"family-account",level:3},{value:"Configuration",id:"configuration",level:2},{value:"Configuration",id:"configuration-1",level:6}];function f(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h6:"h6",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,t.R)(),...e.components},{AIOExample:r,Config:i,Details:c,SchemaLink:h}=n;return r||b("AIOExample",!0),i||b("Config",!0),c||b("Details",!0),h||b("SchemaLink",!0),(0,s.jsxs)(l.A,{groupId:"deezerSource",queryString:!0,children:[(0,s.jsxs)(o.A,{value:"arl",label:"Unofficial ARL",children:[(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"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."})}),(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["This Source will work only if you have a ",(0,s.jsx)(n.strong,{children:"Premium"})," Deezer account."]})}),(0,s.jsx)(n.h3,{id:"retrieve-arl",children:"Retrieve ARL"}),(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"arl"})," is a browser cookie that Deezer uses to store your login information. Multi-scrobbler uses the ",(0,s.jsx)(n.code,{children:"arl"})," value to make authorized requests to Deezer's API where it can retrieve listening history."]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"After logging into Deezer"}),", use one of the methods below to retrieve the ",(0,s.jsx)(n.code,{children:"arl"})," cookie value:"]}),(0,s.jsxs)(l.A,{groupId:"arlRetrival",children:[(0,s.jsx)(o.A,{value:"chrome",label:"Chrome",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"On deezer.com, press F12 to open the Developer Tools window."}),"\n",(0,s.jsx)(n.li,{children:"Go to the Applications tab. Press the '>>' More tabs icon if it's hidden."}),"\n",(0,s.jsxs)(n.li,{children:["Under the Cookies Filter, click deezer.com, then the text bar name ",(0,s.jsx)(n.code,{children:"arl"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Copy all the contents shown in the ",(0,s.jsx)(n.strong,{children:"Cookie Value"})," pane."]}),"\n"]})}),(0,s.jsx)(o.A,{value:"firefox",label:"Firefox",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"On deezer.com, hit Ctrl+Shift+I to open Developer Tools"}),"\n",(0,s.jsx)(n.li,{children:"Go to the Storage Tab, then expand Cookies in the sidebar and select deezer.com"}),"\n",(0,s.jsxs)(n.li,{children:["Find the row with ",(0,s.jsx)(n.code,{children:"arl"})," as the name, then double click the Value column and right click -> copy the value"]}),"\n"]})})]}),(0,s.jsx)(n.h3,{id:"duplicate-detection",children:"Duplicate detection"}),(0,s.jsxs)(n.p,{children:["Third party integrations with Deezer (Sonos) may cause Deezer to ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pull/296#issuecomment-2922374738",children:"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 ",(0,s.jsx)(n.code,{children:'"fuzzyDiscoveryIgnore": "aggressive"'})]}),(0,s.jsxs)(c,{children:[(0,s.jsx)("summary",{children:"deezer.json example"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:'title="deezer.json"',children:'[\n {\n "name": "MyDeezer",\n "data": {\n "arl": "UOsRPjT3U5Dhaaup3x...",\n },\n "options": {\n "fuzzyDiscoveryIgnore": "aggressive"\n }\n }\n]\n'})})]}),(0,s.jsxs)(n.p,{children:["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 ",(0,s.jsx)(n.em,{children:"intentionally"})," repeated tracks from being scrobbled. See ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pull/296#issuecomment-2970417070",children:"this thread"})," for more information on how this works."]}),(0,s.jsx)(n.h3,{id:"family-account",children:"Family account"}),(0,s.jsxs)(n.p,{children:["Multi-scrobbler can monitor listening history for accounts linked to a ",(0,s.jsx)(n.a,{href:"https://www.deezer.com/en/offers/family",children:"Deezer Family Account"}),"."]}),(0,s.jsxs)(c,{children:[(0,s.jsx)("summary",{children:"Instructions"}),(0,s.jsxs)(n.p,{children:["Start multi-scrobbler using the ",(0,s.jsx)(n.a,{href:"#retrieve-arl",children:"ARL"})," for the ",(0,s.jsx)(n.strong,{children:"main account"}),"."]}),(0,s.jsxs)(n.p,{children:["In the logs look for ",(0,s.jsx)(n.strong,{children:"Linked Accounts"})," associated with the Deezer Source. It will look something like this:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"VERBOSE: [App] [Sources] [Deezer - MyDeezer] Linked Accounts:\nName: Joe | ID: 166276334 | Private?: Yes\nName: Mary | ID: 48475231 | Private?: Yes\nName: FoxxMD | ID: 896225281 | Private?: No\nName: Cool Guy | ID: 128522478 | Private?: Yes\n"})}),(0,s.jsxs)(n.p,{children:["The Account ",(0,s.jsx)(n.strong,{children:"ID"})," you want to monitor should be set:"]}),(0,s.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,s.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,s.jsxs)(n.p,{children:["Set in your docker compose ",(0,s.jsx)(n.code,{children:"environment"})," section:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- DEEZER_ACCOUNT_ID=896225281\n"})})]}),(0,s.jsxs)(o.A,{value:"file",label:"File or AIO",children:[(0,s.jsxs)(n.p,{children:["Add an ",(0,s.jsx)(n.code,{children:"accountId"})," property to the ",(0,s.jsx)(n.code,{children:"data"})," section"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n {\n "name": "DeezerARL",\n "enable": true,\n "clients": [],\n "data": {\n "arl": "UOsRPjT3U5Dhaaup3xQ30D...",\n "accountId": "896225281"\n }\n }\n]\n'})})]})]}),(0,s.jsx)(n.p,{children:"Restart multi-scrobbler to start monitoring that account."}),(0,s.jsxs)(n.admonition,{title:"Restrictions",type:"warning",children:[(0,s.jsx)(n.p,{children:"Deezer may not return the correct listening history under these circumstances:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ARL used is ",(0,s.jsx)(n.strong,{children:"not"})," for the main account","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you can get an ARL specifically for the linked account (login as the linked account), use that ",(0,s.jsx)(n.strong,{children:"instead"})," of family ",(0,s.jsx)(n.code,{children:"accountId"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:"The ARL account is private"}),"\n",(0,s.jsxs)(n.li,{children:["The linked account to be monitored ( using ",(0,s.jsx)(n.code,{children:"accountId"}),") is private"]}),"\n"]})]})]}),(0,s.jsx)(n.h2,{id:"configuration",children:"Configuration"}),(0,s.jsx)(i,{config:"DeezerCompatConfig",fileContent:'[\n {\n "name": "Family Account",\n "id": "myDeezerId",\n "enable": true,\n "clients": [],\n "data": {\n "arl": "UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig",\n }\n }\n]\n',name:"deezer",children:(0,s.jsx)(x,{})})]}),(0,s.jsxs)(o.A,{value:"official",label:"Official API",children:[(0,s.jsxs)(n.admonition,{type:"warning",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"This Source is DEPRECATED because Deezer has dropped official API support."})," This Source will ",(0,s.jsx)(n.strong,{children:"not"})," be removed but no further support or fixes will be given. ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/175#issuecomment-2296776625",children:"See this issue for more discussion."})]}),(0,s.jsx)(n.p,{children:"Users cannot create new applications on Deezer Developers and there is no guarantee existing applications will continue to work."}),(0,s.jsx)(n.p,{children:"As a workaround consider:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Using the alternative ",(0,s.jsx)(n.a,{href:"./?deezerSource=arl",children:"Deezer Source that uses unofficial, internal API via ARL"})]}),"\n",(0,s.jsxs)(n.li,{children:["Connect Deezer with Last.fm and then use ",(0,s.jsx)(n.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm as a Source"})]}),"\n"]})]}),(0,s.jsxs)(n.p,{children:["Create a new application at ",(0,s.jsx)(n.a,{href:"https://developers.deezer.com/myapps",children:"Deezer Developers"})]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Application Domain must be the same as your multi-scrobbler domain. Default is ",(0,s.jsx)(n.code,{children:"localhost:9078"})]}),"\n",(0,s.jsxs)(n.li,{children:["Redirect URL must end in ",(0,s.jsx)(n.code,{children:"deezer/callback"})]}),"\n",(0,s.jsxs)(n.li,{children:["Default would be ",(0,s.jsx)(n.code,{children:"http://localhost:9078/deezer/callback"})]}),"\n"]}),(0,s.jsx)(n.p,{children:'After application creation you should have credentials displayed in the "My Apps" dashboard. You will need:'}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.strong,{children:"Application ID"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.strong,{children:"Secret Key"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Redirect URL"})," (if not the default)"]}),"\n"]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"If no access token is provided..."})}),(0,s.jsxs)(n.p,{children:["After starting multi-scrobbler with credentials in-place open the dashboard (",(0,s.jsx)(n.code,{children:"http://localhost:9078"}),") and find your Deezer source. Click ",(0,s.jsx)(n.strong,{children:"(Re)authenticate and (re)start polling"})," to start the login process. After login is complete polling will begin automatically."]}),(0,s.jsx)(n.h6,{id:"configuration-1",children:"Configuration"}),(0,s.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,s.jsx)(o.A,{value:"env",label:"ENV",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Environmental Variable"}),(0,s.jsx)(n.th,{children:"Required?"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_ID"})}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"A unique ID"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_CLIENT_ID"})}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["Your ",(0,s.jsx)(n.strong,{children:"Application ID"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_CLIENT_SECRET"})}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["Your ",(0,s.jsx)(n.strong,{children:"Secret Key"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_REDIRECT_URI"})}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"http://localhost:9078/deezer/callback"})}),(0,s.jsxs)(n.td,{children:["URI must end in ",(0,s.jsx)(n.code,{children:"deezer/callback"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_NAME"})}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"A vanity name different than ID"})]})]})]})}),(0,s.jsxs)(o.A,{value:"file",label:"File",children:[(0,s.jsx)(d(),{title:"CONFIG_DIR/deezer.json",language:"json5",children:a}),(0,s.jsxs)(n.p,{children:["or ",(0,s.jsx)(h,{lower:!0,objectName:"DeezerSourceConfig"})]})]}),(0,s.jsxs)(o.A,{value:"aio",label:"AIO",children:[(0,s.jsx)(r,{data:a,name:"deezer"}),(0,s.jsxs)(n.p,{children:["or ",(0,s.jsx)(h,{lower:!0,objectName:"DeezerSourceConfig"})]})]})]})]})]})}function g(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(f,{...e})}):f(e)}function b(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/925abbc7.e3c9000b.js b/assets/js/925abbc7.e3c9000b.js new file mode 100644 index 00000000..2145c84d --- /dev/null +++ b/assets/js/925abbc7.e3c9000b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["4123"],{4997(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>g,frontMatter:()=>u,contentTitle:()=>j,toc:()=>p,assets:()=>m});var i=JSON.parse('{"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.","source":"@site/docs/configuration/sources/deezer.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/deezer","permalink":"/multi-scrobbler/configuration/sources/deezer","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/deezer.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Deezer","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast"},"next":{"title":"Google Cast (Chromecast)","permalink":"/multi-scrobbler/configuration/sources/google-cast"}}'),s=r(4848),t=r(8453),l=r(8194),o=r(698),c=r(2170),d=r.n(c);let a='[\n {\n "name": "DeezerOfficalDeprecated",\n "enable": true,\n "clients": [],\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/deezer/callback",\n "interval": 60\n }\n }\n]\n';function h(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Environmental Variable"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"DEEZER_ID"})})})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["A globally unique ID EX ",(0,s.jsx)(n.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_NAME"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsxs)(n.td,{children:["Value of ",(0,s.jsx)(n.code,{children:"DEEZER_ID"})]}),(0,s.jsxs)(n.td,{children:["A vanity name EX ",(0,s.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_ENABLE"})}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"true"}),(0,s.jsx)(n.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.em,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"DEEZER_ARL"})})})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"ARL retrieved from Deezer response header"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_ACCOUNT_ID"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"The ID (USER_ID) of the linked account to monitor."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_USER_AGENT"})}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0"}),(0,s.jsx)(n.td,{children:"User agent"})]})]})]})}function x(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}let u={title:"Deezer",toc_min_heading_level:2,toc_max_heading_level:5},j,m={},p=[{value:"Retrieve ARL",id:"retrieve-arl",level:3},{value:"Duplicate detection",id:"duplicate-detection",level:3},{value:"Family account",id:"family-account",level:3},{value:"Configuration",id:"configuration",level:2},{value:"Configuration",id:"configuration-1",level:6}];function f(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h6:"h6",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,t.R)(),...e.components},{AIOExample:r,Config:i,Details:c,SchemaLink:h}=n;return r||b("AIOExample",!0),i||b("Config",!0),c||b("Details",!0),h||b("SchemaLink",!0),(0,s.jsxs)(l.A,{groupId:"deezerSource",queryString:!0,children:[(0,s.jsxs)(o.A,{value:"arl",label:"Unofficial ARL",children:[(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"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."})}),(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["This Source will work only if you have a ",(0,s.jsx)(n.strong,{children:"Premium"})," Deezer account."]})}),(0,s.jsx)(n.h3,{id:"retrieve-arl",children:"Retrieve ARL"}),(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"arl"})," is a browser cookie that Deezer uses to store your login information. Multi-scrobbler uses the ",(0,s.jsx)(n.code,{children:"arl"})," value to make authorized requests to Deezer's API where it can retrieve listening history."]}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"After logging into Deezer"}),", use one of the methods below to retrieve the ",(0,s.jsx)(n.code,{children:"arl"})," cookie value:"]}),(0,s.jsxs)(l.A,{groupId:"arlRetrival",children:[(0,s.jsx)(o.A,{value:"chrome",label:"Chrome",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"On deezer.com, press F12 to open the Developer Tools window."}),"\n",(0,s.jsx)(n.li,{children:"Go to the Applications tab. Press the '>>' More tabs icon if it's hidden."}),"\n",(0,s.jsxs)(n.li,{children:["Under the Cookies Filter, click deezer.com, then the text bar name ",(0,s.jsx)(n.code,{children:"arl"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Copy all the contents shown in the ",(0,s.jsx)(n.strong,{children:"Cookie Value"})," pane."]}),"\n"]})}),(0,s.jsx)(o.A,{value:"firefox",label:"Firefox",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"On deezer.com, hit Ctrl+Shift+I to open Developer Tools"}),"\n",(0,s.jsx)(n.li,{children:"Go to the Storage Tab, then expand Cookies in the sidebar and select deezer.com"}),"\n",(0,s.jsxs)(n.li,{children:["Find the row with ",(0,s.jsx)(n.code,{children:"arl"})," as the name, then double click the Value column and right click -> copy the value"]}),"\n"]})})]}),(0,s.jsx)(n.h3,{id:"duplicate-detection",children:"Duplicate detection"}),(0,s.jsxs)(n.p,{children:["Third party integrations with Deezer (Sonos) may cause Deezer to ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pull/296#issuecomment-2922374738",children:"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 ",(0,s.jsx)(n.code,{children:'"fuzzyDiscoveryIgnore": "aggressive"'})]}),(0,s.jsxs)(c,{children:[(0,s.jsx)("summary",{children:"deezer.json example"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",metastring:'title="deezer.json"',children:'[\n {\n "name": "MyDeezer",\n "data": {\n "arl": "UOsRPjT3U5Dhaaup3x...",\n },\n "options": {\n "fuzzyDiscoveryIgnore": "aggressive"\n }\n }\n]\n'})})]}),(0,s.jsxs)(n.p,{children:["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 ",(0,s.jsx)(n.em,{children:"intentionally"})," repeated tracks from being scrobbled. See ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pull/296#issuecomment-2970417070",children:"this thread"})," for more information on how this works."]}),(0,s.jsx)(n.h3,{id:"family-account",children:"Family account"}),(0,s.jsxs)(n.p,{children:["Multi-scrobbler can monitor listening history for accounts linked to a ",(0,s.jsx)(n.a,{href:"https://www.deezer.com/en/offers/family",children:"Deezer Family Account"}),"."]}),(0,s.jsxs)(c,{children:[(0,s.jsx)("summary",{children:"Instructions"}),(0,s.jsxs)(n.p,{children:["Start multi-scrobbler using the ",(0,s.jsx)(n.a,{href:"#retrieve-arl",children:"ARL"})," for the ",(0,s.jsx)(n.strong,{children:"main account"}),"."]}),(0,s.jsxs)(n.p,{children:["In the logs look for ",(0,s.jsx)(n.strong,{children:"Linked Accounts"})," associated with the Deezer Source. It will look something like this:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"VERBOSE: [App] [Sources] [Deezer - MyDeezer] Linked Accounts:\nName: Joe | ID: 166276334 | Private?: Yes\nName: Mary | ID: 48475231 | Private?: Yes\nName: FoxxMD | ID: 896225281 | Private?: No\nName: Cool Guy | ID: 128522478 | Private?: Yes\n"})}),(0,s.jsxs)(n.p,{children:["The Account ",(0,s.jsx)(n.strong,{children:"ID"})," you want to monitor should be set:"]}),(0,s.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,s.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,s.jsxs)(n.p,{children:["Set in your docker compose ",(0,s.jsx)(n.code,{children:"environment"})," section:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- DEEZER_ACCOUNT_ID=896225281\n"})})]}),(0,s.jsxs)(o.A,{value:"file",label:"File or AIO",children:[(0,s.jsxs)(n.p,{children:["Add an ",(0,s.jsx)(n.code,{children:"accountId"})," property to the ",(0,s.jsx)(n.code,{children:"data"})," section"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n {\n "name": "DeezerARL",\n "enable": true,\n "clients": [],\n "data": {\n "arl": "UOsRPjT3U5Dhaaup3xQ30D...",\n "accountId": "896225281"\n }\n }\n]\n'})})]})]}),(0,s.jsx)(n.p,{children:"Restart multi-scrobbler to start monitoring that account."}),(0,s.jsxs)(n.admonition,{title:"Restrictions",type:"warning",children:[(0,s.jsx)(n.p,{children:"Deezer may not return the correct listening history under these circumstances:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ARL used is ",(0,s.jsx)(n.strong,{children:"not"})," for the main account","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you can get an ARL specifically for the linked account (login as the linked account), use that ",(0,s.jsx)(n.strong,{children:"instead"})," of family ",(0,s.jsx)(n.code,{children:"accountId"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:"The ARL account is private"}),"\n",(0,s.jsxs)(n.li,{children:["The linked account to be monitored ( using ",(0,s.jsx)(n.code,{children:"accountId"}),") is private"]}),"\n"]})]})]}),(0,s.jsx)(n.h2,{id:"configuration",children:"Configuration"}),(0,s.jsx)(i,{config:"DeezerCompatConfig",fileContent:'[\n {\n "name": "Family Account",\n "id": "myDeezerId",\n "enable": true,\n "clients": [],\n "data": {\n "arl": "UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig",\n }\n }\n]\n',name:"deezer",children:(0,s.jsx)(x,{})})]}),(0,s.jsxs)(o.A,{value:"official",label:"Official API",children:[(0,s.jsxs)(n.admonition,{type:"warning",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"This Source is DEPRECATED because Deezer has dropped official API support."})," This Source will ",(0,s.jsx)(n.strong,{children:"not"})," be removed but no further support or fixes will be given. ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/175#issuecomment-2296776625",children:"See this issue for more discussion."})]}),(0,s.jsx)(n.p,{children:"Users cannot create new applications on Deezer Developers and there is no guarantee existing applications will continue to work."}),(0,s.jsx)(n.p,{children:"As a workaround consider:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Using the alternative ",(0,s.jsx)(n.a,{href:"./?deezerSource=arl",children:"Deezer Source that uses unofficial, internal API via ARL"})]}),"\n",(0,s.jsxs)(n.li,{children:["Connect Deezer with Last.fm and then use ",(0,s.jsx)(n.a,{href:"/configuration/sources/lastfm-source",children:"Last.fm as a Source"})]}),"\n"]})]}),(0,s.jsxs)(n.p,{children:["Create a new application at ",(0,s.jsx)(n.a,{href:"https://developers.deezer.com/myapps",children:"Deezer Developers"})]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Application Domain must be the same as your multi-scrobbler domain. Default is ",(0,s.jsx)(n.code,{children:"localhost:9078"})]}),"\n",(0,s.jsxs)(n.li,{children:["Redirect URL must end in ",(0,s.jsx)(n.code,{children:"deezer/callback"})]}),"\n",(0,s.jsxs)(n.li,{children:["Default would be ",(0,s.jsx)(n.code,{children:"http://localhost:9078/deezer/callback"})]}),"\n"]}),(0,s.jsx)(n.p,{children:'After application creation you should have credentials displayed in the "My Apps" dashboard. You will need:'}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.strong,{children:"Application ID"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.strong,{children:"Secret Key"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Redirect URL"})," (if not the default)"]}),"\n"]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"If no access token is provided..."})}),(0,s.jsxs)(n.p,{children:["After starting multi-scrobbler with credentials in-place open the dashboard (",(0,s.jsx)(n.code,{children:"http://localhost:9078"}),") and find your Deezer source. Click ",(0,s.jsx)(n.strong,{children:"(Re)authenticate and (re)start polling"})," to start the login process. After login is complete polling will begin automatically."]}),(0,s.jsx)(n.h6,{id:"configuration-1",children:"Configuration"}),(0,s.jsxs)(l.A,{groupId:"configType",queryString:!0,children:[(0,s.jsx)(o.A,{value:"env",label:"ENV",children:(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Environmental Variable"}),(0,s.jsx)(n.th,{children:"Required?"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_ID"})}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"A unique ID"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_CLIENT_ID"})}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["Your ",(0,s.jsx)(n.strong,{children:"Application ID"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_CLIENT_SECRET"})}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["Your ",(0,s.jsx)(n.strong,{children:"Secret Key"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_REDIRECT_URI"})}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"http://localhost:9078/deezer/callback"})}),(0,s.jsxs)(n.td,{children:["URI must end in ",(0,s.jsx)(n.code,{children:"deezer/callback"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEEZER_NAME"})}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"A vanity name different than ID"})]})]})]})}),(0,s.jsxs)(o.A,{value:"file",label:"File",children:[(0,s.jsx)(d(),{title:"CONFIG_DIR/deezer.json",language:"json5",children:a}),(0,s.jsxs)(n.p,{children:["or ",(0,s.jsx)(h,{lower:!0,objectName:"DeezerSourceConfig"})]})]}),(0,s.jsxs)(o.A,{value:"aio",label:"AIO",children:[(0,s.jsx)(r,{data:a,name:"deezer"}),(0,s.jsxs)(n.p,{children:["or ",(0,s.jsx)(h,{lower:!0,objectName:"DeezerSourceConfig"})]})]})]})]})]})}function g(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(f,{...e})}):f(e)}function b(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/9bcab3db.544fccb4.js b/assets/js/9bcab3db.544fccb4.js new file mode 100644 index 00000000..fe407eca --- /dev/null +++ b/assets/js/9bcab3db.544fccb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["490"],{180(e,t,n){n.r(t),n.d(t,{metadata:()=>r,default:()=>x,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var r=JSON.parse('{"id":"configuration/sources/lastfm-source","title":"Last.fm","description":"Last.fm (Source)","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/lastfm-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Last.fm","description":"Last.fm (Source)","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"}}'),s=n(4848),i=n(8453);n(8194),n(698),n(2170);var c=n(1432);function o(e){let t={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_ID"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsxs)(t.td,{children:["A globally unique ID EX ",(0,s.jsx)(t.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_NAME"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsxs)(t.td,{children:["Value of ",(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_ID"})]}),(0,s.jsxs)(t.td,{children:["A vanity name EX ",(0,s.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_ENABLE"})}),(0,s.jsx)(t.td,{children:"boolean"}),(0,s.jsx)(t.td,{children:"true"}),(0,s.jsx)(t.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_API_KEY"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"API Key generated from Last.fm/Libre.fm account"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_SECRET"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Secret generated from Last.fm/Libre.fm account"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_REDIRECT_URI"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"http://localhost:9078/lastfm/callback",children:"http://localhost:9078/lastfm/callback"})}),(0,s.jsx)(t.td,{children:"Optional URI to use for callback."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_SESSION"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Optional session id returned from a completed auth flow"})]})]})]})}function l(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}let d={title:"Last.fm",description:"Last.fm (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},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,i.R)(),...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,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["This Source ",(0,s.jsx)(t.strong,{children:"monitors your Last.fm scrobble history"})," and re-scrobbles new activity to configured ",(0,s.jsx)(t.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,s.jsx)(t.admonition,{title:"Other Uses",type:"tip",children:(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["To ",(0,s.jsx)(t.strong,{children:"scrobble to"})," Last.fm/Libre.fm, create a ",(0,s.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,s.jsxs)(t.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,s.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,s.jsxs)(t.p,{children:["To configure this Source use the same registration instructions and configuration data shown in ",(0,s.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})," with the difference being ",(0,s.jsx)(t.code,{children:'"configureAs": "source"'})," defined in the File/AIO configuration below."]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(n,{config:"LastfmSourceConfig",fileContent:c.A,configureAs:!0,ambiguous:!0,name:"lastfm",children:(0,s.jsx)(l,{})})]})}function x(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(f,{...e})}):f(e)}},1432(e,t,n){n.d(t,{A:()=>r});let r='[\n {\n "name": "Foxx LFM Client",\n "id": "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": "Foxx LFM Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/9bcab3db.7daa78ab.js b/assets/js/9bcab3db.7daa78ab.js deleted file mode 100644 index 3d6cc3d5..00000000 --- a/assets/js/9bcab3db.7daa78ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["490"],{180(e,t,n){n.r(t),n.d(t,{metadata:()=>r,default:()=>x,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var r=JSON.parse('{"id":"configuration/sources/lastfm-source","title":"Last.fm","description":"Last.fm (Source)","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/lastfm-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Last.fm","description":"Last.fm (Source)","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"}}'),s=n(4848),i=n(8453);n(8194),n(698),n(2170);var c=n(1432);function o(e){let t={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_ID"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsxs)(t.td,{children:["A globally unique ID EX ",(0,s.jsx)(t.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_NAME"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsxs)(t.td,{children:["Value of ",(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_ID"})]}),(0,s.jsxs)(t.td,{children:["A vanity name EX ",(0,s.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_ENABLE"})}),(0,s.jsx)(t.td,{children:"boolean"}),(0,s.jsx)(t.td,{children:"true"}),(0,s.jsx)(t.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_API_KEY"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"API Key generated from Last.fm/Libre.fm account"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_SECRET"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Secret generated from Last.fm/Libre.fm account"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_REDIRECT_URI"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"http://localhost:9078/lastfm/callback",children:"http://localhost:9078/lastfm/callback"})}),(0,s.jsx)(t.td,{children:"Optional URI to use for callback."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"SOURCE_LASTFM_SESSION"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Optional session id returned from a completed auth flow"})]})]})]})}function l(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}let d={title:"Last.fm",description:"Last.fm (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},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,i.R)(),...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,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["This Source ",(0,s.jsx)(t.strong,{children:"monitors your Last.fm scrobble history"})," and re-scrobbles new activity to configured ",(0,s.jsx)(t.a,{href:"/configuration/clients",children:"Clients."})]}),"\n",(0,s.jsx)(t.admonition,{title:"Other Uses",type:"tip",children:(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["To ",(0,s.jsx)(t.strong,{children:"scrobble to"})," Last.fm/Libre.fm, create a ",(0,s.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})]}),"\n",(0,s.jsxs)(t.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was Last.fm, create a ",(0,s.jsx)(t.a,{href:"/configuration/sources/lastfm-endpoint",children:"Last.fm (Endpoint)"})]}),"\n"]})}),"\n",(0,s.jsxs)(t.p,{children:["To configure this Source use the same registration instructions and configuration data shown in ",(0,s.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm (Client)"})," with the difference being ",(0,s.jsx)(t.code,{children:'"configureAs": "source"'})," defined in the File/AIO configuration below."]}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(n,{config:"LastfmSourceConfig",fileContent:c.A,configureAs:!0,ambiguous:!0,name:"lastfm",children:(0,s.jsx)(l,{})})]})}function x(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(f,{...e})}):f(e)}},1432(e,t,n){n.d(t,{A:()=>r});let r='[\n {\n "name": "Foxx LFM Client",\n "id": "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": "Foxx LFM Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/9fd2a592.3a67aa4f.js b/assets/js/9fd2a592.3a67aa4f.js deleted file mode 100644 index e7cfef3f..00000000 --- a/assets/js/9fd2a592.3a67aa4f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9212"],{8222(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>u,frontMatter:()=>c,contentTitle:()=>d,toc:()=>a,assets:()=>h});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/webscrobbler.mdx?plain=1","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(4848),i=s(8453);function o(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"WS_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"WS_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_BLACKLIST"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Block scrobbling from specific WebScrobbler Connectors"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_WHITELIST"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Only allow scrobbling from specific WebScrobbler Connectors"})]})]})]})}function l(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let c={title:"Webscrobbler",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},a=[{value:"Multiple Users",id:"multiple-users",level:3},{value:"Connectors Black/Whitelist",id:"connectors-blackwhitelist",level:3},{value:"Configuration",id:"configuration",level:2}];function b(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:s,Details:r,DetailsAdmo:o}=n;return s||x("Config",!0),r||x("Details",!0),o||x("DetailsAdmo",!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)(o,{type:"note",summary:"URL Types Supported by Webscrobbler",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)(o,{type:"warning",summary:"Public-Facing Usage",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 "id": "MyWebScrobbler",\n "name": "Firefox Laptop",\n "data": {\n "slug": "MyOptionalSlug",\n "whitelist": [],\n "blacklist": []\n }\n }\n]\n',name:"webscrobbler",children:(0,t.jsx)(l,{})})]})}function u(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(b,{...e})}):b(e)}function x(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/9fd2a592.84dff9d4.js b/assets/js/9fd2a592.84dff9d4.js new file mode 100644 index 00000000..4a8cff78 --- /dev/null +++ b/assets/js/9fd2a592.84dff9d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9212"],{8222(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>u,frontMatter:()=>c,contentTitle:()=>d,toc:()=>a,assets:()=>h});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/webscrobbler.mdx?plain=1","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(4848),i=s(8453);function o(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"WS_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"WS_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_BLACKLIST"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Block scrobbling from specific WebScrobbler Connectors"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WS_WHITELIST"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Only allow scrobbling from specific WebScrobbler Connectors"})]})]})]})}function l(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}s(8194),s(698),s(2170);let c={title:"Webscrobbler",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},a=[{value:"Multiple Users",id:"multiple-users",level:3},{value:"Connectors Black/Whitelist",id:"connectors-blackwhitelist",level:3},{value:"Configuration",id:"configuration",level:2}];function b(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:s,Details:r,DetailsAdmo:o}=n;return s||x("Config",!0),r||x("Details",!0),o||x("DetailsAdmo",!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)(o,{type:"note",summary:"URL Types Supported by Webscrobbler",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)(o,{type:"warning",summary:"Public-Facing Usage",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 "id": "MyWebScrobbler",\n "name": "Firefox Laptop",\n "data": {\n "slug": "MyOptionalSlug",\n "whitelist": [],\n "blacklist": []\n }\n }\n]\n',name:"webscrobbler",children:(0,t.jsx)(l,{})})]})}function u(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(b,{...e})}):b(e)}function x(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/a16703cd.53e0bfce.js b/assets/js/a16703cd.53e0bfce.js new file mode 100644 index 00000000..ccbff455 --- /dev/null +++ b/assets/js/a16703cd.53e0bfce.js @@ -0,0 +1,13 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5515"],{7265(e,t,i){i.d(t,{Ay:()=>a,RM:()=>o});var n=i(4848),l=i(8453),s=i(2170),r=i.n(s);let o=[];function c(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["A ",(0,n.jsx)(t.strong,{children:"Source"})," that monitors Listening Activity uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,n.jsxs)(t.li,{children:["or amount of time (",(0,n.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["These default values are based on ",(0,n.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,n.jsxs)(t.p,{children:["These values can be customized in the ",(0,n.jsx)(t.code,{children:"options"})," of Source's ",(0,n.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,n.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ + "data": { + // ... + }, + "options": { + // highlight-start + "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 + } + // highlight-end + } +}`})]})}function a(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},662(e,t,i){i.r(t),i.d(t,{metadata:()=>n,default:()=>h,frontMatter:()=>r,contentTitle:()=>o,toc:()=>a,assets:()=>c});var n=JSON.parse('{"id":"configuration/clients/clients","title":"Overview","description":"Scrobble Clients","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/clients.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","description":"Scrobble Clients","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/"},"next":{"title":"Discord","permalink":"/multi-scrobbler/configuration/clients/discord/"}}'),l=i(4848),s=i(8453);i(7265);let r={sidebar_position:2,title:"Overview",description:"Scrobble Clients",toc_max_heading_level:4},o,c={},a=[{value:"Clients",id:"clients",level:2},{value:"Features",id:"features",level:2},{value:"Duplicate Detection",id:"duplicate-detection",level:3},{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,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["A ",(0,l.jsx)(t.strong,{children:"Client"})," is an application that stores the historical information about what songs you have played (scrobbles). Examples are ",(0,l.jsx)(t.strong,{children:"Maloja, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,l.jsx)(t.h2,{id:"clients",children:"Clients"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Now Playing"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/discord",children:"Discord"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/librefm",children:"Libre.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/koito",children:"Koito"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/tealfm",children:"Teal.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]})]})]}),"\n",(0,l.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,l.jsx)(t.h3,{id:"duplicate-detection",children:"Duplicate Detection"}),"\n",(0,l.jsx)(t.p,{children:"Before a Play is scrobbled to a client MS checks existing scrobbles from the Client's API to see if the Play has already been scrobbled."}),"\n",(0,l.jsx)(t.p,{children:"For each Play, MS fetches (cached) scrobbles from the Client in a time range inclusive of the Play's listening timestamp and then scores existing scrobbles against the Play based on:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"Similarity of Title, Artists, and Album"}),"\n",(0,l.jsx)(t.li,{children:"Temporal closeness of the Play's timestamp to the existing scrobble's timestamp"}),"\n",(0,l.jsx)(t.li,{children:"Whether MS detected the Play as a repeat (applicable to Sources that report realtime Player data)"}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["Detailed scoring breakdowns against each existing scrobble are logged at the ",(0,l.jsx)(t.code,{children:"TRACE"})," logging level or in the ",(0,l.jsx)(t.a,{href:"/help#copy-play-debug-data",children:"debug data"})," for a scrobble."]}),"\n",(0,l.jsxs)(t.p,{children:["See the ",(0,l.jsx)(t.a,{href:"/configuration/duplicates#how-duplicates-are-detected",children:(0,l.jsx)(t.strong,{children:"Duplicate Scrobble Guidance"})})," page to learn how duplicates are detected and how you can ensure your configuration avoids possible duplicates."]}),"\n",(0,l.jsx)(t.h3,{id:"dead-scrobbles",children:"Dead Scrobbles"}),"\n",(0,l.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,l.jsxs)(t.p,{children:["After it stops ",(0,l.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,l.jsx)(t.h3,{id:"now-playing",children:"Now Playing"}),"\n",(0,l.jsxs)(t.p,{children:["Multi-scrobbler can report the currently ",(0,l.jsx)(t.strong,{children:"playing"})," tracks it is monitoring to some Scrobble Clients via their individual ",(0,l.jsx)(t.strong,{children:"Now Playing"})," functionality."]}),"\n",(0,l.jsxs)(t.p,{children:["Now Playing is ",(0,l.jsx)(t.strong,{children:"default enabled"})," for all Clients that support it."]}),"\n",(0,l.jsx)(t.p,{children:"The behavior multi-scrobbler uses for determining Now Playing reporting:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["Now Playing can be explicitly enabled or disabled globally using ENV ",(0,l.jsx)(t.code,{children:"NOW_PLAYING=true"})," or ",(0,l.jsx)(t.code,{children:"NOW_PLAYING=false"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"This only affects Clients that don't have behavior set via File/AIO (below)"}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(t.li,{children:"Now Playing will be only be reported to the same Clients a Source is configured to scrobble to"}),"\n",(0,l.jsxs)(t.li,{children:["A Source's Player status must be ",(0,l.jsx)(t.strong,{children:"Playing"}),", IE ",(0,l.jsx)(t.strong,{children:"active"}),", for reporting to occur","\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"This status can be verified via Player UI on the Dashboard"}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["If multiple Sources having active Players then the scrobble Client will default to reporting the track based on Source ",(0,l.jsx)(t.strong,{children:"configuration"})," name, alphabetically","\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["This is the ",(0,l.jsx)(t.code,{children:"name"})," property set in ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["Clients can customize the Now Playing behavior individually using ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs:"})]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.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,s.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/a16703cd.a3295a26.js b/assets/js/a16703cd.a3295a26.js deleted file mode 100644 index d592e1a7..00000000 --- a/assets/js/a16703cd.a3295a26.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5515"],{7265(e,t,i){i.d(t,{Ay:()=>a,RM:()=>o});var n=i(4848),l=i(8453),s=i(2170),r=i.n(s);let o=[];function c(e){let t={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["A ",(0,n.jsx)(t.strong,{children:"Source"})," that monitors Listening Activity uses one of two metrics to determine if a Song is scrobbable based on your listening:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"percent"})," of track listened to (50% or more)"]}),"\n",(0,n.jsxs)(t.li,{children:["or amount of time (",(0,n.jsx)(t.strong,{children:"duration"}),") track was listened to (4 minutes or more)"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["These default values are based on ",(0,n.jsx)(t.a,{href:"https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble",children:"last.fm's scrobble guidance."})]}),"\n",(0,n.jsxs)(t.p,{children:["These values can be customized in the ",(0,n.jsx)(t.code,{children:"options"})," of Source's ",(0,n.jsx)(t.a,{href:"/configuration#configuration-types",children:"file or aio config"}),":"]}),"\n",(0,n.jsx)(r(),{language:"json5",title:`${e.filename}.json`,children:`{ - "data": { - // ... - }, - "options": { - // highlight-start - "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 - } - // highlight-end - } -}`})]})}function a(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},662(e,t,i){i.r(t),i.d(t,{metadata:()=>n,default:()=>h,frontMatter:()=>r,contentTitle:()=>o,toc:()=>a,assets:()=>c});var n=JSON.parse('{"id":"configuration/clients/clients","title":"Overview","description":"Scrobble Clients","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/clients.mdx?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Overview","description":"Scrobble Clients","toc_max_heading_level":4},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/"},"next":{"title":"Discord","permalink":"/multi-scrobbler/configuration/clients/discord/"}}'),l=i(4848),s=i(8453);i(7265);let r={sidebar_position:2,title:"Overview",description:"Scrobble Clients",toc_max_heading_level:4},o,c={},a=[{value:"Clients",id:"clients",level:2},{value:"Features",id:"features",level:2},{value:"Duplicate Detection",id:"duplicate-detection",level:3},{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,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["A ",(0,l.jsx)(t.strong,{children:"Client"})," is an application that stores the historical information about what songs you have played (scrobbles). Examples are ",(0,l.jsx)(t.strong,{children:"Maloja, Last.fm, Listenbrainz"}),"..."]}),"\n",(0,l.jsx)(t.h2,{id:"clients",children:"Clients"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Name"}),(0,l.jsx)(t.th,{style:{textAlign:"left"},children:"Now Playing"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/discord",children:"Discord"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/librefm",children:"Libre.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/koito",children:"Koito"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/maloja",children:"Maloja"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/rocksky",children:"Rocksky"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u274C"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"left"},children:(0,l.jsx)(t.a,{href:"/configuration/clients/tealfm",children:"Teal.fm"})}),(0,l.jsx)(t.td,{style:{textAlign:"left"},children:"\u2705"})]})]})]}),"\n",(0,l.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,l.jsx)(t.h3,{id:"duplicate-detection",children:"Duplicate Detection"}),"\n",(0,l.jsx)(t.p,{children:"Before a Play is scrobbled to a client MS checks existing scrobbles from the Client's API to see if the Play has already been scrobbled."}),"\n",(0,l.jsx)(t.p,{children:"For each Play, MS fetches (cached) scrobbles from the Client in a time range inclusive of the Play's listening timestamp and then scores existing scrobbles against the Play based on:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"Similarity of Title, Artists, and Album"}),"\n",(0,l.jsx)(t.li,{children:"Temporal closeness of the Play's timestamp to the existing scrobble's timestamp"}),"\n",(0,l.jsx)(t.li,{children:"Whether MS detected the Play as a repeat (applicable to Sources that report realtime Player data)"}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["Detailed scoring breakdowns against each existing scrobble are logged at the ",(0,l.jsx)(t.code,{children:"TRACE"})," logging level or in the ",(0,l.jsx)(t.a,{href:"/help#copy-play-debug-data",children:"debug data"})," for a scrobble."]}),"\n",(0,l.jsxs)(t.p,{children:["See the ",(0,l.jsx)(t.a,{href:"/configuration/duplicates#how-duplicates-are-detected",children:(0,l.jsx)(t.strong,{children:"Duplicate Scrobble Guidance"})})," page to learn how duplicates are detected and how you can ensure your configuration avoids possible duplicates."]}),"\n",(0,l.jsx)(t.h3,{id:"dead-scrobbles",children:"Dead Scrobbles"}),"\n",(0,l.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,l.jsxs)(t.p,{children:["After it stops ",(0,l.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,l.jsx)(t.h3,{id:"now-playing",children:"Now Playing"}),"\n",(0,l.jsxs)(t.p,{children:["Multi-scrobbler can report the currently ",(0,l.jsx)(t.strong,{children:"playing"})," tracks it is monitoring to some Scrobble Clients via their individual ",(0,l.jsx)(t.strong,{children:"Now Playing"})," functionality."]}),"\n",(0,l.jsxs)(t.p,{children:["Now Playing is ",(0,l.jsx)(t.strong,{children:"default enabled"})," for all Clients that support it."]}),"\n",(0,l.jsx)(t.p,{children:"The behavior multi-scrobbler uses for determining Now Playing reporting:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["Now Playing can be explicitly enabled or disabled globally using ENV ",(0,l.jsx)(t.code,{children:"NOW_PLAYING=true"})," or ",(0,l.jsx)(t.code,{children:"NOW_PLAYING=false"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"This only affects Clients that don't have behavior set via File/AIO (below)"}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(t.li,{children:"Now Playing will be only be reported to the same Clients a Source is configured to scrobble to"}),"\n",(0,l.jsxs)(t.li,{children:["A Source's Player status must be ",(0,l.jsx)(t.strong,{children:"Playing"}),", IE ",(0,l.jsx)(t.strong,{children:"active"}),", for reporting to occur","\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"This status can be verified via Player UI on the Dashboard"}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["If multiple Sources having active Players then the scrobble Client will default to reporting the track based on Source ",(0,l.jsx)(t.strong,{children:"configuration"})," name, alphabetically","\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["This is the ",(0,l.jsx)(t.code,{children:"name"})," property set in ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["Clients can customize the Now Playing behavior individually using ",(0,l.jsx)(t.a,{href:"/configuration?configType=file#configuration-types",children:"File or AIO source configs:"})]}),"\n",(0,l.jsx)(t.pre,{children:(0,l.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,s.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/a93ae359.1ee4806b.js b/assets/js/a93ae359.1ee4806b.js deleted file mode 100644 index fd93bb1d..00000000 --- a/assets/js/a93ae359.1ee4806b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7212"],{4814(e,s,n){n.r(s),n.d(s,{metadata:()=>r,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>b,assets:()=>u});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/listenbrainz-endpoint.mdx?plain=1","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"}}'),i=n(4848),t=n(8453),o=n(8194),l=n(698);function c(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"LZE_ID"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["A globally unique ID EX ",(0,i.jsx)(s.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_NAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsxs)(s.td,{children:["Value of ",(0,i.jsx)(s.code,{children:"LZE_ID"})]}),(0,i.jsxs)(s.td,{children:["A vanity name EX ",(0,i.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_ENABLE"})}),(0,i.jsx)(s.td,{children:"boolean"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_SLUG"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["When using ",(0,i.jsx)(s.strong,{children:"multiple sources without tokens"}),", or ",(0,i.jsx)(s.strong,{children:"not"})," using a standard base URL, this is the URL base path that should be used to identify scrobbles for this source"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_TOKEN"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_USERNAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:'The listenbrainz "username" to associate with this Source'})]})]})]})}function a(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}n(2170);let d={title:"Listenbrainz (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},b=[{value:"Setup",id:"setup",level:2},{value:"Standard Base URL",id:"standard-base-url",level:3},{value:"Token",id:"token",level:3},{value:"Multiple Sources",id:"multiple-sources",level:3},{value:"Setup for Popular Apps",id:"setup-for-popular-apps",level:2},{value:"Navidrome",id:"navidrome",level:3},{value:"Music Assistant",id:"music-assistant",level:3},{value:"Troubleshooting URL",id:"troubleshooting-url",level:2},{value:"Verify URL Format",id:"verify-url-format",level:4},{value:"Is MS is Reachable?",id:"is-ms-is-reachable",level:4},{value:"Service Logging",id:"service-logging",level:4},{value:"Configuration",id:"configuration",level:2}];function x(e){let s={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Config:n,Details:r,DetailsAdmo:c}=s;return n||f("Config",!0),r||f("Details",!0),c||f("DetailsAdmo",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(s.p,{children:["This Source enables multi-scrobbler to accept scrobbles from outside applications ",(0,i.jsx)(s.strong,{children:"as if it was a Listenbrainz server."})]}),"\n",(0,i.jsx)(s.p,{children:'If your service/player has a "Scrobble to Listenbrainz" feature and there is an option to set the Listenbrainz URL then multi-scrobbler can accept scrobbles from that service/player by imitating a real Listenbrainz server.'}),"\n",(0,i.jsx)(s.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["To ",(0,i.jsx)(s.strong,{children:"scrobble to"})," Listenbrainz, create a ",(0,i.jsx)(s.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz (Client)"})]}),"\n",(0,i.jsxs)(s.li,{children:["To monitor and re-scrobble activity from your Listenbrainz account, create a ",(0,i.jsx)(s.a,{href:"/configuration/sources/listenbrainz-source",children:"Listenbrainz (Source)"})]}),"\n"]})}),"\n",(0,i.jsx)(s.h2,{id:"setup",children:"Setup"}),"\n",(0,i.jsxs)(s.admonition,{title:"Scenario Picker",type:"tip",children:[(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.strong,{children:"one"}),' of the scenarios below based on how on your service(s) (things "scrobbling" to Multi-Scrobbler using this Source) will need to interact with MS.']}),(0,i.jsxs)(o.A,{groupId:"scenario",queryString:!0,children:[(0,i.jsxs)(l.A,{value:"single",label:"One Service",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"one"})," service, like Navidrome, that will scrobble to Multi-Scrobbler."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["Configure ",(0,i.jsx)(s.strong,{children:"one"})," Listenbrainz Endpoint Source. Use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and set a ",(0,i.jsx)(s.a,{href:"#token",children:"Token"}),", if necessary. Use the same ",(0,i.jsx)(s.strong,{children:"Token"})," in MS as you do in your service."]})]}),(0,i.jsxs)(l.A,{value:"multiple",label:"Many Services, Same User",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You may have ",(0,i.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same ",(0,i.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),"."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["Configure ",(0,i.jsx)(s.strong,{children:"one"})," Listenbrainz Endpoint Source. Use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and configure a ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})," in MS, if necessary. Use the same token for all your services as you configure in MS."]})]}),(0,i.jsxs)(l.A,{value:"multiple-tokens",label:"Many Services, Many Users, Can use Tokens",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,i.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"All"})," of these services can accept a ",(0,i.jsx)(s.strong,{children:"Token"})," to authenticate a Listenbrainz user/account."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["Configure one Listenbrainz Endpoint Sources ",(0,i.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,i.jsxs)(s.p,{children:["For each Listenbrainz Endpoint Source, configure a different ",(0,i.jsx)(s.a,{href:"#token",children:(0,i.jsx)(s.strong,{children:"Token"})}),". Use that same token when configuring Listenbrainz for the associated service."]}),(0,i.jsxs)(s.p,{children:["All Listenbrainz Endpoint Sources should use the same ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),"."]})]}),(0,i.jsxs)(l.A,{value:"multiple-slug",label:"Many Services, Many Users, Cannot use Tokens",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,i.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,i.jsxs)(s.p,{children:["All, or some, of these services ",(0,i.jsx)(s.strong,{children:"cannot"})," accept a ",(0,i.jsx)(s.strong,{children:"Token"})," to authenticate a Listenbrainz user/account."]}),"\n"]}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"This is not a common scenario"})," but if it fits your usecase then use these guidelines to differentiate your services:"]}),(0,i.jsxs)(s.p,{children:["Configure one Listenbrainz Endpoint Sources ",(0,i.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["For any groups of services that ",(0,i.jsx)(s.strong,{children:"can accept"})," a token, use the instructions for ",(0,i.jsx)(s.a,{href:"./?scenario=multiple-tokens#setup",children:"Many Services, Many Users, Can use Tokens"})]}),"\n",(0,i.jsxs)(s.li,{children:["For any groups of services that ",(0,i.jsx)(s.strong,{children:"cannot accept"})," a token...","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["You can still configure a Source ",(0,i.jsxs)(s.strong,{children:["without a ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})]}),'. Any services not using a token will use this "default" Source.']}),"\n",(0,i.jsxs)(s.li,{children:["If multiple groups cannot use a token, or the groups cannot use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),", then use different ",(0,i.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,i.jsx)(s.strong,{children:"Slugs"})]}),"."]}),"\n"]}),"\n"]}),"\n"]})]}),(0,i.jsxs)(l.A,{value:"slug",label:"Service cannot use standard URL",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"one"})," service, like Navidrome, that will scrobble to Multi-Scrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["You have already tried the ",(0,i.jsx)(s.a,{href:"./?scenario=single#setup",children:(0,i.jsx)(s.strong,{children:"One Service"})})," scenario with both ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," and neither is working."]}),"\n"]}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"This is not a common scenario."})," Check the ",(0,i.jsx)(s.a,{href:"#troubleshooting-url",children:(0,i.jsx)(s.strong,{children:"Troubleshooting URL"})})," section before trying this."]}),(0,i.jsxs)(s.p,{children:["At this point, you can try to use a different ",(0,i.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,i.jsx)(s.strong,{children:"Slug"})]}),'. Your service must be able to set a "fully custom" URL for Listenbrainz IE it must allow you to set more than just a domain/host.']})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"standard-base-url",children:"Standard Base URL"}),"\n",(0,i.jsxs)(s.p,{children:["In most scenarios you should use one of the following as the ",(0,i.jsx)(s.strong,{children:"base URL"})," when configuring your service to scrobble to multi-scrobbler:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/1/"})}),"\n"]}),"\n",(0,i.jsxs)(c,{type:"tip",summary:"Default Scrobble Submit URL",children:[(0,i.jsx)(s.p,{children:"Multi-scrobbler will accept Listenbrainz scrobbles at"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/1/submit-listens\n"})}),(0,i.jsxs)(s.p,{children:["which is the ",(0,i.jsx)(s.strong,{children:"standard"})," Listenbrainz server path for scrobbling."]})]}),"\n",(0,i.jsx)(s.h3,{id:"token",children:"Token"}),"\n",(0,i.jsxs)(s.p,{children:["Most Listenbrainz clients require an Authentication Token to be provided during setup. This value can be anything you want but ensure you use the same value for ",(0,i.jsx)(s.code,{children:"token"})," (ENV ",(0,i.jsx)(s.code,{children:"LZE_TOKEN"}),") in your configuration for this Listenbrainz Endpoint Source."]}),"\n",(0,i.jsx)(s.p,{children:"If your service does not require a token, or does not let you set one, then do not configure it for this Source either."}),"\n",(0,i.jsx)(s.h3,{id:"multiple-sources",children:"Multiple Sources"}),"\n",(0,i.jsxs)(s.p,{children:["If you need configure ",(0,i.jsx)(s.strong,{children:"more than one"})," Listenbrainz Endpoint Source then MS can differentiate scrobbles based on ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})," so that you can use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:(0,i.jsx)(s.strong,{children:"same, standard base URL"})})," for many users."]}),"\n",(0,i.jsxs)(s.p,{children:["However, if you cannot configure multiple tokens for your scenario you may also use a URL ",(0,i.jsx)(s.strong,{children:"Slug"})," to tell MS which Source belongs to a specific user. ",(0,i.jsx)(s.strong,{children:"This is not a common scenario"})," and should only be used if ",(0,i.jsx)(s.strong,{children:"Token"})," configuration is not sufficient or not possible."]}),"\n",(0,i.jsxs)(c,{type:"tip",summary:"Different URL Base (Slug)",children:[(0,i.jsxs)(s.p,{children:["When a ",(0,i.jsx)(s.strong,{children:"slug"})," is defined in ENV/File config MS will listen for listenbrainz ",(0,i.jsx)(s.code,{children:"submit-listens"})," requests using the slug as the base route path. Example:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"LZE_SLUG=foobar\n"})}),(0,i.jsxs)(s.p,{children:["MS will accept requests for ",(0,i.jsx)(s.code,{children:"submit-listens"})," (scrobble submissions and now playing) at"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/api/listenbrainz/foobar\nhttp://myMultiScrobblerIP:9078/api/listenbrainz/foobar/submit-listens\n"})})]}),"\n",(0,i.jsx)(s.h2,{id:"setup-for-popular-apps",children:"Setup for Popular Apps"}),"\n",(0,i.jsx)(s.h3,{id:"navidrome",children:"Navidrome"}),"\n",(0,i.jsx)(r,{children:(0,i.jsxs)(s.p,{children:["Set the ",(0,i.jsx)(s.a,{href:"https://www.navidrome.org/docs/usage/configuration-options/#advanced-configuration",children:(0,i.jsx)(s.strong,{children:"ListenBrainz.BaseURL"})})," (env ",(0,i.jsx)(s.code,{children:"ND_LISTENBRAINZ_BASEURL"}),") to ",(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/1/"})]})}),"\n",(0,i.jsx)(s.h3,{id:"music-assistant",children:"Music Assistant"}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://www.music-assistant.io/plugins/listenbrainz_scrobble/",children:"Music Assistant Docs"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["In your Music Assistant UI navigate to ",(0,i.jsx)(s.strong,{children:"Settings"})," -> ",(0,i.jsx)(s.strong,{children:"Plugins"})]}),"\n",(0,i.jsxs)(s.li,{children:["Click ",(0,i.jsx)(s.strong,{children:"Add a plugin"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Add ",(0,i.jsx)(s.strong,{children:"ListenBrainz Scrobbler"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["In the ListenBrainz Scrobbler configuration screen:","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["User Token is the ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})," you configured"]}),"\n",(0,i.jsxs)(s.li,{children:["Toggle ",(0,i.jsx)(s.strong,{children:"Show advanced settings"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Base URL is the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"URL"})," you can configured, or the equivalent of ",(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078"})," for your MS instance"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"Save the configuration and you are ready to scrobble"}),"\n"]}),(0,i.jsx)(s.p,{children:"To troubleshoot any errors, and assuming you are using Home Assistant, view the Logs in the Music Assistant Add-ons. Please include these logs in any reported issue."})]}),"\n",(0,i.jsx)(s.h2,{id:"troubleshooting-url",children:"Troubleshooting URL"}),"\n",(0,i.jsxs)(s.p,{children:["If you think your service should be able to use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," but it is not working follow these steps before trying the ",(0,i.jsx)(s.a,{href:"#multiple-sources",children:"the base URL Slug"}),"."]}),"\n",(0,i.jsx)(s.h4,{id:"verify-url-format",children:"Verify URL Format"}),"\n",(0,i.jsxs)(s.p,{children:["Some service may require ",(0,i.jsx)(s.code,{children:"http/https"})," in the URL format (",(0,i.jsx)(s.code,{children:"http://myMSDomainOrIp:9078"}),") while others may not (",(0,i.jsx)(s.code,{children:"myDomainOrIp:9078"}),"). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works."]}),"\n",(0,i.jsx)(c,{type:"note",summary:"Some Services Require HTTPS",children:(0,i.jsxs)(s.p,{children:["Some services that can scrobble to a custom Listenbrainz URL may require the URL to have a real domain (",(0,i.jsx)(s.code,{children:"example.com"}),") and/or use SSL (",(0,i.jsx)(s.code,{children:"https://"}),"). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality."]})}),"\n",(0,i.jsx)(s.h4,{id:"is-ms-is-reachable",children:"Is MS is Reachable?"}),"\n",(0,i.jsxs)(s.p,{children:["Verify that MS can be accessed by your service, or from the same host as the service is running. See the ",(0,i.jsx)(s.a,{href:"/FAQ/#ingress-connection",children:(0,i.jsx)(s.strong,{children:"FAQ"})})," for guidance on troubleshooting ingress connection issues."]}),"\n",(0,i.jsx)(s.h4,{id:"service-logging",children:"Service Logging"}),"\n",(0,i.jsx)(s.p,{children:"If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Listenbrainz account/user, or trying to make a scrobble request."}),"\n",(0,i.jsx)(s.p,{children:"If you decide to report this issue, please include this logging in your issue."}),"\n",(0,i.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n,{config:"ListenbrainzEndpointSourceConfig",fileContent:'[\n {\n "name": "LZ for Navidrome",\n "id": "myLzNavidrome",\n "enable": true,\n "data": {\n "token": "myToken"\n }\n }\n]\n',name:"endpointlz",children:(0,i.jsx)(a,{})})]})}function j(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}function f(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/a93ae359.a1767c63.js b/assets/js/a93ae359.a1767c63.js new file mode 100644 index 00000000..1777a196 --- /dev/null +++ b/assets/js/a93ae359.a1767c63.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7212"],{4814(e,s,n){n.r(s),n.d(s,{metadata:()=>r,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>b,assets:()=>u});var r=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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/listenbrainz-endpoint.mdx?plain=1","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"}}'),i=n(4848),t=n(8453),o=n(8194),l=n(698);function c(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"LZE_ID"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["A globally unique ID EX ",(0,i.jsx)(s.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_NAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsxs)(s.td,{children:["Value of ",(0,i.jsx)(s.code,{children:"LZE_ID"})]}),(0,i.jsxs)(s.td,{children:["A vanity name EX ",(0,i.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_ENABLE"})}),(0,i.jsx)(s.td,{children:"boolean"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_SLUG"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["When using ",(0,i.jsx)(s.strong,{children:"multiple sources without tokens"}),", or ",(0,i.jsx)(s.strong,{children:"not"})," using a standard base URL, this is the URL base path that should be used to identify scrobbles for this source"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_TOKEN"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"LZE_USERNAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:'The listenbrainz "username" to associate with this Source'})]})]})]})}function a(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}n(2170);let d={title:"Listenbrainz (Endpoint)",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},b=[{value:"Setup",id:"setup",level:2},{value:"Standard Base URL",id:"standard-base-url",level:3},{value:"Token",id:"token",level:3},{value:"Multiple Sources",id:"multiple-sources",level:3},{value:"Setup for Popular Apps",id:"setup-for-popular-apps",level:2},{value:"Navidrome",id:"navidrome",level:3},{value:"Music Assistant",id:"music-assistant",level:3},{value:"Troubleshooting URL",id:"troubleshooting-url",level:2},{value:"Verify URL Format",id:"verify-url-format",level:4},{value:"Is MS is Reachable?",id:"is-ms-is-reachable",level:4},{value:"Service Logging",id:"service-logging",level:4},{value:"Configuration",id:"configuration",level:2}];function x(e){let s={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Config:n,Details:r,DetailsAdmo:c}=s;return n||f("Config",!0),r||f("Details",!0),c||f("DetailsAdmo",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(s.p,{children:["This Source enables multi-scrobbler to accept scrobbles from outside applications ",(0,i.jsx)(s.strong,{children:"as if it was a Listenbrainz server."})]}),"\n",(0,i.jsx)(s.p,{children:'If your service/player has a "Scrobble to Listenbrainz" feature and there is an option to set the Listenbrainz URL then multi-scrobbler can accept scrobbles from that service/player by imitating a real Listenbrainz server.'}),"\n",(0,i.jsx)(s.admonition,{title:"Other Uses",type:"tip",children:(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["To ",(0,i.jsx)(s.strong,{children:"scrobble to"})," Listenbrainz, create a ",(0,i.jsx)(s.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz (Client)"})]}),"\n",(0,i.jsxs)(s.li,{children:["To monitor and re-scrobble activity from your Listenbrainz account, create a ",(0,i.jsx)(s.a,{href:"/configuration/sources/listenbrainz-source",children:"Listenbrainz (Source)"})]}),"\n"]})}),"\n",(0,i.jsx)(s.h2,{id:"setup",children:"Setup"}),"\n",(0,i.jsxs)(s.admonition,{title:"Scenario Picker",type:"tip",children:[(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.strong,{children:"one"}),' of the scenarios below based on how on your service(s) (things "scrobbling" to Multi-Scrobbler using this Source) will need to interact with MS.']}),(0,i.jsxs)(o.A,{groupId:"scenario",queryString:!0,children:[(0,i.jsxs)(l.A,{value:"single",label:"One Service",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"one"})," service, like Navidrome, that will scrobble to Multi-Scrobbler."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["Configure ",(0,i.jsx)(s.strong,{children:"one"})," Listenbrainz Endpoint Source. Use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and set a ",(0,i.jsx)(s.a,{href:"#token",children:"Token"}),", if necessary. Use the same ",(0,i.jsx)(s.strong,{children:"Token"})," in MS as you do in your service."]})]}),(0,i.jsxs)(l.A,{value:"multiple",label:"Many Services, Same User",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You may have ",(0,i.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same ",(0,i.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),"."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["Configure ",(0,i.jsx)(s.strong,{children:"one"})," Listenbrainz Endpoint Source. Use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," to configure your service and configure a ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})," in MS, if necessary. Use the same token for all your services as you configure in MS."]})]}),(0,i.jsxs)(l.A,{value:"multiple-tokens",label:"Many Services, Many Users, Can use Tokens",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,i.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"All"})," of these services can accept a ",(0,i.jsx)(s.strong,{children:"Token"})," to authenticate a Listenbrainz user/account."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["Configure one Listenbrainz Endpoint Sources ",(0,i.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,i.jsxs)(s.p,{children:["For each Listenbrainz Endpoint Source, configure a different ",(0,i.jsx)(s.a,{href:"#token",children:(0,i.jsx)(s.strong,{children:"Token"})}),". Use that same token when configuring Listenbrainz for the associated service."]}),(0,i.jsxs)(s.p,{children:["All Listenbrainz Endpoint Sources should use the same ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),"."]})]}),(0,i.jsxs)(l.A,{value:"multiple-slug",label:"Many Services, Many Users, Cannot use Tokens",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"more than one"})," service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["Some of these services should scrobble for different users, scrobble to different ",(0,i.jsx)(s.a,{href:"/configuration/clients",children:"Clients"}),", or generally be treated differently (such as for transforms)."]}),"\n",(0,i.jsxs)(s.p,{children:["All, or some, of these services ",(0,i.jsx)(s.strong,{children:"cannot"})," accept a ",(0,i.jsx)(s.strong,{children:"Token"})," to authenticate a Listenbrainz user/account."]}),"\n"]}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"This is not a common scenario"})," but if it fits your usecase then use these guidelines to differentiate your services:"]}),(0,i.jsxs)(s.p,{children:["Configure one Listenbrainz Endpoint Sources ",(0,i.jsx)(s.strong,{children:"per service that should be treated differently"}),'. That is, if multiple services are all "the same user" then you only need one Source for that entire group of services.']}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["For any groups of services that ",(0,i.jsx)(s.strong,{children:"can accept"})," a token, use the instructions for ",(0,i.jsx)(s.a,{href:"./?scenario=multiple-tokens#setup",children:"Many Services, Many Users, Can use Tokens"})]}),"\n",(0,i.jsxs)(s.li,{children:["For any groups of services that ",(0,i.jsx)(s.strong,{children:"cannot accept"})," a token...","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["You can still configure a Source ",(0,i.jsxs)(s.strong,{children:["without a ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})]}),'. Any services not using a token will use this "default" Source.']}),"\n",(0,i.jsxs)(s.li,{children:["If multiple groups cannot use a token, or the groups cannot use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"}),", then use different ",(0,i.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,i.jsx)(s.strong,{children:"Slugs"})]}),"."]}),"\n"]}),"\n"]}),"\n"]})]}),(0,i.jsxs)(l.A,{value:"slug",label:"Service cannot use standard URL",children:[(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["You have ",(0,i.jsx)(s.strong,{children:"one"})," service, like Navidrome, that will scrobble to Multi-Scrobbler."]}),"\n",(0,i.jsxs)(s.p,{children:["You have already tried the ",(0,i.jsx)(s.a,{href:"./?scenario=single#setup",children:(0,i.jsx)(s.strong,{children:"One Service"})})," scenario with both ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," and neither is working."]}),"\n"]}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"This is not a common scenario."})," Check the ",(0,i.jsx)(s.a,{href:"#troubleshooting-url",children:(0,i.jsx)(s.strong,{children:"Troubleshooting URL"})})," section before trying this."]}),(0,i.jsxs)(s.p,{children:["At this point, you can try to use a different ",(0,i.jsxs)(s.a,{href:"#multiple-sources",children:["base url ",(0,i.jsx)(s.strong,{children:"Slug"})]}),'. Your service must be able to set a "fully custom" URL for Listenbrainz IE it must allow you to set more than just a domain/host.']})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"standard-base-url",children:"Standard Base URL"}),"\n",(0,i.jsxs)(s.p,{children:["In most scenarios you should use one of the following as the ",(0,i.jsx)(s.strong,{children:"base URL"})," when configuring your service to scrobble to multi-scrobbler:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/1/"})}),"\n"]}),"\n",(0,i.jsxs)(c,{type:"tip",summary:"Default Scrobble Submit URL",children:[(0,i.jsx)(s.p,{children:"Multi-scrobbler will accept Listenbrainz scrobbles at"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/1/submit-listens\n"})}),(0,i.jsxs)(s.p,{children:["which is the ",(0,i.jsx)(s.strong,{children:"standard"})," Listenbrainz server path for scrobbling."]})]}),"\n",(0,i.jsx)(s.h3,{id:"token",children:"Token"}),"\n",(0,i.jsxs)(s.p,{children:["Most Listenbrainz clients require an Authentication Token to be provided during setup. This value can be anything you want but ensure you use the same value for ",(0,i.jsx)(s.code,{children:"token"})," (ENV ",(0,i.jsx)(s.code,{children:"LZE_TOKEN"}),") in your configuration for this Listenbrainz Endpoint Source."]}),"\n",(0,i.jsx)(s.p,{children:"If your service does not require a token, or does not let you set one, then do not configure it for this Source either."}),"\n",(0,i.jsx)(s.h3,{id:"multiple-sources",children:"Multiple Sources"}),"\n",(0,i.jsxs)(s.p,{children:["If you need configure ",(0,i.jsx)(s.strong,{children:"more than one"})," Listenbrainz Endpoint Source then MS can differentiate scrobbles based on ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})," so that you can use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:(0,i.jsx)(s.strong,{children:"same, standard base URL"})})," for many users."]}),"\n",(0,i.jsxs)(s.p,{children:["However, if you cannot configure multiple tokens for your scenario you may also use a URL ",(0,i.jsx)(s.strong,{children:"Slug"})," to tell MS which Source belongs to a specific user. ",(0,i.jsx)(s.strong,{children:"This is not a common scenario"})," and should only be used if ",(0,i.jsx)(s.strong,{children:"Token"})," configuration is not sufficient or not possible."]}),"\n",(0,i.jsxs)(c,{type:"tip",summary:"Different URL Base (Slug)",children:[(0,i.jsxs)(s.p,{children:["When a ",(0,i.jsx)(s.strong,{children:"slug"})," is defined in ENV/File config MS will listen for listenbrainz ",(0,i.jsx)(s.code,{children:"submit-listens"})," requests using the slug as the base route path. Example:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"LZE_SLUG=foobar\n"})}),(0,i.jsxs)(s.p,{children:["MS will accept requests for ",(0,i.jsx)(s.code,{children:"submit-listens"})," (scrobble submissions and now playing) at"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/api/listenbrainz/foobar\nhttp://myMultiScrobblerIP:9078/api/listenbrainz/foobar/submit-listens\n"})})]}),"\n",(0,i.jsx)(s.h2,{id:"setup-for-popular-apps",children:"Setup for Popular Apps"}),"\n",(0,i.jsx)(s.h3,{id:"navidrome",children:"Navidrome"}),"\n",(0,i.jsx)(r,{children:(0,i.jsxs)(s.p,{children:["Set the ",(0,i.jsx)(s.a,{href:"https://www.navidrome.org/docs/usage/configuration-options/#advanced-configuration",children:(0,i.jsx)(s.strong,{children:"ListenBrainz.BaseURL"})})," (env ",(0,i.jsx)(s.code,{children:"ND_LISTENBRAINZ_BASEURL"}),") to ",(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078/1/"})]})}),"\n",(0,i.jsx)(s.h3,{id:"music-assistant",children:"Music Assistant"}),"\n",(0,i.jsxs)(r,{children:[(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://www.music-assistant.io/plugins/listenbrainz_scrobble/",children:"Music Assistant Docs"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["In your Music Assistant UI navigate to ",(0,i.jsx)(s.strong,{children:"Settings"})," -> ",(0,i.jsx)(s.strong,{children:"Plugins"})]}),"\n",(0,i.jsxs)(s.li,{children:["Click ",(0,i.jsx)(s.strong,{children:"Add a plugin"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Add ",(0,i.jsx)(s.strong,{children:"ListenBrainz Scrobbler"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["In the ListenBrainz Scrobbler configuration screen:","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["User Token is the ",(0,i.jsx)(s.a,{href:"#token",children:"Token"})," you configured"]}),"\n",(0,i.jsxs)(s.li,{children:["Toggle ",(0,i.jsx)(s.strong,{children:"Show advanced settings"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Base URL is the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"URL"})," you can configured, or the equivalent of ",(0,i.jsx)(s.code,{children:"http://myMultiScrobblerIP:9078"})," for your MS instance"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"Save the configuration and you are ready to scrobble"}),"\n"]}),(0,i.jsx)(s.p,{children:"To troubleshoot any errors, and assuming you are using Home Assistant, view the Logs in the Music Assistant Add-ons. Please include these logs in any reported issue."})]}),"\n",(0,i.jsx)(s.h2,{id:"troubleshooting-url",children:"Troubleshooting URL"}),"\n",(0,i.jsxs)(s.p,{children:["If you think your service should be able to use the ",(0,i.jsx)(s.a,{href:"#standard-base-url",children:"standard base URL"})," but it is not working follow these steps before trying the ",(0,i.jsx)(s.a,{href:"#multiple-sources",children:"the base URL Slug"}),"."]}),"\n",(0,i.jsx)(s.h4,{id:"verify-url-format",children:"Verify URL Format"}),"\n",(0,i.jsxs)(s.p,{children:["Some service may require ",(0,i.jsx)(s.code,{children:"http/https"})," in the URL format (",(0,i.jsx)(s.code,{children:"http://myMSDomainOrIp:9078"}),") while others may not (",(0,i.jsx)(s.code,{children:"myDomainOrIp:9078"}),"). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works."]}),"\n",(0,i.jsx)(c,{type:"note",summary:"Some Services Require HTTPS",children:(0,i.jsxs)(s.p,{children:["Some services that can scrobble to a custom Listenbrainz URL may require the URL to have a real domain (",(0,i.jsx)(s.code,{children:"example.com"}),") and/or use SSL (",(0,i.jsx)(s.code,{children:"https://"}),"). In this case you should setup multi-scrobbler behind a reverse proxy to support this functionality."]})}),"\n",(0,i.jsx)(s.h4,{id:"is-ms-is-reachable",children:"Is MS is Reachable?"}),"\n",(0,i.jsxs)(s.p,{children:["Verify that MS can be accessed by your service, or from the same host as the service is running. See the ",(0,i.jsx)(s.a,{href:"/FAQ/#ingress-connection",children:(0,i.jsx)(s.strong,{children:"FAQ"})})," for guidance on troubleshooting ingress connection issues."]}),"\n",(0,i.jsx)(s.h4,{id:"service-logging",children:"Service Logging"}),"\n",(0,i.jsx)(s.p,{children:"If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Listenbrainz account/user, or trying to make a scrobble request."}),"\n",(0,i.jsx)(s.p,{children:"If you decide to report this issue, please include this logging in your issue."}),"\n",(0,i.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n,{config:"ListenbrainzEndpointSourceConfig",fileContent:'[\n {\n "name": "LZ for Navidrome",\n "id": "myLzNavidrome",\n "enable": true,\n "data": {\n "token": "myToken"\n }\n }\n]\n',name:"endpointlz",children:(0,i.jsx)(a,{})})]})}function j(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}function f(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/ad895e75.13e7b34f.js b/assets/js/ad895e75.13e7b34f.js deleted file mode 100644 index 3bc4cb27..00000000 --- a/assets/js/ad895e75.13e7b34f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8160"],{1943(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>d,frontMatter:()=>r,contentTitle:()=>l,toc:()=>a,assets:()=>c});var s=JSON.parse('{"id":"FAQ","title":"FAQ","description":"Connection Issues","source":"@site/docs/FAQ.md","sourceDirName":".","slug":"/FAQ","permalink":"/multi-scrobbler/FAQ","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/FAQ.md?plain=1","tags":[],"version":"current","frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"title":"FAQ"},"sidebar":"tutorialSidebar","previous":{"title":"Flatpak","permalink":"/multi-scrobbler/development/flatpak"},"next":{"title":"Help","permalink":"/multi-scrobbler/help"}}'),t=i(4848),o=i(8453);let r={toc_min_heading_level:2,toc_max_heading_level:5,title:"FAQ"},l,c={},a=[{value:"Connection Issues",id:"connection-issues",level:2},{value:"Webscrobbler/Listenbrainz Endpoint doesn't connect",id:"ingress-connection",level:3},{value:"Troubleshooting",id:"troubleshooting",level:4},{value:"Turn on Debug Logging",id:"turn-on-debug-logging",level:5},{value:"Check Host name and URL",id:"check-host-name-and-url",level:5},{value:"Check Firewall and Port Forwarding",id:"check-firewall-and-port-forwarding",level:5},{value:"Check Source Service Logs",id:"check-source-service-logs",level:5},{value:"Webscrobbler",id:"webscrobbler",level:6},{value:"Spotify/Deezer/LastFM won't authenticate",id:"spotifydeezerlastfm-wont-authenticate",level:3},{value:"I get errors with <code>ECONNRESET</code> <code>ETIMEDOUT</code> <code>ENOTFOUND</code> <code>EAI_AGAIN</code>",id:"i-get-errors-with-econnreset-etimedout-enotfound-eai_again",level:3},{value:"Youtube Music fails after some time",id:"youtube-music-fails-after-some-time",level:3},{value:"When using OAuth Client Authentication",id:"when-using-oauth-client-authentication",level:4},{value:"When using Cookies Authentication",id:"when-using-cookies-authentication",level:4},{value:"Configuration Issues",id:"configuration-issues",level:2},{value:"Config could not be parsed",id:"config-could-not-be-parsed",level:3},{value:"Scrobbling Issues",id:"scrobbling-issues",level:2},{value:"How do I prevent duplicate scrobbles?",id:"how-do-i-prevent-duplicate-scrobbles",level:3},{value:"Last.fm does not scrobble tracks with multiple artists correctly",id:"lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly",level:3},{value:"Google Cast track information is missing/incorrect or MS player has weird times",id:"google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times",level:3},{value:"Google Cast device does not track media",id:"google-cast-device-does-not-track-media",level:3},{value:"VLC is not scrobbling fields correctly",id:"vlc-is-not-scrobbling-fields-correctly",level:3},{value:"Youtube Music misses or duplicates scrobbles",id:"youtube-music-misses-or-duplicates-scrobbles",level:3},{value:"Reporting YTM scrobble issues",id:"reporting-ytm-scrobble-issues",level:4},{value:"Turn on Change Detection",id:"turn-on-change-detection",level:5},{value:"Turn on File Logging",id:"turn-on-file-logging",level:5},{value:"Provide Detail and Context",id:"provide-detail-and-context",level:5}];function h(e){let n={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...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,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"connection-issues",children:"Connection Issues"}),"\n",(0,t.jsx)(n.h3,{id:"ingress-connection",children:"Webscrobbler/Listenbrainz Endpoint doesn't connect"}),"\n",(0,t.jsxs)(n.p,{children:["These sources are ",(0,t.jsx)(n.strong,{children:"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."]}),"\n",(0,t.jsx)(n.p,{children:"multi-scrobbler will log information about any server that connects to it for these services. In the logs it looks something like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[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)\n[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.\n"})}),"\n",(0,t.jsx)(n.p,{children:"It also logs if a server tries to connect to a URL that it does not recognize:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"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\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"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."})}),"\n",(0,t.jsx)(n.p,{children:"This is not something multi-scrobbler can fix and means you have an issue in your network."}),"\n",(0,t.jsx)(n.h4,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsx)(n.p,{children:"Check or try all these steps before submitting an issue:"}),"\n",(0,t.jsx)(n.h5,{id:"turn-on-debug-logging",children:"Turn on Debug Logging"}),"\n",(0,t.jsxs)(n.p,{children:["First, turn on ",(0,t.jsx)(n.strong,{children:"debug"})," logging for multi-scrobbler by setting the environmental variable ",(0,t.jsx)(n.code,{children:"DEBUG_MODE=true"}),". Then, check the output for any additional information."]}),"\n",(0,t.jsx)(n.h5,{id:"check-host-name-and-url",children:"Check Host name and URL"}),"\n",(0,t.jsxs)(n.p,{children:["The URLs examples in the ",(0,t.jsx)(n.a,{href:"/configuration#base-url",children:"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 ",(0,t.jsx)(n.code,{children:"localhost"})," when configuring these sources. ",(0,t.jsx)(n.strong,{children:"This is likely the same host name that you would use to access the web interface for multi-scrobbler."})]}),"\n",(0,t.jsxs)(n.p,{children:["EX ",(0,t.jsx)(n.code,{children:"http://localhost:9078/api/webscrobbler"})," -> ",(0,t.jsx)(n.code,{children:"http://192.168.0.140:9078/api/webscrobbler"})]}),"\n",(0,t.jsx)(n.h5,{id:"check-firewall-and-port-forwarding",children:"Check Firewall and Port Forwarding"}),"\n",(0,t.jsxs)(n.p,{children:["If the machine multi-scrobbler is running on has a firewall ensure that port ",(0,t.jsx)(n.strong,{children:"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."]}),"\n",(0,t.jsx)(n.h5,{id:"check-source-service-logs",children:"Check Source Service Logs"}),"\n",(0,t.jsx)(n.h6,{id:"webscrobbler",children:"Webscrobbler"}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"https://github.com/web-scrobbler/web-scrobbler/wiki/Debug-the-extension",children:"Debugging the extension"})," to get logs which should have information about failed requests."]}),"\n",(0,t.jsx)(n.h3,{id:"spotifydeezerlastfm-wont-authenticate",children:"Spotify/Deezer/LastFM won't authenticate"}),"\n",(0,t.jsxs)(n.p,{children:["Ensure any ",(0,t.jsx)(n.strong,{children:"client id"})," or ",(0,t.jsx)(n.strong,{children:"secrets"})," are correct in your configuration."]}),"\n",(0,t.jsx)(n.p,{children:"The callback/redirect URL for these services must be:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["the same address you would use to access the multi-scrobbler web interface","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the web-interface must be accessible from the browser you are completing authentication from."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If multi-scrobbler is not running on the same machine your browser is on then the default/example addresses (",(0,t.jsx)(n.code,{children:"http://localhost..."}),") ",(0,t.jsx)(n.strong,{children:"will not work."})," You must determine the address you can reach the web interface at (such as ",(0,t.jsx)(n.code,{children:"http://192.168.0.140:9078"}),") then use that in place of ",(0,t.jsx)(n.code,{children:"localhost"})," in the callback URLs."]}),"\n",(0,t.jsxs)(n.p,{children:["EX ",(0,t.jsx)(n.code,{children:"http://localhost:9078/lastfm/callback"})," -> ",(0,t.jsx)(n.code,{children:"http://192.168.0.220:9078/lastfm/callback"})]}),"\n",(0,t.jsxs)(n.h3,{id:"i-get-errors-with-econnreset-etimedout-enotfound-eai_again",children:["I get errors with ",(0,t.jsx)(n.code,{children:"ECONNRESET"})," ",(0,t.jsx)(n.code,{children:"ETIMEDOUT"})," ",(0,t.jsx)(n.code,{children:"ENOTFOUND"})," ",(0,t.jsx)(n.code,{children:"EAI_AGAIN"})]}),"\n",(0,t.jsx)(n.p,{children:"These are errors indicating a network issue is occuring between you and the Source/Client."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ECONNRESET"})," means the upstream service unexpectedly closed the connection"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ETIMEDOUT"})," means the upstream service did not respond to a request MS"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENOTFOUND"})," means that MS could not find a DNS record for the domain of the upstream service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"EAI_AGAIN"})," means that a DNS server did not respond to MS's request to lookup the record for a domain"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"ECONNRESET"})," and timeout issues can occur when you have a poor connection or if the upstream service is overloaded or is generally not behaving well. This is a common occurrence for Listenbrainz/Musicbrainz related requests."]}),"\n",(0,t.jsxs)(n.p,{children:["Please check the ",(0,t.jsx)(n.a,{href:"https://status.multi-scrobbler.app",children:"Upstream Services Status Page"})," to independently verify if the service is misbehaving. If the service is up and has good uptime then the issue may be in your network."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"ENOTFOUND"})," and ",(0,t.jsx)(n.code,{children:"EAI_AGAIN"})," and generally caused by DNS caching (stale records) or misbehaving DNS servers. Though this can happen at the upstream service's end, it is ",(0,t.jsx)(n.em,{children:"usually"})," an issue in your network. If you run a Pihole, AdGaurd, or other DNS solution try flushing the cache for the mishaving domain and check that your DNS application is working correctly."]}),"\n",(0,t.jsx)(n.h3,{id:"youtube-music-fails-after-some-time",children:"Youtube Music fails after some time"}),"\n",(0,t.jsxs)(n.p,{children:["If you see errors in multi-scrobbler for YTM that contain ",(0,t.jsx)(n.strong,{children:"401"})," or ",(0,t.jsx)(n.strong,{children:"403"})," like"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Error: Could not send the specified request to browse. Status code: 401\n"})}),"\n",(0,t.jsx)(n.p,{children:"then YTM has invalidated your authentication."}),"\n",(0,t.jsxs)(n.p,{children:["First, ensure you are NOT using ",(0,t.jsx)(n.a,{href:"/configuration/sources/youtube-music?ytmAuth=ytt#ytm-auth",children:"YoutubeTV authentication."}),' If you completed authentication by entering a "User Code" you are using YoutubeTV which has stopped working. You should reauthenticate using ',(0,t.jsx)(n.strong,{children:"Cookies"})," or ",(0,t.jsx)(n.strong,{children:"Custom OAuth."})]}),"\n",(0,t.jsx)(n.h4,{id:"when-using-oauth-client-authentication",children:"When using OAuth Client Authentication"}),"\n",(0,t.jsxs)(n.p,{children:["Refresh your authentication by using the ",(0,t.jsx)(n.strong,{children:"(Re)authenticate"})," link from MS's web dashboard."]}),"\n",(0,t.jsx)(n.h4,{id:"when-using-cookies-authentication",children:"When using Cookies Authentication"}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.em,{children:"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 ",(0,t.jsx)(n.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2504032666",children:"getting the cookie from an Incognito/Private Session"})," and then immediately closing the browser afterwards."]}),"\n",(0,t.jsxs)(n.p,{children:["To re-authenticate MS ",(0,t.jsx)(n.a,{href:"/configuration/sources/youtube-music?ytmAuth=cookie#ytm-auth",children:"follow the YTM instructions to retrieve a new set of cookies for multi-scrobbler"})," and then restart MS to potentially resolve the problem."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-issues",children:"Configuration Issues"}),"\n",(0,t.jsx)(n.h3,{id:"config-could-not-be-parsed",children:"Config could not be parsed"}),"\n",(0,t.jsx)(n.p,{children:"If you see something like this in your logs:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"2023-02-19T10:05:42-06:00 warn : [App] App config file exists but could not be parsed!\n2023-02-19T10:05:42-06:00 error : [App] Exited with uncaught error\n2023-02-19T10:05:42-06:00 error : [App] Error: config.json could not be parsed\n"})}),"\n",(0,t.jsxs)(n.p,{children:["It means the JSON in your configuration file is not valid. Copy and paste your configuration into a site like ",(0,t.jsx)(n.a,{href:"https://jsonlint.com/",children:"JSONLint"})," to find out where errors you have and fix them."]}),"\n",(0,t.jsx)(n.h2,{id:"scrobbling-issues",children:"Scrobbling Issues"}),"\n",(0,t.jsx)(n.h3,{id:"how-do-i-prevent-duplicate-scrobbles",children:"How do I prevent duplicate scrobbles?"}),"\n",(0,t.jsxs)(n.p,{children:["Multi-scrobbler has a ",(0,t.jsx)(n.a,{href:"/configuration/duplicates#how-duplicates-are-detected",children:"robust duplicate scrobble detection system"})," that should handle this for you in the majority of usecases. If you have a ",(0,t.jsx)(n.a,{href:"/configuration/duplicates#valid-configs",children:"simple setup without any circular dependencies"})," then you are already protected against duplicates."]}),"\n",(0,t.jsxs)(n.p,{children:["If your scenario is more complex or you have a service(s) acting as ",(0,t.jsx)(n.strong,{children:"both"})," a ",(0,t.jsx)(n.strong,{children:"Client"})," and ",(0,t.jsx)(n.strong,{children:"Source"})," you should refer to the ",(0,t.jsx)(n.a,{href:"/configuration/duplicates#valid-configs",children:(0,t.jsx)(n.strong,{children:"Duplicate Scrobble Guidance"})})," page to determine if you can avoid a configuration that may result in duplicate scrobbles."]}),"\n",(0,t.jsx)(n.h3,{id:"lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly",children:"Last.fm does not scrobble tracks with multiple artists correctly"}),"\n",(0,t.jsxs)(n.p,{children:["This is a limitation of the ",(0,t.jsx)(n.a,{href:"https://www.last.fm/api/show/track.scrobble",children:"Last.fm API"})," where the ",(0,t.jsx)(n.strong,{children:"artist"}),' field is only one string and Last.fm does not recognize (play well) with "combined" artists.']}),"\n",(0,t.jsxs)(n.p,{children:["Multi-scrobbler works the same was the official Spotify-Last.fm integration works -- it only scrobbles the ",(0,t.jsx)(n.strong,{children:"first"})," artist on a multi-artist track."]}),"\n",(0,t.jsx)(n.h3,{id:"google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times",children:"Google Cast track information is missing/incorrect or MS player has weird times"}),"\n",(0,t.jsxs)(n.p,{children:["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...) ",(0,t.jsx)(n.em,{children:"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."]}),"\n",(0,t.jsxs)(n.p,{children:["To diagnose these issues you ",(0,t.jsx)(n.a,{href:"/configuration/sources/google-cast#cast-troubleshooting",children:(0,t.jsx)(n.strong,{children:"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."]}),"\n",(0,t.jsx)(n.h3,{id:"google-cast-device-does-not-track-media",children:"Google Cast device does not track media"}),"\n",(0,t.jsxs)(n.p,{children:["It is likely the app playing on the cast device is incorrectly reporting the media type as ",(0,t.jsx)(n.strong,{children:"not music"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"MS logs will tell you what type the media is reported as with lines like:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"My Artist - Example Track has 'unknown' media type and allowUnknownMedia=false, will not track\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/configuration/sources/google-cast#allow-unknown-media-type",children:"Allow Unknown Media Type"})," section to fix this"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"My Artist - Example Track has 'movie' media type so will not track\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/configuration/sources/google-cast#forcing-media-tracking",children:"Force Media Tracking"})," section to fix this"]}),"\n",(0,t.jsx)(n.h3,{id:"vlc-is-not-scrobbling-fields-correctly",children:"VLC is not scrobbling fields correctly"}),"\n",(0,t.jsxs)(n.p,{children:["Before reporting an issue turn on metadata logging in the MS VLC configuration, ",(0,t.jsx)(n.a,{href:"/configuration/sources/vlc#vlc-information-reporting",children:"see the VLC documentation."})]}),"\n",(0,t.jsx)(n.h3,{id:"youtube-music-misses-or-duplicates-scrobbles",children:"Youtube Music misses or duplicates scrobbles"}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:"How MS detects YTM history"}),(0,t.jsxs)(n.p,{children:["In order for multi-scrobbler to accurately determine if a song has been scrobbled it needs ",(0,t.jsx)(n.strong,{children:"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).']}),(0,t.jsx)(n.p,{children:'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.'}),(0,t.jsx)(n.p,{children:'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.'})]}),"\n",(0,t.jsx)(n.h4,{id:"reporting-ytm-scrobble-issues",children:"Reporting YTM scrobble issues"}),"\n",(0,t.jsxs)(n.p,{children:["If you experience scrobble detection issues you can help improve MS's YTM heureistic by providing thorough feedback as ",(0,t.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?assignees=&labels=bug&projects=&template=01-bug-report.yml&title=bug%3A+",children:"an issue."})," ",(0,t.jsx)(n.strong,{children:"Please do the following to provide the most useful report:"})]}),"\n",(0,t.jsx)(n.h5,{id:"turn-on-change-detection",children:"Turn on Change Detection"}),"\n",(0,t.jsxs)(n.p,{children:["In your YTM configuration (",(0,t.jsx)(n.code,{children:"ytmusic.json"}),") add ",(0,t.jsx)(n.code,{children:"logDiff"})," under ",(0,t.jsx)(n.code,{children:"options"})," like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "name": "MyYTM",\n "data": { ... },\n "options": {\n "logDiff": true\n }\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"or set either ENVs:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"YTM_LOG_DIFF=true"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/configuration#debug-mode",children:(0,t.jsx)(n.code,{children:"DEBUG_MODE=true"})})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This will cause MS to log YTM history changes similar to this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[Ytmusic - MyYTM] Changes from last seen list:\n1. (tuhe1CpHRxY) KNOWER - I\u2019m The President --- undefined => Moved - Originally at 6\n2. (Mtg8V6Xa2nc) Vulfpeck - Romanian Drinking Song --- Schvitz => Moved - Originally at 1\n3. (rxbCaiyYSXM) Nightmares On Wax - You Wish --- In A Space Outta Sound => Moved - Originally at 2\n4. (tMt_YXr90AM) Gorillaz - O Green World --- undefined => Moved - Originally at 3\n...\n"})}),"\n",(0,t.jsx)(n.p,{children:"Which are essential to troubleshooting this behavior."}),"\n",(0,t.jsx)(n.h5,{id:"turn-on-file-logging",children:"Turn on File Logging"}),"\n",(0,t.jsxs)(n.p,{children:["Optionally, if your logs are busy due to many other sources, you can log ",(0,t.jsx)(n.strong,{children:"only"})," YTM logs to a file. Turn this on with the ",(0,t.jsx)(n.code,{children:"logToFile"})," config option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "name": "MyYTM",\n "data": { ... },\n "options": {\n "logDiff": true,\n "logToFile": true\n }\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["This will cause MS to write YTM logs to a file in your ",(0,t.jsx)(n.code,{children:"logs"})," folder named ",(0,t.jsx)(n.code,{children:"ytmusic-MyYTM.log"})," (based on your source name)."]}),"\n",(0,t.jsx)(n.h5,{id:"provide-detail-and-context",children:"Provide Detail and Context"}),"\n",(0,t.jsx)(n.p,{children:"Provide a detailed account of how you were using YTM when the issue occurred, including things like:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the platform listening on (desktop, mobile, 3rd party client, etc...)"}),"\n",(0,t.jsxs)(n.li,{children:["any changes in platform","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"I switched from desktop to listening on my phone..."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["how you were listening to music","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"I was playing an album start to finish"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"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..."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"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)"}),"\n",(0,t.jsx)(n.p,{children:"Provide ALL logs from the time when the issue occurred including logs from BEFORE (ideally 2-3 minutes of logs) and AFTER the issue."})]})}function d(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/ad895e75.1c516a11.js b/assets/js/ad895e75.1c516a11.js new file mode 100644 index 00000000..88bf04aa --- /dev/null +++ b/assets/js/ad895e75.1c516a11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8160"],{1943(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>d,frontMatter:()=>r,contentTitle:()=>l,toc:()=>a,assets:()=>c});var s=JSON.parse('{"id":"FAQ","title":"FAQ","description":"Connection Issues","source":"@site/docs/FAQ.md","sourceDirName":".","slug":"/FAQ","permalink":"/multi-scrobbler/FAQ","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/FAQ.md?plain=1","tags":[],"version":"current","frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"title":"FAQ"},"sidebar":"tutorialSidebar","previous":{"title":"Flatpak","permalink":"/multi-scrobbler/development/flatpak"},"next":{"title":"Help","permalink":"/multi-scrobbler/help"}}'),t=i(4848),o=i(8453);let r={toc_min_heading_level:2,toc_max_heading_level:5,title:"FAQ"},l,c={},a=[{value:"Connection Issues",id:"connection-issues",level:2},{value:"Webscrobbler/Listenbrainz Endpoint doesn't connect",id:"ingress-connection",level:3},{value:"Troubleshooting",id:"troubleshooting",level:4},{value:"Turn on Debug Logging",id:"turn-on-debug-logging",level:5},{value:"Check Host name and URL",id:"check-host-name-and-url",level:5},{value:"Check Firewall and Port Forwarding",id:"check-firewall-and-port-forwarding",level:5},{value:"Check Source Service Logs",id:"check-source-service-logs",level:5},{value:"Webscrobbler",id:"webscrobbler",level:6},{value:"Spotify/Deezer/LastFM won't authenticate",id:"spotifydeezerlastfm-wont-authenticate",level:3},{value:"I get errors with <code>ECONNRESET</code> <code>ETIMEDOUT</code> <code>ENOTFOUND</code> <code>EAI_AGAIN</code>",id:"i-get-errors-with-econnreset-etimedout-enotfound-eai_again",level:3},{value:"Youtube Music fails after some time",id:"youtube-music-fails-after-some-time",level:3},{value:"When using OAuth Client Authentication",id:"when-using-oauth-client-authentication",level:4},{value:"When using Cookies Authentication",id:"when-using-cookies-authentication",level:4},{value:"Configuration Issues",id:"configuration-issues",level:2},{value:"Config could not be parsed",id:"config-could-not-be-parsed",level:3},{value:"Scrobbling Issues",id:"scrobbling-issues",level:2},{value:"How do I prevent duplicate scrobbles?",id:"how-do-i-prevent-duplicate-scrobbles",level:3},{value:"Last.fm does not scrobble tracks with multiple artists correctly",id:"lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly",level:3},{value:"Google Cast track information is missing/incorrect or MS player has weird times",id:"google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times",level:3},{value:"Google Cast device does not track media",id:"google-cast-device-does-not-track-media",level:3},{value:"VLC is not scrobbling fields correctly",id:"vlc-is-not-scrobbling-fields-correctly",level:3},{value:"Youtube Music misses or duplicates scrobbles",id:"youtube-music-misses-or-duplicates-scrobbles",level:3},{value:"Reporting YTM scrobble issues",id:"reporting-ytm-scrobble-issues",level:4},{value:"Turn on Change Detection",id:"turn-on-change-detection",level:5},{value:"Turn on File Logging",id:"turn-on-file-logging",level:5},{value:"Provide Detail and Context",id:"provide-detail-and-context",level:5}];function h(e){let n={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...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,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"connection-issues",children:"Connection Issues"}),"\n",(0,t.jsx)(n.h3,{id:"ingress-connection",children:"Webscrobbler/Listenbrainz Endpoint doesn't connect"}),"\n",(0,t.jsxs)(n.p,{children:["These sources are ",(0,t.jsx)(n.strong,{children:"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."]}),"\n",(0,t.jsx)(n.p,{children:"multi-scrobbler will log information about any server that connects to it for these services. In the logs it looks something like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[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)\n[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.\n"})}),"\n",(0,t.jsx)(n.p,{children:"It also logs if a server tries to connect to a URL that it does not recognize:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"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\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"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."})}),"\n",(0,t.jsx)(n.p,{children:"This is not something multi-scrobbler can fix and means you have an issue in your network."}),"\n",(0,t.jsx)(n.h4,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsx)(n.p,{children:"Check or try all these steps before submitting an issue:"}),"\n",(0,t.jsx)(n.h5,{id:"turn-on-debug-logging",children:"Turn on Debug Logging"}),"\n",(0,t.jsxs)(n.p,{children:["First, turn on ",(0,t.jsx)(n.strong,{children:"debug"})," logging for multi-scrobbler by setting the environmental variable ",(0,t.jsx)(n.code,{children:"DEBUG_MODE=true"}),". Then, check the output for any additional information."]}),"\n",(0,t.jsx)(n.h5,{id:"check-host-name-and-url",children:"Check Host name and URL"}),"\n",(0,t.jsxs)(n.p,{children:["The URLs examples in the ",(0,t.jsx)(n.a,{href:"/configuration#base-url",children:"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 ",(0,t.jsx)(n.code,{children:"localhost"})," when configuring these sources. ",(0,t.jsx)(n.strong,{children:"This is likely the same host name that you would use to access the web interface for multi-scrobbler."})]}),"\n",(0,t.jsxs)(n.p,{children:["EX ",(0,t.jsx)(n.code,{children:"http://localhost:9078/api/webscrobbler"})," -> ",(0,t.jsx)(n.code,{children:"http://192.168.0.140:9078/api/webscrobbler"})]}),"\n",(0,t.jsx)(n.h5,{id:"check-firewall-and-port-forwarding",children:"Check Firewall and Port Forwarding"}),"\n",(0,t.jsxs)(n.p,{children:["If the machine multi-scrobbler is running on has a firewall ensure that port ",(0,t.jsx)(n.strong,{children:"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."]}),"\n",(0,t.jsx)(n.h5,{id:"check-source-service-logs",children:"Check Source Service Logs"}),"\n",(0,t.jsx)(n.h6,{id:"webscrobbler",children:"Webscrobbler"}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"https://github.com/web-scrobbler/web-scrobbler/wiki/Debug-the-extension",children:"Debugging the extension"})," to get logs which should have information about failed requests."]}),"\n",(0,t.jsx)(n.h3,{id:"spotifydeezerlastfm-wont-authenticate",children:"Spotify/Deezer/LastFM won't authenticate"}),"\n",(0,t.jsxs)(n.p,{children:["Ensure any ",(0,t.jsx)(n.strong,{children:"client id"})," or ",(0,t.jsx)(n.strong,{children:"secrets"})," are correct in your configuration."]}),"\n",(0,t.jsx)(n.p,{children:"The callback/redirect URL for these services must be:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["the same address you would use to access the multi-scrobbler web interface","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the web-interface must be accessible from the browser you are completing authentication from."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If multi-scrobbler is not running on the same machine your browser is on then the default/example addresses (",(0,t.jsx)(n.code,{children:"http://localhost..."}),") ",(0,t.jsx)(n.strong,{children:"will not work."})," You must determine the address you can reach the web interface at (such as ",(0,t.jsx)(n.code,{children:"http://192.168.0.140:9078"}),") then use that in place of ",(0,t.jsx)(n.code,{children:"localhost"})," in the callback URLs."]}),"\n",(0,t.jsxs)(n.p,{children:["EX ",(0,t.jsx)(n.code,{children:"http://localhost:9078/lastfm/callback"})," -> ",(0,t.jsx)(n.code,{children:"http://192.168.0.220:9078/lastfm/callback"})]}),"\n",(0,t.jsxs)(n.h3,{id:"i-get-errors-with-econnreset-etimedout-enotfound-eai_again",children:["I get errors with ",(0,t.jsx)(n.code,{children:"ECONNRESET"})," ",(0,t.jsx)(n.code,{children:"ETIMEDOUT"})," ",(0,t.jsx)(n.code,{children:"ENOTFOUND"})," ",(0,t.jsx)(n.code,{children:"EAI_AGAIN"})]}),"\n",(0,t.jsx)(n.p,{children:"These are errors indicating a network issue is occuring between you and the Source/Client."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ECONNRESET"})," means the upstream service unexpectedly closed the connection"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ETIMEDOUT"})," means the upstream service did not respond to a request MS"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENOTFOUND"})," means that MS could not find a DNS record for the domain of the upstream service"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"EAI_AGAIN"})," means that a DNS server did not respond to MS's request to lookup the record for a domain"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"ECONNRESET"})," and timeout issues can occur when you have a poor connection or if the upstream service is overloaded or is generally not behaving well. This is a common occurrence for Listenbrainz/Musicbrainz related requests."]}),"\n",(0,t.jsxs)(n.p,{children:["Please check the ",(0,t.jsx)(n.a,{href:"https://status.multi-scrobbler.app",children:"Upstream Services Status Page"})," to independently verify if the service is misbehaving. If the service is up and has good uptime then the issue may be in your network."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"ENOTFOUND"})," and ",(0,t.jsx)(n.code,{children:"EAI_AGAIN"})," and generally caused by DNS caching (stale records) or misbehaving DNS servers. Though this can happen at the upstream service's end, it is ",(0,t.jsx)(n.em,{children:"usually"})," an issue in your network. If you run a Pihole, AdGaurd, or other DNS solution try flushing the cache for the mishaving domain and check that your DNS application is working correctly."]}),"\n",(0,t.jsx)(n.h3,{id:"youtube-music-fails-after-some-time",children:"Youtube Music fails after some time"}),"\n",(0,t.jsxs)(n.p,{children:["If you see errors in multi-scrobbler for YTM that contain ",(0,t.jsx)(n.strong,{children:"401"})," or ",(0,t.jsx)(n.strong,{children:"403"})," like"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Error: Could not send the specified request to browse. Status code: 401\n"})}),"\n",(0,t.jsx)(n.p,{children:"then YTM has invalidated your authentication."}),"\n",(0,t.jsxs)(n.p,{children:["First, ensure you are NOT using ",(0,t.jsx)(n.a,{href:"/configuration/sources/youtube-music?ytmAuth=ytt#ytm-auth",children:"YoutubeTV authentication."}),' If you completed authentication by entering a "User Code" you are using YoutubeTV which has stopped working. You should reauthenticate using ',(0,t.jsx)(n.strong,{children:"Cookies"})," or ",(0,t.jsx)(n.strong,{children:"Custom OAuth."})]}),"\n",(0,t.jsx)(n.h4,{id:"when-using-oauth-client-authentication",children:"When using OAuth Client Authentication"}),"\n",(0,t.jsxs)(n.p,{children:["Refresh your authentication by using the ",(0,t.jsx)(n.strong,{children:"(Re)authenticate"})," link from MS's web dashboard."]}),"\n",(0,t.jsx)(n.h4,{id:"when-using-cookies-authentication",children:"When using Cookies Authentication"}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.em,{children:"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 ",(0,t.jsx)(n.a,{href:"https://github.com/LuanRT/YouTube.js/issues/803#issuecomment-2504032666",children:"getting the cookie from an Incognito/Private Session"})," and then immediately closing the browser afterwards."]}),"\n",(0,t.jsxs)(n.p,{children:["To re-authenticate MS ",(0,t.jsx)(n.a,{href:"/configuration/sources/youtube-music?ytmAuth=cookie#ytm-auth",children:"follow the YTM instructions to retrieve a new set of cookies for multi-scrobbler"})," and then restart MS to potentially resolve the problem."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-issues",children:"Configuration Issues"}),"\n",(0,t.jsx)(n.h3,{id:"config-could-not-be-parsed",children:"Config could not be parsed"}),"\n",(0,t.jsx)(n.p,{children:"If you see something like this in your logs:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"2023-02-19T10:05:42-06:00 warn : [App] App config file exists but could not be parsed!\n2023-02-19T10:05:42-06:00 error : [App] Exited with uncaught error\n2023-02-19T10:05:42-06:00 error : [App] Error: config.json could not be parsed\n"})}),"\n",(0,t.jsxs)(n.p,{children:["It means the JSON in your configuration file is not valid. Copy and paste your configuration into a site like ",(0,t.jsx)(n.a,{href:"https://jsonlint.com/",children:"JSONLint"})," to find out where errors you have and fix them."]}),"\n",(0,t.jsx)(n.h2,{id:"scrobbling-issues",children:"Scrobbling Issues"}),"\n",(0,t.jsx)(n.h3,{id:"how-do-i-prevent-duplicate-scrobbles",children:"How do I prevent duplicate scrobbles?"}),"\n",(0,t.jsxs)(n.p,{children:["Multi-scrobbler has a ",(0,t.jsx)(n.a,{href:"/configuration/duplicates#how-duplicates-are-detected",children:"robust duplicate scrobble detection system"})," that should handle this for you in the majority of usecases. If you have a ",(0,t.jsx)(n.a,{href:"/configuration/duplicates#valid-configs",children:"simple setup without any circular dependencies"})," then you are already protected against duplicates."]}),"\n",(0,t.jsxs)(n.p,{children:["If your scenario is more complex or you have a service(s) acting as ",(0,t.jsx)(n.strong,{children:"both"})," a ",(0,t.jsx)(n.strong,{children:"Client"})," and ",(0,t.jsx)(n.strong,{children:"Source"})," you should refer to the ",(0,t.jsx)(n.a,{href:"/configuration/duplicates#valid-configs",children:(0,t.jsx)(n.strong,{children:"Duplicate Scrobble Guidance"})})," page to determine if you can avoid a configuration that may result in duplicate scrobbles."]}),"\n",(0,t.jsx)(n.h3,{id:"lastfm-does-not-scrobble-tracks-with-multiple-artists-correctly",children:"Last.fm does not scrobble tracks with multiple artists correctly"}),"\n",(0,t.jsxs)(n.p,{children:["This is a limitation of the ",(0,t.jsx)(n.a,{href:"https://www.last.fm/api/show/track.scrobble",children:"Last.fm API"})," where the ",(0,t.jsx)(n.strong,{children:"artist"}),' field is only one string and Last.fm does not recognize (play well) with "combined" artists.']}),"\n",(0,t.jsxs)(n.p,{children:["Multi-scrobbler works the same was the official Spotify-Last.fm integration works -- it only scrobbles the ",(0,t.jsx)(n.strong,{children:"first"})," artist on a multi-artist track."]}),"\n",(0,t.jsx)(n.h3,{id:"google-cast-track-information-is-missingincorrect-or-ms-player-has-weird-times",children:"Google Cast track information is missing/incorrect or MS player has weird times"}),"\n",(0,t.jsxs)(n.p,{children:["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...) ",(0,t.jsx)(n.em,{children:"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."]}),"\n",(0,t.jsxs)(n.p,{children:["To diagnose these issues you ",(0,t.jsx)(n.a,{href:"/configuration/sources/google-cast#cast-troubleshooting",children:(0,t.jsx)(n.strong,{children:"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."]}),"\n",(0,t.jsx)(n.h3,{id:"google-cast-device-does-not-track-media",children:"Google Cast device does not track media"}),"\n",(0,t.jsxs)(n.p,{children:["It is likely the app playing on the cast device is incorrectly reporting the media type as ",(0,t.jsx)(n.strong,{children:"not music"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"MS logs will tell you what type the media is reported as with lines like:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"My Artist - Example Track has 'unknown' media type and allowUnknownMedia=false, will not track\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/configuration/sources/google-cast#allow-unknown-media-type",children:"Allow Unknown Media Type"})," section to fix this"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"My Artist - Example Track has 'movie' media type so will not track\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/configuration/sources/google-cast#forcing-media-tracking",children:"Force Media Tracking"})," section to fix this"]}),"\n",(0,t.jsx)(n.h3,{id:"vlc-is-not-scrobbling-fields-correctly",children:"VLC is not scrobbling fields correctly"}),"\n",(0,t.jsxs)(n.p,{children:["Before reporting an issue turn on metadata logging in the MS VLC configuration, ",(0,t.jsx)(n.a,{href:"/configuration/sources/vlc#vlc-information-reporting",children:"see the VLC documentation."})]}),"\n",(0,t.jsx)(n.h3,{id:"youtube-music-misses-or-duplicates-scrobbles",children:"Youtube Music misses or duplicates scrobbles"}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:"How MS detects YTM history"}),(0,t.jsxs)(n.p,{children:["In order for multi-scrobbler to accurately determine if a song has been scrobbled it needs ",(0,t.jsx)(n.strong,{children:"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).']}),(0,t.jsx)(n.p,{children:'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.'}),(0,t.jsx)(n.p,{children:'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.'})]}),"\n",(0,t.jsx)(n.h4,{id:"reporting-ytm-scrobble-issues",children:"Reporting YTM scrobble issues"}),"\n",(0,t.jsxs)(n.p,{children:["If you experience scrobble detection issues you can help improve MS's YTM heureistic by providing thorough feedback as ",(0,t.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new?assignees=&labels=bug&projects=&template=01-bug-report.yml&title=bug%3A+",children:"an issue."})," ",(0,t.jsx)(n.strong,{children:"Please do the following to provide the most useful report:"})]}),"\n",(0,t.jsx)(n.h5,{id:"turn-on-change-detection",children:"Turn on Change Detection"}),"\n",(0,t.jsxs)(n.p,{children:["In your YTM configuration (",(0,t.jsx)(n.code,{children:"ytmusic.json"}),") add ",(0,t.jsx)(n.code,{children:"logDiff"})," under ",(0,t.jsx)(n.code,{children:"options"})," like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "name": "MyYTM",\n "data": { ... },\n "options": {\n "logDiff": true\n }\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"or set either ENVs:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"YTM_LOG_DIFF=true"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/configuration#debug-mode",children:(0,t.jsx)(n.code,{children:"DEBUG_MODE=true"})})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This will cause MS to log YTM history changes similar to this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[Ytmusic - MyYTM] Changes from last seen list:\n1. (tuhe1CpHRxY) KNOWER - I\u2019m The President --- undefined => Moved - Originally at 6\n2. (Mtg8V6Xa2nc) Vulfpeck - Romanian Drinking Song --- Schvitz => Moved - Originally at 1\n3. (rxbCaiyYSXM) Nightmares On Wax - You Wish --- In A Space Outta Sound => Moved - Originally at 2\n4. (tMt_YXr90AM) Gorillaz - O Green World --- undefined => Moved - Originally at 3\n...\n"})}),"\n",(0,t.jsx)(n.p,{children:"Which are essential to troubleshooting this behavior."}),"\n",(0,t.jsx)(n.h5,{id:"turn-on-file-logging",children:"Turn on File Logging"}),"\n",(0,t.jsxs)(n.p,{children:["Optionally, if your logs are busy due to many other sources, you can log ",(0,t.jsx)(n.strong,{children:"only"})," YTM logs to a file. Turn this on with the ",(0,t.jsx)(n.code,{children:"logToFile"})," config option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "type": "ytmusic",\n "name": "MyYTM",\n "data": { ... },\n "options": {\n "logDiff": true,\n "logToFile": true\n }\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["This will cause MS to write YTM logs to a file in your ",(0,t.jsx)(n.code,{children:"logs"})," folder named ",(0,t.jsx)(n.code,{children:"ytmusic-MyYTM.log"})," (based on your source name)."]}),"\n",(0,t.jsx)(n.h5,{id:"provide-detail-and-context",children:"Provide Detail and Context"}),"\n",(0,t.jsx)(n.p,{children:"Provide a detailed account of how you were using YTM when the issue occurred, including things like:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the platform listening on (desktop, mobile, 3rd party client, etc...)"}),"\n",(0,t.jsxs)(n.li,{children:["any changes in platform","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"I switched from desktop to listening on my phone..."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["how you were listening to music","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"I was playing an album start to finish"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"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..."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"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)"}),"\n",(0,t.jsx)(n.p,{children:"Provide ALL logs from the time when the issue occurred including logs from BEFORE (ideally 2-3 minutes of logs) and AFTER the issue."})]})}function d(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/af9480c3.7c9adf49.js b/assets/js/af9480c3.7c9adf49.js deleted file mode 100644 index 06ca7670..00000000 --- a/assets/js/af9480c3.7c9adf49.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["232"],{4879(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>b,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var i=JSON.parse('{"id":"configuration/sources/listenbrainz-source","title":"Listenbrainz","description":"Listenbrainz (Source)","source":"@site/docs/configuration/sources/listenbrainz-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/listenbrainz-source","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-source","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/listenbrainz-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Listenbrainz","description":"Listenbrainz (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Listenbrainz (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint"},"next":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/sources/maloja"}}'),t=r(4848),s=r(8453);r(8194),r(698),r(2170);var o=r(5248);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SOURCE_LZ_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_URL"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://api.listenbrainz.org/",children:"https://api.listenbrainz.org/"})}),(0,t.jsx)(n.td,{children:"URL for the ListenBrainz server, if not using the default"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_TOKEN"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"User token for the user to scrobble for"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_USER"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Username of the user to scrobble for"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}let d={title:"Listenbrainz",description:"Listenbrainz (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config: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.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This Source monitors a Listenbrainz account's scrobble history and then re-scrobbles discovered tracks to configured clients."}),"\n",(0,t.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["To ",(0,t.jsx)(n.strong,{children:"scrobble to"})," a Listenbrainz server, create a ",(0,t.jsx)(n.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz (Client)"})]}),"\n",(0,t.jsxs)(n.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a ",(0,t.jsx)(n.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})]}),"\n"]})}),"\n",(0,t.jsxs)(n.p,{children:["You will need to run your own Listenbrainz server or have an account ",(0,t.jsx)(n.a,{href:"https://listenbrainz.org/login/",children:"on the official instance"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["On your ",(0,t.jsx)(n.a,{href:"https://listenbrainz.org/profile/",children:"profile page"})," find your ",(0,t.jsx)(n.strong,{children:"User Token"})," to use in the configuration."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"ListenBrainzSourceConfig",fileContent:o.A,configureAs:!0,ambiguous:!0,name:"listenbrainz",children:(0,t.jsx)(c,{})})]})}function b(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},5248(e,n,r){r.d(n,{A:()=>i});let i='[\n {\n "name": "Foxx LZ Client",\n "id": "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": "Foxx LZ Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/af9480c3.99d1652c.js b/assets/js/af9480c3.99d1652c.js new file mode 100644 index 00000000..988069e5 --- /dev/null +++ b/assets/js/af9480c3.99d1652c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["232"],{4879(e,n,r){r.r(n),r.d(n,{metadata:()=>i,default:()=>b,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var i=JSON.parse('{"id":"configuration/sources/listenbrainz-source","title":"Listenbrainz","description":"Listenbrainz (Source)","source":"@site/docs/configuration/sources/listenbrainz-source.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/listenbrainz-source","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-source","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/listenbrainz-source.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Listenbrainz","description":"Listenbrainz (Source)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Listenbrainz (Endpoint)","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint"},"next":{"title":"Maloja","permalink":"/multi-scrobbler/configuration/sources/maloja"}}'),t=r(4848),s=r(8453);r(8194),r(698),r(2170);var o=r(5248);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SOURCE_LZ_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_URL"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"https://api.listenbrainz.org/",children:"https://api.listenbrainz.org/"})}),(0,t.jsx)(n.td,{children:"URL for the ListenBrainz server, if not using the default"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_TOKEN"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"User token for the user to scrobble for"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_LZ_USER"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Username of the user to scrobble for"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}let d={title:"Listenbrainz",description:"Listenbrainz (Source)",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",admonition:"admonition",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Config: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.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This Source monitors a Listenbrainz account's scrobble history and then re-scrobbles discovered tracks to configured clients."}),"\n",(0,t.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["To ",(0,t.jsx)(n.strong,{children:"scrobble to"})," a Listenbrainz server, create a ",(0,t.jsx)(n.a,{href:"/configuration/clients/listenbrainz",children:"Listenbrainz (Client)"})]}),"\n",(0,t.jsxs)(n.li,{children:["To accept scrobbles from outside applications as if multi-scrobbler was a Listenbrainz server, create a ",(0,t.jsx)(n.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"Listenbrainz (Endpoint)"})]}),"\n"]})}),"\n",(0,t.jsxs)(n.p,{children:["You will need to run your own Listenbrainz server or have an account ",(0,t.jsx)(n.a,{href:"https://listenbrainz.org/login/",children:"on the official instance"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["On your ",(0,t.jsx)(n.a,{href:"https://listenbrainz.org/profile/",children:"profile page"})," find your ",(0,t.jsx)(n.strong,{children:"User Token"})," to use in the configuration."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"ListenBrainzSourceConfig",fileContent:o.A,configureAs:!0,ambiguous:!0,name:"listenbrainz",children:(0,t.jsx)(c,{})})]})}function b(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},5248(e,n,r){r.d(n,{A:()=>i});let i='[\n {\n "name": "Foxx LZ Client",\n "id": "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": "Foxx LZ Source",\n "id": "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'}}]); \ No newline at end of file diff --git a/assets/js/b46f7c12.16114bb2.js b/assets/js/b46f7c12.16114bb2.js new file mode 100644 index 00000000..36f71113 --- /dev/null +++ b/assets/js/b46f7c12.16114bb2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6691"],{2038(e,r,t){t.r(r),t.d(r,{metadata:()=>i,default:()=>h,frontMatter:()=>l,contentTitle:()=>a,toc:()=>o,assets:()=>c});var i=JSON.parse('{"id":"installation/service","title":"As a Service","description":"Local Install as a Service","source":"@site/docs/installation/service.md","sourceDirName":"installation","slug":"/installation/service","permalink":"/multi-scrobbler/installation/service","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/installation/service.md?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"As a Service","description":"Local Install as a Service"},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/installation/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/updating/"}}'),s=t(4848),n=t(8453);let l={sidebar_position:2,title:"As a Service",description:"Local Install as a Service"},a="Systemd",c={},o=[{value:"Create A Unit File",id:"create-a-unit-file",level:2},{value:"Start the Service",id:"start-the-service",level:2}];function d(e){let r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(r.p,{children:["If you have multi-scrobbler installed ",(0,s.jsx)(r.a,{href:"/multi-scrobbler/installation/#nodejs",children:"locally"})," you can enable it to run as a background service when you login."]}),"\n",(0,s.jsx)(r.p,{children:"Before running as a service you should run it at least once in the foreground to ensure it can start up correctly!"}),"\n",(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"systemd",children:(0,s.jsx)(r.a,{href:"https://systemd.io/",children:"Systemd"})})}),"\n",(0,s.jsxs)(r.p,{children:["Systemd is system and service manager that is used by ",(0,s.jsx)(r.a,{href:"https://en.wikipedia.org/wiki/Systemd#Adoption",children:"most popular linux distros"})," including ",(0,s.jsx)(r.a,{href:"https://wiki.ubuntu.com/SystemdForUpstartUsers",children:"Ubuntu"}),", ",(0,s.jsx)(r.a,{href:"https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/",children:"Fedora"}),", Pop!_OS, ",(0,s.jsx)(r.a,{href:"https://wiki.debian.org/systemd",children:"Debian"}),", and ",(0,s.jsx)(r.a,{href:"https://wiki.archlinux.org/title/systemd",children:"Arch"}),"."]}),"\n",(0,s.jsxs)(r.p,{children:["This setup will create a ",(0,s.jsx)(r.a,{href:"https://wiki.archlinux.org/title/systemd/User",children:"user service"})," that runs on login."]}),"\n",(0,s.jsx)(r.h2,{id:"create-a-unit-file",children:"Create A Unit File"}),"\n",(0,s.jsx)(r.p,{children:"Create a new service file for multi-scrobbler under your HOME config:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"mkdir -p ~/.config/systemd/user\ntouch ~/.config/systemd/user/multi-scrobbler.service\n"})}),"\n",(0,s.jsxs)(r.p,{children:["In a text editor add contents below to the file you created, ",(0,s.jsx)(r.code,{children:"multi-scrobbler.service"}),":"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-ini",children:"[Unit]\nDescription=multi-scrobbler\nAfter=network.target\n\n[Service]\nType=simple\nWorkingDirectory=/path/to/multi-scrobbler/directory\nExecStart=npm run start\nRestart=no\n\n[Install]\nWantedBy=default.target\n"})}),"\n",(0,s.jsx)(r.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,s.jsx)(r.p,{children:"Save the file then run:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"systemctl daemon-reload\nsystemctl --user enable multi-scrobbler.service\nsystemctl --user start multi-scrobbler.service\n"})}),"\n",(0,s.jsx)(r.p,{children:"This will"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"scan for new services and pickup our multi-scrobbler user service"}),"\n",(0,s.jsx)(r.li,{children:"enable the service to run at login automatically"}),"\n",(0,s.jsx)(r.li,{children:"start the service now"}),"\n"]}),"\n",(0,s.jsx)(r.h1,{id:"other-service-methods",children:"Other Service Methods"}),"\n",(0,s.jsx)(r.p,{children:"Open a PR if you would like to document setting up multi-scrobbler for other service managers!"})]})}function h(e={}){let{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/b46f7c12.3100fbe6.js b/assets/js/b46f7c12.3100fbe6.js deleted file mode 100644 index 2c9eb2bd..00000000 --- a/assets/js/b46f7c12.3100fbe6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["6691"],{2038(e,r,t){t.r(r),t.d(r,{metadata:()=>i,default:()=>h,frontMatter:()=>l,contentTitle:()=>a,toc:()=>o,assets:()=>c});var i=JSON.parse('{"id":"installation/service","title":"As a Service","description":"Local Install as a Service","source":"@site/docs/installation/service.md","sourceDirName":"installation","slug":"/installation/service","permalink":"/multi-scrobbler/installation/service","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/installation/service.md?plain=1","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"As a Service","description":"Local Install as a Service"},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/installation/"},"next":{"title":"Overview","permalink":"/multi-scrobbler/updating/"}}'),s=t(4848),n=t(8453);let l={sidebar_position:2,title:"As a Service",description:"Local Install as a Service"},a="Systemd",c={},o=[{value:"Create A Unit File",id:"create-a-unit-file",level:2},{value:"Start the Service",id:"start-the-service",level:2}];function d(e){let r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(r.p,{children:["If you have multi-scrobbler installed ",(0,s.jsx)(r.a,{href:"/multi-scrobbler/installation/#nodejs",children:"locally"})," you can enable it to run as a background service when you login."]}),"\n",(0,s.jsx)(r.p,{children:"Before running as a service you should run it at least once in the foreground to ensure it can start up correctly!"}),"\n",(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"systemd",children:(0,s.jsx)(r.a,{href:"https://systemd.io/",children:"Systemd"})})}),"\n",(0,s.jsxs)(r.p,{children:["Systemd is system and service manager that is used by ",(0,s.jsx)(r.a,{href:"https://en.wikipedia.org/wiki/Systemd#Adoption",children:"most popular linux distros"})," including ",(0,s.jsx)(r.a,{href:"https://wiki.ubuntu.com/SystemdForUpstartUsers",children:"Ubuntu"}),", ",(0,s.jsx)(r.a,{href:"https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/",children:"Fedora"}),", Pop!_OS, ",(0,s.jsx)(r.a,{href:"https://wiki.debian.org/systemd",children:"Debian"}),", and ",(0,s.jsx)(r.a,{href:"https://wiki.archlinux.org/title/systemd",children:"Arch"}),"."]}),"\n",(0,s.jsxs)(r.p,{children:["This setup will create a ",(0,s.jsx)(r.a,{href:"https://wiki.archlinux.org/title/systemd/User",children:"user service"})," that runs on login."]}),"\n",(0,s.jsx)(r.h2,{id:"create-a-unit-file",children:"Create A Unit File"}),"\n",(0,s.jsx)(r.p,{children:"Create a new service file for multi-scrobbler under your HOME config:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"mkdir -p ~/.config/systemd/user\ntouch ~/.config/systemd/user/multi-scrobbler.service\n"})}),"\n",(0,s.jsxs)(r.p,{children:["In a text editor add contents below to the file you created, ",(0,s.jsx)(r.code,{children:"multi-scrobbler.service"}),":"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-ini",children:"[Unit]\nDescription=multi-scrobbler\nAfter=network.target\n\n[Service]\nType=simple\nWorkingDirectory=/path/to/multi-scrobbler/directory\nExecStart=npm run start\nRestart=no\n\n[Install]\nWantedBy=default.target\n"})}),"\n",(0,s.jsx)(r.h2,{id:"start-the-service",children:"Start the Service"}),"\n",(0,s.jsx)(r.p,{children:"Save the file then run:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"systemctl daemon-reload\nsystemctl --user enable multi-scrobbler.service\nsystemctl --user start multi-scrobbler.service\n"})}),"\n",(0,s.jsx)(r.p,{children:"This will"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"scan for new services and pickup our multi-scrobbler user service"}),"\n",(0,s.jsx)(r.li,{children:"enable the service to run at login automatically"}),"\n",(0,s.jsx)(r.li,{children:"start the service now"}),"\n"]}),"\n",(0,s.jsx)(r.h1,{id:"other-service-methods",children:"Other Service Methods"}),"\n",(0,s.jsx)(r.p,{children:"Open a PR if you would like to document setting up multi-scrobbler for other service managers!"})]})}function h(e={}){let{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/b49ba48c.caa11833.js b/assets/js/b49ba48c.caa11833.js new file mode 100644 index 00000000..6329bb18 --- /dev/null +++ b/assets/js/b49ba48c.caa11833.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9249"],{1469(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>u,assets:()=>p});var s=JSON.parse('{"id":"configuration/sources/applemusic","title":"Apple Music","description":"This Source monitors your Apple Music listening history via the official Apple Music API and scrobbles new activity to your configured Clients.","source":"@site/docs/configuration/sources/applemusic.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/applemusic","permalink":"/multi-scrobbler/configuration/sources/applemusic","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/applemusic.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Apple Music","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/sources/"},"next":{"title":"Azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast"}}'),t=i(4848),r=i(8453),o=i(8194),l=i(698);function a(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"APPLEMUSIC_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_KEY_ID"})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_TEAM_ID"})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_KEY_P8"})}),(0,t.jsx)(n.td,{children:"string"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_MEDIA_USER_TOKEN"})})})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_TOKEN"})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_ORIGIN_HEADER"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Origin header to include in every Apple Music API request."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Fixes a quirk where Apple Music's history API hides duplicate plays."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_NORMALIZE_ALBUM"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Removes extraneous suffixes from album data"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}i(2170);let d={title:"Apple Music",toc_min_heading_level:2,toc_max_heading_level:5},h,p={},u=[{value:"1. Getting a Media User Token",id:"1-getting-a-media-user-token",level:3},{value:"2. Authentication",id:"2-authentication",level:3},{value:"How Multi-Scrobbler handles Apple Music quirks",id:"how-multi-scrobbler-handles-apple-music-quirks",level:3},{value:"Timestamp Estimation",id:"timestamp-estimation",level:4},{value:"Duplicate Play Recovery",id:"duplicate-play-recovery",level:4},{value:"Album name normalization",id:"album-name-normalization",level:4},{value:"Configuration Reference",id:"configuration-reference",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Config:s,Details:a,DetailsAdmo:d}=n;return s||m("Config",!0),a||m("Details",!0),d||m("DetailsAdmo",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["This Source ",(0,t.jsx)(n.strong,{children:"monitors your Apple Music listening history"})," via the official Apple Music API and scrobbles new activity to your configured ",(0,t.jsx)(n.a,{href:"/configuration/clients",children:"Clients"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Because of how the Apple Music API works, Multi-Scrobbler (MS) requires two different tokens to function: a ",(0,t.jsx)(n.strong,{children:"Media User Token"})," (identifies your personal account) and an ",(0,t.jsx)(n.strong,{children:"Authentication Token"})," (authorizes API access)."]}),"\n",(0,t.jsx)(n.h3,{id:"1-getting-a-media-user-token",children:"1. Getting a Media User Token"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"mediaUserToken"})," is required to access your recently played history. You can extract it directly from the Apple Music web app:"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Visit ",(0,t.jsx)(n.a,{href:"https://music.apple.com",children:"music.apple.com"})," in your browser and log in."]}),"\n",(0,t.jsxs)(n.li,{children:["Open your browser's Developer Tools (usually ",(0,t.jsx)(n.code,{children:"F12"})," or ",(0,t.jsx)("kbd",{children:"\u2318"})," + ",(0,t.jsx)("kbd",{children:"\u2325"})," + ",(0,t.jsx)("kbd",{children:"I"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Navigate to the ",(0,t.jsx)(n.strong,{children:"Application"})," tab (Chrome/Edge) or ",(0,t.jsx)(n.strong,{children:"Storage"})," tab (Safari/Firefox)."]}),"\n",(0,t.jsxs)(n.li,{children:["Expand ",(0,t.jsx)(n.strong,{children:"Cookies"})," in the left sidebar and select ",(0,t.jsx)(n.code,{children:"https://music.apple.com"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Find the cookie named ",(0,t.jsx)(n.code,{children:"media-user-token"})," and copy its value (it typically starts with ",(0,t.jsx)(n.code,{children:"0."}),")."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Token Expiry",type:"caution",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"mediaUserToken"})," will eventually expire. If Multi-Scrobbler begins throwing authentication errors in the logs, simply repeat these steps to obtain and configure a fresh token."]})}),"\n",(0,t.jsx)(n.h3,{id:"2-authentication",children:"2. Authentication"}),"\n",(0,t.jsx)(n.p,{children:"To authorize API access, Multi-Scrobbler requires an Authentication Token (JWT). Because the official Apple Music API is designed for developers, there are two ways to provide this token depending on your situation:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Browser Token (Free & Most Common):"})," Best for 99% of users. You can easily extract a temporary token from the Apple Music web player without needing an Apple Developer account."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"MusicKit Key (Requires Paid Apple Developer Account):"})," If you happen to be enrolled in the paid Apple Developer Program ($99/year), you can provide a private key to automatically generate permanent tokens."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Choose your preferred method below:"}),"\n",(0,t.jsxs)(o.A,{groupId:"appleMusicAuth",queryString:!0,children:[(0,t.jsxs)(l.A,{value:"token",label:"Browser Token (Free)",children:[(0,t.jsx)(n.p,{children:"Since most users don't have a paid developer account, extracting the token from the web player is the standard approach."}),(0,t.jsx)(n.p,{children:"Behind the scenes, the Apple Music website makes a lot of background requests, which can make finding the right token confusing. To filter out the noise and grab the exact token we need, follow the steps for your browser below:"}),(0,t.jsxs)(a,{children:[(0,t.jsx)("summary",{children:"Chrome, Edge & Firefox"}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Visit ",(0,t.jsx)(n.a,{href:"https://music.apple.com",children:"music.apple.com"})," and log in."]}),"\n",(0,t.jsxs)(n.li,{children:["Open Developer Tools (",(0,t.jsx)(n.code,{children:"F12"})," or ",(0,t.jsx)(n.code,{children:"Ctrl+Shift+I"})," / ",(0,t.jsx)("kbd",{children:"\u2318"})," + ",(0,t.jsx)("kbd",{children:"\u2325"})," + ",(0,t.jsx)("kbd",{children:"I"}),") and navigate to the ",(0,t.jsx)(n.strong,{children:"Network"})," tab."]}),"\n",(0,t.jsxs)(n.li,{children:["In the filter box at the top left, paste exactly: ",(0,t.jsx)(n.code,{children:"https://amp-api.music.apple.com/v1/me/account"})," (",(0,t.jsx)(n.strong,{children:"Label 1"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Click the ",(0,t.jsx)(n.strong,{children:"Fetch/XHR"})," filter button to hide irrelevant requests (",(0,t.jsx)(n.strong,{children:"Label 2"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Reload the page (",(0,t.jsx)(n.strong,{children:"Label 3"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:['Under the "Name" column, click the request starting with ',(0,t.jsx)(n.code,{children:"account?meta="})," (",(0,t.jsx)(n.strong,{children:"Label 4"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["In the panel that opens, scroll down to the ",(0,t.jsx)(n.strong,{children:"Request Headers"})," section."]}),"\n",(0,t.jsxs)(n.li,{children:["Find the ",(0,t.jsx)(n.code,{children:"authorization"})," header. Copy the long string of text ",(0,t.jsx)(n.strong,{children:"after"})," the ",(0,t.jsx)(n.code,{children:"Bearer "})," prefix (",(0,t.jsx)(n.strong,{children:"Label 5"}),")."]}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Chrome Network Tab Instructions",src:i(1756).A+"",width:"3248",height:"2000"})})]}),(0,t.jsxs)(a,{children:[(0,t.jsx)("summary",{children:"Safari"}),(0,t.jsx)(n.p,{children:"Before you can extract the token in Safari, you must enable developer tools."}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Open Safari Settings (",(0,t.jsx)("kbd",{children:"\u2318"})," + ",(0,t.jsx)("kbd",{children:","}),"), navigate to the ",(0,t.jsx)(n.strong,{children:"Advanced"})," tab, and check ",(0,t.jsx)(n.strong,{children:'"Show features for web developers"'})," at the very bottom."]}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Safari Advanced Settings",src:i(911).A+"",width:"1896",height:"1412"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Visit ",(0,t.jsx)(n.a,{href:"https://music.apple.com",children:"music.apple.com"})," and log in."]}),"\n",(0,t.jsxs)(n.li,{children:["Open the Web Inspector (",(0,t.jsx)("kbd",{children:"\u2318"}),"+",(0,t.jsx)("kbd",{children:"\u2325"}),"+",(0,t.jsx)("kbd",{children:"I"})," or Develop > Show Web Inspector) and navigate to the ",(0,t.jsx)(n.strong,{children:"Network"})," tab."]}),"\n",(0,t.jsxs)(n.li,{children:["In the filter bar on the left side of the inspector, paste exactly: ",(0,t.jsx)(n.code,{children:"https://amp-api.music.apple.com/v1/me/account"})," (",(0,t.jsx)(n.strong,{children:"Label 1"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Reload the page (",(0,t.jsx)(n.strong,{children:"Label 2"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Click the ",(0,t.jsx)(n.code,{children:"account"})," request that appears in the Name list (",(0,t.jsx)(n.strong,{children:"Label 3"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["In the details sidebar, look under the ",(0,t.jsx)(n.strong,{children:"Request"})," section for the ",(0,t.jsx)(n.code,{children:"Authorization"})," header. Copy the long string of text ",(0,t.jsx)(n.strong,{children:"after"})," the ",(0,t.jsx)(n.code,{children:"Bearer "})," prefix (",(0,t.jsx)(n.strong,{children:"Label 4"}),")."]}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Safari Network Tab Instructions",src:i(8090).A+"",width:"2872",height:"1970"})})]}),(0,t.jsx)("br",{}),(0,t.jsx)(n.p,{children:"Once you have your token, add it to your configuration file along with the origin header:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",metastring:'title="applemusic.json"',children:'{\n "data": {\n "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsIm...",\n "mediaUserToken": "your-media-user-token-here",\n "origin": "https://music.apple.com"\n }\n}\n'})}),(0,t.jsx)(n.admonition,{title:"Origin Header Required",type:"info",children:(0,t.jsxs)(n.p,{children:["When using a JWT extracted from the browser, Apple requires the request to match the domain it was issued to. You ",(0,t.jsx)(n.strong,{children:"must"})," include the ",(0,t.jsx)(n.code,{children:"origin"})," field in your config as shown above."]})}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Note: Browser-generated JWTs are valid for a maximum of 35 days and must be updated manually when they expire."})})]}),(0,t.jsxs)(l.A,{value:"key",label:"MusicKit Key (Paid Account)",children:[(0,t.jsx)(n.admonition,{title:"Apple Developer Account Required",type:"warning",children:(0,t.jsxs)(n.p,{children:["To generate JWTs automatically, you must be enrolled in the paid ",(0,t.jsx)(n.a,{href:"https://developer.apple.com/programs/",children:"Apple Developer Program"})," ($99/year) and create a MusicKit key. If you don't have an account, use the ",(0,t.jsx)(n.strong,{children:"Browser Token (Free)"})," tab instead."]})}),(0,t.jsx)(n.p,{children:"To generate JWTs automatically and avoid manual token refreshes, you need an Apple Music API key:"}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Go to the ",(0,t.jsx)(n.a,{href:"https://developer.apple.com/account/resources/authkeys/list",children:"Apple Developer portal"})," and create a ",(0,t.jsx)(n.strong,{children:"MusicKit"})," key."]}),"\n",(0,t.jsxs)(n.li,{children:["Download the ",(0,t.jsx)(n.code,{children:".p8"})," file \u2014 this is your private key."]}),"\n",(0,t.jsxs)(n.li,{children:["Note your ",(0,t.jsx)(n.strong,{children:"Key ID"})," and ",(0,t.jsx)(n.strong,{children:"Team ID"})," (found in your Apple Developer account Membership details)."]}),"\n"]}),(0,t.jsx)(n.p,{children:"Add these details to your config:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",metastring:'title="applemusic.json"',children:'{\n "data": {\n "key": {\n "id": "2HPSNJZ88N",\n "teamId": "SN6YASW8G4",\n "p8": "-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----"\n },\n "mediaUserToken": "your-media-user-token-here"\n }\n}\n'})}),(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["When pasting the contents of your ",(0,t.jsx)(n.code,{children:".p8"})," file into JSON, make sure to replace physical line breaks with ",(0,t.jsx)(n.code,{children:"\\n"})," so it remains a valid, single-line JSON string."]})})]})]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"how-multi-scrobbler-handles-apple-music-quirks",children:"How Multi-Scrobbler handles Apple Music quirks"}),"\n",(0,t.jsx)(n.h4,{id:"timestamp-estimation",children:"Timestamp Estimation"}),"\n",(0,t.jsxs)(n.p,{children:["The Apple Music API ",(0,t.jsx)(n.strong,{children:"does not provide timestamps"})," for when tracks were played. Multi-Scrobbler estimates play times by taking the current time and subtracting track durations backwards:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["The most recent track is assumed to have finished playing ",(0,t.jsx)(n.strong,{children:"now"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Each older track is estimated to have played ",(0,t.jsx)(n.code,{children:"duration"})," seconds before the previous one."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["For the most accurate scrobble timestamps, it is highly recommended to keep the polling interval (",(0,t.jsx)(n.code,{children:"APPLEMUSIC_INTERVAL"}),") low (the default is 60 seconds)."]})}),"\n",(0,t.jsx)(n.h4,{id:"duplicate-play-recovery",children:"Duplicate Play Recovery"}),"\n",(0,t.jsx)(n.p,{children:"The Apple Music history API strictly deduplicates tracks. Instead of showing the same song multiple times in a row, it simply bumps the re-played track back to the #1 spot and removes the older entry."}),"\n",(0,t.jsxs)(n.p,{children:["For example, if you listen to ",(0,t.jsx)(n.strong,{children:"Song A"})," \u2192 ",(0,t.jsx)(n.strong,{children:"Song B"}),", your history is ",(0,t.jsx)(n.code,{children:"[Song B, Song A]"}),". If you then listen to ",(0,t.jsx)(n.strong,{children:"Song A"})," again, the API returns ",(0,t.jsx)(n.code,{children:"[Song A, Song B]"})," (Song A was bumped to the top)."]}),"\n",(0,t.jsx)(n.p,{children:'If Multi-Scrobbler polled when the top track was Song A, and polls again after it\'s bumped back to the top, the top track appears functionally unchanged. This usually confuses standard scrobblers into ignoring the update entirely. By default, MS correctly detects this "top-rebound" pattern, extracts the intermediate tracks that were squeezed in (Song B), and scrobbles Song A again as a re-listen.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["Note: Because of this strict deduplication, ",(0,t.jsx)(n.strong,{children:'"pure loops"'})," (listening to Song A continuously on repeat without playing anything else in between) cannot be tracked. The history list never changes shape, so MS has no way of knowing it was played again."]})}),"\n",(0,t.jsxs)(n.p,{children:["If you ever experience false positives (tracks being scrobbled that you didn't actually re-listen to), you can disable this recovery behavior with ",(0,t.jsx)(n.code,{children:'"recoverUnchangedTopHistory": false'})," in your config options or by setting the ",(0,t.jsx)(n.code,{children:"APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY=false"})," env var."]}),"\n",(0,t.jsx)(n.h4,{id:"album-name-normalization",children:"Album name normalization"}),"\n",(0,t.jsxs)(n.p,{children:["The Apple Music API appends ",(0,t.jsx)(n.code,{children:" - EP"})," or ",(0,t.jsx)(n.code,{children:" - Single"})," to the album name for EPs and singles. These suffixes are ",(0,t.jsx)(n.em,{children:"not"})," part of the official names of the album and can cause issues when trying to scrobble or match metadata."]}),"\n",(0,t.jsx)(n.p,{children:"By default, Multi-Scrobbler strips these suffixes out so only the official name is used."}),"\n",(0,t.jsxs)(n.p,{children:["If you do not want this behavior it can be disabled with ENV ",(0,t.jsx)(n.code,{children:"APPLEMUSIC_NORMALIZE_ALBUM=false"})," or File/AIO option ",(0,t.jsx)(n.code,{children:'"normalizeAlbum": false'}),"."]}),"\n",(0,t.jsxs)(d,{type:"tip",summary:"Stripping Suffix with User Stage",children:[(0,t.jsxs)(n.p,{children:["If you still want this stripping functionality but with more control over how it is applied you can use a ",(0,t.jsx)(n.a,{href:"/configuration/transforms/user",children:"User Stage"}),"."]}),(0,t.jsx)(n.p,{children:"Here is an example of creating a User Stage to only strip suffixes for a specific scrobble client:"}),(0,t.jsxs)(a,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "user",\n "name": "AppleAlbumStip",\n "defaults": {\n "album": [\n "/ - (EP|Single)$/i"\n ]\n }\n }\n ]\n}\n'})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="applemusic.json"',children:'{\n {\n "id": "myAppleMusic",\n "name": "My Apple Music",\n "data": {\n // ...\n },\n // highlight-start\n "options": {\n "normalizeAlbum": false\n }\n // highlight-end\n }\n}\n'})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json"',children:'[\n {\n "name": "Foxx LFM Client",\n "id": "myLastFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n },\n // highlight-start\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "user",\n "name": "AppleAlbumStip",\n }\n ]\n }\n }\n // highlight-end\n }\n]\n'})})]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-reference",children:"Configuration Reference"}),"\n",(0,t.jsx)(s,{config:"AppleMusicSourceConfig",fileContent:'[\n {\n "id": "myAppleMusic",\n "name": "My Apple Music",\n "enable": true,\n "clients": [],\n "data": {\n // either key or token needs to be provided\n "key": {\n "id": "2HPSNJZ88N",\n "teamId": "SN6YASW8G4",\n "p8": "-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----"\n },\n "token": "your-jwt-token-here",\n "mediaUserToken": "your-media-user-token-here",\n\n // optional: Origin header for API requests (required when using a browser token)\n "origin": "https://music.apple.com",\n\n // optional: polling interval in seconds (default 60)\n "interval": 60\n },\n "options": {\n "logDiff": true,\n "recoverUnchangedTopHistory": true,\n "normalizeAlbum": true\n }\n }\n]\n',name:"applemusic",children:(0,t.jsx)(c,{})})]})}function j(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1756(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/applemusic_chrome_devtools-6fd4f76ddb32d0c4ec673fd628c84317.png"},8090(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/applemusic_safari_devtools-055f3ea1147b02c77b0a937c45fb1bca.png"},911(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/applemusic_safari_settings-4eb2b2404f81979fe8f2a68df0c30ab8.png"}}]); \ No newline at end of file diff --git a/assets/js/b49ba48c.e798877e.js b/assets/js/b49ba48c.e798877e.js deleted file mode 100644 index b069b792..00000000 --- a/assets/js/b49ba48c.e798877e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9249"],{1469(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>u,assets:()=>p});var s=JSON.parse('{"id":"configuration/sources/applemusic","title":"Apple Music","description":"This Source monitors your Apple Music listening history via the official Apple Music API and scrobbles new activity to your configured Clients.","source":"@site/docs/configuration/sources/applemusic.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/applemusic","permalink":"/multi-scrobbler/configuration/sources/applemusic","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/applemusic.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Apple Music","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/multi-scrobbler/configuration/sources/"},"next":{"title":"Azuracast","permalink":"/multi-scrobbler/configuration/sources/azuracast"}}'),t=i(4848),r=i(8453),o=i(8194),l=i(698);function a(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"APPLEMUSIC_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_KEY_ID"})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_TEAM_ID"})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_KEY_P8"})}),(0,t.jsx)(n.td,{children:"string"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_MEDIA_USER_TOKEN"})})})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_TOKEN"})}),(0,t.jsx)(n.td,{children:"string"}),(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:"APPLEMUSIC_ORIGIN_HEADER"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"Origin header to include in every Apple Music API request."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Fixes a quirk where Apple Music's history API hides duplicate plays."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"APPLEMUSIC_NORMALIZE_ALBUM"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Removes extraneous suffixes from album data"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}i(2170);let d={title:"Apple Music",toc_min_heading_level:2,toc_max_heading_level:5},h,p={},u=[{value:"1. Getting a Media User Token",id:"1-getting-a-media-user-token",level:3},{value:"2. Authentication",id:"2-authentication",level:3},{value:"How Multi-Scrobbler handles Apple Music quirks",id:"how-multi-scrobbler-handles-apple-music-quirks",level:3},{value:"Timestamp Estimation",id:"timestamp-estimation",level:4},{value:"Duplicate Play Recovery",id:"duplicate-play-recovery",level:4},{value:"Album name normalization",id:"album-name-normalization",level:4},{value:"Configuration Reference",id:"configuration-reference",level:2}];function x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Config:s,Details:a,DetailsAdmo:d}=n;return s||m("Config",!0),a||m("Details",!0),d||m("DetailsAdmo",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["This Source ",(0,t.jsx)(n.strong,{children:"monitors your Apple Music listening history"})," via the official Apple Music API and scrobbles new activity to your configured ",(0,t.jsx)(n.a,{href:"/configuration/clients",children:"Clients"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Because of how the Apple Music API works, Multi-Scrobbler (MS) requires two different tokens to function: a ",(0,t.jsx)(n.strong,{children:"Media User Token"})," (identifies your personal account) and an ",(0,t.jsx)(n.strong,{children:"Authentication Token"})," (authorizes API access)."]}),"\n",(0,t.jsx)(n.h3,{id:"1-getting-a-media-user-token",children:"1. Getting a Media User Token"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"mediaUserToken"})," is required to access your recently played history. You can extract it directly from the Apple Music web app:"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Visit ",(0,t.jsx)(n.a,{href:"https://music.apple.com",children:"music.apple.com"})," in your browser and log in."]}),"\n",(0,t.jsxs)(n.li,{children:["Open your browser's Developer Tools (usually ",(0,t.jsx)(n.code,{children:"F12"})," or ",(0,t.jsx)("kbd",{children:"\u2318"})," + ",(0,t.jsx)("kbd",{children:"\u2325"})," + ",(0,t.jsx)("kbd",{children:"I"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Navigate to the ",(0,t.jsx)(n.strong,{children:"Application"})," tab (Chrome/Edge) or ",(0,t.jsx)(n.strong,{children:"Storage"})," tab (Safari/Firefox)."]}),"\n",(0,t.jsxs)(n.li,{children:["Expand ",(0,t.jsx)(n.strong,{children:"Cookies"})," in the left sidebar and select ",(0,t.jsx)(n.code,{children:"https://music.apple.com"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Find the cookie named ",(0,t.jsx)(n.code,{children:"media-user-token"})," and copy its value (it typically starts with ",(0,t.jsx)(n.code,{children:"0."}),")."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Token Expiry",type:"caution",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"mediaUserToken"})," will eventually expire. If Multi-Scrobbler begins throwing authentication errors in the logs, simply repeat these steps to obtain and configure a fresh token."]})}),"\n",(0,t.jsx)(n.h3,{id:"2-authentication",children:"2. Authentication"}),"\n",(0,t.jsx)(n.p,{children:"To authorize API access, Multi-Scrobbler requires an Authentication Token (JWT). Because the official Apple Music API is designed for developers, there are two ways to provide this token depending on your situation:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Browser Token (Free & Most Common):"})," Best for 99% of users. You can easily extract a temporary token from the Apple Music web player without needing an Apple Developer account."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"MusicKit Key (Requires Paid Apple Developer Account):"})," If you happen to be enrolled in the paid Apple Developer Program ($99/year), you can provide a private key to automatically generate permanent tokens."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Choose your preferred method below:"}),"\n",(0,t.jsxs)(o.A,{groupId:"appleMusicAuth",queryString:!0,children:[(0,t.jsxs)(l.A,{value:"token",label:"Browser Token (Free)",children:[(0,t.jsx)(n.p,{children:"Since most users don't have a paid developer account, extracting the token from the web player is the standard approach."}),(0,t.jsx)(n.p,{children:"Behind the scenes, the Apple Music website makes a lot of background requests, which can make finding the right token confusing. To filter out the noise and grab the exact token we need, follow the steps for your browser below:"}),(0,t.jsxs)(a,{children:[(0,t.jsx)("summary",{children:"Chrome, Edge & Firefox"}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Visit ",(0,t.jsx)(n.a,{href:"https://music.apple.com",children:"music.apple.com"})," and log in."]}),"\n",(0,t.jsxs)(n.li,{children:["Open Developer Tools (",(0,t.jsx)(n.code,{children:"F12"})," or ",(0,t.jsx)(n.code,{children:"Ctrl+Shift+I"})," / ",(0,t.jsx)("kbd",{children:"\u2318"})," + ",(0,t.jsx)("kbd",{children:"\u2325"})," + ",(0,t.jsx)("kbd",{children:"I"}),") and navigate to the ",(0,t.jsx)(n.strong,{children:"Network"})," tab."]}),"\n",(0,t.jsxs)(n.li,{children:["In the filter box at the top left, paste exactly: ",(0,t.jsx)(n.code,{children:"https://amp-api.music.apple.com/v1/me/account"})," (",(0,t.jsx)(n.strong,{children:"Label 1"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Click the ",(0,t.jsx)(n.strong,{children:"Fetch/XHR"})," filter button to hide irrelevant requests (",(0,t.jsx)(n.strong,{children:"Label 2"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Reload the page (",(0,t.jsx)(n.strong,{children:"Label 3"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:['Under the "Name" column, click the request starting with ',(0,t.jsx)(n.code,{children:"account?meta="})," (",(0,t.jsx)(n.strong,{children:"Label 4"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["In the panel that opens, scroll down to the ",(0,t.jsx)(n.strong,{children:"Request Headers"})," section."]}),"\n",(0,t.jsxs)(n.li,{children:["Find the ",(0,t.jsx)(n.code,{children:"authorization"})," header. Copy the long string of text ",(0,t.jsx)(n.strong,{children:"after"})," the ",(0,t.jsx)(n.code,{children:"Bearer "})," prefix (",(0,t.jsx)(n.strong,{children:"Label 5"}),")."]}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Chrome Network Tab Instructions",src:i(1756).A+"",width:"3248",height:"2000"})})]}),(0,t.jsxs)(a,{children:[(0,t.jsx)("summary",{children:"Safari"}),(0,t.jsx)(n.p,{children:"Before you can extract the token in Safari, you must enable developer tools."}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Open Safari Settings (",(0,t.jsx)("kbd",{children:"\u2318"})," + ",(0,t.jsx)("kbd",{children:","}),"), navigate to the ",(0,t.jsx)(n.strong,{children:"Advanced"})," tab, and check ",(0,t.jsx)(n.strong,{children:'"Show features for web developers"'})," at the very bottom."]}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Safari Advanced Settings",src:i(911).A+"",width:"1896",height:"1412"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["Visit ",(0,t.jsx)(n.a,{href:"https://music.apple.com",children:"music.apple.com"})," and log in."]}),"\n",(0,t.jsxs)(n.li,{children:["Open the Web Inspector (",(0,t.jsx)("kbd",{children:"\u2318"}),"+",(0,t.jsx)("kbd",{children:"\u2325"}),"+",(0,t.jsx)("kbd",{children:"I"})," or Develop > Show Web Inspector) and navigate to the ",(0,t.jsx)(n.strong,{children:"Network"})," tab."]}),"\n",(0,t.jsxs)(n.li,{children:["In the filter bar on the left side of the inspector, paste exactly: ",(0,t.jsx)(n.code,{children:"https://amp-api.music.apple.com/v1/me/account"})," (",(0,t.jsx)(n.strong,{children:"Label 1"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Reload the page (",(0,t.jsx)(n.strong,{children:"Label 2"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["Click the ",(0,t.jsx)(n.code,{children:"account"})," request that appears in the Name list (",(0,t.jsx)(n.strong,{children:"Label 3"}),")."]}),"\n",(0,t.jsxs)(n.li,{children:["In the details sidebar, look under the ",(0,t.jsx)(n.strong,{children:"Request"})," section for the ",(0,t.jsx)(n.code,{children:"Authorization"})," header. Copy the long string of text ",(0,t.jsx)(n.strong,{children:"after"})," the ",(0,t.jsx)(n.code,{children:"Bearer "})," prefix (",(0,t.jsx)(n.strong,{children:"Label 4"}),")."]}),"\n"]}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Safari Network Tab Instructions",src:i(8090).A+"",width:"2872",height:"1970"})})]}),(0,t.jsx)("br",{}),(0,t.jsx)(n.p,{children:"Once you have your token, add it to your configuration file along with the origin header:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",metastring:'title="applemusic.json"',children:'{\n "data": {\n "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsIm...",\n "mediaUserToken": "your-media-user-token-here",\n "origin": "https://music.apple.com"\n }\n}\n'})}),(0,t.jsx)(n.admonition,{title:"Origin Header Required",type:"info",children:(0,t.jsxs)(n.p,{children:["When using a JWT extracted from the browser, Apple requires the request to match the domain it was issued to. You ",(0,t.jsx)(n.strong,{children:"must"})," include the ",(0,t.jsx)(n.code,{children:"origin"})," field in your config as shown above."]})}),(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Note: Browser-generated JWTs are valid for a maximum of 35 days and must be updated manually when they expire."})})]}),(0,t.jsxs)(l.A,{value:"key",label:"MusicKit Key (Paid Account)",children:[(0,t.jsx)(n.admonition,{title:"Apple Developer Account Required",type:"warning",children:(0,t.jsxs)(n.p,{children:["To generate JWTs automatically, you must be enrolled in the paid ",(0,t.jsx)(n.a,{href:"https://developer.apple.com/programs/",children:"Apple Developer Program"})," ($99/year) and create a MusicKit key. If you don't have an account, use the ",(0,t.jsx)(n.strong,{children:"Browser Token (Free)"})," tab instead."]})}),(0,t.jsx)(n.p,{children:"To generate JWTs automatically and avoid manual token refreshes, you need an Apple Music API key:"}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Go to the ",(0,t.jsx)(n.a,{href:"https://developer.apple.com/account/resources/authkeys/list",children:"Apple Developer portal"})," and create a ",(0,t.jsx)(n.strong,{children:"MusicKit"})," key."]}),"\n",(0,t.jsxs)(n.li,{children:["Download the ",(0,t.jsx)(n.code,{children:".p8"})," file \u2014 this is your private key."]}),"\n",(0,t.jsxs)(n.li,{children:["Note your ",(0,t.jsx)(n.strong,{children:"Key ID"})," and ",(0,t.jsx)(n.strong,{children:"Team ID"})," (found in your Apple Developer account Membership details)."]}),"\n"]}),(0,t.jsx)(n.p,{children:"Add these details to your config:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",metastring:'title="applemusic.json"',children:'{\n "data": {\n "key": {\n "id": "2HPSNJZ88N",\n "teamId": "SN6YASW8G4",\n "p8": "-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----"\n },\n "mediaUserToken": "your-media-user-token-here"\n }\n}\n'})}),(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["When pasting the contents of your ",(0,t.jsx)(n.code,{children:".p8"})," file into JSON, make sure to replace physical line breaks with ",(0,t.jsx)(n.code,{children:"\\n"})," so it remains a valid, single-line JSON string."]})})]})]}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"how-multi-scrobbler-handles-apple-music-quirks",children:"How Multi-Scrobbler handles Apple Music quirks"}),"\n",(0,t.jsx)(n.h4,{id:"timestamp-estimation",children:"Timestamp Estimation"}),"\n",(0,t.jsxs)(n.p,{children:["The Apple Music API ",(0,t.jsx)(n.strong,{children:"does not provide timestamps"})," for when tracks were played. Multi-Scrobbler estimates play times by taking the current time and subtracting track durations backwards:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["The most recent track is assumed to have finished playing ",(0,t.jsx)(n.strong,{children:"now"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Each older track is estimated to have played ",(0,t.jsx)(n.code,{children:"duration"})," seconds before the previous one."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["For the most accurate scrobble timestamps, it is highly recommended to keep the polling interval (",(0,t.jsx)(n.code,{children:"APPLEMUSIC_INTERVAL"}),") low (the default is 60 seconds)."]})}),"\n",(0,t.jsx)(n.h4,{id:"duplicate-play-recovery",children:"Duplicate Play Recovery"}),"\n",(0,t.jsx)(n.p,{children:"The Apple Music history API strictly deduplicates tracks. Instead of showing the same song multiple times in a row, it simply bumps the re-played track back to the #1 spot and removes the older entry."}),"\n",(0,t.jsxs)(n.p,{children:["For example, if you listen to ",(0,t.jsx)(n.strong,{children:"Song A"})," \u2192 ",(0,t.jsx)(n.strong,{children:"Song B"}),", your history is ",(0,t.jsx)(n.code,{children:"[Song B, Song A]"}),". If you then listen to ",(0,t.jsx)(n.strong,{children:"Song A"})," again, the API returns ",(0,t.jsx)(n.code,{children:"[Song A, Song B]"})," (Song A was bumped to the top)."]}),"\n",(0,t.jsx)(n.p,{children:'If Multi-Scrobbler polled when the top track was Song A, and polls again after it\'s bumped back to the top, the top track appears functionally unchanged. This usually confuses standard scrobblers into ignoring the update entirely. By default, MS correctly detects this "top-rebound" pattern, extracts the intermediate tracks that were squeezed in (Song B), and scrobbles Song A again as a re-listen.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["Note: Because of this strict deduplication, ",(0,t.jsx)(n.strong,{children:'"pure loops"'})," (listening to Song A continuously on repeat without playing anything else in between) cannot be tracked. The history list never changes shape, so MS has no way of knowing it was played again."]})}),"\n",(0,t.jsxs)(n.p,{children:["If you ever experience false positives (tracks being scrobbled that you didn't actually re-listen to), you can disable this recovery behavior with ",(0,t.jsx)(n.code,{children:'"recoverUnchangedTopHistory": false'})," in your config options or by setting the ",(0,t.jsx)(n.code,{children:"APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY=false"})," env var."]}),"\n",(0,t.jsx)(n.h4,{id:"album-name-normalization",children:"Album name normalization"}),"\n",(0,t.jsxs)(n.p,{children:["The Apple Music API appends ",(0,t.jsx)(n.code,{children:" - EP"})," or ",(0,t.jsx)(n.code,{children:" - Single"})," to the album name for EPs and singles. These suffixes are ",(0,t.jsx)(n.em,{children:"not"})," part of the official names of the album and can cause issues when trying to scrobble or match metadata."]}),"\n",(0,t.jsx)(n.p,{children:"By default, Multi-Scrobbler strips these suffixes out so only the official name is used."}),"\n",(0,t.jsxs)(n.p,{children:["If you do not want this behavior it can be disabled with ENV ",(0,t.jsx)(n.code,{children:"APPLEMUSIC_NORMALIZE_ALBUM=false"})," or File/AIO option ",(0,t.jsx)(n.code,{children:'"normalizeAlbum": false'}),"."]}),"\n",(0,t.jsxs)(d,{type:"tip",summary:"Stripping Suffix with User Stage",children:[(0,t.jsxs)(n.p,{children:["If you still want this stripping functionality but with more control over how it is applied you can use a ",(0,t.jsx)(n.a,{href:"/configuration/transforms/user",children:"User Stage"}),"."]}),(0,t.jsx)(n.p,{children:"Here is an example of creating a User Stage to only strip suffixes for a specific scrobble client:"}),(0,t.jsxs)(a,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "user",\n "name": "AppleAlbumStip",\n "defaults": {\n "album": [\n "/ - (EP|Single)$/i"\n ]\n }\n }\n ]\n}\n'})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="applemusic.json"',children:'{\n {\n "id": "myAppleMusic",\n "name": "My Apple Music",\n "data": {\n // ...\n },\n // highlight-start\n "options": {\n "normalizeAlbum": false\n }\n // highlight-end\n }\n}\n'})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="lastfm.json"',children:'[\n {\n "name": "Foxx LFM Client",\n "id": "myLastFmClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "apiKey": "a89cba1569901a0671d5a9875fed4be1",\n "secret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n },\n // highlight-start\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "user",\n "name": "AppleAlbumStip",\n }\n ]\n }\n }\n // highlight-end\n }\n]\n'})})]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-reference",children:"Configuration Reference"}),"\n",(0,t.jsx)(s,{config:"AppleMusicSourceConfig",fileContent:'[\n {\n "id": "myAppleMusic",\n "name": "My Apple Music",\n "enable": true,\n "clients": [],\n "data": {\n // either key or token needs to be provided\n "key": {\n "id": "2HPSNJZ88N",\n "teamId": "SN6YASW8G4",\n "p8": "-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----"\n },\n "token": "your-jwt-token-here",\n "mediaUserToken": "your-media-user-token-here",\n\n // optional: Origin header for API requests (required when using a browser token)\n "origin": "https://music.apple.com",\n\n // optional: polling interval in seconds (default 60)\n "interval": 60\n },\n "options": {\n "logDiff": true,\n "recoverUnchangedTopHistory": true,\n "normalizeAlbum": true\n }\n }\n]\n',name:"applemusic",children:(0,t.jsx)(c,{})})]})}function j(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},1756(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/applemusic_chrome_devtools-6fd4f76ddb32d0c4ec673fd628c84317.png"},8090(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/applemusic_safari_devtools-055f3ea1147b02c77b0a937c45fb1bca.png"},911(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/applemusic_safari_settings-4eb2b2404f81979fe8f2a68df0c30ab8.png"}}]); \ No newline at end of file diff --git a/assets/js/bf69edfb.c50ccff0.js b/assets/js/bf69edfb.c50ccff0.js deleted file mode 100644 index a3a0164e..00000000 --- a/assets/js/bf69edfb.c50ccff0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7736"],{6684(e,n,i){i.r(n),i.d(n,{metadata:()=>r,default:()=>m,frontMatter:()=>a,contentTitle:()=>c,toc:()=>h,assets:()=>d});var r=JSON.parse('{"id":"installation/installation","title":"Overview","description":"Installation","source":"@site/docs/installation/installation.mdx","sourceDirName":"installation","slug":"/installation/","permalink":"/multi-scrobbler/installation/","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/installation/installation.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Overview","description":"Installation"},"sidebar":"tutorialSidebar","previous":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"},"next":{"title":"As a Service","permalink":"/multi-scrobbler/installation/service"}}'),s=i(4848),l=i(8453),t=i(8194),o=i(698);i(2170);let a={sidebar_position:1,title:"Overview",description:"Installation"},c,d={},h=[{value:"Docker",id:"docker",level:2},{value:"Recommended Settings",id:"recommended-settings",level:3},{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:"Config And Data Directories",id:"config-and-data-directories",level:4},{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 u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...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,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["For the difference between ",(0,s.jsx)(n.strong,{children:"ENV"})," and ",(0,s.jsx)(n.strong,{children:"File"})," examples in this document see ",(0,s.jsx)(n.a,{href:"/multi-scrobbler/configuration/#configuration-types",children:"Configuration Types"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,s.jsx)(n.p,{children:"Cross-platform images are built for x86 (Intel/AMD) and ARM64 (IE Raspberry Pi)"}),"\n",(0,s.jsx)(n.admonition,{title:"Available Images",type:"info",children:(0,s.jsxs)(t.A,{children:[(0,s.jsxs)(o.A,{value:"docker",label:"Dockerhub",children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/foxxmd/multi-scrobbler",children:"Repository Page"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"docker.io/foxxmd/multi-scrobbler:latest\n"})})]}),(0,s.jsxs)(o.A,{value:"ghcr",label:"Github Packages",children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pkgs/container/multi-scrobbler",children:"Repository Page"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"ghcr.io/foxxmd/multi-scrobbler:latest\n"})})]})]})}),"\n",(0,s.jsx)(n.h3,{id:"recommended-settings",children:"Recommended Settings"}),"\n",(0,s.jsxs)(t.A,{groupId:"dockerSetting",queryString:!0,children:[(0,s.jsxs)(o.A,{value:"storage",label:"Storage",children:[(0,s.jsxs)(n.p,{children:["You ",(0,s.jsx)(n.strong,{children:"should"})," bind a host directory into the container for storing configurations, credentials, database, and other files. Otherwise, these will be lost when the container is updated."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n // highlight-start\n volumes:\n - "./config:/config"\n // highlight-end\n'})}),(0,s.jsxs)(n.p,{children:["Optionally, use a separate directory for data (database, cache, etc...) by mounting an additional directory and setting the ",(0,s.jsx)(n.code,{children:"DATA_DIR"})," ENV to the directory that should be used inside the container:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n environment:\n # ...\n // highlight-start\n - DATA_DIR=/msData\n // highlight-end\n volumes:\n - "./config:/config" # used for config files\n // highlight-start\n - "./my/host/folder:/msData" # used for data files\n // highlight-end\n'})})]}),(0,s.jsxs)(o.A,{value:"networking",label:"Networking",children:[(0,s.jsxs)(n.p,{children:["If you are using a ",(0,s.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,s.jsx)(n.code,{children:"9078"}),"."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n // highlight-start\n ports:\n - "9078:9078"\n // highlight-end\n'})})]}),(0,s.jsxs)(o.A,{value:"baseUrl",label:"Base URL",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Optionally"}),", when"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["using a ",(0,s.jsx)(n.a,{href:"/multi-scrobbler/configuration/",children:"Source or Client"}),' that has a "Redirect URI" that you have not explicitly defined']}),"\n",(0,s.jsxs)(n.li,{children:["and","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"using a bridge network or"}),"\n",(0,s.jsx)(n.li,{children:"installing MS on a different machine than the one used to view the dashboard"}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsxs)(n.p,{children:["set the ",(0,s.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)"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n // highlight-start\n - BASE_URL=http://hostMachineIP\n // highlight-end\n"})})]}),(0,s.jsxs)(o.A,{value:"tz",label:"Timezone",children:[(0,s.jsxs)(n.p,{children:["Set the ",(0,s.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,s.jsx)(n.code,{children:"TZ"}),"."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n // highlight-start\n - TZ=America/New_York\n // highlight-end\n"})})]}),(0,s.jsxs)(o.A,{value:"linuxHost",label:"Linux Host",children:[(0,s.jsxs)(n.p,{children:["If you are running this container with ",(0,s.jsx)(n.strong,{children:"Docker"})," on a ",(0,s.jsx)(n.strong,{children:"Linux Host"})," you ",(0,s.jsx)(n.strong,{children:"should"})," specify ",(0,s.jsx)(n.code,{children:"user:group"})," permissions of the user who owns the ",(0,s.jsx)(n.strong,{children:"configuration and data directories"})," on the host to avoid ",(0,s.jsx)(n.a,{href:"https://ikriv.com/blog/?p=4698",children:"docker file permission problems."})," These can be specified using the ",(0,s.jsxs)(n.a,{href:"https://docs.linuxserver.io/general/understanding-puid-and-pgid",children:["environmental variables ",(0,s.jsx)(n.strong,{children:"PUID"})," and ",(0,s.jsx)(n.strong,{children:"PGID"}),"."]})]}),(0,s.jsx)(n.p,{children:"To get the UID and GID for the current user run these commands from a terminal:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"id -u"})," -- prints UID"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"id -g"})," -- prints GID"]}),"\n"]})]}),(0,s.jsxs)(o.A,{value:"ro",label:"Read Only",children:[(0,s.jsxs)(n.p,{children:["MS can be hardended by setting the file system as read only with ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/reference/compose-file/services/#read_only",children:(0,s.jsx)(n.code,{children:"read_only"})}),", with a few exceptions:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n # ...\n // highlight-start\n read_only: true\n tmpfs:\n - /run:exec\n - /tmp:noexec \n // highlight-end \n"})})]}),(0,s.jsxs)(o.A,{value:"caching",label:"Caching",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Optionally"}),", add a ",(0,s.jsx)(n.a,{href:"https://valkey.io/",children:"Valkey"})," service to your stack for ",(0,s.jsx)(n.a,{href:"/configuration#secondary-caching",children:"secondary caching"})," to take advantage of faster performance, reduced memory usage, and cached api calls to external services."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n # ...\n environment:\n # ...\n // highlight-start\n CACHE_VALKEY=redis://valkey:6379\n // highlight-end\n # ...\n\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"})})]})]}),"\n",(0,s.jsx)(n.h3,{id:"docker-usage-example",children:"Docker Usage Example"}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["See the ",(0,s.jsx)(n.a,{href:"/quickstart",children:(0,s.jsx)(n.strong,{children:"Quick Start Guide"})})," for another guided docker-compose example"]})}),"\n",(0,s.jsx)(n.p,{children:"The example scenario:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsxs)(n.a,{href:"/configuration/sources/jellyfin",children:["Jellyfin ",(0,s.jsx)(n.strong,{children:"Source"})]})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsxs)(n.a,{href:"/configuration/sources/maloja",children:["Maloja ",(0,s.jsx)(n.strong,{children:"Client"})]})}),"\n",(0,s.jsxs)(n.li,{children:["Serving app on port ",(0,s.jsx)(n.code,{children:"9078"})]}),"\n",(0,s.jsxs)(n.li,{children:["Docker container located on a different IP (",(0,s.jsx)(n.code,{children:"192.168.0.100"}),") so use ",(0,s.jsx)(n.a,{href:"/configuration#base-url",children:"Base URL"})]}),"\n",(0,s.jsxs)(n.li,{children:["Config/data directory on host machine in a directory next to ",(0,s.jsx)(n.code,{children:"docker-compose.yml"})]}),"\n",(0,s.jsxs)(n.li,{children:["Linux uid/gid is ",(0,s.jsx)(n.code,{children:"1000:1000"})]}),"\n",(0,s.jsx)(n.li,{children:"Optional caching using valkey (after uncommenting)"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["See ",(0,s.jsx)(n.a,{href:"#docker",children:(0,s.jsx)(n.code,{children:"docker-compose.yml"})})," sample above for more options and annotations."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.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 # uncomment along with valkey service/volume below for better caching\n #- CACHE_VALKEY=redis://valkey:6379\n volumes:\n - ./config:/config\n ports:\n - 9078:9078\n restart: unless-stopped\n \n #valkey:\n # image: valkey/valkey\n # volumes:\n # - valkeydata:/data\n\n#volumes:\n# valkeydata:\n# driver: local\n"})}),"\n",(0,s.jsx)(n.h2,{id:"local-installation",children:"Local Installation"}),"\n",(0,s.jsxs)(n.p,{children:["After installation see ",(0,s.jsx)(n.a,{href:"/multi-scrobbler/installation/service",children:"service.md"})," to configure multi-scrobbler to run automatically in the background."]}),"\n",(0,s.jsx)(n.h3,{id:"nodejs",children:"Nodejs"}),"\n",(0,s.jsxs)(n.p,{children:["Clone this repository somewhere using the latest ",(0,s.jsx)(n.a,{href:"/updating#git",children:"git tag"})," and then install from the working directory."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"git clone --branch <LATEST_RELEASE_TAG> 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,s.jsx)(n.h4,{id:"config-and-data-directories",children:"Config And Data Directories"}),"\n",(0,s.jsxs)(n.p,{children:["The directories MS uses for ",(0,s.jsx)(n.strong,{children:"Configuration"})," (",(0,s.jsx)(n.code,{children:"config.json"}),", ",(0,s.jsx)(n.code,{children:"jellyfin.json"}),", etc...) and ",(0,s.jsx)(n.strong,{children:"Data"})," (database, cache, etc...) can be specified by environmental variables passed directly to ",(0,s.jsx)(n.code,{children:"npm"}),"/",(0,s.jsx)(n.code,{children:"node"}),", or set in an ",(0,s.jsx)(n.code,{children:".env"})," file in the working directory."]}),"\n",(0,s.jsxs)(n.p,{children:["When parsing these ENVs MS will resolve relative directories but ",(0,s.jsx)(n.em,{children:"not"})," bash expansions like ",(0,s.jsx)(n.code,{children:"~"})," for home. Examples:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"CONFIG_DIR=/my/absolute/path"})," => sets directory to use for config files"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"DATA_DIR=./relative/data"})," => sets directory relative to working directory for data files"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If you do not set these environmental variables then MS will attempt to use OS-standardized directories:"}),"\n",(0,s.jsxs)(t.A,{children:[(0,s.jsx)(o.A,{value:"linux",label:"Linux",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Config => ",(0,s.jsx)(n.code,{children:"$XDG_CONFIG_HOME/multi-scrobbler"})," or ",(0,s.jsx)(n.code,{children:"~/.config/multi-scrobbler"})]}),"\n",(0,s.jsxs)(n.li,{children:["Data => ",(0,s.jsx)(n.code,{children:"$XDG_DATA_HOME/multi-scrobbler"})," or ",(0,s.jsx)(n.code,{children:"~/.local/share/multi-scrobbler"})]}),"\n"]})}),(0,s.jsx)(o.A,{value:"mac",label:"MacOS",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Config => ",(0,s.jsx)(n.code,{children:"~/Library/Preferences/multi-scrobbler"})]}),"\n",(0,s.jsxs)(n.li,{children:["Data => ",(0,s.jsx)(n.code,{children:"~/Library/Application Support/multi-scrobbler"})]}),"\n"]})}),(0,s.jsx)(o.A,{value:"win",label:"Windows",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Config => ",(0,s.jsx)(n.code,{children:"%APPDATA%\\multi-scrobbler\\Config"})]}),"\n",(0,s.jsxs)(n.li,{children:["Data => ",(0,s.jsx)(n.code,{children:"%LOCALAPPDATA%\\multi-scrobbler\\Data"})]}),"\n"]})})]}),"\n",(0,s.jsx)(n.h4,{id:"rollup-build-error",children:"Rollup build error"}),"\n",(0,s.jsxs)(n.p,{children:["During building if you encounter an error like: ",(0,s.jsx)(n.code,{children:'Your current platform "XXX" and architecture "XXX" combination is not yet supported by the native Rollup build.'})]}),"\n",(0,s.jsxs)(n.p,{children:["Modify ",(0,s.jsx)(n.code,{children:"overrides"})," in ",(0,s.jsx)(n.code,{children:"package.json"})," to use ",(0,s.jsx)(n.code,{children:"@rollup/wasm-node"})," as a drop-in replacement for rollup:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.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,s.jsxs)(n.p,{children:["See ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/135#issuecomment-1927080260",children:"this issue"})," for more detail."]}),"\n",(0,s.jsx)(n.h4,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,s.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,s.jsx)(o.A,{value:"env",label:"ENV",children:(0,s.jsx)(n.pre,{children:(0,s.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,s.jsxs)(o.A,{value:"file",label:"File",children:[(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)(n.code,{children:"./config/config.json"})}),(0,s.jsx)(n.pre,{children:(0,s.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,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"npm run start\n"})})]})]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The web UI and API is served on port ",(0,s.jsx)(n.code,{children:"9078"}),". This can be modified using the ",(0,s.jsx)(n.code,{children:"PORT"})," environmental variable."]})}),"\n",(0,s.jsx)(n.h3,{id:"flatpak",children:"Flatpak"}),"\n",(0,s.jsx)(n.admonition,{title:"Unsupported",type:"warning",children:(0,s.jsxs)(n.p,{children:["Flatpak/Flathub installs are no longer supported. You can still build MS as a ",(0,s.jsx)(n.a,{href:"../development/flatpak",children:"Flatpak app from source."})," See more information about ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/287",children:"Flatpak EOL."})]})})]})}function m(e={}){let{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/bf69edfb.d12f9775.js b/assets/js/bf69edfb.d12f9775.js new file mode 100644 index 00000000..81a9f556 --- /dev/null +++ b/assets/js/bf69edfb.d12f9775.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7736"],{6684(e,n,i){i.r(n),i.d(n,{metadata:()=>r,default:()=>m,frontMatter:()=>a,contentTitle:()=>c,toc:()=>h,assets:()=>d});var r=JSON.parse('{"id":"installation/installation","title":"Overview","description":"Installation","source":"@site/docs/installation/installation.mdx","sourceDirName":"installation","slug":"/installation/","permalink":"/multi-scrobbler/installation/","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/installation/installation.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Overview","description":"Installation"},"sidebar":"tutorialSidebar","previous":{"title":"Quickstart","permalink":"/multi-scrobbler/quickstart"},"next":{"title":"As a Service","permalink":"/multi-scrobbler/installation/service"}}'),s=i(4848),l=i(8453),t=i(8194),o=i(698);i(2170);let a={sidebar_position:1,title:"Overview",description:"Installation"},c,d={},h=[{value:"Docker",id:"docker",level:2},{value:"Recommended Settings",id:"recommended-settings",level:3},{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:"Config And Data Directories",id:"config-and-data-directories",level:4},{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 u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...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,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["For the difference between ",(0,s.jsx)(n.strong,{children:"ENV"})," and ",(0,s.jsx)(n.strong,{children:"File"})," examples in this document see ",(0,s.jsx)(n.a,{href:"/multi-scrobbler/configuration/#configuration-types",children:"Configuration Types"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,s.jsx)(n.p,{children:"Cross-platform images are built for x86 (Intel/AMD) and ARM64 (IE Raspberry Pi)"}),"\n",(0,s.jsx)(n.admonition,{title:"Available Images",type:"info",children:(0,s.jsxs)(t.A,{children:[(0,s.jsxs)(o.A,{value:"docker",label:"Dockerhub",children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/foxxmd/multi-scrobbler",children:"Repository Page"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"docker.io/foxxmd/multi-scrobbler:latest\n"})})]}),(0,s.jsxs)(o.A,{value:"ghcr",label:"Github Packages",children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pkgs/container/multi-scrobbler",children:"Repository Page"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"ghcr.io/foxxmd/multi-scrobbler:latest\n"})})]})]})}),"\n",(0,s.jsx)(n.h3,{id:"recommended-settings",children:"Recommended Settings"}),"\n",(0,s.jsxs)(t.A,{groupId:"dockerSetting",queryString:!0,children:[(0,s.jsxs)(o.A,{value:"storage",label:"Storage",children:[(0,s.jsxs)(n.p,{children:["You ",(0,s.jsx)(n.strong,{children:"should"})," bind a host directory into the container for storing configurations, credentials, database, and other files. Otherwise, these will be lost when the container is updated."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n // highlight-start\n volumes:\n - "./config:/config"\n // highlight-end\n'})}),(0,s.jsxs)(n.p,{children:["Optionally, use a separate directory for data (database, cache, etc...) by mounting an additional directory and setting the ",(0,s.jsx)(n.code,{children:"DATA_DIR"})," ENV to the directory that should be used inside the container:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n environment:\n # ...\n // highlight-start\n - DATA_DIR=/msData\n // highlight-end\n volumes:\n - "./config:/config" # used for config files\n // highlight-start\n - "./my/host/folder:/msData" # used for data files\n // highlight-end\n'})})]}),(0,s.jsxs)(o.A,{value:"networking",label:"Networking",children:[(0,s.jsxs)(n.p,{children:["If you are using a ",(0,s.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,s.jsx)(n.code,{children:"9078"}),"."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:'services:\n multi-scrobbler:\n # ...\n // highlight-start\n ports:\n - "9078:9078"\n // highlight-end\n'})})]}),(0,s.jsxs)(o.A,{value:"baseUrl",label:"Base URL",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Optionally"}),", when"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["using a ",(0,s.jsx)(n.a,{href:"/multi-scrobbler/configuration/",children:"Source or Client"}),' that has a "Redirect URI" that you have not explicitly defined']}),"\n",(0,s.jsxs)(n.li,{children:["and","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"using a bridge network or"}),"\n",(0,s.jsx)(n.li,{children:"installing MS on a different machine than the one used to view the dashboard"}),"\n"]}),"\n"]}),"\n"]}),(0,s.jsxs)(n.p,{children:["set the ",(0,s.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)"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n // highlight-start\n - BASE_URL=http://hostMachineIP\n // highlight-end\n"})})]}),(0,s.jsxs)(o.A,{value:"tz",label:"Timezone",children:[(0,s.jsxs)(n.p,{children:["Set the ",(0,s.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,s.jsx)(n.code,{children:"TZ"}),"."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n # ...\n environment:\n # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n // highlight-start\n - TZ=America/New_York\n // highlight-end\n"})})]}),(0,s.jsxs)(o.A,{value:"linuxHost",label:"Linux Host",children:[(0,s.jsxs)(n.p,{children:["If you are running this container with ",(0,s.jsx)(n.strong,{children:"Docker"})," on a ",(0,s.jsx)(n.strong,{children:"Linux Host"})," you ",(0,s.jsx)(n.strong,{children:"should"})," specify ",(0,s.jsx)(n.code,{children:"user:group"})," permissions of the user who owns the ",(0,s.jsx)(n.strong,{children:"configuration and data directories"})," on the host to avoid ",(0,s.jsx)(n.a,{href:"https://ikriv.com/blog/?p=4698",children:"docker file permission problems."})," These can be specified using the ",(0,s.jsxs)(n.a,{href:"https://docs.linuxserver.io/general/understanding-puid-and-pgid",children:["environmental variables ",(0,s.jsx)(n.strong,{children:"PUID"})," and ",(0,s.jsx)(n.strong,{children:"PGID"}),"."]})]}),(0,s.jsx)(n.p,{children:"To get the UID and GID for the current user run these commands from a terminal:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"id -u"})," -- prints UID"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"id -g"})," -- prints GID"]}),"\n"]})]}),(0,s.jsxs)(o.A,{value:"ro",label:"Read Only",children:[(0,s.jsxs)(n.p,{children:["MS can be hardended by setting the file system as read only with ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/reference/compose-file/services/#read_only",children:(0,s.jsx)(n.code,{children:"read_only"})}),", with a few exceptions:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n # ...\n // highlight-start\n read_only: true\n tmpfs:\n - /run:exec\n - /tmp:noexec \n // highlight-end \n"})})]}),(0,s.jsxs)(o.A,{value:"caching",label:"Caching",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Optionally"}),", add a ",(0,s.jsx)(n.a,{href:"https://valkey.io/",children:"Valkey"})," service to your stack for ",(0,s.jsx)(n.a,{href:"/configuration#secondary-caching",children:"secondary caching"})," to take advantage of faster performance, reduced memory usage, and cached api calls to external services."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yml"',children:"services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n # ...\n environment:\n # ...\n // highlight-start\n CACHE_VALKEY=redis://valkey:6379\n // highlight-end\n # ...\n\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"})})]})]}),"\n",(0,s.jsx)(n.h3,{id:"docker-usage-example",children:"Docker Usage Example"}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["See the ",(0,s.jsx)(n.a,{href:"/quickstart",children:(0,s.jsx)(n.strong,{children:"Quick Start Guide"})})," for another guided docker-compose example"]})}),"\n",(0,s.jsx)(n.p,{children:"The example scenario:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsxs)(n.a,{href:"/configuration/sources/jellyfin",children:["Jellyfin ",(0,s.jsx)(n.strong,{children:"Source"})]})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsxs)(n.a,{href:"/configuration/sources/maloja",children:["Maloja ",(0,s.jsx)(n.strong,{children:"Client"})]})}),"\n",(0,s.jsxs)(n.li,{children:["Serving app on port ",(0,s.jsx)(n.code,{children:"9078"})]}),"\n",(0,s.jsxs)(n.li,{children:["Docker container located on a different IP (",(0,s.jsx)(n.code,{children:"192.168.0.100"}),") so use ",(0,s.jsx)(n.a,{href:"/configuration#base-url",children:"Base URL"})]}),"\n",(0,s.jsxs)(n.li,{children:["Config/data directory on host machine in a directory next to ",(0,s.jsx)(n.code,{children:"docker-compose.yml"})]}),"\n",(0,s.jsxs)(n.li,{children:["Linux uid/gid is ",(0,s.jsx)(n.code,{children:"1000:1000"})]}),"\n",(0,s.jsx)(n.li,{children:"Optional caching using valkey (after uncommenting)"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["See ",(0,s.jsx)(n.a,{href:"#docker",children:(0,s.jsx)(n.code,{children:"docker-compose.yml"})})," sample above for more options and annotations."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.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 # uncomment along with valkey service/volume below for better caching\n #- CACHE_VALKEY=redis://valkey:6379\n volumes:\n - ./config:/config\n ports:\n - 9078:9078\n restart: unless-stopped\n \n #valkey:\n # image: valkey/valkey\n # volumes:\n # - valkeydata:/data\n\n#volumes:\n# valkeydata:\n# driver: local\n"})}),"\n",(0,s.jsx)(n.h2,{id:"local-installation",children:"Local Installation"}),"\n",(0,s.jsxs)(n.p,{children:["After installation see ",(0,s.jsx)(n.a,{href:"/multi-scrobbler/installation/service",children:"service.md"})," to configure multi-scrobbler to run automatically in the background."]}),"\n",(0,s.jsx)(n.h3,{id:"nodejs",children:"Nodejs"}),"\n",(0,s.jsxs)(n.p,{children:["Clone this repository somewhere using the latest ",(0,s.jsx)(n.a,{href:"/updating#git",children:"git tag"})," and then install from the working directory."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"git clone --branch <LATEST_RELEASE_TAG> 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,s.jsx)(n.h4,{id:"config-and-data-directories",children:"Config And Data Directories"}),"\n",(0,s.jsxs)(n.p,{children:["The directories MS uses for ",(0,s.jsx)(n.strong,{children:"Configuration"})," (",(0,s.jsx)(n.code,{children:"config.json"}),", ",(0,s.jsx)(n.code,{children:"jellyfin.json"}),", etc...) and ",(0,s.jsx)(n.strong,{children:"Data"})," (database, cache, etc...) can be specified by environmental variables passed directly to ",(0,s.jsx)(n.code,{children:"npm"}),"/",(0,s.jsx)(n.code,{children:"node"}),", or set in an ",(0,s.jsx)(n.code,{children:".env"})," file in the working directory."]}),"\n",(0,s.jsxs)(n.p,{children:["When parsing these ENVs MS will resolve relative directories but ",(0,s.jsx)(n.em,{children:"not"})," bash expansions like ",(0,s.jsx)(n.code,{children:"~"})," for home. Examples:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"CONFIG_DIR=/my/absolute/path"})," => sets directory to use for config files"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"DATA_DIR=./relative/data"})," => sets directory relative to working directory for data files"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If you do not set these environmental variables then MS will attempt to use OS-standardized directories:"}),"\n",(0,s.jsxs)(t.A,{children:[(0,s.jsx)(o.A,{value:"linux",label:"Linux",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Config => ",(0,s.jsx)(n.code,{children:"$XDG_CONFIG_HOME/multi-scrobbler"})," or ",(0,s.jsx)(n.code,{children:"~/.config/multi-scrobbler"})]}),"\n",(0,s.jsxs)(n.li,{children:["Data => ",(0,s.jsx)(n.code,{children:"$XDG_DATA_HOME/multi-scrobbler"})," or ",(0,s.jsx)(n.code,{children:"~/.local/share/multi-scrobbler"})]}),"\n"]})}),(0,s.jsx)(o.A,{value:"mac",label:"MacOS",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Config => ",(0,s.jsx)(n.code,{children:"~/Library/Preferences/multi-scrobbler"})]}),"\n",(0,s.jsxs)(n.li,{children:["Data => ",(0,s.jsx)(n.code,{children:"~/Library/Application Support/multi-scrobbler"})]}),"\n"]})}),(0,s.jsx)(o.A,{value:"win",label:"Windows",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Config => ",(0,s.jsx)(n.code,{children:"%APPDATA%\\multi-scrobbler\\Config"})]}),"\n",(0,s.jsxs)(n.li,{children:["Data => ",(0,s.jsx)(n.code,{children:"%LOCALAPPDATA%\\multi-scrobbler\\Data"})]}),"\n"]})})]}),"\n",(0,s.jsx)(n.h4,{id:"rollup-build-error",children:"Rollup build error"}),"\n",(0,s.jsxs)(n.p,{children:["During building if you encounter an error like: ",(0,s.jsx)(n.code,{children:'Your current platform "XXX" and architecture "XXX" combination is not yet supported by the native Rollup build.'})]}),"\n",(0,s.jsxs)(n.p,{children:["Modify ",(0,s.jsx)(n.code,{children:"overrides"})," in ",(0,s.jsx)(n.code,{children:"package.json"})," to use ",(0,s.jsx)(n.code,{children:"@rollup/wasm-node"})," as a drop-in replacement for rollup:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.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,s.jsxs)(n.p,{children:["See ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/135#issuecomment-1927080260",children:"this issue"})," for more detail."]}),"\n",(0,s.jsx)(n.h4,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,s.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,s.jsx)(o.A,{value:"env",label:"ENV",children:(0,s.jsx)(n.pre,{children:(0,s.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,s.jsxs)(o.A,{value:"file",label:"File",children:[(0,s.jsxs)(i,{children:[(0,s.jsx)("summary",{children:(0,s.jsx)(n.code,{children:"./config/config.json"})}),(0,s.jsx)(n.pre,{children:(0,s.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,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"npm run start\n"})})]})]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The web UI and API is served on port ",(0,s.jsx)(n.code,{children:"9078"}),". This can be modified using the ",(0,s.jsx)(n.code,{children:"PORT"})," environmental variable."]})}),"\n",(0,s.jsx)(n.h3,{id:"flatpak",children:"Flatpak"}),"\n",(0,s.jsx)(n.admonition,{title:"Unsupported",type:"warning",children:(0,s.jsxs)(n.p,{children:["Flatpak/Flathub installs are no longer supported. You can still build MS as a ",(0,s.jsx)(n.a,{href:"../development/flatpak",children:"Flatpak app from source."})," See more information about ",(0,s.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/287",children:"Flatpak EOL."})]})})]})}function m(e={}){let{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/c2e935db.64d4c215.js b/assets/js/c2e935db.64d4c215.js new file mode 100644 index 00000000..a87daf71 --- /dev/null +++ b/assets/js/c2e935db.64d4c215.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1785"],{8537(e,n,t){t.r(n),t.d(n,{metadata:()=>s,default:()=>h,frontMatter:()=>r,contentTitle:()=>c,toc:()=>a,assets:()=>l});var s=JSON.parse('{"id":"development/dev-common","title":"Common Development","description":"Common Development Knowledge","source":"@site/docs/development/dev-common.md","sourceDirName":"development","slug":"/development/dev-common","permalink":"/multi-scrobbler/development/dev-common","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/development/dev-common.md?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"sidebar_position":1,"title":"Common Development","description":"Common Development Knowledge"},"sidebar":"tutorialSidebar","previous":{"title":"Development","permalink":"/multi-scrobbler/category/development"},"next":{"title":"Source Development/Tutorial","permalink":"/multi-scrobbler/development/dev-source"}}'),i=t(4848),o=t(8453);let r={toc_min_heading_level:2,toc_max_heading_level:5,sidebar_position:1,title:"Common Development",description:"Common Development Knowledge"},c="Development",l={},a=[{value:"Architecture",id:"architecture",level:2},{value:"Project Setup",id:"project-setup",level:2},{value:"VSCode",id:"vscode",level:3},{value:"Common Development",id:"common-development",level:2},{value:"Config",id:"config",level:3},{value:"Concrete Class",id:"concrete-class",level:3},{value:"Stages",id:"stages",level:4},{value:"Stage: Build Data",id:"stage-build-data",level:5},{value:"Stage: Check Connection",id:"stage-check-connection",level:5},{value:"Stage: Test Auth",id:"stage-test-auth",level:5},{value:"Play Object",id:"play-object",level:3},{value:"Creating Clients and Sources",id:"creating-clients-and-sources",level:2},{value:"Profiling",id:"profiling",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Details: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.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,i.jsx)(n.h2,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsxs)(n.p,{children:["Multi-scrobbler is written entirely in ",(0,i.jsx)(n.a,{href:"https://www.typescriptlang.org/",children:"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 ",(0,i.jsx)(n.a,{href:"https://expressjs.com/",children:"expressjs"}),", and serves the frontend. The frontend is a standalone ",(0,i.jsx)(n.a,{href:"https://vitejs.dev/",children:"Vitejs"})," app that communicates via API to the backend in order to render the dashboard."]}),"\n",(0,i.jsx)(n.h2,{id:"project-setup",children:"Project Setup"}),"\n",(0,i.jsxs)(n.p,{children:["Development requires ",(0,i.jsx)(n.a,{href:"https://nodejs.org/en",children:"Node v18.19.1"})," or higher is installed on your system."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["When running locally (not with a devcontainer) you can use ",(0,i.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"nvm"})," to manage the installed node version."]})}),"\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, sets correct node version when running without devcontainer\nnpm install\nnpm run start\n"})}),"\n",(0,i.jsx)(n.h3,{id:"vscode",children:"VSCode"}),"\n",(0,i.jsxs)(n.p,{children:["This repository contains ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/.devcontainer",children:"workspace settings"})," for development with VSCode. These include:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Run/Debug ",(0,i.jsx)(n.a,{href:"https://code.visualstudio.com/Docs/editor/debugging#_launch-configurations",children:"Launch configurations"})," for the application and tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://code.visualstudio.com/docs/devcontainers/containers",children:"Devcontainer"})," for development with all dependencies already installed"]}),"\n",(0,i.jsx)(n.li,{children:"Useful extensions for linting and running tests"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:['To use the Devcontainer simple open the repository in VSCode and "Use Devcontainer" when the notification is presented. ',(0,i.jsx)(n.code,{children:"npm install"})," will be run when a new container is created."]}),"\n",(0,i.jsx)(n.h2,{id:"common-development",children:"Common Development"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["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 ",(0,i.jsx)(n.strong,{children:"Component."})]})}),"\n",(0,i.jsx)(n.p,{children:"A Component is composed of two parts:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Typescript interfaces describing structure of configuration for that Component"}),"\n",(0,i.jsx)(n.li,{children:'A concrete class inheriting from a common "startup" abstract class that enforces how the Component is built and operates'}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In both parts Source/Clients share some common properties/behavior before diverging in how they operate."}),"\n",(0,i.jsx)(n.h3,{id:"config",children:"Config"}),"\n",(0,i.jsxs)(n.p,{children:["The configuration for a Component should always have this minimum shape, enforced respectively by the interfaces ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/infrastructure/config/source/index.ts#L105",children:"CommonSourceConfig"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/ce1c70a4e1e87fb5bea7cca960eaafbd15881a1f/src/backend/common/infrastructure/config/client/index.ts#L68",children:"CommonClientConfig"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"interface MyConfig {\n name: string\n data?: object\n options?: object\n}\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"data"})," contains data that is required for a Component to operate such as credentials, callback urls, api keys, endpoints, etc..."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"options"})," are ",(0,i.jsx)(n.strong,{children:"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"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"concrete-class",children:"Concrete Class"}),"\n",(0,i.jsxs)(n.p,{children:["Components inherit from an abstract base class, ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts",children:(0,i.jsx)(n.code,{children:"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...']}),"\n",(0,i.jsx)(n.h4,{id:"stages",children:"Stages"}),"\n",(0,i.jsx)(n.p,{children:"Stages below are invoked in the order listed. All stages are asynchronous to allow fetching network requests or reading files."}),"\n",(0,i.jsx)(n.p,{children:"The stage function (described in each stage below) should return a value or throw:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["return ",(0,i.jsx)(n.code,{children:"null"})," if the stage is not required"]}),"\n",(0,i.jsxs)(n.li,{children:["return ",(0,i.jsx)(n.code,{children:"true"})," if the stage succeeded"]}),"\n",(0,i.jsxs)(n.li,{children:["return a ",(0,i.jsx)(n.code,{children:"string"})," if the stage succeeded and you wish to append a result to the log output for this stage"]}),"\n",(0,i.jsxs)(n.li,{children:["throw an ",(0,i.jsx)(n.code,{children:"Exception"})," if the stage failed for any reason and the Component should not continue to run/start up"]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"stage-build-data",children:"Stage: Build Data"}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Implement ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts#L71",children:(0,i.jsx)(n.code,{children:"doBuildInitData"})})," in your child class to invoke this stage."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Parse a full URL like ",(0,i.jsx)(n.code,{children:"http://SOME_IP:7000/subfolder/api"})," from user config containing a base url like ",(0,i.jsx)(n.code,{children:"data.baseUrl: 'SOME_IP'"})," and then store this in the class config"]}),"\n",(0,i.jsxs)(n.li,{children:["Validate that config ",(0,i.jsx)(n.code,{children:"data"})," contains required properties ",(0,i.jsx)(n.code,{children:"user"})," ",(0,i.jsx)(n.code,{children:"password"})," ",(0,i.jsx)(n.code,{children:"salt"})]}),"\n",(0,i.jsxs)(n.li,{children:["Read stored credentials from ",(0,i.jsx)(n.code,{children:"${this.configDir}/currentCreds-MySource-${name}.json"}),";"]}),"\n"]})]}),"\n",(0,i.jsx)(n.h5,{id:"stage-check-connection",children:"Stage: Check Connection"}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsxs)(n.p,{children:["If the Component depends on ",(0,i.jsx)(n.strong,{children:"ingress"})," (like Jellyfin/Plex webhook) this stage is not necessary."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Implement ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts#L103",children:(0,i.jsx)(n.code,{children:"doCheckConnection"})})," in your child class to invoke this stage."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Make a ",(0,i.jsx)(n.a,{href:"https://nodejs.org/docs/latest-v18.x/api/http.html#httprequesturl-options-callback",children:(0,i.jsx)(n.code,{children:"request"})})," to the service's server to ensure it is accessible"]}),"\n",(0,i.jsx)(n.li,{children:"Open a websocket connection and check for a ping-pong"}),"\n"]})]}),"\n",(0,i.jsx)(n.h5,{id:"stage-test-auth",children:"Stage: Test Auth"}),"\n",(0,i.jsxs)(n.p,{children:["MS determines if Auth is required for a Component based on two class properties. You should set these properties during ",(0,i.jsx)(n.code,{children:"constructor"})," initialization for your Component class:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"requiresAuth"})," - (default ",(0,i.jsx)(n.code,{children:"false"}),") Set to ",(0,i.jsx)(n.code,{children:"true"})," if MS should check/test Auth for this Component"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"requiresAuthInteraction"})," - (default ",(0,i.jsx)(n.code,{children:"false"}),") Set to ",(0,i.jsx)(n.code,{children:"true"})," if user interaction is required to complete auth IE user needs to visit a callback URL"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsx)(n.p,{children:"This stage should return:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"true"})," if auth succeeded"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"false"})," if auth failed without unexpected errors","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"IE the authentication data is not valid and requires user interaction to resolve the failure"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"throw an exception if network failure or unexpected error occurred"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You ",(0,i.jsx)(n.em,{children:"should"})," attempt to re-authenticate, if possible. Only throw an exception or return ",(0,i.jsx)(n.code,{children:"false"})," if there is no way to recover from an authentication failure."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Implement ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts#L111",children:(0,i.jsx)(n.code,{children:"doAuthentication"})})," in your child class to invoke this stage."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Generate a Bearer Token for Basic Auth from user/password given in config and store in class properties"}),"\n",(0,i.jsx)(n.li,{children:"Make a request to a known endpoint with Authorization token from read credentials file to see if succeeds or returns 403"}),"\n",(0,i.jsx)(n.li,{children:"Catch a 403 and attempt to reauthenticate at an auth endpoint with user/password given in config"}),"\n"]})]}),"\n",(0,i.jsx)(n.h3,{id:"play-object",children:"Play Object"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"PlayObject"})," is the standard data structure MS uses to store listen (track) information and data required for scrobbling. It consists of:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Track Data -- a standard format for storing track, artists, album, track duration, the date the track was played at, etc..."}),"\n",(0,i.jsxs)(n.li,{children:["Listen Metadata -- Optional but useful data related to the specific play or specifics about the Source/Client context for this play such as","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Platform specific ID, web URL to track, device/user ID that played this track, etc..."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Both Sources and Clients use the ",(0,i.jsx)(n.strong,{children:"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."]}),"\n",(0,i.jsxs)(n.p,{children:["For more refer to the TS documentation for ",(0,i.jsx)(n.code,{children:"PlayObject"})," or ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/core/Atomic.ts#L141",children:(0,i.jsx)(n.code,{children:"AmbPlayObject"})})," in your project"]}),"\n",(0,i.jsx)(n.h2,{id:"creating-clients-and-sources",children:"Creating Clients and Sources"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/multi-scrobbler/development/dev-source",children:"Source Development and Tutorial"})}),"\n",(0,i.jsx)(n.li,{children:"Client Development and Tutorial (TBD)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"profiling",children:"Profiling"}),"\n",(0,i.jsx)(n.p,{children:"Run tsx with inspect args"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"NODE_ENV=production node node_modules/.bin/tsx --inspect --heap-prof src/backend/index.ts\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"chrome://inspect"})," from a chromium-based browser and attach to the running process, usually ",(0,i.jsx)(n.code,{children:"localhost:9229"})]}),"\n",(0,i.jsx)(n.p,{children:"From the opened DevTools window use Performance or Memory to profile the running process."})]})}function h(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/c2e935db.ed551359.js b/assets/js/c2e935db.ed551359.js deleted file mode 100644 index 2262a084..00000000 --- a/assets/js/c2e935db.ed551359.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1785"],{8537(e,n,t){t.r(n),t.d(n,{metadata:()=>s,default:()=>h,frontMatter:()=>r,contentTitle:()=>c,toc:()=>a,assets:()=>l});var s=JSON.parse('{"id":"development/dev-common","title":"Common Development","description":"Common Development Knowledge","source":"@site/docs/development/dev-common.md","sourceDirName":"development","slug":"/development/dev-common","permalink":"/multi-scrobbler/development/dev-common","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/development/dev-common.md?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"toc_min_heading_level":2,"toc_max_heading_level":5,"sidebar_position":1,"title":"Common Development","description":"Common Development Knowledge"},"sidebar":"tutorialSidebar","previous":{"title":"Development","permalink":"/multi-scrobbler/category/development"},"next":{"title":"Source Development/Tutorial","permalink":"/multi-scrobbler/development/dev-source"}}'),i=t(4848),o=t(8453);let r={toc_min_heading_level:2,toc_max_heading_level:5,sidebar_position:1,title:"Common Development",description:"Common Development Knowledge"},c="Development",l={},a=[{value:"Architecture",id:"architecture",level:2},{value:"Project Setup",id:"project-setup",level:2},{value:"VSCode",id:"vscode",level:3},{value:"Common Development",id:"common-development",level:2},{value:"Config",id:"config",level:3},{value:"Concrete Class",id:"concrete-class",level:3},{value:"Stages",id:"stages",level:4},{value:"Stage: Build Data",id:"stage-build-data",level:5},{value:"Stage: Check Connection",id:"stage-check-connection",level:5},{value:"Stage: Test Auth",id:"stage-test-auth",level:5},{value:"Play Object",id:"play-object",level:3},{value:"Creating Clients and Sources",id:"creating-clients-and-sources",level:2},{value:"Profiling",id:"profiling",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Details: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.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,i.jsx)(n.h2,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsxs)(n.p,{children:["Multi-scrobbler is written entirely in ",(0,i.jsx)(n.a,{href:"https://www.typescriptlang.org/",children:"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 ",(0,i.jsx)(n.a,{href:"https://expressjs.com/",children:"expressjs"}),", and serves the frontend. The frontend is a standalone ",(0,i.jsx)(n.a,{href:"https://vitejs.dev/",children:"Vitejs"})," app that communicates via API to the backend in order to render the dashboard."]}),"\n",(0,i.jsx)(n.h2,{id:"project-setup",children:"Project Setup"}),"\n",(0,i.jsxs)(n.p,{children:["Development requires ",(0,i.jsx)(n.a,{href:"https://nodejs.org/en",children:"Node v18.19.1"})," or higher is installed on your system."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["When running locally (not with a devcontainer) you can use ",(0,i.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"nvm"})," to manage the installed node version."]})}),"\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, sets correct node version when running without devcontainer\nnpm install\nnpm run start\n"})}),"\n",(0,i.jsx)(n.h3,{id:"vscode",children:"VSCode"}),"\n",(0,i.jsxs)(n.p,{children:["This repository contains ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/.devcontainer",children:"workspace settings"})," for development with VSCode. These include:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Run/Debug ",(0,i.jsx)(n.a,{href:"https://code.visualstudio.com/Docs/editor/debugging#_launch-configurations",children:"Launch configurations"})," for the application and tests"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://code.visualstudio.com/docs/devcontainers/containers",children:"Devcontainer"})," for development with all dependencies already installed"]}),"\n",(0,i.jsx)(n.li,{children:"Useful extensions for linting and running tests"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:['To use the Devcontainer simple open the repository in VSCode and "Use Devcontainer" when the notification is presented. ',(0,i.jsx)(n.code,{children:"npm install"})," will be run when a new container is created."]}),"\n",(0,i.jsx)(n.h2,{id:"common-development",children:"Common Development"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["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 ",(0,i.jsx)(n.strong,{children:"Component."})]})}),"\n",(0,i.jsx)(n.p,{children:"A Component is composed of two parts:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Typescript interfaces describing structure of configuration for that Component"}),"\n",(0,i.jsx)(n.li,{children:'A concrete class inheriting from a common "startup" abstract class that enforces how the Component is built and operates'}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In both parts Source/Clients share some common properties/behavior before diverging in how they operate."}),"\n",(0,i.jsx)(n.h3,{id:"config",children:"Config"}),"\n",(0,i.jsxs)(n.p,{children:["The configuration for a Component should always have this minimum shape, enforced respectively by the interfaces ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/infrastructure/config/source/index.ts#L105",children:"CommonSourceConfig"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/ce1c70a4e1e87fb5bea7cca960eaafbd15881a1f/src/backend/common/infrastructure/config/client/index.ts#L68",children:"CommonClientConfig"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"interface MyConfig {\n name: string\n data?: object\n options?: object\n}\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"data"})," contains data that is required for a Component to operate such as credentials, callback urls, api keys, endpoints, etc..."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"options"})," are ",(0,i.jsx)(n.strong,{children:"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"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"concrete-class",children:"Concrete Class"}),"\n",(0,i.jsxs)(n.p,{children:["Components inherit from an abstract base class, ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts",children:(0,i.jsx)(n.code,{children:"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...']}),"\n",(0,i.jsx)(n.h4,{id:"stages",children:"Stages"}),"\n",(0,i.jsx)(n.p,{children:"Stages below are invoked in the order listed. All stages are asynchronous to allow fetching network requests or reading files."}),"\n",(0,i.jsx)(n.p,{children:"The stage function (described in each stage below) should return a value or throw:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["return ",(0,i.jsx)(n.code,{children:"null"})," if the stage is not required"]}),"\n",(0,i.jsxs)(n.li,{children:["return ",(0,i.jsx)(n.code,{children:"true"})," if the stage succeeded"]}),"\n",(0,i.jsxs)(n.li,{children:["return a ",(0,i.jsx)(n.code,{children:"string"})," if the stage succeeded and you wish to append a result to the log output for this stage"]}),"\n",(0,i.jsxs)(n.li,{children:["throw an ",(0,i.jsx)(n.code,{children:"Exception"})," if the stage failed for any reason and the Component should not continue to run/start up"]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"stage-build-data",children:"Stage: Build Data"}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Implement ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts#L71",children:(0,i.jsx)(n.code,{children:"doBuildInitData"})})," in your child class to invoke this stage."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Parse a full URL like ",(0,i.jsx)(n.code,{children:"http://SOME_IP:7000/subfolder/api"})," from user config containing a base url like ",(0,i.jsx)(n.code,{children:"data.baseUrl: 'SOME_IP'"})," and then store this in the class config"]}),"\n",(0,i.jsxs)(n.li,{children:["Validate that config ",(0,i.jsx)(n.code,{children:"data"})," contains required properties ",(0,i.jsx)(n.code,{children:"user"})," ",(0,i.jsx)(n.code,{children:"password"})," ",(0,i.jsx)(n.code,{children:"salt"})]}),"\n",(0,i.jsxs)(n.li,{children:["Read stored credentials from ",(0,i.jsx)(n.code,{children:"${this.configDir}/currentCreds-MySource-${name}.json"}),";"]}),"\n"]})]}),"\n",(0,i.jsx)(n.h5,{id:"stage-check-connection",children:"Stage: Check Connection"}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsxs)(n.p,{children:["If the Component depends on ",(0,i.jsx)(n.strong,{children:"ingress"})," (like Jellyfin/Plex webhook) this stage is not necessary."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Implement ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts#L103",children:(0,i.jsx)(n.code,{children:"doCheckConnection"})})," in your child class to invoke this stage."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Make a ",(0,i.jsx)(n.a,{href:"https://nodejs.org/docs/latest-v18.x/api/http.html#httprequesturl-options-callback",children:(0,i.jsx)(n.code,{children:"request"})})," to the service's server to ensure it is accessible"]}),"\n",(0,i.jsx)(n.li,{children:"Open a websocket connection and check for a ping-pong"}),"\n"]})]}),"\n",(0,i.jsx)(n.h5,{id:"stage-test-auth",children:"Stage: Test Auth"}),"\n",(0,i.jsxs)(n.p,{children:["MS determines if Auth is required for a Component based on two class properties. You should set these properties during ",(0,i.jsx)(n.code,{children:"constructor"})," initialization for your Component class:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"requiresAuth"})," - (default ",(0,i.jsx)(n.code,{children:"false"}),") Set to ",(0,i.jsx)(n.code,{children:"true"})," if MS should check/test Auth for this Component"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"requiresAuthInteraction"})," - (default ",(0,i.jsx)(n.code,{children:"false"}),") Set to ",(0,i.jsx)(n.code,{children:"true"})," if user interaction is required to complete auth IE user needs to visit a callback URL"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"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."}),"\n",(0,i.jsx)(n.p,{children:"This stage should return:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"true"})," if auth succeeded"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"false"})," if auth failed without unexpected errors","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"IE the authentication data is not valid and requires user interaction to resolve the failure"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"throw an exception if network failure or unexpected error occurred"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You ",(0,i.jsx)(n.em,{children:"should"})," attempt to re-authenticate, if possible. Only throw an exception or return ",(0,i.jsx)(n.code,{children:"false"})," if there is no way to recover from an authentication failure."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Implement ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/common/AbstractComponent.ts#L111",children:(0,i.jsx)(n.code,{children:"doAuthentication"})})," in your child class to invoke this stage."]})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsx)("summary",{children:"Examples"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Generate a Bearer Token for Basic Auth from user/password given in config and store in class properties"}),"\n",(0,i.jsx)(n.li,{children:"Make a request to a known endpoint with Authorization token from read credentials file to see if succeeds or returns 403"}),"\n",(0,i.jsx)(n.li,{children:"Catch a 403 and attempt to reauthenticate at an auth endpoint with user/password given in config"}),"\n"]})]}),"\n",(0,i.jsx)(n.h3,{id:"play-object",children:"Play Object"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"PlayObject"})," is the standard data structure MS uses to store listen (track) information and data required for scrobbling. It consists of:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Track Data -- a standard format for storing track, artists, album, track duration, the date the track was played at, etc..."}),"\n",(0,i.jsxs)(n.li,{children:["Listen Metadata -- Optional but useful data related to the specific play or specifics about the Source/Client context for this play such as","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Platform specific ID, web URL to track, device/user ID that played this track, etc..."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Both Sources and Clients use the ",(0,i.jsx)(n.strong,{children:"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."]}),"\n",(0,i.jsxs)(n.p,{children:["For more refer to the TS documentation for ",(0,i.jsx)(n.code,{children:"PlayObject"})," or ",(0,i.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/core/Atomic.ts#L141",children:(0,i.jsx)(n.code,{children:"AmbPlayObject"})})," in your project"]}),"\n",(0,i.jsx)(n.h2,{id:"creating-clients-and-sources",children:"Creating Clients and Sources"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/multi-scrobbler/development/dev-source",children:"Source Development and Tutorial"})}),"\n",(0,i.jsx)(n.li,{children:"Client Development and Tutorial (TBD)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"profiling",children:"Profiling"}),"\n",(0,i.jsx)(n.p,{children:"Run tsx with inspect args"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"NODE_ENV=production node node_modules/.bin/tsx --inspect --heap-prof src/backend/index.ts\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"chrome://inspect"})," from a chromium-based browser and attach to the running process, usually ",(0,i.jsx)(n.code,{children:"localhost:9229"})]}),"\n",(0,i.jsx)(n.p,{children:"From the opened DevTools window use Performance or Memory to profile the running process."})]})}function h(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/cdda7d53.15b867c8.js b/assets/js/cdda7d53.15b867c8.js new file mode 100644 index 00000000..ad9e7b4b --- /dev/null +++ b/assets/js/cdda7d53.15b867c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3763"],{1099(e,n,t){t.r(n),t.d(n,{metadata:()=>r,default:()=>m,frontMatter:()=>c,contentTitle:()=>d,toc:()=>j,assets:()=>h});var r=JSON.parse('{"id":"configuration/clients/maloja","title":"Maloja","description":"Setup a Maloja server if you have not already done this.","source":"@site/docs/configuration/clients/maloja.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/maloja","permalink":"/multi-scrobbler/configuration/clients/maloja","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/maloja.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Maloja","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/clients/listenbrainz"},"next":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/clients/rocksky"}}'),l=t(4848),i=t(8453);t(8194),t(698),t(2170);var o=t(4763);function s(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Environmental Variable"}),(0,l.jsx)(n.th,{children:"Type"}),(0,l.jsx)(n.th,{children:"Default"}),(0,l.jsx)(n.th,{children:"Description"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.em,{children:(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"MALOJA_ID"})})})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsx)(n.td,{}),(0,l.jsxs)(n.td,{children:["A globally unique ID EX ",(0,l.jsx)(n.code,{children:"myComponentId"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"MALOJA_NAME"})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsxs)(n.td,{children:["Value of ",(0,l.jsx)(n.code,{children:"MALOJA_ID"})]}),(0,l.jsxs)(n.td,{children:["A vanity name EX ",(0,l.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"MALOJA_ENABLE"})}),(0,l.jsx)(n.td,{children:"boolean"}),(0,l.jsx)(n.td,{children:"true"}),(0,l.jsx)(n.td,{children:"Should this component be used?"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.em,{children:(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"MALOJA_URL"})})})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsx)(n.td,{}),(0,l.jsx)(n.td,{children:"URL for maloja server"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.em,{children:(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"MALOJA_API_KEY"})})})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsx)(n.td,{}),(0,l.jsx)(n.td,{children:"API Key for Maloja server"})]})]})]})}function a(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(s,{...e})}):s(e)}let c={title:"Maloja",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},j=[{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:t,Details:r}=n;return t||u("Config",!0),r||u("Details",!0),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(n.p,{children:["Setup a ",(0,l.jsx)(n.a,{href:"https://github.com/krateng/maloja?tab=readme-ov-file#how-to-install",children:"Maloja server"})," if you have not already done this."]}),"\n",(0,l.jsxs)(r,{children:[(0,l.jsx)("summary",{children:"Maloja Setup Intructions"}),(0,l.jsxs)(n.p,{children:["Using Maloja's example ",(0,l.jsx)(n.code,{children:"docker-compose.yml"}),":"]}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",metastring:'reference title="~/malojaData/docker-compose.yml"',children:"https://github.com/krateng/maloja/blob/master/example-compose.yml\n"})}),(0,l.jsxs)(n.p,{children:["Uncomment ",(0,l.jsx)(n.code,{children:"environment"})," and add ",(0,l.jsx)(n.code,{children:"MALOJA_FORCE_PASSWORD=CHANGE_ME"})," to set an admin password"]}),(0,l.jsx)(n.p,{children:"Start the container:"}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",metastring:'title="~/malojaData"',children:"docker compose up -d\n"})})]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at ",(0,l.jsx)(n.a,{href:"http://myMalojaServerIP/admin_apikeys",children:"http://myMalojaServerIP/admin_apikeys"}),")","\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Create a ",(0,l.jsx)(n.strong,{children:"New Key"})," and then copy the generated key value"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Finally, add the Maloja server URL and API Key to the configuration type you choose to use, below."}),"\n",(0,l.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,l.jsx)(t,{config:"MalojaClientConfig",fileContent:o.A,client:!0,ambiguous:!0,name:"maloja",children:(0,l.jsx)(a,{})})]})}function m(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(x,{...e})}):x(e)}function u(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4763(e,n,t){t.d(n,{A:()=>r});let r='[\n {\n "name": "Maloja Client",\n "id": "myMalojaClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n },\n {\n "name": "Maloja Source",\n "id": "myMalojaSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/cdda7d53.3378a080.js b/assets/js/cdda7d53.3378a080.js deleted file mode 100644 index 51b34871..00000000 --- a/assets/js/cdda7d53.3378a080.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["3763"],{1099(e,n,t){t.r(n),t.d(n,{metadata:()=>r,default:()=>m,frontMatter:()=>c,contentTitle:()=>d,toc:()=>j,assets:()=>h});var r=JSON.parse('{"id":"configuration/clients/maloja","title":"Maloja","description":"Setup a Maloja server if you have not already done this.","source":"@site/docs/configuration/clients/maloja.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/maloja","permalink":"/multi-scrobbler/configuration/clients/maloja","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/maloja.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Maloja","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/clients/listenbrainz"},"next":{"title":"Rocksky","permalink":"/multi-scrobbler/configuration/clients/rocksky"}}'),l=t(4848),i=t(8453);t(8194),t(698),t(2170);var o=t(4763);function s(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Environmental Variable"}),(0,l.jsx)(n.th,{children:"Type"}),(0,l.jsx)(n.th,{children:"Default"}),(0,l.jsx)(n.th,{children:"Description"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.em,{children:(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"MALOJA_ID"})})})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsx)(n.td,{}),(0,l.jsxs)(n.td,{children:["A globally unique ID EX ",(0,l.jsx)(n.code,{children:"myComponentId"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"MALOJA_NAME"})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsxs)(n.td,{children:["Value of ",(0,l.jsx)(n.code,{children:"MALOJA_ID"})]}),(0,l.jsxs)(n.td,{children:["A vanity name EX ",(0,l.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"MALOJA_ENABLE"})}),(0,l.jsx)(n.td,{children:"boolean"}),(0,l.jsx)(n.td,{children:"true"}),(0,l.jsx)(n.td,{children:"Should this component be used?"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.em,{children:(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"MALOJA_URL"})})})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsx)(n.td,{}),(0,l.jsx)(n.td,{children:"URL for maloja server"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.em,{children:(0,l.jsx)(n.strong,{children:(0,l.jsx)(n.code,{children:"MALOJA_API_KEY"})})})}),(0,l.jsx)(n.td,{children:"string"}),(0,l.jsx)(n.td,{}),(0,l.jsx)(n.td,{children:"API Key for Maloja server"})]})]})]})}function a(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(s,{...e})}):s(e)}let c={title:"Maloja",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},j=[{value:"Configuration",id:"configuration",level:2}];function x(e){let n={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config:t,Details:r}=n;return t||u("Config",!0),r||u("Details",!0),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(n.p,{children:["Setup a ",(0,l.jsx)(n.a,{href:"https://github.com/krateng/maloja?tab=readme-ov-file#how-to-install",children:"Maloja server"})," if you have not already done this."]}),"\n",(0,l.jsxs)(r,{children:[(0,l.jsx)("summary",{children:"Maloja Setup Intructions"}),(0,l.jsxs)(n.p,{children:["Using Maloja's example ",(0,l.jsx)(n.code,{children:"docker-compose.yml"}),":"]}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",metastring:'reference title="~/malojaData/docker-compose.yml"',children:"https://github.com/krateng/maloja/blob/master/example-compose.yml\n"})}),(0,l.jsxs)(n.p,{children:["Uncomment ",(0,l.jsx)(n.code,{children:"environment"})," and add ",(0,l.jsx)(n.code,{children:"MALOJA_FORCE_PASSWORD=CHANGE_ME"})," to set an admin password"]}),(0,l.jsx)(n.p,{children:"Start the container:"}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",metastring:'title="~/malojaData"',children:"docker compose up -d\n"})})]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at ",(0,l.jsx)(n.a,{href:"http://myMalojaServerIP/admin_apikeys",children:"http://myMalojaServerIP/admin_apikeys"}),")","\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["Create a ",(0,l.jsx)(n.strong,{children:"New Key"})," and then copy the generated key value"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Finally, add the Maloja server URL and API Key to the configuration type you choose to use, below."}),"\n",(0,l.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,l.jsx)(t,{config:"MalojaClientConfig",fileContent:o.A,client:!0,ambiguous:!0,name:"maloja",children:(0,l.jsx)(a,{})})]})}function m(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(x,{...e})}):x(e)}function u(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4763(e,n,t){t.d(n,{A:()=>r});let r='[\n {\n "name": "Maloja Client",\n "id": "myMalojaClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n },\n {\n "name": "Maloja Source",\n "id": "myMalojaSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/d3a18f08.066bdca8.js b/assets/js/d3a18f08.066bdca8.js new file mode 100644 index 00000000..68f1c0f2 --- /dev/null +++ b/assets/js/d3a18f08.066bdca8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8037"],{8106(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>g,frontMatter:()=>o,contentTitle:()=>d,toc:()=>h,assets:()=>c});var s=JSON.parse('{"id":"updating/updating","title":"Overview","description":"Updating Multi-Scrobbler","source":"@site/docs/updating/updating.mdx","sourceDirName":"updating","slug":"/updating/","permalink":"/multi-scrobbler/updating/","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/updating/updating.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Overview","description":"Updating Multi-Scrobbler"},"sidebar":"tutorialSidebar","previous":{"title":"As a Service","permalink":"/multi-scrobbler/installation/service"},"next":{"title":"Upgrade Path","permalink":"/multi-scrobbler/updating/upgrade-path/"}}'),r=i(4848),t=i(8453),l=i(8194),a=i(698);i(2170);let o={sidebar_position:1,title:"Overview",description:"Updating Multi-Scrobbler"},d,c={},h=[{value:"Updating",id:"updating",level:2},{value:"Database",id:"database",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Update Instructions",id:"update-instructions",level:2},{value:"Versioning",id:"versioning",level:2},{value:"Git",id:"git",level:3},{value:"Docker",id:"docker",level:3},{value:"What Version Am I Using?",id:"what-version-am-i-using",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"updating",children:"Updating"}),"\n",(0,r.jsxs)(n.p,{children:["The majority of Multi-scrobbler updates can be completed without any manual intervention. This is ",(0,r.jsx)(n.strong,{children:"guaranteed"})," for ",(0,r.jsx)(n.a,{href:"#versioning",children:"patch version updates"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Regardless, it is recommended to consult the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,r.jsx)(n.strong,{children:"Github Release Notes"})})," before any upgrades. The release notes contain all changelogs as well as most ",(0,r.jsx)(n.strong,{children:"breaking changes"}),"/notices."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsxs)(n.a,{href:"/updating/upgrade-path",children:[(0,r.jsx)(n.strong,{children:"Upgrade Path"})," docs"]})," contain information for upgrading through ",(0,r.jsx)(n.strong,{children:"required versions"})," or in-depth migration guides. Check this section before upgrading any ",(0,r.jsx)(n.a,{href:"#versioning",children:"minor versions"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"database",children:"Database"}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler depends on a SQLite database (",(0,r.jsx)(n.code,{children:"ms.db"}),") that is created on first run and stored in the ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:(0,r.jsx)(n.code,{children:"CONFIG_DIR"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If any database migrations are required for an update then your database is ",(0,r.jsx)(n.strong,{children:"automatically backed up"})," before migration occurs. The backup file is created in the same directory."]}),"\n",(0,r.jsxs)(n.p,{children:["You can manually make a backup of this database by making a copy of ",(0,r.jsx)(n.code,{children:"ms.db"})," and any similarly named files like ",(0,r.jsx)(n.code,{children:"ms.db-journal"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If upgrading a ",(0,r.jsx)(n.a,{href:"#versioning",children:"minor version"})," you may want to make a backup for extra safety."]})}),"\n",(0,r.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"#versioning",children:"Minor versions"})," may have ",(0,r.jsx)(n.strong,{children:"breaking changes"})," related to ",(0,r.jsx)(n.a,{href:"/configuration",children:"configuration"}),". Consult the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,r.jsx)(n.strong,{children:"Github Release Notes"})})," and ",(0,r.jsx)(n.a,{href:"/updating/upgrade-path",children:"Upgrade Paths"})," before upgrading."]}),"\n",(0,r.jsx)(n.h2,{id:"update-instructions",children:"Update Instructions"}),"\n",(0,r.jsx)(n.p,{children:"Assuming:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["upgrade(s) are only ",(0,r.jsx)(n.a,{href:"#versioning",children:"patch versions"})," and the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:"Release Notes"})," do not contain any other guidance or"]}),"\n",(0,r.jsx)(n.li,{children:"you have checked the release notes, upgrade paths docs, and completed all migration steps for the specific version upgrade"}),"\n"]}),"\n",(0,r.jsxs)(l.A,{groupId:"installType",queryString:!0,children:[(0,r.jsx)(a.A,{value:"docker-compose",label:"Docker Compose",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker compose pull\ndocker compose up -d\n"})})}),(0,r.jsxs)(a.A,{value:"local",query:"Local (Nodejs)",children:[(0,r.jsxs)(n.p,{children:["Assuming the ",(0,r.jsxs)(n.a,{href:"/installation#local-installation",children:["repository was used for initial installation with ",(0,r.jsx)(n.code,{children:"git clone"})]}),", update by pulling the latest commit:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"git pull\n"})}),(0,r.jsx)(n.p,{children:"and restart multi-scrobbler."})]})]}),"\n",(0,r.jsx)(n.h2,{id:"versioning",children:"Versioning"}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler versioning uses ",(0,r.jsx)(n.strong,{children:"semver"})," without a major version (for now):"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Minor"})," version bumps (",(0,r.jsx)(n.code,{children:"0.12.2"})," => ",(0,r.jsx)(n.code,{children:"0.13.0"}),") ",(0,r.jsx)(n.strong,{children:"may have breaking changes"})," or include major new behavior"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Patch"})," version bumps (",(0,r.jsx)(n.code,{children:"0.12.2"})," => ",(0,r.jsx)(n.code,{children:"0.12.3"}),") may have new behavior or fix bugs, but have no breaking changes. These can be safely upgraded unattended."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Check the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,r.jsx)(n.strong,{children:"Github Release Notes"})})," for breaking changes, changelogs, and any migration steps required between minor versions."]}),"\n",(0,r.jsx)(n.h3,{id:"git",children:"Git"}),"\n",(0,r.jsxs)(n.p,{children:["The default ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/",children:(0,r.jsx)(n.code,{children:"master"})})," branch is ",(0,r.jsx)(n.strong,{children:"not stable"}),". The goal is to have it be ",(0,r.jsx)(n.em,{children:"functional"})," bleeding-edge development with non-functioning development isolated to pull requests and other branches."]}),"\n",(0,r.jsxs)(n.p,{children:["For a stable release use the latest ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tags",children:"git tag"})," EX:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"git clone --branch 0.13.0 https://github.com/FoxxMD/multi-scrobbler.git\n"})}),"\n",(0,r.jsx)(n.h3,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(n.p,{children:"Docker image tags use this pattern:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":latest"})," is the latest ",(0,r.jsx)(n.strong,{children:"stable"})," ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:"release"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["IE If the latest released version was ",(0,r.jsx)(n.code,{children:"0.13.0"})," then ",(0,r.jsx)(n.code,{children:":latest"})," is also ",(0,r.jsx)(n.code,{children:"0.13.0"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":latest"})," will ",(0,r.jsx)(n.em,{children:"always"})," be the latest release. Before pulling a new image you should check if the version bump has breaking changes."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":edge"})," is built automatically from the ",(0,r.jsxs)(n.a,{href:"#git",children:[(0,r.jsx)(n.code,{children:"master"})," branch"]})]}),"\n",(0,r.jsxs)(n.li,{children:["Pinned semver tags are published alongside ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:"releases"})," EX ",(0,r.jsx)(n.code,{children:":0.12.2"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Additionally, ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pulls",children:"Pull Requests"})," may have docker images published with tags like ",(0,r.jsx)(n.code,{children:":pr-521"}),". These are not guaranteed to be stable and should only be used for testing."]}),"\n",(0,r.jsx)(n.h2,{id:"what-version-am-i-using",children:"What Version Am I Using?"}),"\n",(0,r.jsx)(n.p,{children:"The current version of Multi-Scrobbler can be found in several places:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Open the Web Dashboard, the version is displayed next the Multi-Scrobbler logo in the top left corner"}),"\n",(0,r.jsxs)(n.li,{children:["On startup the version is immediately printed to logs EX:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"[2026-04-16 09:17:32.428 -0400] INFO : [Init] Version: 0.13.0"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Checking the running docker container or image for the ",(0,r.jsx)(n.code,{children:"org.opencontainers.image.version"})," label"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["When running MS from a non-pinned source (like ",(0,r.jsx)(n.code,{children:":edge"})," tag, a pull request, or git branch) the version will be shown as the ",(0,r.jsx)(n.strong,{children:"branch"})," name and ",(0,r.jsx)(n.strong,{children:"short commit hash"})," EX"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"master-1c78da79\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"Using the above information you can verify if you have pulled and successfully recreated a docker container with a new version. If the version string does not change from the previous version running then you are still running the old container"})})]})}function g(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/d3a18f08.ea51fc4e.js b/assets/js/d3a18f08.ea51fc4e.js deleted file mode 100644 index 6a5ed2b1..00000000 --- a/assets/js/d3a18f08.ea51fc4e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8037"],{8106(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>g,frontMatter:()=>o,contentTitle:()=>d,toc:()=>h,assets:()=>c});var s=JSON.parse('{"id":"updating/updating","title":"Overview","description":"Updating Multi-Scrobbler","source":"@site/docs/updating/updating.mdx","sourceDirName":"updating","slug":"/updating/","permalink":"/multi-scrobbler/updating/","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/updating/updating.mdx?plain=1","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Overview","description":"Updating Multi-Scrobbler"},"sidebar":"tutorialSidebar","previous":{"title":"As a Service","permalink":"/multi-scrobbler/installation/service"},"next":{"title":"Upgrade Path","permalink":"/multi-scrobbler/updating/upgrade-path/"}}'),r=i(4848),t=i(8453),l=i(8194),a=i(698);i(2170);let o={sidebar_position:1,title:"Overview",description:"Updating Multi-Scrobbler"},d,c={},h=[{value:"Updating",id:"updating",level:2},{value:"Database",id:"database",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Update Instructions",id:"update-instructions",level:2},{value:"Versioning",id:"versioning",level:2},{value:"Git",id:"git",level:3},{value:"Docker",id:"docker",level:3},{value:"What Version Am I Using?",id:"what-version-am-i-using",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"updating",children:"Updating"}),"\n",(0,r.jsxs)(n.p,{children:["The majority of Multi-scrobbler updates can be completed without any manual intervention. This is ",(0,r.jsx)(n.strong,{children:"guaranteed"})," for ",(0,r.jsx)(n.a,{href:"#versioning",children:"patch version updates"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Regardless, it is recommended to consult the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,r.jsx)(n.strong,{children:"Github Release Notes"})})," before any upgrades. The release notes contain all changelogs as well as most ",(0,r.jsx)(n.strong,{children:"breaking changes"}),"/notices."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsxs)(n.a,{href:"/updating/upgrade-path",children:[(0,r.jsx)(n.strong,{children:"Upgrade Path"})," docs"]})," contain information for upgrading through ",(0,r.jsx)(n.strong,{children:"required versions"})," or in-depth migration guides. Check this section before upgrading any ",(0,r.jsx)(n.a,{href:"#versioning",children:"minor versions"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"database",children:"Database"}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler depends on a SQLite database (",(0,r.jsx)(n.code,{children:"ms.db"}),") that is created on first run and stored in the ",(0,r.jsx)(n.a,{href:"/installation/?dockerSetting=storage#recommended-settings",children:(0,r.jsx)(n.code,{children:"CONFIG_DIR"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If any database migrations are required for an update then your database is ",(0,r.jsx)(n.strong,{children:"automatically backed up"})," before migration occurs. The backup file is created in the same directory."]}),"\n",(0,r.jsxs)(n.p,{children:["You can manually make a backup of this database by making a copy of ",(0,r.jsx)(n.code,{children:"ms.db"})," and any similarly named files like ",(0,r.jsx)(n.code,{children:"ms.db-journal"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If upgrading a ",(0,r.jsx)(n.a,{href:"#versioning",children:"minor version"})," you may want to make a backup for extra safety."]})}),"\n",(0,r.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"#versioning",children:"Minor versions"})," may have ",(0,r.jsx)(n.strong,{children:"breaking changes"})," related to ",(0,r.jsx)(n.a,{href:"/configuration",children:"configuration"}),". Consult the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,r.jsx)(n.strong,{children:"Github Release Notes"})})," and ",(0,r.jsx)(n.a,{href:"/updating/upgrade-path",children:"Upgrade Paths"})," before upgrading."]}),"\n",(0,r.jsx)(n.h2,{id:"update-instructions",children:"Update Instructions"}),"\n",(0,r.jsx)(n.p,{children:"Assuming:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["upgrade(s) are only ",(0,r.jsx)(n.a,{href:"#versioning",children:"patch versions"})," and the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:"Release Notes"})," do not contain any other guidance or"]}),"\n",(0,r.jsx)(n.li,{children:"you have checked the release notes, upgrade paths docs, and completed all migration steps for the specific version upgrade"}),"\n"]}),"\n",(0,r.jsxs)(l.A,{groupId:"installType",queryString:!0,children:[(0,r.jsx)(a.A,{value:"docker-compose",label:"Docker Compose",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker compose pull\ndocker compose up -d\n"})})}),(0,r.jsxs)(a.A,{value:"local",query:"Local (Nodejs)",children:[(0,r.jsxs)(n.p,{children:["Assuming the ",(0,r.jsxs)(n.a,{href:"/installation#local-installation",children:["repository was used for initial installation with ",(0,r.jsx)(n.code,{children:"git clone"})]}),", update by pulling the latest commit:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"git pull\n"})}),(0,r.jsx)(n.p,{children:"and restart multi-scrobbler."})]})]}),"\n",(0,r.jsx)(n.h2,{id:"versioning",children:"Versioning"}),"\n",(0,r.jsxs)(n.p,{children:["Multi-scrobbler versioning uses ",(0,r.jsx)(n.strong,{children:"semver"})," without a major version (for now):"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Minor"})," version bumps (",(0,r.jsx)(n.code,{children:"0.12.2"})," => ",(0,r.jsx)(n.code,{children:"0.13.0"}),") ",(0,r.jsx)(n.strong,{children:"may have breaking changes"})," or include major new behavior"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Patch"})," version bumps (",(0,r.jsx)(n.code,{children:"0.12.2"})," => ",(0,r.jsx)(n.code,{children:"0.12.3"}),") may have new behavior or fix bugs, but have no breaking changes. These can be safely upgraded unattended."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Check the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:(0,r.jsx)(n.strong,{children:"Github Release Notes"})})," for breaking changes, changelogs, and any migration steps required between minor versions."]}),"\n",(0,r.jsx)(n.h3,{id:"git",children:"Git"}),"\n",(0,r.jsxs)(n.p,{children:["The default ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tree/master/",children:(0,r.jsx)(n.code,{children:"master"})})," branch is ",(0,r.jsx)(n.strong,{children:"not stable"}),". The goal is to have it be ",(0,r.jsx)(n.em,{children:"functional"})," bleeding-edge development with non-functioning development isolated to pull requests and other branches."]}),"\n",(0,r.jsxs)(n.p,{children:["For a stable release use the latest ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/tags",children:"git tag"})," EX:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"git clone --branch 0.13.0 https://github.com/FoxxMD/multi-scrobbler.git\n"})}),"\n",(0,r.jsx)(n.h3,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(n.p,{children:"Docker image tags use this pattern:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":latest"})," is the latest ",(0,r.jsx)(n.strong,{children:"stable"})," ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:"release"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["IE If the latest released version was ",(0,r.jsx)(n.code,{children:"0.13.0"})," then ",(0,r.jsx)(n.code,{children:":latest"})," is also ",(0,r.jsx)(n.code,{children:"0.13.0"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":latest"})," will ",(0,r.jsx)(n.em,{children:"always"})," be the latest release. Before pulling a new image you should check if the version bump has breaking changes."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":edge"})," is built automatically from the ",(0,r.jsxs)(n.a,{href:"#git",children:[(0,r.jsx)(n.code,{children:"master"})," branch"]})]}),"\n",(0,r.jsxs)(n.li,{children:["Pinned semver tags are published alongside ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/releases",children:"releases"})," EX ",(0,r.jsx)(n.code,{children:":0.12.2"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Additionally, ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/pulls",children:"Pull Requests"})," may have docker images published with tags like ",(0,r.jsx)(n.code,{children:":pr-521"}),". These are not guaranteed to be stable and should only be used for testing."]}),"\n",(0,r.jsx)(n.h2,{id:"what-version-am-i-using",children:"What Version Am I Using?"}),"\n",(0,r.jsx)(n.p,{children:"The current version of Multi-Scrobbler can be found in several places:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Open the Web Dashboard, the version is displayed next the Multi-Scrobbler logo in the top left corner"}),"\n",(0,r.jsxs)(n.li,{children:["On startup the version is immediately printed to logs EX:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"[2026-04-16 09:17:32.428 -0400] INFO : [Init] Version: 0.13.0"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Checking the running docker container or image for the ",(0,r.jsx)(n.code,{children:"org.opencontainers.image.version"})," label"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["When running MS from a non-pinned source (like ",(0,r.jsx)(n.code,{children:":edge"})," tag, a pull request, or git branch) the version will be shown as the ",(0,r.jsx)(n.strong,{children:"branch"})," name and ",(0,r.jsx)(n.strong,{children:"short commit hash"})," EX"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"master-1c78da79\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"Using the above information you can verify if you have pulled and successfully recreated a docker container with a new version. If the version string does not change from the previous version running then you are still running the old container"})})]})}function g(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/d50915e5.222d6408.js b/assets/js/d50915e5.222d6408.js new file mode 100644 index 00000000..0375afbe --- /dev/null +++ b/assets/js/d50915e5.222d6408.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7220"],{5361(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>x,frontMatter:()=>d,contentTitle:()=>l,toc:()=>h,assets:()=>a});var s=JSON.parse('{"id":"configuration/sources/yandex-music","title":"Yandex Music","description":"Monitor your Yandex Music listening activity in real-time.","source":"@site/docs/configuration/sources/yandex-music.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/yandex-music","permalink":"/multi-scrobbler/configuration/sources/yandex-music","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/yandex-music.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Yandex 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":"Youtube Music","permalink":"/multi-scrobbler/configuration/sources/youtube-music"}}'),r=i(4848),t=i(8453);function c(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"YMBRIDGE_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_URL"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["URL of the local Python bridge, for example ",(0,r.jsx)(n.a,{href:"http://yandex-music-bridge:9980",children:"http://yandex-music-bridge:9980"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_API_KEY"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Optional API key sent as X-API-Key to the bridge"})]})]})]})}function o(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}i(8194),i(698),i(2170);let d={title:"Yandex Music",toc_min_heading_level:2,toc_max_heading_level:5},l,a={},h=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components},{Config:i,Details:s,DetailsAdmo:c}=n;return i||m("Config",!0),s||m("Details",!0),c||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Monitor your ",(0,r.jsx)(n.a,{href:"https://music.yandex.com",children:(0,r.jsx)(n.strong,{children:"Yandex Music"})})," listening activity in real-time."]}),"\n",(0,r.jsxs)(n.p,{children:["This Source requires a third party docker container to communicate with Yandex Music, ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack/yandex-music-bridge",children:(0,r.jsx)(n.code,{children:"yandex-music-bridge"})}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Example Docker Compose with ",(0,r.jsx)(n.code,{children:"yandex-music-bridge"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - TZ=Etc/GMT\n # ...your other sources/clients here\n\n # add for yandex music\n // highlight-start\n - YMBRIDGE_URL=http://yandex-music-bridge:9980\n - YMBRIDGE_API_KEY=change-me\n // highlight-end\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n\n // highlight-start\n yandex-music-bridge:\n image: ghcr.io/druidblack/yandex-music-bridge:latest\n environment:\n - TZ=Europe/Moscow\n - YM_TOKEN=AgAAAAACO3_345345\n - YM_API_KEY=change-me\n - YM_PORT=9980\n - YM_LANGUAGE=ru\n - YM_ENABLE_YNISON=true\n - YM_PUSH_TTL=45\n - YM_QUEUE_CACHE_TTL=15\n - YM_LOG_LEVEL=INFO\n ports:\n - "9980:9980"\n restart: unless-stopped\n // highlight-end\n'})}),(0,r.jsxs)(n.p,{children:["You will need to acquire your own token for ",(0,r.jsx)(n.code,{children:"YM_TOKEN"})," used in ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack/yandex-music-bridge",children:(0,r.jsx)(n.code,{children:"yandex-music-bridge"})})," using the instructions provided there."]})]}),"\n",(0,r.jsxs)(c,{type:"tip",summary:"Need Help?",children:[(0,r.jsxs)(n.p,{children:["If your issue is specifically related to ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack/yandex-music-bridge",children:(0,r.jsx)(n.code,{children:"yandex-music-bridge"})})," (errors in the container, usage instructions, general Yandex setup like token etc...) please open an issue on ",(0,r.jsx)(n.strong,{children:"that repository"})," instead of Multi-Scrobbler's."]}),(0,r.jsxs)(n.p,{children:["If you have issues specifically with the MS Source please mention ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack",children:(0,r.jsx)(n.strong,{children:"Druidblack"})})," (",(0,r.jsx)(n.code,{children:"@Druidblack"}),") when opening an ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new/choose",children:"issue"})," or ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/discussions/new/choose",children:"discussion"}),". Yandex Music is ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Yandex_Music",children:"not available"})," in the country of the main Multi-Scrobbler developer (FoxxMD) so they can only help troubleshooting general MS issues related to Yandex Music."]})]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i,{config:"YandexMusicBridgeSourceConfig",fileContent:'[\n {\n "id": "myYandex",\n "name": "Yandex Music",\n "type": "ymbridge",\n "data": {\n "url": "http://192.168.1.161:9980",\n "apiKey": "change-me",\n "interval": 3\n }\n }\n]\n',name:"ymbridge",children:(0,r.jsx)(o,{})})]})}function x(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/d50915e5.3f036d92.js b/assets/js/d50915e5.3f036d92.js deleted file mode 100644 index 01a81f19..00000000 --- a/assets/js/d50915e5.3f036d92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["7220"],{5361(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>x,frontMatter:()=>d,contentTitle:()=>l,toc:()=>h,assets:()=>a});var s=JSON.parse('{"id":"configuration/sources/yandex-music","title":"Yandex Music","description":"Monitor your Yandex Music listening activity in real-time.","source":"@site/docs/configuration/sources/yandex-music.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/yandex-music","permalink":"/multi-scrobbler/configuration/sources/yandex-music","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/yandex-music.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Yandex 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":"Youtube Music","permalink":"/multi-scrobbler/configuration/sources/youtube-music"}}'),r=i(4848),t=i(8453);function c(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"YMBRIDGE_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_URL"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["URL of the local Python bridge, for example ",(0,r.jsx)(n.a,{href:"http://yandex-music-bridge:9980",children:"http://yandex-music-bridge:9980"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"YMBRIDGE_API_KEY"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Optional API key sent as X-API-Key to the bridge"})]})]})]})}function o(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}i(8194),i(698),i(2170);let d={title:"Yandex Music",toc_min_heading_level:2,toc_max_heading_level:5},l,a={},h=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components},{Config:i,Details:s,DetailsAdmo:c}=n;return i||m("Config",!0),s||m("Details",!0),c||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Monitor your ",(0,r.jsx)(n.a,{href:"https://music.yandex.com",children:(0,r.jsx)(n.strong,{children:"Yandex Music"})})," listening activity in real-time."]}),"\n",(0,r.jsxs)(n.p,{children:["This Source requires a third party docker container to communicate with Yandex Music, ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack/yandex-music-bridge",children:(0,r.jsx)(n.code,{children:"yandex-music-bridge"})}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsxs)("summary",{children:["Example Docker Compose with ",(0,r.jsx)(n.code,{children:"yandex-music-bridge"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="~/msData/docker-compose.yml"',children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - TZ=Etc/GMT\n # ...your other sources/clients here\n\n # add for yandex music\n // highlight-start\n - YMBRIDGE_URL=http://yandex-music-bridge:9980\n - YMBRIDGE_API_KEY=change-me\n // highlight-end\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n\n // highlight-start\n yandex-music-bridge:\n image: ghcr.io/druidblack/yandex-music-bridge:latest\n environment:\n - TZ=Europe/Moscow\n - YM_TOKEN=AgAAAAACO3_345345\n - YM_API_KEY=change-me\n - YM_PORT=9980\n - YM_LANGUAGE=ru\n - YM_ENABLE_YNISON=true\n - YM_PUSH_TTL=45\n - YM_QUEUE_CACHE_TTL=15\n - YM_LOG_LEVEL=INFO\n ports:\n - "9980:9980"\n restart: unless-stopped\n // highlight-end\n'})}),(0,r.jsxs)(n.p,{children:["You will need to acquire your own token for ",(0,r.jsx)(n.code,{children:"YM_TOKEN"})," used in ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack/yandex-music-bridge",children:(0,r.jsx)(n.code,{children:"yandex-music-bridge"})})," using the instructions provided there."]})]}),"\n",(0,r.jsxs)(c,{type:"tip",summary:"Need Help?",children:[(0,r.jsxs)(n.p,{children:["If your issue is specifically related to ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack/yandex-music-bridge",children:(0,r.jsx)(n.code,{children:"yandex-music-bridge"})})," (errors in the container, usage instructions, general Yandex setup like token etc...) please open an issue on ",(0,r.jsx)(n.strong,{children:"that repository"})," instead of Multi-Scrobbler's."]}),(0,r.jsxs)(n.p,{children:["If you have issues specifically with the MS Source please mention ",(0,r.jsx)(n.a,{href:"https://github.com/Druidblack",children:(0,r.jsx)(n.strong,{children:"Druidblack"})})," (",(0,r.jsx)(n.code,{children:"@Druidblack"}),") when opening an ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues/new/choose",children:"issue"})," or ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/discussions/new/choose",children:"discussion"}),". Yandex Music is ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Yandex_Music",children:"not available"})," in the country of the main Multi-Scrobbler developer (FoxxMD) so they can only help troubleshooting general MS issues related to Yandex Music."]})]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(i,{config:"YandexMusicBridgeSourceConfig",fileContent:'[\n {\n "id": "myYandex",\n "name": "Yandex Music",\n "type": "ymbridge",\n "data": {\n "url": "http://192.168.1.161:9980",\n "apiKey": "change-me",\n "interval": 3\n }\n }\n]\n',name:"ymbridge",children:(0,r.jsx)(o,{})})]})}function x(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/d53edd15.9d3522ee.js b/assets/js/d53edd15.9d3522ee.js deleted file mode 100644 index e1ab8982..00000000 --- a/assets/js/d53edd15.9d3522ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2077"],{9077(e,n,i){i.d(n,{Ay:()=>A,RM:()=>b});var r=i(4848),t=i(8453),s=i(8194),o=i(698),l=i(2170),c=i.n(l),d=i(6540),a=i(8258);function h(e){return(0,r.jsx)("div",{children:(0,r.jsx)(a.Es,{schema:e.schema,renderRootTreeLines:!0,emptyText:"No schema defined",defaultExpandedDepth:0,skipTopLevelDescription:!1,markup:!0})})}var u=i(6025);function x(e){let[n,i]=(0,d.useState)(void 0),t=(0,u.Ay)(`/${e.name}.json`);return(0,d.useEffect)(()=>{fetch(t,{headers:{Accept:"application/json"}}).then(e=>e.json()).then(e=>i(e)).catch(e=>i(e))},[i,t]),(0,r.jsxs)(d.Fragment,{children:[void 0===n&&(0,r.jsx)("div",{children:"Loading ..."}),void 0!==n&&n instanceof Error&&(0,r.jsxs)("div",{children:["Houston we have a problem : ",n.message]}),void 0!==n&&!(n instanceof Error)&&(0,r.jsx)(h,{schema:n})]})}i(1922);var j=i(5548),p=i(349),m=i(1219),f=i.n(m),g=i(8675);let y=e=>{let n,{data:i,configureAs:t="source",aio:s=!1,name:o,...l}=e;try{n=f().parse(i)}catch(e){return console.error(Error(`Unable to parse content for ${!0===s?"aio ":""}${o}`,{cause:e})),(0,r.jsxs)(j.A,{type:"danger",title:"Unexpected Error",children:[(0,r.jsx)("p",{children:"Example component crashed because of error!"}),(0,r.jsx)(c(),{children:e.message})]})}let a=(0,d.useMemo)(()=>{let e;if("string"==typeof i)try{e=f().parse(i)}catch(e){console.error(Error(`Unable to parse transformed content for ${!0===s?"aio ":""}${o}`,{cause:e}))}else e=i;if(void 0!==t&&Array.isArray(e)){let n=e.filter(e=>void 0===e.configureAs||e.configureAs===t);e=s?{["client"===t?"clients":"sources"]:n.map(e=>({...e,type:o}))}:n}return e},[i,t,s,o]);return n=n.filter(e=>void 0===e.configureAs||e.configureAs===t),(0,r.jsx)(g.A,{data:a,...l})},v=e=>(0,r.jsx)(p.A,{fallback:({error:e})=>(0,r.jsx)("div",{children:(0,r.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,r.jsx)(y,{...e})}),b=[];function w(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{AIOType:i,DetailsAdmo:l,EnvType:c,FileType:d}=n;return i||k("AIOType",!0),l||k("DetailsAdmo",!0),c||k("EnvType",!0),d||k("FileType",!0),(0,r.jsxs)(s.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(o.A,{value:"env",label:"ENV",children:(0,r.jsxs)(c,{children:[e.children,(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:"Bold/Italic"})})," = Required"]})]})}),(0,r.jsx)(o.A,{value:"file",label:"File",children:(0,r.jsx)(d,{children:(0,r.jsxs)("div",{className:"schemaWrapper",style:{display:"flex"},children:[(0,r.jsxs)("div",{style:{padding:"0 1em 0 1em",flexBasis:"min-content",flexGrow:2},children:[(0,r.jsx)(l,{type:"note",summary:"Config Structure",children:(0,r.jsxs)(n.p,{children:["This displays the ",(0,r.jsx)(n.strong,{children:"structure"})," of the ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"File Configuration"})," for a ",(0,r.jsx)("strong",{children:e.name})," type ",(0,r.jsx)("strong",{children:e.client?"Client":"Source"})," with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config."]})}),(0,r.jsx)(x,{name:`schemas/${e.name}-${e.client?"client":"source"}`})]}),(0,r.jsxs)("div",{style:{flexBasis:"auto",flexGrow:3},children:[(0,r.jsxs)("div",{className:"fileEditor",children:[(0,r.jsxs)(l,{type:"note",summary:"Config Example",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"File Configuration"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"text"})," mode lets you edit the JSON directly."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"tree"})," mode gives you a guided point-and-click editing experience that always keeps the JSON ",(0,r.jsx)(n.em,{children:"syntax"})," valid."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Both modes ",(0,r.jsx)(n.strong,{children:"validate"})," that the configuration is correct. Any errors show up as squiggly lines."]}),(0,r.jsx)("span",{style:{display:!0===e.ambiguous?"inherit":"none"},children:(0,r.jsx)(n.admonition,{type:"important",children:(0,r.jsxs)(n.p,{children:["Only ",(0,r.jsx)("strong",{children:e.client?"client":"source"})," ",(0,r.jsx)("span",{children:e.name})," configs will validate correctly in the editor but ",(0,r.jsx)(n.em,{children:"both"})," ",(0,r.jsx)(n.strong,{children:"source"})," and ",(0,r.jsx)(n.strong,{children:"client"})," ",(0,r.jsx)("span",{children:e.name})," configs are allowed in the real ",(0,r.jsxs)("code",{children:["CONFIG/",(0,r.jsx)("span",{children:e.name}),".json"]})]})})}),(0,r.jsxs)(n.p,{children:["After you finish editing, switch to ",(0,r.jsx)(n.strong,{children:"text"})," and then copy all text to get a completed config."]})]}),(0,r.jsxs)(l,{type:"important",summary:"configureAs Required",render:!0===e.configureAs,children:[(0,r.jsxs)(n.p,{children:["When configuring a ",(0,r.jsx)("span",{children:e.name})," ",(0,r.jsx)(n.strong,{children:"Source"})," in a ",(0,r.jsx)(n.strong,{children:"File"})," Config you ",(0,r.jsx)(n.strong,{children:"must"})," set"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'"configureAs": "source"\n'})}),(0,r.jsxs)(n.p,{children:["Without this property, Multi-Scrobbler will assume the config is for a ",(0,r.jsx)("span",{children:e.name})," ",(0,r.jsx)(n.strong,{children:"Client"})," config."]}),(0,r.jsxs)(n.p,{children:["This requirement does not apply to ",(0,r.jsx)(n.strong,{children:"AIO"})," ",(0,r.jsx)("span",{children:e.name})," configs."]})]})]}),(0,r.jsx)("div",{className:"fileEditorMobile",children:(0,r.jsxs)(l,{type:"warning",summary:"Config Example Mobile Experience",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"File Configuration"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.p,{children:["The example config file editor is meant for a larger screen experience so ",(0,r.jsx)(n.strong,{children:"only the read-only example is shown."})," Please use this site on a tablet/laptop/desktop to enable file editor features."]})]})}),(0,r.jsx)(v,{filePathName:`CONFIG/${e.name}.json`,configureAs:e.client?"client":"source",data:e.fileContent,schemaName:`${e.name}-${e.client?"client":"source"}`,readOnlyAtWidth:500})]})]})})}),(0,r.jsx)(o.A,{value:"aio",label:"AIO",children:(0,r.jsx)(i,{children:(0,r.jsxs)("div",{className:"schemaWrapper",style:{display:"flex"},children:[(0,r.jsxs)("div",{style:{padding:"0 1em 0 1em",flexBasis:"min-content",flexGrow:2},children:[(0,r.jsxs)(l,{type:"note",summary:"Config Structure",children:[(0,r.jsxs)(n.p,{children:["This displays the ",(0,r.jsx)(n.strong,{children:"structure"})," of the ",(0,r.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:["all-in-one (",(0,r.jsx)(n.code,{children:"config.json"}),") configuration"]})," with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config."]}),(0,r.jsxs)(n.p,{children:["Select the ",(0,r.jsx)("strong",{children:e.name})," type from the respective ",(0,r.jsx)("code",{children:e.client?"clients":"sources"})," node below, then expand it."]})]}),(0,r.jsx)(x,{name:"schemas/aio"})]}),(0,r.jsxs)("div",{style:{flexBasis:"auto",flexGrow:3},children:[(0,r.jsx)("div",{className:"fileEditor",children:(0,r.jsxs)(l,{type:"note",summary:"Config Example",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:["all-in-one (",(0,r.jsx)(n.code,{children:"config.json"}),") configuration"]})," that includes a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"text"})," mode lets you edit the JSON directly."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"tree"})," mode gives you a guided point-and-click editing experience that always keeps the JSON ",(0,r.jsx)(n.em,{children:"syntax"})," valid."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Both modes ",(0,r.jsx)(n.strong,{children:"validate"})," that the configuraion is correct. Any errors show up as squiggly lines."]}),(0,r.jsxs)(n.p,{children:["After you finish editing, switch to ",(0,r.jsx)(n.strong,{children:"text"})," and then copy all text to get a completed config."]})]})}),(0,r.jsx)("div",{className:"fileEditorMobile",children:(0,r.jsxs)(l,{type:"warning",summary:"Config Example Mobile Experience",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:["all-in-one (",(0,r.jsx)(n.code,{children:"config.json"}),") configuration"]})," that includes a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.p,{children:["The example config file editor is meant for a larger screen experience so ",(0,r.jsx)(n.strong,{children:"only the read-only example is shown."})," Please use this site on a tablet/laptop/desktop to enable file editor features."]})]})}),(0,r.jsx)(v,{filePathName:"CONFIG/config.json",configureAs:e.client?"client":"source",data:e.fileContent,schemaName:"aio",name:e.name,readOnlyAtWidth:500,aio:!0})]})]})})})]})}function A(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(w,{...e})}):w(e)}function k(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9581(e,n,i){i.r(n),i.d(n,{metadata:()=>r,default:()=>j,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var r=JSON.parse('{"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:","source":"@site/docs/configuration/sources/kodi.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/kodi","permalink":"/multi-scrobbler/configuration/sources/kodi","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/kodi.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Kodi","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"JRiver","permalink":"/multi-scrobbler/configuration/sources/jriver"},"next":{"title":"Koito","permalink":"/multi-scrobbler/configuration/sources/koito-source"}}'),t=i(4848),s=i(8453);i(8194),i(698),i(2170);var o=i(9077);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"KODI_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"KODI_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"KODI_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:8080/jsonrpc",children:"http://localhost:8080/jsonrpc"})}),(0,t.jsx)(n.td,{children:"URL of the Kodi HTTP server to connect to"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_USER"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"The username set for Remote Control via Web Sever"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_PASSWORD"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"The password set for Remote Control via Web Sever"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}let d={title:"Kodi",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"URL",id:"url",level:3},{value:"Configuration",id:"configuration",level:2},...o.RM];function x(e){let n={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,s.R)(),...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,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["In order for multi-scrobbler to communicate with Kodi you must have the ",(0,t.jsx)(n.a,{href:"https://kodi.wiki/view/Web_interface",children:"Web Interface"})," enabled. This can be done in the Kodi GUI:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Settings -> Services -> Control","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.code,{children:"Allow remote control via HTTP"})]}),"\n",(0,t.jsxs)(n.li,{children:["Ensure you have a ",(0,t.jsx)(n.strong,{children:"Username"})," and ",(0,t.jsx)(n.strong,{children:"Password"})," set, you will need to provide them in the ENV/File configuration below."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,t.jsxs)(n.p,{children:["The URL used to connect to Kodi, set in your ",(0,t.jsxs)(n.a,{href:"#configuration",children:["file config as ",(0,t.jsx)(n.code,{children:"url"}),"."]})," The URL used to connect ultimately must be formed like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Syntax => [protocol]://[hostname]:[port]/[path]\nDefault => http://localhost:8080/jsonrpc\n"})}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.strong,{children:"not"})," standard you must explicitly define it."]}),"\n",(0,t.jsx)(n.admonition,{title:"Kodi Settings",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Make sure the port number matches what is found in ",(0,t.jsx)(n.strong,{children:"Port"})," in the Control section mentioned above."]}),"\n",(0,t.jsxs)(n.li,{children:["If your installation is on the same machine but you cannot connect using ",(0,t.jsx)(n.code,{children:"localhost"})," try ",(0,t.jsx)(n.code,{children:"0.0.0.0"})," instead."]}),"\n"]})}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:"URL Transform Examples"}),(0,t.jsxs)(n.p,{children:["Examples of a given ",(0,t.jsx)(n.code,{children:"url"})," in your file config and the final URL multi-scrobbler will use to connect to Kodi:"]}),(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:(0,t.jsx)(n.code,{children:"url"})}),(0,t.jsx)(n.th,{children:"Transformed URL"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"(none set)"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:8080/jsonrpc"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kodi.mydomain.com"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://kodi.mydomain.com:8080/jsonrpc"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"192.168.0.101:3456"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://192.168.0.101:3456/jsonprc"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"mydomain.com:80/kodiReverse/jsonrpc"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://mydomain.com:80/kodiReverse/jsonrpc"})})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(o.Ay,{config:"KodiSourceConfig",fileContent:'[\n {\n "name": "My Kodi Server",\n "id": "myKodi",\n "enable": true,\n "data": {\n "url": "http://localhost:8080/jsonrpc",\n "username": "myUser",\n "password": "myPassword"\n }\n }\n]\n',name:"kodi",children:(0,t.jsx)(c,{})})]})}function j(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},1672(e,n,i){i.d(n,{A:()=>o}),i(6540);var r=i(4164),t=i(8774),s=i(4848);function o({size:e=null,outline:n=!1,variant:i="primary",block:l=!1,disabled:c=!1,className:d,style:a={},link:h,label:u,onClick:x=()=>null,...j}){let p=e?({sm:"sm",small:"sm",lg:"lg",large:"lg",medium:null})[e]:"",m=p?`button--${p}`:"",f=i?`button--${i}`:"";return(0,s.jsx)(t.A,{to:c?null:h,children:(0,s.jsx)("button",{className:(0,r.A)("button",m,n?"button--outline":"",f,l?"button--block":"",c?"disabled":"",d),style:a,role:"button","aria-disabled":c,onClick:e=>{e.preventDefault(),x()},...j,children:u})})}},9643(e,n,i){i.d(n,{A:()=>c}),i(6540);var r=i(1672),t=i(4848);let s={borderRadius:"var(--ifm-button-border-radius) 0 0 var(--ifm-button-border-radius)"},o={borderRadius:"0 var(--ifm-button-border-radius) var(--ifm-button-border-radius) 0"},l={borderRadius:"0"};function c({size:e=null,variant:n="primary",block:i=!1,disabled:d=!1,className:a,style:h,options:u,value:x,defaultValue:j,onChange:p=()=>null}){if(void 0===u||0===u.length)return null;let m=u.map((i,c)=>{let d={style:l,outline:!0,size:e,variant:n,label:i[1],link:"#",onClick:()=>p(i[0])};return 0===c?d.style=s:c===u.length-1&&(d.style=o),(x??j)===i[0]&&(d.outline=!1),(0,t.jsx)(r.A,{...d},c)});return(0,t.jsx)("span",{children:m})}},8675(e,n,i){i.d(n,{A:()=>j});var r=i(6540),t=i(2170),s=i.n(t),o=i(349),l=i(8193);let c={};var d=i(9643),a=i(1922),h=i(4581),u=i(4848);let x=e=>{let{data:n,interactive:i=!0,defaultDisplay:t="interactive",schemaName:o,filePathName:x,readOnlyAtWidth:j=1,...p}=e,[m,f]=((e,n,i)=>{let t;return e in c?c[e]():l.A.canUseDOM?(c[e]=(t=[],()=>{let[s,o]=((e,n,i=!0)=>{let[t,s]=(0,r.useState)(()=>{let r=window.localStorage.getItem(e);if(i)try{return r?JSON.parse(r):n}catch(e){return console.error(e),n}try{let e;if(null===r)return n;if("true"===r)return!0;if("false"===r)return!1;if(e=r,("number"==typeof e||"string"==typeof e&&""!==e.trim())&&!isNaN(e)){if(r.includes("."))return parseFloat(r);return parseInt(r)}return r}catch(e){return console.error(e),n}}),o=(0,r.useCallback)(n=>{s(()=>(i?localStorage.setItem(e,JSON.stringify(n)):localStorage.setItem(e,n),n))},[e]);return(0,r.useEffect)(()=>{let i=i=>{i.storageArea===localStorage&&i.key===e&&s(null===i.newValue?n:i.newValue)};return window.addEventListener("storage",i),()=>window.removeEventListener("storage",i)}),[t,o]})(e,n,i),l=(0,r.useCallback)(e=>{for(let n of t)n(e)},[]);return(0,r.useEffect)(()=>(t.push(o),()=>{t.splice(t.indexOf(o),1)}),[o]),[s,l]}),c[e]()):[n,()=>null]})("docusaurus.tab.fileExampleShow",t,!1),g=(0,h.l)({desktopBreakpoint:j}),y=null,v=i&&"desktop"===g;v&&(y=(0,u.jsx)(d.A,{options:[["plain","Plain"],["interactive","Interactive"]],defaultValue:t,value:m,variant:"primary",size:"medium",onChange:e=>f(e)}));let b=null;void 0!==x&&v&&"interactive"===m&&(b=(0,u.jsx)("code",{style:{float:"right",paddingRight:"0.5em",paddingLeft:"0.5em"},children:x}));let w=null;(null!==y||null!==b)&&(w=(0,u.jsxs)("div",{style:{marginBottom:"1em"},children:[y,b]}));let A=(0,r.useMemo)(()=>v&&"interactive"===m?null:"string"!=typeof n?JSON.stringify(n,null,2):n,[i,m,n]);return(0,u.jsxs)(r.Fragment,{children:[w,v&&"plain"!==m?null:(0,u.jsx)(s(),{title:x,language:"json5",children:A}),v&&"interactive"===m?(0,u.jsx)(a.A,{configContent:n,schemaName:o}):null]})},j=e=>(0,u.jsx)(o.A,{fallback:({error:e})=>(0,u.jsx)("div",{children:(0,u.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,u.jsx)(x,{...e})})},1922(e,n,i){i.d(n,{A:()=>f});var r=i(6540),t=i(6025),s=i(8478),o=i(5293),l=i(4020),c=i(7433),d=i.n(c),a=i(8182),h=i.n(a),u=i(1219),x=i.n(u),j=i(4848);function p(e){let n=(0,r.useMemo)(()=>{if(void 0!==e.schema)return(0,l.IM)({schema:e.schema,ajvOptions:{strict:"log",strictSchema:"log",allowUnionTypes:!0},onCreateAjv:e=>{let n=new(d());return n.addKeyword("deprecationMessage"),n.addKeyword("zockerId"),h().default(n),n}})},[e.schema]),i=(0,r.useMemo)(()=>({json:"string"==typeof e.config?x().parse(e.config):e.config}),[e.config]),{colorMode:t}=(0,o.G)();return(0,j.jsx)(l.t$,{validator:n,theme:t,mode:"text",content:i,style:{height:"initial"}})}function m(e){return(0,j.jsx)(s.default,{fallback:(0,j.jsx)("div",{children:"Loading..."}),children:()=>(0,j.jsx)(p,{...e})})}function f(e){let{schemaName:n}=e,[i,s]=(0,r.useState)(void 0),[o,l]=(0,r.useState)(void 0),c=void 0===n?void 0:(0,t.Ay)(`schemas/${e.schemaName}.json`);return(0,r.useEffect)(()=>{void 0===c?s(!1):fetch(c,{headers:{Accept:"application/json"}}).then(e=>e.json()).then(e=>s(e)).catch(e=>s(e))},[s,c]),(0,j.jsxs)(r.Fragment,{children:[void 0===i&&(0,j.jsx)("div",{children:"Loading ..."}),void 0!==i&&i instanceof Error&&(0,j.jsxs)("div",{children:["Houston we have a problem : ",i.message]}),void 0!==i&&!(i instanceof Error)&&(0,j.jsx)(m,{schema:!1===i?void 0:i,config:e.configContent})]})}}}]); \ No newline at end of file diff --git a/assets/js/d53edd15.c1d02ade.js b/assets/js/d53edd15.c1d02ade.js new file mode 100644 index 00000000..f0b826ba --- /dev/null +++ b/assets/js/d53edd15.c1d02ade.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2077"],{9077(e,n,i){i.d(n,{Ay:()=>A,RM:()=>b});var r=i(4848),t=i(8453),s=i(8194),o=i(698),l=i(2170),c=i.n(l),d=i(6540),a=i(8258);function h(e){return(0,r.jsx)("div",{children:(0,r.jsx)(a.Es,{schema:e.schema,renderRootTreeLines:!0,emptyText:"No schema defined",defaultExpandedDepth:0,skipTopLevelDescription:!1,markup:!0})})}var u=i(6025);function x(e){let[n,i]=(0,d.useState)(void 0),t=(0,u.Ay)(`/${e.name}.json`);return(0,d.useEffect)(()=>{fetch(t,{headers:{Accept:"application/json"}}).then(e=>e.json()).then(e=>i(e)).catch(e=>i(e))},[i,t]),(0,r.jsxs)(d.Fragment,{children:[void 0===n&&(0,r.jsx)("div",{children:"Loading ..."}),void 0!==n&&n instanceof Error&&(0,r.jsxs)("div",{children:["Houston we have a problem : ",n.message]}),void 0!==n&&!(n instanceof Error)&&(0,r.jsx)(h,{schema:n})]})}i(1922);var j=i(5548),p=i(349),m=i(1219),f=i.n(m),g=i(8675);let y=e=>{let n,{data:i,configureAs:t="source",aio:s=!1,name:o,...l}=e;try{n=f().parse(i)}catch(e){return console.error(Error(`Unable to parse content for ${!0===s?"aio ":""}${o}`,{cause:e})),(0,r.jsxs)(j.A,{type:"danger",title:"Unexpected Error",children:[(0,r.jsx)("p",{children:"Example component crashed because of error!"}),(0,r.jsx)(c(),{children:e.message})]})}let a=(0,d.useMemo)(()=>{let e;if("string"==typeof i)try{e=f().parse(i)}catch(e){console.error(Error(`Unable to parse transformed content for ${!0===s?"aio ":""}${o}`,{cause:e}))}else e=i;if(void 0!==t&&Array.isArray(e)){let n=e.filter(e=>void 0===e.configureAs||e.configureAs===t);e=s?{["client"===t?"clients":"sources"]:n.map(e=>({...e,type:o}))}:n}return e},[i,t,s,o]);return n=n.filter(e=>void 0===e.configureAs||e.configureAs===t),(0,r.jsx)(g.A,{data:a,...l})},v=e=>(0,r.jsx)(p.A,{fallback:({error:e})=>(0,r.jsx)("div",{children:(0,r.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,r.jsx)(y,{...e})}),b=[];function w(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{AIOType:i,DetailsAdmo:l,EnvType:c,FileType:d}=n;return i||k("AIOType",!0),l||k("DetailsAdmo",!0),c||k("EnvType",!0),d||k("FileType",!0),(0,r.jsxs)(s.A,{groupId:"configType",queryString:!0,children:[(0,r.jsx)(o.A,{value:"env",label:"ENV",children:(0,r.jsxs)(c,{children:[e.children,(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:"Bold/Italic"})})," = Required"]})]})}),(0,r.jsx)(o.A,{value:"file",label:"File",children:(0,r.jsx)(d,{children:(0,r.jsxs)("div",{className:"schemaWrapper",style:{display:"flex"},children:[(0,r.jsxs)("div",{style:{padding:"0 1em 0 1em",flexBasis:"min-content",flexGrow:2},children:[(0,r.jsx)(l,{type:"note",summary:"Config Structure",children:(0,r.jsxs)(n.p,{children:["This displays the ",(0,r.jsx)(n.strong,{children:"structure"})," of the ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"File Configuration"})," for a ",(0,r.jsx)("strong",{children:e.name})," type ",(0,r.jsx)("strong",{children:e.client?"Client":"Source"})," with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config."]})}),(0,r.jsx)(x,{name:`schemas/${e.name}-${e.client?"client":"source"}`})]}),(0,r.jsxs)("div",{style:{flexBasis:"auto",flexGrow:3},children:[(0,r.jsxs)("div",{className:"fileEditor",children:[(0,r.jsxs)(l,{type:"note",summary:"Config Example",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"File Configuration"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"text"})," mode lets you edit the JSON directly."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"tree"})," mode gives you a guided point-and-click editing experience that always keeps the JSON ",(0,r.jsx)(n.em,{children:"syntax"})," valid."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Both modes ",(0,r.jsx)(n.strong,{children:"validate"})," that the configuration is correct. Any errors show up as squiggly lines."]}),(0,r.jsx)("span",{style:{display:!0===e.ambiguous?"inherit":"none"},children:(0,r.jsx)(n.admonition,{type:"important",children:(0,r.jsxs)(n.p,{children:["Only ",(0,r.jsx)("strong",{children:e.client?"client":"source"})," ",(0,r.jsx)("span",{children:e.name})," configs will validate correctly in the editor but ",(0,r.jsx)(n.em,{children:"both"})," ",(0,r.jsx)(n.strong,{children:"source"})," and ",(0,r.jsx)(n.strong,{children:"client"})," ",(0,r.jsx)("span",{children:e.name})," configs are allowed in the real ",(0,r.jsxs)("code",{children:["CONFIG/",(0,r.jsx)("span",{children:e.name}),".json"]})]})})}),(0,r.jsxs)(n.p,{children:["After you finish editing, switch to ",(0,r.jsx)(n.strong,{children:"text"})," and then copy all text to get a completed config."]})]}),(0,r.jsxs)(l,{type:"important",summary:"configureAs Required",render:!0===e.configureAs,children:[(0,r.jsxs)(n.p,{children:["When configuring a ",(0,r.jsx)("span",{children:e.name})," ",(0,r.jsx)(n.strong,{children:"Source"})," in a ",(0,r.jsx)(n.strong,{children:"File"})," Config you ",(0,r.jsx)(n.strong,{children:"must"})," set"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'"configureAs": "source"\n'})}),(0,r.jsxs)(n.p,{children:["Without this property, Multi-Scrobbler will assume the config is for a ",(0,r.jsx)("span",{children:e.name})," ",(0,r.jsx)(n.strong,{children:"Client"})," config."]}),(0,r.jsxs)(n.p,{children:["This requirement does not apply to ",(0,r.jsx)(n.strong,{children:"AIO"})," ",(0,r.jsx)("span",{children:e.name})," configs."]})]})]}),(0,r.jsx)("div",{className:"fileEditorMobile",children:(0,r.jsxs)(l,{type:"warning",summary:"Config Example Mobile Experience",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," ",(0,r.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"File Configuration"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.p,{children:["The example config file editor is meant for a larger screen experience so ",(0,r.jsx)(n.strong,{children:"only the read-only example is shown."})," Please use this site on a tablet/laptop/desktop to enable file editor features."]})]})}),(0,r.jsx)(v,{filePathName:`CONFIG/${e.name}.json`,configureAs:e.client?"client":"source",data:e.fileContent,schemaName:`${e.name}-${e.client?"client":"source"}`,readOnlyAtWidth:500})]})]})})}),(0,r.jsx)(o.A,{value:"aio",label:"AIO",children:(0,r.jsx)(i,{children:(0,r.jsxs)("div",{className:"schemaWrapper",style:{display:"flex"},children:[(0,r.jsxs)("div",{style:{padding:"0 1em 0 1em",flexBasis:"min-content",flexGrow:2},children:[(0,r.jsxs)(l,{type:"note",summary:"Config Structure",children:[(0,r.jsxs)(n.p,{children:["This displays the ",(0,r.jsx)(n.strong,{children:"structure"})," of the ",(0,r.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:["all-in-one (",(0,r.jsx)(n.code,{children:"config.json"}),") configuration"]})," with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config."]}),(0,r.jsxs)(n.p,{children:["Select the ",(0,r.jsx)("strong",{children:e.name})," type from the respective ",(0,r.jsx)("code",{children:e.client?"clients":"sources"})," node below, then expand it."]})]}),(0,r.jsx)(x,{name:"schemas/aio"})]}),(0,r.jsxs)("div",{style:{flexBasis:"auto",flexGrow:3},children:[(0,r.jsx)("div",{className:"fileEditor",children:(0,r.jsxs)(l,{type:"note",summary:"Config Example",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:["all-in-one (",(0,r.jsx)(n.code,{children:"config.json"}),") configuration"]})," that includes a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"text"})," mode lets you edit the JSON directly."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"tree"})," mode gives you a guided point-and-click editing experience that always keeps the JSON ",(0,r.jsx)(n.em,{children:"syntax"})," valid."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Both modes ",(0,r.jsx)(n.strong,{children:"validate"})," that the configuraion is correct. Any errors show up as squiggly lines."]}),(0,r.jsxs)(n.p,{children:["After you finish editing, switch to ",(0,r.jsx)(n.strong,{children:"text"})," and then copy all text to get a completed config."]})]})}),(0,r.jsx)("div",{className:"fileEditorMobile",children:(0,r.jsxs)(l,{type:"warning",summary:"Config Example Mobile Experience",children:[(0,r.jsxs)(n.p,{children:["This displays an ",(0,r.jsx)(n.strong,{children:"example config file"})," of a ",(0,r.jsxs)(n.a,{href:"/configuration?configType=aio#configuration-types",children:["all-in-one (",(0,r.jsx)(n.code,{children:"config.json"}),") configuration"]})," that includes a ",(0,r.jsx)("strong",{children:e.name})," ",(0,r.jsx)("span",{children:e.client?"Client":"Source"})," that adheres to the shown ",(0,r.jsx)(n.strong,{children:"Config Structure"}),"."]}),(0,r.jsxs)(n.p,{children:["The example config file editor is meant for a larger screen experience so ",(0,r.jsx)(n.strong,{children:"only the read-only example is shown."})," Please use this site on a tablet/laptop/desktop to enable file editor features."]})]})}),(0,r.jsx)(v,{filePathName:"CONFIG/config.json",configureAs:e.client?"client":"source",data:e.fileContent,schemaName:"aio",name:e.name,readOnlyAtWidth:500,aio:!0})]})]})})})]})}function A(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(w,{...e})}):w(e)}function k(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9581(e,n,i){i.r(n),i.d(n,{metadata:()=>r,default:()=>j,frontMatter:()=>d,contentTitle:()=>a,toc:()=>u,assets:()=>h});var r=JSON.parse('{"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:","source":"@site/docs/configuration/sources/kodi.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/kodi","permalink":"/multi-scrobbler/configuration/sources/kodi","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/kodi.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Kodi","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"JRiver","permalink":"/multi-scrobbler/configuration/sources/jriver"},"next":{"title":"Koito","permalink":"/multi-scrobbler/configuration/sources/koito-source"}}'),t=i(4848),s=i(8453);i(8194),i(698),i(2170);var o=i(9077);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"KODI_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"KODI_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"KODI_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:8080/jsonrpc",children:"http://localhost:8080/jsonrpc"})}),(0,t.jsx)(n.td,{children:"URL of the Kodi HTTP server to connect to"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_USER"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"The username set for Remote Control via Web Sever"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"KODI_PASSWORD"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"The password set for Remote Control via Web Sever"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}let d={title:"Kodi",toc_min_heading_level:2,toc_max_heading_level:5},a,h={},u=[{value:"URL",id:"url",level:3},{value:"Configuration",id:"configuration",level:2},...o.RM];function x(e){let n={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,s.R)(),...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,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["In order for multi-scrobbler to communicate with Kodi you must have the ",(0,t.jsx)(n.a,{href:"https://kodi.wiki/view/Web_interface",children:"Web Interface"})," enabled. This can be done in the Kodi GUI:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Settings -> Services -> Control","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.code,{children:"Allow remote control via HTTP"})]}),"\n",(0,t.jsxs)(n.li,{children:["Ensure you have a ",(0,t.jsx)(n.strong,{children:"Username"})," and ",(0,t.jsx)(n.strong,{children:"Password"})," set, you will need to provide them in the ENV/File configuration below."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"url",children:"URL"}),"\n",(0,t.jsxs)(n.p,{children:["The URL used to connect to Kodi, set in your ",(0,t.jsxs)(n.a,{href:"#configuration",children:["file config as ",(0,t.jsx)(n.code,{children:"url"}),"."]})," The URL used to connect ultimately must be formed like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Syntax => [protocol]://[hostname]:[port]/[path]\nDefault => http://localhost:8080/jsonrpc\n"})}),"\n",(0,t.jsxs)(n.p,{children:["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 ",(0,t.jsx)(n.strong,{children:"not"})," standard you must explicitly define it."]}),"\n",(0,t.jsx)(n.admonition,{title:"Kodi Settings",type:"tip",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Make sure the port number matches what is found in ",(0,t.jsx)(n.strong,{children:"Port"})," in the Control section mentioned above."]}),"\n",(0,t.jsxs)(n.li,{children:["If your installation is on the same machine but you cannot connect using ",(0,t.jsx)(n.code,{children:"localhost"})," try ",(0,t.jsx)(n.code,{children:"0.0.0.0"})," instead."]}),"\n"]})}),"\n",(0,t.jsxs)(i,{children:[(0,t.jsx)("summary",{children:"URL Transform Examples"}),(0,t.jsxs)(n.p,{children:["Examples of a given ",(0,t.jsx)(n.code,{children:"url"})," in your file config and the final URL multi-scrobbler will use to connect to Kodi:"]}),(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:(0,t.jsx)(n.code,{children:"url"})}),(0,t.jsx)(n.th,{children:"Transformed URL"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"(none set)"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:8080/jsonrpc"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kodi.mydomain.com"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://kodi.mydomain.com:8080/jsonrpc"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"192.168.0.101:3456"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://192.168.0.101:3456/jsonprc"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"mydomain.com:80/kodiReverse/jsonrpc"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://mydomain.com:80/kodiReverse/jsonrpc"})})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(o.Ay,{config:"KodiSourceConfig",fileContent:'[\n {\n "name": "My Kodi Server",\n "id": "myKodi",\n "enable": true,\n "data": {\n "url": "http://localhost:8080/jsonrpc",\n "username": "myUser",\n "password": "myPassword"\n }\n }\n]\n',name:"kodi",children:(0,t.jsx)(c,{})})]})}function j(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},1672(e,n,i){i.d(n,{A:()=>o}),i(6540);var r=i(4164),t=i(8774),s=i(4848);function o({size:e=null,outline:n=!1,variant:i="primary",block:l=!1,disabled:c=!1,className:d,style:a={},link:h,label:u,onClick:x=()=>null,...j}){let p=e?({sm:"sm",small:"sm",lg:"lg",large:"lg",medium:null})[e]:"",m=p?`button--${p}`:"",f=i?`button--${i}`:"";return(0,s.jsx)(t.A,{to:c?null:h,children:(0,s.jsx)("button",{className:(0,r.A)("button",m,n?"button--outline":"",f,l?"button--block":"",c?"disabled":"",d),style:a,role:"button","aria-disabled":c,onClick:e=>{e.preventDefault(),x()},...j,children:u})})}},9643(e,n,i){i.d(n,{A:()=>c}),i(6540);var r=i(1672),t=i(4848);let s={borderRadius:"var(--ifm-button-border-radius) 0 0 var(--ifm-button-border-radius)"},o={borderRadius:"0 var(--ifm-button-border-radius) var(--ifm-button-border-radius) 0"},l={borderRadius:"0"};function c({size:e=null,variant:n="primary",block:i=!1,disabled:d=!1,className:a,style:h,options:u,value:x,defaultValue:j,onChange:p=()=>null}){if(void 0===u||0===u.length)return null;let m=u.map((i,c)=>{let d={style:l,outline:!0,size:e,variant:n,label:i[1],link:"#",onClick:()=>p(i[0])};return 0===c?d.style=s:c===u.length-1&&(d.style=o),(x??j)===i[0]&&(d.outline=!1),(0,t.jsx)(r.A,{...d},c)});return(0,t.jsx)("span",{children:m})}},8675(e,n,i){i.d(n,{A:()=>j});var r=i(6540),t=i(2170),s=i.n(t),o=i(349),l=i(8193);let c={};var d=i(9643),a=i(1922),h=i(4581),u=i(4848);let x=e=>{let{data:n,interactive:i=!0,defaultDisplay:t="interactive",schemaName:o,filePathName:x,readOnlyAtWidth:j=1,...p}=e,[m,f]=((e,n,i)=>{let t;return e in c?c[e]():l.A.canUseDOM?(c[e]=(t=[],()=>{let[s,o]=((e,n,i=!0)=>{let[t,s]=(0,r.useState)(()=>{let r=window.localStorage.getItem(e);if(i)try{return r?JSON.parse(r):n}catch(e){return console.error(e),n}try{let e;if(null===r)return n;if("true"===r)return!0;if("false"===r)return!1;if(e=r,("number"==typeof e||"string"==typeof e&&""!==e.trim())&&!isNaN(e)){if(r.includes("."))return parseFloat(r);return parseInt(r)}return r}catch(e){return console.error(e),n}}),o=(0,r.useCallback)(n=>{s(()=>(i?localStorage.setItem(e,JSON.stringify(n)):localStorage.setItem(e,n),n))},[e]);return(0,r.useEffect)(()=>{let i=i=>{i.storageArea===localStorage&&i.key===e&&s(null===i.newValue?n:i.newValue)};return window.addEventListener("storage",i),()=>window.removeEventListener("storage",i)}),[t,o]})(e,n,i),l=(0,r.useCallback)(e=>{for(let n of t)n(e)},[]);return(0,r.useEffect)(()=>(t.push(o),()=>{t.splice(t.indexOf(o),1)}),[o]),[s,l]}),c[e]()):[n,()=>null]})("docusaurus.tab.fileExampleShow",t,!1),g=(0,h.l)({desktopBreakpoint:j}),y=null,v=i&&"desktop"===g;v&&(y=(0,u.jsx)(d.A,{options:[["plain","Plain"],["interactive","Interactive"]],defaultValue:t,value:m,variant:"primary",size:"medium",onChange:e=>f(e)}));let b=null;void 0!==x&&v&&"interactive"===m&&(b=(0,u.jsx)("code",{style:{float:"right",paddingRight:"0.5em",paddingLeft:"0.5em"},children:x}));let w=null;(null!==y||null!==b)&&(w=(0,u.jsxs)("div",{style:{marginBottom:"1em"},children:[y,b]}));let A=(0,r.useMemo)(()=>v&&"interactive"===m?null:"string"!=typeof n?JSON.stringify(n,null,2):n,[i,m,n]);return(0,u.jsxs)(r.Fragment,{children:[w,v&&"plain"!==m?null:(0,u.jsx)(s(),{title:x,language:"json5",children:A}),v&&"interactive"===m?(0,u.jsx)(a.A,{configContent:n,schemaName:o}):null]})},j=e=>(0,u.jsx)(o.A,{fallback:({error:e})=>(0,u.jsx)("div",{children:(0,u.jsxs)("p",{children:["Example component crashed because of error: ",e.message,"."]})}),children:(0,u.jsx)(x,{...e})})},1922(e,n,i){i.d(n,{A:()=>f});var r=i(6540),t=i(6025),s=i(8478),o=i(5293),l=i(4020),c=i(7433),d=i.n(c),a=i(8182),h=i.n(a),u=i(1219),x=i.n(u),j=i(4848);function p(e){let n=(0,r.useMemo)(()=>{if(void 0!==e.schema)return(0,l.IM)({schema:e.schema,ajvOptions:{strict:"log",strictSchema:"log",allowUnionTypes:!0},onCreateAjv:e=>{let n=new(d());return n.addKeyword("deprecationMessage"),n.addKeyword("zockerId"),h().default(n),n}})},[e.schema]),i=(0,r.useMemo)(()=>({json:"string"==typeof e.config?x().parse(e.config):e.config}),[e.config]),{colorMode:t}=(0,o.G)();return(0,j.jsx)(l.t$,{validator:n,theme:t,mode:"text",content:i,style:{height:"initial"}})}function m(e){return(0,j.jsx)(s.default,{fallback:(0,j.jsx)("div",{children:"Loading..."}),children:()=>(0,j.jsx)(p,{...e})})}function f(e){let{schemaName:n}=e,[i,s]=(0,r.useState)(void 0),[o,l]=(0,r.useState)(void 0),c=void 0===n?void 0:(0,t.Ay)(`schemas/${e.schemaName}.json`);return(0,r.useEffect)(()=>{void 0===c?s(!1):fetch(c,{headers:{Accept:"application/json"}}).then(e=>e.json()).then(e=>s(e)).catch(e=>s(e))},[s,c]),(0,j.jsxs)(r.Fragment,{children:[void 0===i&&(0,j.jsx)("div",{children:"Loading ..."}),void 0!==i&&i instanceof Error&&(0,j.jsxs)("div",{children:["Houston we have a problem : ",i.message]}),void 0!==i&&!(i instanceof Error)&&(0,j.jsx)(m,{schema:!1===i?void 0:i,config:e.configContent})]})}}}]); \ No newline at end of file diff --git a/assets/js/dfa6d5b1.79649750.js b/assets/js/dfa6d5b1.79649750.js new file mode 100644 index 00000000..56ba9817 --- /dev/null +++ b/assets/js/dfa6d5b1.79649750.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["539"],{3743(e,n,s){s.r(n),s.d(n,{metadata:()=>i,default:()=>h,frontMatter:()=>o,contentTitle:()=>a,toc:()=>c,assets:()=>l});var i=JSON.parse('{"id":"configuration/transforms/native","title":"Native Stage","description":"Enhancing Scrobbles with Built-in Parsing","source":"@site/docs/configuration/transforms/native.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/native","permalink":"/multi-scrobbler/configuration/transforms/native","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/native.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Native Stage","description":"Enhancing Scrobbles with Built-in Parsing","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Musicbrainz Stage","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz"},"next":{"title":"User Stage","permalink":"/multi-scrobbler/configuration/transforms/user"}}'),t=s(4848),r=s(8453);let o={title:"Native Stage",description:"Enhancing Scrobbles with Built-in Parsing",toc_min_heading_level:2,toc_max_heading_level:5},a,l={},c=[{value:"Configuration",id:"configuration",level:2},{value:"Rules",id:"rules",level:3},{value:"Default Stage",id:"default-stage",level:3},{value:"ENV Configuration",id:"env-configuration",level:2},{value:"Examples",id:"examples",level:2},{value:"Parse only artists string using a custom delimiter",id:"parse-only-artists-string-using-a-custom-delimiter",level:3},{value:"Don't parse specific artists",id:"dont-parse-specific-artists",level:3},{value:"Extract Artists from Title but do not modify Title",id:"extract-artists-from-title-but-do-not-modify-title",level:3}];function d(e){let n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...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,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Native"})," ",(0,t.jsx)(n.a,{href:"/configuration/transforms#stage",children:"Stage"})," uses ",(0,t.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/tests/plays/playParsing.test.ts",children:"built-in heuristics"})," to try to extract Artists from Play artist/track data."]}),"\n",(0,t.jsx)(n.p,{children:"This Stage is most useful for Sources that report limited data such as:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," - Reports Artists as a single string"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A non-exhaustive list of heuristics:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Splits artists in artist string using common delimiters EX ",(0,t.jsx)(n.code,{children:"Foo Artist, Bar Guy, Baz Band - My Cool Song"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Does not split artists with ",(0,t.jsx)(n.code,{children:"&"})," in name, if other delimiters are present"]}),"\n",(0,t.jsx)(n.li,{children:"Does not split artist name when only one delimiter is present"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Splits artists on common joiner phrases (ft. feat. vs. etc...)","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Extracts artists from Play title using joiner phrases EX ",(0,t.jsx)(n.code,{children:"My Cool Song (feat. SomeGuy)"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A practical example of what the Native Stage will do to Play data:"}),"\n",(0,t.jsxs)(n.p,{children:["This Scrobble from ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup & Punk Rock Factory"]\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Will be transformed into this"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility",\n "artists": ["Bowling For Soup", "Punk Rock Factory", "Wheatus"]\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["Available properties for ",(0,t.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"delimitersExtra"})," - A list of string characters that should be considered delimiters for artists ",(0,t.jsx)(n.strong,{children:"in addition to"})," multi-scrobbler's default list (",(0,t.jsx)(n.code,{children:", / \\ "}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"delimiters"})," - A list of string characters that should be considered delimiters for artists.","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Replaces"})," all delimiters (MS not use any defaults, only what you give it)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"artistsIgnore"})," - a list of strings and/or regular expressions. Any monolothic artist string that matches from the list ",(0,t.jsx)(n.em,{children:"will not be modified."})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"artistsParseFrom"})," a list of the properties that should be used to try to extract artists. Can be ",(0,t.jsx)(n.code,{children:"artists"})," ",(0,t.jsx)(n.code,{children:"title"})," or both. Defaults to both when not provided in options ( ",(0,t.jsx)(n.code,{children:'["artists", "title"]'})," )","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["When ",(0,t.jsx)(n.code,{children:"artists"})," is present it tries to extract additional artists from artist strings"]}),"\n",(0,t.jsxs)(n.li,{children:["When ",(0,t.jsx)(n.code,{children:"title"})," is present it tries to extract artists from ft. feat. vs. etc... found in the track title"]}),"\n",(0,t.jsxs)(n.li,{children:["Importantly, if ",(0,t.jsx)(n.code,{children:"artists"})," is ",(0,t.jsx)(n.em,{children:"not"})," present in ",(0,t.jsx)(n.code,{children:"artistsParseFrom"})," then ",(0,t.jsx)(n.em,{children:"no artists"})," are used at all (only those from ",(0,t.jsx)(n.code,{children:"title"}),", if present)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"artistsParseMonolithicOnly"})," - boolean value, defaults to ",(0,t.jsx)(n.code,{children:"true"}),". When ",(0,t.jsx)(n.code,{children:"true"})," native tranformer will only attempt to extract artists if the scrobble data has ",(0,t.jsx)(n.em,{children:"only one string for artist"})," (pre-transform)","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["This means that, for Sources like Spotify/Jellyfin/etc. that provide proper lists of artists in their data ",(0,t.jsx)(n.em,{children:"and the list has more than one string"}),", it will not try to extract artists from their strings"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Example of the behavior for ",(0,t.jsx)(n.code,{children:"artistsParseFrom"})]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"The Foos, The Bars - My Cool Track (ft. Frank)\n"})}),(0,t.jsx)(n.p,{children:"Config => extracted artists"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'"artistsParseFrom": ["artists", "title"] => The Foos, The Bars, Frank\n"artistsParseFrom": ["artists"] => The Foos, The Bars\n"artistsParseFrom": ["title"] => Frank\n"artistsParseFrom": [] =>\n'})})]}),"\n",(0,t.jsx)(n.h3,{id:"rules",children:"Rules"}),"\n",(0,t.jsxs)(n.p,{children:["Each ",(0,t.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,t.jsxs)(n.a,{href:"/configuration/transforms#conditional-modification",children:[(0,t.jsx)(n.code,{children:"when"})," condition."]}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.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 "album": true // will always apply changes to Play album\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["If a rule is not present then multi-scrobbler defaults it to ",(0,t.jsx)(n.code,{children:"true"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"default-stage",children:"Default Stage"}),"\n",(0,t.jsxs)(n.p,{children:["For your convenience, if you do not define any Native ",(0,t.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configurations"})," then multi-scrobbler automatically builds one using the defaults shown in ",(0,t.jsx)(n.a,{href:"#configuration",children:"configuration"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This can be used by omitting the ",(0,t.jsx)(n.code,{children:"name"})," in your ",(0,t.jsx)(n.a,{href:"/configuration/transforms#stage",children:"modification Stage"}),"."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 // do not include name, the default native stage will be used\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h2,{id:"env-configuration",children:"ENV Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["The default configuration shown above can also be applied using ",(0,t.jsx)(n.a,{href:"/configuration?configType=env#configuration-types",children:"ENV Config"})," for individual Sources/Clients."]}),"\n",(0,t.jsxs)(n.p,{children:["Use ENV ",(0,t.jsx)(n.code,{children:"*_TRANSFORMS=native"})," on each Source/Client you wish to apply this stage to. This applies the stage in the ",(0,t.jsxs)(n.a,{href:"/configuration/transforms#lifecycle-hooks",children:[(0,t.jsx)(n.code,{children:"preTransform"})," Hook"]})," with all ",(0,t.jsx)(n.a,{href:"#rules",children:"Rules"})," enabled."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.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,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["All ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic/",children:"Subsonic Source"})," ENVs look like ",(0,t.jsx)(n.code,{children:"SUBSONIC_USER=myuser"})," etc..."]}),"\n",(0,t.jsxs)(n.li,{children:["Use ",(0,t.jsx)(n.code,{children:"SUBSONIC_TRANSFORMS=native"})]}),"\n"]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example Full Docker Deploy with ENV Configuration"}),(0,t.jsxs)(n.p,{children:["Using ",(0,t.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"Jellyfin + Maloja"})," example from Quickstart:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - JELLYFIN_URL=192.168.0.110:8096\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b\n - JELLYFIN_USER=MyUser\n - JELLYFIN_TRANSFORMS=native # applies native Stage to preTransform of Jellyfin source\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,t.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,t.jsx)(n.h3,{id:"parse-only-artists-string-using-a-custom-delimiter",children:"Parse only artists string using a custom delimiter"}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["Your ",(0,t.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h3,{id:"dont-parse-specific-artists",children:"Don't parse specific artists"}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["Your ",(0,t.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "MyNativeTransformer",\n "defaults": {\n "artistsIgnore": [\n "Crosby, Stills, Nash & Young",\n "Polo & Pan"\n ]\n }\n }\n ]\n}\n'})}),(0,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h3,{id:"extract-artists-from-title-but-do-not-modify-title",children:"Extract Artists from Title but do not modify Title"}),"\n",(0,t.jsxs)(n.p,{children:["In the scenario where you want to extract Artists from Track titles with joiners like ",(0,t.jsx)(n.code,{children:"My Cool Track (feat. Foobar)"})," but want to keep the title as-is:"]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["No additional ",(0,t.jsx)(n.a,{href:"#configuration",children:"stage configuration"})," is required so we can use the ",(0,t.jsx)(n.a,{href:"#default-stage",children:"default Stage"}),"."]}),(0,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 "title": false // do not modify title\n }\n ]\n }\n }\n }\n]\n'})})]})]})}function h(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/dfa6d5b1.bed44827.js b/assets/js/dfa6d5b1.bed44827.js deleted file mode 100644 index 9f79b805..00000000 --- a/assets/js/dfa6d5b1.bed44827.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["539"],{3743(e,n,s){s.r(n),s.d(n,{metadata:()=>i,default:()=>h,frontMatter:()=>o,contentTitle:()=>a,toc:()=>c,assets:()=>l});var i=JSON.parse('{"id":"configuration/transforms/native","title":"Native Stage","description":"Enhancing Scrobbles with Built-in Parsing","source":"@site/docs/configuration/transforms/native.mdx","sourceDirName":"configuration/transforms","slug":"/configuration/transforms/native","permalink":"/multi-scrobbler/configuration/transforms/native","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/native.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Native Stage","description":"Enhancing Scrobbles with Built-in Parsing","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Musicbrainz Stage","permalink":"/multi-scrobbler/configuration/transforms/musicbrainz"},"next":{"title":"User Stage","permalink":"/multi-scrobbler/configuration/transforms/user"}}'),t=s(4848),r=s(8453);let o={title:"Native Stage",description:"Enhancing Scrobbles with Built-in Parsing",toc_min_heading_level:2,toc_max_heading_level:5},a,l={},c=[{value:"Configuration",id:"configuration",level:2},{value:"Rules",id:"rules",level:3},{value:"Default Stage",id:"default-stage",level:3},{value:"ENV Configuration",id:"env-configuration",level:2},{value:"Examples",id:"examples",level:2},{value:"Parse only artists string using a custom delimiter",id:"parse-only-artists-string-using-a-custom-delimiter",level:3},{value:"Don't parse specific artists",id:"dont-parse-specific-artists",level:3},{value:"Extract Artists from Title but do not modify Title",id:"extract-artists-from-title-but-do-not-modify-title",level:3}];function d(e){let n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...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,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Native"})," ",(0,t.jsx)(n.a,{href:"/configuration/transforms#stage",children:"Stage"})," uses ",(0,t.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/src/backend/tests/plays/playParsing.test.ts",children:"built-in heuristics"})," to try to extract Artists from Play artist/track data."]}),"\n",(0,t.jsx)(n.p,{children:"This Stage is most useful for Sources that report limited data such as:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," - Reports Artists as a single string"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A non-exhaustive list of heuristics:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Splits artists in artist string using common delimiters EX ",(0,t.jsx)(n.code,{children:"Foo Artist, Bar Guy, Baz Band - My Cool Song"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Does not split artists with ",(0,t.jsx)(n.code,{children:"&"})," in name, if other delimiters are present"]}),"\n",(0,t.jsx)(n.li,{children:"Does not split artist name when only one delimiter is present"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Splits artists on common joiner phrases (ft. feat. vs. etc...)","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Extracts artists from Play title using joiner phrases EX ",(0,t.jsx)(n.code,{children:"My Cool Song (feat. SomeGuy)"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A practical example of what the Native Stage will do to Play data:"}),"\n",(0,t.jsxs)(n.p,{children:["This Scrobble from ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility (feat. Wheatus)",\n "artists": ["Bowling For Soup & Punk Rock Factory"]\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Will be transformed into this"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "title": "Endless Possibility",\n "artists": ["Bowling For Soup", "Punk Rock Factory", "Wheatus"]\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["Available properties for ",(0,t.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configuration"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"delimitersExtra"})," - A list of string characters that should be considered delimiters for artists ",(0,t.jsx)(n.strong,{children:"in addition to"})," multi-scrobbler's default list (",(0,t.jsx)(n.code,{children:", / \\ "}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"delimiters"})," - A list of string characters that should be considered delimiters for artists.","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Replaces"})," all delimiters (MS not use any defaults, only what you give it)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"artistsIgnore"})," - a list of strings and/or regular expressions. Any monolothic artist string that matches from the list ",(0,t.jsx)(n.em,{children:"will not be modified."})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"artistsParseFrom"})," a list of the properties that should be used to try to extract artists. Can be ",(0,t.jsx)(n.code,{children:"artists"})," ",(0,t.jsx)(n.code,{children:"title"})," or both. Defaults to both when not provided in options ( ",(0,t.jsx)(n.code,{children:'["artists", "title"]'})," )","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["When ",(0,t.jsx)(n.code,{children:"artists"})," is present it tries to extract additional artists from artist strings"]}),"\n",(0,t.jsxs)(n.li,{children:["When ",(0,t.jsx)(n.code,{children:"title"})," is present it tries to extract artists from ft. feat. vs. etc... found in the track title"]}),"\n",(0,t.jsxs)(n.li,{children:["Importantly, if ",(0,t.jsx)(n.code,{children:"artists"})," is ",(0,t.jsx)(n.em,{children:"not"})," present in ",(0,t.jsx)(n.code,{children:"artistsParseFrom"})," then ",(0,t.jsx)(n.em,{children:"no artists"})," are used at all (only those from ",(0,t.jsx)(n.code,{children:"title"}),", if present)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"artistsParseMonolithicOnly"})," - boolean value, defaults to ",(0,t.jsx)(n.code,{children:"true"}),". When ",(0,t.jsx)(n.code,{children:"true"})," native tranformer will only attempt to extract artists if the scrobble data has ",(0,t.jsx)(n.em,{children:"only one string for artist"})," (pre-transform)","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["This means that, for Sources like Spotify/Jellyfin/etc. that provide proper lists of artists in their data ",(0,t.jsx)(n.em,{children:"and the list has more than one string"}),", it will not try to extract artists from their strings"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsxs)("summary",{children:["Example of the behavior for ",(0,t.jsx)(n.code,{children:"artistsParseFrom"})]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"The Foos, The Bars - My Cool Track (ft. Frank)\n"})}),(0,t.jsx)(n.p,{children:"Config => extracted artists"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'"artistsParseFrom": ["artists", "title"] => The Foos, The Bars, Frank\n"artistsParseFrom": ["artists"] => The Foos, The Bars\n"artistsParseFrom": ["title"] => Frank\n"artistsParseFrom": [] =>\n'})})]}),"\n",(0,t.jsx)(n.h3,{id:"rules",children:"Rules"}),"\n",(0,t.jsxs)(n.p,{children:["Each ",(0,t.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,t.jsxs)(n.a,{href:"/configuration/transforms#conditional-modification",children:[(0,t.jsx)(n.code,{children:"when"})," condition."]}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.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 "album": true // will always apply changes to Play album\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["If a rule is not present then multi-scrobbler defaults it to ",(0,t.jsx)(n.code,{children:"true"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"default-stage",children:"Default Stage"}),"\n",(0,t.jsxs)(n.p,{children:["For your convenience, if you do not define any Native ",(0,t.jsx)(n.a,{href:"/configuration/transforms#configuring-stages",children:"Stage Configurations"})," then multi-scrobbler automatically builds one using the defaults shown in ",(0,t.jsx)(n.a,{href:"#configuration",children:"configuration"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This can be used by omitting the ",(0,t.jsx)(n.code,{children:"name"})," in your ",(0,t.jsx)(n.a,{href:"/configuration/transforms#stage",children:"modification Stage"}),"."]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 // do not include name, the default native stage will be used\n }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h2,{id:"env-configuration",children:"ENV Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["The default configuration shown above can also be applied using ",(0,t.jsx)(n.a,{href:"/configuration?configType=env#configuration-types",children:"ENV Config"})," for individual Sources/Clients."]}),"\n",(0,t.jsxs)(n.p,{children:["Use ENV ",(0,t.jsx)(n.code,{children:"*_TRANSFORMS=native"})," on each Source/Client you wish to apply this stage to. This applies the stage in the ",(0,t.jsxs)(n.a,{href:"/configuration/transforms#lifecycle-hooks",children:[(0,t.jsx)(n.code,{children:"preTransform"})," Hook"]})," with all ",(0,t.jsx)(n.a,{href:"#rules",children:"Rules"})," enabled."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.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,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["All ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic/",children:"Subsonic Source"})," ENVs look like ",(0,t.jsx)(n.code,{children:"SUBSONIC_USER=myuser"})," etc..."]}),"\n",(0,t.jsxs)(n.li,{children:["Use ",(0,t.jsx)(n.code,{children:"SUBSONIC_TRANSFORMS=native"})]}),"\n"]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example Full Docker Deploy with ENV Configuration"}),(0,t.jsxs)(n.p,{children:["Using ",(0,t.jsx)(n.a,{href:"/quickstart#create-docker-compose-file",children:"Jellyfin + Maloja"})," example from Quickstart:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler\n container_name: multi-scrobbler\n environment:\n - JELLYFIN_URL=192.168.0.110:8096\n - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b\n - JELLYFIN_USER=MyUser\n - JELLYFIN_TRANSFORMS=native # applies native Stage to preTransform of Jellyfin source\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,t.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,t.jsx)(n.h3,{id:"parse-only-artists-string-using-a-custom-delimiter",children:"Parse only artists string using a custom delimiter"}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["Your ",(0,t.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h3,{id:"dont-parse-specific-artists",children:"Don't parse specific artists"}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["Your ",(0,t.jsx)(n.a,{href:"/configuration?configType=aio#configuration-types",children:"AIO Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json5",metastring:'title="config.json"',children:'{\n // ...\n "transformers": [\n {\n "type": "native",\n "name": "MyNativeTransformer",\n "defaults": {\n "artistsIgnore": [\n "Crosby, Stills, Nash & Young",\n "Polo & Pan"\n ]\n }\n }\n ]\n}\n'})}),(0,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 }\n ]\n }\n }\n }\n]\n'})})]}),"\n",(0,t.jsx)(n.h3,{id:"extract-artists-from-title-but-do-not-modify-title",children:"Extract Artists from Title but do not modify Title"}),"\n",(0,t.jsxs)(n.p,{children:["In the scenario where you want to extract Artists from Track titles with joiners like ",(0,t.jsx)(n.code,{children:"My Cool Track (feat. Foobar)"})," but want to keep the title as-is:"]}),"\n",(0,t.jsxs)(s,{children:[(0,t.jsx)("summary",{children:"Example"}),(0,t.jsxs)(n.p,{children:["No additional ",(0,t.jsx)(n.a,{href:"#configuration",children:"stage configuration"})," is required so we can use the ",(0,t.jsx)(n.a,{href:"#default-stage",children:"default Stage"}),"."]}),(0,t.jsxs)(n.p,{children:["In a ",(0,t.jsx)(n.a,{href:"/configuration/sources/subsonic",children:"Subsonic"})," ",(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File Config"}),":"]}),(0,t.jsx)(n.pre,{children:(0,t.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 "title": false // do not modify title\n }\n ]\n }\n }\n }\n]\n'})})]})]})}function h(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/e6ac3f64.065ee538.js b/assets/js/e6ac3f64.065ee538.js deleted file mode 100644 index 37d92ad1..00000000 --- a/assets/js/e6ac3f64.065ee538.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1184"],{265(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>m,frontMatter:()=>l,contentTitle:()=>c,toc:()=>h,assets:()=>d});var s=JSON.parse('{"id":"configuration/transforms/musicbrainz","title":"Musicbrainz Stage","description":"Enhancing Scrobbles with Musicbrainz","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/musicbrainz.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Musicbrainz Stage","description":"Enhancing Scrobbles with Musicbrainz","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(4848),a=i(8453),t=i(8194),o=i(698);let l={title:"Musicbrainz Stage",description:"Enhancing Scrobbles with Musicbrainz",toc_min_heading_level:2,toc_max_heading_level:5},c,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:"Caching",id:"caching",level:3},{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},{value:"Use Metadata for Discord Album Art",id:"use-metadata-for-discord-album-art",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.R)(),...e.components},{Details:i,DetailsAdmo:s}=n;return i||f("Details",!0),s||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)(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:"/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 "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:"/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-modification",children:[(0,r.jsx)(n.code,{children:"when"})," condition"]}),":"]}),"\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 // ...\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)(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 "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-and-hooks",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:"/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 # 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)(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."]}),"\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)(i,{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)(i,{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)(i,{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)(i,{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)(i,{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)(i,{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.A,{groupId:"searchArtistMethod",queryString:!0,children:[(0,r.jsxs)(o.A,{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 // will only search using title/album + native extracted artists\n "searchOrder": ["artist"],\n "searchArtistMethod": "native"\n }\n'})})]}),(0,r.jsxs)(o.A,{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 // will only search using title/album + naive extracted artists\n "searchOrder": ["artist"],\n "searchArtistMethod": "naive"\n }\n'})})]})]})]}),"\n",(0,r.jsxs)(i,{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-attributes",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)(i,{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)(i,{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:"caching",children:"Caching"}),"\n",(0,r.jsxs)(n.p,{children:["You ",(0,r.jsx)(n.strong,{children:"should"})," setup ",(0,r.jsx)(n.a,{href:"/configuration/transforms#caching",children:"metadata caching"})," to reduce API calls, improve transform performance, and reduce memory usage when using this stage."]}),"\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)(i,{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-source",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.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)(s,{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-and-hooks",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:"#rules-and-hooks",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 "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)(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/sources/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:"/configuration/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 "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/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)(i,{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'})})]}),"\n",(0,r.jsx)(n.h3,{id:"use-metadata-for-discord-album-art",children:"Use Metadata for Discord Album Art"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord",children:"Discord"})," Client can fetch album art images from ",(0,r.jsx)(n.a,{href:"http://coverartarchive.org/",children:"Cover Art Archive"})," if the Scrobble data contains a Release MBID. Use the Musicbrainz Stage on the ",(0,r.jsx)(n.code,{children:"preCompare"})," hook for your Discord client so that missing Musicbrainz IDs are populated for this functionality."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["Using the ",(0,r.jsx)(n.a,{href:"#env-configuration",children:"ENV Configuration"})," from above, add these fields to your docker compose ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"- MB_CONTACT=contact@mydomain.com\n- MB_PRESETS=id,native,sensible\n- DISCORD_TRANSFORMS=musicbrainz\n"})})]}),(0,r.jsxs)(o.A,{value:"file",label:"File",children:[(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 // sensible 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 your ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord",children:"Discord"})," ",(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="discord.json"',children:'[\n { \n "name": "MS",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n }\n ]\n }\n }\n }\n]\n'})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"AIO",children:[(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 // sensible defaults\n "releaseStatusPriority": ["official"],\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native",\n "searchOrder": ["isrc","basic", "artist"]\n }\n }\n ],\n "sources": [\n { \n "name": "MS",\n "type": "discord",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n }\n ]\n }\n }\n }\n ]\n}\n'})})]})]})]})]})}function m(e={}){let{wrapper:n}={...(0,a.R)(),...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.")}}}]); \ No newline at end of file diff --git a/assets/js/e6ac3f64.b17508a6.js b/assets/js/e6ac3f64.b17508a6.js new file mode 100644 index 00000000..3541690e --- /dev/null +++ b/assets/js/e6ac3f64.b17508a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1184"],{265(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>m,frontMatter:()=>l,contentTitle:()=>c,toc:()=>h,assets:()=>d});var s=JSON.parse('{"id":"configuration/transforms/musicbrainz","title":"Musicbrainz Stage","description":"Enhancing Scrobbles with Musicbrainz","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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/musicbrainz.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Musicbrainz Stage","description":"Enhancing Scrobbles with Musicbrainz","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(4848),a=i(8453),t=i(8194),o=i(698);let l={title:"Musicbrainz Stage",description:"Enhancing Scrobbles with Musicbrainz",toc_min_heading_level:2,toc_max_heading_level:5},c,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:"Caching",id:"caching",level:3},{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},{value:"Use Metadata for Discord Album Art",id:"use-metadata-for-discord-album-art",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.R)(),...e.components},{Details:i,DetailsAdmo:s}=n;return i||f("Details",!0),s||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)(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:"/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 "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:"/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-modification",children:[(0,r.jsx)(n.code,{children:"when"})," condition"]}),":"]}),"\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 // ...\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)(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 "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-and-hooks",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:"/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 # 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)(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."]}),"\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)(i,{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)(i,{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)(i,{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)(i,{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)(i,{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)(i,{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.A,{groupId:"searchArtistMethod",queryString:!0,children:[(0,r.jsxs)(o.A,{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 // will only search using title/album + native extracted artists\n "searchOrder": ["artist"],\n "searchArtistMethod": "native"\n }\n'})})]}),(0,r.jsxs)(o.A,{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 // will only search using title/album + naive extracted artists\n "searchOrder": ["artist"],\n "searchArtistMethod": "naive"\n }\n'})})]})]})]}),"\n",(0,r.jsxs)(i,{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-attributes",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)(i,{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)(i,{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:"caching",children:"Caching"}),"\n",(0,r.jsxs)(n.p,{children:["You ",(0,r.jsx)(n.strong,{children:"should"})," setup ",(0,r.jsx)(n.a,{href:"/configuration/transforms#caching",children:"metadata caching"})," to reduce API calls, improve transform performance, and reduce memory usage when using this stage."]}),"\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)(i,{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-source",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.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)(s,{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-and-hooks",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:"#rules-and-hooks",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 "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)(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/sources/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:"/configuration/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 "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/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)(i,{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'})})]}),"\n",(0,r.jsx)(n.h3,{id:"use-metadata-for-discord-album-art",children:"Use Metadata for Discord Album Art"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord",children:"Discord"})," Client can fetch album art images from ",(0,r.jsx)(n.a,{href:"http://coverartarchive.org/",children:"Cover Art Archive"})," if the Scrobble data contains a Release MBID. Use the Musicbrainz Stage on the ",(0,r.jsx)(n.code,{children:"preCompare"})," hook for your Discord client so that missing Musicbrainz IDs are populated for this functionality."]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsxs)(t.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(o.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(n.p,{children:["Using the ",(0,r.jsx)(n.a,{href:"#env-configuration",children:"ENV Configuration"})," from above, add these fields to your docker compose ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"- MB_CONTACT=contact@mydomain.com\n- MB_PRESETS=id,native,sensible\n- DISCORD_TRANSFORMS=musicbrainz\n"})})]}),(0,r.jsxs)(o.A,{value:"file",label:"File",children:[(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 // sensible 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 your ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord",children:"Discord"})," ",(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="discord.json"',children:'[\n { \n "name": "MS",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n }\n ]\n }\n }\n }\n]\n'})})]}),(0,r.jsxs)(o.A,{value:"aio",label:"AIO",children:[(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 // sensible defaults\n "releaseStatusPriority": ["official"],\n "releaseGroupPrimaryTypePriority": ["album", "single", "ep"],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native",\n "searchOrder": ["isrc","basic", "artist"]\n }\n }\n ],\n "sources": [\n { \n "name": "MS",\n "type": "discord",\n "data": { /* ... */},\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n }\n ]\n }\n }\n }\n ]\n}\n'})})]})]})]})]})}function m(e={}){let{wrapper:n}={...(0,a.R)(),...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.")}}}]); \ No newline at end of file diff --git a/assets/js/e7a53bbd.caba3573.js b/assets/js/e7a53bbd.caba3573.js deleted file mode 100644 index 34c56981..00000000 --- a/assets/js/e7a53bbd.caba3573.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1353"],{751(n,e,i){i.r(e),i.d(e,{metadata:()=>s,default:()=>v,frontMatter:()=>x,contentTitle:()=>y,toc:()=>j,assets:()=>g});var s=JSON.parse('{"id":"configuration/kitchensink","title":"Kitchen Sink","description":"Kitchen Sink Examples","source":"@site/docs/configuration/kitchensink.mdx","sourceDirName":"configuration","slug":"/configuration/kitchensink","permalink":"/multi-scrobbler/configuration/kitchensink","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/kitchensink.mdx?plain=1","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"Kitchen Sink","description":"Kitchen Sink Examples"},"sidebar":"tutorialSidebar","previous":{"title":"Duplicate Scrobble Guidance","permalink":"/multi-scrobbler/configuration/duplicates"},"next":{"title":"Development","permalink":"/multi-scrobbler/category/development"}}'),r=i(4848),t=i(8453),o=i(8194),a=i(698);function l(n){let e={a:"a",p:"p",strong:"strong",...(0,t.R)(),...n.components},{DetailsAdmo:i}=e;return i||function(n,e){throw Error("Expected "+(e?"component":"object")+" `"+n+"` to be defined: you likely forgot to import, pass, or provide it.")}("DetailsAdmo",!0),(0,r.jsxs)(i,{type:"important",summary:"ENV Config Not Possible",children:[(0,r.jsxs)(e.p,{children:["In this usescase there is ",(0,r.jsx)(e.strong,{children:"more than one of the same type of Source/Client."})]}),(0,r.jsxs)(e.p,{children:["This means only ",(0,r.jsx)(e.strong,{children:"File"})," or ",(0,r.jsx)(e.strong,{children:"AIO"})," ",(0,r.jsx)(e.a,{href:"/configuration#configuration-types",children:"configuration types"})," are possible because ",(0,r.jsx)(e.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV"})," configuration only supports one Source/Client per type."]})]})}function c(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(l,{...n})}):l(n)}function d(n){let e={a:"a",code:"code",p:"p",pre:"pre",...(0,t.R)(),...n.components};return(0,r.jsxs)(o.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(a.A,{value:"file",label:"File",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=file#configuration-types",children:"File Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/jellyin.json"',children:'[\n {\n "id": "fredJf",\n "name": "Freds Jellyfin",\n "clients": ["fredLFM"],\n "data": {\n "url": "https://jellyfin.fred.com",\n "user": "Fred",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n },\n {\n "id": "maryJf",\n "name": "Marys Jellyfin",\n "clients": ["maryLFM"],\n "data": {\n "url": "https://jellyfin.mary.com",\n "user": "Mary",\n "apiKey": "26fe9c5dc6374542adc4f4d5e8352838"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/plex.json"',children:'[\n {\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "clients": ["foxxKoi"],\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "id": "maryLFM",\n "name": "Marys Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "maryApiKey",\n "secret": "marySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "id": "fredLFM",\n "name": "Freds Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "fredApiKey",\n "secret": "fredSecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/koito.json"',children:'[\n {\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n]\n'})})]}),(0,r.jsxs)(a.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\n "sources": [\n {\n "type": "jellyfin",\n "id": "fredJf",\n "name": "Freds Jellyfin",\n "clients": [\n "fredLFM"\n ],\n "data": {\n "url": "https://jellyfin.fred.com",\n "user": "Fred",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n },\n {\n "type": "jellyfin",\n "id": "maryJf",\n "name": "Marys Jellyfin",\n "clients": [\n "maryLFM"\n ],\n "data": {\n "url": "https://jellyfin.mary.com",\n "user": "Mary",\n "apiKey": "26fe9c5dc6374542adc4f4d5e8352838"\n }\n },\n {\n "type": "plex",\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "clients": [\n "foxxKoi"\n ],\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400",\n "usersallow": [\n "foxx"\n ]\n }\n }\n ],\n "clients": [\n {\n "type": "lastfm",\n "id": "maryLFM",\n "name": "Marys Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "maryApiKey",\n "secret": "marySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "type": "lastfm",\n "id": "fredLFM",\n "name": "Freds Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "fredApiKey",\n "secret": "fredSecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "type": "koito",\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n ]\n}\n'})})]})]})}function f(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(d,{...n})}):d(n)}function u(n){let e={a:"a",code:"code",p:"p",pre:"pre",...(0,t.R)(),...n.components};return(0,r.jsxs)(o.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(a.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-yaml",metastring:'title="compose.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 # spotify\n - SPOTIFY_ID=foxxSpotify\n - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs\n - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43\n - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback\n\n # navidrome listenbrainz endpoint\n - LZE_ID=myLzNavidrome\n - LZE_TOKEN=myToken\n\n # plex\n - PLEX_ID=foxxPlex\n - PLEX_URL=192.168.0.233:32400\n - PLEX_TOKEN=JtRnwQWD__XMJF8sT3jc\n - PLEX_USERS_ALLOW=foxx\n - PLEX_LIBRARIES_ALLOW=oldies\n\n # lastfm\n - LASTFM_ID=myLFM\n - LASTFM_API_KEY=myApiKey\n - LASTFM_SECRET=mySecret\n - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback\n\n # koito\n - KOITO_ID=foxxKoi\n - KOITO_TOKEN=029b081ba-9156-4pe7-88e5-3be671f5ea2b\n - KOITO_USER=admin\n - KOITO_URL=http://192.168.0.100:4110\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]}),(0,r.jsxs)(a.A,{value:"file",label:"File",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=file#configuration-types",children:"File Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/spotify.json"',children:'[\n {\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/endpointlz.json"',children:'[\n {\n "id": "myLzNavidrome",\n "name": "LZ for Navidrome",\n "data": {\n "token": "myToken"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/plex.json"',children:'[\n {\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400",\n "usersallow": ["foxx"],\n "librariesAllow": ["oldies"],\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/koito.json"',children:'[\n {\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n]\n'})})]}),(0,r.jsxs)(a.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\n "sources": [\n {\n "type": "spotify",\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n },\n {\n "type": "endpointlz",\n "name": "LZ for Navidrome",\n "id": "myLzNavidrome",\n "data": {\n "token": "myToken"\n }\n },\n {\n "type": "plex",\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400",\n "usersallow": ["foxx"],\n "librariesAllow": ["oldies"]\n }\n }\n ],\n "clients": [\n {\n "type": "lastfm",\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "type": "koito",\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n ]\n}\n'})})]})]})}function m(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(u,{...n})}):u(n)}function h(n){let e={a:"a",code:"code",p:"p",pre:"pre",...(0,t.R)(),...n.components};return(0,r.jsxs)(o.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(a.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-yaml",metastring:'title="compose.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\n # required setup for musicbrainz\n - MB_CONTACT=contact@mydomain.com # a real email\n # searches with sensible release sorting with the searchOrder\n # isrc => basic => artist (native mode)\n - MB_PRESETS=default,sensible,native\n\n # spotify\n - SPOTIFY_ID=foxxSpotify\n - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs\n - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43\n - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback\n\n # navidrome listenbrainz endpoint\n - LZE_ID=myLzNavidrome\n - LZE_TOKEN=myToken\n # applies musicbrainz Stage to preTransform of navidrome source\n - LZE_TRANSFORMS=musicbrainz\n\n # lastfm\n - LASTFM_ID=myLFM\n - LASTFM_API_KEY=myApiKey\n - LASTFM_SECRET=mySecret\n - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]}),(0,r.jsxs)(a.A,{value:"file",label:"File",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=file#configuration-types",children:"File Config"})]}),(0,r.jsxs)(e.p,{children:["For non-ENV config, ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz/#api-setup",children:"Musicbrainz Transformer"})," must be setup using the ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})," ",(0,r.jsx)(e.code,{children:"config.json"})," file. This configuration uses the ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz/#sensible-default",children:"sensible defaults"})," in the ",(0,r.jsx)(e.code,{children:"defaults"})," property. This is a suggestion and can be removed if not desired."]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\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": [\n "album",\n "single",\n "ep"\n ],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native",\n "searchOrder": [\n "isrc",\n "basic",\n "artist"\n ]\n }\n }\n ]\n}\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/spotify.json"',children:'[\n {\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/endpointlz.json"',children:'[\n {\n "id": "myLzNavidrome",\n "name": "LZ for Navidrome",\n "data": {\n "token": "myToken"\n },\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})})]}),(0,r.jsxs)(a.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})]}),(0,r.jsxs)(e.p,{children:["This configuration uses the ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz/#sensible-default",children:"sensible defaults"})," in the ",(0,r.jsx)(e.code,{children:"defaults"})," property. This is a suggestion and can be removed if not desired."]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\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": [\n "album",\n "single",\n "ep"\n ],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native",\n "searchOrder": [\n "isrc",\n "basic",\n "artist"\n ]\n }\n }\n ],\n "sources": [\n {\n "type": "spotify",\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n },\n {\n "type": "endpointlz",\n "name": "LZ for Navidrome",\n "id": "myLzNavidrome",\n "data": {\n "token": "myToken"\n },\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n ],\n "clients": [\n {\n "type": "lastfm",\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n ]\n}\n'})})]})]})}function p(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(h,{...n})}):h(n)}let x={sidebar_position:5,title:"Kitchen Sink",description:"Kitchen Sink Examples"},y,g={},j=[{value:"What's This?",id:"whats-this",level:2},{value:"Examples",id:"examples",level:2},{value:"Multiple Sources to Multiple Clients",id:"multi-sources-clients",level:3},{value:"Scrobble for Multiple People to Multiple Clients",id:"multi-persons-services",level:3},{value:"Use Musicbrainz to Fix Scrobbles from Navidrome",id:"use-musicbrainz-to-fix-scrobbles-from-navidrome",level:3}];function b(n){let e={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...n.components},{Details:i}=e;return i||function(n,e){throw Error("Expected "+(e?"component":"object")+" `"+n+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h2,{id:"whats-this",children:"What's This?"}),"\n",(0,r.jsxs)(e.p,{children:["On this page you find contrived, complex usecases for multi-scrobbler that provide examples of equivalent ",(0,r.jsx)(e.a,{href:"/configuration#configuration-types",children:"configuration types"})," to fulfill that usecase."]}),"\n",(0,r.jsx)(e.p,{children:"These example are useful for:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"getting an idea of what you can do with Multi-scrobbler"}),"\n",(0,r.jsx)(e.li,{children:"using these examples as a starting point for your own configuration"}),"\n",(0,r.jsxs)(e.li,{children:["providing an example of the same configuration across different ",(0,r.jsx)(e.a,{href:"/configuration#configuration-types",children:"configuration types"})]}),"\n"]}),"\n",(0,r.jsx)(e.admonition,{type:"tip",children:(0,r.jsxs)(e.p,{children:["More common, straightforward scenarios can be found in the ",(0,r.jsx)(e.a,{href:"/quickstart",children:(0,r.jsx)(e.strong,{children:"quickstart"})})," guide."]})}),"\n",(0,r.jsx)(e.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(e.h3,{id:"multi-sources-clients",children:"Multiple Sources to Multiple Clients"}),"\n",(0,r.jsx)(e.p,{children:"You are the only user of Multi-scrobbler. You have many Sources you listen to and want to scrobble them to multiple services."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble from..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/sources/spotify",children:"Spotify"})," account"]}),"\n",(0,r.jsxs)(e.li,{children:["A Navidrome instance that you want to use with the built-in ",(0,r.jsx)(e.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"listenbrainz"})," scrobble function"]}),"\n",(0,r.jsxs)(e.li,{children:["A shared ",(0,r.jsx)(e.a,{href:"/configuration/sources/plex",children:"Plex"})," instance that you want to scrobble only from a specific library named ",(0,r.jsx)(e.code,{children:"oldies"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble to..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Your decades-old ",(0,r.jsx)(e.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})," account"]}),"\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/clients/koito",children:"Koito"})," server for backup"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Configuration"}),(0,r.jsx)(m,{})]}),"\n",(0,r.jsx)(e.h3,{id:"multi-persons-services",children:"Scrobble for Multiple People to Multiple Clients"}),"\n",(0,r.jsx)(c,{}),"\n",(0,r.jsx)(e.p,{children:"You want to scrobble plays for yourself (Foxx), Fred, and Mary:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["The three of you want to ",(0,r.jsx)(e.strong,{children:"scrobble from..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Fred and Mary each have their own ",(0,r.jsx)(e.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin servers"})]}),"\n",(0,r.jsxs)(e.li,{children:["You have a ",(0,r.jsx)(e.a,{href:"/configuration/sources/plex",children:"Plex"})," server"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["The three of you want to ",(0,r.jsx)(e.strong,{children:"scrobble to..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Fred and Mary each have their own ",(0,r.jsx)(e.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})," accounts"]}),"\n",(0,r.jsxs)(e.li,{children:["You have a ",(0,r.jsx)(e.a,{href:"/configuration/clients/koito",children:"Koito"})," server"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Configuration"}),(0,r.jsx)(f,{})]}),"\n",(0,r.jsx)(e.h3,{id:"use-musicbrainz-to-fix-scrobbles-from-navidrome",children:"Use Musicbrainz to Fix Scrobbles from Navidrome"}),"\n",(0,r.jsx)(e.p,{children:"You have multiple Sources of music but your personal, on-filesystem music collection is not well organized."}),"\n",(0,r.jsxs)(e.p,{children:["You want to use the ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz Transformer"})," to fix any scrobbles that use Navidrome, where your personal collection is located, so that the scrobble artists/album/title are all standardized."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble from..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/sources/spotify",children:"Spotify"})," account"]}),"\n",(0,r.jsxs)(e.li,{children:["A Navidrome instance that you want to use with the built-in ",(0,r.jsx)(e.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"listenbrainz"})," scrobble function","\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Plays from this Source should be fixed by Musicbrainz before going to your scrobble Clients"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble to..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})," account"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Configuration"}),(0,r.jsx)(p,{})]})]})}function v(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(b,{...n})}):b(n)}}}]); \ No newline at end of file diff --git a/assets/js/e7a53bbd.e67b3e0e.js b/assets/js/e7a53bbd.e67b3e0e.js new file mode 100644 index 00000000..b48b5e93 --- /dev/null +++ b/assets/js/e7a53bbd.e67b3e0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1353"],{751(n,e,i){i.r(e),i.d(e,{metadata:()=>s,default:()=>v,frontMatter:()=>x,contentTitle:()=>y,toc:()=>j,assets:()=>g});var s=JSON.parse('{"id":"configuration/kitchensink","title":"Kitchen Sink","description":"Kitchen Sink Examples","source":"@site/docs/configuration/kitchensink.mdx","sourceDirName":"configuration","slug":"/configuration/kitchensink","permalink":"/multi-scrobbler/configuration/kitchensink","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/kitchensink.mdx?plain=1","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"Kitchen Sink","description":"Kitchen Sink Examples"},"sidebar":"tutorialSidebar","previous":{"title":"Duplicate Scrobble Guidance","permalink":"/multi-scrobbler/configuration/duplicates"},"next":{"title":"Development","permalink":"/multi-scrobbler/category/development"}}'),r=i(4848),t=i(8453),o=i(8194),a=i(698);function l(n){let e={a:"a",p:"p",strong:"strong",...(0,t.R)(),...n.components},{DetailsAdmo:i}=e;return i||function(n,e){throw Error("Expected "+(e?"component":"object")+" `"+n+"` to be defined: you likely forgot to import, pass, or provide it.")}("DetailsAdmo",!0),(0,r.jsxs)(i,{type:"important",summary:"ENV Config Not Possible",children:[(0,r.jsxs)(e.p,{children:["In this usescase there is ",(0,r.jsx)(e.strong,{children:"more than one of the same type of Source/Client."})]}),(0,r.jsxs)(e.p,{children:["This means only ",(0,r.jsx)(e.strong,{children:"File"})," or ",(0,r.jsx)(e.strong,{children:"AIO"})," ",(0,r.jsx)(e.a,{href:"/configuration#configuration-types",children:"configuration types"})," are possible because ",(0,r.jsx)(e.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV"})," configuration only supports one Source/Client per type."]})]})}function c(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(l,{...n})}):l(n)}function d(n){let e={a:"a",code:"code",p:"p",pre:"pre",...(0,t.R)(),...n.components};return(0,r.jsxs)(o.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(a.A,{value:"file",label:"File",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=file#configuration-types",children:"File Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/jellyin.json"',children:'[\n {\n "id": "fredJf",\n "name": "Freds Jellyfin",\n "clients": ["fredLFM"],\n "data": {\n "url": "https://jellyfin.fred.com",\n "user": "Fred",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n },\n {\n "id": "maryJf",\n "name": "Marys Jellyfin",\n "clients": ["maryLFM"],\n "data": {\n "url": "https://jellyfin.mary.com",\n "user": "Mary",\n "apiKey": "26fe9c5dc6374542adc4f4d5e8352838"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/plex.json"',children:'[\n {\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "clients": ["foxxKoi"],\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "id": "maryLFM",\n "name": "Marys Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "maryApiKey",\n "secret": "marySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "id": "fredLFM",\n "name": "Freds Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "fredApiKey",\n "secret": "fredSecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/koito.json"',children:'[\n {\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n]\n'})})]}),(0,r.jsxs)(a.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\n "sources": [\n {\n "type": "jellyfin",\n "id": "fredJf",\n "name": "Freds Jellyfin",\n "clients": [\n "fredLFM"\n ],\n "data": {\n "url": "https://jellyfin.fred.com",\n "user": "Fred",\n "apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"\n }\n },\n {\n "type": "jellyfin",\n "id": "maryJf",\n "name": "Marys Jellyfin",\n "clients": [\n "maryLFM"\n ],\n "data": {\n "url": "https://jellyfin.mary.com",\n "user": "Mary",\n "apiKey": "26fe9c5dc6374542adc4f4d5e8352838"\n }\n },\n {\n "type": "plex",\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "clients": [\n "foxxKoi"\n ],\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400",\n "usersallow": [\n "foxx"\n ]\n }\n }\n ],\n "clients": [\n {\n "type": "lastfm",\n "id": "maryLFM",\n "name": "Marys Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "maryApiKey",\n "secret": "marySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "type": "lastfm",\n "id": "fredLFM",\n "name": "Freds Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "fredApiKey",\n "secret": "fredSecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "type": "koito",\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n ]\n}\n'})})]})]})}function f(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(d,{...n})}):d(n)}function u(n){let e={a:"a",code:"code",p:"p",pre:"pre",...(0,t.R)(),...n.components};return(0,r.jsxs)(o.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(a.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-yaml",metastring:'title="compose.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 # spotify\n - SPOTIFY_ID=foxxSpotify\n - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs\n - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43\n - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback\n\n # navidrome listenbrainz endpoint\n - LZE_ID=myLzNavidrome\n - LZE_TOKEN=myToken\n\n # plex\n - PLEX_ID=foxxPlex\n - PLEX_URL=192.168.0.233:32400\n - PLEX_TOKEN=JtRnwQWD__XMJF8sT3jc\n - PLEX_USERS_ALLOW=foxx\n - PLEX_LIBRARIES_ALLOW=oldies\n\n # lastfm\n - LASTFM_ID=myLFM\n - LASTFM_API_KEY=myApiKey\n - LASTFM_SECRET=mySecret\n - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback\n\n # koito\n - KOITO_ID=foxxKoi\n - KOITO_TOKEN=029b081ba-9156-4pe7-88e5-3be671f5ea2b\n - KOITO_USER=admin\n - KOITO_URL=http://192.168.0.100:4110\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]}),(0,r.jsxs)(a.A,{value:"file",label:"File",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=file#configuration-types",children:"File Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/spotify.json"',children:'[\n {\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/endpointlz.json"',children:'[\n {\n "id": "myLzNavidrome",\n "name": "LZ for Navidrome",\n "data": {\n "token": "myToken"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/plex.json"',children:'[\n {\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400",\n "usersallow": ["foxx"],\n "librariesAllow": ["oldies"],\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/koito.json"',children:'[\n {\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n]\n'})})]}),(0,r.jsxs)(a.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\n "sources": [\n {\n "type": "spotify",\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n },\n {\n "type": "endpointlz",\n "name": "LZ for Navidrome",\n "id": "myLzNavidrome",\n "data": {\n "token": "myToken"\n }\n },\n {\n "type": "plex",\n "id": "foxxPlex",\n "name": "Foxx Plex",\n "data": {\n "token": "JtRnwQWD__XMJF8sT3jc",\n "url": "192.168.0.233:32400",\n "usersallow": ["foxx"],\n "librariesAllow": ["oldies"]\n }\n }\n ],\n "clients": [\n {\n "type": "lastfm",\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n },\n {\n "type": "koito",\n "id": "foxxKoi",\n "name": "Foxx Koito",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110"\n }\n }\n ]\n}\n'})})]})]})}function m(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(u,{...n})}):u(n)}function h(n){let e={a:"a",code:"code",p:"p",pre:"pre",...(0,t.R)(),...n.components};return(0,r.jsxs)(o.A,{groupId:"configType",queryString:!0,children:[(0,r.jsxs)(a.A,{value:"env",label:"ENV",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=env#configuration-types",children:"ENV Config"})]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-yaml",metastring:'title="compose.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\n # required setup for musicbrainz\n - MB_CONTACT=contact@mydomain.com # a real email\n # searches with sensible release sorting with the searchOrder\n # isrc => basic => artist (native mode)\n - MB_PRESETS=default,sensible,native\n\n # spotify\n - SPOTIFY_ID=foxxSpotify\n - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs\n - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43\n - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback\n\n # navidrome listenbrainz endpoint\n - LZE_ID=myLzNavidrome\n - LZE_TOKEN=myToken\n # applies musicbrainz Stage to preTransform of navidrome source\n - LZE_TRANSFORMS=musicbrainz\n\n # lastfm\n - LASTFM_ID=myLFM\n - LASTFM_API_KEY=myApiKey\n - LASTFM_SECRET=mySecret\n - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback\n\n volumes:\n - "./config:/config"\n ports:\n - "9078:9078"\n restart: unless-stopped\n'})})]}),(0,r.jsxs)(a.A,{value:"file",label:"File",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=file#configuration-types",children:"File Config"})]}),(0,r.jsxs)(e.p,{children:["For non-ENV config, ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz/#api-setup",children:"Musicbrainz Transformer"})," must be setup using the ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})," ",(0,r.jsx)(e.code,{children:"config.json"})," file. This configuration uses the ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz/#sensible-default",children:"sensible defaults"})," in the ",(0,r.jsx)(e.code,{children:"defaults"})," property. This is a suggestion and can be removed if not desired."]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\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": [\n "album",\n "single",\n "ep"\n ],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native",\n "searchOrder": [\n "isrc",\n "basic",\n "artist"\n ]\n }\n }\n ]\n}\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/spotify.json"',children:'[\n {\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/endpointlz.json"',children:'[\n {\n "id": "myLzNavidrome",\n "name": "LZ for Navidrome",\n "data": {\n "token": "myToken"\n },\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n]\n'})}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/lastfm.json"',children:'[\n {\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n]\n'})})]}),(0,r.jsxs)(a.A,{value:"aio",label:"AIO",children:[(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/configuration/?configType=aio#configuration-types",children:"AIO Config"})]}),(0,r.jsxs)(e.p,{children:["This configuration uses the ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz/#sensible-default",children:"sensible defaults"})," in the ",(0,r.jsx)(e.code,{children:"defaults"})," property. This is a suggestion and can be removed if not desired."]}),(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json5",metastring:'title="CONFIG_DIR/config.json"',children:'{\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": [\n "album",\n "single",\n "ep"\n ],\n "releaseCountryPriority": ["XW"],\n "searchArtistMethod": "native",\n "searchOrder": [\n "isrc",\n "basic",\n "artist"\n ]\n }\n }\n ],\n "sources": [\n {\n "type": "spotify",\n "id": "foxxSpotify",\n "name": "Foxx Spotify",\n "data": {\n "clientId": "a89cba1569901a0671d5a9875fed4be1",\n "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",\n "redirectUri": "http://localhost:9078/callback",\n "interval": 60\n }\n },\n {\n "type": "endpointlz",\n "name": "LZ for Navidrome",\n "id": "myLzNavidrome",\n "data": {\n "token": "myToken"\n },\n "options": {\n "playTransform": {\n "preCompare": [\n {\n "type": "musicbrainz",\n "name": "MyMB"\n }\n ]\n }\n }\n }\n ],\n "clients": [\n {\n "type": "lastfm",\n "id": "myLFM",\n "name": "Old Lastfm",\n "configureAs": "client",\n "data": {\n "apiKey": "myApiKey",\n "secret": "mySecret",\n "redirectUri": "http://localhost:9078/lastfm/callback"\n }\n }\n ]\n}\n'})})]})]})}function p(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(h,{...n})}):h(n)}let x={sidebar_position:5,title:"Kitchen Sink",description:"Kitchen Sink Examples"},y,g={},j=[{value:"What's This?",id:"whats-this",level:2},{value:"Examples",id:"examples",level:2},{value:"Multiple Sources to Multiple Clients",id:"multi-sources-clients",level:3},{value:"Scrobble for Multiple People to Multiple Clients",id:"multi-persons-services",level:3},{value:"Use Musicbrainz to Fix Scrobbles from Navidrome",id:"use-musicbrainz-to-fix-scrobbles-from-navidrome",level:3}];function b(n){let e={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...n.components},{Details:i}=e;return i||function(n,e){throw Error("Expected "+(e?"component":"object")+" `"+n+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h2,{id:"whats-this",children:"What's This?"}),"\n",(0,r.jsxs)(e.p,{children:["On this page you find contrived, complex usecases for multi-scrobbler that provide examples of equivalent ",(0,r.jsx)(e.a,{href:"/configuration#configuration-types",children:"configuration types"})," to fulfill that usecase."]}),"\n",(0,r.jsx)(e.p,{children:"These example are useful for:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"getting an idea of what you can do with Multi-scrobbler"}),"\n",(0,r.jsx)(e.li,{children:"using these examples as a starting point for your own configuration"}),"\n",(0,r.jsxs)(e.li,{children:["providing an example of the same configuration across different ",(0,r.jsx)(e.a,{href:"/configuration#configuration-types",children:"configuration types"})]}),"\n"]}),"\n",(0,r.jsx)(e.admonition,{type:"tip",children:(0,r.jsxs)(e.p,{children:["More common, straightforward scenarios can be found in the ",(0,r.jsx)(e.a,{href:"/quickstart",children:(0,r.jsx)(e.strong,{children:"quickstart"})})," guide."]})}),"\n",(0,r.jsx)(e.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(e.h3,{id:"multi-sources-clients",children:"Multiple Sources to Multiple Clients"}),"\n",(0,r.jsx)(e.p,{children:"You are the only user of Multi-scrobbler. You have many Sources you listen to and want to scrobble them to multiple services."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble from..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/sources/spotify",children:"Spotify"})," account"]}),"\n",(0,r.jsxs)(e.li,{children:["A Navidrome instance that you want to use with the built-in ",(0,r.jsx)(e.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"listenbrainz"})," scrobble function"]}),"\n",(0,r.jsxs)(e.li,{children:["A shared ",(0,r.jsx)(e.a,{href:"/configuration/sources/plex",children:"Plex"})," instance that you want to scrobble only from a specific library named ",(0,r.jsx)(e.code,{children:"oldies"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble to..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Your decades-old ",(0,r.jsx)(e.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})," account"]}),"\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/clients/koito",children:"Koito"})," server for backup"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Configuration"}),(0,r.jsx)(m,{})]}),"\n",(0,r.jsx)(e.h3,{id:"multi-persons-services",children:"Scrobble for Multiple People to Multiple Clients"}),"\n",(0,r.jsx)(c,{}),"\n",(0,r.jsx)(e.p,{children:"You want to scrobble plays for yourself (Foxx), Fred, and Mary:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["The three of you want to ",(0,r.jsx)(e.strong,{children:"scrobble from..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Fred and Mary each have their own ",(0,r.jsx)(e.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin servers"})]}),"\n",(0,r.jsxs)(e.li,{children:["You have a ",(0,r.jsx)(e.a,{href:"/configuration/sources/plex",children:"Plex"})," server"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["The three of you want to ",(0,r.jsx)(e.strong,{children:"scrobble to..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Fred and Mary each have their own ",(0,r.jsx)(e.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})," accounts"]}),"\n",(0,r.jsxs)(e.li,{children:["You have a ",(0,r.jsx)(e.a,{href:"/configuration/clients/koito",children:"Koito"})," server"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Configuration"}),(0,r.jsx)(f,{})]}),"\n",(0,r.jsx)(e.h3,{id:"use-musicbrainz-to-fix-scrobbles-from-navidrome",children:"Use Musicbrainz to Fix Scrobbles from Navidrome"}),"\n",(0,r.jsx)(e.p,{children:"You have multiple Sources of music but your personal, on-filesystem music collection is not well organized."}),"\n",(0,r.jsxs)(e.p,{children:["You want to use the ",(0,r.jsx)(e.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz Transformer"})," to fix any scrobbles that use Navidrome, where your personal collection is located, so that the scrobble artists/album/title are all standardized."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble from..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/sources/spotify",children:"Spotify"})," account"]}),"\n",(0,r.jsxs)(e.li,{children:["A Navidrome instance that you want to use with the built-in ",(0,r.jsx)(e.a,{href:"/configuration/sources/listenbrainz-endpoint",children:"listenbrainz"})," scrobble function","\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Plays from this Source should be fixed by Musicbrainz before going to your scrobble Clients"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["You want to ",(0,r.jsx)(e.strong,{children:"scrobble to..."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["A ",(0,r.jsx)(e.a,{href:"/configuration/clients/lastfm",children:"Last.fm"})," account"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i,{children:[(0,r.jsx)("summary",{children:"Configuration"}),(0,r.jsx)(p,{})]})]})}function v(n={}){let{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(b,{...n})}):b(n)}}}]); \ No newline at end of file diff --git a/assets/js/e82a470f.19ce1061.js b/assets/js/e82a470f.19ce1061.js deleted file mode 100644 index 4f5e7986..00000000 --- a/assets/js/e82a470f.19ce1061.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1703"],{3954(e,n,s){s.d(n,{Ay:()=>l,RM:()=>i});var t=s(4848),r=s(8453),o=s(3230);let i=[];function c(e){let n={a:"a",em:"em",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Your ",(0,t.jsx)(n.a,{href:"https://atmosphereaccount.com",children:(0,t.jsx)(n.strong,{children:"Atmosphere Account"})})," consists of social data (it's just JSON) stored in a personal ",(0,t.jsx)(n.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," on a ",(0,t.jsx)(n.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", all of which is standardized under the ",(0,t.jsx)(n.a,{href:"https://atproto.com",children:(0,t.jsx)(n.strong,{children:"AT Protocol"})}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by ",(0,t.jsx)(n.em,{children:"indpendent"})," entities so your data and experience not locked behind a walled garden."]}),"\n",(0,t.jsxs)(n.p,{children:["Although each layer can be implemented separately (you can self-host everything!), it is normally a ",(0,t.jsx)(n.em,{children:"simple"})," process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a ",(0,t.jsx)(n.a,{href:"https://bsky.social/about",children:"Bluesky"}),", but there are other ",(0,t.jsx)(n.a,{href:"https://atmosphereaccount.com/explore",children:"public account providers"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"When Multi-Scrobbler uses the AT Protocol..."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:['multi-scrobbler "scrobbles" (writes) your plays to your repository',"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["in a JSON data structure which includes ",(0,t.jsxs)(n.a,{href:"https://atproto.com/specs/lexicon",children:[e.name,"'s data type and structure"]})]}),"\n",(0,t.jsxs)(n.li,{children:["at a ",(0,t.jsxs)(n.a,{href:"https://atproto.com/guides/glossary#collection",children:["known location for ",e.name,"'s data"]})," (",(0,t.jsx)(o.A,{children:e.lexicon}),"), in a list that is appended to as you continue to scrobble"]}),"\n"]}),"\n"]}),"\n",(0,t.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 their app"]}),"\n"]})]})}function l(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},4144(e,n,s){s.r(n),s.d(n,{metadata:()=>t,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>p,assets:()=>u});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/rocksky.mdx?plain=1","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"}}'),r=s(4848),o=s(8453),i=s(3954),c=s(8165);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"ROCKSKY_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_KEY"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["API Key generated from ",(0,r.jsx)(n.a,{href:"https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0",children:"API Applications"})," in Rocksky for your account"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_TOKEN"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["Access Token generated from ",(0,r.jsx)(n.a,{href:"https://rocksky.app/access-tokens",children:"https://rocksky.app/access-tokens"})," in Rocksky for your account"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_HANDLE"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The ",(0,r.jsx)(n.strong,{children:"fully-qualified"})," handle for your ATPRoto/Bluesky account"]})]})]})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}let d={title:"Rocksky",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},p=[...i.RM,{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Handle",id:"handle",level:3}];function x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Config:s,Details:t,DetailsAdmo:l}=n;return s||m("Config",!0),t||m("Details",!0),l||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,r.jsxs)(n.p,{children:["To monitor and re-scrobble activity ",(0,r.jsx)(n.strong,{children:"from"})," Rocksky create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky (Source)"})]})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://rocksky.app/",children:(0,r.jsx)(n.strong,{children:"Rocksky"})})," is music tracking and discovery platform built on the AT Protocol and your your ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})}),"."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"How does that work?"}),(0,r.jsx)(i.Ay,{name:"Rocksky",lexicon:"app.rocksky"})]}),"\n",(0,r.jsx)(l,{type:"important",summary:"Your Data Is Public",children:(0,r.jsxs)(n.p,{children:["The default Bluesky PDS is ",(0,r.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,r.jsxs)(l,{type:"important",summary:"No Scrobbling Guarantee",children:[(0,r.jsxs)(n.p,{children:["Rocksky ",(0,r.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,r.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,r.jsxs)(n.p,{children:["To do this it ",(0,r.jsx)(n.em,{children:"asynchronously"})," matches your scrobble data against Musicbrainz's and/or Spotify's catalogs, ",(0,r.jsx)(n.em,{children:"after the scrobble has been submitted."})," ",(0,r.jsx)(n.strong,{children:"If the scrobble does not end up matching then it is not persisted."})]}),(0,r.jsxs)(n.p,{children:["If you need your scrobbles to be 100% captured then you should scrobble to an ",(0,r.jsx)(n.em,{children:"additional"})," ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Scrobble Client"}),"."]})]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsxs)(n.p,{children:["You will need an ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})})," to use Rocksky."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Navigate to ",(0,r.jsx)(n.a,{href:"https://rocksky.app/",children:"rocksky.app"})," and sign up/logn using your Atmosphere Account"]}),"\n",(0,r.jsxs)(n.li,{children:["Then, navigate to the ",(0,r.jsx)(n.a,{href:"https://rocksky.app/access-tokens",children:"Access Tokens"})," in the Rocksky settings dropdown, and create a new token"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n.h3,{id:"handle",children:"Handle"}),"\n",(0,r.jsxs)(n.p,{children:["The handle used with multi-scrobbler should be your ",(0,r.jsx)(n.strong,{children:"full"})," ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})})," handle, including TLD."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For regular Bluesky account this will be like: ",(0,r.jsx)(n.code,{children:"alice.bsky.social"})]}),"\n",(0,r.jsxs)(n.li,{children:["For Bluesky accounts that ",(0,r.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,r.jsx)(n.code,{children:"mydomain.com"})]}),"\n",(0,r.jsx)(n.li,{children:"For non-Bluesky users, you probably already know your handle"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["If you do not include a TLD then multi-scrobbler will automatically append ",(0,r.jsx)(n.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,r.jsxs)(l,{type:"warning",summary:"API Applications Deprecated",children:[(0,r.jsx)(n.p,{children:'In < 0.14.1, Multi-Scrobber used Rocksky\'s API Appication "API Key" for communication with a Listenbrainz-compatible API from Rocksky.'}),(0,r.jsxs)(n.p,{children:["Going forward, this should be replaced with the official guidance in the ",(0,r.jsx)(n.a,{href:"#setup",children:"Setup"})," section above: use an ",(0,r.jsx)(n.strong,{children:"Access Token"}),". This uses the native Rocksky API which has more functionality."]}),(0,r.jsx)(n.p,{children:"If your configuration is using either"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["(File/AIO) ",(0,r.jsx)(n.code,{children:"'key': ..."})]}),"\n",(0,r.jsxs)(n.li,{children:["(ENV) ",(0,r.jsx)(n.code,{children:"ROCKSKY_KEY"})]}),"\n"]}),(0,r.jsxs)(n.p,{children:["you should redo the ",(0,r.jsx)(n.a,{href:"#setup",children:"Setup"})," section and modify your configuration to use an Access Token instead."]}),(0,r.jsxs)(n.p,{children:["Keys are now ",(0,r.jsx)(n.strong,{children:"deprecated"})," and functionality for them will be removed in a future version of Multi-Scrobbler."]})]}),"\n",(0,r.jsx)(s,{config:"RockSkyClientConfig",fileContent:c.A,client:!0,ambiguous:!0,name:"rocksky",children:(0,r.jsx)(a,{})})]})}function j(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},3230(e,n,s){s.d(n,{A:()=>r}),s(6540);var t=s(4848);function r(e){return(0,t.jsx)("code",{...e})}},8165(e,n,s){s.d(n,{A:()=>t});let t='[\n {\n "id": "myRockskyClient",\n "name": "FoxxMD Rocksky Client",\n "configureAs": "client",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n },\n {\n "id": "myRockskySource",\n "name": "FoxxMD Rocksky Source",\n "configureAs": "source",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n }\n]'}}]); \ No newline at end of file diff --git a/assets/js/e82a470f.9ee66086.js b/assets/js/e82a470f.9ee66086.js new file mode 100644 index 00000000..1b1cacc5 --- /dev/null +++ b/assets/js/e82a470f.9ee66086.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["1703"],{3954(e,n,s){s.d(n,{Ay:()=>l,RM:()=>i});var t=s(4848),r=s(8453),o=s(3230);let i=[];function c(e){let n={a:"a",em:"em",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Your ",(0,t.jsx)(n.a,{href:"https://atmosphereaccount.com",children:(0,t.jsx)(n.strong,{children:"Atmosphere Account"})})," consists of social data (it's just JSON) stored in a personal ",(0,t.jsx)(n.a,{href:"https://atproto.com/guides/data-repos",children:"repository"})," on a ",(0,t.jsx)(n.a,{href:"https://github.com/Bluesky-social/pds",children:"PDS (Personal Data Server)"}),", all of which is standardized under the ",(0,t.jsx)(n.a,{href:"https://atproto.com",children:(0,t.jsx)(n.strong,{children:"AT Protocol"})}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by ",(0,t.jsx)(n.em,{children:"indpendent"})," entities so your data and experience not locked behind a walled garden."]}),"\n",(0,t.jsxs)(n.p,{children:["Although each layer can be implemented separately (you can self-host everything!), it is normally a ",(0,t.jsx)(n.em,{children:"simple"})," process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a ",(0,t.jsx)(n.a,{href:"https://bsky.social/about",children:"Bluesky"}),", but there are other ",(0,t.jsx)(n.a,{href:"https://atmosphereaccount.com/explore",children:"public account providers"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"When Multi-Scrobbler uses the AT Protocol..."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:['multi-scrobbler "scrobbles" (writes) your plays to your repository',"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["in a JSON data structure which includes ",(0,t.jsxs)(n.a,{href:"https://atproto.com/specs/lexicon",children:[e.name,"'s data type and structure"]})]}),"\n",(0,t.jsxs)(n.li,{children:["at a ",(0,t.jsxs)(n.a,{href:"https://atproto.com/guides/glossary#collection",children:["known location for ",e.name,"'s data"]})," (",(0,t.jsx)(o.A,{children:e.lexicon}),"), in a list that is appended to as you continue to scrobble"]}),"\n"]}),"\n"]}),"\n",(0,t.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 their app"]}),"\n"]})]})}function l(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},4144(e,n,s){s.r(n),s.d(n,{metadata:()=>t,default:()=>j,frontMatter:()=>d,contentTitle:()=>h,toc:()=>p,assets:()=>u});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/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/rocksky.mdx?plain=1","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"}}'),r=s(4848),o=s(8453),i=s(3954),c=s(8165);function l(e){let n={a:"a",code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"ROCKSKY_ID"})]}),(0,r.jsxs)(n.td,{children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_ENABLE"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Should this component be used?"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_KEY"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["API Key generated from ",(0,r.jsx)(n.a,{href:"https://docs.rocksky.app/migrating-from-listenbrainz-to-rocksky-1040189m0",children:"API Applications"})," in Rocksky for your account"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_TOKEN"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["Access Token generated from ",(0,r.jsx)(n.a,{href:"https://rocksky.app/access-tokens",children:"https://rocksky.app/access-tokens"})," in Rocksky for your account"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"ROCKSKY_HANDLE"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The ",(0,r.jsx)(n.strong,{children:"fully-qualified"})," handle for your ATPRoto/Bluesky account"]})]})]})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}let d={title:"Rocksky",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},p=[...i.RM,{value:"Setup",id:"setup",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Handle",id:"handle",level:3}];function x(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Config:s,Details:t,DetailsAdmo:l}=n;return s||m("Config",!0),t||m("Details",!0),l||m("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,r.jsxs)(n.p,{children:["To monitor and re-scrobble activity ",(0,r.jsx)(n.strong,{children:"from"})," Rocksky create a ",(0,r.jsx)(n.a,{href:"/configuration/sources/rocksky-source",children:"Rocksky (Source)"})]})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://rocksky.app/",children:(0,r.jsx)(n.strong,{children:"Rocksky"})})," is music tracking and discovery platform built on the AT Protocol and your your ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})}),"."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"How does that work?"}),(0,r.jsx)(i.Ay,{name:"Rocksky",lexicon:"app.rocksky"})]}),"\n",(0,r.jsx)(l,{type:"important",summary:"Your Data Is Public",children:(0,r.jsxs)(n.p,{children:["The default Bluesky PDS is ",(0,r.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,r.jsxs)(l,{type:"important",summary:"No Scrobbling Guarantee",children:[(0,r.jsxs)(n.p,{children:["Rocksky ",(0,r.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,r.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,r.jsxs)(n.p,{children:["To do this it ",(0,r.jsx)(n.em,{children:"asynchronously"})," matches your scrobble data against Musicbrainz's and/or Spotify's catalogs, ",(0,r.jsx)(n.em,{children:"after the scrobble has been submitted."})," ",(0,r.jsx)(n.strong,{children:"If the scrobble does not end up matching then it is not persisted."})]}),(0,r.jsxs)(n.p,{children:["If you need your scrobbles to be 100% captured then you should scrobble to an ",(0,r.jsx)(n.em,{children:"additional"})," ",(0,r.jsx)(n.a,{href:"/configuration/clients",children:"Scrobble Client"}),"."]})]}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,r.jsxs)(n.p,{children:["You will need an ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})})," to use Rocksky."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Navigate to ",(0,r.jsx)(n.a,{href:"https://rocksky.app/",children:"rocksky.app"})," and sign up/logn using your Atmosphere Account"]}),"\n",(0,r.jsxs)(n.li,{children:["Then, navigate to the ",(0,r.jsx)(n.a,{href:"https://rocksky.app/access-tokens",children:"Access Tokens"})," in the Rocksky settings dropdown, and create a new token"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(n.h3,{id:"handle",children:"Handle"}),"\n",(0,r.jsxs)(n.p,{children:["The handle used with multi-scrobbler should be your ",(0,r.jsx)(n.strong,{children:"full"})," ",(0,r.jsx)(n.a,{href:"https://atmosphereaccount.com/",children:(0,r.jsx)(n.strong,{children:"Atmosphere Account"})})," handle, including TLD."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For regular Bluesky account this will be like: ",(0,r.jsx)(n.code,{children:"alice.bsky.social"})]}),"\n",(0,r.jsxs)(n.li,{children:["For Bluesky accounts that ",(0,r.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,r.jsx)(n.code,{children:"mydomain.com"})]}),"\n",(0,r.jsx)(n.li,{children:"For non-Bluesky users, you probably already know your handle"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["If you do not include a TLD then multi-scrobbler will automatically append ",(0,r.jsx)(n.code,{children:".bsky.social"})," to your handle value."]}),"\n",(0,r.jsxs)(l,{type:"warning",summary:"API Applications Deprecated",children:[(0,r.jsx)(n.p,{children:'In < 0.14.1, Multi-Scrobber used Rocksky\'s API Appication "API Key" for communication with a Listenbrainz-compatible API from Rocksky.'}),(0,r.jsxs)(n.p,{children:["Going forward, this should be replaced with the official guidance in the ",(0,r.jsx)(n.a,{href:"#setup",children:"Setup"})," section above: use an ",(0,r.jsx)(n.strong,{children:"Access Token"}),". This uses the native Rocksky API which has more functionality."]}),(0,r.jsx)(n.p,{children:"If your configuration is using either"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["(File/AIO) ",(0,r.jsx)(n.code,{children:"'key': ..."})]}),"\n",(0,r.jsxs)(n.li,{children:["(ENV) ",(0,r.jsx)(n.code,{children:"ROCKSKY_KEY"})]}),"\n"]}),(0,r.jsxs)(n.p,{children:["you should redo the ",(0,r.jsx)(n.a,{href:"#setup",children:"Setup"})," section and modify your configuration to use an Access Token instead."]}),(0,r.jsxs)(n.p,{children:["Keys are now ",(0,r.jsx)(n.strong,{children:"deprecated"})," and functionality for them will be removed in a future version of Multi-Scrobbler."]})]}),"\n",(0,r.jsx)(s,{config:"RockSkyClientConfig",fileContent:c.A,client:!0,ambiguous:!0,name:"rocksky",children:(0,r.jsx)(a,{})})]})}function j(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(x,{...e})}):x(e)}function m(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},3230(e,n,s){s.d(n,{A:()=>r}),s(6540);var t=s(4848);function r(e){return(0,t.jsx)("code",{...e})}},8165(e,n,s){s.d(n,{A:()=>t});let t='[\n {\n "id": "myRockskyClient",\n "name": "FoxxMD Rocksky Client",\n "configureAs": "client",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n },\n {\n "id": "myRockskySource",\n "name": "FoxxMD Rocksky Source",\n "configureAs": "source",\n "data": {\n "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",\n "handle": "alice.bsky.social"\n }\n }\n]'}}]); \ No newline at end of file diff --git a/assets/js/ea69cd8d.1b69a39c.js b/assets/js/ea69cd8d.1b69a39c.js new file mode 100644 index 00000000..cbf05119 --- /dev/null +++ b/assets/js/ea69cd8d.1b69a39c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8968"],{1980(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>j,frontMatter:()=>h,contentTitle:()=>p,toc:()=>x,assets:()=>u});var s=JSON.parse('{"id":"configuration/clients/discord/discord-app","title":"Discord (App)","description":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","source":"@site/docs/configuration/clients/discord/discord-app.mdx","sourceDirName":"configuration/clients/discord","slug":"/configuration/clients/discord/discord-app","permalink":"/multi-scrobbler/configuration/clients/discord/discord-app","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-app.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Discord (App)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Discord","permalink":"/multi-scrobbler/configuration/clients/discord/"},"next":{"title":"Discord (Headless)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-headless"}}'),r=i(4848),o=i(8453),t=i(8194),c=i(698);let l=[];function d(e){let n={li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{DetailsAdmo: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.")}("DetailsAdmo",!0),(0,r.jsxs)(i,{type:"warning",summary:"Insecure Communication",children:[(0,r.jsxs)(n.p,{children:["This method of exposing Discord IPC is ",(0,r.jsx)(n.strong,{children:"not secure"}),". There is no authentication used for the traffic relayed to/from the opened TCP port."]}),(0,r.jsx)(n.p,{children:"You should only use this method if you trust the network your machine is on. Additionally:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Do"})," use a firewall to limit source (IP) of incoming traffic to this TCP port"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Do not"})," expose this port to the public internet"]}),"\n"]})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}let h={title:"Discord (App)",toc_min_heading_level:2,toc_max_heading_level:5},p,u={},x=[{value:"Required Setup",id:"required-setup",level:2},{value:"Discord Application",id:"discord-application",level:3},{value:"Discord Connection",id:"discord-connection",level:3},{value:"Find IPC Connection",id:"find-ipc-connection",level:4},{value:"Pass IPC to Multi-Scrobbler",id:"pass-ipc-to-multi-scrobbler",level:4},...l,...l,...l,{value:"Optional Setup",id:"optional-setup",level:2},{value:"Artwork",id:"artwork",level:3},{value:"Artwork URL Types",id:"artwork-url-types",level:4},{value:"Configuration",id:"configuration",level:2}];function m(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",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.R)(),...e.components},{Config:s,Details:l,DetailsAdmo:d}=n;return s||f("Config",!0),l||f("Details",!0),d||f("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["This scrobbler uses ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})})," functionality to set your Discord ",(0,r.jsx)(n.a,{href:"https://docs.discord.com/developers/rich-presence/overview",children:"Rich Presence"})," to the music you are currently monitoring with multi-scrobbler."]}),"\n",(0,r.jsx)("img",{src:i(6170).A,height:"127"}),"\n",(0,r.jsxs)(n.p,{children:["This integration uses an ",(0,r.jsx)(n.strong,{children:"existing Discord application"})," to set your Rich Presence."]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Check the ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord",children:"main Discord docs page"})," for a comparison between ",(0,r.jsx)(n.strong,{children:"App"})," and ",(0,r.jsx)(n.strong,{children:"Headless"}),"."]})}),"\n",(0,r.jsx)(n.h2,{id:"required-setup",children:"Required Setup"}),"\n",(0,r.jsx)(n.h3,{id:"discord-application",children:"Discord Application"}),"\n",(0,r.jsxs)(n.p,{children:["You must create a ",(0,r.jsx)(n.a,{href:"https://docs.discord.com/developers/quick-start/overview-of-apps",children:"Discord App"})," in order to use this integration. Creating an App is free and simple."]}),"\n",(0,r.jsxs)(n.p,{children:["Go to the ",(0,r.jsx)(n.a,{href:"https://discord.com/developers/applications",children:"Discord Developer Portal"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'Click on "New Application" and give it a name'}),"\n",(0,r.jsxs)(n.li,{children:["Copy the ",(0,r.jsx)(n.strong,{children:"Application Id"})," (Client Id) shown after creation"]}),"\n",(0,r.jsxs)(n.li,{children:["Add this Id to your Multi-Scrobbler config","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Env Config => ",(0,r.jsx)(n.code,{children:"DISCORD_APPLICATION_ID=12345678"})]}),"\n",(0,r.jsxs)(n.li,{children:["File Config => ",(0,r.jsx)(n.code,{children:'"applicationId": "12345678"'})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"discord-connection",children:"Discord Connection"}),"\n",(0,r.jsx)(n.p,{children:"This integration uses an existing, running Discord application to communicate with Discord and set Rich Presence. Multi-scrobbler must be able to communicate with the Discord application, either by being on the same machine or over a network."}),"\n",(0,r.jsxs)(t.A,{groupId:"discordType",queryString:!0,children:[(0,r.jsxs)(c.A,{value:"container",label:"Containerized Discord",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://kasm.com",children:"Kasm Workspaces"})," provides a self-hostable ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/kasmweb/discord",children:"Discord container image"}),". This image provides a desktop-like experience, through browser-based VNC, to use the official Discord application."]}),(0,r.jsx)("img",{src:i(9255).A,height:"400"}),(0,r.jsxs)(n.p,{children:["This containerized approach can be used instead of configuring MS to use a ",(0,r.jsx)(n.a,{href:"./?discordType=native#discord-connection",children:"Native Discord"})," application on a specific machine."]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Advantages"})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Setup is much simpler","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Discord runs in the same stack as multi-scrobbler"}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Configuration is copy-paste."})," Skip all of the ",(0,r.jsx)(n.a,{href:"#discord-connection",children:"Discord Connection"})," instructions."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Get a ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord/discord-headless",children:"Headless"}),"-like experience without needing to break Discord TOS"]}),"\n"]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Disadvantages"})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Image only available for x86 arch"}),"\n",(0,r.jsx)(n.li,{children:"Image and container are large (1GB+)"}),"\n",(0,r.jsxs)(n.li,{children:["Discord does not notify ",(0,r.jsx)(n.em,{children:"other"})," clients of notifications in a channel if ",(0,r.jsx)(n.em,{children:"any"})," client is viewing that channel.","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"To avoid this, make sure your container discord instance is not viewing any server/channel/dm."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:['Sometimes, Discord does not deliver "notifications you missed" to mobile because this depends on ',(0,r.jsx)(n.em,{children:"all"})," clients being offline."]}),"\n"]}),(0,r.jsx)("h2",{children:"Setup"}),(0,r.jsxs)(n.p,{children:["Setup is basically the same as using the instructions for ",(0,r.jsx)(n.a,{href:"./?osType=linux&discordType=native#find-ipc-connection",children:"Discord on Linux"})," with ",(0,r.jsx)(n.a,{href:"./?osType=linux&discordType=native#pass-ipc-to-multi-scrobbler",children:"MS on Same Host (Docker)"}),"."]}),(0,r.jsx)("h3",{children:"1. Add Discord Service to Multi-Scrobbler Docker Compose Stack"}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Detailed Explanation"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Add the ",(0,r.jsx)(n.code,{children:"kasmweb/discord"})," service to your compose stack","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Mount the directory containing Discord's unix socket to a named volume"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Configure MS to use Discord's unix socket","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Mount the unix socket volume into MS's container"}),"\n",(0,r.jsxs)(n.li,{children:["Add ENV ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," to point to the mounted volume"]}),"\n"]}),"\n"]}),"\n"]})]}),(0,r.jsxs)(n.p,{children:["Use this example ",(0,r.jsx)(n.code,{children:"docker-compose.yaml"})," to modify your existing multi-scrobbler ",(0,r.jsx)(n.code,{children:"docker-compose.yaml"}),":"]}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler:latest\n environment:\n # ...\n - DISCORD_APPLICATION_ID=12345678\n # add below line\n // highlight-start\n - DISCORD_IPC_LOCATIONS=/run/discord-ipc-0\n // highlight-end\n volumes:\n # ...\n # add below line\n // highlight-start\n - kasm_run:/run\n // highlight-end\n # ...\n\n # .. add discord service below\n // highlight-start\n kasmcord:\n container_name: kasmcord\n image: kasmweb/discord:1.14.0\n ports:\n # VNC port to use in web browser\n - 6901:6901\n shm_size: 512m\n environment:\n # set a password for VNC access\n VNC_PW: hunter2\n XDG_RUNTIME_DIR: /run/user/1000\n volumes:\n - kasm_run:/run/user/1000\n - kasm_config:/home/kasm-user/.config\n user: "0"\n entrypoint: sh -c "chmod 700 /run/user/1000 && chown -R kasm-user:kasm-user /run/user/1000 && chown -R kasm-user:kasm-user /home/kasm-user/.config && su kasm-user -c \'/dockerstartup/kasm_default_profile.sh /dockerstartup/vnc_startup.sh /dockerstartup/kasm_startup.sh\'"\n\nvolumes:\n kasm_run:\n name: kasm_run\n kasm_config:\n name: kasm_config\n // highlight-end\n'})})]}),(0,r.jsx)(n.p,{children:"Then re-deploy your stack."}),(0,r.jsx)("h3",{children:"2. Login to Discord"}),(0,r.jsxs)(n.p,{children:["Navigate in your browser to the IP/host Multi-Scrobbler/Discord are running on. Use the ",(0,r.jsx)(n.code,{children:"port"})," set in the ",(0,r.jsx)(n.code,{children:"kasmcord"})," service:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"# basic auth login\n# user: kasm_user\n# pass is what was set in env VNC_PW\nhttps://192.168.MY.HOST:6901\n"})}),(0,r.jsx)(n.p,{children:"Login to Discord normally. After login is complete MS should connect automatically when a Now Playing event happens. If it does not or reports authentication failure then restart MS (but not Discord)."}),(0,r.jsxs)(n.p,{children:["If MS works then you are done and can move on to ",(0,r.jsx)(n.a,{href:"#optional-setup",children:"Optional Setup"}),"."]})]}),(0,r.jsxs)(c.A,{value:"native",label:"Native Discord",children:[(0,r.jsx)(n.p,{children:"Use this method if you want to connect MS to Discord running on a physical desktop."}),(0,r.jsxs)(d,{type:"tip",summary:"Local MS Installation Requires No Config",children:[(0,r.jsxs)(n.p,{children:["If MS was ",(0,r.jsx)(n.a,{href:"/installation#local-installation",children:"installed locally"})," (not Docker) on the same machine as the Discord application then MS should ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"automatically detect the correct method"})," and ",(0,r.jsx)(n.a,{href:"#pass-ipc-to-multi-scrobbler",children:"use it"})," ",(0,r.jsx)(n.strong,{children:"without"})," any configuration from you. This will work for ",(0,r.jsx)(n.strong,{children:"any OS"}),"."]}),(0,r.jsx)(n.p,{children:"If MS cannot determine this automatically, follow the steps for your OS below."})]}),(0,r.jsx)(n.p,{children:"Follow the sections below to configure MS for your specific environment."}),(0,r.jsx)(n.h4,{id:"find-ipc-connection",children:"Find IPC Connection"}),(0,r.jsxs)(n.p,{children:["Discord uses OS-specific methods to communicate with other applications on the same host, called ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Inter-process_communication",children:"IPC"}),". You may need to determine some details about the IPC method in order for MS to communicate with it correctly."]}),(0,r.jsxs)(t.A,{groupId:"osType",queryString:!0,children:[(0,r.jsxs)(c.A,{value:"linux",label:"Discord on Linux",children:[(0,r.jsxs)(n.p,{children:["On Linux, Discord uses a ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Unix_domain_socket",children:"Unix Socket"})," for IPC."]}),(0,r.jsx)(n.p,{children:"With Discord running, run this command:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ sudo netstat -apeen | grep discord\n\nunix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket\nunix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0\n"})}),(0,r.jsx)(n.p,{children:"We see that the path we need is:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/run/user/1000/discord-ipc-0\n"})})]}),(0,r.jsxs)(c.A,{value:"macos",label:"Discord on MacOS",children:[(0,r.jsxs)(n.p,{children:["On MacOS, Discord uses a ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Unix_domain_socket",children:"Unix Socket"})," for IPC."]}),(0,r.jsx)(n.p,{children:"With Discord running, run this command:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ sudo netstat -apeen | grep discord\n\nunix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket\nunix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0\n"})}),(0,r.jsx)(n.p,{children:"We see that the path we need is:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/run/user/1000/discord-ipc-0\n"})})]}),(0,r.jsxs)(c.A,{value:"windows",label:"Discord on Windows",children:[(0,r.jsxs)(n.p,{children:["Windows uses ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes",children:(0,r.jsx)(n.strong,{children:"Named Pipes"})})," for IPC. These aren't easily iteratable without external software, like ",(0,r.jsx)(n.a,{href:"https://github.com/sensepost/pipetap",children:"Pipetap"}),"."]}),(0,r.jsx)(n.p,{children:"The syntax for a named pipe is like this:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\\\\.\\pipe\\app_named_pipe_foo\n"})}),(0,r.jsx)(n.p,{children:"and Discord's names follow this pattern:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\\\\.\\pipe\\discord-ipc-0\n"})}),(0,r.jsxs)(n.p,{children:["Where ",(0,r.jsx)(n.code,{children:"0"})," increments for each different instance of Discord (official, canary, nightly, etc...)."]}),(0,r.jsxs)(n.p,{children:["The default Discord pipe name is: ",(0,r.jsx)(n.code,{children:"discord-ipc-0"})]})]})]}),(0,r.jsx)(n.h4,{id:"pass-ipc-to-multi-scrobbler",children:"Pass IPC to Multi-Scrobbler"}),(0,r.jsxs)(n.p,{children:["After ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"finding your IPC connection path"})," you will need to make it accessible to Multi-Scrobbler."]}),(0,r.jsxs)(t.A,{groupId:"osType",queryString:!0,children:[(0,r.jsx)(c.A,{value:"linux",label:"Discord on Linux",children:(0,r.jsxs)(t.A,{groupId:"msConnection",children:[(0,r.jsxs)(c.A,{value:"remote",label:"MS on Different Host",children:[(0,r.jsx)(a,{}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.a,{href:"https://linux.die.net/man/1/socat",children:(0,r.jsx)(n.code,{children:"socat"})})," to bidirectionally relay communication from Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0\n"})}),(0,r.jsxs)(n.p,{children:["In your MS docker compose file add the ",(0,r.jsx)(n.code,{children:"host:port"})," of the host running Discord/",(0,r.jsx)(n.code,{children:"socat"})," to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655\n"})})]}),(0,r.jsxs)(c.A,{value:"local-docker",label:"MS on Same Host (Docker)",children:[(0,r.jsxs)(n.p,{children:["In your MS docker compose file, pass the path of Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," as a volume and add this path to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," in ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=/run/discord-ipc-0\n volumes:\n - /run/user/1000/discord-ipc-0:/run/discord-ipc-0\n"})})]}),(0,r.jsx)(c.A,{value:"local",label:"MS on Same Host (Non-Docker)",children:(0,r.jsxs)(n.p,{children:["No configuration is required. If MS does not automatically work for you then try the ",(0,r.jsx)(n.strong,{children:"MS on Same Host (Docker)"})," method using the ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," environment variable."]})})]})}),(0,r.jsx)(c.A,{value:"macos",label:"Discord on MacOS",children:(0,r.jsxs)(t.A,{groupId:"msConnection",children:[(0,r.jsxs)(c.A,{value:"remote",label:"MS on Different Host",children:[(0,r.jsx)(a,{}),(0,r.jsxs)(n.p,{children:["Use one of the methods below to setup ",(0,r.jsx)(n.code,{children:"socat"})," on your macOS machine."]}),(0,r.jsxs)(l,{children:[(0,r.jsxs)("summary",{children:[(0,r.jsx)(n.code,{children:"socat"})," installed natively"]}),(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://formulae.brew.sh/formula/socat",children:(0,r.jsx)(n.code,{children:"socat"})})," using homebrew to use it as a native command on your host."]}),(0,r.jsxs)(n.p,{children:["Then, use ",(0,r.jsx)(n.a,{href:"https://linux.die.net/man/1/socat",children:(0,r.jsx)(n.code,{children:"socat"})})," to bidirectionally relay communication from Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0\n"})})]}),(0,r.jsxs)(l,{children:[(0,r.jsxs)("summary",{children:[(0,r.jsx)(n.code,{children:"socat"})," in Docker"]}),(0,r.jsxs)(n.p,{children:["Use the ",(0,r.jsxs)(n.a,{href:"https://hub.docker.com/r/alpine/socat",children:[(0,r.jsx)(n.code,{children:"socat"})," container"]})," in combination with the Discord ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," found earlier:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"services:\n socat:\n image: alpine/socat\n ports:\n - \"6655:6655\"\n volumes:\n - /run/user/1000/discord-ipc-0:/run/discord-ipc-0\n command:\n - '-v'\n - 'TCP-LISTEN:6655,reuseaddr,fork'\n - 'UNIX-CONNECT:/run/discord-ipc-0'\n"})})]}),(0,r.jsxs)(n.p,{children:["In your MS docker compose file add the ",(0,r.jsx)(n.code,{children:"host:port"})," of the host running Discord/",(0,r.jsx)(n.code,{children:"socat"})," to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655\n"})})]}),(0,r.jsxs)(c.A,{value:"local-docker",label:"MS on Same Host (Docker)",children:[(0,r.jsxs)(n.p,{children:["In your MS docker compose file, pass the path of Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," as a volume and add this path to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," in ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=/discord-ipc-0\n volumes:\n - /run/user/1000/discord-ipc-0:/run/discord-ipc-0\n"})})]}),(0,r.jsx)(c.A,{value:"local",label:"MS on Same Host (Non-Docker)",children:(0,r.jsxs)(n.p,{children:["No configuration is required. If MS does not automatically work for you then try the ",(0,r.jsx)(n.strong,{children:"MS on Same Host (Docker)"})," method using the ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," environment variable."]})})]})}),(0,r.jsx)(c.A,{value:"windows",label:"Discord on Windows",children:(0,r.jsxs)(t.A,{groupId:"msConnection",children:[(0,r.jsxs)(c.A,{value:"remote",label:"MS in Docker",children:[(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["While it is possible to use ",(0,r.jsx)(n.a,{href:"https://forums.docker.com/t/volume-mount-path-error/143626/3",children:"named pipes directly in Docker"})," this has not been tested and ",(0,r.jsx)(n.a,{href:"https://github.com/docker/for-win/issues/6813#issuecomment-632859857",children:"may only work for windows containers"}),". If you are adventurous, try this out and if you can get it working please ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues",children:"report your findings in an issue."})]})}),(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsxs)(n.p,{children:["This method is ",(0,r.jsx)(n.strong,{children:"experimental"})," and may be buggy and prone to crashes. If you are a Windows or Rust developer please consider helping improve the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/named-pipe-to-tcp-proxy",children:"pipe proxy implementation"}),"."]})}),(0,r.jsx)(a,{}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/named-pipe-to-tcp-proxy",children:(0,r.jsx)(n.strong,{children:"pipeProxy"})})," to connect to the Discord named pipe and expose it on a TCP port."]}),(0,r.jsxs)(n.p,{children:["Download the latest ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/named-pipe-to-tcp-proxy/releases",children:(0,r.jsx)(n.code,{children:"pipeProxy.exe"})})," from the releases page."]}),(0,r.jsx)(n.p,{children:"The host/ip should be the IP of the machine running discord."}),(0,r.jsx)(n.p,{children:"Run pipeProxy from the windows command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'pipeProxy.exe --pipe "\\\\.\\pipe\\discord-ipc-0" --tcp "192.168.0.100:6655"\n'})}),(0,r.jsxs)(n.p,{children:["In your MS docker compose file add the ",(0,r.jsx)(n.code,{children:"host:port"})," of the host running ",(0,r.jsx)(n.code,{children:"pipeProxy"})," to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=192.168.0.100:6655\n"})})]}),(0,r.jsx)(c.A,{value:"local",label:"MS on Same Host (Non-Docker)",children:(0,r.jsxs)(n.p,{children:["No configuration is required. If MS does not automatically work for you then try the ",(0,r.jsx)(n.strong,{children:"MS in Docker"})," method using the ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," environment variable."]})})]})})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"optional-setup",children:"Optional Setup"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Due to the limitations of the Discord local API the other listening activity detection and online status customizations found in ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord/discord-headless#optional-setup",children:"Headless"})," are not available for the Local integration."]})}),"\n",(0,r.jsx)(n.h3,{id:"artwork",children:"Artwork"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible."}),"\n",(0,r.jsx)(n.p,{children:"The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below."}),"\n",(0,r.jsx)(n.h4,{id:"artwork-url-types",children:"Artwork URL Types"}),"\n",(0,r.jsxs)(t.A,{groupId:"artworkUrl",queryString:!0,children:[(0,r.jsxs)(c.A,{label:"External URLs",value:"external",children:[(0,r.jsx)(n.p,{children:"MS can use external URLs for artwork."}),(0,r.jsx)("img",{src:i(6170).A,height:"127"}),(0,r.jsxs)(n.p,{children:["External URLs that are not from known music services are ",(0,r.jsx)(n.strong,{children:"disabled by default."})," This is to preserve ",(0,r.jsx)(n.em,{children:"your"})," privacy because Discord does not host images, it only links to them and the URL is visible to other users."]}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Why Should I Care?"}),(0,r.jsx)(n.p,{children:"There are some scenarios where you may not want your artwork URLs to be visible, for example:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Source may be accessible only on your LAN (Jellyfin at ",(0,r.jsx)(n.code,{children:"http://192.168.0.101"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"A Source may be internet-facing but you do not want to expose this information to discord/other users"}),"\n",(0,r.jsx)(n.li,{children:"A Source may be internet-facing but requires authentication to view the image"}),"\n"]})]}),(0,r.jsx)(n.p,{children:"MS will use your artwork URLs only if:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["artwork url is from a known music service/",(0,r.jsx)(n.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," or"]}),"\n",(0,r.jsxs)(n.li,{children:["artwork url starts with ",(0,r.jsx)(n.code,{children:"https"})," and","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"artwork"})," (",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK"}),") is"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"true"})," => always uses the url"]}),"\n",(0,r.jsxs)(n.li,{children:["a list of custom domains keywords an external artwork url should contain EX","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ENV => ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),"\n",(0,r.jsxs)(n.li,{children:["File Config => ",(0,r.jsx)(n.code,{children:'"artwork": ["mycdn","jellyfin"]'})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Examples"}),(0,r.jsxs)(n.p,{children:["None of the below URLs will ",(0,r.jsx)(n.strong,{children:"ever"})," be used because they are not ",(0,r.jsx)(n.code,{children:"https"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"http://foobar.com/cool.jpg <-- NOT allowed, not http\nhttp://192.168.0.112/fun.png <-- NOT allowed, not http\n"})}),(0,r.jsxs)(n.p,{children:["When ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK"})," is not set:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service\nhttps://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service\nhttps://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\nhttps://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\n"})}),(0,r.jsxs)(n.p,{children:["Setting ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK=true"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- allowed, is https\nhttps://anything.com/neat.jpg <-- allowed, is https\n"})}),(0,r.jsxs)(n.p,{children:["Setting ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- NOT allowed, is https but does not contain "mycdn" or "jellyfin"\nhttps://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains "jellyfin"\n'})})]})]}),(0,r.jsxs)(c.A,{label:"Musicbrainz/Cover Art Achive",value:"caa",children:[(0,r.jsxs)(n.p,{children:["MS can try to use ",(0,r.jsx)(n.a,{href:"http://coverartarchive.org/",children:"Cover Art Archive"})," to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you."]}),(0,r.jsx)("img",{src:i(6170).A,height:"127"}),(0,r.jsx)(n.p,{children:"MS will try to use Cover Art Archive if:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an ",(0,r.jsx)(n.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," condition"]}),"\n",(0,r.jsxs)(n.li,{children:["and ",(0,r.jsxs)(n.strong,{children:["the scrobble data contains a ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," Release (Album) MBID"]})]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Basically, if MS would normally use the ",(0,r.jsx)(n.a,{href:"./?artworkUrl=ms-default#artwork-url-types",children:"MS Default"})," art, it will first try to use Cover Art Archive if the scrobble has a Release MBID."]}),(0,r.jsxs)(n.p,{children:["Some Source, like ",(0,r.jsx)(n.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})," and ",(0,r.jsx)(n.a,{href:"/configuration/sources/plex",children:"Plex"}),', can automatically provide this ID if the music is "matched" in your library.']}),(0,r.jsxs)(n.p,{children:["For all others, you can ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#use-metadata-for-discord-album-art",children:(0,r.jsx)(n.strong,{children:"configure MS to use the Musicbrainz Stage"})})," for Discord to try to get this MBID."]})]}),(0,r.jsxs)(c.A,{label:"MS Default",value:"ms-default",children:[(0,r.jsx)(n.p,{children:"When these conditions are true:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Cannot use an ",(0,r.jsx)(n.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," and"]}),"\n",(0,r.jsxs)(n.li,{children:["Cannot get album art from ",(0,r.jsx)(n.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," and"]}),"\n",(0,r.jsx)(n.li,{children:"Play does not contain artwork information (no artwork shown in dashboard)"}),"\n"]}),(0,r.jsx)(n.p,{children:"The status artwork will use a default URL instead of your artwork URL."}),(0,r.jsxs)(n.p,{children:["Without any other configuration, the default URL is an icon from the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/assets/default-artwork.png",children:"multi-scrobbler repository"}),":"]}),(0,r.jsx)("img",{src:i(8239).A,height:"127"}),(0,r.jsx)(n.p,{children:"This default image can be customized:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ENV Config => ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png"})]}),"\n",(0,r.jsxs)(n.li,{children:["File Config => ",(0,r.jsx)(n.code,{children:'"artworkDefaultUrl": "https://cooldomain.com/art.png"'})]}),"\n"]}),(0,r.jsx)(n.p,{children:"Remember, this URL need to be accessible on the public internet."})]})]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(s,{config:"DiscordClientConfig",fileContent:'[\n {\n "name": "Desktop",\n "enable": true,\n "id": "myDiscordLocal",\n "data": {\n "applicationId": "8190211179716453570",\n "ipcLocations": ["192.168.0.105:6655"]\n }\n }\n ]\n ',client:!0,name:"discord",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:"Type"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{style:{textAlign:"left"},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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"DISCORD_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"DISCORD_ID"})]}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"DISCORD_APPLICATION_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"Application ID"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A commera-separated list of ",(0,r.jsx)(n.code,{children:"host:port"})," network locations or file paths to unix socket for Discord"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK_DEFAULT_URL"})}),(0,r.jsx)(n.td,{children:"string or boolean"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A URL of an image to use as a fallback if the album art URL cannot be used. Or ",(0,r.jsx)(n.code,{children:"false"})," to use discord's default."]})]})]})]})})]})}function j(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(m,{...e})}):m(e)}function f(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9255(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/discord_kasm-d89313fd253b623d4bff7edffb3b277d.png"},6170(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/discord_presence_art-3260bd6302b2f0d1f13b45762cc908de.png"},8239(e,n,i){i.d(n,{A:()=>s});let s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAAB/CAYAAAC3zOThAAAALXRFWHRDcmVhdGlvbiBUaW1lAFR1ZSAxNyBGZWIgMjAyNiAwMzo1MzoxMiBQTSBFU1SzzP6eAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAJChJREFUeJztnQd8FNUWxk96hYSSAIHQe0kAQ1NEpAsIAqIUaVKkIwI+8SnwaCqgFEEFQWkiSpMuIIQmvffeQighEEJ6skne/U6yyyYk2Y1JyA6e/++3MjuZndmNs1/OOffe79j6+PolJiaSgv9D7u5upNMlbQuCIFgKtiQIgqABRKwEQdAEIlaCIGgCEStBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0ATPRaysrKzJxsaa/7WysiJBEP5dYE1fYmICxccn8L//hBwXK1tbW7K2tiFBEP69IEixsrJhLUhIiCedTkeZxZpyEFtbOxEqQRBSAE2ANmT6dZRDJEVUOaqFgiBoFGgDNCJTr6EcALUpiagEQcgIaAS0wuzjKQdAMV0QBMEUmdGKHCmwZ0YtBUH495IZrcghsZLpCYIgmCYzWiGTQgVB0AQiVoIgaAIRK0EQNEGuVMJdnJ1pp/9m8vIq8szP3mrbmr75+kvKSZ7HNcxl+IeD6bPPPs7wmDZtWtGsmVN5G7+zbVvXkylq+dWkefO+5d9zIU9PWrliKVWuXJEEQatY3LDduXMXaPt2/wyPmTplEjVoUJ9y8hrmktX3klO0b9+Gzpw+R40ataT7QUG0YeOfdDsgkARBq1hcGnjp8hV+ZEShQh6UlQFHc66RmlKlSlKJEt60c+ceys73klM4OjpSwO3blJDUFJIWLlxKgqBlLE6skPI0adyQhg4bRXXq+FHPnu9RqZIl6MTJ0zR58jRa8fticnBwoP+N+y/FxMRQ8xZvUdGiXjR4UD/y9fWhM2fP0Yzps+nO3XucXiHltFfHe3p40Lr1G2nFijUproHtVi2bU8jjx3zM1avXaNLkpJRr4MC+VP+Vl+nJkydkb29P/v67UrzXLX/+8cx7Qfo1eHB/la4VpgAVyUydNoPOn79o1md3cLCnQYM+oNdUpPbgQTD9MHcBHTlyLN3jmzR5nbp360zde/Tj50OG9OfPi3SveHFvqlHDlzq0b0vvdetDmzaupkGDP+L3OW/uLNp/4DB5FytKcXFxNGHiVxQU9IAEwZh8+dwpJOTxM/uA8X7sy5cvH127dp1yEouevdlNfREXL/6V+vQdzF8mWEtAEG7dCqCx4ybxNpgw/nPasnU7denai44fO6lEaGCK84wYMZq/kN27dUnzOvhlT540lfr0GUh+SmzwZYcAtmrZgkaOHE3TZ8ymwoUL0ZKly1O8Lq33Mnz4ENq3/wB1696XTp0+Q0OHDiBzGTZsEAtjz14f0I/zf6ZRI4eRjU36y5b8/XeTu7s7+fpU5eMaN2pIq9esZ/E6fvwkzZz1HQtValxcXGj1qrXUf8AwCgsLp2ZNG5MgGFOzZg0aNeojfhij31e6dCnDvg4d2qnvTi9q3Ph1ykksejTw0sUr1L17Z6697N79N3+xUlO2bGn1iytJ48Z+atiHqETP9es3+d979+5TnjyuHCGlBj97EhbG249VhOXhUZAePQpJ8t9JgP8OmQXei5tbXvpx3s+cfn3//Y8c0RQokJ8ePnxk8vV169Si/Pnz0XtdOxn2IfpJj/j4eNqhor3mLZqq9+zB17h06TKZQqeLp/MXkqK9R48e8TUFIS1CQkIM2/qoKvX+p/seU05i0WI169vvqUyZ0tSjRxeaNHEMjRk7kQ4ePJLiGMyAjYiIpFatO1B2EhMdQ8HBD2npkvlsHPbj/IUmX4P3Eh+vM9SJ4mLjDPuNcXd3U6IYytuuri4cTSUdRzR4yAg6c+ZciuN9fKule821azfSzBlTVO3Mk7aq6FIQsoNjx46rP/TXUwgQtqdO/cawrWfVqjWSBg7o34ceqWhhzJiJ6hdxgyMegC+6q6srK/3ly1c5CkI0gprPOx3bc/qUVV56qQbdvBlATZu1oWbN23KtKy1Sv5eQkFBq3boF/6xT545cr4Lo6SmjwufFi+ZxnaxatSp8nVOnzvLPDqg6Utcu73BKh3odpitgGxGU3k4jXkVFWPxpl/z8+vUbdO/+fapapRJt3ryVBCG7SCtSwr7U+/E8p4UK5KpYLfvlJ54HpH/UrFk9xc8xmrVs2U+0Yf0KunPnLvnv2M3716i6TM8eXWn+j3P4+ehPx1KVKhVp/boV1KnT27Ttr6xPS7gVcJtee62+4b0tWTyfatf2e+a41O9l/IQvqff7Pfg1bdu2oslfTEtx/FX1P3Wlqhd17NhO1cnG0fYdO8l/Z9LnmjFzDj1QwrZ61TKuw+3e8zcL1dmz59VoZAma8tUEleI+oMDAu+q6vxrOeezoCfp730FDKisILyJWPr5+iUlZS1LqghRFpzOzSJMO9vYOpHVGjhjKEdtPPy/h52PGjFapYTR9NWU6WRKI6L6dNY2+USOgx46dIEHQGrGxMWYdJ2KVDhgN7NunJzk4OlBiQiJFY8h/3k9cjLcUMK2jbZtW9Mcf62nR4mUkCFpExEoQBE1grljJQmZBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0AQiVoIgaAIRK0EQNIGIlSAImsCixArrfpLW/mRtuU/OYsX+VNJ1WhCeLxYhVrBBiYmOosioCPYIT0xIIIvEKslIz97ekVxcXNl/3cZGglNBeB7k+jctLi6WgoLu0Z3AmxQZGUFaAILl6ORMXl7e5OnplaZVsiAI2Uuumu8hooJQ3bh+STNCBZCqRqn3G3DrOt27d5vidTrKKlWrVKYF87/nB7rS6ClWrKhhf1rmfxkB73c98Fmf/s1X1L59W8oqaDiBqFIQnie5KlZI/RBR6bLhy54bwNriYXAQhYU/oayS30hYfH2eeq7XqP5UuDLT2GHSxHH07rtvp9gHgbG3y1oUWP+VejRj+pQUQigIz4NcSwMRnaBGpaWIKi34M0SEk7t71r68+dyTOofcCgggX6MGEVWrVuZ9xb29yd3N3ezz5c2bhwLvPH0O19OBgz6krJJHndfa2qKt+4UXFJtChb3GGe9AJ9+s1rfNKTpDrB4/DlFfIm0318TnyJPXPctiVbdubW5MunHDZqpV6yU6efI0R5ydO79D27fv5DZfT8KeGJqeIsrq0vld6tWzG9Wu40d2dnZs2u/tXYzTPTz3KlKE2rZpTQnxCXTj5i2aN3c2Odg7UHBwMM2a+TVHWefOX+DzfdCvN/Xt04v+2u5Pb77Zkrp2eZc6qcgMDS3Cw8Pp7t17NGTwAGrUqCEf3+j116h5sya0adMWft6gQX3q9l5n6tixPb+HgIDb3HUI9Txc16NgQXqr7Zvc2GPbXzuoikp7e7/fnbqo69StU5s/K3owCv8+UA4yh1z8E5louaN+meDpdIusAYfW8PAIOnL0OJ+venUflQL6cBRz8NBhevIkzBB9OTk50uhPRnEEtuaP9XQ7IJA6d+pIHTq8xc1gZ8yczaOqly5f4W283hgcc/t2IHfXARgwqFKlEjemwOuqVa1Cl69cpV9+Wc7i1q/v+yyO6GiNJhZg8eJfaM5383i7efOm1KN7V+5ysmLlGqpYoTz999OP+TPpgRgfOnyEFi9ZxsKEhrP4nDhPaGioEtbCJAgZIePu2UxcbCzFJ8Sr+pBjpuZiQYjQPxAPtNeCYCB1Q0SD5qXY754sVr6+Piwei9QXfffuvdzWvph3Ua4nrVr1B50+fZb/WoWFhfE2SD1iieYSbdq04tqTp6cnF82PJgvl1GnTKSoqmo8LV9HRoIH9qGTJktxLLigoiPdDzNBxCLxa/2VuLPvd9/P49RERETRwQD+OEHft2svH7Nt3gDZu/NNwfbQWQ39FNK79+ptZ2SL4wouNiFU2AqG6eesqRYSHUclS5VTdyN1swcqbN6/68icVmU6dOsNCgsale/fu432hoU84TQQQFmDcqy3g1m0qWteLzGX/gYN8jZdq1qCCBQtQXFwcHVViBMqVK0sNXq1PnoU8qJASMuCYweifk5MTXb9xwyA4V69e43/RT1EPokZjZs6awz0ehw8fomprd+j331fTmTNnSRDSQyql2UhMbLSKgB6rWtwjFixzowU0MkVBHIIEkC4h/XN2dqYTJ0/xPqRKiEbQnl7fZNLLq4jhHBA2fZdngGtbUfpCiVQQhXsfn6qqiF+Fzp27wClg3jx5VCT1AeVV19m//2CKaCjpxEn/GIswoj5PTw/Dc3QGAogMM7r+l199TSNHfUrhYREq1exlaOQqCGkhd0c2gpZdlCxQCVyPM0+sCuTPz19+CBK4fz+I1q7dQPYO9nTx4mXepxeigqpQffr0GS56o6CNKAtdnsuWLUNbt/5lOCeEr0KFctS48eucuunPY8zxYye5mA5h3LBxc9L5PQqyaBxXaeLFS5e5tmTMo5AkAWrd6g0KVMONeB3Sx3bt2tDgQf3plHpvKOpD+I6n08fQ2dmJp1YcUrU0HI/fEz6/uYVW4d+JRFYWQAGVhgF9ZAVQzF658mnLer2QQdiQss369ns6rdKmdm+9yRNHcfwfSuD0bNq8hdOzLmo0sUCBAmle98DBQyxUEAkIDkC9bNu2HdRMjfR9pFK0GzdupngNal0Y6cMEVXSsBn9u2ca9C9FwtePb7eiKqmchzUuvQ3RkZBT99ttKekXV2D4cNpjT2yVLfpW6lZAhudY3MEEVoe8EBqj6xgXSOiVKllUF6LIU9iSULl8+q4rGT6hMmYrkVdRbiYENCYKQPv/qvoFIY8qUraTqKIXNEouIiHBe8hMcHESCIFgmL2Qa6OTkwq4I5kY1ONbFNS8JgmC5vJgFdivDfwRBeEGQ0UBBEDSBiJUgCJpAxEoQBE0gYkVJbqVYKmMJjB37KV28cJmW/7bimZ+98UYzqlGjOm+XKO5NN5NdCnb676Z9+w+kOBYLiWd9+x3pdPH08ajh9L/xk+mfUrZMaWrTpjW5urrwer7jx0/Q5s1bkye+ps3/xn1GkyZPUcPSsSm2zWXC+DH0+Zjxz+zH4uumTRqTg4M9zw87dPgo7dy5m4QXnxderB49CqbwsFD+kqUHhOrx44eU2xQpUpiKFS1Krmp0Mi2xgkDgAaZ8NYkmKwFIjx/mzudFwpgYmhUKFy5E3bt3pZ9/XkzXb9zk5Th9+vbinz2zFCeHKVGiOHV8uz3NmDlH/X99xIuzMWs+Nib2GbHOCqVKlaSX69WhX5b9RoLl8MKLVUhIME8+xSRUS+fll+uqL91BqlypIlWsWJ4uXLhE/xQ4NWQHEIf1GzaxUAHMSl+wYKHBAeJ5gmU8EEgIFUCktmTpMhr+4ZBsFSsIvL3YNlsckgZaEHVq16IFPy3khcH16tYxW6xgxeLnV5MFxNrKilMufeoFYMQ3dMgAyuvmRjY21kpsFrGfFWjWrDFVqVxJHWNP/jt30WGVVhmDpTBz5y1IsQ/LgvDAer6uXTtR+XJlKSoqihdDr123IcP3ioXTMOrDmsbLl67Q6jVreX+lihWoc5d3KCY6hhc5p+VWgcgq9XuBNQ2AwMBVtVzZMrTs1995H0Rs2a+/8VrL9K77esMGvHQI+7GA/NHDEGrxRlPK4+pKn6pU+q+/dtChQ0dIyH1ErCyEMqouhC8oFhw/VF+YsWNGs19VgpkGhd7FitHYcRN53WBq4NQAryn4T2FxM9bvTZ8xWwlibXZ8wDYYOmSgEsiLnD7qwXvKqNZ0Sb1fmPRhzdaIj4axz1Z6bgseHgV5PeDs2T/wc1jU1KxZg32y4Bc/Z85cFhYsyoYfVlpggXRqIO5wrUiPjK5bv/7LNGHilyzoELvjx0/S49BQqlOnFqe+guUgYmUh1FM1EnhMAdgOw3SvenVf/kKZA7yg0hKqpPM9NBjlQQwRDUGEfHyqsWsnUj2A12PRs7FYQYTQaCItkcDPbt66RS1bNqeC6nVYyIx/0xMrdPBxVRGM/nrOLs4cocFJIjIykoUKYCE0DPxSE6sGQiCuqd0Z4AVm/J7NvS5ARAjraCzkhlAJloumxcrW1o7c3POpGzGpiUF0TLS6CUM01y0Z77eW30s82taqZQvD/jp1/MwWq8xgY21jaPoAG+WTyZ5ZaQFfdDiBwptdD8TF2cmRHipR6t+/Dy1fvoIL/7A/NgXOt2Ll6hT7UMQ3x3Hh2tXr7AlvnJZ5JFvaQOwye10w7euZVLp0KXZmbfNmS34uWCaaXBuIL3f+Ah7k4+unCtHVyLt4aSpWrKRKpSqoaMFP1TbKaqrxKNKPhw8fUu8+AwyP4cM/5kJ7dnwOOIFCEECFCuU5QkF0cvLUaVXvqmk4rn27tpwyGrNx05+cNqEJBMBo4AAlUMVU2lnUqwgF3X/A0ZqLilZKlCxueB2b/yX/0dBvnz5zjhtF6IXy5Xp1qZL6jKhRFSpUiA0EAaZK6N1Qjdm9Zy83ndC3JMPvptt7XWj7jp38HNGSR7IJIF5fJNnXPb3r4vX4bHBcRa3NjWt6Npz24vMIloXmIivc9AULelIFJVJpddHBPjQ5IA1FV6iP6Bsx6MGoGzrPoHj+99/7KSsgBWz3VhuOQpycnbg2BA4cOMSWQAP691VCX0qlX9eeSafwRV7w02KuZyFlhJj9sXY9j77hy49a0H8+/oijm7vJqSaAtTH2j5/wRYrtlavWUO/3e3CxPDo6mgvmqMst+GkR+2dFqrTs+rUbFPzw2akkEMUtW7bRfz/9D5sPIu3crz4D9oHLl68owW3Dc7TweqTSAGl1WteFKEGwxo//nIJVoX7nrj0s4vjMMFL87LNP1OjjZkkPLQTN+VmhEcNLfq9wQdQccP6cnrogflbPFwgjvOMxAoqGF8eOn6ANGzaToE1eWD+rosVKmC1UwosJIjy0F8MD6R6mPQgvPpoTqwIFPEkQ9GDU8MjRYyS8+GhOrBwdM7l8xCjFFQRBu2huNDCzHVB0ujgSBEH7aE6s0JfPXCBsUVGR0jVFEF4ANCdW9+8Fmr0EBU4K0dFRIlaC8AKguZrVo5BgehB0lzwLeWU4Uz0yMoLu3rnNXlVa4PvvZlHA7du8nc/djXbt3psrw/Gf/GcEOTg6qN+bjhdFYy7Vb7+v5DlOmPNlvFBY66CjNZbgoMehMfgdLF6yzLBESU++fPnog37vcydpUP+VelRG/T6wZOf331eRkLNoTqzi1bD1rVvXOLry8ChMtqmmMSCKCgsLVTdaAD0OfWR2FGYu+fIVpPz5C1KevG7k7OxCdrZ2hgmozi6uPJP+3r07lFkwqqX3p8JavFEjP6TTp8/SzZu3KLOUKpU1P6Yff/zZ8EX19PCgTz4ZQR+N+IT+7YSEhND8BYsMz5s3b0pjxk6QyP05ocm1gahD3bx1lUJV/cotrzs5OjlzBAATvfDwJ0qkQthwLzvbkXt5Fec5XhCo9MBSDUR8eOji4pSG/bMsG4uGL1+5SkWLev0jscpOP6agBw+4dX3+/PlJSJoNb4wI1fNDk2KFGyQmOprTwcchD3lBM1LC+IR4Fqz4eF223UR58uTlhqlubknr0QpaxVM5mziKTbSiCwl2FJGYJEguVglU0TqO7K0S6XK8HQVnYeIqIiusj9Pb9WKZDJbLYHkJHA2W/rKcU4/XXnuVGjZ8VUWb8eysgCUrWBCd2o8Ja+Zat3qDbVQQMeE4TKw0ByxadnR0VIKVNLBRuHBhXjpjY2vLreZ/VSkh7F0CbwfS3uRlQf1UqrRr1x52Q6hcuZJKa93J09ODl62wM4P6PPCtWrhoCZsE2tvb0dsd2rE4x8cncNoZGHiH1zFm9L5hJfPOOx34DxUWMmNBNY5jf6+XavLCcAg31kCuXZvks4Vo6LUG9dlW5u69+5QZcC5YRGOx87Bhg3jNJX7HsJU+cvRomp9ByD407bqAFC8mJpofOYGnZxGqVMmH07yC1vH0um0U+dom1cCQXJbR2dO6OBfuUNjKLpKqqp/pY6mT6mf+OicKTjBvuQ3W3C2Y/73hOWZn6y1TevZ4T9VVvuO1bDC6a/fWm1w3Qloydep09UWNojZvtqI6tf1YMFL7McFnCjbHSDXxJTaVGmNtnR5EVosXPfXVwgLfKeqaiP4+Gj6U6z4Qpm7vdeZrOzk5sjWzvsblqYTp629m8R+TaVMn08KFS1k8IBpYV7hu3Ubq0vld8lfCjCgSa/VgFAhBgFBl9L5REsBnxBpACNcbLZqxoAEsG5s6bQaL26SJ4+jPP7fxe4eH17j/TeLfJTzt3d3cKLPoU3b8nvSpO/4fpfUZhOxD/KzSgYWqsi9v+9nGUFv7iBRtUyFKlW1i6bAuKd3CtnHSB1HzUY+1sS50RGc6JUP0M3LUaN52dnaiFs2bUdOmjejkydOUv0B+tvQFKI9Z2yQJIHyf6tWry+4ChTw9Vep4Jc1zX7t+nXq/35327NnHQmFKrNCoAREKFv1ikfPFS5cNP8OiZL23FZwisDYPtTVEgxAIPxXZGVu4ILrQXw/p5PkLF3kbDp8VK5Tj7fLlyykBiKTatfz4OZpcQNxMvW9YLUOUGzZswFEPojY9EA19FIaoE++toorU8PvUmwliu3y5cpQdpPcZJE3MPkSs0gCpH0dUivp20eRlpaMolfY5W6W88WyVcBS1jjdspwavKa1SQ0e7RNob50jmgkjp8JGktAJfqIjwiDS9mPorITmw/5AaiVqpRqZeJtc8rmmeb82adVwor1S5Iqdws+f8wMJhCnzh76lUCemmv/+uDI+Fg0ODV+uTj281mj79W8oMWJgMJ4fU5oGm3nfbtq3JWYnUhg2blMA7c3SXEUhdc0o80vsMQvahST+rnAY1KoQwiKheU6lfcKINxafTjt6GEvmRFngNXotz4FyZAZ7hQUFB7PVk72DPX1pQrFhRat6sCW9jH9xFMc2gcpVKhtem9mNq3foNNRjxhNO1QBUxIU3DYIA5RfPtO/yVCL1i8jg0unhVHfdEpaBpuXxmxNlz59kpFSCNhHNneu/bGEyjQOoFW5vqvj4mr4OosGbN6gaPMF8lrNlFep9ByD4kskoFRv1QTEeNqpVdBOmMRCpeaZK1emrKKQvSlZBKv3CuGwm26daw4B6AYi3IgwgpES6WM/g5/KdatWrB9SFET8uSpyRASEaOGEZ5VAEaXlR6UvsxofY15vPRPJKFgrbeJws1HtRvMuLMmXPUvVtXk8KGAjeaUOzZu48yC4r0HTq8xQ0eIMY7/Hfy/rTetzGbNm+hzp06cqMMvE9TIFJEBDhh/OcUrQr8BzNoBNG3by/+I6Bn69a/6OzZ85TZzyBkH7nrZ3UngK5eyZyfVU5Tq/arPD0BNaoLOjVK5RBB+3WOVEtFRnvjHKiGqkMVtn46JWJbbNLC6qb2UYZ995QgHVcF9vp2MVzTqmcbTStjXKiibRzXsCwBOH5269aF5nw3l7IDpGGYjzV27ESp0wiZQgN+VlYW55WOCZ8QKkRVlVTB/JwupaUw0jpzppgmJB+bcp8Vn/Nva0ezRwhzEhc1rL9pU/Y0KW3fvi1HfcuXrxShEnKMXBMrCJW9vaNFjZhgZjqoYmPeEh2IUgxENzFp25wCIM69KyFrXZKzA73lb3awevVaEoScJtcK7BApFxdXnn1uKWAJDShtbXrC5MMEa1qlUrvQRGt6TEnbD82ImMw5tyAIz5Kro4GYm1NUFbTNqXE9D/RLaTytTS/TuaeK5TVVHetN+0h+VFe1rB1xjibTRHPOLQjCs+TqaCA60WDyJYrtwcFBFBkVwbOScyst5EXJClerBIpIfLaeFqve1hlVxwqwTiTER4kqutoSZ0/2anDiHVWIj1Up4e44Jz4uNp2PgHMLgpB5cn3qgp29PXkVLa5SMHeKjAinOF1c7tWwMlnwf+ZoqS0LQo5hEfOsEGG5u+fnhyUQrupQVmkoj71SJ6z/81KpHCIsJ+sEqpa8VjBIRVkOqtLewC6Kpy4cS2eJTXiizMMVhH+CRU8KhYNCTGw0T3B8HsCPCjO7g5TYFDJRCC+ifr4DKR/iK/X2IFSv20WbLAIGWcC0BUHQIhYrVhAqeFax5/pzSgthnAcvqmuqeG5KrAqoqKqDqlNtjk0azXzDIdKs0QqcWxCEzGOx3xx4U0WEh3GX4+cFHD4hVmfj7XnWuSkgTiiuI7gyN7nDuQVByDwWK1ZoE1+yVDkWrOy2Js4IOHzCOO+8EpXUC5Tx3BxRsk4+NuW+RD5nerPXsfi1Z49uvNwpKiqafl3+u8HPCmDdWYXy5dj2ZOu27XTixCkyh09Hj6IyZUobnm/f7m/wUIedSfPmTdQghx2v61uyZBlfW9A+Gd1PmDLUq2c3NbBVhEssa9dtpGPHjpt1XlgVYTE4XCZOnT7D3vP6ATFYCuE+xfmD1LXgY5+dLhQWK1aYNJpXjRDmyYOJms9vmE1vRfy3zpEGOYSmWMjcTBXPrc0YMCykCvA41jgx7OQQTnNi0jd669q1E507d54bRZQuXYr69ulFEyd9xT9r0KA+5c+XjyZ/MdWwBu/WrQB2DTWFm5sb9e4z4Jn98H+Cw+fX38xk7yo4kbZRN+Jvv60kQftkdD+92bolhUdE0Lhxk9j08eOPP6JLly5TeHh4huesVq0KO0uMn/AFixAWe8ORA9eAePXu3YPmzl3AHmZYJN/x7XbZ2lzEooemrJK7q1hb2zy3h369IiKgjXEpFx3bmOG4wO87+VhjcK70oyonFTWV5//pAK4JMHKrXLkiP2/cqCGtW7+Rt+FucOjgETacM2bI4AH0xeTxfNPogV1wejdgdHQ0ffnVNENjiOMnTpK3dzEStI+p+wkOEitWrOaMJSTkMd27e5/XdhqT1v1048ZN+nnhYr4HIVZwofAu7s0/q17dh+4E3jVYOSP6r127VorXZxUZR88AOHzu0jmx73pGnlUZeV3htThHRm6hxYsXY9dNY+BjBasR4OnpmSIlhCFe6pvL0dHB4NOkx9vbm6xtrGnc2P/SjOlTqV27NoafIXSHWyfADYW/hMeOmpcKCJaNqfvpSViYwe21QoVylD9/PvbTNyat+wm+YbCr1oPyQlDyfQnv+QdGzTTQrAW+/YULF6LsQoamTACHTxjn6edTGQMnncDkaAnbqd1CnawS1eifnUlbY8ych78Sojr4hc+YMZuioqPIIXkZEmb4gw8+6E2nTp2h0NDQZ24k+I2nBh7tAbdu085deziSeq9rZ7ZK3rZth+GYihXL06iRw1m40OTAHOb+MItv8pwCX4hBg4aT8Cz4k2mqa5Op+0kPml+gKQccWVM3EEnrftKDyA0+YqVKlqClS381XDMyKooFsU/vnuyTFqXuOUeH7FtKJ5GVGUBsZka7cRMIPSj5n1MF83uJtvzAtvEwAI7Fa8zxX4eQoCCKaGf+goXcpAG1KfzPB7jp8ECHlpMnT7FRX1RUlMnzoqb108+LOQ1Aurd+wyby9UnpjnnhwiXqP2Ao16pQjBe0j6n7SQ8af3wy+nOuaTVq1NCsc0OMJk0cy9uTv5hi8LNHpIZrIg1ctPgX3gfL6QiVMmYXElmZCepNK2JdyT8uqRVXTKIVXVRRU1TyGsKNcc50Nd7uaSuuRPMnfwaokTiEy9wkQQkLKKbC6kMHD/P2nbv3eKQFNQNQXNUJzGnzhPOhjZZe2LDuUl+TQ4stj4IFuIED6g+oWXXv3oX/apoSwg/6DyXBcjF1P6FIDsdUfSng/IUL3HTEFJgwPXBAP9q0aQv9pUaVU17zNr3W4FU+J1JKOzWijvTSuHyRVSSyyiQQITiHHot3MPQMBNg+qvbhZ5kRKoC/ShCiV5O9zlELcFNDzleuJlkVHz9+gpo0eZ23EVVhysHB5BtPT1oFURThMQqElBEDFWh/dfjIMf4ZahLde3TloW2A/n4owpoTsQmWjan7qWaN6tRC3QsA90a1qlXp2tXrKc6R1v3k51eTbgcGPiNUAMV2RF2oXYEmjV+n02fOZuu0o1yzNRZSgjZSgwb1V3UFe7K1s+UhYH0khRume7cuVK58Wa4BrFixhvbtP5Di9Wg3zw1IP/nMUH+AQLVv15ZHgeBTfvbsOUNfPdCyZQs1jP0GjwjhJoDFsX50UNA2Gd1PaJ/24bDB/AcLkTdGDVeuXJPi9WndT3CEfbleXXoU8nTKjL7RLUD9C/UqiOWTJ2F8P5nTPMRcW2MRK0EQchUNeLALgiCYj4iVIAiaQMRKEARNIGIlCIImyJGpC9I7ThAEc8iMVuSQWElTBEEQTJMZrcgRsYqPF7ESBME0mdGKHIus9ItvBUEQ0gIakeuRFcCs1+fp8CkIgnaANqR2ejBFjq4N1OniJMISBCEF0ARoQ2bJ8akLOl7pn0A2NtZsGWyVyUaigiBoH4z6IeVDjeqfDsA9l3lWeHM6naSEgiD8c2RSqCAImkDEShAETSBiJQiCJhCxEgRBE4hYCYKgCf4P4EyqXjAsEDEAAAAASUVORK5CYII="}}]); \ No newline at end of file diff --git a/assets/js/ea69cd8d.ff01e187.js b/assets/js/ea69cd8d.ff01e187.js deleted file mode 100644 index 56d3a4b9..00000000 --- a/assets/js/ea69cd8d.ff01e187.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["8968"],{1980(e,n,i){i.r(n),i.d(n,{metadata:()=>s,default:()=>j,frontMatter:()=>h,contentTitle:()=>p,toc:()=>x,assets:()=>u});var s=JSON.parse('{"id":"configuration/clients/discord/discord-app","title":"Discord (App)","description":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","source":"@site/docs/configuration/clients/discord/discord-app.mdx","sourceDirName":"configuration/clients/discord","slug":"/configuration/clients/discord/discord-app","permalink":"/multi-scrobbler/configuration/clients/discord/discord-app","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-app.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Discord (App)","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Discord","permalink":"/multi-scrobbler/configuration/clients/discord/"},"next":{"title":"Discord (Headless)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-headless"}}'),r=i(4848),o=i(8453),t=i(8194),c=i(698);let l=[];function d(e){let n={li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{DetailsAdmo: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.")}("DetailsAdmo",!0),(0,r.jsxs)(i,{type:"warning",summary:"Insecure Communication",children:[(0,r.jsxs)(n.p,{children:["This method of exposing Discord IPC is ",(0,r.jsx)(n.strong,{children:"not secure"}),". There is no authentication used for the traffic relayed to/from the opened TCP port."]}),(0,r.jsx)(n.p,{children:"You should only use this method if you trust the network your machine is on. Additionally:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Do"})," use a firewall to limit source (IP) of incoming traffic to this TCP port"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Do not"})," expose this port to the public internet"]}),"\n"]})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}let h={title:"Discord (App)",toc_min_heading_level:2,toc_max_heading_level:5},p,u={},x=[{value:"Required Setup",id:"required-setup",level:2},{value:"Discord Application",id:"discord-application",level:3},{value:"Discord Connection",id:"discord-connection",level:3},{value:"Find IPC Connection",id:"find-ipc-connection",level:4},{value:"Pass IPC to Multi-Scrobbler",id:"pass-ipc-to-multi-scrobbler",level:4},...l,...l,...l,{value:"Optional Setup",id:"optional-setup",level:2},{value:"Artwork",id:"artwork",level:3},{value:"Artwork URL Types",id:"artwork-url-types",level:4},{value:"Configuration",id:"configuration",level:2}];function m(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",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.R)(),...e.components},{Config:s,Details:l,DetailsAdmo:d}=n;return s||f("Config",!0),l||f("Details",!0),d||f("DetailsAdmo",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["This scrobbler uses ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"/configuration/clients#now-playing",children:"Now Playing"})})," functionality to set your Discord ",(0,r.jsx)(n.a,{href:"https://docs.discord.com/developers/rich-presence/overview",children:"Rich Presence"})," to the music you are currently monitoring with multi-scrobbler."]}),"\n",(0,r.jsx)("img",{src:i(6170).A,height:"127"}),"\n",(0,r.jsxs)(n.p,{children:["This integration uses an ",(0,r.jsx)(n.strong,{children:"existing Discord application"})," to set your Rich Presence."]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Check the ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord",children:"main Discord docs page"})," for a comparison between ",(0,r.jsx)(n.strong,{children:"App"})," and ",(0,r.jsx)(n.strong,{children:"Headless"}),"."]})}),"\n",(0,r.jsx)(n.h2,{id:"required-setup",children:"Required Setup"}),"\n",(0,r.jsx)(n.h3,{id:"discord-application",children:"Discord Application"}),"\n",(0,r.jsxs)(n.p,{children:["You must create a ",(0,r.jsx)(n.a,{href:"https://docs.discord.com/developers/quick-start/overview-of-apps",children:"Discord App"})," in order to use this integration. Creating an App is free and simple."]}),"\n",(0,r.jsxs)(n.p,{children:["Go to the ",(0,r.jsx)(n.a,{href:"https://discord.com/developers/applications",children:"Discord Developer Portal"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'Click on "New Application" and give it a name'}),"\n",(0,r.jsxs)(n.li,{children:["Copy the ",(0,r.jsx)(n.strong,{children:"Application Id"})," (Client Id) shown after creation"]}),"\n",(0,r.jsxs)(n.li,{children:["Add this Id to your Multi-Scrobbler config","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Env Config => ",(0,r.jsx)(n.code,{children:"DISCORD_APPLICATION_ID=12345678"})]}),"\n",(0,r.jsxs)(n.li,{children:["File Config => ",(0,r.jsx)(n.code,{children:'"applicationId": "12345678"'})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"discord-connection",children:"Discord Connection"}),"\n",(0,r.jsx)(n.p,{children:"This integration uses an existing, running Discord application to communicate with Discord and set Rich Presence. Multi-scrobbler must be able to communicate with the Discord application, either by being on the same machine or over a network."}),"\n",(0,r.jsxs)(t.A,{groupId:"discordType",queryString:!0,children:[(0,r.jsxs)(c.A,{value:"container",label:"Containerized Discord",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://kasm.com",children:"Kasm Workspaces"})," provides a self-hostable ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/kasmweb/discord",children:"Discord container image"}),". This image provides a desktop-like experience, through browser-based VNC, to use the official Discord application."]}),(0,r.jsx)("img",{src:i(9255).A,height:"400"}),(0,r.jsxs)(n.p,{children:["This containerized approach can be used instead of configuring MS to use a ",(0,r.jsx)(n.a,{href:"./?discordType=native#discord-connection",children:"Native Discord"})," application on a specific machine."]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Advantages"})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Setup is much simpler","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Discord runs in the same stack as multi-scrobbler"}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Configuration is copy-paste."})," Skip all of the ",(0,r.jsx)(n.a,{href:"#discord-connection",children:"Discord Connection"})," instructions."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Get a ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord/discord-headless",children:"Headless"}),"-like experience without needing to break Discord TOS"]}),"\n"]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Disadvantages"})}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Image only available for x86 arch"}),"\n",(0,r.jsx)(n.li,{children:"Image and container are large (1GB+)"}),"\n",(0,r.jsxs)(n.li,{children:["Discord does not notify ",(0,r.jsx)(n.em,{children:"other"})," clients of notifications in a channel if ",(0,r.jsx)(n.em,{children:"any"})," client is viewing that channel.","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"To avoid this, make sure your container discord instance is not viewing any server/channel/dm."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:['Sometimes, Discord does not deliver "notifications you missed" to mobile because this depends on ',(0,r.jsx)(n.em,{children:"all"})," clients being offline."]}),"\n"]}),(0,r.jsx)("h2",{children:"Setup"}),(0,r.jsxs)(n.p,{children:["Setup is basically the same as using the instructions for ",(0,r.jsx)(n.a,{href:"./?osType=linux&discordType=native#find-ipc-connection",children:"Discord on Linux"})," with ",(0,r.jsx)(n.a,{href:"./?osType=linux&discordType=native#pass-ipc-to-multi-scrobbler",children:"MS on Same Host (Docker)"}),"."]}),(0,r.jsx)("h3",{children:"1. Add Discord Service to Multi-Scrobbler Docker Compose Stack"}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Detailed Explanation"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Add the ",(0,r.jsx)(n.code,{children:"kasmweb/discord"})," service to your compose stack","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Mount the directory containing Discord's unix socket to a named volume"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["Configure MS to use Discord's unix socket","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Mount the unix socket volume into MS's container"}),"\n",(0,r.jsxs)(n.li,{children:["Add ENV ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," to point to the mounted volume"]}),"\n"]}),"\n"]}),"\n"]})]}),(0,r.jsxs)(n.p,{children:["Use this example ",(0,r.jsx)(n.code,{children:"docker-compose.yaml"})," to modify your existing multi-scrobbler ",(0,r.jsx)(n.code,{children:"docker-compose.yaml"}),":"]}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Example"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:'services:\n multi-scrobbler:\n image: foxxmd/multi-scrobbler:latest\n environment:\n # ...\n - DISCORD_APPLICATION_ID=12345678\n # add below line\n // highlight-start\n - DISCORD_IPC_LOCATIONS=/run/discord-ipc-0\n // highlight-end\n volumes:\n # ...\n # add below line\n // highlight-start\n - kasm_run:/run\n // highlight-end\n # ...\n\n # .. add discord service below\n // highlight-start\n kasmcord:\n container_name: kasmcord\n image: kasmweb/discord:1.14.0\n ports:\n # VNC port to use in web browser\n - 6901:6901\n shm_size: 512m\n environment:\n # set a password for VNC access\n VNC_PW: hunter2\n XDG_RUNTIME_DIR: /run/user/1000\n volumes:\n - kasm_run:/run/user/1000\n - kasm_config:/home/kasm-user/.config\n user: "0"\n entrypoint: sh -c "chmod 700 /run/user/1000 && chown -R kasm-user:kasm-user /run/user/1000 && chown -R kasm-user:kasm-user /home/kasm-user/.config && su kasm-user -c \'/dockerstartup/kasm_default_profile.sh /dockerstartup/vnc_startup.sh /dockerstartup/kasm_startup.sh\'"\n\nvolumes:\n kasm_run:\n name: kasm_run\n kasm_config:\n name: kasm_config\n // highlight-end\n'})})]}),(0,r.jsx)(n.p,{children:"Then re-deploy your stack."}),(0,r.jsx)("h3",{children:"2. Login to Discord"}),(0,r.jsxs)(n.p,{children:["Navigate in your browser to the IP/host Multi-Scrobbler/Discord are running on. Use the ",(0,r.jsx)(n.code,{children:"port"})," set in the ",(0,r.jsx)(n.code,{children:"kasmcord"})," service:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"# basic auth login\n# user: kasm_user\n# pass is what was set in env VNC_PW\nhttps://192.168.MY.HOST:6901\n"})}),(0,r.jsx)(n.p,{children:"Login to Discord normally. After login is complete MS should connect automatically when a Now Playing event happens. If it does not or reports authentication failure then restart MS (but not Discord)."}),(0,r.jsxs)(n.p,{children:["If MS works then you are done and can move on to ",(0,r.jsx)(n.a,{href:"#optional-setup",children:"Optional Setup"}),"."]})]}),(0,r.jsxs)(c.A,{value:"native",label:"Native Discord",children:[(0,r.jsx)(n.p,{children:"Use this method if you want to connect MS to Discord running on a physical desktop."}),(0,r.jsxs)(d,{type:"tip",summary:"Local MS Installation Requires No Config",children:[(0,r.jsxs)(n.p,{children:["If MS was ",(0,r.jsx)(n.a,{href:"/installation#local-installation",children:"installed locally"})," (not Docker) on the same machine as the Discord application then MS should ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"automatically detect the correct method"})," and ",(0,r.jsx)(n.a,{href:"#pass-ipc-to-multi-scrobbler",children:"use it"})," ",(0,r.jsx)(n.strong,{children:"without"})," any configuration from you. This will work for ",(0,r.jsx)(n.strong,{children:"any OS"}),"."]}),(0,r.jsx)(n.p,{children:"If MS cannot determine this automatically, follow the steps for your OS below."})]}),(0,r.jsx)(n.p,{children:"Follow the sections below to configure MS for your specific environment."}),(0,r.jsx)(n.h4,{id:"find-ipc-connection",children:"Find IPC Connection"}),(0,r.jsxs)(n.p,{children:["Discord uses OS-specific methods to communicate with other applications on the same host, called ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Inter-process_communication",children:"IPC"}),". You may need to determine some details about the IPC method in order for MS to communicate with it correctly."]}),(0,r.jsxs)(t.A,{groupId:"osType",queryString:!0,children:[(0,r.jsxs)(c.A,{value:"linux",label:"Discord on Linux",children:[(0,r.jsxs)(n.p,{children:["On Linux, Discord uses a ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Unix_domain_socket",children:"Unix Socket"})," for IPC."]}),(0,r.jsx)(n.p,{children:"With Discord running, run this command:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ sudo netstat -apeen | grep discord\n\nunix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket\nunix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0\n"})}),(0,r.jsx)(n.p,{children:"We see that the path we need is:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/run/user/1000/discord-ipc-0\n"})})]}),(0,r.jsxs)(c.A,{value:"macos",label:"Discord on MacOS",children:[(0,r.jsxs)(n.p,{children:["On MacOS, Discord uses a ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Unix_domain_socket",children:"Unix Socket"})," for IPC."]}),(0,r.jsx)(n.p,{children:"With Discord running, run this command:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"$ sudo netstat -apeen | grep discord\n\nunix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket\nunix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0\n"})}),(0,r.jsx)(n.p,{children:"We see that the path we need is:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/run/user/1000/discord-ipc-0\n"})})]}),(0,r.jsxs)(c.A,{value:"windows",label:"Discord on Windows",children:[(0,r.jsxs)(n.p,{children:["Windows uses ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes",children:(0,r.jsx)(n.strong,{children:"Named Pipes"})})," for IPC. These aren't easily iteratable without external software, like ",(0,r.jsx)(n.a,{href:"https://github.com/sensepost/pipetap",children:"Pipetap"}),"."]}),(0,r.jsx)(n.p,{children:"The syntax for a named pipe is like this:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\\\\.\\pipe\\app_named_pipe_foo\n"})}),(0,r.jsx)(n.p,{children:"and Discord's names follow this pattern:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\\\\.\\pipe\\discord-ipc-0\n"})}),(0,r.jsxs)(n.p,{children:["Where ",(0,r.jsx)(n.code,{children:"0"})," increments for each different instance of Discord (official, canary, nightly, etc...)."]}),(0,r.jsxs)(n.p,{children:["The default Discord pipe name is: ",(0,r.jsx)(n.code,{children:"discord-ipc-0"})]})]})]}),(0,r.jsx)(n.h4,{id:"pass-ipc-to-multi-scrobbler",children:"Pass IPC to Multi-Scrobbler"}),(0,r.jsxs)(n.p,{children:["After ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"finding your IPC connection path"})," you will need to make it accessible to Multi-Scrobbler."]}),(0,r.jsxs)(t.A,{groupId:"osType",queryString:!0,children:[(0,r.jsx)(c.A,{value:"linux",label:"Discord on Linux",children:(0,r.jsxs)(t.A,{groupId:"msConnection",children:[(0,r.jsxs)(c.A,{value:"remote",label:"MS on Different Host",children:[(0,r.jsx)(a,{}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.a,{href:"https://linux.die.net/man/1/socat",children:(0,r.jsx)(n.code,{children:"socat"})})," to bidirectionally relay communication from Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0\n"})}),(0,r.jsxs)(n.p,{children:["In your MS docker compose file add the ",(0,r.jsx)(n.code,{children:"host:port"})," of the host running Discord/",(0,r.jsx)(n.code,{children:"socat"})," to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655\n"})})]}),(0,r.jsxs)(c.A,{value:"local-docker",label:"MS on Same Host (Docker)",children:[(0,r.jsxs)(n.p,{children:["In your MS docker compose file, pass the path of Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," as a volume and add this path to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," in ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=/run/discord-ipc-0\n volumes:\n - /run/user/1000/discord-ipc-0:/run/discord-ipc-0\n"})})]}),(0,r.jsx)(c.A,{value:"local",label:"MS on Same Host (Non-Docker)",children:(0,r.jsxs)(n.p,{children:["No configuration is required. If MS does not automatically work for you then try the ",(0,r.jsx)(n.strong,{children:"MS on Same Host (Docker)"})," method using the ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," environment variable."]})})]})}),(0,r.jsx)(c.A,{value:"macos",label:"Discord on MacOS",children:(0,r.jsxs)(t.A,{groupId:"msConnection",children:[(0,r.jsxs)(c.A,{value:"remote",label:"MS on Different Host",children:[(0,r.jsx)(a,{}),(0,r.jsxs)(n.p,{children:["Use one of the methods below to setup ",(0,r.jsx)(n.code,{children:"socat"})," on your macOS machine."]}),(0,r.jsxs)(l,{children:[(0,r.jsxs)("summary",{children:[(0,r.jsx)(n.code,{children:"socat"})," installed natively"]}),(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://formulae.brew.sh/formula/socat",children:(0,r.jsx)(n.code,{children:"socat"})})," using homebrew to use it as a native command on your host."]}),(0,r.jsxs)(n.p,{children:["Then, use ",(0,r.jsx)(n.a,{href:"https://linux.die.net/man/1/socat",children:(0,r.jsx)(n.code,{children:"socat"})})," to bidirectionally relay communication from Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0\n"})})]}),(0,r.jsxs)(l,{children:[(0,r.jsxs)("summary",{children:[(0,r.jsx)(n.code,{children:"socat"})," in Docker"]}),(0,r.jsxs)(n.p,{children:["Use the ",(0,r.jsxs)(n.a,{href:"https://hub.docker.com/r/alpine/socat",children:[(0,r.jsx)(n.code,{children:"socat"})," container"]})," in combination with the Discord ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," found earlier:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"services:\n socat:\n image: alpine/socat\n ports:\n - \"6655:6655\"\n volumes:\n - /run/user/1000/discord-ipc-0:/run/discord-ipc-0\n command:\n - '-v'\n - 'TCP-LISTEN:6655,reuseaddr,fork'\n - 'UNIX-CONNECT:/run/discord-ipc-0'\n"})})]}),(0,r.jsxs)(n.p,{children:["In your MS docker compose file add the ",(0,r.jsx)(n.code,{children:"host:port"})," of the host running Discord/",(0,r.jsx)(n.code,{children:"socat"})," to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655\n"})})]}),(0,r.jsxs)(c.A,{value:"local-docker",label:"MS on Same Host (Docker)",children:[(0,r.jsxs)(n.p,{children:["In your MS docker compose file, pass the path of Discord's ",(0,r.jsx)(n.a,{href:"#find-ipc-connection",children:"unix socket"})," as a volume and add this path to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," in ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=/discord-ipc-0\n volumes:\n - /run/user/1000/discord-ipc-0:/run/discord-ipc-0\n"})})]}),(0,r.jsx)(c.A,{value:"local",label:"MS on Same Host (Non-Docker)",children:(0,r.jsxs)(n.p,{children:["No configuration is required. If MS does not automatically work for you then try the ",(0,r.jsx)(n.strong,{children:"MS on Same Host (Docker)"})," method using the ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," environment variable."]})})]})}),(0,r.jsx)(c.A,{value:"windows",label:"Discord on Windows",children:(0,r.jsxs)(t.A,{groupId:"msConnection",children:[(0,r.jsxs)(c.A,{value:"remote",label:"MS in Docker",children:[(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["While it is possible to use ",(0,r.jsx)(n.a,{href:"https://forums.docker.com/t/volume-mount-path-error/143626/3",children:"named pipes directly in Docker"})," this has not been tested and ",(0,r.jsx)(n.a,{href:"https://github.com/docker/for-win/issues/6813#issuecomment-632859857",children:"may only work for windows containers"}),". If you are adventurous, try this out and if you can get it working please ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/issues",children:"report your findings in an issue."})]})}),(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsxs)(n.p,{children:["This method is ",(0,r.jsx)(n.strong,{children:"experimental"})," and may be buggy and prone to crashes. If you are a Windows or Rust developer please consider helping improve the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/named-pipe-to-tcp-proxy",children:"pipe proxy implementation"}),"."]})}),(0,r.jsx)(a,{}),(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/named-pipe-to-tcp-proxy",children:(0,r.jsx)(n.strong,{children:"pipeProxy"})})," to connect to the Discord named pipe and expose it on a TCP port."]}),(0,r.jsxs)(n.p,{children:["Download the latest ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/named-pipe-to-tcp-proxy/releases",children:(0,r.jsx)(n.code,{children:"pipeProxy.exe"})})," from the releases page."]}),(0,r.jsx)(n.p,{children:"The host/ip should be the IP of the machine running discord."}),(0,r.jsx)(n.p,{children:"Run pipeProxy from the windows command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'pipeProxy.exe --pipe "\\\\.\\pipe\\discord-ipc-0" --tcp "192.168.0.100:6655"\n'})}),(0,r.jsxs)(n.p,{children:["In your MS docker compose file add the ",(0,r.jsx)(n.code,{children:"host:port"})," of the host running ",(0,r.jsx)(n.code,{children:"pipeProxy"})," to ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," ",(0,r.jsx)(n.code,{children:"environment:"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n # ...\n DISCORD_IPC_LOCATIONS=192.168.0.100:6655\n"})})]}),(0,r.jsx)(c.A,{value:"local",label:"MS on Same Host (Non-Docker)",children:(0,r.jsxs)(n.p,{children:["No configuration is required. If MS does not automatically work for you then try the ",(0,r.jsx)(n.strong,{children:"MS in Docker"})," method using the ",(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})," environment variable."]})})]})})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"optional-setup",children:"Optional Setup"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Due to the limitations of the Discord local API the other listening activity detection and online status customizations found in ",(0,r.jsx)(n.a,{href:"/configuration/clients/discord/discord-headless#optional-setup",children:"Headless"})," are not available for the Local integration."]})}),"\n",(0,r.jsx)(n.h3,{id:"artwork",children:"Artwork"}),"\n",(0,r.jsx)(n.p,{children:"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible."}),"\n",(0,r.jsx)(n.p,{children:"The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below."}),"\n",(0,r.jsx)(n.h4,{id:"artwork-url-types",children:"Artwork URL Types"}),"\n",(0,r.jsxs)(t.A,{groupId:"artworkUrl",queryString:!0,children:[(0,r.jsxs)(c.A,{label:"External URLs",value:"external",children:[(0,r.jsx)(n.p,{children:"MS can use external URLs for artwork."}),(0,r.jsx)("img",{src:i(6170).A,height:"127"}),(0,r.jsxs)(n.p,{children:["External URLs that are not from known music services are ",(0,r.jsx)(n.strong,{children:"disabled by default."})," This is to preserve ",(0,r.jsx)(n.em,{children:"your"})," privacy because Discord does not host images, it only links to them and the URL is visible to other users."]}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Why Should I Care?"}),(0,r.jsx)(n.p,{children:"There are some scenarios where you may not want your artwork URLs to be visible, for example:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A Source may be accessible only on your LAN (Jellyfin at ",(0,r.jsx)(n.code,{children:"http://192.168.0.101"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"A Source may be internet-facing but you do not want to expose this information to discord/other users"}),"\n",(0,r.jsx)(n.li,{children:"A Source may be internet-facing but requires authentication to view the image"}),"\n"]})]}),(0,r.jsx)(n.p,{children:"MS will use your artwork URLs only if:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["artwork url is from a known music service/",(0,r.jsx)(n.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," or"]}),"\n",(0,r.jsxs)(n.li,{children:["artwork url starts with ",(0,r.jsx)(n.code,{children:"https"})," and","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"artwork"})," (",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK"}),") is"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"true"})," => always uses the url"]}),"\n",(0,r.jsxs)(n.li,{children:["a list of custom domains keywords an external artwork url should contain EX","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ENV => ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),"\n",(0,r.jsxs)(n.li,{children:["File Config => ",(0,r.jsx)(n.code,{children:'"artwork": ["mycdn","jellyfin"]'})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsxs)(l,{children:[(0,r.jsx)("summary",{children:"Examples"}),(0,r.jsxs)(n.p,{children:["None of the below URLs will ",(0,r.jsx)(n.strong,{children:"ever"})," be used because they are not ",(0,r.jsx)(n.code,{children:"https"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"http://foobar.com/cool.jpg <-- NOT allowed, not http\nhttp://192.168.0.112/fun.png <-- NOT allowed, not http\n"})}),(0,r.jsxs)(n.p,{children:["When ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK"})," is not set:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service\nhttps://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service\nhttps://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\nhttps://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set\n"})}),(0,r.jsxs)(n.p,{children:["Setting ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK=true"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- allowed, is https\nhttps://anything.com/neat.jpg <-- allowed, is https\n"})}),(0,r.jsxs)(n.p,{children:["Setting ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK=mycdn,jellyfin"})]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service\nhttp://foobar.com/cool.jpg <-- NOT allowed, not http\nhttps://example.com/cool.jpg <-- NOT allowed, is https but does not contain "mycdn" or "jellyfin"\nhttps://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains "jellyfin"\n'})})]})]}),(0,r.jsxs)(c.A,{label:"Musicbrainz/Cover Art Achive",value:"caa",children:[(0,r.jsxs)(n.p,{children:["MS can try to use ",(0,r.jsx)(n.a,{href:"http://coverartarchive.org/",children:"Cover Art Archive"})," to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you."]}),(0,r.jsx)("img",{src:i(6170).A,height:"127"}),(0,r.jsx)(n.p,{children:"MS will try to use Cover Art Archive if:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an ",(0,r.jsx)(n.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," condition"]}),"\n",(0,r.jsxs)(n.li,{children:["and ",(0,r.jsxs)(n.strong,{children:["the scrobble data contains a ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz",children:"Musicbrainz"})," Release (Album) MBID"]})]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Basically, if MS would normally use the ",(0,r.jsx)(n.a,{href:"./?artworkUrl=ms-default#artwork-url-types",children:"MS Default"})," art, it will first try to use Cover Art Archive if the scrobble has a Release MBID."]}),(0,r.jsxs)(n.p,{children:["Some Source, like ",(0,r.jsx)(n.a,{href:"/configuration/sources/jellyfin",children:"Jellyfin"})," and ",(0,r.jsx)(n.a,{href:"/configuration/sources/plex",children:"Plex"}),', can automatically provide this ID if the music is "matched" in your library.']}),(0,r.jsxs)(n.p,{children:["For all others, you can ",(0,r.jsx)(n.a,{href:"/configuration/transforms/musicbrainz#use-metadata-for-discord-album-art",children:(0,r.jsx)(n.strong,{children:"configure MS to use the Musicbrainz Stage"})})," for Discord to try to get this MBID."]})]}),(0,r.jsxs)(c.A,{label:"MS Default",value:"ms-default",children:[(0,r.jsx)(n.p,{children:"When these conditions are true:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Cannot use an ",(0,r.jsx)(n.a,{href:"./?artworkUrl=external#artwork-url-types",children:"External URL"})," and"]}),"\n",(0,r.jsxs)(n.li,{children:["Cannot get album art from ",(0,r.jsx)(n.a,{href:"./?artworkUrl=caa#artwork-url-types",children:"Cover Art Archive"})," and"]}),"\n",(0,r.jsx)(n.li,{children:"Play does not contain artwork information (no artwork shown in dashboard)"}),"\n"]}),(0,r.jsx)(n.p,{children:"The status artwork will use a default URL instead of your artwork URL."}),(0,r.jsxs)(n.p,{children:["Without any other configuration, the default URL is an icon from the ",(0,r.jsx)(n.a,{href:"https://github.com/FoxxMD/multi-scrobbler/blob/master/assets/default-artwork.png",children:"multi-scrobbler repository"}),":"]}),(0,r.jsx)("img",{src:i(8239).A,height:"127"}),(0,r.jsx)(n.p,{children:"This default image can be customized:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["ENV Config => ",(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png"})]}),"\n",(0,r.jsxs)(n.li,{children:["File Config => ",(0,r.jsx)(n.code,{children:'"artworkDefaultUrl": "https://cooldomain.com/art.png"'})]}),"\n"]}),(0,r.jsx)(n.p,{children:"Remember, this URL need to be accessible on the public internet."})]})]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(s,{config:"DiscordClientConfig",fileContent:'[\n {\n "name": "Desktop",\n "enable": true,\n "id": "myDiscordLocal",\n "data": {\n "applicationId": "8190211179716453570",\n "ipcLocations": ["192.168.0.105:6655"]\n }\n }\n ]\n ',client:!0,name:"discord",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:"Type"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{style:{textAlign:"left"},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.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"DISCORD_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A globally unique ID EX ",(0,r.jsx)(n.code,{children:"myComponentId"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_NAME"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsxs)(n.td,{children:["Value of ",(0,r.jsx)(n.code,{children:"DISCORD_ID"})]}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A vanity name EX ",(0,r.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.em,{children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"DISCORD_APPLICATION_ID"})})})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"Application ID"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_IPC_LOCATIONS"})}),(0,r.jsx)(n.td,{children:"string"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A commera-separated list of ",(0,r.jsx)(n.code,{children:"host:port"})," network locations or file paths to unix socket for Discord"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK"})}),(0,r.jsx)(n.td,{children:"boolean"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{style:{textAlign:"left"},children:"A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{style:{textAlign:"left"},children:(0,r.jsx)(n.code,{children:"DISCORD_ARTWORK_DEFAULT_URL"})}),(0,r.jsx)(n.td,{children:"string or boolean"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{style:{textAlign:"left"},children:["A URL of an image to use as a fallback if the album art URL cannot be used. Or ",(0,r.jsx)(n.code,{children:"false"})," to use discord's default."]})]})]})]})})]})}function j(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(m,{...e})}):m(e)}function f(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},9255(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/discord_kasm-d89313fd253b623d4bff7edffb3b277d.png"},6170(e,n,i){i.d(n,{A:()=>s});let s=i.p+"assets/images/discord_presence_art-3260bd6302b2f0d1f13b45762cc908de.png"},8239(e,n,i){i.d(n,{A:()=>s});let s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAAB/CAYAAAC3zOThAAAALXRFWHRDcmVhdGlvbiBUaW1lAFR1ZSAxNyBGZWIgMjAyNiAwMzo1MzoxMiBQTSBFU1SzzP6eAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAJChJREFUeJztnQd8FNUWxk96hYSSAIHQe0kAQ1NEpAsIAqIUaVKkIwI+8SnwaCqgFEEFQWkiSpMuIIQmvffeQighEEJ6skne/U6yyyYk2Y1JyA6e/++3MjuZndmNs1/OOffe79j6+PolJiaSgv9D7u5upNMlbQuCIFgKtiQIgqABRKwEQdAEIlaCIGgCEStBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0ATPRaysrKzJxsaa/7WysiJBEP5dYE1fYmICxccn8L//hBwXK1tbW7K2tiFBEP69IEixsrJhLUhIiCedTkeZxZpyEFtbOxEqQRBSAE2ANmT6dZRDJEVUOaqFgiBoFGgDNCJTr6EcALUpiagEQcgIaAS0wuzjKQdAMV0QBMEUmdGKHCmwZ0YtBUH495IZrcghsZLpCYIgmCYzWiGTQgVB0AQiVoIgaAIRK0EQNEGuVMJdnJ1pp/9m8vIq8szP3mrbmr75+kvKSZ7HNcxl+IeD6bPPPs7wmDZtWtGsmVN5G7+zbVvXkylq+dWkefO+5d9zIU9PWrliKVWuXJEEQatY3LDduXMXaPt2/wyPmTplEjVoUJ9y8hrmktX3klO0b9+Gzpw+R40ataT7QUG0YeOfdDsgkARBq1hcGnjp8hV+ZEShQh6UlQFHc66RmlKlSlKJEt60c+ceys73klM4OjpSwO3blJDUFJIWLlxKgqBlLE6skPI0adyQhg4bRXXq+FHPnu9RqZIl6MTJ0zR58jRa8fticnBwoP+N+y/FxMRQ8xZvUdGiXjR4UD/y9fWhM2fP0Yzps+nO3XucXiHltFfHe3p40Lr1G2nFijUproHtVi2bU8jjx3zM1avXaNLkpJRr4MC+VP+Vl+nJkydkb29P/v67UrzXLX/+8cx7Qfo1eHB/la4VpgAVyUydNoPOn79o1md3cLCnQYM+oNdUpPbgQTD9MHcBHTlyLN3jmzR5nbp360zde/Tj50OG9OfPi3SveHFvqlHDlzq0b0vvdetDmzaupkGDP+L3OW/uLNp/4DB5FytKcXFxNGHiVxQU9IAEwZh8+dwpJOTxM/uA8X7sy5cvH127dp1yEouevdlNfREXL/6V+vQdzF8mWEtAEG7dCqCx4ybxNpgw/nPasnU7denai44fO6lEaGCK84wYMZq/kN27dUnzOvhlT540lfr0GUh+SmzwZYcAtmrZgkaOHE3TZ8ymwoUL0ZKly1O8Lq33Mnz4ENq3/wB1696XTp0+Q0OHDiBzGTZsEAtjz14f0I/zf6ZRI4eRjU36y5b8/XeTu7s7+fpU5eMaN2pIq9esZ/E6fvwkzZz1HQtValxcXGj1qrXUf8AwCgsLp2ZNG5MgGFOzZg0aNeojfhij31e6dCnDvg4d2qnvTi9q3Ph1ykksejTw0sUr1L17Z6697N79N3+xUlO2bGn1iytJ48Z+atiHqETP9es3+d979+5TnjyuHCGlBj97EhbG249VhOXhUZAePQpJ8t9JgP8OmQXei5tbXvpx3s+cfn3//Y8c0RQokJ8ePnxk8vV169Si/Pnz0XtdOxn2IfpJj/j4eNqhor3mLZqq9+zB17h06TKZQqeLp/MXkqK9R48e8TUFIS1CQkIM2/qoKvX+p/seU05i0WI169vvqUyZ0tSjRxeaNHEMjRk7kQ4ePJLiGMyAjYiIpFatO1B2EhMdQ8HBD2npkvlsHPbj/IUmX4P3Eh+vM9SJ4mLjDPuNcXd3U6IYytuuri4cTSUdRzR4yAg6c+ZciuN9fKule821azfSzBlTVO3Mk7aq6FIQsoNjx46rP/TXUwgQtqdO/cawrWfVqjWSBg7o34ceqWhhzJiJ6hdxgyMegC+6q6srK/3ly1c5CkI0gprPOx3bc/qUVV56qQbdvBlATZu1oWbN23KtKy1Sv5eQkFBq3boF/6xT545cr4Lo6SmjwufFi+ZxnaxatSp8nVOnzvLPDqg6Utcu73BKh3odpitgGxGU3k4jXkVFWPxpl/z8+vUbdO/+fapapRJt3ryVBCG7SCtSwr7U+/E8p4UK5KpYLfvlJ54HpH/UrFk9xc8xmrVs2U+0Yf0KunPnLvnv2M3716i6TM8eXWn+j3P4+ehPx1KVKhVp/boV1KnT27Ttr6xPS7gVcJtee62+4b0tWTyfatf2e+a41O9l/IQvqff7Pfg1bdu2oslfTEtx/FX1P3Wlqhd17NhO1cnG0fYdO8l/Z9LnmjFzDj1QwrZ61TKuw+3e8zcL1dmz59VoZAma8tUEleI+oMDAu+q6vxrOeezoCfp730FDKisILyJWPr5+iUlZS1LqghRFpzOzSJMO9vYOpHVGjhjKEdtPPy/h52PGjFapYTR9NWU6WRKI6L6dNY2+USOgx46dIEHQGrGxMWYdJ2KVDhgN7NunJzk4OlBiQiJFY8h/3k9cjLcUMK2jbZtW9Mcf62nR4mUkCFpExEoQBE1grljJQmZBEDSBiJUgCJpAxEoQBE0gYiUIgiYQsRIEQROIWAmCoAlErARB0AQiVoIgaAIRK0EQNIGIlSAImsCixArrfpLW/mRtuU/OYsX+VNJ1WhCeLxYhVrBBiYmOosioCPYIT0xIIIvEKslIz97ekVxcXNl/3cZGglNBeB7k+jctLi6WgoLu0Z3AmxQZGUFaAILl6ORMXl7e5OnplaZVsiAI2Uuumu8hooJQ3bh+STNCBZCqRqn3G3DrOt27d5vidTrKKlWrVKYF87/nB7rS6ClWrKhhf1rmfxkB73c98Fmf/s1X1L59W8oqaDiBqFIQnie5KlZI/RBR6bLhy54bwNriYXAQhYU/oayS30hYfH2eeq7XqP5UuDLT2GHSxHH07rtvp9gHgbG3y1oUWP+VejRj+pQUQigIz4NcSwMRnaBGpaWIKi34M0SEk7t71r68+dyTOofcCgggX6MGEVWrVuZ9xb29yd3N3ezz5c2bhwLvPH0O19OBgz6krJJHndfa2qKt+4UXFJtChb3GGe9AJ9+s1rfNKTpDrB4/DlFfIm0318TnyJPXPctiVbdubW5MunHDZqpV6yU6efI0R5ydO79D27fv5DZfT8KeGJqeIsrq0vld6tWzG9Wu40d2dnZs2u/tXYzTPTz3KlKE2rZpTQnxCXTj5i2aN3c2Odg7UHBwMM2a+TVHWefOX+DzfdCvN/Xt04v+2u5Pb77Zkrp2eZc6qcgMDS3Cw8Pp7t17NGTwAGrUqCEf3+j116h5sya0adMWft6gQX3q9l5n6tixPb+HgIDb3HUI9Txc16NgQXqr7Zvc2GPbXzuoikp7e7/fnbqo69StU5s/K3owCv8+UA4yh1z8E5louaN+meDpdIusAYfW8PAIOnL0OJ+venUflQL6cBRz8NBhevIkzBB9OTk50uhPRnEEtuaP9XQ7IJA6d+pIHTq8xc1gZ8yczaOqly5f4W283hgcc/t2IHfXARgwqFKlEjemwOuqVa1Cl69cpV9+Wc7i1q/v+yyO6GiNJhZg8eJfaM5383i7efOm1KN7V+5ysmLlGqpYoTz999OP+TPpgRgfOnyEFi9ZxsKEhrP4nDhPaGioEtbCJAgZIePu2UxcbCzFJ8Sr+pBjpuZiQYjQPxAPtNeCYCB1Q0SD5qXY754sVr6+Piwei9QXfffuvdzWvph3Ua4nrVr1B50+fZb/WoWFhfE2SD1iieYSbdq04tqTp6cnF82PJgvl1GnTKSoqmo8LV9HRoIH9qGTJktxLLigoiPdDzNBxCLxa/2VuLPvd9/P49RERETRwQD+OEHft2svH7Nt3gDZu/NNwfbQWQ39FNK79+ptZ2SL4wouNiFU2AqG6eesqRYSHUclS5VTdyN1swcqbN6/68icVmU6dOsNCgsale/fu432hoU84TQQQFmDcqy3g1m0qWteLzGX/gYN8jZdq1qCCBQtQXFwcHVViBMqVK0sNXq1PnoU8qJASMuCYweifk5MTXb9xwyA4V69e43/RT1EPokZjZs6awz0ehw8fomprd+j331fTmTNnSRDSQyql2UhMbLSKgB6rWtwjFixzowU0MkVBHIIEkC4h/XN2dqYTJ0/xPqRKiEbQnl7fZNLLq4jhHBA2fZdngGtbUfpCiVQQhXsfn6qqiF+Fzp27wClg3jx5VCT1AeVV19m//2CKaCjpxEn/GIswoj5PTw/Dc3QGAogMM7r+l199TSNHfUrhYREq1exlaOQqCGkhd0c2gpZdlCxQCVyPM0+sCuTPz19+CBK4fz+I1q7dQPYO9nTx4mXepxeigqpQffr0GS56o6CNKAtdnsuWLUNbt/5lOCeEr0KFctS48eucuunPY8zxYye5mA5h3LBxc9L5PQqyaBxXaeLFS5e5tmTMo5AkAWrd6g0KVMONeB3Sx3bt2tDgQf3plHpvKOpD+I6n08fQ2dmJp1YcUrU0HI/fEz6/uYVW4d+JRFYWQAGVhgF9ZAVQzF658mnLer2QQdiQss369ns6rdKmdm+9yRNHcfwfSuD0bNq8hdOzLmo0sUCBAmle98DBQyxUEAkIDkC9bNu2HdRMjfR9pFK0GzdupngNal0Y6cMEVXSsBn9u2ca9C9FwtePb7eiKqmchzUuvQ3RkZBT99ttKekXV2D4cNpjT2yVLfpW6lZAhudY3MEEVoe8EBqj6xgXSOiVKllUF6LIU9iSULl8+q4rGT6hMmYrkVdRbiYENCYKQPv/qvoFIY8qUraTqKIXNEouIiHBe8hMcHESCIFgmL2Qa6OTkwq4I5kY1ONbFNS8JgmC5vJgFdivDfwRBeEGQ0UBBEDSBiJUgCJpAxEoQBE0gYkVJbqVYKmMJjB37KV28cJmW/7bimZ+98UYzqlGjOm+XKO5NN5NdCnb676Z9+w+kOBYLiWd9+x3pdPH08ajh9L/xk+mfUrZMaWrTpjW5urrwer7jx0/Q5s1bkye+ps3/xn1GkyZPUcPSsSm2zWXC+DH0+Zjxz+zH4uumTRqTg4M9zw87dPgo7dy5m4QXnxderB49CqbwsFD+kqUHhOrx44eU2xQpUpiKFS1Krmp0Mi2xgkDgAaZ8NYkmKwFIjx/mzudFwpgYmhUKFy5E3bt3pZ9/XkzXb9zk5Th9+vbinz2zFCeHKVGiOHV8uz3NmDlH/X99xIuzMWs+Nib2GbHOCqVKlaSX69WhX5b9RoLl8MKLVUhIME8+xSRUS+fll+uqL91BqlypIlWsWJ4uXLhE/xQ4NWQHEIf1GzaxUAHMSl+wYKHBAeJ5gmU8EEgIFUCktmTpMhr+4ZBsFSsIvL3YNlsckgZaEHVq16IFPy3khcH16tYxW6xgxeLnV5MFxNrKilMufeoFYMQ3dMgAyuvmRjY21kpsFrGfFWjWrDFVqVxJHWNP/jt30WGVVhmDpTBz5y1IsQ/LgvDAer6uXTtR+XJlKSoqihdDr123IcP3ioXTMOrDmsbLl67Q6jVreX+lihWoc5d3KCY6hhc5p+VWgcgq9XuBNQ2AwMBVtVzZMrTs1995H0Rs2a+/8VrL9K77esMGvHQI+7GA/NHDEGrxRlPK4+pKn6pU+q+/dtChQ0dIyH1ErCyEMqouhC8oFhw/VF+YsWNGs19VgpkGhd7FitHYcRN53WBq4NQAryn4T2FxM9bvTZ8xWwlibXZ8wDYYOmSgEsiLnD7qwXvKqNZ0Sb1fmPRhzdaIj4axz1Z6bgseHgV5PeDs2T/wc1jU1KxZg32y4Bc/Z85cFhYsyoYfVlpggXRqIO5wrUiPjK5bv/7LNGHilyzoELvjx0/S49BQqlOnFqe+guUgYmUh1FM1EnhMAdgOw3SvenVf/kKZA7yg0hKqpPM9NBjlQQwRDUGEfHyqsWsnUj2A12PRs7FYQYTQaCItkcDPbt66RS1bNqeC6nVYyIx/0xMrdPBxVRGM/nrOLs4cocFJIjIykoUKYCE0DPxSE6sGQiCuqd0Z4AVm/J7NvS5ARAjraCzkhlAJloumxcrW1o7c3POpGzGpiUF0TLS6CUM01y0Z77eW30s82taqZQvD/jp1/MwWq8xgY21jaPoAG+WTyZ5ZaQFfdDiBwptdD8TF2cmRHipR6t+/Dy1fvoIL/7A/NgXOt2Ll6hT7UMQ3x3Hh2tXr7AlvnJZ5JFvaQOwye10w7euZVLp0KXZmbfNmS34uWCaaXBuIL3f+Ah7k4+unCtHVyLt4aSpWrKRKpSqoaMFP1TbKaqrxKNKPhw8fUu8+AwyP4cM/5kJ7dnwOOIFCEECFCuU5QkF0cvLUaVXvqmk4rn27tpwyGrNx05+cNqEJBMBo4AAlUMVU2lnUqwgF3X/A0ZqLilZKlCxueB2b/yX/0dBvnz5zjhtF6IXy5Xp1qZL6jKhRFSpUiA0EAaZK6N1Qjdm9Zy83ndC3JMPvptt7XWj7jp38HNGSR7IJIF5fJNnXPb3r4vX4bHBcRa3NjWt6Npz24vMIloXmIivc9AULelIFJVJpddHBPjQ5IA1FV6iP6Bsx6MGoGzrPoHj+99/7KSsgBWz3VhuOQpycnbg2BA4cOMSWQAP691VCX0qlX9eeSafwRV7w02KuZyFlhJj9sXY9j77hy49a0H8+/oijm7vJqSaAtTH2j5/wRYrtlavWUO/3e3CxPDo6mgvmqMst+GkR+2dFqrTs+rUbFPzw2akkEMUtW7bRfz/9D5sPIu3crz4D9oHLl68owW3Dc7TweqTSAGl1WteFKEGwxo//nIJVoX7nrj0s4vjMMFL87LNP1OjjZkkPLQTN+VmhEcNLfq9wQdQccP6cnrogflbPFwgjvOMxAoqGF8eOn6ANGzaToE1eWD+rosVKmC1UwosJIjy0F8MD6R6mPQgvPpoTqwIFPEkQ9GDU8MjRYyS8+GhOrBwdM7l8xCjFFQRBu2huNDCzHVB0ujgSBEH7aE6s0JfPXCBsUVGR0jVFEF4ANCdW9+8Fmr0EBU4K0dFRIlaC8AKguZrVo5BgehB0lzwLeWU4Uz0yMoLu3rnNXlVa4PvvZlHA7du8nc/djXbt3psrw/Gf/GcEOTg6qN+bjhdFYy7Vb7+v5DlOmPNlvFBY66CjNZbgoMehMfgdLF6yzLBESU++fPnog37vcydpUP+VelRG/T6wZOf331eRkLNoTqzi1bD1rVvXOLry8ChMtqmmMSCKCgsLVTdaAD0OfWR2FGYu+fIVpPz5C1KevG7k7OxCdrZ2hgmozi6uPJP+3r07lFkwqqX3p8JavFEjP6TTp8/SzZu3KLOUKpU1P6Yff/zZ8EX19PCgTz4ZQR+N+IT+7YSEhND8BYsMz5s3b0pjxk6QyP05ocm1gahD3bx1lUJV/cotrzs5OjlzBAATvfDwJ0qkQthwLzvbkXt5Fec5XhCo9MBSDUR8eOji4pSG/bMsG4uGL1+5SkWLev0jscpOP6agBw+4dX3+/PlJSJoNb4wI1fNDk2KFGyQmOprTwcchD3lBM1LC+IR4Fqz4eF223UR58uTlhqlubknr0QpaxVM5mziKTbSiCwl2FJGYJEguVglU0TqO7K0S6XK8HQVnYeIqIiusj9Pb9WKZDJbLYHkJHA2W/rKcU4/XXnuVGjZ8VUWb8eysgCUrWBCd2o8Ja+Zat3qDbVQQMeE4TKw0ByxadnR0VIKVNLBRuHBhXjpjY2vLreZ/VSkh7F0CbwfS3uRlQf1UqrRr1x52Q6hcuZJKa93J09ODl62wM4P6PPCtWrhoCZsE2tvb0dsd2rE4x8cncNoZGHiH1zFm9L5hJfPOOx34DxUWMmNBNY5jf6+XavLCcAg31kCuXZvks4Vo6LUG9dlW5u69+5QZcC5YRGOx87Bhg3jNJX7HsJU+cvRomp9ByD407bqAFC8mJpofOYGnZxGqVMmH07yC1vH0um0U+dom1cCQXJbR2dO6OBfuUNjKLpKqqp/pY6mT6mf+OicKTjBvuQ3W3C2Y/73hOWZn6y1TevZ4T9VVvuO1bDC6a/fWm1w3Qloydep09UWNojZvtqI6tf1YMFL7McFnCjbHSDXxJTaVGmNtnR5EVosXPfXVwgLfKeqaiP4+Gj6U6z4Qpm7vdeZrOzk5sjWzvsblqYTp629m8R+TaVMn08KFS1k8IBpYV7hu3Ubq0vld8lfCjCgSa/VgFAhBgFBl9L5REsBnxBpACNcbLZqxoAEsG5s6bQaL26SJ4+jPP7fxe4eH17j/TeLfJTzt3d3cKLPoU3b8nvSpO/4fpfUZhOxD/KzSgYWqsi9v+9nGUFv7iBRtUyFKlW1i6bAuKd3CtnHSB1HzUY+1sS50RGc6JUP0M3LUaN52dnaiFs2bUdOmjejkydOUv0B+tvQFKI9Z2yQJIHyf6tWry+4ChTw9Vep4Jc1zX7t+nXq/35327NnHQmFKrNCoAREKFv1ikfPFS5cNP8OiZL23FZwisDYPtTVEgxAIPxXZGVu4ILrQXw/p5PkLF3kbDp8VK5Tj7fLlyykBiKTatfz4OZpcQNxMvW9YLUOUGzZswFEPojY9EA19FIaoE++toorU8PvUmwliu3y5cpQdpPcZJE3MPkSs0gCpH0dUivp20eRlpaMolfY5W6W88WyVcBS1jjdspwavKa1SQ0e7RNob50jmgkjp8JGktAJfqIjwiDS9mPorITmw/5AaiVqpRqZeJtc8rmmeb82adVwor1S5Iqdws+f8wMJhCnzh76lUCemmv/+uDI+Fg0ODV+uTj281mj79W8oMWJgMJ4fU5oGm3nfbtq3JWYnUhg2blMA7c3SXEUhdc0o80vsMQvahST+rnAY1KoQwiKheU6lfcKINxafTjt6GEvmRFngNXotz4FyZAZ7hQUFB7PVk72DPX1pQrFhRat6sCW9jH9xFMc2gcpVKhtem9mNq3foNNRjxhNO1QBUxIU3DYIA5RfPtO/yVCL1i8jg0unhVHfdEpaBpuXxmxNlz59kpFSCNhHNneu/bGEyjQOoFW5vqvj4mr4OosGbN6gaPMF8lrNlFep9ByD4kskoFRv1QTEeNqpVdBOmMRCpeaZK1emrKKQvSlZBKv3CuGwm26daw4B6AYi3IgwgpES6WM/g5/KdatWrB9SFET8uSpyRASEaOGEZ5VAEaXlR6UvsxofY15vPRPJKFgrbeJws1HtRvMuLMmXPUvVtXk8KGAjeaUOzZu48yC4r0HTq8xQ0eIMY7/Hfy/rTetzGbNm+hzp06cqMMvE9TIFJEBDhh/OcUrQr8BzNoBNG3by/+I6Bn69a/6OzZ85TZzyBkH7nrZ3UngK5eyZyfVU5Tq/arPD0BNaoLOjVK5RBB+3WOVEtFRnvjHKiGqkMVtn46JWJbbNLC6qb2UYZ995QgHVcF9vp2MVzTqmcbTStjXKiibRzXsCwBOH5269aF5nw3l7IDpGGYjzV27ESp0wiZQgN+VlYW55WOCZ8QKkRVlVTB/JwupaUw0jpzppgmJB+bcp8Vn/Nva0ezRwhzEhc1rL9pU/Y0KW3fvi1HfcuXrxShEnKMXBMrCJW9vaNFjZhgZjqoYmPeEh2IUgxENzFp25wCIM69KyFrXZKzA73lb3awevVaEoScJtcK7BApFxdXnn1uKWAJDShtbXrC5MMEa1qlUrvQRGt6TEnbD82ImMw5tyAIz5Kro4GYm1NUFbTNqXE9D/RLaTytTS/TuaeK5TVVHetN+0h+VFe1rB1xjibTRHPOLQjCs+TqaCA60WDyJYrtwcFBFBkVwbOScyst5EXJClerBIpIfLaeFqve1hlVxwqwTiTER4kqutoSZ0/2anDiHVWIj1Up4e44Jz4uNp2PgHMLgpB5cn3qgp29PXkVLa5SMHeKjAinOF1c7tWwMlnwf+ZoqS0LQo5hEfOsEGG5u+fnhyUQrupQVmkoj71SJ6z/81KpHCIsJ+sEqpa8VjBIRVkOqtLewC6Kpy4cS2eJTXiizMMVhH+CRU8KhYNCTGw0T3B8HsCPCjO7g5TYFDJRCC+ifr4DKR/iK/X2IFSv20WbLAIGWcC0BUHQIhYrVhAqeFax5/pzSgthnAcvqmuqeG5KrAqoqKqDqlNtjk0azXzDIdKs0QqcWxCEzGOx3xx4U0WEh3GX4+cFHD4hVmfj7XnWuSkgTiiuI7gyN7nDuQVByDwWK1ZoE1+yVDkWrOy2Js4IOHzCOO+8EpXUC5Tx3BxRsk4+NuW+RD5nerPXsfi1Z49uvNwpKiqafl3+u8HPCmDdWYXy5dj2ZOu27XTixCkyh09Hj6IyZUobnm/f7m/wUIedSfPmTdQghx2v61uyZBlfW9A+Gd1PmDLUq2c3NbBVhEssa9dtpGPHjpt1XlgVYTE4XCZOnT7D3vP6ATFYCuE+xfmD1LXgY5+dLhQWK1aYNJpXjRDmyYOJms9vmE1vRfy3zpEGOYSmWMjcTBXPrc0YMCykCvA41jgx7OQQTnNi0jd669q1E507d54bRZQuXYr69ulFEyd9xT9r0KA+5c+XjyZ/MdWwBu/WrQB2DTWFm5sb9e4z4Jn98H+Cw+fX38xk7yo4kbZRN+Jvv60kQftkdD+92bolhUdE0Lhxk9j08eOPP6JLly5TeHh4huesVq0KO0uMn/AFixAWe8ORA9eAePXu3YPmzl3AHmZYJN/x7XbZ2lzEooemrJK7q1hb2zy3h369IiKgjXEpFx3bmOG4wO87+VhjcK70oyonFTWV5//pAK4JMHKrXLkiP2/cqCGtW7+Rt+FucOjgETacM2bI4AH0xeTxfNPogV1wejdgdHQ0ffnVNENjiOMnTpK3dzEStI+p+wkOEitWrOaMJSTkMd27e5/XdhqT1v1048ZN+nnhYr4HIVZwofAu7s0/q17dh+4E3jVYOSP6r127VorXZxUZR88AOHzu0jmx73pGnlUZeV3htThHRm6hxYsXY9dNY+BjBasR4OnpmSIlhCFe6pvL0dHB4NOkx9vbm6xtrGnc2P/SjOlTqV27NoafIXSHWyfADYW/hMeOmpcKCJaNqfvpSViYwe21QoVylD9/PvbTNyat+wm+YbCr1oPyQlDyfQnv+QdGzTTQrAW+/YULF6LsQoamTACHTxjn6edTGQMnncDkaAnbqd1CnawS1eifnUlbY8ych78Sojr4hc+YMZuioqPIIXkZEmb4gw8+6E2nTp2h0NDQZ24k+I2nBh7tAbdu085deziSeq9rZ7ZK3rZth+GYihXL06iRw1m40OTAHOb+MItv8pwCX4hBg4aT8Cz4k2mqa5Op+0kPml+gKQccWVM3EEnrftKDyA0+YqVKlqClS381XDMyKooFsU/vnuyTFqXuOUeH7FtKJ5GVGUBsZka7cRMIPSj5n1MF83uJtvzAtvEwAI7Fa8zxX4eQoCCKaGf+goXcpAG1KfzPB7jp8ECHlpMnT7FRX1RUlMnzoqb108+LOQ1Aurd+wyby9UnpjnnhwiXqP2Ao16pQjBe0j6n7SQ8af3wy+nOuaTVq1NCsc0OMJk0cy9uTv5hi8LNHpIZrIg1ctPgX3gfL6QiVMmYXElmZCepNK2JdyT8uqRVXTKIVXVRRU1TyGsKNcc50Nd7uaSuuRPMnfwaokTiEy9wkQQkLKKbC6kMHD/P2nbv3eKQFNQNQXNUJzGnzhPOhjZZe2LDuUl+TQ4stj4IFuIED6g+oWXXv3oX/apoSwg/6DyXBcjF1P6FIDsdUfSng/IUL3HTEFJgwPXBAP9q0aQv9pUaVU17zNr3W4FU+J1JKOzWijvTSuHyRVSSyyiQQITiHHot3MPQMBNg+qvbhZ5kRKoC/ShCiV5O9zlELcFNDzleuJlkVHz9+gpo0eZ23EVVhysHB5BtPT1oFURThMQqElBEDFWh/dfjIMf4ZahLde3TloW2A/n4owpoTsQmWjan7qWaN6tRC3QsA90a1qlXp2tXrKc6R1v3k51eTbgcGPiNUAMV2RF2oXYEmjV+n02fOZuu0o1yzNRZSgjZSgwb1V3UFe7K1s+UhYH0khRume7cuVK58Wa4BrFixhvbtP5Di9Wg3zw1IP/nMUH+AQLVv15ZHgeBTfvbsOUNfPdCyZQs1jP0GjwjhJoDFsX50UNA2Gd1PaJ/24bDB/AcLkTdGDVeuXJPi9WndT3CEfbleXXoU8nTKjL7RLUD9C/UqiOWTJ2F8P5nTPMRcW2MRK0EQchUNeLALgiCYj4iVIAiaQMRKEARNIGIlCIImyJGpC9I7ThAEc8iMVuSQWElTBEEQTJMZrcgRsYqPF7ESBME0mdGKHIus9ItvBUEQ0gIakeuRFcCs1+fp8CkIgnaANqR2ejBFjq4N1OniJMISBCEF0ARoQ2bJ8akLOl7pn0A2NtZsGWyVyUaigiBoH4z6IeVDjeqfDsA9l3lWeHM6naSEgiD8c2RSqCAImkDEShAETSBiJQiCJhCxEgRBE4hYCYKgCf4P4EyqXjAsEDEAAAAASUVORK5CYII="}}]); \ No newline at end of file diff --git a/assets/js/f18fd350.4afa2ce8.js b/assets/js/f18fd350.4afa2ce8.js deleted file mode 100644 index f33d3253..00000000 --- a/assets/js/f18fd350.4afa2ce8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2351"],{802(e,t,i){i.r(t),i.d(t,{metadata:()=>n,default:()=>u,frontMatter:()=>c,contentTitle:()=>h,toc:()=>x,assets:()=>a});var n=JSON.parse('{"id":"configuration/clients/koito","title":"Koito","description":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","source":"@site/docs/configuration/clients/koito.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/koito","permalink":"/multi-scrobbler/configuration/clients/koito","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/koito.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Koito","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Discord (Headless)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-headless"},"next":{"title":"Last.fm","permalink":"/multi-scrobbler/configuration/clients/lastfm"}}'),s=i(4848),o=i(8453);i(8194),i(698),i(2170);var r=i(7419);function l(e){let t={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_ID"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsxs)(t.td,{children:["A globally unique ID EX ",(0,s.jsx)(t.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"KOITO_NAME"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsxs)(t.td,{children:["Value of ",(0,s.jsx)(t.code,{children:"KOITO_ID"})]}),(0,s.jsxs)(t.td,{children:["A vanity name EX ",(0,s.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"KOITO_ENABLE"})}),(0,s.jsx)(t.td,{children:"boolean"}),(0,s.jsx)(t.td,{children:"true"}),(0,s.jsx)(t.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_URL"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"URL for the Koito server"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_TOKEN"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"User token for the user to scrobble for"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_USER"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Username of the user to scrobble for"})]})]})]})}function d(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}let c={title:"Koito",toc_min_heading_level:2,toc_max_heading_level:5},h,a={},x=[{value:"Configuration",id:"configuration",level:2}];function j(e){let t={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,o.R)(),...e.components},{Config:i,Details:n}=t;return i||m("Config",!0),n||m("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 Koito account create a ",(0,s.jsx)(t.a,{href:"/configuration/sources/koito-source",children:"Koito (Source)"})]})}),"\n",(0,s.jsxs)(t.p,{children:["Setup a ",(0,s.jsx)(t.a,{href:"https://koito.io/guides/installation/",children:"Koito server"})," if you have not already done this."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://koito.io/guides/scrobbler/",children:"Create (or get) an API Key"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["From your Koito server dashboard navigate to ",(0,s.jsx)(t.strong,{children:"Settings"})," (bottom-left icon) => ",(0,s.jsx)(t.strong,{children:"API Keys"})]}),"\n",(0,s.jsx)(t.li,{children:"Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key"}),"\n",(0,s.jsxs)(t.li,{children:["EX ",(0,s.jsx)(t.code,{children:"pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Take note of your Koito username (used below as ",(0,s.jsx)(t.code,{children:"KOITO_USER"}),")"]}),"\n",(0,s.jsxs)(t.li,{children:["Determine your Koito URL","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance."}),"\n",(0,s.jsxs)(t.li,{children:["EX dashboard at ",(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})," => ",(0,s.jsx)(t.code,{children:"KOITO_URL"})," is set to ",(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.admonition,{title:"Koito Base URL",type:"note",children:[(0,s.jsxs)(t.p,{children:["Using the URL path ",(0,s.jsx)(t.code,{children:"/apis/listenbrainz"})," ",(0,s.jsx)(t.a,{href:"https://koito.io/guides/scrobbler/",children:"Koito docs describe"})," ",(0,s.jsx)(t.strong,{children:"is not required."})," The Koito URL used for multi-scrobbler should only be the ",(0,s.jsx)(t.strong,{children:"base"})," URL. Only include a URL path if your Koito ",(0,s.jsx)(t.strong,{children:"base"})," url is not at ",(0,s.jsx)(t.code,{children:"host:port"}),". See the table below for examples."]}),(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Base URL Examples"}),(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:(0,s.jsx)(t.code,{children:"KOITO_URL"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"MS Detected Base URL"}),(0,s.jsx)(t.th,{children:"Example Scrobble Api URL"})]})}),(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.code,{children:"http://192.168.0.100:4110"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110/apis/listenbrainz/1"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"https://koito.mydomain.com"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"https://koito.mydomain.com"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"https://koito.mydomain.com/apis/listenbrainz/1"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110/apis/listenbrainz"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110/apis/listenbrainz/1"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:80/koito"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:80/koito"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:80/koito/apis/listenbrainz/1"})})]})]})]})]})]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["For Koito versions ",(0,s.jsx)(t.code,{children:"<=0.1.7"}),", you must have the environment variable ",(0,s.jsx)(t.code,{children:"KOITO_ALLOWED_HOSTS"})," set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. ",(0,s.jsx)(t.code,{children:"koito.mydomain.com"}),"."]})}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(i,{config:"KoitoClientConfig",fileContent:r.A,client:!0,ambiguous:!0,name:"koito",children:(0,s.jsx)(d,{})})]})}function u(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(j,{...e})}):j(e)}function m(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},7419(e,t,i){i.d(t,{A:()=>n});let n='[\n {\n "name": "Koito Client A",\n "id": "myKoitoClient",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n },\n {\n "name": "Koito Source B",\n "id": "myKoitoSource",\n "configureAs": "source",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/f18fd350.cacb4e1a.js b/assets/js/f18fd350.cacb4e1a.js new file mode 100644 index 00000000..be0f1211 --- /dev/null +++ b/assets/js/f18fd350.cacb4e1a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["2351"],{802(e,t,i){i.r(t),i.d(t,{metadata:()=>n,default:()=>u,frontMatter:()=>c,contentTitle:()=>h,toc:()=>x,assets:()=>a});var n=JSON.parse('{"id":"configuration/clients/koito","title":"Koito","description":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","source":"@site/docs/configuration/clients/koito.mdx","sourceDirName":"configuration/clients","slug":"/configuration/clients/koito","permalink":"/multi-scrobbler/configuration/clients/koito","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/clients/koito.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Koito","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Discord (Headless)","permalink":"/multi-scrobbler/configuration/clients/discord/discord-headless"},"next":{"title":"Last.fm","permalink":"/multi-scrobbler/configuration/clients/lastfm"}}'),s=i(4848),o=i(8453);i(8194),i(698),i(2170);var r=i(7419);function l(e){let t={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_ID"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsxs)(t.td,{children:["A globally unique ID EX ",(0,s.jsx)(t.code,{children:"myComponentId"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"KOITO_NAME"})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsxs)(t.td,{children:["Value of ",(0,s.jsx)(t.code,{children:"KOITO_ID"})]}),(0,s.jsxs)(t.td,{children:["A vanity name EX ",(0,s.jsx)(t.code,{children:"My Cool Component"})]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"KOITO_ENABLE"})}),(0,s.jsx)(t.td,{children:"boolean"}),(0,s.jsx)(t.td,{children:"true"}),(0,s.jsx)(t.td,{children:"Should this component be used?"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_URL"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"URL for the Koito server"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_TOKEN"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"User token for the user to scrobble for"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.em,{children:(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"KOITO_USER"})})})}),(0,s.jsx)(t.td,{children:"string"}),(0,s.jsx)(t.td,{}),(0,s.jsx)(t.td,{children:"Username of the user to scrobble for"})]})]})]})}function d(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}let c={title:"Koito",toc_min_heading_level:2,toc_max_heading_level:5},h,a={},x=[{value:"Configuration",id:"configuration",level:2}];function j(e){let t={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,o.R)(),...e.components},{Config:i,Details:n}=t;return i||m("Config",!0),n||m("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 Koito account create a ",(0,s.jsx)(t.a,{href:"/configuration/sources/koito-source",children:"Koito (Source)"})]})}),"\n",(0,s.jsxs)(t.p,{children:["Setup a ",(0,s.jsx)(t.a,{href:"https://koito.io/guides/installation/",children:"Koito server"})," if you have not already done this."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://koito.io/guides/scrobbler/",children:"Create (or get) an API Key"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["From your Koito server dashboard navigate to ",(0,s.jsx)(t.strong,{children:"Settings"})," (bottom-left icon) => ",(0,s.jsx)(t.strong,{children:"API Keys"})]}),"\n",(0,s.jsx)(t.li,{children:"Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key"}),"\n",(0,s.jsxs)(t.li,{children:["EX ",(0,s.jsx)(t.code,{children:"pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["Take note of your Koito username (used below as ",(0,s.jsx)(t.code,{children:"KOITO_USER"}),")"]}),"\n",(0,s.jsxs)(t.li,{children:["Determine your Koito URL","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance."}),"\n",(0,s.jsxs)(t.li,{children:["EX dashboard at ",(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})," => ",(0,s.jsx)(t.code,{children:"KOITO_URL"})," is set to ",(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.admonition,{title:"Koito Base URL",type:"note",children:[(0,s.jsxs)(t.p,{children:["Using the URL path ",(0,s.jsx)(t.code,{children:"/apis/listenbrainz"})," ",(0,s.jsx)(t.a,{href:"https://koito.io/guides/scrobbler/",children:"Koito docs describe"})," ",(0,s.jsx)(t.strong,{children:"is not required."})," The Koito URL used for multi-scrobbler should only be the ",(0,s.jsx)(t.strong,{children:"base"})," URL. Only include a URL path if your Koito ",(0,s.jsx)(t.strong,{children:"base"})," url is not at ",(0,s.jsx)(t.code,{children:"host:port"}),". See the table below for examples."]}),(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Base URL Examples"}),(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:(0,s.jsx)(t.code,{children:"KOITO_URL"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"MS Detected Base URL"}),(0,s.jsx)(t.th,{children:"Example Scrobble Api URL"})]})}),(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.code,{children:"http://192.168.0.100:4110"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110/apis/listenbrainz/1"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"https://koito.mydomain.com"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"https://koito.mydomain.com"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"https://koito.mydomain.com/apis/listenbrainz/1"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110/apis/listenbrainz"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:4110/apis/listenbrainz/1"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:80/koito"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:80/koito"})}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.code,{children:"http://192.168.0.100:80/koito/apis/listenbrainz/1"})})]})]})]})]})]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["For Koito versions ",(0,s.jsx)(t.code,{children:"<=0.1.7"}),", you must have the environment variable ",(0,s.jsx)(t.code,{children:"KOITO_ALLOWED_HOSTS"})," set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. ",(0,s.jsx)(t.code,{children:"koito.mydomain.com"}),"."]})}),"\n",(0,s.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsx)(i,{config:"KoitoClientConfig",fileContent:r.A,client:!0,ambiguous:!0,name:"koito",children:(0,s.jsx)(d,{})})]})}function u(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(j,{...e})}):j(e)}function m(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},7419(e,t,i){i.d(t,{A:()=>n});let n='[\n {\n "name": "Koito Client A",\n "id": "myKoitoClient",\n "configureAs": "client",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n },\n {\n "name": "Koito Source B",\n "id": "myKoitoSource",\n "configureAs": "source",\n "data": {\n "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",\n "username": "admin",\n "url": "http://192.168.0.100:4110" \n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/fa357871.84bc7d57.js b/assets/js/fa357871.84bc7d57.js deleted file mode 100644 index 7bf8d3ee..00000000 --- a/assets/js/fa357871.84bc7d57.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5614"],{8442(e,n,r){r.r(n),r.d(n,{metadata:()=>o,default:()=>x,frontMatter:()=>a,contentTitle:()=>d,toc:()=>j,assets:()=>h});var o=JSON.parse('{"id":"configuration/sources/maloja","title":"Maloja","description":"To scrobble to a Maloja server, create a Maloja (Client)","source":"@site/docs/configuration/sources/maloja.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/maloja","permalink":"/multi-scrobbler/configuration/sources/maloja","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/maloja.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Maloja","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-source"},"next":{"title":"Mopidy","permalink":"/multi-scrobbler/configuration/sources/mopidy"}}'),t=r(4848),i=r(8453);r(8194),r(698),r(2170);var l=r(4763);function s(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"URL for maloja server"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_API_KEY"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"API Key for Maloja server"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(s,{...e})}):s(e)}let a={title:"Maloja",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},j=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config: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.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(n.p,{children:["To ",(0,t.jsx)(n.em,{children:"scrobble to"})," a Maloja server, create a ",(0,t.jsx)(n.a,{href:"/configuration/clients/maloja",children:"Maloja (Client)"})]})}),"\n",(0,t.jsxs)(n.p,{children:["See the ",(0,t.jsx)(n.a,{href:"/configuration/clients/maloja",children:"Maloja (Client)"})," configuration for general setup. The only difference for ",(0,t.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,t.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"MalojaSourceConfig",fileContent:l.A,configureAs:!0,ambiguous:!0,name:"maloja",children:(0,t.jsx)(c,{})})]})}function x(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},4763(e,n,r){r.d(n,{A:()=>o});let o='[\n {\n "name": "Maloja Client",\n "id": "myMalojaClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n },\n {\n "name": "Maloja Source",\n "id": "myMalojaSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/fa357871.86b5747b.js b/assets/js/fa357871.86b5747b.js new file mode 100644 index 00000000..eccb0cb8 --- /dev/null +++ b/assets/js/fa357871.86b5747b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["5614"],{8442(e,n,r){r.r(n),r.d(n,{metadata:()=>o,default:()=>x,frontMatter:()=>a,contentTitle:()=>d,toc:()=>j,assets:()=>h});var o=JSON.parse('{"id":"configuration/sources/maloja","title":"Maloja","description":"To scrobble to a Maloja server, create a Maloja (Client)","source":"@site/docs/configuration/sources/maloja.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/maloja","permalink":"/multi-scrobbler/configuration/sources/maloja","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/maloja.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"Maloja","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"Listenbrainz","permalink":"/multi-scrobbler/configuration/sources/listenbrainz-source"},"next":{"title":"Mopidy","permalink":"/multi-scrobbler/configuration/sources/mopidy"}}'),t=r(4848),i=r(8453);r(8194),r(698),r(2170);var l=r(4763);function s(e){let n={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_ID"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsxs)(n.td,{children:["A globally unique ID EX ",(0,t.jsx)(n.code,{children:"myComponentId"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_NAME"})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Value of ",(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_ID"})]}),(0,t.jsxs)(n.td,{children:["A vanity name EX ",(0,t.jsx)(n.code,{children:"My Cool Component"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_ENABLE"})}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"true"}),(0,t.jsx)(n.td,{children:"Should this component be used?"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_URL"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"URL for maloja server"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.em,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"SOURCE_MALOJA_API_KEY"})})})}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{}),(0,t.jsx)(n.td,{children:"API Key for Maloja server"})]})]})]})}function c(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(s,{...e})}):s(e)}let a={title:"Maloja",toc_min_heading_level:2,toc_max_heading_level:5},d,h={},j=[{value:"Configuration",id:"configuration",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Config: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.")}("Config",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.admonition,{title:"Other Uses",type:"tip",children:(0,t.jsxs)(n.p,{children:["To ",(0,t.jsx)(n.em,{children:"scrobble to"})," a Maloja server, create a ",(0,t.jsx)(n.a,{href:"/configuration/clients/maloja",children:"Maloja (Client)"})]})}),"\n",(0,t.jsxs)(n.p,{children:["See the ",(0,t.jsx)(n.a,{href:"/configuration/clients/maloja",children:"Maloja (Client)"})," configuration for general setup. The only difference for ",(0,t.jsx)(n.strong,{children:"Source"})," configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/configuration?configType=file#configuration-types",children:"File/AIO config"})," must include ",(0,t.jsx)(n.code,{children:'"configureAs": "source"'})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r,{config:"MalojaSourceConfig",fileContent:l.A,configureAs:!0,ambiguous:!0,name:"maloja",children:(0,t.jsx)(c,{})})]})}function x(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},4763(e,n,r){r.d(n,{A:()=>o});let o='[\n {\n "name": "Maloja Client",\n "id": "myMalojaClient",\n "enable": true,\n "configureAs": "client",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n },\n {\n "name": "Maloja Source",\n "id": "myMalojaSource",\n "enable": true,\n "configureAs": "source",\n "data": {\n "url": "http://localhost:42010",\n "apiKey": "myMalojaKey"\n }\n }\n]\n'}}]); \ No newline at end of file diff --git a/assets/js/fee59995.19421a19.js b/assets/js/fee59995.19421a19.js deleted file mode 100644 index 843d4b49..00000000 --- a/assets/js/fee59995.19421a19.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9627"],{4153(e,s,n){n.r(s),n.d(s,{metadata:()=>t,default:()=>j,frontMatter:()=>a,contentTitle:()=>h,toc:()=>m,assets:()=>u});var t=JSON.parse('{"id":"configuration/sources/mpris","title":"MPRIS","description":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","source":"@site/docs/configuration/sources/mpris.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/mpris","permalink":"/multi-scrobbler/configuration/sources/mpris","draft":false,"unlisted":false,"editUrl":"https:/github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mpris.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"MPRIS","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"MPD (Music Player Daemon)","permalink":"/multi-scrobbler/configuration/sources/mpd"},"next":{"title":"Musikcube","permalink":"/multi-scrobbler/configuration/sources/musikcube"}}'),i=n(4848),r=n(8453),o=n(8194),c=n(698);function l(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"MPRIS_ID"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["A globally unique ID EX ",(0,i.jsx)(s.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_NAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsxs)(s.td,{children:["Value of ",(0,i.jsx)(s.code,{children:"MPRIS_ID"})]}),(0,i.jsxs)(s.td,{children:["A vanity name EX ",(0,i.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_ENABLE"})}),(0,i.jsx)(s.td,{children:"boolean"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_BLACKLIST"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"DO NOT scrobble from any players that START WITH values from this comma-delimited list"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_WHITELIST"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"ONLY scrobble from any players that START WITH values from this comma-delimited list"})]})]})]})}function d(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}n(2170);let a={title:"MPRIS",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},m=[{value:"Host Setup",id:"host-setup",level:5},{value:"Local Unix Socket",id:"local-unix-socket",level:5},{value:"Remote Unix Socket",id:"remote-unix-socket",level:5},{value:"Configuration",id:"configuration",level:2}];function x(e){let s={a:"a",admonition:"admonition",code:"code",h2:"h2",h5:"h5",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components},{Config:t}=s;return t||function(e,s){throw Error("Expected "+(s?"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.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://specifications.freedesktop.org/mpris-spec/latest",children:"MPRIS"})," is a standard interface for communicating with Music Players on ",(0,i.jsx)(s.strong,{children:"linux operating systems."})]}),"\n",(0,i.jsx)(s.p,{children:"If you run Linux and have a notification tray that shows what media you are listening to, you likely have access to MPRIS."}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Notification Tray",src:n(3432).A+"",width:"542",height:"592"})}),"\n",(0,i.jsxs)(s.p,{children:["multi-scrobbler can listen to this interface and scrobble tracks played by ",(0,i.jsx)(s.strong,{children:"any media player"})," that communicates to the operating system with MPRIS."]}),"\n",(0,i.jsx)(s.h5,{id:"host-setup",children:"Host Setup"}),"\n",(0,i.jsx)(s.p,{children:"MPRIS communication requires multi-scrobbler to have access to the host's dbus-daemon."}),"\n",(0,i.jsxs)(o.A,{groupId:"dbus",queryString:!0,children:[(0,i.jsxs)(c.A,{value:"local",label:"Local",children:[(0,i.jsxs)(s.p,{children:["If multi-scrobbler is running as a ",(0,i.jsx)(s.a,{href:"/multi-scrobbler/installation/#nodejs",children:(0,i.jsx)(s.strong,{children:"Local Installation"})}),", directly with node/npm, on the same host as MPRIS then no setup is required."]}),(0,i.jsxs)(s.p,{children:["Remote setup is also possible, see the ",(0,i.jsx)(s.strong,{children:"Remote Unix Socket"})," section in the Docker tab."]})]}),(0,i.jsxs)(c.A,{value:"docker",label:"Docker",children:[(0,i.jsxs)(s.p,{children:["If multi-scrobbler is running as a ",(0,i.jsx)(s.a,{href:"/multi-scrobbler/installation/#docker",children:(0,i.jsx)(s.strong,{children:"Docker Container"})})," some modifications are required..."]}),(0,i.jsx)(s.h5,{id:"local-unix-socket",children:"Local Unix Socket"}),(0,i.jsxs)(s.p,{children:["The most secure way is to ",(0,i.jsx)(s.strong,{children:"run a multi-scrobbler container on the same host as MPRIS."})," In this scenario you can simply mount the ",(0,i.jsx)(s.strong,{children:"user session"})," dbus unix socket into the container. Make sure ",(0,i.jsxs)(s.a,{href:"/installation?dockerSetting=linuxHost#recommended-settings",children:[(0,i.jsx)(s.code,{children:"PUID"})," and ",(0,i.jsx)(s.code,{children:"PGID"})," ENVs are configured"]})," so the container has permissions to access the socket. Then, modify your compose stack with these additional values:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n - DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/UID/bus \n\n volumes:\n - /run/user/UID/bus:/run/user/UID/bus:ro\n"})}),(0,i.jsx)(s.h5,{id:"remote-unix-socket",children:"Remote Unix Socket"}),(0,i.jsx)(s.admonition,{type:"warning",children:(0,i.jsxs)(s.p,{children:["This method is ",(0,i.jsx)(s.strong,{children:"insecure."})," You should not expose dbus over a network unless access to the port is restricted and the network is trusted."]})}),(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.a,{href:"https://linux.die.net/man/1/socat",children:(0,i.jsx)(s.code,{children:"socat"})})," to bidirectionally relay communication from the host's dbus socket to a listening TCP port."]}),(0,i.jsxs)(s.p,{children:["To make dbus for user with uid ",(0,i.jsx)(s.code,{children:"1000"})," available on port ",(0,i.jsx)(s.code,{children:"6644"}),":"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-shell",children:"socat TCP-LISTEN:6644,reuseaddr,fork UNIX-CONNECT:/run/user/1000/bus\n"})}),(0,i.jsx)(s.p,{children:"Then, add the following value to multi-scrobbler's ENVs:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"DBUS_SESSION_BUS_ADDRESS=tcp:host=yourHostIP,port=6644\n"})})]})]}),"\n",(0,i.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(t,{config:"MPRISSourceConfig",fileContent:'[\n {\n "name": "Desktop",\n "id": "myMprisUbuntu",\n "enable": true,\n "data": {\n "whitelist": ["vlc", "mpd"],\n "blacklist": ["spotify"]\n }\n }\n]\n',name:"mpris",children:(0,i.jsx)(d,{})})]})}function j(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}},3432(e,s,n){n.d(s,{A:()=>t});let t=n.p+"assets/images/mpris-e95a64bfe1b46a618dc43729685d6114.jpg"}}]); \ No newline at end of file diff --git a/assets/js/fee59995.4edad005.js b/assets/js/fee59995.4edad005.js new file mode 100644 index 00000000..3d671f5d --- /dev/null +++ b/assets/js/fee59995.4edad005.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).push([["9627"],{4153(e,s,n){n.r(s),n.d(s,{metadata:()=>t,default:()=>j,frontMatter:()=>a,contentTitle:()=>h,toc:()=>m,assets:()=>u});var t=JSON.parse('{"id":"configuration/sources/mpris","title":"MPRIS","description":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","source":"@site/docs/configuration/sources/mpris.mdx","sourceDirName":"configuration/sources","slug":"/configuration/sources/mpris","permalink":"/multi-scrobbler/configuration/sources/mpris","draft":false,"unlisted":false,"editUrl":"https://github.com/FoxxMD/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mpris.mdx?plain=1","tags":[],"version":"current","frontMatter":{"title":"MPRIS","toc_min_heading_level":2,"toc_max_heading_level":5},"sidebar":"tutorialSidebar","previous":{"title":"MPD (Music Player Daemon)","permalink":"/multi-scrobbler/configuration/sources/mpd"},"next":{"title":"Musikcube","permalink":"/multi-scrobbler/configuration/sources/musikcube"}}'),i=n(4848),r=n(8453),o=n(8194),c=n(698);function l(e){let s={code:"code",em:"em",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(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:"Type"}),(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.em,{children:(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"MPRIS_ID"})})})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsxs)(s.td,{children:["A globally unique ID EX ",(0,i.jsx)(s.code,{children:"myComponentId"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_NAME"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsxs)(s.td,{children:["Value of ",(0,i.jsx)(s.code,{children:"MPRIS_ID"})]}),(0,i.jsxs)(s.td,{children:["A vanity name EX ",(0,i.jsx)(s.code,{children:"My Cool Component"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_ENABLE"})}),(0,i.jsx)(s.td,{children:"boolean"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"Should this component be used?"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_BLACKLIST"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"DO NOT scrobble from any players that START WITH values from this comma-delimited list"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"MPRIS_WHITELIST"})}),(0,i.jsx)(s.td,{children:"string"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{children:"ONLY scrobble from any players that START WITH values from this comma-delimited list"})]})]})]})}function d(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}n(2170);let a={title:"MPRIS",toc_min_heading_level:2,toc_max_heading_level:5},h,u={},m=[{value:"Host Setup",id:"host-setup",level:5},{value:"Local Unix Socket",id:"local-unix-socket",level:5},{value:"Remote Unix Socket",id:"remote-unix-socket",level:5},{value:"Configuration",id:"configuration",level:2}];function x(e){let s={a:"a",admonition:"admonition",code:"code",h2:"h2",h5:"h5",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components},{Config:t}=s;return t||function(e,s){throw Error("Expected "+(s?"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.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://specifications.freedesktop.org/mpris-spec/latest",children:"MPRIS"})," is a standard interface for communicating with Music Players on ",(0,i.jsx)(s.strong,{children:"linux operating systems."})]}),"\n",(0,i.jsx)(s.p,{children:"If you run Linux and have a notification tray that shows what media you are listening to, you likely have access to MPRIS."}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{alt:"Notification Tray",src:n(3432).A+"",width:"542",height:"592"})}),"\n",(0,i.jsxs)(s.p,{children:["multi-scrobbler can listen to this interface and scrobble tracks played by ",(0,i.jsx)(s.strong,{children:"any media player"})," that communicates to the operating system with MPRIS."]}),"\n",(0,i.jsx)(s.h5,{id:"host-setup",children:"Host Setup"}),"\n",(0,i.jsx)(s.p,{children:"MPRIS communication requires multi-scrobbler to have access to the host's dbus-daemon."}),"\n",(0,i.jsxs)(o.A,{groupId:"dbus",queryString:!0,children:[(0,i.jsxs)(c.A,{value:"local",label:"Local",children:[(0,i.jsxs)(s.p,{children:["If multi-scrobbler is running as a ",(0,i.jsx)(s.a,{href:"/multi-scrobbler/installation/#nodejs",children:(0,i.jsx)(s.strong,{children:"Local Installation"})}),", directly with node/npm, on the same host as MPRIS then no setup is required."]}),(0,i.jsxs)(s.p,{children:["Remote setup is also possible, see the ",(0,i.jsx)(s.strong,{children:"Remote Unix Socket"})," section in the Docker tab."]})]}),(0,i.jsxs)(c.A,{value:"docker",label:"Docker",children:[(0,i.jsxs)(s.p,{children:["If multi-scrobbler is running as a ",(0,i.jsx)(s.a,{href:"/multi-scrobbler/installation/#docker",children:(0,i.jsx)(s.strong,{children:"Docker Container"})})," some modifications are required..."]}),(0,i.jsx)(s.h5,{id:"local-unix-socket",children:"Local Unix Socket"}),(0,i.jsxs)(s.p,{children:["The most secure way is to ",(0,i.jsx)(s.strong,{children:"run a multi-scrobbler container on the same host as MPRIS."})," In this scenario you can simply mount the ",(0,i.jsx)(s.strong,{children:"user session"})," dbus unix socket into the container. Make sure ",(0,i.jsxs)(s.a,{href:"/installation?dockerSetting=linuxHost#recommended-settings",children:[(0,i.jsx)(s.code,{children:"PUID"})," and ",(0,i.jsx)(s.code,{children:"PGID"})," ENVs are configured"]})," so the container has permissions to access the socket. Then, modify your compose stack with these additional values:"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",metastring:'title="docker-compose.yaml"',children:"\n environment:\n - DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/UID/bus \n\n volumes:\n - /run/user/UID/bus:/run/user/UID/bus:ro\n"})}),(0,i.jsx)(s.h5,{id:"remote-unix-socket",children:"Remote Unix Socket"}),(0,i.jsx)(s.admonition,{type:"warning",children:(0,i.jsxs)(s.p,{children:["This method is ",(0,i.jsx)(s.strong,{children:"insecure."})," You should not expose dbus over a network unless access to the port is restricted and the network is trusted."]})}),(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.a,{href:"https://linux.die.net/man/1/socat",children:(0,i.jsx)(s.code,{children:"socat"})})," to bidirectionally relay communication from the host's dbus socket to a listening TCP port."]}),(0,i.jsxs)(s.p,{children:["To make dbus for user with uid ",(0,i.jsx)(s.code,{children:"1000"})," available on port ",(0,i.jsx)(s.code,{children:"6644"}),":"]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-shell",children:"socat TCP-LISTEN:6644,reuseaddr,fork UNIX-CONNECT:/run/user/1000/bus\n"})}),(0,i.jsx)(s.p,{children:"Then, add the following value to multi-scrobbler's ENVs:"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"DBUS_SESSION_BUS_ADDRESS=tcp:host=yourHostIP,port=6644\n"})})]})]}),"\n",(0,i.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(t,{config:"MPRISSourceConfig",fileContent:'[\n {\n "name": "Desktop",\n "id": "myMprisUbuntu",\n "enable": true,\n "data": {\n "whitelist": ["vlc", "mpd"],\n "blacklist": ["spotify"]\n }\n }\n]\n',name:"mpris",children:(0,i.jsx)(d,{})})]})}function j(e={}){let{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}},3432(e,s,n){n.d(s,{A:()=>t});let t=n.p+"assets/images/mpris-e95a64bfe1b46a618dc43729685d6114.jpg"}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.35348c8b.js b/assets/js/runtime~main.35348c8b.js deleted file mode 100644 index 047eb6e3..00000000 --- a/assets/js/runtime~main.35348c8b.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,a,d,c,f,b,t,r={},o={};function n(e){var a=o[e];if(void 0!==a)return a.exports;var d=o[e]={exports:{}};return r[e].call(d.exports,d,d.exports,n),d.exports}n.m=r,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 f=Object.create(null);n.r(f);var b={};e=e||[null,a({}),a([]),a(a)];for(var t=2&c&&d;("object"==typeof t||"function"==typeof t)&&!~e.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach(e=>{b[e]=()=>d[e]});return b.default=()=>d,n.d(f,b),f},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.u=e=>"assets/js/"+(({106:"17896441",1184:"e6ac3f64",1234:"138e0e15",1309:"153c3ceb",1353:"e7a53bbd",1499:"24a5b6e6",1668:"5e95c892",1703:"e82a470f",1785:"c2e935db",1920:"294f31e2",2068:"202c4968",2072:"425b8dd3",2076:"91a78c9f",2077:"d53edd15",232:"af9480c3",2351:"f18fd350",2609:"1bb2dc41",2613:"778b0fa6",2677:"4edc808e",2929:"61856a46",3056:"a7456010",3747:"aba21aa0",3763:"cdda7d53",3841:"41cd626a",3895:"64837553",3922:"5a378701",3963:"8b39be93",4123:"925abbc7",429:"33c4ed3f",4461:"04d926a5",4479:"490e20a0",4787:"7d837a1d",490:"9bcab3db",5005:"common",5077:"30829cd8",5093:"1fb61236",539:"dfa6d5b1",5515:"a16703cd",5575:"a7bd4aaa",5614:"fa357871",5847:"1a4e3797",6412:"3827a595",6473:"2ecbbad4",6691:"b46f7c12",676:"49117d77",6785:"a94703ab",6942:"44b2647e",7211:"5a6ebb5c",7212:"a93ae359",7220:"d50915e5",7227:"72d905a9",7234:"14eb3368",7314:"74876495",7417:"08938dd7",7430:"498c77bd",7736:"bf69edfb",8037:"d3a18f08",8123:"73287945",8160:"ad895e75",8270:"094000d3",8406:"0ce74438",8968:"ea69cd8d",899:"2a24ad03",9077:"5930ad03",9212:"9fd2a592",9249:"b49ba48c",941:"493c00ca",9494:"7b4f75c2",9515:"4f7d60c5",9536:"7ebd3339",9627:"fee59995",9698:"97d34c1a",9818:"5f7452e4",9991:"812e048c"})[e]||e)+"."+({106:"d2ac2e10",1184:"065ee538",1234:"270f5136",1309:"8bccd2a2",1353:"caba3573",1499:"a9742041",1649:"9badff1a",1668:"dbe123fe",1703:"19ce1061",1785:"ed551359",1920:"fad893ae",2068:"54d0bed6",2072:"cea8b1a2",2076:"055787b3",2077:"9d3522ee",232:"7c9adf49",2351:"4afa2ce8",2609:"e8fa8674",2613:"f419d76e",2677:"01dc77ad",2929:"2dde7a02",3056:"728c2f65",3718:"d3ef1812",3747:"34582f97",3763:"3378a080",3841:"990a1161",3895:"c7e6ef42",3922:"f804e785",3963:"eb6d9d58",4123:"c3c17436",429:"96b3612f",434:"3522035b",4461:"9b86ad1f",4479:"2f2af6ce",4494:"30732283",4787:"874db7a3",490:"7daa78ab",5005:"83d91827",5077:"ec4d59dc",5093:"1db46805",5314:"0d8b1cbe",5387:"a22894e6",539:"bed44827",5515:"a3295a26",5575:"97114100",5614:"84bc7d57",5847:"3d615296",6412:"6079a539",6473:"b0403b88",6691:"3100fbe6",676:"ecb7b006",6785:"97949813",6942:"35013e97",7211:"0af53e22",7212:"1ee4806b",7220:"3f036d92",7227:"6c664fe1",7234:"050b12c6",7314:"3bfa055b",7417:"9aaf2469",7430:"493fa519",7736:"c50ccff0",8037:"ea51fc4e",8123:"e71cfce7",8160:"13e7b34f",8270:"256efb93",8406:"00bd9f52",8968:"ff01e187",899:"f7468792",9077:"bc7160d6",92:"e59cb17d",9212:"3a67aa4f",9249:"e798877e",9311:"f9221018",9313:"dc290399",941:"d188969b",9494:"49dd4e62",9515:"1123e42a",9536:"c3c05102",9618:"4f99b13a",9627:"19421a19",9698:"ed4d7083",9818:"26462546",9991:"cc12e48d",9999:"64bb008b"})[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,f){if(d[e])return void d[e].push(a);if(void 0!==c)for(var b,t,r=document.getElementsByTagName("script"),o=0;o<r.length;o++){var i=r[o];if(i.getAttribute("src")==e||i.getAttribute("data-rspack")=="multi-scrobbler-docs:"+c){b=i;break}}b||(t=!0,(b=document.createElement("script")).timeout=120,n.nc&&b.setAttribute("nonce",n.nc),b.setAttribute("data-rspack","multi-scrobbler-docs:"+c),b.src=e),d[e]=[a];var u=function(a,c){b.onerror=b.onload=null,clearTimeout(l);var f=d[e];if(delete d[e],b.parentNode&&b.parentNode.removeChild(b),f&&f.forEach(function(e){return e(c)}),a)return a(c)},l=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),t&&document.head.appendChild(b)},n.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c=[],n.O=(e,a,d,f)=>{if(a){f=f||0;for(var b=c.length;b>0&&c[b-1][2]>f;b--)c[b]=c[b-1];c[b]=[a,d,f];return}for(var t=1/0,b=0;b<c.length;b++){for(var a=c[b][0],d=c[b][1],f=c[b][2],r=!0,o=0;o<a.length;o++)(!1&f||t>=f)&&Object.keys(n.O).every(e=>n.O[e](a[o]))?a.splice(o--,1):(r=!1,f<t&&(t=f));if(r){c.splice(b--,1);var i=d();void 0!==i&&(e=i)}}return e},n.p="/multi-scrobbler/",n.rv=()=>"1.7.11",n.gca=function(e){return e=({0x11113f9:"106",0x3dd57b1:"3895",0x45e4909:"8123",0x476864f:"7314",af9480c3:"232","33c4ed3f":"429","9bcab3db":"490",dfa6d5b1:"539","49117d77":"676","2a24ad03":"899","493c00ca":"941",e6ac3f64:"1184","138e0e15":"1234","153c3ceb":"1309",e7a53bbd:"1353","24a5b6e6":"1499","5e95c892":"1668",e82a470f:"1703",c2e935db:"1785","294f31e2":"1920","202c4968":"2068","425b8dd3":"2072","91a78c9f":"2076",d53edd15:"2077",f18fd350:"2351","1bb2dc41":"2609","778b0fa6":"2613","4edc808e":"2677","61856a46":"2929",a7456010:"3056",aba21aa0:"3747",cdda7d53:"3763","41cd626a":"3841","5a378701":"3922","8b39be93":"3963","925abbc7":"4123","04d926a5":"4461","490e20a0":"4479","7d837a1d":"4787",common:"5005","30829cd8":"5077","1fb61236":"5093",a16703cd:"5515",a7bd4aaa:"5575",fa357871:"5614","1a4e3797":"5847","3827a595":"6412","2ecbbad4":"6473",b46f7c12:"6691",a94703ab:"6785","44b2647e":"6942","5a6ebb5c":"7211",a93ae359:"7212",d50915e5:"7220","72d905a9":"7227","14eb3368":"7234","08938dd7":"7417","498c77bd":"7430",bf69edfb:"7736",d3a18f08:"8037",ad895e75:"8160","094000d3":"8270","0ce74438":"8406",ea69cd8d:"8968","5930ad03":"9077","9fd2a592":"9212",b49ba48c:"9249","7b4f75c2":"9494","4f7d60c5":"9515","7ebd3339":"9536",fee59995:"9627","97d34c1a":"9698","5f7452e4":"9818","812e048c":"9991"})[e]||e,n.p+n.u(e)},n.b=document.baseURI||self.location.href,f={4014:0,9783:0},n.f.j=function(e,a){var d=n.o(f,e)?f[e]:void 0;if(0!==d)if(d)a.push(d[2]);else if(/^(4014|9783)$/.test(e))f[e]=0;else{var c=new Promise((a,c)=>d=f[e]=[a,c]);a.push(d[2]=c);var b=n.p+n.u(e),t=Error();n.l(b,function(a){if(n.o(f,e)&&(0!==(d=f[e])&&(f[e]=void 0),d)){var c=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+e+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}},"chunk-"+e,e)}},n.O.j=e=>0===f[e],b=(e,a)=>{var d,c,b=a[0],t=a[1],r=a[2],o=0;if(b.some(e=>0!==f[e])){for(d in t)n.o(t,d)&&(n.m[d]=t[d]);if(r)var i=r(n)}for(e&&e(a);o<b.length;o++)c=b[o],n.o(f,c)&&f[c]&&f[c][0](),f[c]=0;return n.O(i)},(t=self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).forEach(b.bind(null,0)),t.push=b.bind(null,t.push.bind(t)),n.ruid="bundler=rspack@1.7.11"})(); \ No newline at end of file diff --git a/assets/js/runtime~main.5478431f.js b/assets/js/runtime~main.5478431f.js new file mode 100644 index 00000000..18dfb2fd --- /dev/null +++ b/assets/js/runtime~main.5478431f.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,d,b,c,f,t,r={},o={};function n(e){var a=o[e];if(void 0!==a)return a.exports;var d=o[e]={exports:{}};return r[e].call(d.exports,d,d.exports,n),d.exports}n.m=r,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,b){if(1&b&&(d=this(d)),8&b||"object"==typeof d&&d&&(4&b&&d.__esModule||16&b&&"function"==typeof d.then))return d;var c=Object.create(null);n.r(c);var f={};e=e||[null,a({}),a([]),a(a)];for(var t=2&b&&d;("object"==typeof t||"function"==typeof t)&&!~e.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach(e=>{f[e]=()=>d[e]});return f.default=()=>d,n.d(c,f),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.u=e=>"assets/js/"+(({106:"17896441",1184:"e6ac3f64",1234:"138e0e15",1309:"153c3ceb",1353:"e7a53bbd",1499:"24a5b6e6",1668:"5e95c892",1703:"e82a470f",1785:"c2e935db",1920:"294f31e2",2068:"202c4968",2072:"425b8dd3",2076:"91a78c9f",2077:"d53edd15",232:"af9480c3",2351:"f18fd350",2609:"1bb2dc41",2613:"778b0fa6",2677:"4edc808e",2929:"61856a46",3056:"a7456010",3747:"aba21aa0",3763:"cdda7d53",3841:"41cd626a",3895:"64837553",3922:"5a378701",3963:"8b39be93",4123:"925abbc7",429:"33c4ed3f",4461:"04d926a5",4479:"490e20a0",4787:"7d837a1d",490:"9bcab3db",5005:"common",5077:"30829cd8",5093:"1fb61236",539:"dfa6d5b1",5515:"a16703cd",5575:"a7bd4aaa",5614:"fa357871",5847:"1a4e3797",6412:"3827a595",6473:"2ecbbad4",6691:"b46f7c12",676:"49117d77",6785:"a94703ab",6942:"44b2647e",7211:"5a6ebb5c",7212:"a93ae359",7220:"d50915e5",7227:"72d905a9",7234:"14eb3368",7314:"74876495",7417:"08938dd7",7430:"498c77bd",7736:"bf69edfb",8037:"d3a18f08",8123:"73287945",8160:"ad895e75",8270:"094000d3",8406:"0ce74438",8968:"ea69cd8d",899:"2a24ad03",9077:"5930ad03",9212:"9fd2a592",9249:"b49ba48c",941:"493c00ca",9494:"7b4f75c2",9515:"4f7d60c5",9536:"7ebd3339",9627:"fee59995",9698:"97d34c1a",9818:"5f7452e4",9991:"812e048c"})[e]||e)+"."+({106:"d2ac2e10",1184:"b17508a6",1234:"270f5136",1309:"d314d9bc",1353:"e67b3e0e",1499:"efe1a012",1649:"9badff1a",1668:"dbe123fe",1703:"9ee66086",1785:"64d4c215",1920:"20b72f2a",2068:"c6902699",2072:"32de60d8",2076:"f02c9e98",2077:"c1d02ade",232:"99d1652c",2351:"cacb4e1a",2609:"a7345fdd",2613:"180c28af",2677:"56f2ac9b",2929:"d8bdfb0e",3056:"728c2f65",3718:"d3ef1812",3747:"34582f97",3763:"15b867c8",3841:"319629aa",3895:"7ea1aa42",3922:"abc8db86",3963:"09830469",4123:"e3c9000b",429:"368cddb1",434:"3522035b",4461:"ec6f4fcd",4479:"13e19275",4494:"30732283",4787:"874db7a3",490:"544fccb4",5005:"83d91827",5077:"c41b385a",5093:"67d54122",5314:"0d8b1cbe",5387:"a22894e6",539:"79649750",5515:"53e0bfce",5575:"97114100",5614:"86b5747b",5847:"3d615296",6412:"db3b6819",6473:"2f08c93b",6691:"16114bb2",676:"5bb5222b",6785:"97949813",6942:"24c4f22d",7211:"127bc10c",7212:"a1767c63",7220:"222d6408",7227:"fb69ac6f",7234:"050b12c6",7314:"15b0c1e9",7417:"64df4ca4",7430:"5d01d565",7736:"d12f9775",8037:"066bdca8",8123:"b4e4ba6e",8160:"1c516a11",8270:"145fb8c1",8406:"00bd9f52",8968:"1b69a39c",899:"3ae318a5",9077:"ad7a7ac4",92:"e59cb17d",9212:"84dff9d4",9249:"caa11833",9311:"f9221018",9313:"dc290399",941:"c9ab1381",9494:"3c5e2cf9",9515:"81c82ae0",9536:"d6aa4b2e",9618:"4f99b13a",9627:"4edad005",9698:"ed4d7083",9818:"38065108",9991:"397090c1",9999:"64bb008b"})[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,b,c){if(d[e])return void d[e].push(a);if(void 0!==b)for(var f,t,r=document.getElementsByTagName("script"),o=0;o<r.length;o++){var i=r[o];if(i.getAttribute("src")==e||i.getAttribute("data-rspack")=="multi-scrobbler-docs:"+b){f=i;break}}f||(t=!0,(f=document.createElement("script")).timeout=120,n.nc&&f.setAttribute("nonce",n.nc),f.setAttribute("data-rspack","multi-scrobbler-docs:"+b),f.src=e),d[e]=[a];var u=function(a,b){f.onerror=f.onload=null,clearTimeout(l);var c=d[e];if(delete d[e],f.parentNode&&f.parentNode.removeChild(f),c&&c.forEach(function(e){return e(b)}),a)return a(b)},l=setTimeout(u.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=u.bind(null,f.onerror),f.onload=u.bind(null,f.onload),t&&document.head.appendChild(f)},n.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b=[],n.O=(e,a,d,c)=>{if(a){c=c||0;for(var f=b.length;f>0&&b[f-1][2]>c;f--)b[f]=b[f-1];b[f]=[a,d,c];return}for(var t=1/0,f=0;f<b.length;f++){for(var a=b[f][0],d=b[f][1],c=b[f][2],r=!0,o=0;o<a.length;o++)(!1&c||t>=c)&&Object.keys(n.O).every(e=>n.O[e](a[o]))?a.splice(o--,1):(r=!1,c<t&&(t=c));if(r){b.splice(f--,1);var i=d();void 0!==i&&(e=i)}}return e},n.p="/multi-scrobbler/",n.rv=()=>"1.7.11",n.gca=function(e){return e=({0x11113f9:"106",0x3dd57b1:"3895",0x45e4909:"8123",0x476864f:"7314",af9480c3:"232","33c4ed3f":"429","9bcab3db":"490",dfa6d5b1:"539","49117d77":"676","2a24ad03":"899","493c00ca":"941",e6ac3f64:"1184","138e0e15":"1234","153c3ceb":"1309",e7a53bbd:"1353","24a5b6e6":"1499","5e95c892":"1668",e82a470f:"1703",c2e935db:"1785","294f31e2":"1920","202c4968":"2068","425b8dd3":"2072","91a78c9f":"2076",d53edd15:"2077",f18fd350:"2351","1bb2dc41":"2609","778b0fa6":"2613","4edc808e":"2677","61856a46":"2929",a7456010:"3056",aba21aa0:"3747",cdda7d53:"3763","41cd626a":"3841","5a378701":"3922","8b39be93":"3963","925abbc7":"4123","04d926a5":"4461","490e20a0":"4479","7d837a1d":"4787",common:"5005","30829cd8":"5077","1fb61236":"5093",a16703cd:"5515",a7bd4aaa:"5575",fa357871:"5614","1a4e3797":"5847","3827a595":"6412","2ecbbad4":"6473",b46f7c12:"6691",a94703ab:"6785","44b2647e":"6942","5a6ebb5c":"7211",a93ae359:"7212",d50915e5:"7220","72d905a9":"7227","14eb3368":"7234","08938dd7":"7417","498c77bd":"7430",bf69edfb:"7736",d3a18f08:"8037",ad895e75:"8160","094000d3":"8270","0ce74438":"8406",ea69cd8d:"8968","5930ad03":"9077","9fd2a592":"9212",b49ba48c:"9249","7b4f75c2":"9494","4f7d60c5":"9515","7ebd3339":"9536",fee59995:"9627","97d34c1a":"9698","5f7452e4":"9818","812e048c":"9991"})[e]||e,n.p+n.u(e)},n.b=document.baseURI||self.location.href,c={4014:0,9783: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(/^(4014|9783)$/.test(e))c[e]=0;else{var b=new Promise((a,b)=>d=c[e]=[a,b]);a.push(d[2]=b);var f=n.p+n.u(e),t=Error();n.l(f,function(a){if(n.o(c,e)&&(0!==(d=c[e])&&(c[e]=void 0),d)){var b=a&&("load"===a.type?"missing":a.type),f=a&&a.target&&a.target.src;t.message="Loading chunk "+e+" failed.\n("+b+": "+f+")",t.name="ChunkLoadError",t.type=b,t.request=f,d[1](t)}},"chunk-"+e,e)}},n.O.j=e=>0===c[e],f=(e,a)=>{var d,b,f=a[0],t=a[1],r=a[2],o=0;if(f.some(e=>0!==c[e])){for(d in t)n.o(t,d)&&(n.m[d]=t[d]);if(r)var i=r(n)}for(e&&e(a);o<f.length;o++)b=f[o],n.o(c,b)&&c[b]&&c[b][0](),c[b]=0;return n.O(i)},(t=self.webpackChunkmulti_scrobbler_docs=self.webpackChunkmulti_scrobbler_docs||[]).forEach(f.bind(null,0)),t.push=f.bind(null,t.push.bind(t)),n.ruid="bundler=rspack@1.7.11"})(); \ No newline at end of file diff --git a/category/development/index.html b/category/development/index.html index 207de895..d022d311 100644 --- a/category/development/index.html +++ b/category/development/index.html @@ -5,7 +5,7 @@ <meta name="generator" content="Docusaurus v3.9.2"> <title data-rh="true">Development | Multi-Scrobbler - + diff --git a/configuration/clients/discord/discord-app/index.html b/configuration/clients/discord/discord-app/index.html index ebbefcc0..50ae72dd 100644 --- a/configuration/clients/discord/discord-app/index.html +++ b/configuration/clients/discord/discord-app/index.html @@ -3,11 +3,11 @@ -Discord (App) | Multi-Scrobbler +Discord (App) | Multi-Scrobbler - + - + @@ -114,6 +114,6 @@

Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

important

Only client discord configs will validate correctly in the editor but both source and client discord configs are allowed in the real CONFIG/discord.json

After you finish editing, switch to text and then copy all text to get a completed config.

Config Example Mobile Experience

This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure.

The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

CONFIG/discord.json
[
{
"name": "Desktop",
"enable": true,
"id": "myDiscordLocal",
"data": {
"applicationId": "8190211179716453570",
"ipcLocations": [
"192.168.0.105:6655"
]
}
}
]
+

Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

After you finish editing, switch to text and then copy all text to get a completed config.

Config Example Mobile Experience

This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure.

The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

CONFIG/config.json
{
"clients": [
{
"name": "Desktop",
"enable": true,
"id": "myDiscordLocal",
"data": {
"applicationId": "8190211179716453570",
"ipcLocations": [
"192.168.0.105:6655"
]
},
"type": "discord"
}
]
}
\ No newline at end of file diff --git a/configuration/clients/discord/discord-headless/index.html b/configuration/clients/discord/discord-headless/index.html index d78cfed8..e82f0ead 100644 --- a/configuration/clients/discord/discord-headless/index.html +++ b/configuration/clients/discord/discord-headless/index.html @@ -3,11 +3,11 @@ -Discord (Headless) | Multi-Scrobbler +Discord (Headless) | Multi-Scrobbler - + - + @@ -104,6 +104,6 @@

Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

important

Only client discord configs will validate correctly in the editor but both source and client discord configs are allowed in the real CONFIG/discord.json

After you finish editing, switch to text and then copy all text to get a completed config.

Config Example Mobile Experience

This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure.

The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

CONFIG/discord.json
[
{
"name": "Discord",
"enable": true,
"id": "myDiscordRemote",
"data": {
"token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",
"applicationId": "8190211179716453570"
}
}
]
+

Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

After you finish editing, switch to text and then copy all text to get a completed config.

Config Example Mobile Experience

This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure.

The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

CONFIG/config.json
{
"clients": [
{
"name": "Discord",
"enable": true,
"id": "myDiscordRemote",
"data": {
"token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",
"applicationId": "8190211179716453570"
},
"type": "discord"
}
]
}
\ No newline at end of file diff --git a/configuration/clients/discord/index.html b/configuration/clients/discord/index.html index 76894eea..b4b01095 100644 --- a/configuration/clients/discord/index.html +++ b/configuration/clients/discord/index.html @@ -3,11 +3,11 @@ -Discord | Multi-Scrobbler +Discord | Multi-Scrobbler - + - + @@ -42,6 +42,6 @@
  • More customization than App integration
  • Active if any Discord application is online
  • -

    Headless Docs

    +

    Headless Docs

    \ No newline at end of file diff --git a/configuration/clients/index.html b/configuration/clients/index.html index d659d8da..d8766ddf 100644 --- a/configuration/clients/index.html +++ b/configuration/clients/index.html @@ -3,11 +3,11 @@ -Overview | Multi-Scrobbler +Overview | Multi-Scrobbler - + - + @@ -52,6 +52,6 @@

    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"]
    }
    },
    ]
    +
    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"]
    }
    },
    ]
    \ No newline at end of file diff --git a/configuration/clients/koito/index.html b/configuration/clients/koito/index.html index c733bcd1..c8207345 100644 --- a/configuration/clients/koito/index.html +++ b/configuration/clients/koito/index.html @@ -3,11 +3,11 @@ -Koito | Multi-Scrobbler +Koito | Multi-Scrobbler - + - + @@ -40,6 +40,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only client koito configs will validate correctly in the editor but both source and client koito configs are allowed in the real CONFIG/koito.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a koito Client File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/koito.json
    [
    {
    "name": "Koito Client A",
    "id": "myKoitoClient",
    "configureAs": "client",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "admin",
    "url": "http://192.168.0.100:4110"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a koito Client that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "clients": [
    {
    "name": "Koito Client A",
    "id": "myKoitoClient",
    "configureAs": "client",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "admin",
    "url": "http://192.168.0.100:4110"
    },
    "type": "koito"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/clients/lastfm/index.html b/configuration/clients/lastfm/index.html index 0cab15cc..386baecc 100644 --- a/configuration/clients/lastfm/index.html +++ b/configuration/clients/lastfm/index.html @@ -3,11 +3,11 @@ -Last.fm | Multi-Scrobbler +Last.fm | Multi-Scrobbler - + - + @@ -34,6 +34,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only client lastfm configs will validate correctly in the editor but both source and client lastfm configs are allowed in the real CONFIG/lastfm.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a lastfm Client File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/lastfm.json
    [
    {
    "name": "Foxx LFM Client",
    "id": "myLastFmClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "apiKey": "a89cba1569901a0671d5a9875fed4be1",
    "secret": "ec42e09d5ae0ee0f0816ca151008412a",
    "redirectUri": "http://localhost:9078/lastfm/callback"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Client that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "clients": [
    {
    "name": "Foxx LFM Client",
    "id": "myLastFmClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "apiKey": "a89cba1569901a0671d5a9875fed4be1",
    "secret": "ec42e09d5ae0ee0f0816ca151008412a",
    "redirectUri": "http://localhost:9078/lastfm/callback"
    },
    "type": "lastfm"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/clients/librefm/index.html b/configuration/clients/librefm/index.html index 07dddbb5..371f33e4 100644 --- a/configuration/clients/librefm/index.html +++ b/configuration/clients/librefm/index.html @@ -3,11 +3,11 @@ -Libre.fm | Multi-Scrobbler +Libre.fm | Multi-Scrobbler - + - + @@ -34,6 +34,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only client librefm configs will validate correctly in the editor but both source and client librefm configs are allowed in the real CONFIG/librefm.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a librefm Client File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/librefm.json
    [
    {
    "name": "Foxx Libre Client",
    "id": "myLibreFmClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "apiKey": "anything",
    "secret": "anything",
    "redirectUri": "http://localhost:9078/librefm/callback"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Client that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "clients": [
    {
    "name": "Foxx Libre Client",
    "id": "myLibreFmClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "apiKey": "anything",
    "secret": "anything",
    "redirectUri": "http://localhost:9078/librefm/callback"
    },
    "type": "librefm"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/clients/listenbrainz/index.html b/configuration/clients/listenbrainz/index.html index ab76083a..c166a9da 100644 --- a/configuration/clients/listenbrainz/index.html +++ b/configuration/clients/listenbrainz/index.html @@ -3,11 +3,11 @@ -Listenbrainz | Multi-Scrobbler +Listenbrainz | Multi-Scrobbler - + - + @@ -26,6 +26,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only client listenbrainz configs will validate correctly in the editor but both source and client listenbrainz configs are allowed in the real CONFIG/listenbrainz.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a listenbrainz Client File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/listenbrainz.json
    [
    {
    "name": "Foxx LZ Client",
    "id": "brainzClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "FoxxMD",
    "url": "https://api.listenbrainz.org"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Client that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "clients": [
    {
    "name": "Foxx LZ Client",
    "id": "brainzClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "FoxxMD",
    "url": "https://api.listenbrainz.org"
    },
    "type": "listenbrainz"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/clients/maloja/index.html b/configuration/clients/maloja/index.html index a0abca3a..a7395dbb 100644 --- a/configuration/clients/maloja/index.html +++ b/configuration/clients/maloja/index.html @@ -3,11 +3,11 @@ -Maloja | Multi-Scrobbler +Maloja | Multi-Scrobbler - + - + @@ -30,6 +30,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only client maloja configs will validate correctly in the editor but both source and client maloja configs are allowed in the real CONFIG/maloja.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a maloja Client File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/maloja.json
    [
    {
    "name": "Maloja Client",
    "id": "myMalojaClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "url": "http://localhost:42010",
    "apiKey": "myMalojaKey"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Client that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "clients": [
    {
    "name": "Maloja Client",
    "id": "myMalojaClient",
    "enable": true,
    "configureAs": "client",
    "data": {
    "url": "http://localhost:42010",
    "apiKey": "myMalojaKey"
    },
    "type": "maloja"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/clients/rocksky/index.html b/configuration/clients/rocksky/index.html index 431831f5..17c4b4ee 100644 --- a/configuration/clients/rocksky/index.html +++ b/configuration/clients/rocksky/index.html @@ -3,11 +3,11 @@ -Rocksky | Multi-Scrobbler +Rocksky | Multi-Scrobbler - + - + @@ -55,6 +55,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only client rocksky configs will validate correctly in the editor but both source and client rocksky configs are allowed in the real CONFIG/rocksky.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a rocksky Client File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/rocksky.json
    [
    {
    "id": "myRockskyClient",
    "name": "FoxxMD Rocksky Client",
    "configureAs": "client",
    "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",
    "handle": "alice.bsky.social"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Client that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "clients": [
    {
    "id": "myRockskyClient",
    "name": "FoxxMD Rocksky Client",
    "configureAs": "client",
    "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",
    "handle": "alice.bsky.social"
    },
    "type": "rocksky"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/clients/tealfm/index.html b/configuration/clients/tealfm/index.html index 295e423f..0dc7ec8f 100644 --- a/configuration/clients/tealfm/index.html +++ b/configuration/clients/tealfm/index.html @@ -3,11 +3,11 @@ -Teal.fm | Multi-Scrobbler +Teal.fm | Multi-Scrobbler - + - + @@ -66,6 +66,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only client tealfm configs will validate correctly in the editor but both source and client tealfm configs are allowed in the real CONFIG/tealfm.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a tealfm Client File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/tealfm.json
    [
    {
    "id": "myTealClient",
    "name": "Foxx Teal Client",
    "configureAs": "client",
    "data": {
    "identifier": "alice.bsky.social",
    "appPassword": "twog-phu7-4dhe-y4j3"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Client that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "clients": [
    {
    "id": "myTealClient",
    "name": "Foxx Teal Client",
    "configureAs": "client",
    "data": {
    "identifier": "alice.bsky.social",
    "appPassword": "twog-phu7-4dhe-y4j3"
    },
    "type": "tealfm"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/duplicates/index.html b/configuration/duplicates/index.html index 10e182ae..fb3c6292 100644 --- a/configuration/duplicates/index.html +++ b/configuration/duplicates/index.html @@ -3,11 +3,11 @@ -Duplicate Scrobble Guidance | Multi-Scrobbler +Duplicate Scrobble Guidance | Multi-Scrobbler - + - + @@ -98,6 +98,6 @@ -

    This behavior is unique to Last.fm. It's truly the worst out of all the scrobbler services in terms of preserving your data as-is, or providing a unqiue identifier for your data.

    +

    This behavior is unique to Last.fm. It's truly the worst out of all the scrobbler services in terms of preserving your data as-is, or providing a unqiue identifier for your data.

    \ No newline at end of file diff --git a/configuration/index.html b/configuration/index.html index ed788f7d..252605a6 100644 --- a/configuration/index.html +++ b/configuration/index.html @@ -3,11 +3,11 @@ -Overview | Multi-Scrobbler +Overview | Multi-Scrobbler - + - + @@ -254,6 +254,6 @@

    Additionally, general process metrics like cpu and memory usage can be enabled with the env PROMETHEUS_FULL=true

    Example Usage

    Update your Prometheus Configuration file (usually at /etc/prometheus.yml) to add a job to the scrape_configssection like this:

    scrape_configs:
    #
    # ...your other jobs are here
    #
    - job_name: multi-scrobbler
    scrape_interval: 30s
    metrics_path: '/api/metrics'
    static_configs:
    - targets: ['myMultiscrobblerIp:9078']
    -
    Grafana Dashboard

    Github user 4rft5 created a Grafana dashboard that uses the Prometheus metrics from above.

    Download the json dashboard here: multiscrobbler-dashboard.json

    +
    Grafana Dashboard

    Github user 4rft5 created a Grafana dashboard that uses the Prometheus metrics from above.

    Download the json dashboard here: multiscrobbler-dashboard.json

    \ No newline at end of file diff --git a/configuration/kitchensink/index.html b/configuration/kitchensink/index.html index 505cc5b7..3178e0cb 100644 --- a/configuration/kitchensink/index.html +++ b/configuration/kitchensink/index.html @@ -3,11 +3,11 @@ -Kitchen Sink | Multi-Scrobbler +Kitchen Sink | Multi-Scrobbler - + - + @@ -78,6 +78,6 @@ -
    Configuration

    Using ENV Config

    compose.yaml
    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

    # required setup for musicbrainz
    - MB_CONTACT=contact@mydomain.com # a real email
    # searches with sensible release sorting with the searchOrder
    # isrc => basic => artist (native mode)
    - MB_PRESETS=default,sensible,native

    # spotify
    - SPOTIFY_ID=foxxSpotify
    - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs
    - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43
    - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback

    # navidrome listenbrainz endpoint
    - LZE_ID=myLzNavidrome
    - LZE_TOKEN=myToken
    # applies musicbrainz Stage to preTransform of navidrome source
    - LZE_TRANSFORMS=musicbrainz

    # lastfm
    - LASTFM_ID=myLFM
    - LASTFM_API_KEY=myApiKey
    - LASTFM_SECRET=mySecret
    - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback

    volumes:
    - "./config:/config"
    ports:
    - "9078:9078"
    restart: unless-stopped
    +
    Configuration

    Using ENV Config

    compose.yaml
    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

    # required setup for musicbrainz
    - MB_CONTACT=contact@mydomain.com # a real email
    # searches with sensible release sorting with the searchOrder
    # isrc => basic => artist (native mode)
    - MB_PRESETS=default,sensible,native

    # spotify
    - SPOTIFY_ID=foxxSpotify
    - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs
    - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43
    - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback

    # navidrome listenbrainz endpoint
    - LZE_ID=myLzNavidrome
    - LZE_TOKEN=myToken
    # applies musicbrainz Stage to preTransform of navidrome source
    - LZE_TRANSFORMS=musicbrainz

    # lastfm
    - LASTFM_ID=myLFM
    - LASTFM_API_KEY=myApiKey
    - LASTFM_SECRET=mySecret
    - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback

    volumes:
    - "./config:/config"
    ports:
    - "9078:9078"
    restart: unless-stopped
    \ No newline at end of file diff --git a/configuration/sources/applemusic/index.html b/configuration/sources/applemusic/index.html index c939683b..936869ec 100644 --- a/configuration/sources/applemusic/index.html +++ b/configuration/sources/applemusic/index.html @@ -3,11 +3,11 @@ -Apple Music | Multi-Scrobbler +Apple Music | Multi-Scrobbler - + - + @@ -82,6 +82,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source applemusic configs will validate correctly in the editor but both source and client applemusic configs are allowed in the real CONFIG/applemusic.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a applemusic Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/applemusic.json
    [
    {
    "id": "myAppleMusic",
    "name": "My Apple Music",
    "enable": true,
    "clients": [],
    "data": {
    "key": {
    "id": "2HPSNJZ88N",
    "teamId": "SN6YASW8G4",
    "p8": "-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----"
    },
    "token": "your-jwt-token-here",
    "mediaUserToken": "your-media-user-token-here",
    "origin": "https://music.apple.com",
    "interval": 60
    },
    "options": {
    "logDiff": true,
    "recoverUnchangedTopHistory": true,
    "normalizeAlbum": true
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a applemusic Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "myAppleMusic",
    "name": "My Apple Music",
    "enable": true,
    "clients": [],
    "data": {
    "key": {
    "id": "2HPSNJZ88N",
    "teamId": "SN6YASW8G4",
    "p8": "-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----"
    },
    "token": "your-jwt-token-here",
    "mediaUserToken": "your-media-user-token-here",
    "origin": "https://music.apple.com",
    "interval": 60
    },
    "options": {
    "logDiff": true,
    "recoverUnchangedTopHistory": true,
    "normalizeAlbum": true
    },
    "type": "applemusic"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/azuracast/index.html b/configuration/sources/azuracast/index.html index 43e43dfe..fc42986b 100644 --- a/configuration/sources/azuracast/index.html +++ b/configuration/sources/azuracast/index.html @@ -3,11 +3,11 @@ -Azuracast | Multi-Scrobbler +Azuracast | Multi-Scrobbler - + - + @@ -51,6 +51,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source azuracast configs will validate correctly in the editor but both source and client azuracast configs are allowed in the real CONFIG/azuracast.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a azuracast Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/azuracast.json
    [
    {
    "type": "azuracast",
    "enable": true,
    "name": "Cool Station",
    "id": "myAzura",
    "data": {
    "url": "ws://192.168.0.101",
    "station": "my-station-name",
    "monitorWhenLive": true,
    "monitorWhenListeners": 1
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a azuracast Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "type": "azuracast",
    "enable": true,
    "name": "Cool Station",
    "id": "myAzura",
    "data": {
    "url": "ws://192.168.0.101",
    "station": "my-station-name",
    "monitorWhenLive": true,
    "monitorWhenListeners": 1
    }
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/deezer/index.html b/configuration/sources/deezer/index.html index 8889f188..ad139cac 100644 --- a/configuration/sources/deezer/index.html +++ b/configuration/sources/deezer/index.html @@ -3,11 +3,11 @@ -Deezer | Multi-Scrobbler +Deezer | Multi-Scrobbler - + - + @@ -47,6 +47,6 @@
  • Application ID
  • Secret Key
  • Redirect URL (if not the default)
  • -

    If no access token is provided...

    After starting multi-scrobbler with credentials in-place open the dashboard (http://localhost:9078) and find your Deezer source. Click (Re)authenticate and (re)start polling to start the login process. After login is complete polling will begin automatically.

    Configuration​
    Environmental VariableRequired?DefaultDescription
    DEEZER_IDYesA unique ID
    DEEZER_CLIENT_IDYesYour Application ID
    DEEZER_CLIENT_SECRETYesYour Secret Key
    DEEZER_REDIRECT_URINohttp://localhost:9078/deezer/callbackURI must end in deezer/callback
    DEEZER_NAMENoA vanity name different than ID
    +

    If no access token is provided...

    After starting multi-scrobbler with credentials in-place open the dashboard (http://localhost:9078) and find your Deezer source. Click (Re)authenticate and (re)start polling to start the login process. After login is complete polling will begin automatically.

    Configuration​
    Environmental VariableRequired?DefaultDescription
    DEEZER_IDYesA unique ID
    DEEZER_CLIENT_IDYesYour Application ID
    DEEZER_CLIENT_SECRETYesYour Secret Key
    DEEZER_REDIRECT_URINohttp://localhost:9078/deezer/callbackURI must end in deezer/callback
    DEEZER_NAMENoA vanity name different than ID
    \ No newline at end of file diff --git a/configuration/sources/google-cast/index.html b/configuration/sources/google-cast/index.html index 103d5bf0..8e363c7c 100644 --- a/configuration/sources/google-cast/index.html +++ b/configuration/sources/google-cast/index.html @@ -3,11 +3,11 @@ -Google Cast (Chromecast) | Multi-Scrobbler +Google Cast (Chromecast) | Multi-Scrobbler - + - + @@ -41,6 +41,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source chromecast configs will validate correctly in the editor but both source and client chromecast configs are allowed in the real CONFIG/chromecast.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a chromecast Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/chromecast.json
    [
    {
    "name": "My Cast",
    "id": "myCast",
    "data": {
    "blacklistedDevices": [],
    "whitelistedDevices": [],
    "blacklistedApps": [],
    "whitelistedApps": []
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a chromecast Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "My Cast",
    "id": "myCast",
    "data": {
    "blacklistedDevices": [],
    "whitelistedDevices": [],
    "blacklistedApps": [],
    "whitelistedApps": []
    },
    "type": "chromecast"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/icecast/index.html b/configuration/sources/icecast/index.html index 6a92e2d9..f93c803c 100644 --- a/configuration/sources/icecast/index.html +++ b/configuration/sources/icecast/index.html @@ -3,11 +3,11 @@ -Icecast | Multi-Scrobbler +Icecast | Multi-Scrobbler - + - + @@ -35,6 +35,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source icecast configs will validate correctly in the editor but both source and client icecast configs are allowed in the real CONFIG/icecast.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a icecast Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/icecast.json
    [
    {
    "name": "Station 1",
    "enable": true,
    "id": "myIceStation1",
    "data": {
    "url": "http://myIcecast.com/radio"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a icecast Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Station 1",
    "enable": true,
    "id": "myIceStation1",
    "data": {
    "url": "http://myIcecast.com/radio"
    },
    "type": "icecast"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/index.html b/configuration/sources/index.html index ceecbadc..022738b3 100644 --- a/configuration/sources/index.html +++ b/configuration/sources/index.html @@ -3,11 +3,11 @@ -Overview | Multi-Scrobbler +Overview | Multi-Scrobbler - + - + @@ -60,6 +60,6 @@
    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 monitor activity 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 monitor activity. This action can be taken on the Web Dashboard by clicking the link next to Monitoring 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
    "autoMonitor": true
    }
    }
    +
    azuracast.json
    {
    "data": {
    // ...
    },
    "options": {
    // set to true to always scrobble automatically
    // set to false to never scrobble automatically
    "autoMonitor": true
    }
    }
    \ No newline at end of file diff --git a/configuration/sources/jellyfin/index.html b/configuration/sources/jellyfin/index.html index e95d4b93..6903fc45 100644 --- a/configuration/sources/jellyfin/index.html +++ b/configuration/sources/jellyfin/index.html @@ -3,11 +3,11 @@ -Jellyfin | Multi-Scrobbler +Jellyfin | Multi-Scrobbler - + - + @@ -55,6 +55,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source jellyfin configs will validate correctly in the editor but both source and client jellyfin configs are allowed in the real CONFIG/jellyfin.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a jellyfin Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/jellyfin.json
    [
    {
    "name": "Cool JF Server",
    "enable": true,
    "id": "myJellyfin",
    "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"
    ],
    "allowMediaTypes": [
    "audio"
    ],
    "frontendUrlOverride": "https://myJellyfinExternal.tld"
    },
    "options": {
    "logPayload": true,
    "logFilterFailure": "debug"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a jellyfin Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Cool JF Server",
    "enable": true,
    "id": "myJellyfin",
    "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"
    ],
    "allowMediaTypes": [
    "audio"
    ],
    "frontendUrlOverride": "https://myJellyfinExternal.tld"
    },
    "options": {
    "logPayload": true,
    "logFilterFailure": "debug"
    },
    "type": "jellyfin"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/jriver/index.html b/configuration/sources/jriver/index.html index 8f5b0924..c9dc94b3 100644 --- a/configuration/sources/jriver/index.html +++ b/configuration/sources/jriver/index.html @@ -3,11 +3,11 @@ -JRiver | Multi-Scrobbler +JRiver | Multi-Scrobbler - + - + @@ -38,6 +38,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source jriver configs will validate correctly in the editor but both source and client jriver configs are allowed in the real CONFIG/jriver.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a jriver Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/jriver.json
    [
    {
    "name": "My JRiver Server",
    "id": "myRiver",
    "enable": true,
    "data": {
    "url": "0.0.0.0",
    "username": "auser",
    "password": "apassword"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a jriver Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "My JRiver Server",
    "id": "myRiver",
    "enable": true,
    "data": {
    "url": "0.0.0.0",
    "username": "auser",
    "password": "apassword"
    },
    "type": "jriver"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/kodi/index.html b/configuration/sources/kodi/index.html index 90d7d0a9..4e637883 100644 --- a/configuration/sources/kodi/index.html +++ b/configuration/sources/kodi/index.html @@ -3,11 +3,11 @@ -Kodi | Multi-Scrobbler +Kodi | Multi-Scrobbler - + - + @@ -38,6 +38,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source kodi configs will validate correctly in the editor but both source and client kodi configs are allowed in the real CONFIG/kodi.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a kodi Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/kodi.json
    [
    {
    "name": "My Kodi Server",
    "id": "myKodi",
    "enable": true,
    "data": {
    "url": "http://localhost:8080/jsonrpc",
    "username": "myUser",
    "password": "myPassword"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a kodi Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "My Kodi Server",
    "id": "myKodi",
    "enable": true,
    "data": {
    "url": "http://localhost:8080/jsonrpc",
    "username": "myUser",
    "password": "myPassword"
    },
    "type": "kodi"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/koito-source/index.html b/configuration/sources/koito-source/index.html index 31d9d8ff..678b2a62 100644 --- a/configuration/sources/koito-source/index.html +++ b/configuration/sources/koito-source/index.html @@ -3,11 +3,11 @@ -Koito | Multi-Scrobbler +Koito | Multi-Scrobbler - + - + @@ -26,6 +26,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source koito configs will validate correctly in the editor but both source and client koito configs are allowed in the real CONFIG/koito.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    configureAs Required

    When configuring a koito Source in a File Config you must set

    "configureAs": "source"

    Without this property, Multi-Scrobbler will assume the config is for a koito Client config.

    This requirement does not apply to AIO koito configs.

    Config Example Mobile Experience

    This displays an example config file of a koito Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/koito.json
    [
    {
    "name": "Koito Source B",
    "id": "myKoitoSource",
    "configureAs": "source",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "admin",
    "url": "http://192.168.0.100:4110"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a koito Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Koito Source B",
    "id": "myKoitoSource",
    "configureAs": "source",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "admin",
    "url": "http://192.168.0.100:4110"
    },
    "type": "koito"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/lastfm-endpoint/index.html b/configuration/sources/lastfm-endpoint/index.html index c8418844..cbe38e20 100644 --- a/configuration/sources/lastfm-endpoint/index.html +++ b/configuration/sources/lastfm-endpoint/index.html @@ -3,11 +3,11 @@ -Lastfm (Endpoint) | Multi-Scrobbler +Lastfm (Endpoint) | Multi-Scrobbler - + - + @@ -74,6 +74,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source endpointlfm configs will validate correctly in the editor but both source and client endpointlfm configs are allowed in the real CONFIG/endpointlfm.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a endpointlfm Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/endpointlfm.json
    [
    {
    "name": "LFM For App",
    "enable": true,
    "id": "myLfmApp",
    "data": {
    "slug": "mySlug"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlfm Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "LFM For App",
    "enable": true,
    "id": "myLfmApp",
    "data": {
    "slug": "mySlug"
    },
    "type": "endpointlfm"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/lastfm-source/index.html b/configuration/sources/lastfm-source/index.html index c3d4ff51..ea04d816 100644 --- a/configuration/sources/lastfm-source/index.html +++ b/configuration/sources/lastfm-source/index.html @@ -3,11 +3,11 @@ -Last.fm | Multi-Scrobbler +Last.fm | Multi-Scrobbler - + - + @@ -26,6 +26,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source lastfm configs will validate correctly in the editor but both source and client lastfm configs are allowed in the real CONFIG/lastfm.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    configureAs Required

    When configuring a lastfm Source in a File Config you must set

    "configureAs": "source"

    Without this property, Multi-Scrobbler will assume the config is for a lastfm Client config.

    This requirement does not apply to AIO lastfm configs.

    Config Example Mobile Experience

    This displays an example config file of a lastfm Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/lastfm.json
    [
    {
    "name": "Foxx LFM Source",
    "id": "myLastFmSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "apiKey": "a89cba1569901a0671d5a9875fed4be1",
    "secret": "ec42e09d5ae0ee0f0816ca151008412a",
    "redirectUri": "http://localhost:9078/lastfm/callback"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Foxx LFM Source",
    "id": "myLastFmSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "apiKey": "a89cba1569901a0671d5a9875fed4be1",
    "secret": "ec42e09d5ae0ee0f0816ca151008412a",
    "redirectUri": "http://localhost:9078/lastfm/callback"
    },
    "type": "lastfm"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/librefm-source/index.html b/configuration/sources/librefm-source/index.html index 7f5446df..e22f6a46 100644 --- a/configuration/sources/librefm-source/index.html +++ b/configuration/sources/librefm-source/index.html @@ -3,11 +3,11 @@ -Libre.fm | Multi-Scrobbler +Libre.fm | Multi-Scrobbler - + - + @@ -25,6 +25,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source librefm configs will validate correctly in the editor but both source and client librefm configs are allowed in the real CONFIG/librefm.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    configureAs Required

    When configuring a librefm Source in a File Config you must set

    "configureAs": "source"

    Without this property, Multi-Scrobbler will assume the config is for a librefm Client config.

    This requirement does not apply to AIO librefm configs.

    Config Example Mobile Experience

    This displays an example config file of a librefm Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/librefm.json
    [
    {
    "name": "Foxx Libre Source",
    "id": "myLibreFmSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "apiKey": "anything",
    "secret": "anything",
    "redirectUri": "http://localhost:9078/librefm/callback"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Foxx Libre Source",
    "id": "myLibreFmSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "apiKey": "anything",
    "secret": "anything",
    "redirectUri": "http://localhost:9078/librefm/callback"
    },
    "type": "librefm"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/listenbrainz-endpoint/index.html b/configuration/sources/listenbrainz-endpoint/index.html index 2cad3987..c5059c22 100644 --- a/configuration/sources/listenbrainz-endpoint/index.html +++ b/configuration/sources/listenbrainz-endpoint/index.html @@ -3,11 +3,11 @@ -Listenbrainz (Endpoint) | Multi-Scrobbler +Listenbrainz (Endpoint) | Multi-Scrobbler - + - + @@ -99,6 +99,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source endpointlz configs will validate correctly in the editor but both source and client endpointlz configs are allowed in the real CONFIG/endpointlz.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a endpointlz Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/endpointlz.json
    [
    {
    "name": "LZ for Navidrome",
    "id": "myLzNavidrome",
    "enable": true,
    "data": {
    "token": "myToken"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlz Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "LZ for Navidrome",
    "id": "myLzNavidrome",
    "enable": true,
    "data": {
    "token": "myToken"
    },
    "type": "endpointlz"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/listenbrainz-source/index.html b/configuration/sources/listenbrainz-source/index.html index ff99f538..f9faa283 100644 --- a/configuration/sources/listenbrainz-source/index.html +++ b/configuration/sources/listenbrainz-source/index.html @@ -3,11 +3,11 @@ -Listenbrainz | Multi-Scrobbler +Listenbrainz | Multi-Scrobbler - + - + @@ -27,6 +27,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source listenbrainz configs will validate correctly in the editor but both source and client listenbrainz configs are allowed in the real CONFIG/listenbrainz.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    configureAs Required

    When configuring a listenbrainz Source in a File Config you must set

    "configureAs": "source"

    Without this property, Multi-Scrobbler will assume the config is for a listenbrainz Client config.

    This requirement does not apply to AIO listenbrainz configs.

    Config Example Mobile Experience

    This displays an example config file of a listenbrainz Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/listenbrainz.json
    [
    {
    "name": "Foxx LZ Source",
    "id": "brainzSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "FoxxMD",
    "url": "https://api.listenbrainz.org"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Foxx LZ Source",
    "id": "brainzSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
    "username": "FoxxMD",
    "url": "https://api.listenbrainz.org"
    },
    "type": "listenbrainz"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/maloja/index.html b/configuration/sources/maloja/index.html index 65eb247c..586b6153 100644 --- a/configuration/sources/maloja/index.html +++ b/configuration/sources/maloja/index.html @@ -3,11 +3,11 @@ -Maloja | Multi-Scrobbler +Maloja | Multi-Scrobbler - + - + @@ -25,6 +25,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source maloja configs will validate correctly in the editor but both source and client maloja configs are allowed in the real CONFIG/maloja.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    configureAs Required

    When configuring a maloja Source in a File Config you must set

    "configureAs": "source"

    Without this property, Multi-Scrobbler will assume the config is for a maloja Client config.

    This requirement does not apply to AIO maloja configs.

    Config Example Mobile Experience

    This displays an example config file of a maloja Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/maloja.json
    [
    {
    "name": "Maloja Source",
    "id": "myMalojaSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "url": "http://localhost:42010",
    "apiKey": "myMalojaKey"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Maloja Source",
    "id": "myMalojaSource",
    "enable": true,
    "configureAs": "source",
    "data": {
    "url": "http://localhost:42010",
    "apiKey": "myMalojaKey"
    },
    "type": "maloja"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/mopidy/index.html b/configuration/sources/mopidy/index.html index 2ac24b89..f81a2e03 100644 --- a/configuration/sources/mopidy/index.html +++ b/configuration/sources/mopidy/index.html @@ -3,11 +3,11 @@ -Mopidy | Multi-Scrobbler +Mopidy | Multi-Scrobbler - + - + @@ -35,6 +35,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source mopidy configs will validate correctly in the editor but both source and client mopidy configs are allowed in the real CONFIG/mopidy.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a mopidy Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/mopidy.json
    [
    {
    "name": "Mopidy Desktop",
    "id": "MyMopidy",
    "enable": true,
    "data": {
    "url": "localhost",
    "uriBlacklist": [],
    "uriWhitelist": [],
    "albumBlacklist": []
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a mopidy Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Mopidy Desktop",
    "id": "MyMopidy",
    "enable": true,
    "data": {
    "url": "localhost",
    "uriBlacklist": [],
    "uriWhitelist": [],
    "albumBlacklist": []
    },
    "type": "mopidy"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/mpd/index.html b/configuration/sources/mpd/index.html index f89771d0..b75b3b6a 100644 --- a/configuration/sources/mpd/index.html +++ b/configuration/sources/mpd/index.html @@ -3,11 +3,11 @@ -MPD (Music Player Daemon) | Multi-Scrobbler +MPD (Music Player Daemon) | Multi-Scrobbler - + - + @@ -24,6 +24,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source mpd configs will validate correctly in the editor but both source and client mpd configs are allowed in the real CONFIG/mpd.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a mpd Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/mpd.json
    [
    {
    "enable": true,
    "id": "myMPD",
    "name": "Desktop",
    "data": {
    "url": "192.168.0.100:6600",
    "password": "MY_PASSWORD"
    },
    "options": {
    "disableDiscovery": false
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a mpd Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "enable": true,
    "id": "myMPD",
    "name": "Desktop",
    "data": {
    "url": "192.168.0.100:6600",
    "password": "MY_PASSWORD"
    },
    "options": {
    "disableDiscovery": false
    },
    "type": "mpd"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/mpris/index.html b/configuration/sources/mpris/index.html index a347ffa3..b992dad0 100644 --- a/configuration/sources/mpris/index.html +++ b/configuration/sources/mpris/index.html @@ -3,11 +3,11 @@ -MPRIS | Multi-Scrobbler +MPRIS | Multi-Scrobbler - + - + @@ -27,6 +27,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source mpris configs will validate correctly in the editor but both source and client mpris configs are allowed in the real CONFIG/mpris.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a mpris Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/mpris.json
    [
    {
    "name": "Desktop",
    "id": "myMprisUbuntu",
    "enable": true,
    "data": {
    "whitelist": [
    "vlc",
    "mpd"
    ],
    "blacklist": [
    "spotify"
    ]
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a mpris Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Desktop",
    "id": "myMprisUbuntu",
    "enable": true,
    "data": {
    "whitelist": [
    "vlc",
    "mpd"
    ],
    "blacklist": [
    "spotify"
    ]
    },
    "type": "mpris"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/musikcube/index.html b/configuration/sources/musikcube/index.html index 49938466..1f665d80 100644 --- a/configuration/sources/musikcube/index.html +++ b/configuration/sources/musikcube/index.html @@ -3,11 +3,11 @@ -Musikcube | Multi-Scrobbler +Musikcube | Multi-Scrobbler - + - + @@ -31,6 +31,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source musikcube configs will validate correctly in the editor but both source and client musikcube configs are allowed in the real CONFIG/musikcube.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a musikcube Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/musikcube.json
    [
    {
    "type": "musikcube",
    "enable": true,
    "name": "Desktop",
    "id": "myMusikcube",
    "data": {
    "url": "ws://localhost:7905",
    "password": "MY_PASSWORD"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a musikcube Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "type": "musikcube",
    "enable": true,
    "name": "Desktop",
    "id": "myMusikcube",
    "data": {
    "url": "ws://localhost:7905",
    "password": "MY_PASSWORD"
    }
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/plex/index.html b/configuration/sources/plex/index.html index 6c1573f9..3f7aa0a0 100644 --- a/configuration/sources/plex/index.html +++ b/configuration/sources/plex/index.html @@ -3,11 +3,11 @@ -Plex | Multi-Scrobbler +Plex | Multi-Scrobbler - + - + @@ -39,6 +39,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source plex configs will validate correctly in the editor but both source and client plex configs are allowed in the real CONFIG/plex.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a plex Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/plex.json
    [
    {
    "name": "Foxx Plex",
    "id": "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
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a plex Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Foxx Plex",
    "id": "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"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/rocksky-source/index.html b/configuration/sources/rocksky-source/index.html index 72cc95f8..d61dea5a 100644 --- a/configuration/sources/rocksky-source/index.html +++ b/configuration/sources/rocksky-source/index.html @@ -3,11 +3,11 @@ -Rocksky | Multi-Scrobbler +Rocksky | Multi-Scrobbler - + - + @@ -32,6 +32,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source rocksky configs will validate correctly in the editor but both source and client rocksky configs are allowed in the real CONFIG/rocksky.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    configureAs Required

    When configuring a rocksky Source in a File Config you must set

    "configureAs": "source"

    Without this property, Multi-Scrobbler will assume the config is for a rocksky Client config.

    This requirement does not apply to AIO rocksky configs.

    Config Example Mobile Experience

    This displays an example config file of a rocksky Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/rocksky.json
    [
    {
    "id": "myRockskySource",
    "name": "FoxxMD Rocksky Source",
    "configureAs": "source",
    "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",
    "handle": "alice.bsky.social"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "myRockskySource",
    "name": "FoxxMD Rocksky Source",
    "configureAs": "source",
    "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...",
    "handle": "alice.bsky.social"
    },
    "type": "rocksky"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/sonos/index.html b/configuration/sources/sonos/index.html index f6667bbf..af46c657 100644 --- a/configuration/sources/sonos/index.html +++ b/configuration/sources/sonos/index.html @@ -3,11 +3,11 @@ -Sonos | Multi-Scrobbler +Sonos | Multi-Scrobbler - + - + @@ -32,6 +32,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source sonos configs will validate correctly in the editor but both source and client sonos configs are allowed in the real CONFIG/sonos.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a sonos Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/sonos.json
    [
    {
    "enable": true,
    "id": "MySonos",
    "name": "Boom 2",
    "data": {
    "host": "192.168.0.150",
    "devicesAllow": [
    "move",
    "beam"
    ],
    "devicesBlock": [
    "roam"
    ],
    "groupsAllow": [
    "family"
    ],
    "groupsBlock": [
    "bedroom"
    ]
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a sonos Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "enable": true,
    "id": "MySonos",
    "name": "Boom 2",
    "data": {
    "host": "192.168.0.150",
    "devicesAllow": [
    "move",
    "beam"
    ],
    "devicesBlock": [
    "roam"
    ],
    "groupsAllow": [
    "family"
    ],
    "groupsBlock": [
    "bedroom"
    ]
    },
    "type": "sonos"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/spotify/index.html b/configuration/sources/spotify/index.html index f51d16bc..645b9fe1 100644 --- a/configuration/sources/spotify/index.html +++ b/configuration/sources/spotify/index.html @@ -3,11 +3,11 @@ -Spotify | Multi-Scrobbler +Spotify | Multi-Scrobbler - + - + @@ -71,6 +71,6 @@ Client ID/Secret.

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source spotify configs will validate correctly in the editor but both source and client spotify configs are allowed in the real CONFIG/spotify.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a spotify Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/spotify.json
    [
    {
    "id": "MySpotify",
    "name": "Foxx Spotify",
    "enable": true,
    "clients": [],
    "data": {
    "clientId": "a89cba1569901a0671d5a9875fed4be1",
    "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",
    "redirectUri": "http://localhost:9078/callback",
    "interval": 60
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a spotify Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "MySpotify",
    "name": "Foxx Spotify",
    "enable": true,
    "clients": [],
    "data": {
    "clientId": "a89cba1569901a0671d5a9875fed4be1",
    "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",
    "redirectUri": "http://localhost:9078/callback",
    "interval": 60
    },
    "type": "spotify"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/subsonic/index.html b/configuration/sources/subsonic/index.html index 953a2ea6..318360bc 100644 --- a/configuration/sources/subsonic/index.html +++ b/configuration/sources/subsonic/index.html @@ -3,11 +3,11 @@ -Subsonic | Multi-Scrobbler +Subsonic | Multi-Scrobbler - + - + @@ -32,6 +32,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source subsonic configs will validate correctly in the editor but both source and client subsonic configs are allowed in the real CONFIG/subsonic.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a subsonic Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/subsonic.json
    [
    {
    "id": "mySubsonic",
    "name": "Airsonic Server",
    "enable": true,
    "data": {
    "url": "http://localhost:4040/airsonic",
    "user": "yourUser",
    "password": "yourPassword",
    "usersAllow": [
    "yourUser"
    ],
    "detectStaleNowPlayingFromMinutesAgo": true
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a subsonic Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "mySubsonic",
    "name": "Airsonic Server",
    "enable": true,
    "data": {
    "url": "http://localhost:4040/airsonic",
    "user": "yourUser",
    "password": "yourPassword",
    "usersAllow": [
    "yourUser"
    ],
    "detectStaleNowPlayingFromMinutesAgo": true
    },
    "type": "subsonic"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/tealfm-source/index.html b/configuration/sources/tealfm-source/index.html index 33cf0b28..18240b4e 100644 --- a/configuration/sources/tealfm-source/index.html +++ b/configuration/sources/tealfm-source/index.html @@ -3,11 +3,11 @@ -Teal.fm | Multi-Scrobbler +Teal.fm | Multi-Scrobbler - + - + @@ -43,6 +43,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source tealfm configs will validate correctly in the editor but both source and client tealfm configs are allowed in the real CONFIG/tealfm.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    configureAs Required

    When configuring a tealfm Source in a File Config you must set

    "configureAs": "source"

    Without this property, Multi-Scrobbler will assume the config is for a tealfm Client config.

    This requirement does not apply to AIO tealfm configs.

    Config Example Mobile Experience

    This displays an example config file of a tealfm Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/tealfm.json
    [
    {
    "id": "myTealSource",
    "name": "Foxx Teal Source",
    "configureAs": "source",
    "data": {
    "identifier": "alice.bsky.social",
    "appPassword": "twog-phu7-4dhe-y4j3",
    "serviceAllow": [
    "plyr"
    ],
    "serviceDeny": [
    "last.fm"
    ]
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "myTealSource",
    "name": "Foxx Teal Source",
    "configureAs": "source",
    "data": {
    "identifier": "alice.bsky.social",
    "appPassword": "twog-phu7-4dhe-y4j3",
    "serviceAllow": [
    "plyr"
    ],
    "serviceDeny": [
    "last.fm"
    ]
    },
    "type": "tealfm"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/vlc/index.html b/configuration/sources/vlc/index.html index 01bd6978..45470542 100644 --- a/configuration/sources/vlc/index.html +++ b/configuration/sources/vlc/index.html @@ -3,11 +3,11 @@ -VLC | Multi-Scrobbler +VLC | Multi-Scrobbler - + - + @@ -58,6 +58,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source vlc configs will validate correctly in the editor but both source and client vlc configs are allowed in the real CONFIG/vlc.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a vlc Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/vlc.json
    [
    {
    "enable": true,
    "id": "myVlc",
    "name": "Desktop",
    "data": {
    "url": "localhost:8080",
    "password": "changeme"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a vlc Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "enable": true,
    "id": "myVlc",
    "name": "Desktop",
    "data": {
    "url": "localhost:8080",
    "password": "changeme"
    },
    "type": "vlc"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/webscrobbler/index.html b/configuration/sources/webscrobbler/index.html index 4fb9f291..bfed6dc7 100644 --- a/configuration/sources/webscrobbler/index.html +++ b/configuration/sources/webscrobbler/index.html @@ -3,11 +3,11 @@ -Webscrobbler | Multi-Scrobbler +Webscrobbler | Multi-Scrobbler - + - + @@ -49,6 +49,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source webscrobbler configs will validate correctly in the editor but both source and client webscrobbler configs are allowed in the real CONFIG/webscrobbler.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a webscrobbler Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/webscrobbler.json
    [
    {
    "id": "MyWebScrobbler",
    "name": "Firefox Laptop",
    "data": {
    "slug": "MyOptionalSlug",
    "whitelist": [],
    "blacklist": []
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a webscrobbler Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "MyWebScrobbler",
    "name": "Firefox Laptop",
    "data": {
    "slug": "MyOptionalSlug",
    "whitelist": [],
    "blacklist": []
    },
    "type": "webscrobbler"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/yamaha-musiccast/index.html b/configuration/sources/yamaha-musiccast/index.html index 7cd760a2..ab4c6d03 100644 --- a/configuration/sources/yamaha-musiccast/index.html +++ b/configuration/sources/yamaha-musiccast/index.html @@ -3,11 +3,11 @@ -Yamaha MusicCast | Multi-Scrobbler +Yamaha MusicCast | Multi-Scrobbler - + - + @@ -26,6 +26,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source musiccast configs will validate correctly in the editor but both source and client musiccast configs are allowed in the real CONFIG/musiccast.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a musiccast Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/musiccast.json
    [
    {
    "name": "Livingroom Reciever",
    "id": "myYamaha",
    "enable": true,
    "data": {
    "url": "192.168.0.101"
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a musiccast Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "name": "Livingroom Reciever",
    "id": "myYamaha",
    "enable": true,
    "data": {
    "url": "192.168.0.101"
    },
    "type": "musiccast"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/yandex-music/index.html b/configuration/sources/yandex-music/index.html index e8d07b0b..52ecaf9e 100644 --- a/configuration/sources/yandex-music/index.html +++ b/configuration/sources/yandex-music/index.html @@ -3,11 +3,11 @@ -Yandex Music | Multi-Scrobbler +Yandex Music | Multi-Scrobbler - + - + @@ -24,6 +24,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source ymbridge configs will validate correctly in the editor but both source and client ymbridge configs are allowed in the real CONFIG/ymbridge.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a ymbridge Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/ymbridge.json
    [
    {
    "id": "myYandex",
    "name": "Yandex Music",
    "type": "ymbridge",
    "data": {
    "url": "http://192.168.1.161:9980",
    "apiKey": "change-me",
    "interval": 3
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a ymbridge Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "myYandex",
    "name": "Yandex Music",
    "type": "ymbridge",
    "data": {
    "url": "http://192.168.1.161:9980",
    "apiKey": "change-me",
    "interval": 3
    }
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/sources/youtube-music/index.html b/configuration/sources/youtube-music/index.html index eb149bd6..7cf91e51 100644 --- a/configuration/sources/youtube-music/index.html +++ b/configuration/sources/youtube-music/index.html @@ -3,11 +3,11 @@ -Youtube Music | Multi-Scrobbler +Youtube Music | Multi-Scrobbler - + - + @@ -76,6 +76,6 @@

    Both modes validate that the configuration is correct. Any errors show up as squiggly lines.

    important

    Only source ytmusic configs will validate correctly in the editor but both source and client ytmusic configs are allowed in the real CONFIG/ytmusic.json

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a ytmusic Source File Configuration that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/ytmusic.json
    [
    {
    "id": "myYtMusic",
    "name": "Foxx YT Music",
    "enable": true,
    "clients": [],
    "data": {
    "cookie": "__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......",
    "clientId": "891098404....apps.googleusercontent.com",
    "clientSecret": "GOCS..."
    },
    "options": {
    "logDiff": true
    }
    }
    ]
    +

    Both modes validate that the configuraion is correct. Any errors show up as squiggly lines.

    After you finish editing, switch to text and then copy all text to get a completed config.

    Config Example Mobile Experience

    This displays an example config file of a all-in-one (config.json) configuration that includes a ytmusic Source that adheres to the shown Config Structure.

    The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features.

    CONFIG/config.json
    {
    "sources": [
    {
    "id": "myYtMusic",
    "name": "Foxx YT Music",
    "enable": true,
    "clients": [],
    "data": {
    "cookie": "__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......",
    "clientId": "891098404....apps.googleusercontent.com",
    "clientSecret": "GOCS..."
    },
    "options": {
    "logDiff": true
    },
    "type": "ytmusic"
    }
    ]
    }
    \ No newline at end of file diff --git a/configuration/transforms/index.html b/configuration/transforms/index.html index 2ca67b34..b28a4e15 100644 --- a/configuration/transforms/index.html +++ b/configuration/transforms/index.html @@ -3,11 +3,11 @@ -Enhancing Scrobbles | Multi-Scrobbler +Enhancing Scrobbles | Multi-Scrobbler - + - + @@ -137,6 +137,6 @@
  • User Stage
  • Native Stage
  • Musicbrainz Stage
  • - + \ No newline at end of file diff --git a/configuration/transforms/musicbrainz/index.html b/configuration/transforms/musicbrainz/index.html index 5e652e7c..5aaeae01 100644 --- a/configuration/transforms/musicbrainz/index.html +++ b/configuration/transforms/musicbrainz/index.html @@ -3,11 +3,11 @@ -Musicbrainz Stage | Multi-Scrobbler +Musicbrainz Stage | Multi-Scrobbler - + - + @@ -238,6 +238,6 @@
    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
    }
    ]
    }
    }
    }
    ]

    Use Metadata for Discord Album Art​

    The Discord Client can fetch album art images from Cover Art Archive if the Scrobble data contains a Release MBID. Use the Musicbrainz Stage on the preCompare hook for your Discord client so that missing Musicbrainz IDs are populated for this functionality.

    -
    Example

    Using the ENV Configuration from above, add these fields to your docker compose environment:

    - MB_CONTACT=contact@mydomain.com
    - MB_PRESETS=id,native,sensible
    - DISCORD_TRANSFORMS=musicbrainz
    +
    Example

    Using the ENV Configuration from above, add these fields to your docker compose environment:

    - MB_CONTACT=contact@mydomain.com
    - MB_PRESETS=id,native,sensible
    - DISCORD_TRANSFORMS=musicbrainz
    \ No newline at end of file diff --git a/configuration/transforms/native/index.html b/configuration/transforms/native/index.html index 464b106a..37e73c93 100644 --- a/configuration/transforms/native/index.html +++ b/configuration/transforms/native/index.html @@ -3,11 +3,11 @@ -Native Stage | Multi-Scrobbler +Native Stage | Multi-Scrobbler - + - + @@ -84,6 +84,6 @@
    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"
    }
    ]
    }
    }
    }
    ]

    Extract Artists from Title but do not modify Title​

    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
    }
    ]
    }
    }
    }
    ]
    +
    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
    }
    ]
    }
    }
    }
    ]
    \ No newline at end of file diff --git a/configuration/transforms/user/index.html b/configuration/transforms/user/index.html index b89446fb..bb4c4c5a 100644 --- a/configuration/transforms/user/index.html +++ b/configuration/transforms/user/index.html @@ -3,11 +3,11 @@ -User Stage | Multi-Scrobbler +User Stage | Multi-Scrobbler - + - + @@ -60,6 +60,6 @@
  • (?<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
    {
    "type": "user",
    "artists": [
    {
    "search": "(.*?)(?<delim>\\s*\\/\\s*)(.*$)",
    "replace": "$1"
    }
    ]
    }
    +
    Example
    {
    "type": "user",
    "artists": [
    {
    "search": "(.*?)(?<delim>\\s*\\/\\s*)(.*$)",
    "replace": "$1"
    }
    ]
    }
    \ No newline at end of file diff --git a/development/dev-common/index.html b/development/dev-common/index.html index 24cdd243..5d8cce88 100644 --- a/development/dev-common/index.html +++ b/development/dev-common/index.html @@ -3,11 +3,11 @@ -Common Development | Multi-Scrobbler +Common Development | Multi-Scrobbler - + - + @@ -115,6 +115,6 @@

    Run tsx with inspect args

    NODE_ENV=production node node_modules/.bin/tsx --inspect --heap-prof src/backend/index.ts

    Use chrome://inspect from a chromium-based browser and attach to the running process, usually localhost:9229

    -

    From the opened DevTools window use Performance or Memory to profile the running process.

    +

    From the opened DevTools window use Performance or Memory to profile the running process.

    \ No newline at end of file diff --git a/development/dev-source/index.html b/development/dev-source/index.html index 746a07c0..cc558273 100644 --- a/development/dev-source/index.html +++ b/development/dev-source/index.html @@ -3,11 +3,11 @@ -Source Development/Tutorial | Multi-Scrobbler +Source Development/Tutorial | Multi-Scrobbler - + - + @@ -105,6 +105,6 @@

    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.

    +
    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.

    \ No newline at end of file diff --git a/development/flatpak/index.html b/development/flatpak/index.html index 5c90dcb0..495df87b 100644 --- a/development/flatpak/index.html +++ b/development/flatpak/index.html @@ -3,11 +3,11 @@ -Flatpak | Multi-Scrobbler +Flatpak | Multi-Scrobbler - + - + @@ -31,6 +31,6 @@
    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.

    Run App

    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
    +
    flatpak run -u io.github.foxxmd.multiscrobbler
    \ No newline at end of file diff --git a/help/index.html b/help/index.html index e669c001..05591e81 100644 --- a/help/index.html +++ b/help/index.html @@ -3,11 +3,11 @@ -Help | Multi-Scrobbler +Help | Multi-Scrobbler - + - + @@ -40,6 +40,6 @@
  • If you want to request new functionality use the Feature Request issue template
  • If you want to request a new Source/Client implementation use the New Source/Client issue template
  • -

    If none of the above apply to you then create a new bug report. Please include all logs and play debug data relevant to your issue. The more logs the better. If possible, replicate the issue with debug mode turned on.

    +

    If none of the above apply to you then create a new bug report. Please include all logs and play debug data relevant to your issue. The more logs the better. If possible, replicate the issue with debug mode turned on.

    \ No newline at end of file diff --git a/index.html b/index.html index 1cc735e9..93efbd2a 100644 --- a/index.html +++ b/index.html @@ -3,11 +3,11 @@ -Overview | Multi-Scrobbler +Overview | Multi-Scrobbler - + - + @@ -123,6 +123,6 @@

    Development​

    Detailed architecture and development guides for Sources/Clients

    License​

    -

    MIT

    +

    MIT

    \ No newline at end of file diff --git a/installation/index.html b/installation/index.html index 0f3e5dc6..cf769e78 100644 --- a/installation/index.html +++ b/installation/index.html @@ -3,11 +3,11 @@ -Overview | Multi-Scrobbler +Overview | Multi-Scrobbler - + - + @@ -75,6 +75,6 @@
    JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c JELLYFIN_URL=192.168.0.101:8096 JELLYFIN_USER=MyUser MALOJA_URL="http://domain.tld" node src/index.js
    tip

    The web UI and API is served on port 9078. This can be modified using the PORT environmental variable.

    Flatpak​

    -
    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.

    +
    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.

    \ No newline at end of file diff --git a/installation/service/index.html b/installation/service/index.html index 9c450d37..f538b28a 100644 --- a/installation/service/index.html +++ b/installation/service/index.html @@ -3,11 +3,11 @@ -As a Service | Multi-Scrobbler +As a Service | Multi-Scrobbler - + - + @@ -32,6 +32,6 @@
  • start the service now
  • Other Service Methods

    -

    Open a PR if you would like to document setting up multi-scrobbler for other service managers!

    +

    Open a PR if you would like to document setting up multi-scrobbler for other service managers!

    \ No newline at end of file diff --git a/playground/index.html b/playground/index.html index cd6d22ba..deac972f 100644 --- a/playground/index.html +++ b/playground/index.html @@ -3,11 +3,11 @@ -Playground | Multi-Scrobbler +Playground | Multi-Scrobbler - + - + diff --git a/preview-images/92ea61ac244b5bfee2bec534d2de523af8cd7cde.png b/preview-images/03706fb208ac1c95a048ce78c924f6a19f6d9de8.png similarity index 100% rename from preview-images/92ea61ac244b5bfee2bec534d2de523af8cd7cde.png rename to preview-images/03706fb208ac1c95a048ce78c924f6a19f6d9de8.png diff --git a/preview-images/4b38ed0830c0f1fbbb81589feb166cd9dd5cc098.png b/preview-images/04775efabc71f03ace6ca23a19a0eb42f7979a84.png similarity index 100% rename from preview-images/4b38ed0830c0f1fbbb81589feb166cd9dd5cc098.png rename to preview-images/04775efabc71f03ace6ca23a19a0eb42f7979a84.png diff --git a/preview-images/30d7b1919fcafc63f61fd0330bf09c04e05fcc0c.png b/preview-images/05f284f0205c8c68ceb1ed69ee1518288a7dd339.png similarity index 100% rename from preview-images/30d7b1919fcafc63f61fd0330bf09c04e05fcc0c.png rename to preview-images/05f284f0205c8c68ceb1ed69ee1518288a7dd339.png diff --git a/preview-images/39e254c9904ed3353f81ec151fd337c6f7dd6e6c.png b/preview-images/0c37a4e5a372efdc1e1d65a745db0b29439fe877.png similarity index 100% rename from preview-images/39e254c9904ed3353f81ec151fd337c6f7dd6e6c.png rename to preview-images/0c37a4e5a372efdc1e1d65a745db0b29439fe877.png diff --git a/preview-images/3614367ca56b77ce470f6691562213ed6c30b7f6.png b/preview-images/0c77523f647c99228affbb7cb956564c93ef5c92.png similarity index 100% rename from preview-images/3614367ca56b77ce470f6691562213ed6c30b7f6.png rename to preview-images/0c77523f647c99228affbb7cb956564c93ef5c92.png diff --git a/preview-images/29df448c9d3d425aca41635206ed128fb93cb667.png b/preview-images/103ab48dfe6eb199648d03ecc3c77cec51c6fa87.png similarity index 100% rename from preview-images/29df448c9d3d425aca41635206ed128fb93cb667.png rename to preview-images/103ab48dfe6eb199648d03ecc3c77cec51c6fa87.png diff --git a/preview-images/fea8269cfdf655360114effcd55053f6ffa73237.png b/preview-images/16d4d38cfd79fffbff69a10c44661eae71d2fcc7.png similarity index 100% rename from preview-images/fea8269cfdf655360114effcd55053f6ffa73237.png rename to preview-images/16d4d38cfd79fffbff69a10c44661eae71d2fcc7.png diff --git a/preview-images/be0d078b11d99fe0d103a008c7e3eaf461712a2c.png b/preview-images/179c53cdbf158c55e942b7daa77aa0cf6564dbf3.png similarity index 100% rename from preview-images/be0d078b11d99fe0d103a008c7e3eaf461712a2c.png rename to preview-images/179c53cdbf158c55e942b7daa77aa0cf6564dbf3.png diff --git a/preview-images/e71a277ea713347a1b4f1b8efd6b2ec48c1d2cba.png b/preview-images/17ddd59273844114108795014334ef5f5d569ffe.png similarity index 100% rename from preview-images/e71a277ea713347a1b4f1b8efd6b2ec48c1d2cba.png rename to preview-images/17ddd59273844114108795014334ef5f5d569ffe.png diff --git a/preview-images/0de5470e5880945fcd51ecb86bd93d38ff8e635b.png b/preview-images/1da07869193dce3ae165631e8be9bf3b36e08c19.png similarity index 100% rename from preview-images/0de5470e5880945fcd51ecb86bd93d38ff8e635b.png rename to preview-images/1da07869193dce3ae165631e8be9bf3b36e08c19.png diff --git a/preview-images/2446102e1afe96613b4668a28b430e40986b4cb3.png b/preview-images/21021d29dd8223e60c197e795b86eee7bb295b36.png similarity index 100% rename from preview-images/2446102e1afe96613b4668a28b430e40986b4cb3.png rename to preview-images/21021d29dd8223e60c197e795b86eee7bb295b36.png diff --git a/preview-images/4b74b86b96a056d4034bc2c62fbeec97e3068b5a.png b/preview-images/24a3600f5d63fd7b145e726c3f6b8dcd7b4e3d0e.png similarity index 100% rename from preview-images/4b74b86b96a056d4034bc2c62fbeec97e3068b5a.png rename to preview-images/24a3600f5d63fd7b145e726c3f6b8dcd7b4e3d0e.png diff --git a/preview-images/527077858e5a967d7456b53311e32eeb0880d04e.png b/preview-images/28a3abbdf41acd4c4d09dfaa6cba0e29bcc7729c.png similarity index 100% rename from preview-images/527077858e5a967d7456b53311e32eeb0880d04e.png rename to preview-images/28a3abbdf41acd4c4d09dfaa6cba0e29bcc7729c.png diff --git a/preview-images/993a672b5d02886c5dee7396fccb77a9caf2601e.png b/preview-images/2b367609da9d1be3a932c7907ab32cce0731227d.png similarity index 100% rename from preview-images/993a672b5d02886c5dee7396fccb77a9caf2601e.png rename to preview-images/2b367609da9d1be3a932c7907ab32cce0731227d.png diff --git a/preview-images/8db6746b5ef661f980bf22ee90118b6816fa94f1.png b/preview-images/30fa06f846d61e19cf0acf6cfd880732ad4b5dfc.png similarity index 100% rename from preview-images/8db6746b5ef661f980bf22ee90118b6816fa94f1.png rename to preview-images/30fa06f846d61e19cf0acf6cfd880732ad4b5dfc.png diff --git a/preview-images/f8fdcae039e16fe3a94af233d70e9791629ff8f7.png b/preview-images/3a89200d5d0fe81af529b6ec8b4d422e12c78983.png similarity index 100% rename from preview-images/f8fdcae039e16fe3a94af233d70e9791629ff8f7.png rename to preview-images/3a89200d5d0fe81af529b6ec8b4d422e12c78983.png diff --git a/preview-images/7754158319a66976e063101a1e142ac48ac5c2b4.png b/preview-images/48b6ff8ee8f9850685e8e6b33ad662d93272054d.png similarity index 100% rename from preview-images/7754158319a66976e063101a1e142ac48ac5c2b4.png rename to preview-images/48b6ff8ee8f9850685e8e6b33ad662d93272054d.png diff --git a/preview-images/a67b52a6c7940097030157a1fd7d1da4f2eb6885.png b/preview-images/496e9ca37357f69259598310ad399c73912f1bfc.png similarity index 100% rename from preview-images/a67b52a6c7940097030157a1fd7d1da4f2eb6885.png rename to preview-images/496e9ca37357f69259598310ad399c73912f1bfc.png diff --git a/preview-images/0d90a01383f1887ce724c7a017566dc8f581ff88.png b/preview-images/4b3c898122453c7cb23b575200057873f53251bc.png similarity index 100% rename from preview-images/0d90a01383f1887ce724c7a017566dc8f581ff88.png rename to preview-images/4b3c898122453c7cb23b575200057873f53251bc.png diff --git a/preview-images/6b12435cc5e4e694bafeeb520c0edae73b599ffe.png b/preview-images/4c888284ab5bc9cdea04d3680043963785197ebe.png similarity index 100% rename from preview-images/6b12435cc5e4e694bafeeb520c0edae73b599ffe.png rename to preview-images/4c888284ab5bc9cdea04d3680043963785197ebe.png diff --git a/preview-images/5b0a9f7cdcc6055508f89da9983ac005a3f872a4.png b/preview-images/537e2f7cddbd8cc6e30bf35d5c1569b44fa233b7.png similarity index 100% rename from preview-images/5b0a9f7cdcc6055508f89da9983ac005a3f872a4.png rename to preview-images/537e2f7cddbd8cc6e30bf35d5c1569b44fa233b7.png diff --git a/preview-images/1efbb55e56a63d2a53aa40c6f8ccf5d388f6a348.png b/preview-images/6764229ed00ed34f91e59ed8b2f463845a256272.png similarity index 100% rename from preview-images/1efbb55e56a63d2a53aa40c6f8ccf5d388f6a348.png rename to preview-images/6764229ed00ed34f91e59ed8b2f463845a256272.png diff --git a/preview-images/88124dc72476e93c1b429c8b2b5fa6979043601e.png b/preview-images/68958ca0d5c8349172bcccb56409b9b3307fee23.png similarity index 100% rename from preview-images/88124dc72476e93c1b429c8b2b5fa6979043601e.png rename to preview-images/68958ca0d5c8349172bcccb56409b9b3307fee23.png diff --git a/preview-images/26ddb4e69b27077134883a971453453aa17b1082.png b/preview-images/69114620132778c2d3729b3f7ee9c2f8c58d3e2f.png similarity index 100% rename from preview-images/26ddb4e69b27077134883a971453453aa17b1082.png rename to preview-images/69114620132778c2d3729b3f7ee9c2f8c58d3e2f.png diff --git a/preview-images/05e730f1302d34adab3453e3395fa50362728450.png b/preview-images/6bf948ab610df8177f8eb634b9873ccd233d536e.png similarity index 100% rename from preview-images/05e730f1302d34adab3453e3395fa50362728450.png rename to preview-images/6bf948ab610df8177f8eb634b9873ccd233d536e.png diff --git a/preview-images/cf2cbb152015f78f3a4bb2b98506dd1f7ed70f96.png b/preview-images/742fafe6b1cc18071721f07521e51ccd8865cbe6.png similarity index 100% rename from preview-images/cf2cbb152015f78f3a4bb2b98506dd1f7ed70f96.png rename to preview-images/742fafe6b1cc18071721f07521e51ccd8865cbe6.png diff --git a/preview-images/674ba131f2c764d2e74df643171e46812341814b.png b/preview-images/75933a10849bcda5c94e88d924f76d0478aabacb.png similarity index 100% rename from preview-images/674ba131f2c764d2e74df643171e46812341814b.png rename to preview-images/75933a10849bcda5c94e88d924f76d0478aabacb.png diff --git a/preview-images/754dbd8786e3fedd8174ef54bf214a52a4442445.png b/preview-images/7671f601b5bb7490808cfbcf734c424b5fac6f56.png similarity index 100% rename from preview-images/754dbd8786e3fedd8174ef54bf214a52a4442445.png rename to preview-images/7671f601b5bb7490808cfbcf734c424b5fac6f56.png diff --git a/preview-images/fc3eda02a22ec0602dd7727cec2a36a872caddcc.png b/preview-images/79ed183375a4a0564413ec5553c7be7fd066537f.png similarity index 100% rename from preview-images/fc3eda02a22ec0602dd7727cec2a36a872caddcc.png rename to preview-images/79ed183375a4a0564413ec5553c7be7fd066537f.png diff --git a/preview-images/aa0aefc75ec714349a7cdf25869c41b6ade6ba61.png b/preview-images/7e5b38cfcd9b46d50d64c98661c62c544516db37.png similarity index 100% rename from preview-images/aa0aefc75ec714349a7cdf25869c41b6ade6ba61.png rename to preview-images/7e5b38cfcd9b46d50d64c98661c62c544516db37.png diff --git a/preview-images/ff43c7945e1fc3544f8dae05b999e2a94d05d403.png b/preview-images/8501ac64a388db642c3b20c9eb6cae4b48bddb7e.png similarity index 100% rename from preview-images/ff43c7945e1fc3544f8dae05b999e2a94d05d403.png rename to preview-images/8501ac64a388db642c3b20c9eb6cae4b48bddb7e.png diff --git a/preview-images/b4b24afe7847e9b97200fd83c5d941aa25c46bf6.png b/preview-images/8957b9254d4397043c4ab5e6d161509b431f4434.png similarity index 100% rename from preview-images/b4b24afe7847e9b97200fd83c5d941aa25c46bf6.png rename to preview-images/8957b9254d4397043c4ab5e6d161509b431f4434.png diff --git a/preview-images/54f26bae0a6112e472afd4f6e3d8ca20feddb1cc.png b/preview-images/89b0a178f6301089b96666fc7d8cc18d6db58f4b.png similarity index 100% rename from preview-images/54f26bae0a6112e472afd4f6e3d8ca20feddb1cc.png rename to preview-images/89b0a178f6301089b96666fc7d8cc18d6db58f4b.png diff --git a/preview-images/9bf6dab0114bce9fa1122e3f727e0dfd72aa25c5.png b/preview-images/8b2c2164bf8ccc399a7df4c4db48528af2489e52.png similarity index 100% rename from preview-images/9bf6dab0114bce9fa1122e3f727e0dfd72aa25c5.png rename to preview-images/8b2c2164bf8ccc399a7df4c4db48528af2489e52.png diff --git a/preview-images/be26be2f8f4f06234d4d0621e448842a594dac1e.png b/preview-images/8ee00d679eb7aade4de4793bde2262ed98910b72.png similarity index 100% rename from preview-images/be26be2f8f4f06234d4d0621e448842a594dac1e.png rename to preview-images/8ee00d679eb7aade4de4793bde2262ed98910b72.png diff --git a/preview-images/c4735aa4ac2bd0c648690dbe4167171149651e5a.png b/preview-images/91035358cd50bdf6e6bc07050c4a16738f10ee62.png similarity index 100% rename from preview-images/c4735aa4ac2bd0c648690dbe4167171149651e5a.png rename to preview-images/91035358cd50bdf6e6bc07050c4a16738f10ee62.png diff --git a/preview-images/b70f487dd1041eeaeee50ca9d1e45f479a16fc54.png b/preview-images/923ce523694d92226f4f4920b1f7c9d60fa756cb.png similarity index 100% rename from preview-images/b70f487dd1041eeaeee50ca9d1e45f479a16fc54.png rename to preview-images/923ce523694d92226f4f4920b1f7c9d60fa756cb.png diff --git a/preview-images/3e11a15053b02be2a425643ae5dbc02386f27192.png b/preview-images/97796d646d9ab37d860f4325b7ff8f269296f26e.png similarity index 100% rename from preview-images/3e11a15053b02be2a425643ae5dbc02386f27192.png rename to preview-images/97796d646d9ab37d860f4325b7ff8f269296f26e.png diff --git a/preview-images/d9e32b7c7e56ea9a70ce5c92cdd0d4b7faec8c12.png b/preview-images/9c776c3a7d51378966630b607f406c2f23fd5a3c.png similarity index 100% rename from preview-images/d9e32b7c7e56ea9a70ce5c92cdd0d4b7faec8c12.png rename to preview-images/9c776c3a7d51378966630b607f406c2f23fd5a3c.png diff --git a/preview-images/555ae9612c6b4bc6f4f9b03edc447277f0713a3a.png b/preview-images/a3891dac5feaa7dca7be04ea66a7d27d3c66a42c.png similarity index 100% rename from preview-images/555ae9612c6b4bc6f4f9b03edc447277f0713a3a.png rename to preview-images/a3891dac5feaa7dca7be04ea66a7d27d3c66a42c.png diff --git a/preview-images/04c0fce5dbaa19b205b611b668eb84d9d3f3a8ef.png b/preview-images/a98c3609137c55346dbc825fbff2cbe1b3939987.png similarity index 100% rename from preview-images/04c0fce5dbaa19b205b611b668eb84d9d3f3a8ef.png rename to preview-images/a98c3609137c55346dbc825fbff2cbe1b3939987.png diff --git a/preview-images/c0d0e14d6285ffed446b2ee8586d709789c23334.png b/preview-images/aa417125ed564d95f29716e000e70d9a9356f666.png similarity index 100% rename from preview-images/c0d0e14d6285ffed446b2ee8586d709789c23334.png rename to preview-images/aa417125ed564d95f29716e000e70d9a9356f666.png diff --git a/preview-images/3b0a547a6b984d2e032a302c572b45f211fcc025.png b/preview-images/b628bc3eb396995324ab219b62c779898c860113.png similarity index 100% rename from preview-images/3b0a547a6b984d2e032a302c572b45f211fcc025.png rename to preview-images/b628bc3eb396995324ab219b62c779898c860113.png diff --git a/preview-images/209744ca2a8044af33b58e114cecc383643f9da8.png b/preview-images/baa09ddf64949ae5a42a58694169dfabf1ac0086.png similarity index 100% rename from preview-images/209744ca2a8044af33b58e114cecc383643f9da8.png rename to preview-images/baa09ddf64949ae5a42a58694169dfabf1ac0086.png diff --git a/preview-images/b4d06de89a56302e61ecfdebc6e9aa5e501b363d.png b/preview-images/c4461bf5fa39006bfa9f901892bcd0d71013cf56.png similarity index 100% rename from preview-images/b4d06de89a56302e61ecfdebc6e9aa5e501b363d.png rename to preview-images/c4461bf5fa39006bfa9f901892bcd0d71013cf56.png diff --git a/preview-images/0638d0f0852f8bf8496ba69bf81bdde09e952a52.png b/preview-images/c46d9d4e6c564e9bd3563cb50bd3a7fa1c28b1ca.png similarity index 100% rename from preview-images/0638d0f0852f8bf8496ba69bf81bdde09e952a52.png rename to preview-images/c46d9d4e6c564e9bd3563cb50bd3a7fa1c28b1ca.png diff --git a/preview-images/16b9ded1db3f9acc99cb52883fd31bdeaa91eb19.png b/preview-images/c47b8a55ba7742a78253b7cb6d7bec8f42acc2b3.png similarity index 100% rename from preview-images/16b9ded1db3f9acc99cb52883fd31bdeaa91eb19.png rename to preview-images/c47b8a55ba7742a78253b7cb6d7bec8f42acc2b3.png diff --git a/preview-images/200b42265c5456b6822ac6ddf39d314a47a60b3d.png b/preview-images/cc7b0be3b6416435ac4507d62b08c9ef2dfbe4cc.png similarity index 100% rename from preview-images/200b42265c5456b6822ac6ddf39d314a47a60b3d.png rename to preview-images/cc7b0be3b6416435ac4507d62b08c9ef2dfbe4cc.png diff --git a/preview-images/1099a8c70c147f485f487cc54216f97f0c28e2d0.png b/preview-images/cda6a6fc0e0a83496cc01280fbd496c41144566e.png similarity index 100% rename from preview-images/1099a8c70c147f485f487cc54216f97f0c28e2d0.png rename to preview-images/cda6a6fc0e0a83496cc01280fbd496c41144566e.png diff --git a/preview-images/32719a6504362e27295be76b7500131c31225229.png b/preview-images/cf72955bb2679cdf841459d86e94d8f35c8550b6.png similarity index 100% rename from preview-images/32719a6504362e27295be76b7500131c31225229.png rename to preview-images/cf72955bb2679cdf841459d86e94d8f35c8550b6.png diff --git a/preview-images/253e7351349408ef5cdb1ea5d57cd6e37e40b917.png b/preview-images/d1a7776d284a5723798250d90914741fc146f246.png similarity index 100% rename from preview-images/253e7351349408ef5cdb1ea5d57cd6e37e40b917.png rename to preview-images/d1a7776d284a5723798250d90914741fc146f246.png diff --git a/preview-images/bc6d118156a3606cfe6a870cea49c97afa64fc29.png b/preview-images/dc1fc12b91baab0d238c6ef430c86d9a376cbd4f.png similarity index 100% rename from preview-images/bc6d118156a3606cfe6a870cea49c97afa64fc29.png rename to preview-images/dc1fc12b91baab0d238c6ef430c86d9a376cbd4f.png diff --git a/preview-images/a6f75922b2909c130885dbe9e06a4dd7d8a63fd6.png b/preview-images/e0a11f71d90583ef59048801aebc3f1875cc5fd1.png similarity index 100% rename from preview-images/a6f75922b2909c130885dbe9e06a4dd7d8a63fd6.png rename to preview-images/e0a11f71d90583ef59048801aebc3f1875cc5fd1.png diff --git a/preview-images/bdfe1e194c00a8c03867902cdc8dace4c21b8499.png b/preview-images/e6321c6ba8e056688289cc2f354454f5b8637bd4.png similarity index 100% rename from preview-images/bdfe1e194c00a8c03867902cdc8dace4c21b8499.png rename to preview-images/e6321c6ba8e056688289cc2f354454f5b8637bd4.png diff --git a/preview-images/607b708f627c19eaf477d82185d067e88dd0137d.png b/preview-images/e65ec532045e436e8cfeea65bb7d9bcd4725323c.png similarity index 100% rename from preview-images/607b708f627c19eaf477d82185d067e88dd0137d.png rename to preview-images/e65ec532045e436e8cfeea65bb7d9bcd4725323c.png diff --git a/preview-images/cabed9fe1559c114628931c386e1e0bd3a96a6dc.png b/preview-images/ef046a9b19154e7f488f4e4813052c406986b910.png similarity index 100% rename from preview-images/cabed9fe1559c114628931c386e1e0bd3a96a6dc.png rename to preview-images/ef046a9b19154e7f488f4e4813052c406986b910.png diff --git a/preview-images/6a8d843c3f6b259a44d8bd321bc6707e641afc08.png b/preview-images/f3d5c11661e673642bcd793c1028175590bd465b.png similarity index 100% rename from preview-images/6a8d843c3f6b259a44d8bd321bc6707e641afc08.png rename to preview-images/f3d5c11661e673642bcd793c1028175590bd465b.png diff --git a/preview-images/550f853c0f7d30f48a8522ec1c07caba5df9f4ec.png b/preview-images/f3fb2aef56d67d6955f9602e19b6b042716327dc.png similarity index 100% rename from preview-images/550f853c0f7d30f48a8522ec1c07caba5df9f4ec.png rename to preview-images/f3fb2aef56d67d6955f9602e19b6b042716327dc.png diff --git a/preview-images/847403fc4fe7a0614fe9142df432119218931754.png b/preview-images/f40524df97f27040bece36444a713e94ea12b167.png similarity index 100% rename from preview-images/847403fc4fe7a0614fe9142df432119218931754.png rename to preview-images/f40524df97f27040bece36444a713e94ea12b167.png diff --git a/preview-images/055d6df941439ca9d9b298310c51be9438b56feb.png b/preview-images/fc6464ea0b3991c20bb54d5c431a88f4f4140d06.png similarity index 100% rename from preview-images/055d6df941439ca9d9b298310c51be9438b56feb.png rename to preview-images/fc6464ea0b3991c20bb54d5c431a88f4f4140d06.png diff --git a/preview-images/df6746d8f308ca1a06a7021e97b2d6502ddda782.png b/preview-images/fc9f22a6744df6d773e206c0db0ab9771f640938.png similarity index 100% rename from preview-images/df6746d8f308ca1a06a7021e97b2d6502ddda782.png rename to preview-images/fc9f22a6744df6d773e206c0db0ab9771f640938.png diff --git a/preview-images/29157743ce8ac9646fb0b33a036155775eea0783.png b/preview-images/fca48c0d5952cc9318ceb4732cb081beb4b07a33.png similarity index 100% rename from preview-images/29157743ce8ac9646fb0b33a036155775eea0783.png rename to preview-images/fca48c0d5952cc9318ceb4732cb081beb4b07a33.png diff --git a/quickstart/index.html b/quickstart/index.html index 094f0876..8642c447 100644 --- a/quickstart/index.html +++ b/quickstart/index.html @@ -3,11 +3,11 @@ -Quickstart | Multi-Scrobbler +Quickstart | Multi-Scrobbler - + - + @@ -90,6 +90,6 @@
  • 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
  • - + \ No newline at end of file diff --git a/search-index.json b/search-index.json index d9f129ca..cdef1e1d 100644 --- a/search-index.json +++ b/search-index.json @@ -1 +1 @@ -[{"documents":[{"i":1,"t":"Overview","u":"/multi-scrobbler/configuration/clients/","b":["Docs","Configuration","Scrobble Clients"]},{"i":12,"t":"Overview","u":"/multi-scrobbler/configuration/","b":["Docs","Configuration"]},{"i":43,"t":"Discord","u":"/multi-scrobbler/configuration/clients/discord/","b":["Docs","Configuration","Scrobble Clients","Discord"]},{"i":49,"t":"Discord (App)","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","b":["Docs","Configuration","Scrobble Clients","Discord"]},{"i":68,"t":"Discord (Headless)","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","b":["Docs","Configuration","Scrobble Clients","Discord"]},{"i":82,"t":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","b":["Docs","Configuration","Scrobble Clients"]},{"i":86,"t":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":92,"t":"Libre.fm","u":"/multi-scrobbler/configuration/clients/librefm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":100,"t":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","b":["Docs","Configuration","Scrobble Clients"]},{"i":104,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","b":["Docs","Configuration","Scrobble Clients"]},{"i":108,"t":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","b":["Docs","Configuration","Scrobble Clients"]},{"i":115,"t":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":122,"t":"Overview","u":"/multi-scrobbler/configuration/sources/","b":["Docs","Configuration","Scrobble Sources"]},{"i":137,"t":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":145,"t":"Kitchen Sink","u":"/multi-scrobbler/configuration/kitchensink/","b":["Docs","Configuration"]},{"i":155,"t":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","b":["Docs","Configuration","Scrobble Sources"]},{"i":165,"t":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":169,"t":"Duplicate Scrobble Guidance","u":"/multi-scrobbler/configuration/duplicates/","b":["Docs","Configuration"]},{"i":191,"t":"Apple Music","u":"/multi-scrobbler/configuration/sources/applemusic/","b":["Docs","Configuration","Scrobble Sources"]},{"i":201,"t":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","b":["Docs","Configuration","Scrobble Sources"]},{"i":207,"t":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","b":["Docs","Configuration","Scrobble Sources"]},{"i":209,"t":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":213,"t":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","b":["Docs","Configuration","Scrobble Sources"]},{"i":219,"t":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":233,"t":"Last.fm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":237,"t":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":239,"t":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":258,"t":"Libre.fm","u":"/multi-scrobbler/configuration/sources/librefm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":262,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":266,"t":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","b":["Docs","Configuration","Scrobble Sources"]},{"i":270,"t":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","b":["Docs","Configuration","Scrobble Sources"]},{"i":274,"t":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","b":["Docs","Configuration","Scrobble Sources"]},{"i":278,"t":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","b":["Docs","Configuration","Scrobble Sources"]},{"i":282,"t":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","b":["Docs","Configuration","Scrobble Sources"]},{"i":290,"t":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":296,"t":"Sonos","u":"/multi-scrobbler/configuration/sources/sonos/","b":["Docs","Configuration","Scrobble Sources"]},{"i":302,"t":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","b":["Docs","Configuration","Scrobble Sources"]},{"i":306,"t":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","b":["Docs","Configuration","Scrobble Sources"]},{"i":312,"t":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","b":["Docs","Configuration","Scrobble Sources"]},{"i":318,"t":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","b":["Docs","Configuration","Scrobble Sources"]},{"i":322,"t":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","b":["Docs","Configuration","Scrobble Sources"]},{"i":330,"t":"Yandex Music","u":"/multi-scrobbler/configuration/sources/yandex-music/","b":["Docs","Configuration","Scrobble Sources"]},{"i":334,"t":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":342,"t":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","b":["Docs","Configuration","Scrobble Sources"]},{"i":346,"t":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":371,"t":"Development","u":"/multi-scrobbler/development/dev-common/","b":["Docs","Development"]},{"i":390,"t":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":394,"t":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":411,"t":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":432,"t":"Flatpak","u":"/multi-scrobbler/development/flatpak/","b":["Docs","Development"]},{"i":445,"t":"FAQ","u":"/multi-scrobbler/FAQ/","b":["Docs"]},{"i":471,"t":"Overview","u":"/multi-scrobbler/installation/","b":["Docs","Installation"]},{"i":485,"t":"Help","u":"/multi-scrobbler/help/","b":["Docs"]},{"i":500,"t":"Systemd","u":"/multi-scrobbler/installation/service/","b":["Docs","Installation"]},{"i":508,"t":"Overview","u":"/multi-scrobbler/updating/","b":["Docs","Updating"]},{"i":525,"t":"Quickstart","u":"/multi-scrobbler/quickstart/","b":["Docs"]},{"i":543,"t":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":595,"t":"Overview","u":"/multi-scrobbler/","b":["Docs"]},{"i":617,"t":"From < 0.14.0","u":"/multi-scrobbler/updating/upgrade-path/0140/","b":["Docs","Updating","Upgrade Path"]},{"i":630,"t":"Upgrade Path","u":"/multi-scrobbler/updating/upgrade-path/","b":["Docs","Updating","Upgrade Path"]},{"i":632,"t":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","b":["Docs","Development"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,2.54]],["t/12",[0,2.54]],["t/43",[1,3.237]],["t/49",[1,2.425,2,3.14]],["t/68",[1,2.425,3,3.14]],["t/82",[4,3.616]],["t/86",[5,3.616]],["t/92",[6,3.616]],["t/100",[7,3.616]],["t/104",[8,3.237]],["t/108",[9,3.616]],["t/115",[10,3.616]],["t/122",[0,2.54]],["t/137",[11,4.191]],["t/145",[12,3.14,13,3.14]],["t/155",[14,4.191]],["t/165",[15,2.511,16,2.511,17,2.511]],["t/169",[18,2.511,19,2.166,20,2.511]],["t/191",[21,3.14,22,2.213]],["t/201",[23,4.191]],["t/207",[24,4.191]],["t/209",[25,4.191]],["t/213",[26,4.191]],["t/219",[27,3.14,28,2.709]],["t/233",[5,3.616]],["t/237",[4,3.616]],["t/239",[8,2.425,28,2.709]],["t/258",[6,3.616]],["t/262",[8,3.237]],["t/266",[7,3.616]],["t/270",[29,4.191]],["t/274",[30,4.191]],["t/278",[22,1.474,31,2.092,32,2.092,33,2.092]],["t/282",[34,4.191]],["t/290",[9,3.616]],["t/296",[35,4.191]],["t/302",[36,4.191]],["t/306",[37,4.191]],["t/312",[38,4.191]],["t/318",[39,4.191]],["t/322",[40,4.191]],["t/330",[22,2.213,41,3.14]],["t/334",[10,3.616]],["t/342",[22,2.213,42,3.14]],["t/346",[19,2.709,43,3.14]],["t/371",[44,4.191]],["t/390",[45,3.14,46,3.14]],["t/394",[47,3.14,48,2.425]],["t/411",[48,2.425,49,3.14]],["t/432",[50,4.191]],["t/445",[51,4.191]],["t/471",[0,2.54]],["t/485",[52,4.191]],["t/500",[53,4.191]],["t/508",[0,2.54]],["t/525",[54,4.191]],["t/543",[48,2.425,55,3.14]],["t/595",[0,2.54]],["t/617",[56,3.14,57,3.14]],["t/630",[58,3.14,59,3.14]],["t/632",[60,3.14,61,3.14]]],"invertedIndex":[["",{"_index":56,"t":{"617":{"position":[[5,1]]}}}],["0.14.0",{"_index":57,"t":{"617":{"position":[[7,6]]}}}],["app",{"_index":2,"t":{"49":{"position":[[8,5]]}}}],["appl",{"_index":21,"t":{"191":{"position":[[0,5]]}}}],["azuracast",{"_index":11,"t":{"137":{"position":[[0,9]]}}}],["cast",{"_index":16,"t":{"165":{"position":[[7,4]]}}}],["chromecast",{"_index":17,"t":{"165":{"position":[[12,12]]}}}],["daemon",{"_index":33,"t":{"278":{"position":[[18,7]]}}}],["deezer",{"_index":14,"t":{"155":{"position":[[0,6]]}}}],["develop",{"_index":44,"t":{"371":{"position":[[0,11]]}}}],["development/tutori",{"_index":61,"t":{"632":{"position":[[7,20]]}}}],["discord",{"_index":1,"t":{"43":{"position":[[0,7]]},"49":{"position":[[0,7]]},"68":{"position":[[0,7]]}}}],["duplic",{"_index":18,"t":{"169":{"position":[[0,9]]}}}],["endpoint",{"_index":28,"t":{"219":{"position":[[7,10]]},"239":{"position":[[13,10]]}}}],["enhanc",{"_index":43,"t":{"346":{"position":[[0,9]]}}}],["faq",{"_index":51,"t":{"445":{"position":[[0,3]]}}}],["flatpak",{"_index":50,"t":{"432":{"position":[[0,7]]}}}],["googl",{"_index":15,"t":{"165":{"position":[[0,6]]}}}],["guidanc",{"_index":20,"t":{"169":{"position":[[19,8]]}}}],["headless",{"_index":3,"t":{"68":{"position":[[8,10]]}}}],["help",{"_index":52,"t":{"485":{"position":[[0,4]]}}}],["icecast",{"_index":25,"t":{"209":{"position":[[0,7]]}}}],["jellyfin",{"_index":24,"t":{"207":{"position":[[0,8]]}}}],["jriver",{"_index":26,"t":{"213":{"position":[[0,6]]}}}],["kitchen",{"_index":12,"t":{"145":{"position":[[0,7]]}}}],["kodi",{"_index":23,"t":{"201":{"position":[[0,4]]}}}],["koito",{"_index":4,"t":{"82":{"position":[[0,5]]},"237":{"position":[[0,5]]}}}],["last.fm",{"_index":5,"t":{"86":{"position":[[0,7]]},"233":{"position":[[0,7]]}}}],["lastfm",{"_index":27,"t":{"219":{"position":[[0,6]]}}}],["libre.fm",{"_index":6,"t":{"92":{"position":[[0,8]]},"258":{"position":[[0,8]]}}}],["listenbrainz",{"_index":8,"t":{"104":{"position":[[0,12]]},"239":{"position":[[0,12]]},"262":{"position":[[0,12]]}}}],["maloja",{"_index":7,"t":{"100":{"position":[[0,6]]},"266":{"position":[[0,6]]}}}],["mopidi",{"_index":34,"t":{"282":{"position":[[0,6]]}}}],["mpd",{"_index":31,"t":{"278":{"position":[[0,3]]}}}],["mpri",{"_index":30,"t":{"274":{"position":[[0,5]]}}}],["music",{"_index":22,"t":{"191":{"position":[[6,5]]},"278":{"position":[[4,6]]},"330":{"position":[[7,5]]},"342":{"position":[[8,5]]}}}],["musicbrainz",{"_index":55,"t":{"543":{"position":[[0,11]]}}}],["musiccast",{"_index":46,"t":{"390":{"position":[[7,9]]}}}],["musikcub",{"_index":29,"t":{"270":{"position":[[0,9]]}}}],["nativ",{"_index":47,"t":{"394":{"position":[[0,6]]}}}],["overview",{"_index":0,"t":{"1":{"position":[[0,8]]},"12":{"position":[[0,8]]},"122":{"position":[[0,8]]},"471":{"position":[[0,8]]},"508":{"position":[[0,8]]},"595":{"position":[[0,8]]}}}],["path",{"_index":59,"t":{"630":{"position":[[8,4]]}}}],["player",{"_index":32,"t":{"278":{"position":[[11,6]]}}}],["plex",{"_index":37,"t":{"306":{"position":[[0,4]]}}}],["quickstart",{"_index":54,"t":{"525":{"position":[[0,10]]}}}],["rockski",{"_index":9,"t":{"108":{"position":[[0,7]]},"290":{"position":[[0,7]]}}}],["scrobbl",{"_index":19,"t":{"169":{"position":[[10,8]]},"346":{"position":[[10,9]]}}}],["sink",{"_index":13,"t":{"145":{"position":[[8,4]]}}}],["sono",{"_index":35,"t":{"296":{"position":[[0,5]]}}}],["sourc",{"_index":60,"t":{"632":{"position":[[0,6]]}}}],["spotifi",{"_index":36,"t":{"302":{"position":[[0,7]]}}}],["stage",{"_index":48,"t":{"394":{"position":[[7,5]]},"411":{"position":[[5,5]]},"543":{"position":[[12,5]]}}}],["subson",{"_index":38,"t":{"312":{"position":[[0,8]]}}}],["systemd",{"_index":53,"t":{"500":{"position":[[0,7]]}}}],["teal.fm",{"_index":10,"t":{"115":{"position":[[0,7]]},"334":{"position":[[0,7]]}}}],["upgrad",{"_index":58,"t":{"630":{"position":[[0,7]]}}}],["user",{"_index":49,"t":{"411":{"position":[[0,4]]}}}],["vlc",{"_index":39,"t":{"318":{"position":[[0,3]]}}}],["webscrobbl",{"_index":40,"t":{"322":{"position":[[0,12]]}}}],["yamaha",{"_index":45,"t":{"390":{"position":[[0,6]]}}}],["yandex",{"_index":41,"t":{"330":{"position":[[0,6]]}}}],["youtub",{"_index":42,"t":{"342":{"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":"Duplicate Detection","u":"/multi-scrobbler/configuration/clients/","h":"#duplicate-detection","p":1},{"i":8,"t":"Dead Scrobbles","u":"/multi-scrobbler/configuration/clients/","h":"#dead-scrobbles","p":1},{"i":10,"t":"Now Playing","u":"/multi-scrobbler/configuration/clients/","h":"#now-playing","p":1},{"i":14,"t":"Configuration Types","u":"/multi-scrobbler/configuration/","h":"#configuration-types","p":12},{"i":16,"t":"Setup Sources and Clients","u":"/multi-scrobbler/configuration/","h":"#setup-sources-and-clients","p":12},{"i":18,"t":"Secrets Interpolation","u":"/multi-scrobbler/configuration/","h":"#secrets-interpolation","p":12},{"i":20,"t":"Base URL","u":"/multi-scrobbler/configuration/","h":"#base-url","p":12},{"i":22,"t":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":12},{"i":24,"t":"Secondary Caching Store","u":"/multi-scrobbler/configuration/","h":"#secondary-caching","p":12},{"i":26,"t":"Database","u":"/multi-scrobbler/configuration/","h":"#database","p":12},{"i":28,"t":"Retention","u":"/multi-scrobbler/configuration/","h":"#retention","p":12},{"i":30,"t":"Debug Mode","u":"/multi-scrobbler/configuration/","h":"#debug-mode","p":12},{"i":32,"t":"Disable Web","u":"/multi-scrobbler/configuration/","h":"#disable-web","p":12},{"i":34,"t":"Monitoring","u":"/multi-scrobbler/configuration/","h":"#monitoring","p":12},{"i":35,"t":"Upstream Services Status","u":"/multi-scrobbler/configuration/","h":"#upstream-services-status","p":12},{"i":37,"t":"Webhook Configurations","u":"/multi-scrobbler/configuration/","h":"#webhook-configurations","p":12},{"i":39,"t":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":12},{"i":41,"t":"Prometheus","u":"/multi-scrobbler/configuration/","h":"#prometheus","p":12},{"i":45,"t":"App","u":"/multi-scrobbler/configuration/clients/discord/","h":"#app","p":43},{"i":47,"t":"Headless","u":"/multi-scrobbler/configuration/clients/discord/","h":"#headless","p":43},{"i":51,"t":"Required Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#required-setup","p":49},{"i":52,"t":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-application","p":49},{"i":54,"t":"Discord Connection","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-connection","p":49},{"i":56,"t":"Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":49},{"i":58,"t":"1. Add Discord Service to Multi-Scrobbler Docker Compose Stack","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":49},{"i":60,"t":"2. Login to Discord","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":49},{"i":62,"t":"Optional Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#optional-setup","p":49},{"i":64,"t":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#artwork","p":49},{"i":66,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#configuration","p":49},{"i":70,"t":"Required Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#required-setup","p":68},{"i":71,"t":"User Token","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#user-token","p":68},{"i":73,"t":"Optional Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#optional-setup","p":68},{"i":74,"t":"Configure When Presence Is Used","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configure-when-presence-is-used","p":68},{"i":76,"t":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#discord-application","p":68},{"i":78,"t":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#artwork","p":68},{"i":80,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configuration","p":68},{"i":84,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":82},{"i":88,"t":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#callbackredirect-url","p":86},{"i":90,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":86},{"i":94,"t":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#callbackredirect-url","p":92},{"i":96,"t":"Custom Libre.fm instance","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#custom-librefm-instance","p":92},{"i":98,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#configuration","p":92},{"i":102,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":100},{"i":106,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":104},{"i":110,"t":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":108},{"i":112,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#configuration","p":108},{"i":113,"t":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":108},{"i":117,"t":"Setup","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#setup","p":115},{"i":119,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#configuration","p":115},{"i":120,"t":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":115},{"i":124,"t":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":122},{"i":126,"t":"Features","u":"/multi-scrobbler/configuration/sources/","h":"#features","p":122},{"i":127,"t":"Types of Sources","u":"/multi-scrobbler/configuration/sources/","h":"#types-of-sources","p":122},{"i":129,"t":"Multi-Device/User","u":"/multi-scrobbler/configuration/sources/","h":"#multi-deviceuser","p":122},{"i":131,"t":"Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/sources/","h":"#limiting-scrobble-destination","p":122},{"i":133,"t":"When Is Activity Scrobbled?","u":"/multi-scrobbler/configuration/sources/","h":"#when-is-activity-scrobbled","p":122},{"i":135,"t":"Monitoring","u":"/multi-scrobbler/configuration/sources/","h":"#monitoring","p":122},{"i":139,"t":"URL","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#url","p":137},{"i":141,"t":"Station","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#station","p":137},{"i":143,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":137},{"i":146,"t":"What's This?","u":"/multi-scrobbler/configuration/kitchensink/","h":"#whats-this","p":145},{"i":148,"t":"Examples","u":"/multi-scrobbler/configuration/kitchensink/","h":"#examples","p":145},{"i":149,"t":"Multiple Sources to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-sources-clients","p":145},{"i":151,"t":"Scrobble for Multiple People to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-persons-services","p":145},{"i":153,"t":"Use Musicbrainz to Fix Scrobbles from Navidrome","u":"/multi-scrobbler/configuration/kitchensink/","h":"#use-musicbrainz-to-fix-scrobbles-from-navidrome","p":145},{"i":157,"t":"Retrieve ARL","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#retrieve-arl","p":155},{"i":159,"t":"Duplicate detection","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#duplicate-detection","p":155},{"i":161,"t":"Family account","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#family-account","p":155},{"i":163,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":155},{"i":167,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":165},{"i":171,"t":"How Duplicates Are Detected","u":"/multi-scrobbler/configuration/duplicates/","h":"#how-duplicates-are-detected","p":169},{"i":173,"t":"Configurations Where Duplicates DO NOT Occur","u":"/multi-scrobbler/configuration/duplicates/","h":"#valid-configs","p":169},{"i":175,"t":"Configurations Where Duplicates CAN Occur","u":"/multi-scrobbler/configuration/duplicates/","h":"#invalid-configs","p":169},{"i":176,"t":"Upstream Scrobbles Sent to Multiple Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#upstream-scrobbles-sent-to-multiple-sources","p":169},{"i":178,"t":"Sources and Clients are Dependent","u":"/multi-scrobbler/configuration/duplicates/","h":"#dependent-source-client","p":169},{"i":180,"t":"Configuration Solutions to Avoid Duplicates","u":"/multi-scrobbler/configuration/duplicates/","h":"#configuration-solutions-to-avoid-duplicates","p":169},{"i":181,"t":"Independent Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#independent-sources","p":169},{"i":183,"t":"Alternative Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#alternative-sources","p":169},{"i":185,"t":"Mirror-Only Clients or Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/duplicates/","h":"#isolated-sources","p":169},{"i":187,"t":"Normalize All Scrobbles","u":"/multi-scrobbler/configuration/duplicates/","h":"#normalize-all-scrobbles","p":169},{"i":189,"t":"The Last.fm Problem","u":"/multi-scrobbler/configuration/duplicates/","h":"#lastfm","p":169},{"i":193,"t":"1. Getting a Media User Token","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#1-getting-a-media-user-token","p":191},{"i":195,"t":"2. Authentication","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#2-authentication","p":191},{"i":197,"t":"How Multi-Scrobbler handles Apple Music quirks","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#how-multi-scrobbler-handles-apple-music-quirks","p":191},{"i":199,"t":"Configuration Reference","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#configuration-reference","p":191},{"i":203,"t":"URL","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#url","p":201},{"i":205,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":201},{"i":211,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":209},{"i":215,"t":"URL","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#url","p":213},{"i":217,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":213},{"i":221,"t":"Setup","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#setup","p":219},{"i":223,"t":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#standard-base-url","p":219},{"i":225,"t":"Authentication","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#authentication","p":219},{"i":227,"t":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#multiple-sources","p":219},{"i":229,"t":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#troubleshooting-url","p":219},{"i":231,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":219},{"i":235,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":233},{"i":241,"t":"Setup","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#setup","p":239},{"i":243,"t":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#standard-base-url","p":239},{"i":245,"t":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":239},{"i":247,"t":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#multiple-sources","p":239},{"i":249,"t":"Setup for Popular Apps","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#setup-for-popular-apps","p":239},{"i":250,"t":"Navidrome","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#navidrome","p":239},{"i":252,"t":"Music Assistant","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#music-assistant","p":239},{"i":254,"t":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#troubleshooting-url","p":239},{"i":256,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":239},{"i":260,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/librefm-source/","h":"#configuration","p":258},{"i":264,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":262},{"i":268,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":266},{"i":272,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":270},{"i":276,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":274},{"i":280,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":278},{"i":284,"t":"URI Blacklist/Whitelist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#uri-blacklistwhitelist","p":282},{"i":286,"t":"Album Blacklist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#album-blacklist","p":282},{"i":288,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":282},{"i":292,"t":"Setup","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#setup","p":290},{"i":294,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":290},{"i":298,"t":"Filtering Activity","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#filtering-activity","p":296},{"i":300,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#configuration","p":296},{"i":304,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":302},{"i":308,"t":"Matching With Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":310,"t":"Using Musicbrainz With Multi-Scrobbler","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":314,"t":"Enhanced Playback Reporting","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#enhanced-playback-reporting","p":312},{"i":316,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":312},{"i":320,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":318},{"i":324,"t":"Multiple Users","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#multiple-users","p":322},{"i":326,"t":"Connectors Black/Whitelist","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#connectors-blackwhitelist","p":322},{"i":328,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":322},{"i":332,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/yandex-music/","h":"#configuration","p":330},{"i":336,"t":"Setup","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#setup","p":334},{"i":338,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":334},{"i":340,"t":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":334},{"i":344,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":342},{"i":348,"t":"Journey of a Scrobble","u":"/multi-scrobbler/configuration/transforms/","h":"#journey-of-a-scrobble","p":346},{"i":350,"t":"Lifecycle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecycle-hooks","p":346},{"i":352,"t":"Hook","u":"/multi-scrobbler/configuration/transforms/","h":"#hook","p":346},{"i":354,"t":"Modification Stage","u":"/multi-scrobbler/configuration/transforms/","h":"#stage","p":346},{"i":356,"t":"Configuring Stages","u":"/multi-scrobbler/configuration/transforms/","h":"#configuring-stages","p":346},{"i":358,"t":"Rules for Play Data","u":"/multi-scrobbler/configuration/transforms/","h":"#stage-rules","p":346},{"i":360,"t":"Stage Flow Control","u":"/multi-scrobbler/configuration/transforms/","h":"#flow-control","p":346},{"i":362,"t":"Conditionally Run","u":"/multi-scrobbler/configuration/transforms/","h":"#conditional-modification","p":346},{"i":364,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/","h":"#logging","p":346},{"i":366,"t":"Best Practices","u":"/multi-scrobbler/configuration/transforms/","h":"#best-practices","p":346},{"i":367,"t":"Caching","u":"/multi-scrobbler/configuration/transforms/","h":"#caching","p":346},{"i":369,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/","h":"#examples","p":346},{"i":372,"t":"Architecture","u":"/multi-scrobbler/development/dev-common/","h":"#architecture","p":371},{"i":374,"t":"Project Setup","u":"/multi-scrobbler/development/dev-common/","h":"#project-setup","p":371},{"i":376,"t":"VSCode","u":"/multi-scrobbler/development/dev-common/","h":"#vscode","p":371},{"i":378,"t":"Common Development","u":"/multi-scrobbler/development/dev-common/","h":"#common-development","p":371},{"i":380,"t":"Config","u":"/multi-scrobbler/development/dev-common/","h":"#config","p":371},{"i":382,"t":"Concrete Class","u":"/multi-scrobbler/development/dev-common/","h":"#concrete-class","p":371},{"i":384,"t":"Play Object","u":"/multi-scrobbler/development/dev-common/","h":"#play-object","p":371},{"i":386,"t":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":371},{"i":388,"t":"Profiling","u":"/multi-scrobbler/development/dev-common/","h":"#profiling","p":371},{"i":392,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":390},{"i":396,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#configuration","p":394},{"i":398,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/native/","h":"#rules","p":394},{"i":400,"t":"Default Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"#default-stage","p":394},{"i":402,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#env-configuration","p":394},{"i":404,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/native/","h":"#examples","p":394},{"i":405,"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":394},{"i":407,"t":"Don't parse specific artists","u":"/multi-scrobbler/configuration/transforms/native/","h":"#dont-parse-specific-artists","p":394},{"i":409,"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":394},{"i":413,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":411},{"i":415,"t":"Search-And-Replace Expression","u":"/multi-scrobbler/configuration/transforms/user/","h":"#search-and-replace-expression","p":411},{"i":417,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rules","p":411},{"i":419,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/user/","h":"#examples","p":411},{"i":420,"t":"Usage with when condition","u":"/multi-scrobbler/configuration/transforms/user/","h":"#usage-with-when-condition","p":411},{"i":422,"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":411},{"i":424,"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":411},{"i":426,"t":"Rename misspelled artist in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rename-misspelled-artist-in-all-new-plays","p":411},{"i":428,"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":411},{"i":430,"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":411},{"i":433,"t":"Install Requirements","u":"/multi-scrobbler/development/flatpak/","h":"#install-requirements","p":432},{"i":434,"t":"Flatpak and flatpak-builder","u":"/multi-scrobbler/development/flatpak/","h":"#flatpak-and-flatpak-builder","p":432},{"i":436,"t":"Update Project source","u":"/multi-scrobbler/development/flatpak/","h":"#update-project-source","p":432},{"i":438,"t":"Generate Sources and Build","u":"/multi-scrobbler/development/flatpak/","h":"#generate-sources-and-build","p":432},{"i":439,"t":"Use Setup Script","u":"/multi-scrobbler/development/flatpak/","h":"#use-setup-script","p":432},{"i":441,"t":"Manual Setup","u":"/multi-scrobbler/development/flatpak/","h":"#manual-setup","p":432},{"i":443,"t":"Run App","u":"/multi-scrobbler/development/flatpak/","h":"","p":432},{"i":446,"t":"Connection Issues","u":"/multi-scrobbler/FAQ/","h":"#connection-issues","p":445},{"i":447,"t":"Webscrobbler/Listenbrainz Endpoint doesn't connect","u":"/multi-scrobbler/FAQ/","h":"#ingress-connection","p":445},{"i":449,"t":"Spotify/Deezer/LastFM won't authenticate","u":"/multi-scrobbler/FAQ/","h":"#spotifydeezerlastfm-wont-authenticate","p":445},{"i":451,"t":"I get errors with ECONNRESET ETIMEDOUT ENOTFOUND EAI_AGAIN","u":"/multi-scrobbler/FAQ/","h":"#i-get-errors-with-econnreset-etimedout-enotfound-eai_again","p":445},{"i":453,"t":"Youtube Music fails after some time","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-fails-after-some-time","p":445},{"i":455,"t":"Configuration Issues","u":"/multi-scrobbler/FAQ/","h":"#configuration-issues","p":445},{"i":456,"t":"Config could not be parsed","u":"/multi-scrobbler/FAQ/","h":"#config-could-not-be-parsed","p":445},{"i":458,"t":"Scrobbling Issues","u":"/multi-scrobbler/FAQ/","h":"#scrobbling-issues","p":445},{"i":459,"t":"How do I prevent duplicate scrobbles?","u":"/multi-scrobbler/FAQ/","h":"#how-do-i-prevent-duplicate-scrobbles","p":445},{"i":461,"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":445},{"i":463,"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":445},{"i":465,"t":"Google Cast device does not track media","u":"/multi-scrobbler/FAQ/","h":"#google-cast-device-does-not-track-media","p":445},{"i":467,"t":"VLC is not scrobbling fields correctly","u":"/multi-scrobbler/FAQ/","h":"#vlc-is-not-scrobbling-fields-correctly","p":445},{"i":469,"t":"Youtube Music misses or duplicates scrobbles","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-misses-or-duplicates-scrobbles","p":445},{"i":473,"t":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":471},{"i":475,"t":"Recommended Settings","u":"/multi-scrobbler/installation/","h":"#recommended-settings","p":471},{"i":477,"t":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":471},{"i":479,"t":"Local Installation","u":"/multi-scrobbler/installation/","h":"#local-installation","p":471},{"i":481,"t":"Nodejs","u":"/multi-scrobbler/installation/","h":"#nodejs","p":471},{"i":483,"t":"Flatpak","u":"/multi-scrobbler/installation/","h":"#flatpak","p":471},{"i":486,"t":"Getting Useful Data","u":"/multi-scrobbler/help/","h":"#getting-useful-data","p":485},{"i":487,"t":"Logs","u":"/multi-scrobbler/help/","h":"#logs","p":485},{"i":489,"t":"Debug Mode","u":"/multi-scrobbler/help/","h":"#debug-mode","p":485},{"i":491,"t":"Copy Play Debug Data","u":"/multi-scrobbler/help/","h":"#copy-play-debug-data","p":485},{"i":493,"t":"Finding Help","u":"/multi-scrobbler/help/","h":"#finding-help","p":485},{"i":494,"t":"FAQ","u":"/multi-scrobbler/help/","h":"#faq","p":485},{"i":496,"t":"Existing Issues","u":"/multi-scrobbler/help/","h":"#existing-issues","p":485},{"i":498,"t":"Reporting an Issue","u":"/multi-scrobbler/help/","h":"#reporting-an-issue","p":485},{"i":502,"t":"Create A Unit File","u":"/multi-scrobbler/installation/service/","h":"#create-a-unit-file","p":500},{"i":504,"t":"Start the Service","u":"/multi-scrobbler/installation/service/","h":"#start-the-service","p":500},{"i":506,"t":"Other Service Methods","u":"/multi-scrobbler/installation/service/","h":"","p":500},{"i":509,"t":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":508},{"i":511,"t":"Database","u":"/multi-scrobbler/updating/","h":"#database","p":508},{"i":513,"t":"Configuration","u":"/multi-scrobbler/updating/","h":"#configuration","p":508},{"i":515,"t":"Update Instructions","u":"/multi-scrobbler/updating/","h":"#update-instructions","p":508},{"i":517,"t":"Versioning","u":"/multi-scrobbler/updating/","h":"#versioning","p":508},{"i":519,"t":"Git","u":"/multi-scrobbler/updating/","h":"#git","p":508},{"i":521,"t":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":508},{"i":523,"t":"What Version Am I Using?","u":"/multi-scrobbler/updating/","h":"#what-version-am-i-using","p":508},{"i":527,"t":"Create Docker Compose File","u":"/multi-scrobbler/quickstart/","h":"#create-docker-compose-file","p":525},{"i":529,"t":"Setup Sources","u":"/multi-scrobbler/quickstart/","h":"#setup-sources","p":525},{"i":531,"t":"(Optional) Correct Scrobbles with Musicbrainz","u":"/multi-scrobbler/quickstart/","h":"#optional-correct-scrobbles-with-musicbrainz","p":525},{"i":533,"t":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":525},{"i":535,"t":"Enable Musicbrainz For A Source","u":"/multi-scrobbler/quickstart/","h":"","p":525},{"i":537,"t":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":525},{"i":539,"t":"Start Multi-Scrobbler","u":"/multi-scrobbler/quickstart/","h":"#start-multi-scrobbler","p":525},{"i":541,"t":"Next Steps","u":"/multi-scrobbler/quickstart/","h":"#next-steps","p":525},{"i":545,"t":"More Than Mainstream Data","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":543},{"i":547,"t":"As The Artist Intended","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":543},{"i":549,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#configuration","p":543},{"i":550,"t":"API Setup","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#api-setup","p":543},{"i":552,"t":"Stage Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#stage-configuration","p":543},{"i":554,"t":"Rules and Hooks","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#rules-and-hooks","p":543},{"i":556,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#env-configuration","p":543},{"i":558,"t":"Matching with Musicbrainz","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#matching-with-musicbrainz","p":543},{"i":560,"t":"Searching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#searching","p":543},{"i":562,"t":"Refining","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#refining","p":543},{"i":563,"t":"Score","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#score","p":543},{"i":565,"t":"Filtering","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filtering","p":543},{"i":567,"t":"Sorting","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sorting","p":543},{"i":569,"t":"Best Practices","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#best-practices","p":543},{"i":570,"t":"Caching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#caching","p":543},{"i":572,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default","p":543},{"i":574,"t":"Search Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#search-considerations","p":543},{"i":576,"t":"Filter Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filter-considerations","p":543},{"i":578,"t":"Using Partial Match","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#using-partial-match","p":543},{"i":580,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#logging","p":543},{"i":582,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#examples","p":543},{"i":583,"t":"Minimal","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#minimal","p":543},{"i":585,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default-1","p":543},{"i":587,"t":"Add Metadata Only (No Scrobble Modification)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#add-metadata-only-no-scrobble-modification","p":543},{"i":589,"t":"Use Native Stage if no Musicbrainz Matches","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-native-stage-if-no-musicbrainz-matches","p":543},{"i":591,"t":"Different Search Methods Based on Source (Last.fm and Spotify)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#override-stage-configuration-example","p":543},{"i":593,"t":"Use Metadata for Discord Album Art","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-metadata-for-discord-album-art","p":543},{"i":597,"t":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":595},{"i":599,"t":"Source","u":"/multi-scrobbler/","h":"#source","p":595},{"i":601,"t":"Client","u":"/multi-scrobbler/","h":"#client","p":595},{"i":603,"t":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":595},{"i":605,"t":"Installation","u":"/multi-scrobbler/","h":"#installation","p":595},{"i":607,"t":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":595},{"i":609,"t":"Usage","u":"/multi-scrobbler/","h":"#usage","p":595},{"i":611,"t":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":595},{"i":613,"t":"Development","u":"/multi-scrobbler/","h":"#development","p":595},{"i":615,"t":"License","u":"/multi-scrobbler/","h":"#license","p":595},{"i":618,"t":"Source/Client IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#sourceclient-ids","p":617},{"i":620,"t":"Configuring IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#configuring-ids","p":617},{"i":622,"t":"Cached Scrobble Migration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cached-scrobble-migration","p":617},{"i":624,"t":"Cache Configuration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cache-configuration","p":617},{"i":626,"t":"Renamed ENV Keys","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#renamed-env-keys","p":617},{"i":628,"t":"(Optional) ENV Client/Source Names","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#optional-env-clientsource-names","p":617},{"i":634,"t":"Scenario","u":"/multi-scrobbler/development/dev-source/","h":"#scenario","p":632},{"i":636,"t":"Minimal Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#minimal-implementation","p":632},{"i":637,"t":"Define and Implement Config","u":"/multi-scrobbler/development/dev-source/","h":"#define-and-implement-config","p":632},{"i":639,"t":"Create CoolPlayer Source","u":"/multi-scrobbler/development/dev-source/","h":"#create-coolplayer-source","p":632},{"i":641,"t":"Initialize Source from Config","u":"/multi-scrobbler/development/dev-source/","h":"#initialize-source-from-config","p":632},{"i":643,"t":"Implement Play Object Transform","u":"/multi-scrobbler/development/dev-source/","h":"#implement-play-object-transform","p":632},{"i":645,"t":"Implement Stages","u":"/multi-scrobbler/development/dev-source/","h":"#implement-stages","p":632},{"i":647,"t":"Implement Polling","u":"/multi-scrobbler/development/dev-source/","h":"#implement-polling","p":632},{"i":649,"t":"Further Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#further-implementation","p":632},{"i":650,"t":"Backlog","u":"/multi-scrobbler/development/dev-source/","h":"#backlog","p":632},{"i":652,"t":"Other Source Types","u":"/multi-scrobbler/development/dev-source/","h":"#other-source-types","p":632}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,4.336]],["t/5",[1,6.04]],["t/6",[2,3.595,3,4.504]],["t/8",[4,5.371,5,2.855]],["t/10",[6,5.371,7,3.595]],["t/14",[8,1.672,9,4.504]],["t/16",[0,2.907,10,2.292,11,2.249]],["t/18",[12,5.371,13,5.371]],["t/20",[14,4.246,15,3.378]],["t/22",[16,4.821]],["t/24",[16,3.232,17,4.486,18,4.486]],["t/26",[19,6.04]],["t/28",[20,6.692]],["t/30",[21,4.504,22,4.848]],["t/32",[23,5.371,24,5.371]],["t/34",[25,6.04]],["t/35",[26,4.049,27,3.375,28,4.486]],["t/37",[8,1.672,29,5.371]],["t/39",[30,5.371,31,4.848]],["t/41",[32,6.692]],["t/45",[33,5.611]],["t/47",[34,6.692]],["t/51",[10,2.744,35,4.504]],["t/52",[36,3.869,37,4.848]],["t/54",[36,3.869,38,4.504]],["t/56",[10,3.419]],["t/58",[27,1.697,36,1.625,39,2.036,40,2.036,41,1.563,42,1.697,43,1.697,44,2.036,45,2.256]],["t/60",[36,3.232,46,4.049,47,4.486]],["t/62",[10,2.744,48,4.246]],["t/64",[49,6.04]],["t/66",[8,2.084]],["t/70",[10,2.744,35,4.504]],["t/71",[50,4.504,51,4.504]],["t/73",[10,2.744,48,4.246]],["t/74",[8,1.397,52,4.486,53,2.821]],["t/76",[36,3.869,37,4.848]],["t/78",[49,6.04]],["t/80",[8,2.084]],["t/84",[8,2.084]],["t/88",[15,3.378,54,4.848]],["t/90",[8,2.084]],["t/94",[15,3.378,54,4.848]],["t/96",[55,4.049,56,4.486,57,4.486]],["t/98",[8,2.084]],["t/102",[8,2.084]],["t/106",[8,2.084]],["t/110",[10,3.419]],["t/112",[8,2.084]],["t/113",[58,6.04]],["t/117",[10,3.419]],["t/119",[8,2.084]],["t/120",[59,6.692]],["t/124",[11,3.355]],["t/126",[1,6.04]],["t/127",[9,4.504,11,2.693]],["t/129",[41,3.723,60,5.371]],["t/131",[5,2.384,61,4.049,62,4.049]],["t/133",[5,2.855,63,4.848]],["t/135",[25,6.04]],["t/139",[15,4.209]],["t/141",[64,6.692]],["t/143",[8,2.084]],["t/146",[65,6.692]],["t/148",[66,4.821]],["t/149",[0,2.496,11,1.931,67,4.002]],["t/151",[0,2.186,5,1.793,67,3.618,68,3.374]],["t/153",[5,1.793,53,2.122,69,2.338,70,3.374,71,3.045]],["t/157",[72,5.371,73,5.371]],["t/159",[2,3.595,3,4.504]],["t/161",[74,5.371,75,5.371]],["t/163",[8,2.084]],["t/167",[8,2.084]],["t/171",[2,3.595,3,4.504]],["t/173",[2,3.002,8,1.397,76,4.049]],["t/175",[2,3.002,8,1.397,76,4.049]],["t/176",[5,1.793,11,1.691,26,3.045,67,2.338,77,3.374]],["t/178",[0,2.907,11,2.249,78,4.486]],["t/180",[2,2.577,8,1.199,79,3.851,80,3.851]],["t/181",[11,2.693,81,5.371]],["t/183",[11,2.693,82,5.371]],["t/185",[0,2.186,5,1.793,61,3.045,62,3.045,83,3.374]],["t/187",[5,2.855,84,5.371]],["t/189",[85,4.504,86,5.371]],["t/193",[39,3.045,50,2.829,51,2.829,87,3.045,88,3.045]],["t/195",[46,4.848,89,4.504]],["t/197",[41,2.081,42,2.258,58,2.709,90,3.002,91,2.373,92,3.002]],["t/199",[8,1.672,93,5.371]],["t/203",[15,4.209]],["t/205",[8,2.084]],["t/211",[8,2.084]],["t/215",[15,4.209]],["t/217",[8,2.084]],["t/221",[10,3.419]],["t/223",[14,3.546,15,2.821,94,4.049]],["t/225",[89,5.611]],["t/227",[11,2.693,67,3.723]],["t/229",[15,3.378,95,4.848]],["t/231",[8,2.084]],["t/235",[8,2.084]],["t/241",[10,3.419]],["t/243",[14,3.546,15,2.821,94,4.049]],["t/245",[51,5.611]],["t/247",[11,2.693,67,3.723]],["t/249",[10,2.292,33,3.761,96,4.486]],["t/250",[71,6.04]],["t/252",[91,4.246,97,5.371]],["t/254",[15,3.378,95,4.848]],["t/256",[8,2.084]],["t/260",[8,2.084]],["t/264",[8,2.084]],["t/268",[8,2.084]],["t/272",[8,2.084]],["t/276",[8,2.084]],["t/280",[8,2.084]],["t/284",[98,5.371,99,5.371]],["t/286",[100,4.504,101,5.371]],["t/288",[8,2.084]],["t/292",[10,3.419]],["t/294",[8,2.084]],["t/298",[63,4.848,102,4.246]],["t/300",[8,2.084]],["t/304",[8,2.084]],["t/308",[103,4.246,104,5.371]],["t/310",[41,2.669,42,2.897,53,2.422,69,2.669]],["t/314",[105,4.486,106,4.486,107,4.049]],["t/316",[8,2.084]],["t/320",[8,2.084]],["t/324",[50,4.504,67,3.723]],["t/326",[108,5.371,109,5.371]],["t/328",[8,2.084]],["t/332",[8,2.084]],["t/336",[10,3.419]],["t/338",[8,2.084]],["t/340",[27,4.04,102,4.246]],["t/344",[8,2.084]],["t/348",[5,2.855,110,5.371]],["t/350",[111,5.371,112,4.504]],["t/352",[112,5.611]],["t/354",[113,4.848,114,3.723]],["t/356",[8,1.672,114,3.723]],["t/358",[7,3.002,115,3.546,116,3.546]],["t/360",[114,3.109,117,4.486,118,4.486]],["t/362",[119,5.371,120,4.848]],["t/364",[121,5.611]],["t/366",[122,4.848,123,4.848]],["t/367",[16,4.821]],["t/369",[66,4.821]],["t/372",[124,6.692]],["t/374",[10,2.744,125,4.848]],["t/376",[126,6.692]],["t/378",[127,5.371,128,4.848]],["t/380",[129,5.29]],["t/382",[130,5.371,131,5.371]],["t/384",[7,3.595,132,4.848]],["t/386",[0,2.907,11,2.249,133,3.546]],["t/388",[134,6.692]],["t/392",[8,2.084]],["t/396",[8,2.084]],["t/398",[115,5.29]],["t/400",[114,3.723,135,4.504]],["t/402",[8,1.672,136,4.246]],["t/404",[66,4.821]],["t/405",[53,1.888,55,2.709,137,2.517,138,2.009,139,2.709,140,2.709]],["t/407",[137,3.229,138,2.577,141,3.851,142,3.851]],["t/409",[138,2.258,143,3.045,144,4.377,145,3.374]],["t/413",[8,2.084]],["t/415",[146,3.546,147,4.486,148,4.486]],["t/417",[115,5.29]],["t/419",[66,4.821]],["t/420",[149,4.504,150,5.371]],["t/422",[7,2.258,144,2.829,151,2.829,152,3.374,153,2.829]],["t/424",[144,2.829,151,2.829,154,3.374,155,3.374,156,3.374]],["t/426",[7,2.258,138,2.258,153,2.829,157,3.045,158,3.374]],["t/428",[7,2.009,100,2.517,138,2.009,151,2.517,153,2.517,159,3.002]],["t/430",[41,1.874,138,2.932,139,2.44,140,2.44,143,2.44,160,2.704]],["t/433",[35,4.504,161,4.504]],["t/434",[162,5.831,163,4.486]],["t/436",[11,2.249,125,4.049,164,3.761]],["t/438",[11,2.249,165,4.486,166,4.486]],["t/439",[10,2.292,53,2.821,167,4.486]],["t/441",[10,2.744,168,5.371]],["t/443",[33,4.504,120,4.848]],["t/446",[38,4.504,169,4.04]],["t/447",[31,3.476,38,3.229,170,3.851,171,3.851]],["t/449",[89,3.761,172,4.486,173,4.486]],["t/451",[174,3.374,175,3.374,176,3.374,177,3.374,178,3.374]],["t/453",[91,3.044,179,3.476,180,3.851,181,3.476]],["t/455",[8,1.672,169,4.04]],["t/456",[129,4.246,137,4.504]],["t/458",[5,2.855,169,4.04]],["t/459",[2,3.002,5,2.384,182,4.486]],["t/461",[5,1.595,67,2.081,85,2.517,138,2.009,183,2.517,184,2.709]],["t/463",[181,2.036,183,1.891,185,2.036,186,2.036,187,2.256,188,2.256,189,2.036,190,2.256,191,2.256]],["t/465",[88,3.045,183,2.829,185,3.045,186,3.045,192,3.374]],["t/467",[5,2.047,184,3.476,193,3.851,194,3.851]],["t/469",[2,2.258,5,1.793,91,2.667,179,3.045,195,3.374]],["t/473",[43,5.034]],["t/475",[196,5.371,197,5.371]],["t/477",[43,3.375,66,3.232,149,3.761]],["t/479",[161,4.504,198,5.371]],["t/481",[199,6.692]],["t/483",[162,6.04]],["t/486",[53,2.821,87,4.049,116,3.546]],["t/487",[121,5.611]],["t/489",[21,4.504,22,4.848]],["t/491",[7,2.577,21,3.229,116,3.044,200,3.851]],["t/493",[201,5.371,202,5.371]],["t/494",[203,6.692]],["t/496",[169,4.04,204,5.371]],["t/498",[107,4.848,169,4.04]],["t/502",[133,3.546,205,4.486,206,4.049]],["t/504",[27,4.04,207,4.504]],["t/506",[27,4.04,208,4.848]],["t/509",[164,5.611]],["t/511",[19,6.04]],["t/513",[8,2.084]],["t/515",[164,4.504,209,5.371]],["t/517",[210,6.04]],["t/519",[211,6.692]],["t/521",[43,5.034]],["t/523",[53,3.378,210,4.848]],["t/527",[43,2.897,44,3.476,133,3.044,206,3.476]],["t/529",[10,2.744,11,2.693]],["t/531",[5,2.047,48,3.044,69,2.669,212,3.851]],["t/533",[8,1.397,69,3.109,213,4.049]],["t/535",[11,2.249,69,3.109,214,4.486]],["t/537",[0,3.481,10,2.744]],["t/539",[41,3.109,42,3.375,207,3.761]],["t/541",[215,5.371,216,5.371]],["t/545",[116,3.546,217,4.486,218,4.486]],["t/547",[138,3.595,219,5.371]],["t/549",[8,2.084]],["t/550",[10,2.744,213,4.848]],["t/552",[8,1.672,114,3.723]],["t/554",[112,4.504,115,4.246]],["t/556",[8,1.672,136,4.246]],["t/558",[69,3.723,103,4.246]],["t/560",[146,5.29]],["t/562",[220,6.692]],["t/563",[221,6.692]],["t/565",[102,5.29]],["t/567",[222,6.692]],["t/569",[122,4.848,123,4.848]],["t/570",[16,4.821]],["t/572",[135,4.504,223,4.848]],["t/574",[146,4.246,224,4.848]],["t/576",[102,4.246,224,4.848]],["t/578",[53,2.821,103,3.546,225,4.486]],["t/580",[121,5.611]],["t/582",[66,4.821]],["t/583",[226,6.04]],["t/585",[135,4.504,223,4.848]],["t/587",[5,2.047,40,3.476,113,3.476,227,3.476]],["t/589",[53,2.122,69,2.338,103,2.667,114,2.338,228,3.374]],["t/591",[11,1.355,14,2.137,85,2.267,146,2.137,208,2.44,229,2.704,230,2.704]],["t/593",[36,2.43,53,2.122,100,2.829,227,3.045,231,3.374]],["t/597",[41,2.669,42,2.897,189,3.476,232,3.851]],["t/599",[11,3.355]],["t/601",[0,4.336]],["t/603",[207,4.504,233,5.371]],["t/605",[161,5.611]],["t/607",[8,2.084]],["t/609",[149,5.611]],["t/611",[234,6.692]],["t/613",[128,6.04]],["t/615",[235,6.692]],["t/618",[236,5.371,237,4.848]],["t/620",[8,1.672,237,4.848]],["t/622",[5,2.384,16,3.232,238,4.486]],["t/624",[8,1.672,16,3.869]],["t/626",[136,3.546,157,4.049,239,4.486]],["t/628",[48,3.044,136,3.044,240,3.851,241,3.851]],["t/634",[242,6.692]],["t/636",[226,4.848,243,3.869]],["t/637",[129,3.546,243,3.232,244,4.486]],["t/639",[11,2.249,133,3.546,245,4.486]],["t/641",[11,2.249,129,3.546,246,4.486]],["t/643",[7,2.577,132,3.476,243,2.774,247,3.851]],["t/645",[114,3.723,243,3.869]],["t/647",[243,3.869,248,5.371]],["t/649",[243,3.869,249,5.371]],["t/650",[250,6.692]],["t/652",[9,4.504,11,2.693]]],"invertedIndex":[["1",{"_index":39,"t":{"58":{"position":[[0,2]]},"193":{"position":[[0,2]]}}}],["2",{"_index":46,"t":{"60":{"position":[[0,2]]},"195":{"position":[[0,2]]}}}],["account",{"_index":75,"t":{"161":{"position":[[7,7]]}}}],["activ",{"_index":63,"t":{"133":{"position":[[8,8]]},"298":{"position":[[10,8]]}}}],["add",{"_index":40,"t":{"58":{"position":[[3,3]]},"587":{"position":[[0,3]]}}}],["album",{"_index":100,"t":{"286":{"position":[[0,5]]},"428":{"position":[[25,6]]},"593":{"position":[[25,5]]}}}],["altern",{"_index":82,"t":{"183":{"position":[[0,11]]}}}],["api",{"_index":213,"t":{"533":{"position":[[22,3]]},"550":{"position":[[0,3]]}}}],["app",{"_index":33,"t":{"45":{"position":[[0,3]]},"249":{"position":[[18,4]]},"443":{"position":[[4,3]]}}}],["appl",{"_index":90,"t":{"197":{"position":[[28,5]]}}}],["applic",{"_index":37,"t":{"52":{"position":[[8,11]]},"76":{"position":[[8,11]]}}}],["architectur",{"_index":124,"t":{"372":{"position":[[0,12]]}}}],["arl",{"_index":73,"t":{"157":{"position":[[9,3]]}}}],["art",{"_index":231,"t":{"593":{"position":[[31,3]]}}}],["artist",{"_index":138,"t":{"405":{"position":[[11,7]]},"407":{"position":[[21,7]]},"409":{"position":[[8,7]]},"426":{"position":[[18,6]]},"428":{"position":[[16,8]]},"430":{"position":[[16,6],[45,6]]},"461":{"position":[[47,7]]},"547":{"position":[[7,6]]}}}],["artwork",{"_index":49,"t":{"64":{"position":[[0,7]]},"78":{"position":[[0,7]]}}}],["assist",{"_index":97,"t":{"252":{"position":[[6,9]]}}}],["authent",{"_index":89,"t":{"195":{"position":[[3,14]]},"225":{"position":[[0,14]]},"449":{"position":[[28,12]]}}}],["avoid",{"_index":80,"t":{"180":{"position":[[27,5]]}}}],["backlog",{"_index":250,"t":{"650":{"position":[[0,7]]}}}],["base",{"_index":14,"t":{"20":{"position":[[0,4]]},"223":{"position":[[9,4]]},"243":{"position":[[9,4]]},"591":{"position":[[25,5]]}}}],["best",{"_index":122,"t":{"366":{"position":[[0,4]]},"569":{"position":[[0,4]]}}}],["black/whitelist",{"_index":109,"t":{"326":{"position":[[11,15]]}}}],["blacklist",{"_index":101,"t":{"286":{"position":[[6,9]]}}}],["blacklist/whitelist",{"_index":99,"t":{"284":{"position":[[4,19]]}}}],["build",{"_index":166,"t":{"438":{"position":[[21,5]]}}}],["builder",{"_index":163,"t":{"434":{"position":[[20,7]]}}}],["cach",{"_index":16,"t":{"22":{"position":[[0,7]]},"24":{"position":[[10,7]]},"367":{"position":[[0,7]]},"570":{"position":[[0,7]]},"622":{"position":[[0,6]]},"624":{"position":[[0,5]]}}}],["callback/redirect",{"_index":54,"t":{"88":{"position":[[0,17]]},"94":{"position":[[0,17]]}}}],["cast",{"_index":186,"t":{"463":{"position":[[7,4]]},"465":{"position":[[7,4]]}}}],["class",{"_index":131,"t":{"382":{"position":[[9,5]]}}}],["client",{"_index":0,"t":{"3":{"position":[[0,7]]},"16":{"position":[[18,7]]},"149":{"position":[[29,7]]},"151":{"position":[[41,7]]},"178":{"position":[[12,7]]},"185":{"position":[[12,7]]},"386":{"position":[[9,7]]},"537":{"position":[[6,7]]},"601":{"position":[[0,6]]}}}],["client/sourc",{"_index":240,"t":{"628":{"position":[[15,13]]}}}],["common",{"_index":127,"t":{"378":{"position":[[0,6]]}}}],["compos",{"_index":44,"t":{"58":{"position":[[49,7]]},"527":{"position":[[14,7]]}}}],["concret",{"_index":130,"t":{"382":{"position":[[0,8]]}}}],["condit",{"_index":150,"t":{"420":{"position":[[16,9]]}}}],["condition",{"_index":119,"t":{"362":{"position":[[0,13]]}}}],["config",{"_index":129,"t":{"380":{"position":[[0,6]]},"456":{"position":[[0,6]]},"637":{"position":[[21,6]]},"641":{"position":[[23,6]]}}}],["configur",{"_index":8,"t":{"14":{"position":[[0,13]]},"37":{"position":[[8,14]]},"66":{"position":[[0,13]]},"74":{"position":[[0,9]]},"80":{"position":[[0,13]]},"84":{"position":[[0,13]]},"90":{"position":[[0,13]]},"98":{"position":[[0,13]]},"102":{"position":[[0,13]]},"106":{"position":[[0,13]]},"112":{"position":[[0,13]]},"119":{"position":[[0,13]]},"143":{"position":[[0,13]]},"163":{"position":[[0,13]]},"167":{"position":[[0,13]]},"173":{"position":[[0,14]]},"175":{"position":[[0,14]]},"180":{"position":[[0,13]]},"199":{"position":[[0,13]]},"205":{"position":[[0,13]]},"211":{"position":[[0,13]]},"217":{"position":[[0,13]]},"231":{"position":[[0,13]]},"235":{"position":[[0,13]]},"256":{"position":[[0,13]]},"260":{"position":[[0,13]]},"264":{"position":[[0,13]]},"268":{"position":[[0,13]]},"272":{"position":[[0,13]]},"276":{"position":[[0,13]]},"280":{"position":[[0,13]]},"288":{"position":[[0,13]]},"294":{"position":[[0,13]]},"300":{"position":[[0,13]]},"304":{"position":[[0,13]]},"316":{"position":[[0,13]]},"320":{"position":[[0,13]]},"328":{"position":[[0,13]]},"332":{"position":[[0,13]]},"338":{"position":[[0,13]]},"344":{"position":[[0,13]]},"356":{"position":[[0,11]]},"392":{"position":[[0,13]]},"396":{"position":[[0,13]]},"402":{"position":[[4,13]]},"413":{"position":[[0,13]]},"455":{"position":[[0,13]]},"513":{"position":[[0,13]]},"533":{"position":[[0,9]]},"549":{"position":[[0,13]]},"552":{"position":[[6,13]]},"556":{"position":[[4,13]]},"607":{"position":[[0,13]]},"620":{"position":[[0,11]]},"624":{"position":[[6,13]]}}}],["connect",{"_index":38,"t":{"54":{"position":[[8,10]]},"446":{"position":[[0,10]]},"447":{"position":[[43,7]]}}}],["connector",{"_index":108,"t":{"326":{"position":[[0,10]]}}}],["consider",{"_index":224,"t":{"574":{"position":[[7,14]]},"576":{"position":[[7,14]]}}}],["content",{"_index":155,"t":{"424":{"position":[[25,7]]}}}],["control",{"_index":118,"t":{"360":{"position":[[11,7]]}}}],["coolplay",{"_index":245,"t":{"639":{"position":[[7,10]]}}}],["copi",{"_index":200,"t":{"491":{"position":[[0,4]]}}}],["correct",{"_index":212,"t":{"531":{"position":[[11,7]]}}}],["correctli",{"_index":184,"t":{"461":{"position":[[55,9]]},"467":{"position":[[29,9]]}}}],["creat",{"_index":133,"t":{"386":{"position":[[0,8]]},"502":{"position":[[0,6]]},"527":{"position":[[0,6]]},"639":{"position":[[0,6]]}}}],["custom",{"_index":55,"t":{"96":{"position":[[0,6]]},"405":{"position":[[34,6]]}}}],["data",{"_index":116,"t":{"358":{"position":[[15,4]]},"486":{"position":[[15,4]]},"491":{"position":[[16,4]]},"545":{"position":[[21,4]]}}}],["databas",{"_index":19,"t":{"26":{"position":[[0,8]]},"511":{"position":[[0,8]]}}}],["dead",{"_index":4,"t":{"8":{"position":[[0,4]]}}}],["debug",{"_index":21,"t":{"30":{"position":[[0,5]]},"489":{"position":[[0,5]]},"491":{"position":[[10,5]]}}}],["default",{"_index":135,"t":{"400":{"position":[[0,7]]},"572":{"position":[[9,7]]},"585":{"position":[[9,7]]}}}],["defin",{"_index":244,"t":{"637":{"position":[[0,6]]}}}],["delimit",{"_index":140,"t":{"405":{"position":[[41,9]]},"430":{"position":[[28,10]]}}}],["depend",{"_index":78,"t":{"178":{"position":[[24,9]]}}}],["destin",{"_index":62,"t":{"131":{"position":[[18,11]]},"185":{"position":[[41,11]]}}}],["detect",{"_index":3,"t":{"6":{"position":[[10,9]]},"159":{"position":[[10,9]]},"171":{"position":[[19,8]]}}}],["develop",{"_index":128,"t":{"378":{"position":[[7,11]]},"613":{"position":[[0,11]]}}}],["devic",{"_index":192,"t":{"465":{"position":[[12,6]]}}}],["device/us",{"_index":60,"t":{"129":{"position":[[6,11]]}}}],["differ",{"_index":229,"t":{"591":{"position":[[0,9]]}}}],["disabl",{"_index":23,"t":{"32":{"position":[[0,7]]}}}],["discord",{"_index":36,"t":{"52":{"position":[[0,7]]},"54":{"position":[[0,7]]},"58":{"position":[[7,7]]},"60":{"position":[[12,7]]},"76":{"position":[[0,7]]},"593":{"position":[[17,7]]}}}],["docker",{"_index":43,"t":{"58":{"position":[[42,6]]},"473":{"position":[[0,6]]},"477":{"position":[[0,6]]},"521":{"position":[[0,6]]},"527":{"position":[[7,6]]}}}],["doesn't",{"_index":171,"t":{"447":{"position":[[35,7]]}}}],["don't",{"_index":141,"t":{"407":{"position":[[0,5]]}}}],["duplic",{"_index":2,"t":{"6":{"position":[[0,9]]},"159":{"position":[[0,9]]},"171":{"position":[[4,10]]},"173":{"position":[[21,10]]},"175":{"position":[[21,10]]},"180":{"position":[[33,10]]},"459":{"position":[[17,9]]},"469":{"position":[[24,10]]}}}],["eai_again",{"_index":178,"t":{"451":{"position":[[49,9]]}}}],["econnreset",{"_index":175,"t":{"451":{"position":[[18,10]]}}}],["enabl",{"_index":214,"t":{"535":{"position":[[0,6]]}}}],["end",{"_index":156,"t":{"424":{"position":[[42,3]]}}}],["endpoint",{"_index":31,"t":{"39":{"position":[[7,8]]},"447":{"position":[[26,8]]}}}],["enhanc",{"_index":105,"t":{"314":{"position":[[0,8]]}}}],["enotfound",{"_index":177,"t":{"451":{"position":[[39,9]]}}}],["env",{"_index":136,"t":{"402":{"position":[[0,3]]},"556":{"position":[[0,3]]},"626":{"position":[[8,3]]},"628":{"position":[[11,3]]}}}],["error",{"_index":174,"t":{"451":{"position":[[6,6]]}}}],["etimedout",{"_index":176,"t":{"451":{"position":[[29,9]]}}}],["exampl",{"_index":66,"t":{"148":{"position":[[0,8]]},"369":{"position":[[0,8]]},"404":{"position":[[0,8]]},"419":{"position":[[0,8]]},"477":{"position":[[13,7]]},"582":{"position":[[0,8]]}}}],["exist",{"_index":204,"t":{"496":{"position":[[0,8]]}}}],["express",{"_index":148,"t":{"415":{"position":[[19,10]]}}}],["extract",{"_index":143,"t":{"409":{"position":[[0,7]]},"430":{"position":[[0,7]]}}}],["fail",{"_index":180,"t":{"453":{"position":[[14,5]]}}}],["famili",{"_index":74,"t":{"161":{"position":[[0,6]]}}}],["faq",{"_index":203,"t":{"494":{"position":[[0,3]]}}}],["featur",{"_index":1,"t":{"5":{"position":[[0,8]]},"126":{"position":[[0,8]]}}}],["field",{"_index":194,"t":{"467":{"position":[[22,6]]}}}],["file",{"_index":206,"t":{"502":{"position":[[14,4]]},"527":{"position":[[22,4]]}}}],["filter",{"_index":102,"t":{"298":{"position":[[0,9]]},"340":{"position":[[8,9]]},"565":{"position":[[0,9]]},"576":{"position":[[0,6]]}}}],["find",{"_index":201,"t":{"493":{"position":[[0,7]]}}}],["fix",{"_index":70,"t":{"153":{"position":[[19,3]]}}}],["flatpak",{"_index":162,"t":{"434":{"position":[[0,7],[12,7]]},"483":{"position":[[0,7]]}}}],["flow",{"_index":117,"t":{"360":{"position":[[6,4]]}}}],["further",{"_index":249,"t":{"649":{"position":[[0,7]]}}}],["gener",{"_index":165,"t":{"438":{"position":[[0,8]]}}}],["get",{"_index":87,"t":{"193":{"position":[[3,7]]},"486":{"position":[[0,7]]}}}],["git",{"_index":211,"t":{"519":{"position":[[0,3]]}}}],["googl",{"_index":185,"t":{"463":{"position":[[0,6]]},"465":{"position":[[0,6]]}}}],["handl",{"_index":58,"t":{"113":{"position":[[0,6]]},"197":{"position":[[20,7]]}}}],["headless",{"_index":34,"t":{"47":{"position":[[0,8]]}}}],["health",{"_index":30,"t":{"39":{"position":[[0,6]]}}}],["help",{"_index":202,"t":{"493":{"position":[[8,4]]}}}],["help/faq",{"_index":234,"t":{"611":{"position":[[0,8]]}}}],["hook",{"_index":112,"t":{"350":{"position":[[10,5]]},"352":{"position":[[0,4]]},"554":{"position":[[10,5]]}}}],["id",{"_index":237,"t":{"618":{"position":[[14,3]]},"620":{"position":[[12,3]]}}}],["identifi",{"_index":59,"t":{"120":{"position":[[0,10]]}}}],["implement",{"_index":243,"t":{"636":{"position":[[8,14]]},"637":{"position":[[11,9]]},"643":{"position":[[0,9]]},"645":{"position":[[0,9]]},"647":{"position":[[0,9]]},"649":{"position":[[8,14]]}}}],["independ",{"_index":81,"t":{"181":{"position":[[0,11]]}}}],["inform",{"_index":187,"t":{"463":{"position":[[18,11]]}}}],["initi",{"_index":246,"t":{"641":{"position":[[0,10]]}}}],["instal",{"_index":161,"t":{"433":{"position":[[0,7]]},"479":{"position":[[6,12]]},"605":{"position":[[0,12]]}}}],["instanc",{"_index":57,"t":{"96":{"position":[[16,8]]}}}],["instruct",{"_index":209,"t":{"515":{"position":[[7,12]]}}}],["intend",{"_index":219,"t":{"547":{"position":[[14,8]]}}}],["interpol",{"_index":13,"t":{"18":{"position":[[8,13]]}}}],["issu",{"_index":169,"t":{"446":{"position":[[11,6]]},"455":{"position":[[14,6]]},"458":{"position":[[11,6]]},"496":{"position":[[9,6]]},"498":{"position":[[13,5]]}}}],["journey",{"_index":110,"t":{"348":{"position":[[0,7]]}}}],["key",{"_index":239,"t":{"626":{"position":[[12,4]]}}}],["last.fm",{"_index":85,"t":{"189":{"position":[[4,7]]},"461":{"position":[[0,7]]},"591":{"position":[[41,8]]}}}],["libre.fm",{"_index":56,"t":{"96":{"position":[[7,8]]}}}],["licens",{"_index":235,"t":{"615":{"position":[[0,7]]}}}],["lifecycl",{"_index":111,"t":{"350":{"position":[[0,9]]}}}],["limit",{"_index":61,"t":{"131":{"position":[[0,8]]},"185":{"position":[[23,8]]}}}],["local",{"_index":198,"t":{"479":{"position":[[0,5]]}}}],["log",{"_index":121,"t":{"364":{"position":[[0,7]]},"487":{"position":[[0,4]]},"580":{"position":[[0,7]]}}}],["login",{"_index":47,"t":{"60":{"position":[[3,5]]}}}],["mainstream",{"_index":218,"t":{"545":{"position":[[10,10]]}}}],["manual",{"_index":168,"t":{"441":{"position":[[0,6]]}}}],["match",{"_index":103,"t":{"308":{"position":[[0,8]]},"558":{"position":[[0,8]]},"578":{"position":[[14,5]]},"589":{"position":[[35,7]]}}}],["media",{"_index":88,"t":{"193":{"position":[[13,5]]},"465":{"position":[[34,5]]}}}],["metadata",{"_index":227,"t":{"587":{"position":[[4,8]]},"593":{"position":[[4,8]]}}}],["method",{"_index":208,"t":{"506":{"position":[[14,7]]},"591":{"position":[[17,7]]}}}],["migrat",{"_index":238,"t":{"622":{"position":[[16,9]]}}}],["minim",{"_index":226,"t":{"583":{"position":[[0,7]]},"636":{"position":[[0,7]]}}}],["mirror",{"_index":83,"t":{"185":{"position":[[0,6]]}}}],["miss",{"_index":195,"t":{"469":{"position":[[14,6]]}}}],["missing/incorrect",{"_index":188,"t":{"463":{"position":[[33,17]]}}}],["misspel",{"_index":158,"t":{"426":{"position":[[7,10]]}}}],["mode",{"_index":22,"t":{"30":{"position":[[6,4]]},"489":{"position":[[6,4]]}}}],["modif",{"_index":113,"t":{"354":{"position":[[0,12]]},"587":{"position":[[31,13]]}}}],["modifi",{"_index":145,"t":{"409":{"position":[[38,6]]}}}],["monitor",{"_index":25,"t":{"34":{"position":[[0,10]]},"135":{"position":[[0,10]]}}}],["more",{"_index":217,"t":{"545":{"position":[[0,4]]}}}],["ms",{"_index":189,"t":{"463":{"position":[[54,2]]},"597":{"position":[[25,4]]}}}],["multi",{"_index":41,"t":{"58":{"position":[[26,5]]},"129":{"position":[[0,5]]},"197":{"position":[[4,5]]},"310":{"position":[[23,5]]},"430":{"position":[[39,5]]},"539":{"position":[[6,5]]},"597":{"position":[[9,5]]}}}],["multipl",{"_index":67,"t":{"149":{"position":[[0,8],[20,8]]},"151":{"position":[[13,8],[32,8]]},"176":{"position":[[27,8]]},"227":{"position":[[0,8]]},"247":{"position":[[0,8]]},"324":{"position":[[0,8]]},"461":{"position":[[38,8]]}}}],["music",{"_index":91,"t":{"197":{"position":[[34,5]]},"252":{"position":[[0,5]]},"453":{"position":[[8,5]]},"469":{"position":[[8,5]]}}}],["musicbrainz",{"_index":69,"t":{"153":{"position":[[4,11]]},"310":{"position":[[6,11]]},"531":{"position":[[34,11]]},"533":{"position":[[10,11]]},"535":{"position":[[7,11]]},"558":{"position":[[14,11]]},"589":{"position":[[23,11]]}}}],["name",{"_index":241,"t":{"628":{"position":[[29,5]]}}}],["nativ",{"_index":228,"t":{"589":{"position":[[4,6]]}}}],["navidrom",{"_index":71,"t":{"153":{"position":[[38,9]]},"250":{"position":[[0,9]]}}}],["new",{"_index":153,"t":{"422":{"position":[[32,3]]},"426":{"position":[[32,3]]},"428":{"position":[[39,3]]}}}],["next",{"_index":215,"t":{"541":{"position":[[0,4]]}}}],["nodej",{"_index":199,"t":{"481":{"position":[[0,6]]}}}],["normal",{"_index":84,"t":{"187":{"position":[[0,9]]}}}],["now",{"_index":6,"t":{"10":{"position":[[0,3]]}}}],["object",{"_index":132,"t":{"384":{"position":[[5,6]]},"643":{"position":[[15,6]]}}}],["occur",{"_index":76,"t":{"173":{"position":[[39,5]]},"175":{"position":[[36,5]]}}}],["option",{"_index":48,"t":{"62":{"position":[[0,8]]},"73":{"position":[[0,8]]},"531":{"position":[[0,10]]},"628":{"position":[[0,10]]}}}],["parenthes",{"_index":154,"t":{"424":{"position":[[11,13]]}}}],["pars",{"_index":137,"t":{"405":{"position":[[0,5]]},"407":{"position":[[6,5]]},"456":{"position":[[20,6]]}}}],["partial",{"_index":225,"t":{"578":{"position":[[6,7]]}}}],["peopl",{"_index":68,"t":{"151":{"position":[[22,6]]}}}],["phrase",{"_index":152,"t":{"422":{"position":[[7,6]]}}}],["play",{"_index":7,"t":{"10":{"position":[[4,7]]},"358":{"position":[[10,4]]},"384":{"position":[[0,4]]},"422":{"position":[[36,5]]},"426":{"position":[[36,5]]},"428":{"position":[[43,5]]},"491":{"position":[[5,4]]},"643":{"position":[[10,4]]}}}],["playback",{"_index":106,"t":{"314":{"position":[[9,8]]}}}],["player",{"_index":190,"t":{"463":{"position":[[57,6]]}}}],["plex",{"_index":104,"t":{"308":{"position":[[14,4]]}}}],["poll",{"_index":248,"t":{"647":{"position":[[10,7]]}}}],["popular",{"_index":96,"t":{"249":{"position":[[10,7]]}}}],["practic",{"_index":123,"t":{"366":{"position":[[5,9]]},"569":{"position":[[5,9]]}}}],["presenc",{"_index":52,"t":{"74":{"position":[[15,8]]}}}],["prevent",{"_index":182,"t":{"459":{"position":[[9,7]]}}}],["primari",{"_index":160,"t":{"430":{"position":[[8,7]]}}}],["problem",{"_index":86,"t":{"189":{"position":[[12,7]]}}}],["profil",{"_index":134,"t":{"388":{"position":[[0,9]]}}}],["project",{"_index":125,"t":{"374":{"position":[[0,7]]},"436":{"position":[[7,7]]}}}],["prometheu",{"_index":32,"t":{"41":{"position":[[0,10]]}}}],["quick",{"_index":233,"t":{"603":{"position":[[0,5]]}}}],["quirk",{"_index":92,"t":{"197":{"position":[[40,6]]}}}],["recommend",{"_index":196,"t":{"475":{"position":[[0,11]]}}}],["refer",{"_index":93,"t":{"199":{"position":[[14,9]]}}}],["refin",{"_index":220,"t":{"562":{"position":[[0,8]]}}}],["remov",{"_index":151,"t":{"422":{"position":[[0,6]]},"424":{"position":[[0,6]]},"428":{"position":[[0,6]]}}}],["renam",{"_index":157,"t":{"426":{"position":[[0,6]]},"626":{"position":[[0,7]]}}}],["replac",{"_index":147,"t":{"415":{"position":[[11,7]]}}}],["report",{"_index":107,"t":{"314":{"position":[[18,9]]},"498":{"position":[[0,9]]}}}],["requir",{"_index":35,"t":{"51":{"position":[[0,8]]},"70":{"position":[[0,8]]},"433":{"position":[[8,12]]}}}],["retent",{"_index":20,"t":{"28":{"position":[[0,9]]}}}],["retriev",{"_index":72,"t":{"157":{"position":[[0,8]]}}}],["rule",{"_index":115,"t":{"358":{"position":[[0,5]]},"398":{"position":[[0,5]]},"417":{"position":[[0,5]]},"554":{"position":[[0,5]]}}}],["run",{"_index":120,"t":{"362":{"position":[[14,3]]},"443":{"position":[[0,3]]}}}],["scenario",{"_index":242,"t":{"634":{"position":[[0,8]]}}}],["score",{"_index":221,"t":{"563":{"position":[[0,5]]}}}],["script",{"_index":167,"t":{"439":{"position":[[10,6]]}}}],["scrobbl",{"_index":5,"t":{"8":{"position":[[5,9]]},"131":{"position":[[9,8]]},"133":{"position":[[17,10]]},"151":{"position":[[0,8]]},"153":{"position":[[23,9]]},"176":{"position":[[9,9]]},"185":{"position":[[32,8]]},"187":{"position":[[14,9]]},"348":{"position":[[13,8]]},"458":{"position":[[0,10]]},"459":{"position":[[27,10]]},"461":{"position":[[17,8]]},"467":{"position":[[11,10]]},"469":{"position":[[35,9]]},"531":{"position":[[19,9]]},"587":{"position":[[22,8]]},"622":{"position":[[7,8]]}}}],["scrobbler",{"_index":42,"t":{"58":{"position":[[32,9]]},"197":{"position":[[10,9]]},"310":{"position":[[29,9]]},"539":{"position":[[12,9]]},"597":{"position":[[15,9]]}}}],["search",{"_index":146,"t":{"415":{"position":[[0,6]]},"560":{"position":[[0,9]]},"574":{"position":[[0,6]]},"591":{"position":[[10,6]]}}}],["secondari",{"_index":17,"t":{"24":{"position":[[0,9]]}}}],["secret",{"_index":12,"t":{"18":{"position":[[0,7]]}}}],["sensibl",{"_index":223,"t":{"572":{"position":[[0,8]]},"585":{"position":[[0,8]]}}}],["sent",{"_index":77,"t":{"176":{"position":[[19,4]]}}}],["servic",{"_index":27,"t":{"35":{"position":[[9,8]]},"58":{"position":[[15,7]]},"340":{"position":[[0,7]]},"504":{"position":[[10,7]]},"506":{"position":[[6,7]]}}}],["set",{"_index":197,"t":{"475":{"position":[[12,8]]}}}],["setup",{"_index":10,"t":{"16":{"position":[[0,5]]},"51":{"position":[[9,5]]},"56":{"position":[[0,5]]},"62":{"position":[[9,5]]},"70":{"position":[[9,5]]},"73":{"position":[[9,5]]},"110":{"position":[[0,5]]},"117":{"position":[[0,5]]},"221":{"position":[[0,5]]},"241":{"position":[[0,5]]},"249":{"position":[[0,5]]},"292":{"position":[[0,5]]},"336":{"position":[[0,5]]},"374":{"position":[[8,5]]},"439":{"position":[[4,5]]},"441":{"position":[[7,5]]},"529":{"position":[[0,5]]},"537":{"position":[[0,5]]},"550":{"position":[[4,5]]}}}],["solut",{"_index":79,"t":{"180":{"position":[[14,9]]}}}],["sort",{"_index":222,"t":{"567":{"position":[[0,7]]}}}],["sourc",{"_index":11,"t":{"16":{"position":[[6,7]]},"124":{"position":[[0,7]]},"127":{"position":[[9,7]]},"149":{"position":[[9,7]]},"176":{"position":[[36,7]]},"178":{"position":[[0,7]]},"181":{"position":[[12,7]]},"183":{"position":[[12,7]]},"227":{"position":[[9,7]]},"247":{"position":[[9,7]]},"386":{"position":[[21,7]]},"436":{"position":[[15,6]]},"438":{"position":[[9,7]]},"529":{"position":[[6,7]]},"535":{"position":[[25,6]]},"591":{"position":[[34,6]]},"599":{"position":[[0,6]]},"639":{"position":[[18,6]]},"641":{"position":[[11,6]]},"652":{"position":[[6,6]]}}}],["source/cli",{"_index":236,"t":{"618":{"position":[[0,13]]}}}],["specif",{"_index":142,"t":{"407":{"position":[[12,8]]}}}],["spotifi",{"_index":230,"t":{"591":{"position":[[54,8]]}}}],["spotify/deezer/lastfm",{"_index":172,"t":{"449":{"position":[[0,21]]}}}],["stack",{"_index":45,"t":{"58":{"position":[[57,5]]}}}],["stage",{"_index":114,"t":{"354":{"position":[[13,5]]},"356":{"position":[[12,6]]},"360":{"position":[[0,5]]},"400":{"position":[[8,5]]},"552":{"position":[[0,5]]},"589":{"position":[[11,5]]},"645":{"position":[[10,6]]}}}],["standard",{"_index":94,"t":{"223":{"position":[[0,8]]},"243":{"position":[[0,8]]}}}],["start",{"_index":207,"t":{"504":{"position":[[0,5]]},"539":{"position":[[0,5]]},"603":{"position":[[6,5]]}}}],["station",{"_index":64,"t":{"141":{"position":[[0,7]]}}}],["statu",{"_index":28,"t":{"35":{"position":[[18,6]]}}}],["step",{"_index":216,"t":{"541":{"position":[[5,5]]}}}],["store",{"_index":18,"t":{"24":{"position":[[18,5]]}}}],["string",{"_index":139,"t":{"405":{"position":[[19,6]]},"430":{"position":[[52,6]]}}}],["time",{"_index":181,"t":{"453":{"position":[[31,4]]},"463":{"position":[[74,5]]}}}],["titl",{"_index":144,"t":{"409":{"position":[[21,5],[45,5]]},"422":{"position":[[19,5]]},"424":{"position":[[51,5]]}}}],["token",{"_index":51,"t":{"71":{"position":[[5,5]]},"193":{"position":[[24,5]]},"245":{"position":[[0,5]]}}}],["track",{"_index":183,"t":{"461":{"position":[[26,6]]},"463":{"position":[[12,5]]},"465":{"position":[[28,5]]}}}],["transform",{"_index":247,"t":{"643":{"position":[[22,9]]}}}],["troubleshoot",{"_index":95,"t":{"229":{"position":[[0,15]]},"254":{"position":[[0,15]]}}}],["type",{"_index":9,"t":{"14":{"position":[[14,5]]},"127":{"position":[[0,5]]},"652":{"position":[[13,5]]}}}],["unit",{"_index":205,"t":{"502":{"position":[[9,4]]}}}],["updat",{"_index":164,"t":{"436":{"position":[[0,6]]},"509":{"position":[[0,8]]},"515":{"position":[[0,6]]}}}],["upstream",{"_index":26,"t":{"35":{"position":[[0,8]]},"176":{"position":[[0,8]]}}}],["uri",{"_index":98,"t":{"284":{"position":[[0,3]]}}}],["url",{"_index":15,"t":{"20":{"position":[[5,3]]},"88":{"position":[[18,3]]},"94":{"position":[[18,3]]},"139":{"position":[[0,3]]},"203":{"position":[[0,3]]},"215":{"position":[[0,3]]},"223":{"position":[[14,3]]},"229":{"position":[[16,3]]},"243":{"position":[[14,3]]},"254":{"position":[[16,3]]}}}],["us",{"_index":53,"t":{"74":{"position":[[27,4]]},"153":{"position":[[0,3]]},"310":{"position":[[0,5]]},"405":{"position":[[26,5]]},"439":{"position":[[0,3]]},"486":{"position":[[8,6]]},"523":{"position":[[18,6]]},"578":{"position":[[0,5]]},"589":{"position":[[0,3]]},"593":{"position":[[0,3]]}}}],["usag",{"_index":149,"t":{"420":{"position":[[0,5]]},"477":{"position":[[7,5]]},"609":{"position":[[0,5]]}}}],["user",{"_index":50,"t":{"71":{"position":[[0,4]]},"193":{"position":[[19,4]]},"324":{"position":[[9,5]]}}}],["variou",{"_index":159,"t":{"428":{"position":[[7,8]]}}}],["version",{"_index":210,"t":{"517":{"position":[[0,10]]},"523":{"position":[[5,7]]}}}],["vlc",{"_index":193,"t":{"467":{"position":[[0,3]]}}}],["vscode",{"_index":126,"t":{"376":{"position":[[0,6]]}}}],["web",{"_index":24,"t":{"32":{"position":[[8,3]]}}}],["webhook",{"_index":29,"t":{"37":{"position":[[0,7]]}}}],["webscrobbler/listenbrainz",{"_index":170,"t":{"447":{"position":[[0,25]]}}}],["weird",{"_index":191,"t":{"463":{"position":[[68,5]]}}}],["what'",{"_index":65,"t":{"146":{"position":[[0,6]]}}}],["won't",{"_index":173,"t":{"449":{"position":[[22,5]]}}}],["work",{"_index":232,"t":{"597":{"position":[[30,5]]}}}],["youtub",{"_index":179,"t":{"453":{"position":[[0,7]]},"469":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":1,"t":"Scrobble Clients","s":"Overview","u":"/multi-scrobbler/configuration/clients/","p":1},{"i":12,"t":"Configuration","s":"Overview","u":"/multi-scrobbler/configuration/","p":12},{"i":43,"t":"Discord Client Overview","s":"Discord","u":"/multi-scrobbler/configuration/clients/discord/","p":43},{"i":49,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","s":"Discord (App)","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","p":49},{"i":68,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","s":"Discord (Headless)","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","p":68},{"i":82,"t":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","p":82},{"i":86,"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":86},{"i":92,"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":92},{"i":100,"t":"Setup a Maloja server if you have not already done this.","s":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","p":100},{"i":104,"t":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","s":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","p":104},{"i":108,"t":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","s":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","p":108},{"i":115,"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":115},{"i":122,"t":"Scrobble Sources","s":"Overview","u":"/multi-scrobbler/configuration/sources/","p":122},{"i":137,"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":137},{"i":145,"t":"Kitchen Sink Examples","s":"Kitchen Sink","u":"/multi-scrobbler/configuration/kitchensink/","p":145},{"i":155,"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":155},{"i":165,"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":165},{"i":169,"t":"Common Scenarios and Solutions for Duplicate Scrobbles","s":"Duplicate Scrobble Guidance","u":"/multi-scrobbler/configuration/duplicates/","p":169},{"i":191,"t":"This Source monitors your Apple Music listening history via the official Apple Music API and scrobbles new activity to your configured Clients.","s":"Apple Music","u":"/multi-scrobbler/configuration/sources/applemusic/","p":191},{"i":201,"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":201},{"i":207,"t":"Must be using Jellyfin 10.7 or greater","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","p":207},{"i":209,"t":"Icecast Source Configuration","s":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","p":209},{"i":213,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can be found in the JRiver GUI:","s":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","p":213},{"i":219,"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":219},{"i":233,"t":"Last.fm (Source)","s":"Last.fm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","p":233},{"i":237,"t":"Koito (Source)","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","p":237},{"i":239,"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":239},{"i":258,"t":"Libre.fm (Source)","s":"Libre.fm","u":"/multi-scrobbler/configuration/sources/librefm-source/","p":258},{"i":262,"t":"Listenbrainz (Source)","s":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","p":262},{"i":266,"t":"To scrobble to a Maloja server, create a Maloja (Client)","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","p":266},{"i":270,"t":"In order to use Musikcube configure it to accept websocket connections in server setup:","s":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","p":270},{"i":274,"t":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","s":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","p":274},{"i":278,"t":"MS communicates with MPD using the TCP client connection.","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","p":278},{"i":282,"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":282},{"i":290,"t":"Rocksky (Source)","s":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","p":290},{"i":296,"t":"Multi-scrobbler can use the Sonos local API to monitor what your Sonos system is playing.","s":"Sonos","u":"/multi-scrobbler/configuration/sources/sonos/","p":296},{"i":302,"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":302},{"i":306,"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":306},{"i":312,"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":312},{"i":318,"t":"MS communicates with VLC using the Web (http) interface module","s":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","p":318},{"i":322,"t":"After installing the Webscrobbler extension open the preferences/settings for it:","s":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","p":322},{"i":330,"t":"Monitor your Yandex Music listening activity in real-time.","s":"Yandex Music","u":"/multi-scrobbler/configuration/sources/yandex-music/","p":330},{"i":334,"t":"Teal.fm (Source)","s":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","p":334},{"i":342,"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":342},{"i":346,"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":346},{"i":371,"t":"Common Development Knowledge","s":"Development","u":"/multi-scrobbler/development/dev-common/","p":371},{"i":390,"t":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","s":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","p":390},{"i":394,"t":"Enhancing Scrobbles with Built-in Parsing","s":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","p":394},{"i":411,"t":"Enhancing Scrobbles with Regex Parsing","s":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","p":411},{"i":432,"t":"Building Flatpak App","s":"Flatpak","u":"/multi-scrobbler/development/flatpak/","p":432},{"i":445,"t":"Connection Issues","s":"FAQ","u":"/multi-scrobbler/FAQ/","p":445},{"i":471,"t":"Installation","s":"Overview","u":"/multi-scrobbler/installation/","p":471},{"i":485,"t":"Getting Useful Data","s":"Help","u":"/multi-scrobbler/help/","p":485},{"i":500,"t":"Local Install as a Service","s":"Systemd","u":"/multi-scrobbler/installation/service/","p":500},{"i":508,"t":"Updating Multi-Scrobbler","s":"Overview","u":"/multi-scrobbler/updating/","p":508},{"i":525,"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":525},{"i":543,"t":"Enhancing Scrobbles with Musicbrainz","s":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","p":543},{"i":595,"t":"Latest Release","s":"Overview","u":"/multi-scrobbler/","p":595},{"i":617,"t":"Upgrading to 0.14.0","s":"From < 0.14.0","u":"/multi-scrobbler/updating/upgrade-path/0140/","p":617},{"i":630,"t":"Updating Multi-Scrobbler","s":"Upgrade Path","u":"/multi-scrobbler/updating/upgrade-path/","p":630},{"i":632,"t":"Developing a new Source","s":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","p":632}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,1.588,1,3.475]],["t/12",[2,4.073]],["t/43",[1,3.229,3,3.832,4,4.961]],["t/49",[3,2.154,5,1.704,6,1.039,7,2.407,8,1.583,9,2.154,10,2.407,11,2.407,12,2.407,13,1.406,14,2.407,15,1.143,16,1.143]],["t/68",[3,2.154,5,1.704,6,1.039,7,2.407,8,1.583,9,2.154,10,2.407,11,2.407,12,2.407,13,1.406,14,2.407,15,1.143,16,1.143]],["t/82",[0,1.036,15,1.426,17,2.11,18,1.859,19,4.216,20,2.454,21,1.976,22,0.991]],["t/86",[0,0.986,15,1.359,17,2.01,18,1.771,20,2.338,21,1.883,22,0.944,23,2.562,24,3.317,25,2.562]],["t/92",[0,0.986,15,1.359,17,2.01,18,1.771,20,2.338,21,1.883,22,0.944,23,2.562,26,4.074]],["t/100",[27,3.749,28,3.749,29,2.466,30,4.346,31,3.749]],["t/104",[0,0.986,15,1.359,17,2.01,18,1.771,20,2.338,21,1.883,22,0.944,23,2.562,32,3.647]],["t/108",[0,1.09,15,1.501,17,2.221,18,1.956,21,2.08,22,1.043,33,4.368]],["t/115",[0,1.036,15,1.426,17,2.11,18,1.859,21,1.976,22,0.991,34,3.482,35,3.482,36,3.004]],["t/122",[0,1.588,22,1.519]],["t/137",[0,1.136,5,1.021,6,0.928,16,1.021,37,2.492,38,3.821,39,2.15,40,2.15,41,2.15,42,2.492,43,2.492,44,2.492,45,1.925,46,2.15,47,2.492]],["t/145",[48,4.961,49,4.961,50,4.961]],["t/155",[6,1.316,9,1.739,22,1.005,51,1.943,52,3.532,53,2.252,54,3.532,55,1.739,56,2.252,57,2.252,58,2.252,59,1.943,60,2.252,61,1.466,62,2.252,63,2.252]],["t/165",[0,0.798,5,1.099,6,0.999,8,1.523,13,1.352,15,1.099,16,1.099,64,2.683,65,2.683,66,2.683,67,2.683,68,2.683,69,2.683,70,2.683,71,1.891]],["t/169",[0,1.292,72,3.749,73,4.346,74,4.346,75,4.346]],["t/191",[0,0.768,1,1.682,2,1.821,13,1.98,15,1.058,18,1.38,22,0.735,45,1.996,76,3.928,77,2.584,78,2.584,79,2.584,80,1.821,81,2.229]],["t/201",[5,1.297,16,1.297,31,2.733,71,2.232,82,1.92,83,4.568,84,2.446,85,2.232,86,2.062,87,2.733]],["t/207",[6,1.726,88,4.633,89,4.633,90,4.633]],["t/209",[2,3.497,22,1.412,91,4.961]],["t/213",[5,1.241,16,1.241,29,1.72,71,2.136,82,1.837,84,2.341,85,2.136,86,1.973,87,2.615,92,4.424,93,3.031]],["t/219",[0,0.986,5,1.359,16,1.359,22,0.944,25,2.562,29,1.883,86,2.159,94,2.562,95,2.862,96,2.562]],["t/233",[22,1.519,25,4.123]],["t/237",[19,4.606,22,1.519]],["t/239",[0,0.986,5,1.359,16,1.359,22,0.944,29,1.883,32,2.562,86,2.159,94,2.562,95,2.862,96,2.562]],["t/258",[22,1.519,26,4.606]],["t/262",[22,1.519,32,4.123]],["t/266",[0,1.217,1,2.663,21,2.322,28,4.708,29,2.322]],["t/270",[2,2.454,6,1.297,27,3.004,29,1.976,71,2.454,94,2.689,97,3.482,98,3.482,99,2.454]],["t/274",[13,1.755,82,2.11,85,2.454,100,3.482,101,3.004,102,3.004,103,3.482,104,3.482,105,3.004]],["t/278",[1,2.517,6,1.44,82,2.343,99,2.725,106,2.986,107,3.866,108,3.866]],["t/282",[8,1.466,13,1.98,22,0.735,29,1.466,101,3.389,109,2.584,110,2.584,111,1.821,112,2.229,113,2.584,114,2.229,115,2.584,116,2.584,117,2.584]],["t/290",[22,1.519,33,4.606]],["t/296",[5,1.359,6,1.236,8,1.883,15,1.359,16,1.359,80,2.338,105,2.862,118,4.722,119,2.862]],["t/302",[0,0.433,6,0.542,8,1.829,39,2.133,40,2.133,41,1.256,46,1.256,61,1.61,80,1.026,86,0.948,102,1.256,106,1.91,120,3.799,121,1.456,122,1.456,123,1.456,124,1.456,125,1.256,126,1.456,127,1.456,128,1.456,129,1.456,130,1.456,131,2.473,132,1.456,133,1.256,134,1.456]],["t/306",[6,1.18,99,2.232,135,3.168,136,4.568,137,3.168,138,3.168,139,3.168,140,3.168,141,3.168,142,3.168]],["t/312",[6,1.129,22,0.862,80,2.136,96,2.341,111,2.136,114,2.615,143,3.031,144,3.031,145,3.031,146,3.031,147,3.031,148,3.031]],["t/318",[6,1.365,82,2.221,84,2.83,85,2.583,106,2.83,149,3.664,150,3.664,151,3.664]],["t/322",[152,3.356,153,4.346,154,4.346,155,4.346,156,4.346]],["t/330",[13,1.949,15,1.584,18,2.064,45,2.986,61,2.517,157,3.866,158,3.866]],["t/334",[22,1.519,36,4.606]],["t/342",[13,1.826,51,2.007,59,2.007,61,1.514,82,1.41,111,1.64,159,3.623,160,2.326,161,3.623,162,2.326,163,2.326,164,2.326,165,3.623,166,2.326,167,2.326]],["t/346",[0,0.629,5,0.867,16,1.377,55,1.634,61,1.377,111,1.491,112,1.825,133,1.825,168,2.116,169,1.491,170,2.116,171,2.116,172,2.116,173,2.116,174,2.116,175,2.116,176,2.116,177,2.116,178,2.116,179,2.116,180,2.116]],["t/371",[72,4.28,181,4.28,182,4.961]],["t/390",[8,2.194,13,1.949,15,1.584,183,3.866,184,3.866,185,3.866,186,3.866]],["t/394",[0,1.378,169,3.265,187,4.633,188,3.997]],["t/411",[0,1.378,169,3.265,188,3.997,189,4.633]],["t/432",[190,4.961,191,4.961,192,4.961]],["t/445",[99,3.763,193,5.339]],["t/471",[152,4.463]],["t/485",[6,1.848,55,3.832,194,4.961]],["t/500",[119,4.28,152,3.832,195,4.961]],["t/508",[5,2.032,16,2.032,196,4.28]],["t/525",[5,1.297,6,1.18,16,1.297,125,2.733,197,4.568,198,3.168,199,3.168,200,4.568,201,3.168]],["t/543",[0,1.475,169,3.497,202,4.961]],["t/595",[203,5.339,204,5.339]],["t/617",[205,5.339,206,5.339]],["t/630",[5,2.032,16,2.032,196,4.28]],["t/632",[22,1.412,81,4.28,181,4.28]]],"invertedIndex":[["",{"_index":23,"t":{"86":{"position":[[0,1]]},"92":{"position":[[0,1]]},"104":{"position":[[0,1]]}}}],["0.14.0",{"_index":206,"t":{"617":{"position":[[13,6]]}}}],["10.7",{"_index":89,"t":{"207":{"position":[[23,4]]}}}],["abil",{"_index":133,"t":{"302":{"position":[[335,7]]},"346":{"position":[[36,7]]}}}],["accept",{"_index":94,"t":{"219":{"position":[[39,6]]},"239":{"position":[[39,6]]},"270":{"position":[[42,6]]}}}],["access",{"_index":53,"t":{"155":{"position":[[39,6]]}}}],["account",{"_index":20,"t":{"82":{"position":[[49,7]]},"86":{"position":[[65,7]]},"92":{"position":[[57,7]]},"104":{"position":[[58,7]]}}}],["accur",{"_index":123,"t":{"302":{"position":[[102,10]]}}}],["accuraci",{"_index":134,"t":{"302":{"position":[[391,8]]}}}],["activ",{"_index":18,"t":{"82":{"position":[[27,8]]},"86":{"position":[[29,8]]},"92":{"position":[[29,8]]},"104":{"position":[[29,8]]},"108":{"position":[[27,8]]},"115":{"position":[[27,8]]},"191":{"position":[[107,8]]},"330":{"position":[[36,8]]}}}],["actual",{"_index":129,"t":{"302":{"position":[[231,6]]}}}],["affect",{"_index":131,"t":{"302":{"position":[[323,6],[380,6]]}}}],["airson",{"_index":147,"t":{"312":{"position":[[126,8]]}}}],["album",{"_index":177,"t":{"346":{"position":[[150,5]]}}}],["alreadi",{"_index":30,"t":{"100":{"position":[[38,7]]}}}],["api",{"_index":80,"t":{"191":{"position":[[85,3]]},"296":{"position":[[40,3]]},"302":{"position":[[304,4]]},"312":{"position":[[73,3]]}}}],["app",{"_index":192,"t":{"432":{"position":[[17,3]]}}}],["appl",{"_index":76,"t":{"191":{"position":[[26,5],[73,5]]}}}],["applic",{"_index":96,"t":{"219":{"position":[[69,12]]},"239":{"position":[[69,12]]},"312":{"position":[[32,11]]}}}],["artist",{"_index":176,"t":{"346":{"position":[[137,8]]}}}],["atproto",{"_index":34,"t":{"115":{"position":[[43,7]]}}}],["autom",{"_index":170,"t":{"346":{"position":[[75,9]]}}}],["automix",{"_index":121,"t":{"302":{"position":[[27,7]]}}}],["azuracast",{"_index":37,"t":{"137":{"position":[[0,9]]}}}],["bandcamp",{"_index":116,"t":{"282":{"position":[[123,9]]}}}],["break",{"_index":62,"t":{"155":{"position":[[159,8]]}}}],["browser",{"_index":167,"t":{"342":{"position":[[199,8]]}}}],["build",{"_index":190,"t":{"432":{"position":[[0,8]]}}}],["built",{"_index":187,"t":{"394":{"position":[[25,5]]}}}],["button",{"_index":67,"t":{"165":{"position":[[47,6]]}}}],["case",{"_index":43,"t":{"137":{"position":[[76,4]]}}}],["cast",{"_index":66,"t":{"165":{"position":[[28,4]]}}}],["chang",{"_index":59,"t":{"155":{"position":[[115,6]]},"342":{"position":[[166,6]]}}}],["chromecast",{"_index":68,"t":{"165":{"position":[[54,10]]}}}],["client",{"_index":1,"t":{"1":{"position":[[9,7]]},"43":{"position":[[8,6]]},"191":{"position":[[135,8]]},"266":{"position":[[49,8]]},"278":{"position":[[39,6]]}}}],["common",{"_index":72,"t":{"169":{"position":[[0,6]]},"371":{"position":[[0,6]]}}}],["commun",{"_index":82,"t":{"201":{"position":[[32,11]]},"213":{"position":[[32,11]]},"274":{"position":[[34,13]]},"278":{"position":[[3,12]]},"318":{"position":[[3,12]]},"342":{"position":[[0,13]]}}}],["compos",{"_index":201,"t":{"525":{"position":[[84,8]]}}}],["config",{"_index":168,"t":{"346":{"position":[[16,7]]}}}],["configur",{"_index":2,"t":{"12":{"position":[[0,13]]},"191":{"position":[[124,10]]},"209":{"position":[[15,13]]},"270":{"position":[[26,9]]}}}],["connect",{"_index":99,"t":{"270":{"position":[[59,11]]},"278":{"position":[[46,11]]},"306":{"position":[[63,7]]},"445":{"position":[[0,10]]}}}],["correctli",{"_index":38,"t":{"137":{"position":[[18,9],[186,10]]}}}],["creat",{"_index":21,"t":{"82":{"position":[[57,6]]},"86":{"position":[[73,6]]},"92":{"position":[[65,6]]},"104":{"position":[[66,6]]},"108":{"position":[[49,6]]},"115":{"position":[[59,6]]},"266":{"position":[[33,6]]}}}],["current",{"_index":14,"t":{"49":{"position":[[101,9]]},"68":{"position":[[101,9]]}}}],["data",{"_index":55,"t":{"155":{"position":[[53,4]]},"346":{"position":[[64,4]]},"485":{"position":[[15,4]]}}}],["decid",{"_index":166,"t":{"342":{"position":[[155,7]]}}}],["deezer",{"_index":54,"t":{"155":{"position":[[46,6],[104,6]]}}}],["deezer'",{"_index":57,"t":{"155":{"position":[[90,8]]}}}],["determin",{"_index":124,"t":{"302":{"position":[[113,9]]}}}],["develop",{"_index":181,"t":{"371":{"position":[[7,11]]},"632":{"position":[[0,10]]}}}],["devic",{"_index":65,"t":{"165":{"position":[[14,6]]}}}],["device/receiv",{"_index":184,"t":{"390":{"position":[[18,16]]}}}],["differ",{"_index":178,"t":{"346":{"position":[[164,9]]}}}],["discord",{"_index":3,"t":{"43":{"position":[[0,7]]},"49":{"position":[[58,7]]},"68":{"position":[[58,7]]}}}],["docker",{"_index":200,"t":{"525":{"position":[[66,6],[77,6]]}}}],["done",{"_index":31,"t":{"100":{"position":[[46,4]]},"201":{"position":[[107,4]]}}}],["duplic",{"_index":75,"t":{"169":{"position":[[35,9]]}}}],["durat",{"_index":46,"t":{"137":{"position":[[117,8]]},"302":{"position":[[407,8]]}}}],["enabl",{"_index":86,"t":{"201":{"position":[[86,8]]},"213":{"position":[[91,8]]},"219":{"position":[[12,7]]},"239":{"position":[[12,7]]},"302":{"position":[[35,7]]}}}],["end",{"_index":125,"t":{"302":{"position":[[141,4]]},"525":{"position":[[100,3]]}}}],["endors",{"_index":160,"t":{"342":{"position":[[63,8]]}}}],["endpoint",{"_index":146,"t":{"312":{"position":[[108,8]]}}}],["enhanc",{"_index":169,"t":{"346":{"position":[[47,7]]},"394":{"position":[[0,9]]},"411":{"position":[[0,9]]},"543":{"position":[[0,9]]}}}],["exampl",{"_index":50,"t":{"145":{"position":[[13,8]]}}}],["extens",{"_index":154,"t":{"322":{"position":[[34,9]]}}}],["fashion",{"_index":171,"t":{"346":{"position":[[85,7]]}}}],["find",{"_index":135,"t":{"306":{"position":[[0,4]]}}}],["flatpak",{"_index":191,"t":{"432":{"position":[[9,7]]}}}],["found",{"_index":93,"t":{"213":{"position":[[112,5]]}}}],["function",{"_index":9,"t":{"49":{"position":[[32,13]]},"68":{"position":[[32,13]]},"155":{"position":[[168,14]]}}}],["get",{"_index":194,"t":{"485":{"position":[[0,7]]}}}],["getnowplay",{"_index":145,"t":{"312":{"position":[[94,13]]}}}],["googl",{"_index":161,"t":{"342":{"position":[[75,7],[148,6]]}}}],["greater",{"_index":90,"t":{"207":{"position":[[31,7]]}}}],["gui",{"_index":87,"t":{"201":{"position":[[124,4]]},"213":{"position":[[132,4]]}}}],["guid",{"_index":197,"t":{"525":{"position":[[5,5],[111,5]]}}}],["headless",{"_index":110,"t":{"282":{"position":[[12,8]]}}}],["histori",{"_index":77,"t":{"191":{"position":[[48,7]]}}}],["http",{"_index":150,"t":{"318":{"position":[[39,6]]}}}],["icecast",{"_index":91,"t":{"209":{"position":[[0,7]]}}}],["icon",{"_index":69,"t":{"165":{"position":[[65,4]]}}}],["implement",{"_index":143,"t":{"312":{"position":[[49,10]]}}}],["input",{"_index":186,"t":{"390":{"position":[[70,7]]}}}],["instal",{"_index":152,"t":{"322":{"position":[[6,10]]},"471":{"position":[[0,12]]},"500":{"position":[[6,7]]}}}],["instanc",{"_index":142,"t":{"306":{"position":[[84,9]]}}}],["integr",{"_index":163,"t":{"342":{"position":[[104,11]]}}}],["interfac",{"_index":85,"t":{"201":{"position":[[76,9]]},"213":{"position":[[81,9]]},"274":{"position":[[20,9]]},"318":{"position":[[46,9]]}}}],["issu",{"_index":193,"t":{"445":{"position":[[11,6]]}}}],["jellyfin",{"_index":88,"t":{"207":{"position":[[14,8]]}}}],["jriver",{"_index":92,"t":{"213":{"position":[[49,6],[125,6]]}}}],["kitchen",{"_index":48,"t":{"145":{"position":[[0,7]]}}}],["knowledg",{"_index":182,"t":{"371":{"position":[[19,9]]}}}],["kodi",{"_index":83,"t":{"201":{"position":[[49,4],[119,4]]}}}],["koito",{"_index":19,"t":{"82":{"position":[[43,5],[66,5]]},"237":{"position":[[0,5]]}}}],["last.fm",{"_index":25,"t":{"86":{"position":[[82,7]]},"219":{"position":[[97,7]]},"233":{"position":[[0,7]]}}}],["last.fm/libre.fm",{"_index":24,"t":{"86":{"position":[[48,16]]}}}],["latest",{"_index":203,"t":{"595":{"position":[[0,6]]}}}],["length",{"_index":41,"t":{"137":{"position":[[41,6]]},"302":{"position":[[238,6]]}}}],["libre.fm",{"_index":26,"t":{"92":{"position":[[48,8],[74,8]]},"258":{"position":[[0,8]]}}}],["lifecycl",{"_index":180,"t":{"346":{"position":[[201,10]]}}}],["linux",{"_index":103,"t":{"274":{"position":[[70,5]]}}}],["listen",{"_index":45,"t":{"137":{"position":[[103,9]]},"191":{"position":[[38,9]]},"330":{"position":[[26,9]]}}}],["listenbrainz",{"_index":32,"t":{"104":{"position":[[45,12],[75,12]]},"239":{"position":[[97,12]]},"262":{"position":[[0,12]]}}}],["local",{"_index":119,"t":{"296":{"position":[[34,5]]},"500":{"position":[[0,5]]}}}],["make",{"_index":138,"t":{"306":{"position":[[25,4]]}}}],["maloja",{"_index":28,"t":{"100":{"position":[[8,6]]},"266":{"position":[[18,6],[42,6]]}}}],["mani",{"_index":112,"t":{"282":{"position":[[67,4]]},"346":{"position":[[159,4]]}}}],["match",{"_index":172,"t":{"346":{"position":[[96,8]]}}}],["mean",{"_index":162,"t":{"342":{"position":[[88,5]]}}}],["media",{"_index":64,"t":{"165":{"position":[[8,5]]}}}],["method",{"_index":52,"t":{"155":{"position":[[28,7],[138,7]]}}}],["mix",{"_index":126,"t":{"302":{"position":[[175,7]]}}}],["modifi",{"_index":130,"t":{"302":{"position":[[278,8]]}}}],["modul",{"_index":151,"t":{"318":{"position":[[56,6]]}}}],["monitor",{"_index":15,"t":{"49":{"position":[[111,10]]},"68":{"position":[[111,10]]},"82":{"position":[[3,7]]},"86":{"position":[[5,7]]},"92":{"position":[[5,7]]},"104":{"position":[[5,7]]},"108":{"position":[[3,7]]},"115":{"position":[[3,7]]},"165":{"position":[[118,7]]},"191":{"position":[[12,8]]},"296":{"position":[[47,7]]},"330":{"position":[[0,7]]},"390":{"position":[[0,7]]}}}],["mopidi",{"_index":109,"t":{"282":{"position":[[0,6]]}}}],["mpd",{"_index":107,"t":{"278":{"position":[[21,3]]}}}],["mpri",{"_index":100,"t":{"274":{"position":[[0,5]]}}}],["ms",{"_index":106,"t":{"278":{"position":[[0,2]]},"302":{"position":[[92,2],[416,2]]},"318":{"position":[[0,2]]}}}],["ms'",{"_index":132,"t":{"302":{"position":[[330,4]]}}}],["multi",{"_index":16,"t":{"49":{"position":[[127,5]]},"68":{"position":[[127,5]]},"137":{"position":[[160,5]]},"165":{"position":[[98,5]]},"201":{"position":[[13,5]]},"213":{"position":[[13,5]]},"219":{"position":[[20,5]]},"239":{"position":[[20,5]]},"296":{"position":[[0,5]]},"346":{"position":[[0,5],[183,5]]},"508":{"position":[[9,5]]},"525":{"position":[[44,5]]},"630":{"position":[[9,5]]}}}],["music",{"_index":13,"t":{"49":{"position":[[87,5]]},"68":{"position":[[87,5]]},"165":{"position":[[150,5]]},"191":{"position":[[32,5],[79,5]]},"274":{"position":[[53,5]]},"282":{"position":[[21,5],[56,5]]},"330":{"position":[[20,5]]},"342":{"position":[[22,5],[180,5]]},"390":{"position":[[39,5]]}}}],["musicbrainz",{"_index":202,"t":{"543":{"position":[[25,11]]}}}],["musiccast",{"_index":183,"t":{"390":{"position":[[8,9]]}}}],["musikcub",{"_index":97,"t":{"270":{"position":[[16,9]]}}}],["navidrom",{"_index":148,"t":{"312":{"position":[[139,10]]}}}],["network/usb/cd",{"_index":185,"t":{"390":{"position":[[55,14]]}}}],["new",{"_index":81,"t":{"191":{"position":[[103,3]]},"632":{"position":[[13,3]]}}}],["non",{"_index":113,"t":{"282":{"position":[[85,3]]}}}],["note",{"_index":139,"t":{"306":{"position":[[30,4]]}}}],["now",{"_index":7,"t":{"49":{"position":[[20,3]]},"68":{"position":[[20,3]]}}}],["offici",{"_index":79,"t":{"191":{"position":[[64,8]]}}}],["open",{"_index":155,"t":{"322":{"position":[[44,4]]}}}],["oper",{"_index":104,"t":{"274":{"position":[[76,9]]}}}],["order",{"_index":71,"t":{"165":{"position":[[132,5]]},"201":{"position":[[3,5]]},"213":{"position":[[3,5]]},"270":{"position":[[3,5]]}}}],["outsid",{"_index":95,"t":{"219":{"position":[[61,7]]},"239":{"position":[[61,7]]}}}],["overview",{"_index":4,"t":{"43":{"position":[[15,8]]}}}],["pandora",{"_index":115,"t":{"282":{"position":[[114,8]]}}}],["pars",{"_index":188,"t":{"394":{"position":[[34,7]]},"411":{"position":[[31,7]]}}}],["phone/comput",{"_index":70,"t":{"165":{"position":[[78,14]]}}}],["play",{"_index":8,"t":{"49":{"position":[[24,7]]},"68":{"position":[[24,7]]},"165":{"position":[[160,5]]},"282":{"position":[[48,7]]},"296":{"position":[[81,8]]},"302":{"position":[[212,4],[287,4],[431,7]]},"390":{"position":[[45,6]]}}}],["player",{"_index":102,"t":{"274":{"position":[[59,7]]},"302":{"position":[[16,6]]}}}],["playlist/queu",{"_index":122,"t":{"302":{"position":[[72,14]]}}}],["plex",{"_index":136,"t":{"306":{"position":[[10,4],[79,4]]}}}],["port",{"_index":141,"t":{"306":{"position":[[50,4]]}}}],["posit",{"_index":42,"t":{"137":{"position":[[51,9]]}}}],["preferences/set",{"_index":156,"t":{"322":{"position":[[53,20]]}}}],["presenc",{"_index":12,"t":{"49":{"position":[[71,8]]},"68":{"position":[[71,8]]}}}],["profil",{"_index":35,"t":{"115":{"position":[[51,7]]}}}],["queue",{"_index":127,"t":{"302":{"position":[[191,5]]}}}],["re",{"_index":17,"t":{"82":{"position":[[15,2]]},"86":{"position":[[17,2]]},"92":{"position":[[17,2]]},"104":{"position":[[17,2]]},"108":{"position":[[15,2]]},"115":{"position":[[15,2]]}}}],["real",{"_index":158,"t":{"330":{"position":[[48,4]]}}}],["reduc",{"_index":44,"t":{"137":{"position":[[92,6]]}}}],["regex",{"_index":189,"t":{"411":{"position":[[25,5]]}}}],["releas",{"_index":204,"t":{"595":{"position":[[7,7]]}}}],["remov",{"_index":60,"t":{"155":{"position":[[125,6]]}}}],["replac",{"_index":173,"t":{"346":{"position":[[109,9]]}}}],["report",{"_index":39,"t":{"137":{"position":[[28,6]]},"302":{"position":[[266,6],[419,7]]}}}],["rich",{"_index":11,"t":{"49":{"position":[[66,4]]},"68":{"position":[[66,4]]}}}],["risk",{"_index":63,"t":{"155":{"position":[[211,5]]}}}],["rockski",{"_index":33,"t":{"108":{"position":[[41,7],[58,7]]},"290":{"position":[[0,7]]}}}],["run",{"_index":199,"t":{"525":{"position":[[31,7]]}}}],["scenario",{"_index":73,"t":{"169":{"position":[[7,9]]}}}],["scrobbl",{"_index":0,"t":{"1":{"position":[[0,8]]},"82":{"position":[[18,8]]},"86":{"position":[[20,8]]},"92":{"position":[[20,8]]},"104":{"position":[[20,8]]},"108":{"position":[[18,8]]},"115":{"position":[[18,8]]},"122":{"position":[[0,8]]},"137":{"position":[[132,8],[176,9]]},"165":{"position":[[141,8]]},"169":{"position":[[45,9]]},"191":{"position":[[93,9]]},"219":{"position":[[46,9]]},"239":{"position":[[46,9]]},"266":{"position":[[4,8]]},"302":{"position":[[346,8]]},"346":{"position":[[55,8]]},"394":{"position":[[10,9]]},"411":{"position":[[10,9]]},"543":{"position":[[10,9]]}}}],["scrobbler",{"_index":5,"t":{"49":{"position":[[5,9],[133,10]]},"68":{"position":[[5,9],[133,10]]},"137":{"position":[[166,9]]},"165":{"position":[[104,9]]},"201":{"position":[[19,9]]},"213":{"position":[[19,9]]},"219":{"position":[[26,9]]},"239":{"position":[[26,9]]},"296":{"position":[[6,9]]},"346":{"position":[[6,9]]},"508":{"position":[[15,9]]},"525":{"position":[[50,9]]},"630":{"position":[[15,9]]}}}],["scrobbler'",{"_index":179,"t":{"346":{"position":[[189,11]]}}}],["server",{"_index":29,"t":{"100":{"position":[[15,6]]},"213":{"position":[[74,6]]},"219":{"position":[[105,7]]},"239":{"position":[[110,7]]},"266":{"position":[[25,7]]},"270":{"position":[[74,6]]},"282":{"position":[[27,6]]}}}],["servic",{"_index":195,"t":{"500":{"position":[[19,7]]}}}],["set",{"_index":10,"t":{"49":{"position":[[49,3]]},"68":{"position":[[49,3]]}}}],["setup",{"_index":27,"t":{"100":{"position":[[0,5]]},"270":{"position":[[81,6]]}}}],["shorter",{"_index":128,"t":{"302":{"position":[[204,7]]}}}],["sink",{"_index":49,"t":{"145":{"position":[[8,4]]}}}],["solut",{"_index":74,"t":{"169":{"position":[[21,9]]}}}],["sono",{"_index":118,"t":{"296":{"position":[[28,5],[65,5]]}}}],["sourc",{"_index":22,"t":{"82":{"position":[[72,8]]},"86":{"position":[[90,8]]},"92":{"position":[[83,8]]},"104":{"position":[[88,8]]},"108":{"position":[[66,8]]},"115":{"position":[[76,8]]},"122":{"position":[[9,7]]},"155":{"position":[[5,6],[192,6]]},"191":{"position":[[5,6]]},"209":{"position":[[8,6]]},"219":{"position":[[5,6]]},"233":{"position":[[8,8]]},"237":{"position":[[6,8]]},"239":{"position":[[5,6]]},"258":{"position":[[9,8]]},"262":{"position":[[13,8]]},"282":{"position":[[98,7]]},"290":{"position":[[8,8]]},"312":{"position":[[5,6]]},"334":{"position":[[8,8]]},"632":{"position":[[17,6]]}}}],["spotifi",{"_index":120,"t":{"302":{"position":[[8,7],[47,7],[249,7],[360,7]]}}}],["standard",{"_index":101,"t":{"274":{"position":[[11,8]]},"282":{"position":[[72,8],[89,8]]}}}],["stop",{"_index":164,"t":{"342":{"position":[[120,4]]}}}],["string",{"_index":174,"t":{"346":{"position":[[119,7]]}}}],["subson",{"_index":144,"t":{"312":{"position":[[64,8]]}}}],["such",{"_index":114,"t":{"282":{"position":[[106,4]]},"312":{"position":[[117,5]]}}}],["support",{"_index":111,"t":{"282":{"position":[[39,8]]},"312":{"position":[[81,8]]},"342":{"position":[[50,9]]},"346":{"position":[[24,7]]}}}],["system",{"_index":105,"t":{"274":{"position":[[86,8]]},"296":{"position":[[71,6]]}}}],["tcp",{"_index":108,"t":{"278":{"position":[[35,3]]}}}],["teal.fm",{"_index":36,"t":{"115":{"position":[[68,7]]},"334":{"position":[[0,7]]}}}],["threshold",{"_index":47,"t":{"137":{"position":[[141,10]]}}}],["time",{"_index":61,"t":{"155":{"position":[[153,5]]},"302":{"position":[[217,4],[292,4]]},"330":{"position":[[53,5]]},"342":{"position":[[140,4]]},"346":{"position":[[174,5]]}}}],["titl",{"_index":175,"t":{"346":{"position":[[130,6]]}}}],["to",{"_index":58,"t":{"155":{"position":[[99,4]]}}}],["token",{"_index":137,"t":{"306":{"position":[[15,5]]}}}],["track",{"_index":40,"t":{"137":{"position":[[35,5]]},"302":{"position":[[130,5],[166,5]]}}}],["tunein",{"_index":117,"t":{"282":{"position":[[137,7]]}}}],["unoffici",{"_index":51,"t":{"155":{"position":[[17,10]]},"342":{"position":[[31,10]]}}}],["up",{"_index":198,"t":{"525":{"position":[[24,2]]}}}],["updat",{"_index":196,"t":{"508":{"position":[[0,8]]},"630":{"position":[[0,8]]}}}],["upgrad",{"_index":205,"t":{"617":{"position":[[0,9]]}}}],["url",{"_index":140,"t":{"306":{"position":[[42,3]]}}}],["us",{"_index":6,"t":{"49":{"position":[[15,4]]},"68":{"position":[[15,4]]},"137":{"position":[[126,5]]},"155":{"position":[[12,4],[183,3]]},"165":{"position":[[36,5]]},"207":{"position":[[8,5]]},"270":{"position":[[12,3]]},"278":{"position":[[25,5]]},"296":{"position":[[20,3]]},"302":{"position":[[55,4]]},"306":{"position":[[55,4]]},"312":{"position":[[19,4]]},"318":{"position":[[25,5]]},"485":{"position":[[8,6]]},"525":{"position":[[60,5]]}}}],["via",{"_index":78,"t":{"191":{"position":[[56,3]]}}}],["violat",{"_index":56,"t":{"155":{"position":[[77,9]]}}}],["vlc",{"_index":149,"t":{"318":{"position":[[21,3]]}}}],["web",{"_index":84,"t":{"201":{"position":[[72,3]]},"213":{"position":[[70,3]]},"318":{"position":[[35,3]]}}}],["webscrobbl",{"_index":153,"t":{"322":{"position":[[21,12]]}}}],["websocket",{"_index":98,"t":{"270":{"position":[[49,9]]}}}],["work",{"_index":165,"t":{"342":{"position":[[125,7],[186,5]]}}}],["yandex",{"_index":157,"t":{"330":{"position":[[13,6]]}}}],["yt",{"_index":159,"t":{"342":{"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 Discord ✅ Last.fm ✅ Libre.fm ✅ Listenbrainz ✅ Koito ✅ Maloja ❌ Rocksky ❌ Teal.fm ✅","s":"Clients","u":"/multi-scrobbler/configuration/clients/","h":"#clients","p":1},{"i":7,"t":"Before a Play is scrobbled to a client MS checks existing scrobbles from the Client's API to see if the Play has already been scrobbled. For each Play, MS fetches (cached) scrobbles from the Client in a time range inclusive of the Play's listening timestamp and then scores existing scrobbles against the Play based on: Similarity of Title, Artists, and Album Temporal closeness of the Play's timestamp to the existing scrobble's timestamp Whether MS detected the Play as a repeat (applicable to Sources that report realtime Player data) Detailed scoring breakdowns against each existing scrobble are logged at the TRACE logging level or in the debug data for a scrobble. See the Duplicate Scrobble Guidance page to learn how duplicates are detected and how you can ensure your configuration avoids possible duplicates.","s":"Duplicate Detection","u":"/multi-scrobbler/configuration/clients/","h":"#duplicate-detection","p":1},{"i":9,"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":11,"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":13,"t":"tip Check the FAQ if you have any issues after configuration!","s":"Overview","u":"/multi-scrobbler/configuration/","h":"","p":12},{"i":15,"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 type. 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 config files but it will still create and use data files in the local or docker data directory. Use ENV-based configuration if... You are the only person for whom MS is scrobbling for or You have a very simple setup for MS such as one scrobble Client and one Source IE Jellyfin -> Koito, or You are not comfortable editing JSON files Config Example docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler environment: - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser - JELLYFIN_ID=myJellyin # ... # ... 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 -> See Config and Data Directories Docker -> /config (in the container) -- see the Storage tab in the Docker installation docs for how to configure this correctly Use File-based configuration if... You are comfortable editing JSON files You have more than one of the same type of Source/Client you want to use EX 2x Last.fm accounts, 3x Jellyfin accounts You want activity from specific Sources 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, more configuration is possible using File. AIO enables complete configuration. 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. These are the same examples you will find in the Configuration section of each Source/Client There is also a kitchensink example that provides examples of using all sources/clients in a complex configuration. Each config file is named after the type of the Client/Source. Within each file, a JSON array defines all of the instances for that type of Client/Source. Example directory structure: /CONFIG_DIR jellyfin.json lastfm.json koito.json Config Example jellyfin.json [ { \"name\": \"Foxx JF Server\", \"id\": \"foxxJf\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } } ] Multiple of Same Config Example jellyfin.json [ { \"name\": \"Foxx JF Server\", \"id\": \"foxxJf\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } }, { \"name\": \"Foo's JF Server\", \"id\": \"fooJf\", \"data\": { \"url\": \"http://192.168.0.150:8096\", \"user\": \"foo\", \"apiKey\": \"9c5bb56bd6540c756fbf481ebd9c5c40\" } } ] You can find an example of the file name that should be used under the File Configuration for each Source/Client. Note: this is the same value that is used for type in AIO configs. MS will parse an all-in-one configuration file (config.json) located in the directory specified by the CONFIG_DIR environmental variable. The file's location defaults to: Local installation -> See Config and Data Directories Docker -> /config/config.json (in the container) -- see the Storage tab in the Docker installation docs for how to configure this correctly Use AIO-based configuration if... ...All of the reasons listed in File You want to setup monitoring/webhooks, default settings for all Sources/Clients, or global config options You want to use Transformers (other than what is provided for Musicbrainz ENV) You want complete control over all potential MS configuration tip AIO config is the \"complete\" way to configure MS. All settings available in File/ENV are available in AIO and AIO has more exclusive settings. AIO enables configuring default settings for all Sources/Clients There is a kitchensink example that provides examples of using all sources/clients in a complex configuration. Use the Config Playground to explore the entire config schema with an editable example The example used can also be found in the repo directory at /config/config.json.example in the example below 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\": \"Cool Spotify Name\", \"id\": \"mySpotifyId\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\" } } ], \"clients\": [ { \"type\": \"maloja\", \"enable\": true, \"name\": \"Foxx Maloja\", \"id\": \"myMalojaId\", \"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 } } ] } Source/Client AIO Configs require a 'type' property Compared to their File equivalent, Sources/Clients configured using AIO require an additional type property. config.json { \"sources\": [ { \"name\": \"Foxx JF Server\", \"type: \"jellyfin\", \"id\": \"foxxJf\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } } ] } You can find an example of the required type value by referring to the AIO tab in each Source/Client's Configuration section example. This is the same value that is used as the name of individual File config files.","s":"Configuration Types","u":"/multi-scrobbler/configuration/","h":"#configuration-types","p":12},{"i":17,"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":12},{"i":19,"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":12},{"i":21,"t":"Defines the URL that is used to generate default redirect URLs for authentication for services like 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":12},{"i":23,"t":"Multi-scrobbler implements caching to reduce external API calls and make some actions faster. A default in-memory cache store is used so that you always benefit from some caching. An optional, secondary store can be configured for greater caching capabilities. What is Cached? Auth Data Scrobble Transforms Transform API Calls Authentication sessions/tokens/etc... are cached for quicker requests and for persistence across restarts. The results of transform rules are cached so that if a scrobble with identical data (track/artists/album) is identified and it has the same set of transform rules then the cached transform results can be applied. 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. Auth Cache Configuration Auth caching defaults to a file that is stored in the DATA_DIR directory using the pre-defined file name ms-auth.cache. This provides automatic persistence across restarts for long-lived auth data/credentials if you have configured a persisted volume/bind mount for configuration (/config is mounted in docker compose). If you wish to use the secondary store for caching Auth you must explicitly configure it. This is because valkey can potentially be ephemeral if you do not provide a volume for its data directory. To explicitly configure auth to use the secondary store: ENV AIO compose.yaml services: multi-scrobbler: # ... environment: - CACHE_AUTH=valkey # ... config.json { \"cache\": { \"auth\": { \"provider\": \"valkey\" } }, // ... }","s":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":12},{"i":25,"t":"Using a secondary store enables: persistence of cached data across restarts a larger store (more data is saved) a longer time-to-live in the store (cached data is fetchable for a longer period) These benefits are particularly beneficial when using transforms like Musicbrainz and it is strongly recommended for these scenarios. Currently, Multi-scrobbler only supports Valkey, an open-source fork of Redis, as a secondary store. Adding Valkey container to multi-scrobbler A valkey container can be added to the multi-scrobbler docker compose stack: Named Volume Bind Mount docker-compose.yml services: multi-scrobbler: # ... valkey: image: valkey/valkey volumes: - valkeydata:/data volumes: valkeydata: driver: local docker-compose.yml services: multi-scrobbler: # ... valkey: image: valkey/valkey volumes: - ./valkeyData:/data 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 compose.yaml services: multi-scrobbler: # ... environment: - CACHE_VALKEY=redis://192.168.0.120:6379 # ... Example config.json { \"cache\": { \"valkey\": \"redis://192.168.0.120:6379\" }, // ... }","s":"Secondary Caching Store","u":"/multi-scrobbler/configuration/","h":"#secondary-caching","p":12},{"i":27,"t":"Multi-scrobbler depends on a SQLite database (ms.db) that is created on first run and stored in the CONFIG_DIR. When upgrading Multi-scrobbler version, if there are any required database changes than this database is automatically backed up and migrated. The database stores all Plays for your Sources/Clients as well as metadata and debugging information to help troubleshoot issues. Each Play is associated with a Source/Config in the database based on your configuration. You must set IDs for each Source/Client so that the database can identify these even when the configuration is changed.","s":"Database","u":"/multi-scrobbler/configuration/","h":"#database","p":12},{"i":29,"t":"How much storage does the database use? The amount of data stored for each Play can widely vary based on a few factors: how much data the Source service exposes how many clients each Source is scrobble to (Plays are duplicated for each Client a Source sends a scrobble to) if you are using any Transforms the diff of each step is stored, along with any external request/response data (like Musicbrainz queries) The MS repository contains a benchmark to measure an average database size in a few common scenarios. Minimal With Original Input All Debug Deta Assuming your Sources send a minimal amount of data or you have compacted all plays: Play Count DB Size 100 160kb 1000 1MB 10k 10.2MB Assuming your Sources have a non-trivial amount of input data (like Spotify or Listenbrainz) that is not compacted: Play Count DB Size 100 356kb 1000 3MB 10k 29.6MB Assuming your Sources/Clients: have a non-trivial amount of input data (like Spotify or Listenbrainz) and has many Transforms steps that include requests nothing is compacted Play Count DB Size 100 684kb 1000 6.28MB 10k 61.3MB A retention policy can be configured to delete Plays, or unused debug data, from the database after a certain amount of time. If no configuration is provided then a default policy is used that should be reasonable for most users. Compaction Deletion The Compaction Retention Policy is used to delete different types of debug data from your stored Plays. This is a useful way to reduce used storage space when you are not having problems with your Plays, or iterating on a configuration, that requires referencing all this extra data. There are two types of data that can be compacted (deleted from the Play): input - this is the untouched data retrieved by Multi-scrobbler, from a Source, and used to generate a Play/scrobble. This can be used to reconstruct and replay a Play, when used from troubleshooting or reporting an issue transform - this is all of the steps generated by transforms, the diff of the Play resulting from the step, and any request/responses used to complete the step Defaults When no Compact configuration is provided, Multi-scrobbler uses this policy: Compact (delete) input and transform data on all Plays after 3 days Configuring Compaction Policy​ Details Each value in the configuration properties below can be either a number of seconds EX 3600 = 10 minutes a unit of a common duration with the pattern X unit EX 30 minutes 5 hours 2 days ENV AIO COMPACT_PROPERTIES - which properties to compact RETENTION_COMPACT_AFTER - Default to use for all Plays RETENTION_COMPACT_COMPLETED_AFTER - Compact only completed Plays after... RETENTION_COMPACT_FAILED_AFTER - Compact only failed Plays after... RETENTION_COMPACT_DUPED_AFTER - Compact only duped/discard Plays after... Example # only delete input when compacting COMPACT_PROPERTIES=input # compact all plays after 3 days RETENTION_COMPACT_AFTER=3 days # specifically compact completed plays after 30 minutes RETENTION_COMPACT_COMPLETED_AFTER=30 minutes Compacting all Play types and deleting both input and transform: config.json { \"database\": { \"retention\": { \"compactAfter\": \"3 days\", \"compact\": [ \"input\", \"transform\" ] } } } Delete only input during compacting Compact all after 3 days except completed which compacts after 30 minutes config.json { \"database\": { \"retention\": { \"compactAfter\": { \"completed\": \"30 minutes\", \"duped\": \"3 days\", \"failed\": \"3 days\" }, \"compact\": [ \"input\" ] } } } The Deletion Retention Policy is used to delete different types of stored Plays from Multi-scrobbler database. This does not delete Plays from your Clients. It's only deleting the \"in-flight\" data MS used to create the scrobble that was eventually sent to your clients. Plays Should be Ephemeral Multi-Scrobbler is not designed to store Plays/Scrobbles indefinitely. It should scale fine for thousands of scrobbles but it not meant to store 10's of thousands of scrobbles forever. It is not a scrobbler server. You should set a reasonable deletion policy so that MS stores less than 1000 scrobbles at a time, ideally less. Defaults When no Deletion policy configuration is provided, Multi-scrobbler uses this policy: Delete all Plays after 7 days Configuring Deletion Policy​ Details Each value in the configuration properties below can be either a number of seconds EX 3600 = 10 minutes a unit of a common duration with the pattern X unit EX 30 minutes 5 hours 2 days ENV AIO RETENTION_DELETE_AFTER - Default to use for all Plays RETENTION_DELETE_COMPLETED_AFTER - Delete only completed Plays after... RETENTION_DELETE_FAILED_AFTER - Delete only failed Plays after... RETENTION_DELETE_DUPED_AFTER - Delete only duped/discard Plays after... Example # delete all plays after 3 days RETENTION_DELETE_AFTER=3 days # specifically, delete completed plays after 30 minutes RETENTIOND_DELETE_COMPLETED_AFTER=30 minutes Deleting all Play types after 3 days: config.json { \"database\": { \"retention\": { \"deleteAfter\": \"3 days\" } } } Delete all after 3 days except completed which are deleted after 30 minutes config.json { \"database\": { \"retention\": { \"deleteAfter\": { \"completed\": \"30 minutes\", \"duped\": \"3 days\", \"failed\": \"3 days\" }, } } }","s":"Retention","u":"/multi-scrobbler/configuration/","h":"#retention","p":12},{"i":31,"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":12},{"i":33,"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":12},{"i":36,"t":"A status page for monitoring the reachability of public services used by some Sources/Clients is available at https://status.multi-scrobbler.app This monitor runs on a VPS and checks the uptime of actual APIs for these services, not just landing pages. On a ~minute interval it checks: Listenbrainz API Musicbrainz API CoverArtArchive API Last.fm API A few MS-hosted support services","s":"Upstream Services Status","u":"/multi-scrobbler/configuration/","h":"#upstream-services-status","p":12},{"i":38,"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":12},{"i":40,"t":"An endpoint for monitoring the health of sources/clients is available at GET http://YourMultiScrobblerDomain/api/health Returns 200 OK when everything is working or 500 Internal Server Error if anything is not The plain url (/api/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 /api/health?type=spotify or /api/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 /api/health will return 500 if they are not authenticated For sources that poll (spotify, yt music, subsonic) /api/health will 500 if they are not polling","s":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":12},{"i":42,"t":"A Prometheus export endpoint is available at GET http://YourMultiScrobblerDomain/api/metrics It includes metrics for: Count of discovered plays per Source Count of Queued/Scrobbled/Deadletter scrobbles per Client Number of issues per Source/Client If any of these metrics is > 0 it means your Source/Client is not operating normally Caching metrics Additionally, general process metrics like cpu and memory usage can be enabled with the env PROMETHEUS_FULL=true Example Usage Update your Prometheus Configuration file (usually at /etc/prometheus.yml) to add a job to the scrape_configssection like this: scrape_configs: # # ...your other jobs are here # - job_name: multi-scrobbler scrape_interval: 30s metrics_path: '/api/metrics' static_configs: - targets: ['myMultiscrobblerIp:9078'] Grafana Dashboard Github user 4rft5 created a Grafana dashboard that uses the Prometheus metrics from above. Download the json dashboard here: multiscrobbler-dashboard.json","s":"Prometheus","u":"/multi-scrobbler/configuration/","h":"#prometheus","p":12},{"i":44,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler. There are two types of Discord integrations to choose from:","s":"Discord","u":"/multi-scrobbler/configuration/clients/discord/","h":"","p":43},{"i":46,"t":"The App integration uses an existing Discord application on a desktop computer to set Rich Presence. Uses \"permitted\" access to Discord, no TOS issues More restricted customization compared to Headless Only active when your existing Discord application is open For most scenarios it requires additional, OS-specific steps to setup correctly May require an additional program on your machine to relay the Discord connection This is potentially insecure, or less secure, then Headless Can use discord in a container as an easy alternative This is a Headless-like experience App Docs","s":"App","u":"/multi-scrobbler/configuration/clients/discord/","h":"#app","p":43},{"i":48,"t":"The Headless integration uses Discord cloud Gateway/API, directly, to set Rich Presence. Does not require an existing Discord application (uses Discord cloud API) Using this Violates Discord TOS because it requires a user token More customization than App integration Active if any Discord application is online Headless Docs","s":"Headless","u":"/multi-scrobbler/configuration/clients/discord/","h":"#headless","p":43},{"i":50,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler. This integration uses an existing Discord application to set your Rich Presence. tip Check the main Discord docs page for a comparison between App and Headless.","s":"Discord (App)","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":49},{"i":53,"t":"You must create a Discord App in order to use this integration. Creating an App is free and simple. Go to the Discord Developer Portal Click on \"New Application\" and give it a name Copy the Application Id (Client Id) shown after creation Add this Id to your Multi-Scrobbler config Env Config => DISCORD_APPLICATION_ID=12345678 File Config => \"applicationId\": \"12345678\"","s":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-application","p":49},{"i":55,"t":"This integration uses an existing, running Discord application to communicate with Discord and set Rich Presence. Multi-scrobbler must be able to communicate with the Discord application, either by being on the same machine or over a network. Containerized Discord Native Discord Kasm Workspaces provides a self-hostable Discord container image. This image provides a desktop-like experience, through browser-based VNC, to use the official Discord application. This containerized approach can be used instead of configuring MS to use a Native Discord application on a specific machine. Advantages Setup is much simpler Discord runs in the same stack as multi-scrobbler Configuration is copy-paste. Skip all of the Discord Connection instructions. Get a Headless-like experience without needing to break Discord TOS Disadvantages Image only available for x86 arch Image and container are large (1GB+) Discord does not notify other clients of notifications in a channel if any client is viewing that channel. To avoid this, make sure your container discord instance is not viewing any server/channel/dm. Sometimes, Discord does not deliver \"notifications you missed\" to mobile because this depends on all clients being offline. Setup Setup is basically the same as using the instructions for Discord on Linux with MS on Same Host (Docker). 1. Add Discord Service to Multi-Scrobbler Docker Compose Stack Detailed Explanation Add the kasmweb/discord service to your compose stack Mount the directory containing Discord's unix socket to a named volume Configure MS to use Discord's unix socket Mount the unix socket volume into MS's container Add ENV DISCORD_IPC_LOCATIONS to point to the mounted volume Use this example docker-compose.yaml to modify your existing multi-scrobbler docker-compose.yaml: Example docker-compose.yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler:latest environment: # ... - DISCORD_APPLICATION_ID=12345678 # add below line - DISCORD_IPC_LOCATIONS=/run/discord-ipc-0 volumes: # ... # add below line - kasm_run:/run # ... # .. add discord service below kasmcord: container_name: kasmcord image: kasmweb/discord:1.14.0 ports: # VNC port to use in web browser - 6901:6901 shm_size: 512m environment: # set a password for VNC access VNC_PW: hunter2 XDG_RUNTIME_DIR: /run/user/1000 volumes: - kasm_run:/run/user/1000 - kasm_config:/home/kasm-user/.config user: \"0\" entrypoint: sh -c \"chmod 700 /run/user/1000 && chown -R kasm-user:kasm-user /run/user/1000 && chown -R kasm-user:kasm-user /home/kasm-user/.config && su kasm-user -c '/dockerstartup/kasm_default_profile.sh /dockerstartup/vnc_startup.sh /dockerstartup/kasm_startup.sh'\" volumes: kasm_run: name: kasm_run kasm_config: name: kasm_config Then re-deploy your stack. 2. Login to Discord Navigate in your browser to the IP/host Multi-Scrobbler/Discord are running on. Use the port set in the kasmcord service: # basic auth login # user: kasm_user # pass is what was set in env VNC_PW https://192.168.MY.HOST:6901 Login to Discord normally. After login is complete MS should connect automatically when a Now Playing event happens. If it does not or reports authentication failure then restart MS (but not Discord). If MS works then you are done and can move on to Optional Setup. Use this method if you want to connect MS to Discord running on a physical desktop. Local MS Installation Requires No Config If MS was installed locally (not Docker) on the same machine as the Discord application then MS should automatically detect the correct method and use it without any configuration from you. This will work for any OS. If MS cannot determine this automatically, follow the steps for your OS below. Follow the sections below to configure MS for your specific environment. Find IPC Connection​ Discord uses OS-specific methods to communicate with other applications on the same host, called IPC. You may need to determine some details about the IPC method in order for MS to communicate with it correctly. Discord on Linux Discord on MacOS Discord on Windows On Linux, Discord uses a Unix Socket for IPC. With Discord running, run this command: $ sudo netstat -apeen | grep discord unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0 We see that the path we need is: /run/user/1000/discord-ipc-0 On MacOS, Discord uses a Unix Socket for IPC. With Discord running, run this command: $ sudo netstat -apeen | grep discord unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0 We see that the path we need is: /run/user/1000/discord-ipc-0 Windows uses Named Pipes for IPC. These aren't easily iteratable without external software, like Pipetap. The syntax for a named pipe is like this: \\\\.\\pipe\\app_named_pipe_foo and Discord's names follow this pattern: \\\\.\\pipe\\discord-ipc-0 Where 0 increments for each different instance of Discord (official, canary, nightly, etc...). The default Discord pipe name is: discord-ipc-0 Pass IPC to Multi-Scrobbler​ After finding your IPC connection path you will need to make it accessible to Multi-Scrobbler. Discord on Linux Discord on MacOS Discord on Windows MS on Different Host MS on Same Host (Docker) MS on Same Host (Non-Docker) Insecure Communication This method of exposing Discord IPC is not secure. There is no authentication used for the traffic relayed to/from the opened TCP port. You should only use this method if you trust the network your machine is on. Additionally: Do use a firewall to limit source (IP) of incoming traffic to this TCP port Do not expose this port to the public internet Use socat to bidirectionally relay communication from Discord's unix socket to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login. $ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0 In your MS docker compose file add the host:port of the host running Discord/socat to DISCORD_IPC_LOCATIONS environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655 In your MS docker compose file, pass the path of Discord's unix socket as a volume and add this path to DISCORD_IPC_LOCATIONS in environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=/run/discord-ipc-0 volumes: - /run/user/1000/discord-ipc-0:/run/discord-ipc-0 No configuration is required. If MS does not automatically work for you then try the MS on Same Host (Docker) method using the DISCORD_IPC_LOCATIONS environment variable. MS on Different Host MS on Same Host (Docker) MS on Same Host (Non-Docker) Insecure Communication This method of exposing Discord IPC is not secure. There is no authentication used for the traffic relayed to/from the opened TCP port. You should only use this method if you trust the network your machine is on. Additionally: Do use a firewall to limit source (IP) of incoming traffic to this TCP port Do not expose this port to the public internet Use one of the methods below to setup socat on your macOS machine. socat installed natively Install socat using homebrew to use it as a native command on your host. Then, use socat to bidirectionally relay communication from Discord's unix socket to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login. $ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0 socat in Docker Use the socat container in combination with the Discord unix socket found earlier: docker-compose.yaml services: socat: image: alpine/socat ports: - \"6655:6655\" volumes: - /run/user/1000/discord-ipc-0:/run/discord-ipc-0 command: - '-v' - 'TCP-LISTEN:6655,reuseaddr,fork' - 'UNIX-CONNECT:/run/discord-ipc-0' In your MS docker compose file add the host:port of the host running Discord/socat to DISCORD_IPC_LOCATIONS environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655 In your MS docker compose file, pass the path of Discord's unix socket as a volume and add this path to DISCORD_IPC_LOCATIONS in environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=/discord-ipc-0 volumes: - /run/user/1000/discord-ipc-0:/run/discord-ipc-0 No configuration is required. If MS does not automatically work for you then try the MS on Same Host (Docker) method using the DISCORD_IPC_LOCATIONS environment variable. MS in Docker MS on Same Host (Non-Docker) note While it is possible to use named pipes directly in Docker this has not been tested and may only work for windows containers. If you are adventurous, try this out and if you can get it working please report your findings in an issue. warning This method is experimental and may be buggy and prone to crashes. If you are a Windows or Rust developer please consider helping improve the pipe proxy implementation. Insecure Communication This method of exposing Discord IPC is not secure. There is no authentication used for the traffic relayed to/from the opened TCP port. You should only use this method if you trust the network your machine is on. Additionally: Do use a firewall to limit source (IP) of incoming traffic to this TCP port Do not expose this port to the public internet Use pipeProxy to connect to the Discord named pipe and expose it on a TCP port. Download the latest pipeProxy.exe from the releases page. The host/ip should be the IP of the machine running discord. Run pipeProxy from the windows command line: pipeProxy.exe --pipe \"\\\\.\\pipe\\discord-ipc-0\" --tcp \"192.168.0.100:6655\" In your MS docker compose file add the host:port of the host running pipeProxy to DISCORD_IPC_LOCATIONS environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=192.168.0.100:6655 No configuration is required. If MS does not automatically work for you then try the MS in Docker method using the DISCORD_IPC_LOCATIONS environment variable.","s":"Discord Connection","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-connection","p":49},{"i":57,"t":"Setup is basically the same as using the instructions for Discord on Linux with MS on Same Host (Docker).","s":"Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":49},{"i":59,"t":"Detailed Explanation Add the kasmweb/discord service to your compose stack Mount the directory containing Discord's unix socket to a named volume Configure MS to use Discord's unix socket Mount the unix socket volume into MS's container Add ENV DISCORD_IPC_LOCATIONS to point to the mounted volume Use this example docker-compose.yaml to modify your existing multi-scrobbler docker-compose.yaml: Example docker-compose.yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler:latest environment: # ... - DISCORD_APPLICATION_ID=12345678 # add below line - DISCORD_IPC_LOCATIONS=/run/discord-ipc-0 volumes: # ... # add below line - kasm_run:/run # ... # .. add discord service below kasmcord: container_name: kasmcord image: kasmweb/discord:1.14.0 ports: # VNC port to use in web browser - 6901:6901 shm_size: 512m environment: # set a password for VNC access VNC_PW: hunter2 XDG_RUNTIME_DIR: /run/user/1000 volumes: - kasm_run:/run/user/1000 - kasm_config:/home/kasm-user/.config user: \"0\" entrypoint: sh -c \"chmod 700 /run/user/1000 && chown -R kasm-user:kasm-user /run/user/1000 && chown -R kasm-user:kasm-user /home/kasm-user/.config && su kasm-user -c '/dockerstartup/kasm_default_profile.sh /dockerstartup/vnc_startup.sh /dockerstartup/kasm_startup.sh'\" volumes: kasm_run: name: kasm_run kasm_config: name: kasm_config Then re-deploy your stack.","s":"1. Add Discord Service to Multi-Scrobbler Docker Compose Stack","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":49},{"i":61,"t":"Navigate in your browser to the IP/host Multi-Scrobbler/Discord are running on. Use the port set in the kasmcord service: # basic auth login # user: kasm_user # pass is what was set in env VNC_PW https://192.168.MY.HOST:6901 Login to Discord normally. After login is complete MS should connect automatically when a Now Playing event happens. If it does not or reports authentication failure then restart MS (but not Discord). If MS works then you are done and can move on to Optional Setup.","s":"2. Login to Discord","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":49},{"i":63,"t":"note Due to the limitations of the Discord local API the other listening activity detection and online status customizations found in Headless are not available for the Local integration.","s":"Optional Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#optional-setup","p":49},{"i":65,"t":"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible. The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below. Artwork URL Types​ External URLs Musicbrainz/Cover Art Achive MS Default MS can use external URLs for artwork. External URLs that are not from known music services are disabled by default. This is to preserve your privacy because Discord does not host images, it only links to them and the URL is visible to other users. Why Should I Care? There are some scenarios where you may not want your artwork URLs to be visible, for example: A Source may be accessible only on your LAN (Jellyfin at http://192.168.0.101) A Source may be internet-facing but you do not want to expose this information to discord/other users A Source may be internet-facing but requires authentication to view the image MS will use your artwork URLs only if: artwork url is from a known music service/Cover Art Archive or artwork url starts with https and artwork (DISCORD_ARTWORK) is true => always uses the url a list of custom domains keywords an external artwork url should contain EX ENV => DISCORD_ARTWORK=mycdn,jellyfin File Config => \"artwork\": [\"mycdn\",\"jellyfin\"] Examples None of the below URLs will ever be used because they are not https http://foobar.com/cool.jpg <-- NOT allowed, not http http://192.168.0.112/fun.png <-- NOT allowed, not http When DISCORD_ARTWORK is not set: https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service https://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service https://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set https://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set Setting DISCORD_ARTWORK=true https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- allowed, is https https://anything.com/neat.jpg <-- allowed, is https Setting DISCORD_ARTWORK=mycdn,jellyfin https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- NOT allowed, is https but does not contain \"mycdn\" or \"jellyfin\" https://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains \"jellyfin\" MS can try to use Cover Art Archive to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you. MS will try to use Cover Art Archive if: The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an External URL condition and the scrobble data contains a Musicbrainz Release (Album) MBID Basically, if MS would normally use the MS Default art, it will first try to use Cover Art Archive if the scrobble has a Release MBID. Some Source, like Jellyfin and Plex, can automatically provide this ID if the music is \"matched\" in your library. For all others, you can configure MS to use the Musicbrainz Stage for Discord to try to get this MBID. When these conditions are true: Cannot use an External URL and Cannot get album art from Cover Art Archive and Play does not contain artwork information (no artwork shown in dashboard) The status artwork will use a default URL instead of your artwork URL. Without any other configuration, the default URL is an icon from the multi-scrobbler repository: This default image can be customized: ENV Config => DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png File Config => \"artworkDefaultUrl\": \"https://cooldomain.com/art.png\" Remember, this URL need to be accessible on the public internet.","s":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#artwork","p":49},{"i":67,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description DISCORD_ID string A globally unique ID EX myComponentId DISCORD_NAME string Value of DISCORD_ID A vanity name EX My Cool Component DISCORD_APPLICATION_ID string Application ID DISCORD_IPC_LOCATIONS string A commera-separated list of host:port network locations or file paths to unix socket for Discord DISCORD_ARTWORK boolean A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains DISCORD_ARTWORK_DEFAULT_URL string or boolean A URL of an image to use as a fallback if the album art URL cannot be used. Or false to use discord's default. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a discord type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client discord configs will validate correctly in the editor but both source and client discord configs are allowed in the real CONFIG/discord.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/discord.json [ { \"name\": \"Desktop\", \"enable\": true, \"id\": \"myDiscordLocal\", \"data\": { \"applicationId\": \"8190211179716453570\", \"ipcLocations\": [ \"192.168.0.105:6655\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the discord type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Desktop\", \"enable\": true, \"id\": \"myDiscordLocal\", \"data\": { \"applicationId\": \"8190211179716453570\", \"ipcLocations\": [ \"192.168.0.105:6655\" ] }, \"type\": \"discord\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#configuration","p":49},{"i":69,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler. This integration is headless, it does not depend on any specific Discord application to be running. tip Check the main Discord docs page for a comparison between App and Headless. How MS Uses Discord API Multi-scrobbler does its utmost to implement, to-spec, Gateway API communication and respect usage. It requires no permissions and reads no data other than monitoring what other user sessions are active. Aside from the on-paper violation of using a user token programmatically (on your behalf), there is no misuse of the API to achieve rich presence. Additionally, MS uses the state of non-MS sessions to conservatively update presence. By default it will not conflict with any other official presence activities and is only used when you are actually active on a device. REQUIRED Interaction after Starting Multi-Scrobbler Every time multi-scrobbler is started a discord session update needs to be triggered so that MS can capture the signals it uses to determine if presence can be updated. This only needs to be once, after starting multi-scrobbler. But it does need to be every time multi-scrobbler is (re)started. Without these signals MS will not update presence. This session update can happen automatically after some time so you may not need to do anything. If you want to force the update then do one of the following: Open discord on a device it was not recently active on Exit discord on an active device Change your status (online, idle, etc...) Set a custom status Cause a presence update with a different app (listening to..., playing..., etc.)","s":"Discord (Headless)","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"","p":68},{"i":72,"t":"You must provide a Discord User Token for your account in order to authenticate with Discord. User Token usage violates Discord TOS This functionality requires you to use your own Discord User Token in a way that is against Discord's policies/terms of service. If you use this scrobbler you do so at your risk. There is no precedent for Discord punishing users who use their own token for non-abuse/spam reasons but there is also no guarantee this lack of enforcement will continue. Refer to the How MS Uses Discord API section above to gauge whether this risk is acceptable to you. User Token is a Sensitive Credential Treat your User Token like a login credential. Anyone who has your token can access Discord as you. When finding instructions for obtaining this token only run commands, or follow steps, that you can understand and trust. Do not run commands you do not understand. Never give your token to someone else. No instructions will be provided for obtaining a User Token because it is against Discord's policies to use it. Instead, you can search online for \"how to obtain discord user token\".","s":"User Token","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#user-token","p":68},{"i":75,"t":"MS uses several signals from your \"real\" Discord sessions to determine if it should update presence. The default configuration is conservative to ensure that MS does not conflict with other apps using presence. Additionally, it only updates if a \"real\" user device is active on discord. TLDR Without any additional configuration, MS will only update presence if: you have discord open on a real device your status is either: online, idle, or dnd (not invisible) no other apps are broadcasting listening activities (listening to spotify, etc...) Online Status​ Configure if MS is allowed to update presence based on your online status. If this setting is not defined MS will only update if your status is online, idle, or dnd. Allowed Values: online idle dnd invisible Example Only allow presence updating when all of your \"real\" sessions are either online or idle. In File/AIO: [ { \"name\": \"MS\", \"enable\": true, \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\", \"statusOverrideAllow\": [\"online\", \"idle\"] } } ] In ENV: DISCORD_STATUS_OVERRIDE_ALLOW=online,idle Other Listening Activities​ Without any additional configuration, MS will not set Rich Presence if other apps are broadcasting listening activities EX \"Listening to Spotify\". What about other activity types? Discord uses an undocumented activity type priority to determine what activity is shown \"first\" for your profile. The Listening activity type has the lowest priority. This means that if you start any other type of activity (streaming, watching, competing, etc...) it will take precedence over MS's listening activity. Your listening activity will still be visible by clicking into your full profile. Configure the names of other listening activities that MS is allowed to broadcast at the same time as. Example You want to allow MS to update presence even if Spotify is also broadcasting a listening activity. In File/AIO: [ { \"name\": \"MS\", \"enable\": true, \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\", \"listeningActivityAllow\": [\"spotify\"] } } ] In ENV: DISCORD_LISTENING_ACTIVITY_ALLOW=spotify","s":"Configure When Presence Is Used","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configure-when-presence-is-used","p":68},{"i":77,"t":"Creating a Discord App enables you to use custom album cover art and secondary status images for more links. Creating an App is free and simple, it is recommended you do this to get the most functionality from Rich Presence. Create An Application Go to the Discord Developer Portal Click on \"New Application\" and give it a name Copy the Application Id (Client Id) shown after creation Add this Id to your Multi-Scrobbler config Env Config => DISCORD_APPLICATION_ID=12345678 File Config => \"applicationId\": \"12345678\"","s":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#discord-application","p":68},{"i":79,"t":"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible. note If no Application Id is configured the status art will always be the Discord Default. The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below. Artwork URL Types​ External URLs Musicbrainz/Cover Art Achive MS Default Discord Default When Application Id is configured MS can use external URLs for artwork. External URLs that are not from known music services are disabled by default. This is to preserve your privacy because Discord does not host images, it only links to them and the URL is visible to other users. Why Should I Care? There are some scenarios where you may not want your artwork URLs to be visible, for example: A Source may be accessible only on your LAN (Jellyfin at http://192.168.0.101) A Source may be internet-facing but you do not want to expose this information to discord/other users A Source may be internet-facing but requires authentication to view the image MS will use your artwork URLs only if: artwork url is from a known music service/Cover Art Archive or artwork url starts with https and artwork (DISCORD_ARTWORK) is true => always uses the url a list of custom domains keywords an external artwork url should contain EX ENV => DISCORD_ARTWORK=mycdn,jellyfin File Config => \"artwork\": [\"mycdn\",\"jellyfin\"] Examples None of the below URLs will ever be used because they are not https http://foobar.com/cool.jpg <-- NOT allowed, not http http://192.168.0.112/fun.png <-- NOT allowed, not http When DISCORD_ARTWORK is not set: https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service https://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service https://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set https://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set Setting DISCORD_ARTWORK=true https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- allowed, is https https://anything.com/neat.jpg <-- allowed, is https Setting DISCORD_ARTWORK=mycdn,jellyfin https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- NOT allowed, is https but does not contain \"mycdn\" or \"jellyfin\" https://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains \"jellyfin\" When Application Id is configured MS can try to use Cover Art Archive to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you. MS will try to use Cover Art Archive if: The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an External URL condition and the scrobble data contains a Musicbrainz Release (Album) MBID Basically, if MS would normally use the MS Default art, it will first try to use Cover Art Archive if the scrobble has a Release MBID. Some Source, like Jellyfin and Plex, can automatically provide this ID if the music is \"matched\" in your library. For all others, you can configure MS to use the Musicbrainz Stage for Discord to try to get this MBID. When Application Id is configured and these conditions are true: Cannot use an External URL and Cannot get album art from Cover Art Archive and Play does not contain artwork information (no artwork shown in dashboard) The status artwork will use a default URL instead of your artwork URL. Without any other configuration, the default URL is an icon from the multi-scrobbler repository: This default image can be customized: ENV Config => DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png File Config => \"artworkDefaultUrl\": \"https://cooldomain.com/art.png\" Remember, this URL need to be accessible on the public internet. When Application Id is not configured Discord will show its own image. No custom artwork can be used in this configuration. This is also the image Discord will display if the artwork URL cannot be fetched.","s":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#artwork","p":68},{"i":81,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description DISCORD_ID string A globally unique ID EX myComponentId DISCORD_NAME string Value of DISCORD_ID A vanity name EX My Cool Component DISCORD_TOKEN string User Token acquired from an active Discord sessions DISCORD_APPLICATION_ID string Application ID used to display album art DISCORD_ARTWORK boolean A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains DISCORD_ARTWORK_DEFAULT_URL string or boolean A URL of an image to use as a fallback if the album art URL cannot be used. Or false to use discord's default. DISCORD_STATUS_OVERRIDE_ALLOW string online,idle,dnd A comma-separated list of statuses are allowed to have presence. DISCORD_LISTENING_ACTIVITY_ALLOW string A commera-seperated list of listening activity names MS is allowed to broadcast presence at the same time as. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a discord type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client discord configs will validate correctly in the editor but both source and client discord configs are allowed in the real CONFIG/discord.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/discord.json [ { \"name\": \"Discord\", \"enable\": true, \"id\": \"myDiscordRemote\", \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the discord type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Discord\", \"enable\": true, \"id\": \"myDiscordRemote\", \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\" }, \"type\": \"discord\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configuration","p":68},{"i":83,"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 For Koito versions <=0.1.7, you must have the environment variable KOITO_ALLOWED_HOSTS set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. koito.mydomain.com.","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","h":"","p":82},{"i":85,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description KOITO_ID string A globally unique ID EX myComponentId KOITO_NAME string Value of KOITO_ID A vanity name EX My Cool Component KOITO_ENABLE boolean true Should this component be used? KOITO_URL string URL for the Koito server KOITO_TOKEN string User token for the user to scrobble for KOITO_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a koito type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a koito Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client koito configs will validate correctly in the editor but both source and client koito configs are allowed in the real CONFIG/koito.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a koito Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/koito.json [ { \"name\": \"Koito Client A\", \"id\": \"myKoitoClient\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the koito type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a koito Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a koito Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Koito Client A\", \"id\": \"myKoitoClient\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":82},{"i":87,"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) Limits for Old Scrobbles Last.fm will not accept scrobbles that are timestamped as older than 2 weeks from the current time. This is not officially documented but has been confirmed by multiple people/mods in the last.fm support forums: [1] [2] [3] Multi-scrobbler can queue scrobbles for you if the Last.fm service is unavailable, or if there is an issue with a specific scrobble. However, you are responsible for making sure these scrobbles are eventually sent to Last.fm (by retrying in the UI or retarting Last.fm client in UI) before the two week window has passed or else they will not be scrobblable at all unless the timestamp is changed. A future update to Multi-scrobbler will enable editing of unsent scrobble data and modifying the timestamp from the UI. If you have issues with specific scrobbles not being sent and retries/restarts do not fix it, please make sure to create a new issue in a timely manner so that it can be resolved before the window has passed. 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":86},{"i":89,"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":86},{"i":91,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LASTFM_ID string A globally unique ID EX myComponentId LASTFM_NAME string Value of LASTFM_ID A vanity name EX My Cool Component LASTFM_ENABLE boolean true Should this component be used? LASTFM_API_KEY string API Key generated from Last.fm/Libre.fm account LASTFM_SECRET string Secret generated from Last.fm/Libre.fm account LASTFM_REDIRECT_URI string http://localhost:9078/lastfm/callback Optional URI to use for callback. LASTFM_SESSION string Optional session id returned from a completed auth flow Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a lastfm type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a lastfm Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client lastfm configs will validate correctly in the editor but both source and client lastfm configs are allowed in the real CONFIG/lastfm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a lastfm Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/lastfm.json [ { \"name\": \"Foxx LFM Client\", \"id\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the lastfm type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Foxx LFM Client\", \"id\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":86},{"i":93,"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 website you will need an account. Or, you can run your own GNU FM instance using the source code. No API account, API Key, or Secret is currently 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":92},{"i":95,"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":92},{"i":97,"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":92},{"i":99,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LIBREFM_ID string A globally unique ID EX myComponentId LIBREFM_NAME string Value of LIBREFM_ID A vanity name EX My Cool Component LIBREFM_ENABLE boolean true Should this component be used? LIBREFM_API_KEY string Optional Secret for Libre.fm account LIBREFM_SECRET string Optional Secret for Libre.fm account LIBREFM_REDIRECT_URI string http://localhost:9078/librefm/callback Optional URI to use for callback. LIBREFM_SESSION string Optional session id returned from a completed auth flow LIBREFM_URLBASE string https://libre.fm/2.0/ (Optional) The host and path prefix for your Libre.fm instance Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a librefm type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a librefm Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client librefm configs will validate correctly in the editor but both source and client librefm configs are allowed in the real CONFIG/librefm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a librefm Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/librefm.json [ { \"name\": \"Foxx Libre Client\", \"id\": \"myLibreFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the librefm type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Foxx Libre Client\", \"id\": \"myLibreFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" }, \"type\": \"librefm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#configuration","p":92},{"i":101,"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":100},{"i":103,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MALOJA_ID string A globally unique ID EX myComponentId MALOJA_NAME string Value of MALOJA_ID A vanity name EX My Cool Component MALOJA_ENABLE boolean true Should this component be used? MALOJA_URL string URL for maloja server MALOJA_API_KEY string API Key for Maloja server Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a maloja type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a maloja Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client maloja configs will validate correctly in the editor but both source and client maloja configs are allowed in the real CONFIG/maloja.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a maloja Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/maloja.json [ { \"name\": \"Maloja Client\", \"id\": \"myMalojaClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the maloja type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Maloja Client\", \"id\": \"myMalojaClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":100},{"i":105,"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":104},{"i":107,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LZ_ID string A globally unique ID EX myComponentId LZ_NAME string Value of LZ_ID A vanity name EX My Cool Component LZ_ENABLE boolean true Should this component be used? LZ_URL string https://api.listenbrainz.org/ URL for the ListenBrainz server, if not using the default LZ_TOKEN string User token for the user to scrobble for LZ_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a listenbrainz type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a listenbrainz Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client listenbrainz configs will validate correctly in the editor but both source and client listenbrainz configs are allowed in the real CONFIG/listenbrainz.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a listenbrainz Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/listenbrainz.json [ { \"name\": \"Foxx LZ Client\", \"id\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the listenbrainz type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Foxx LZ Client\", \"id\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":104},{"i":109,"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 and your your Atmosphere Account. How does that work? Your Atmosphere Account consists of social data (it's just JSON) stored in a personal repository on a PDS (Personal Data Server), all of which is standardized under the AT Protocol. The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by indpendent entities so your data and experience not locked behind a walled garden. Although each layer can be implemented separately (you can self-host everything!), it is normally a simple process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a Bluesky, but there are other public account providers. When Multi-Scrobbler uses the AT Protocol... multi-scrobbler \"scrobbles\" (writes) 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 their 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":108},{"i":111,"t":"You will need an Atmosphere Account to use Rocksky. Navigate to rocksky.app and sign up/logn using your Atmosphere Account Then, navigate to the Access Tokens in the Rocksky settings dropdown, and create a new token","s":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":108},{"i":114,"t":"The handle used with multi-scrobbler should be your full Atmosphere Account 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. API Applications Deprecated In < 0.14.1, Multi-Scrobber used Rocksky's API Appication \"API Key\" for communication with a Listenbrainz-compatible API from Rocksky. Going forward, this should be replaced with the official guidance in the Setup section above: use an Access Token. This uses the native Rocksky API which has more functionality. If your configuration is using either (File/AIO) 'key': ... (ENV) ROCKSKY_KEY you should redo the Setup section and modify your configuration to use an Access Token instead. Keys are now deprecated and functionality for them will be removed in a future version of Multi-Scrobbler. ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description ROCKSKY_ID string A globally unique ID EX myComponentId ROCKSKY_NAME string Value of ROCKSKY_ID A vanity name EX My Cool Component ROCKSKY_ENABLE boolean true Should this component be used? ROCKSKY_KEY string API Key generated from API Applications in Rocksky for your account ROCKSKY_TOKEN string Access Token generated from https://rocksky.app/access-tokens in Rocksky for your account ROCKSKY_HANDLE string The fully-qualified handle for your ATPRoto/Bluesky account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a rocksky type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a rocksky Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client rocksky configs will validate correctly in the editor but both source and client rocksky configs are allowed in the real CONFIG/rocksky.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a rocksky Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/rocksky.json [ { \"id\": \"myRockskyClient\", \"name\": \"FoxxMD Rocksky Client\", \"configureAs\": \"client\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the rocksky type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"id\": \"myRockskyClient\", \"name\": \"FoxxMD Rocksky Client\", \"configureAs\": \"client\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] }","s":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":108},{"i":116,"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 browsing app for scrobbles stored in your Atmosphere Account. How does that work? Your Atmosphere Account consists of social data (it's just JSON) stored in a personal repository on a PDS (Personal Data Server), all of which is standardized under the AT Protocol. The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by indpendent entities so your data and experience not locked behind a walled garden. Although each layer can be implemented separately (you can self-host everything!), it is normally a simple process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a Bluesky, but there are other public account providers. When Multi-Scrobbler uses the AT Protocol... multi-scrobbler \"scrobbles\" (writes) 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 their 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 true production website, yet. To view your teal.fm scrobble data you can: use teal-relay-production.up.railway.app or teal-slice.wisp.place for a preview of teal.fm use yearinmusic.teal.fm or wrapped.baileytownsend.dev for wrapped-style stats of your teal.fm scrobbles use atproto.at to view the raw data (convenience URLs are generated in multi-scrobbler, per scrobble, for you to do this)","s":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"","p":115},{"i":118,"t":"note Multi-scrobbler will work with any Atmosphere Account, not just Bluesky. See Configuration below for provider-agnostic config. 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":115},{"i":121,"t":"The ATProto identifier used with multi-scrobbler should be either: A valid DID, starting with did:plc:... or did:web:... Your full Atmosphere Account 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 Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description TEALFM_ID string A globally unique ID EX myComponentId TEALFM_NAME string Value of TEALFM_ID A vanity name EX My Cool Component TEALFM_ENABLE boolean true Should this component be used? TEALFM_IDENTIFIER string Identify the account to login as TEALFM_APP_PW string The App Password you created for your account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a tealfm type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a tealfm Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client tealfm configs will validate correctly in the editor but both source and client tealfm configs are allowed in the real CONFIG/tealfm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a tealfm Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/tealfm.json [ { \"id\": \"myTealClient\", \"name\": \"Foxx Teal Client\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the tealfm type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"id\": \"myTealClient\", \"name\": \"Foxx Teal Client\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" }, \"type\": \"tealfm\" } ] }","s":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":115},{"i":123,"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":122},{"i":125,"t":"Name Networking Scrobble SOT Multi Device/User Scrobble Destination Thresholds Auto Monitoring Apple Music Active History ❌ ✅ ❌ ✅ 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 ❌ ✅ ❌ ✅ Sonos Active Activity ✅ ✅ ✅ ✅ Spotify Active Activity ✅ ✅ ✅ ✅ Subsonic-compatible APIs Active Activity ✅ ✅ ✅ ✅ teal.fm Active History ❌ ✅ ❌ ✅ WebScrobbler Ingress History ❌ ✅ ❌ ✅ VLC Active Activity ❌ ✅ ✅ ✅ Yamaha MusicCast Active Activity ❌ ✅ ✅ ✅ Yandex Music Active Activity ✅ ✅ ✅ Youtube Music Active History ❌ ✅ ❌ ✅","s":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":122},{"i":128,"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":122},{"i":130,"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":122},{"i":132,"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":122},{"i":134,"t":"From Listening History​ For Listening History Source-Of-Truth based Sources, like Listenbrainz and Last.fm, newely discovered history is immediately forwarded to relevant Clients. From Ingress​ For Ingress communication based Sources, like Listenbrainz (Endpoint) and Webscrobbler, the client sending data to Multi-Scrobbler is what determines when activity is scrobbled. This means that it up to the behavior and implementation of whatever application you point at these Source endpoints: when the client sends \"this is scrobbled\", MS immediately forwards it to relevant Clients. From Listening Activity​ For Sources that use Active communication with Listening Activity as the Source-Of-Truth -- like Jellyfin, Plex, Spotify, Subsonic, etc... -- Multi-Scrobbler waits until the track changes or the active player becomes stale/disappears before determining if the activity should be scrobbled. This allows MS to record how long you listened to the track for as well as more accurately determine if Scrobble Thresholds have been met. Scrobble Thresholds​ A Source that monitors Listening Activity 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":"When Is Activity Scrobbled?","u":"/multi-scrobbler/configuration/sources/","h":"#when-is-activity-scrobbled","p":122},{"i":136,"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 monitor activity 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 monitor activity. This action can be taken on the Web Dashboard by clicking the link next to Monitoring 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 \"autoMonitor\": true } }","s":"Monitoring","u":"/multi-scrobbler/configuration/sources/","h":"#monitoring","p":122},{"i":138,"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","s":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"","p":137},{"i":140,"t":"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 Auto Monitoring Behavior This Source supports toggling monitoring on or off manually. This action can be taken on the Web Dashboard by clicking the link next to Monitoring found in each Source's status card. Additionally, the default monitoring behavior 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 monitor (unless manually invoked) // set to false to never monitor (unless manually invoked) \"autoMonitor\": true } }} When autoMonitor is not explicitly set, Multi-scrobbler will set the default monitoring 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 monitor based on when these conditions are met. If neither is configured automatic monitoring defaults to off and you should either manually initiate it or explicitly set the default behavior.","s":"URL","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#url","p":137},{"i":142,"t":"Station Identifier​ The station identifier multi-scrobbler uses (ENV AZURA_STATION or station in File/AIO config) needs to be the URL Stub or shortcode of the Azuracast station, not its display name. Use of the methods below to find an apprioriate station identifier. URL Stub Shortcode The URL Stub is the value used in the URL to access the station EX https://azura.mydomain.com/public/my-cool-station ^^^^ url stub ^^ Use my-cool-station as the station identifier. The shortcode can be found in the raw JSON response for your station. Navigate to this URL in your browser: https://azura.mydomain.com/api/stations Find your station in the returned data (by name) and then locate the value of the shortcode property in that object. Example [ { \"id\": 1, \"name\": \"My Cool Station\", \"shortcode\": \"my-cool-station\", \"description\": \"Re-broadcasts of my cool music\", \"frontend\": \"icecast\", \"backend\": \"liquidsoap\", ... Use my-cool-station as the station identifier. Station Access​ Multi-Scrobbler does not use authentication to communicate with Azuracast. Your station will likely need some form of Public Pages in order for you to monitor it. In your station's Edit Station Settings -> Public Pages make sure that at least one of these is enabled: Enable Public Pages Enable Public APIs note For users who aren't administrators of Azuracast: if you can access the station using https://azura.mydomain.com/public/xxxxxx then it is public.","s":"Station","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#station","p":137},{"i":144,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description AZURA_ID string A globally unique ID EX myComponentId AZURA_NAME string Value of AZURA_ID A vanity name EX My Cool Component AZURA_ENABLE boolean true Should this component be used? AZURA_STATION string The specific station to monitor AZURA_URL string Base URL of the Azuracast instance AZURA_KEY string API Key used to access data about private streams AZURA_LISTENERS_NUM string AZURA_LIVE boolean Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a azuracast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a azuracast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source azuracast configs will validate correctly in the editor but both source and client azuracast configs are allowed in the real CONFIG/azuracast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a azuracast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/azuracast.json [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"Cool Station\", \"id\": \"myAzura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the azuracast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a azuracast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a azuracast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"Cool Station\", \"id\": \"myAzura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":137},{"i":147,"t":"On this page you find contrived, complex usecases for multi-scrobbler that provide examples of equivalent configuration types to fulfill that usecase. These example are useful for: getting an idea of what you can do with Multi-scrobbler using these examples as a starting point for your own configuration providing an example of the same configuration across different configuration types tip More common, straightforward scenarios can be found in the quickstart guide.","s":"What's This?","u":"/multi-scrobbler/configuration/kitchensink/","h":"#whats-this","p":145},{"i":150,"t":"You are the only user of Multi-scrobbler. You have many Sources you listen to and want to scrobble them to multiple services. You want to scrobble from... A Spotify account A Navidrome instance that you want to use with the built-in listenbrainz scrobble function A shared Plex instance that you want to scrobble only from a specific library named oldies You want to scrobble to... Your decades-old Last.fm account A Koito server for backup Configuration ENV File AIO Using ENV Config compose.yaml 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 # spotify - SPOTIFY_ID=foxxSpotify - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43 - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback # navidrome listenbrainz endpoint - LZE_ID=myLzNavidrome - LZE_TOKEN=myToken # plex - PLEX_ID=foxxPlex - PLEX_URL=192.168.0.233:32400 - PLEX_TOKEN=JtRnwQWD__XMJF8sT3jc - PLEX_USERS_ALLOW=foxx - PLEX_LIBRARIES_ALLOW=oldies # lastfm - LASTFM_ID=myLFM - LASTFM_API_KEY=myApiKey - LASTFM_SECRET=mySecret - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback # koito - KOITO_ID=foxxKoi - KOITO_TOKEN=029b081ba-9156-4pe7-88e5-3be671f5ea2b - KOITO_USER=admin - KOITO_URL=http://192.168.0.100:4110 volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped Using File Config CONFIG_DIR/spotify.json [ { \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] CONFIG_DIR/endpointlz.json [ { \"id\": \"myLzNavidrome\", \"name\": \"LZ for Navidrome\", \"data\": { \"token\": \"myToken\" } } ] CONFIG_DIR/plex.json [ { \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"foxx\"], \"librariesAllow\": [\"oldies\"], } } ] CONFIG_DIR/lastfm.json [ { \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] CONFIG_DIR/koito.json [ { \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Using AIO Config CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"spotify\", \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } }, { \"type\": \"endpointlz\", \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"data\": { \"token\": \"myToken\" } }, { \"type\": \"plex\", \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"foxx\"], \"librariesAllow\": [\"oldies\"] } } ], \"clients\": [ { \"type\": \"lastfm\", \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"type\": \"koito\", \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] }","s":"Multiple Sources to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-sources-clients","p":145},{"i":152,"t":"ENV Config Not Possible In this usescase there is more than one of the same type of Source/Client. This means only File or AIO configuration types are possible because ENV configuration only supports one Source/Client per type. You want to scrobble plays for yourself (Foxx), Fred, and Mary: The three of you want to scrobble from... Fred and Mary each have their own Jellyfin servers You have a Plex server The three of you want to scrobble to... Fred and Mary each have their own Last.fm accounts You have a Koito server Configuration File AIO Using File Config CONFIG_DIR/jellyin.json [ { \"id\": \"fredJf\", \"name\": \"Freds Jellyfin\", \"clients\": [\"fredLFM\"], \"data\": { \"url\": \"https://jellyfin.fred.com\", \"user\": \"Fred\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } }, { \"id\": \"maryJf\", \"name\": \"Marys Jellyfin\", \"clients\": [\"maryLFM\"], \"data\": { \"url\": \"https://jellyfin.mary.com\", \"user\": \"Mary\", \"apiKey\": \"26fe9c5dc6374542adc4f4d5e8352838\" } } ] CONFIG_DIR/plex.json [ { \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"clients\": [\"foxxKoi\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\" } } ] CONFIG_DIR/lastfm.json [ { \"id\": \"maryLFM\", \"name\": \"Marys Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"id\": \"fredLFM\", \"name\": \"Freds Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"fredApiKey\", \"secret\": \"fredSecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] CONFIG_DIR/koito.json [ { \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Using AIO Config CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"jellyfin\", \"id\": \"fredJf\", \"name\": \"Freds Jellyfin\", \"clients\": [ \"fredLFM\" ], \"data\": { \"url\": \"https://jellyfin.fred.com\", \"user\": \"Fred\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } }, { \"type\": \"jellyfin\", \"id\": \"maryJf\", \"name\": \"Marys Jellyfin\", \"clients\": [ \"maryLFM\" ], \"data\": { \"url\": \"https://jellyfin.mary.com\", \"user\": \"Mary\", \"apiKey\": \"26fe9c5dc6374542adc4f4d5e8352838\" } }, { \"type\": \"plex\", \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"clients\": [ \"foxxKoi\" ], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [ \"foxx\" ] } } ], \"clients\": [ { \"type\": \"lastfm\", \"id\": \"maryLFM\", \"name\": \"Marys Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"type\": \"lastfm\", \"id\": \"fredLFM\", \"name\": \"Freds Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"fredApiKey\", \"secret\": \"fredSecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"type\": \"koito\", \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] }","s":"Scrobble for Multiple People to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-persons-services","p":145},{"i":154,"t":"You have multiple Sources of music but your personal, on-filesystem music collection is not well organized. You want to use the Musicbrainz Transformer to fix any scrobbles that use Navidrome, where your personal collection is located, so that the scrobble artists/album/title are all standardized. You want to scrobble from... A Spotify account A Navidrome instance that you want to use with the built-in listenbrainz scrobble function Plays from this Source should be fixed by Musicbrainz before going to your scrobble Clients You want to scrobble to... A Last.fm account Configuration ENV File AIO Using ENV Config compose.yaml 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 # required setup for musicbrainz - MB_CONTACT=contact@mydomain.com # a real email # searches with sensible release sorting with the searchOrder # isrc => basic => artist (native mode) - MB_PRESETS=default,sensible,native # spotify - SPOTIFY_ID=foxxSpotify - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43 - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback # navidrome listenbrainz endpoint - LZE_ID=myLzNavidrome - LZE_TOKEN=myToken # applies musicbrainz Stage to preTransform of navidrome source - LZE_TRANSFORMS=musicbrainz # lastfm - LASTFM_ID=myLFM - LASTFM_API_KEY=myApiKey - LASTFM_SECRET=mySecret - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped Using File Config For non-ENV config, Musicbrainz Transformer must be setup using the AIO Config config.json file. This configuration uses the sensible defaults in the defaults property. This is a suggestion and can be removed if not desired. CONFIG_DIR/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\" ] } } ] } CONFIG_DIR/spotify.json [ { \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] CONFIG_DIR/endpointlz.json [ { \"id\": \"myLzNavidrome\", \"name\": \"LZ for Navidrome\", \"data\": { \"token\": \"myToken\" }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ] CONFIG_DIR/lastfm.json [ { \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Using AIO Config This configuration uses the sensible defaults in the defaults property. This is a suggestion and can be removed if not desired. CONFIG_DIR/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\" ] } } ], \"sources\": [ { \"type\": \"spotify\", \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } }, { \"type\": \"endpointlz\", \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"data\": { \"token\": \"myToken\" }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ], \"clients\": [ { \"type\": \"lastfm\", \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] }","s":"Use Musicbrainz to Fix Scrobbles from Navidrome","u":"/multi-scrobbler/configuration/kitchensink/","h":"#use-musicbrainz-to-fix-scrobbles-from-navidrome","p":145},{"i":156,"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":155},{"i":158,"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":155},{"i":160,"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":155},{"i":162,"t":"Multi-scrobbler can monitor listening history for accounts linked to a Deezer Family Account. Instructions Start multi-scrobbler using the ARL for the main account. In the logs look for Linked Accounts associated with the Deezer Source. It will look something like this: VERBOSE: [App] [Sources] [Deezer - MyDeezer] Linked Accounts: Name: Joe | ID: 166276334 | Private?: Yes Name: Mary | ID: 48475231 | Private?: Yes Name: FoxxMD | ID: 896225281 | Private?: No Name: Cool Guy | ID: 128522478 | Private?: Yes The Account ID you want to monitor should be set: ENV File or AIO Set in your docker compose environment section: - DEEZER_ACCOUNT_ID=896225281 Add an accountId property to the data section [ { \"name\": \"DeezerARL\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30D...\", \"accountId\": \"896225281\" } } ] Restart multi-scrobbler to start monitoring that account. Restrictions Deezer may not return the correct listening history under these circumstances: The ARL used is not for the main account If you can get an ARL specifically for the linked account (login as the linked account), use that instead of family accountId The ARL account is private The linked account to be monitored ( using accountId) is private","s":"Family account","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#family-account","p":155},{"i":164,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description DEEZER_ID string A globally unique ID EX myComponentId DEEZER_NAME string Value of DEEZER_ID A vanity name EX My Cool Component DEEZER_ENABLE boolean true Should this component be used? DEEZER_ARL string ARL retrieved from Deezer response header DEEZER_ACCOUNT_ID string The ID (USER_ID) of the linked account to monitor. DEEZER_USER_AGENT string Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0 User agent Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a deezer type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a deezer Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source deezer configs will validate correctly in the editor but both source and client deezer configs are allowed in the real CONFIG/deezer.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a deezer Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/deezer.json [ { \"name\": \"Family Account\", \"id\": \"myDeezerId\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the deezer type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a deezer Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a deezer Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Family Account\", \"id\": \"myDeezerId\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\" }, \"type\": \"deezer\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":155},{"i":166,"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":165},{"i":168,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. note Manually configuring cast device connections is only available through file-based config. Environmental Variable Type Default Description CC_ID string A globally unique ID EX myComponentId CC_NAME string Value of CC_ID A vanity name EX My Cool Component CC_ENABLE boolean true Should this component be used? CC_BLACKLIST_DEVICES string DO NOT scrobble from any cast devices on this comma-delimited list that START WITH these values CC_WHITELIST_DEVICES string ONLY scrobble from any cast device on this comma-delimited list that START WITH these values CC_BLACKLIST_APPS string DO NOT scrobble from any application on this comma-delimited list that START WITH these values CC_WHITELIST_APPS string ONLY scrobble from any application on this comma-delimited list that START WITH these values Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a chromecast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a chromecast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source chromecast configs will validate correctly in the editor but both source and client chromecast configs are allowed in the real CONFIG/chromecast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a chromecast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/chromecast.json [ { \"name\": \"My Cast\", \"id\": \"myCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the chromecast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a chromecast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a chromecast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"My Cast\", \"id\": \"myCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] }, \"type\": \"chromecast\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":165},{"i":170,"t":"Multi-scrobbler's flexibility in configuration allows you to build some complex pipelines for scrobbling but it can also be a footgun for duplicating scrobbles.","s":"Duplicate Scrobble Guidance","u":"/multi-scrobbler/configuration/duplicates/","h":"","p":169},{"i":172,"t":"Multi-scrobbler uses multiple techniques for evaluating the similarity of text in scrobbles against existing data. These techniques are used on all text from a scrobble (title, artist, album...): Character and string normalization Symbols and multiple whitespaces are removed. All characters are converted to lowercase. Non ascii characters are converted to their ascii counterparts. this string! is the. same => this string is the same this string is the same => this string is the same ThIs STRING iS THe SAMe => this string is the same Dina Ögon => Dina Ogon Nanã => Nana Word-order invariant text similarity Strings with multiple words (tokens) are re-arranged so that tokens are ordered to be as close to other, similar tokens are possible: Example 1 String A: there change is => there change is String B: there is change => there change is Example 2 String A: you, doin hwat are => you doin hwat are String B: what are you doing => you doing what are Then, the strings are independently compared using Levenshtein Distance and Dice's Coefficient. The algorithm that gives the highest score for similarity is used so that matching is aggressive. For Artists, Multi-scrobbler attempts to extract unique Artists from common patterns in single-string artist values and track titles. Matching Common Artist Patterns Common joiners and patterns are detected in artist/track strings and the artists are extracted. Example of common joiners are: ft. feat vs. etc... Example 1 Melendi, Ryan Lewis, The Righteous Brothers (featuring Joan Jett & The Blackhearts, Robin Schulz) becomes Melendi, Ryan Lewis, The Righteous Brothers, Joan Jett, The Blackhearts, Robin Schulz Example 2 Childish Gambino - 12.38 (feat. 21 Savage, Ink & Kadhja Bonet) becomes Childish Gambino, 21 Savage, Ink, Kadhja Bonet - 12.38 note MS uses \"smart\" heuristics to prevent artists with actual punctuation (Tyler, The Creator) from accidentally being separated The extraction examples above are done only for matching other scrobble data (which is also parsed like the above), the resulting scrobble data is never transformed unless the user explicitly configures it via a native transform The timestamps for Scrobbles are compared at different levels of granularity based on where they originate from. Temporally Comparing Scrobbles Timestamp closeness for two scrobbles can be classified in one of these states: Exact Timestamps differ by 1 seconds or less. Close Timestamps differ by less than the known granularity of the Source they are from. For most Sources (and all Clients) this is 10 seconds or less. For some sources (subsonic) the granularity is 60 seconds because they only report \"now playing\" changes every 60 seconds. During If the Play was monitoring in real-time by Multi-scrobbler then it knows the time range during which the Play was listened to. If an existing scrobble with similar artist/track/album has a timestamp that occurred during the known listening time then it is classified as during. Fuzzy If the timestamp occurs within a few seconds +/- of (existing scrobble + track duration) then, potentially, the Source timestamped the existing scrobble at the end of when the user listened to it, rather than when the user started listening to it. This is common for Spotify plays. Each of the above classification results in a different score that is roughly descending from the order given above. Exact score is based on the Souce of the scrobble and if it was monitored in real-time by Multi-Scrobbler. Finally, all of the above comparison/normalization techniques are combined when comparing a \"new\" Play/Scrobble against existing data. Each comparison is given a weighted score. If the score is above the match threshold then it is marked as a duplicated. Match Scoring Example Frédéric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 <-- New scrobble Frédéric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 <-- Existing scrobble from client After comparing against all existing scrobbles from the client, in a timerange around the new scrobble, MS finds a match and logs the match along with the score breakdown of the consistuent parts: Source: Frédéric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 (S) Closest Scrobble: Frédéric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 (S) Artist: (0.30 + Whole Match Bonus 0.52) * (0.3 + Whole Match Bonus 0.05) = 0.29 Title: 1.00 * 0.4 = 0.40 Time: (Close) 1 * 0.5 = 0.50 Time Detail => Existing: 13:01:48-04:00 - Candidate: 13:01:51-04:00 | Temporal Sameness: Close | Play Diff: 3s (Needed <10s) | Range Comparison N/A Score 1.19 => Matched! All of the above techniques and scoring gives Multi-scrobbler a very good chance of detecting duplicate scrobbles, regardless of where they were originally from. Of Multi-Scrobbler's 400+ unit tests, 70+ are related to testing scoring, artist extraction, and fuzzing string normalization/simiarlity. The dupe detection is so good that it is virtually gauranteed for most configurations and is used for backlogging missed scrobbles for Sources that support fetching history. However, it's not possible to gaurantee this for all possible Multi-scrobbler configurations. See the below sections to learn more.","s":"How Duplicates Are Detected","u":"/multi-scrobbler/configuration/duplicates/","h":"#how-duplicates-are-detected","p":169},{"i":174,"t":"Any Source/Client configuration where there is only one Source and one Client and they are not the same service/account Any Source/Client configuration where scrobbles only flow in one direction IE you do not have a Last.fm Client Account A that is also a Last.fm Source Account A tip The majority of simple Multi-scrobbler configurations fall into these categories. If your workflow is straightforward you do not need to worry about duplicates at all. Multi-scrobbler can handle recieving the same data from a Source multiple times. This is fine because the data is always the same and always unique to each Source. Since MS scrobbled the data to your clients you can be pretty confident that the same cleanup/matching process for that data will result in an indentical/similar match to the existing scrobble. IE Same inputs in -> same inputs out. Even this scenario with multiple, mixed Sources is OK: Because the scrobbles coming from each Source are independent of each other. And they end up in Clients that are not also used as Sources. tip This is a common scenario when scrobbles are backlogged from a Source IE on startup MS fetches the last 50 Plays from Spotify/Lastfm/Listenbrainz.","s":"Configurations Where Duplicates DO NOT Occur","u":"/multi-scrobbler/configuration/duplicates/","h":"#valid-configs","p":169},{"i":177,"t":"In this scenario your device using Spotify is configured in MS as a Spotify Source but it also is scrobbling to Last.fm (via Pano Scrobbler, as an example). ❌ Time Race Condition: Potentially, the scrobbles arrive in Multi-scrobbler at exactly the same time. There are no existing scrobbles in Koito to check against, yet. So Multi-scrobbler scrobbles both to Koito, resulting in duplicate scrobbles. ❌ Different Scrobble Data: Pano Scrobbler, or Last.fm, may modify the scrobble data. When MS recieves the scrobble from Last.fm it may be just different enough that it does not get detected as a duplicate.","s":"Upstream Scrobbles Sent to Multiple Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#upstream-scrobbles-sent-to-multiple-sources","p":169},{"i":179,"t":"In this scenario, you have a Client that is also a Source and that Source is feeding scrobbles to a different Client that receives scrobbles from everywhere (or has some overlap with the original Client). ❌ Different Scrobble Data: Last.fm may modify the scrobble data. When MS recieves the scrobble from Last.fm it may be just different enough that it does not get detected as a duplicate. ❌ Consistency Issues: If the Koito Client has a backed up queue or is not currently scrobbling (imagine it was Last.fm or Listenbrainz, and they had upstream availability issues), then there is no existing scrobble yet and nothing to match against.","s":"Sources and Clients are Dependent","u":"/multi-scrobbler/configuration/duplicates/","h":"#dependent-source-client","p":169},{"i":182,"t":"Use a configuration mentioned in Configurations Where Duplicates DO NOT Occur: make sure all of your Sources are independent. The activity/scrobbles from each Source do not have any upstream duplicates of activity.","s":"Independent Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#independent-sources","p":169},{"i":184,"t":"Imagine you have a scenario where a device/player can only scrobble to Last.fm. But you want to use MS for all other devices/sources and still have all your scrobbles end up in your \"main\" Last.fm account for social reasons/stats. Instead of using the same Last.fm account for all activity and potentially having dependent client/sources, create an additional last.fm account that is used only for the device that needs it. This ensures the scrobbles from that device are isolated from the main account and do not prevent duplicates, so you can continue to use the main account as an MS Client:","s":"Alternative Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#alternative-sources","p":169},{"i":186,"t":"In Multi-scrobbler, by default, all Sources scrobble to all Clients. Using Limit Scrobble Destinations configuration can ensure that your dependent Source/Clients only scrobble to destinations where the scrobbles won't be duplicated. And/or limit other Sources to not scrobble to dependent Sources/Clients. Here is an example where all Sources only scrobble to a dependent Last.fm Client, and then the dependent Last.fm Source only scrobbles to a \"mirror-only\" (backup) Koito Client:","s":"Mirror-Only Clients or Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/duplicates/","h":"#isolated-sources","p":169},{"i":188,"t":"If using one of the above solutions is not possible you can also try to aggressively normalize all scrobble data using the Musicbrainz transform stage. In this scenario you still have dependent Source/Clients that are not isolated but you can potentially improve duplicate detection by first using a transform stage to match scrobbles against the Musibrainz database and normalize their track/artist/album data. warning There is no gaurantee this will work but it is better than nothing. You should attempt to re-configure MS to use any of the other solutions before using this one.","s":"Normalize All Scrobbles","u":"/multi-scrobbler/configuration/duplicates/","h":"#normalize-all-scrobbles","p":169},{"i":190,"t":"Last.fm will happily accept almost any scrobble data you throw at it. It can then decide, opaquely, to match or modify that scrobble to some more \"official\" data it has server-side. This could be modifying the artists, title, or album sent in the scrobble. It can also mean modifying the mbid (unique identifier) or adding what it thinks is the correct one. There is nothing in the scrobble history API response from Last.fm that identifies it has done any of this. And it's not super great at being right about these modifications. What this means for you, the user, is that this is very plausible scenario: You scrobble Artist Foo, Artist Bar - My Cool Track to Last.fm via Pano Scrobbler (outside of Multi-scrobbler) Last.fm modifies the data to The Artist Foo - My Cool Track ft. Artist Bar (Album Version) You also scrobble Artist Foo, Artist Bar - My Cool Track to Multi-scrobbler via Pano LFM endpoint Source MS forwards this to Koito Client as-is Soon after, MS polls your Last.fm Source for new scrobbles and finds The Artist Foo - My Cool Track ft. Artist Bar (Album Version) It queries Koito to see if this was scrobbled It sees that a scrobble did happen at almost the same time BUT the track titles and artist strings are just different enough that it decides it's not a duplicate MS forwards the scrobble to Koito and you now have a duplicate This behavior is unique to Last.fm. It's truly the worst out of all the scrobbler services in terms of preserving your data as-is, or providing a unqiue identifier for your data.","s":"The Last.fm Problem","u":"/multi-scrobbler/configuration/duplicates/","h":"#lastfm","p":169},{"i":192,"t":"This Source monitors your Apple Music listening history via the official Apple Music API and scrobbles new activity to your configured Clients. Because of how the Apple Music API works, Multi-Scrobbler (MS) requires two different tokens to function: a Media User Token (identifies your personal account) and an Authentication Token (authorizes API access).","s":"Apple Music","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"","p":191},{"i":194,"t":"The mediaUserToken is required to access your recently played history. You can extract it directly from the Apple Music web app: Visit music.apple.com in your browser and log in. Open your browser's Developer Tools (usually F12 or ⌘ + ⌥ + I). Navigate to the Application tab (Chrome/Edge) or Storage tab (Safari/Firefox). Expand Cookies in the left sidebar and select https://music.apple.com. Find the cookie named media-user-token and copy its value (it typically starts with 0.). Token Expiry The mediaUserToken will eventually expire. If Multi-Scrobbler begins throwing authentication errors in the logs, simply repeat these steps to obtain and configure a fresh token.","s":"1. Getting a Media User Token","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#1-getting-a-media-user-token","p":191},{"i":196,"t":"To authorize API access, Multi-Scrobbler requires an Authentication Token (JWT). Because the official Apple Music API is designed for developers, there are two ways to provide this token depending on your situation: Browser Token (Free & Most Common): Best for 99% of users. You can easily extract a temporary token from the Apple Music web player without needing an Apple Developer account. MusicKit Key (Requires Paid Apple Developer Account): If you happen to be enrolled in the paid Apple Developer Program ($99/year), you can provide a private key to automatically generate permanent tokens. Choose your preferred method below: Browser Token (Free) MusicKit Key (Paid Account) Since most users don't have a paid developer account, extracting the token from the web player is the standard approach. Behind the scenes, the Apple Music website makes a lot of background requests, which can make finding the right token confusing. To filter out the noise and grab the exact token we need, follow the steps for your browser below: Chrome, Edge & Firefox Visit music.apple.com and log in. Open Developer Tools (F12 or Ctrl+Shift+I / ⌘ + ⌥ + I) and navigate to the Network tab. In the filter box at the top left, paste exactly: https://amp-api.music.apple.com/v1/me/account (Label 1). Click the Fetch/XHR filter button to hide irrelevant requests (Label 2). Reload the page (Label 3). Under the \"Name\" column, click the request starting with account?meta= (Label 4). In the panel that opens, scroll down to the Request Headers section. Find the authorization header. Copy the long string of text after the Bearer prefix (Label 5). Safari Before you can extract the token in Safari, you must enable developer tools. Open Safari Settings (⌘ + ,), navigate to the Advanced tab, and check \"Show features for web developers\" at the very bottom. Visit music.apple.com and log in. Open the Web Inspector (⌘+⌥+I or Develop > Show Web Inspector) and navigate to the Network tab. In the filter bar on the left side of the inspector, paste exactly: https://amp-api.music.apple.com/v1/me/account (Label 1). Reload the page (Label 2). Click the account request that appears in the Name list (Label 3). In the details sidebar, look under the Request section for the Authorization header. Copy the long string of text after the Bearer prefix (Label 4). Once you have your token, add it to your configuration file along with the origin header: applemusic.json { \"data\": { \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsIm...\", \"mediaUserToken\": \"your-media-user-token-here\", \"origin\": \"https://music.apple.com\" } } Origin Header Required When using a JWT extracted from the browser, Apple requires the request to match the domain it was issued to. You must include the origin field in your config as shown above. Note: Browser-generated JWTs are valid for a maximum of 35 days and must be updated manually when they expire. Apple Developer Account Required To generate JWTs automatically, you must be enrolled in the paid Apple Developer Program ($99/year) and create a MusicKit key. If you don't have an account, use the Browser Token (Free) tab instead. To generate JWTs automatically and avoid manual token refreshes, you need an Apple Music API key: Go to the Apple Developer portal and create a MusicKit key. Download the .p8 file — this is your private key. Note your Key ID and Team ID (found in your Apple Developer account Membership details). Add these details to your config: applemusic.json { \"data\": { \"key\": { \"id\": \"2HPSNJZ88N\", \"teamId\": \"SN6YASW8G4\", \"p8\": \"-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----\" }, \"mediaUserToken\": \"your-media-user-token-here\" } } tip When pasting the contents of your .p8 file into JSON, make sure to replace physical line breaks with \\n so it remains a valid, single-line JSON string.","s":"2. Authentication","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#2-authentication","p":191},{"i":198,"t":"Timestamp Estimation​ The Apple Music API does not provide timestamps for when tracks were played. Multi-Scrobbler estimates play times by taking the current time and subtracting track durations backwards: The most recent track is assumed to have finished playing now. Each older track is estimated to have played duration seconds before the previous one. For the most accurate scrobble timestamps, it is highly recommended to keep the polling interval (APPLEMUSIC_INTERVAL) low (the default is 60 seconds). Duplicate Play Recovery​ The Apple Music history API strictly deduplicates tracks. Instead of showing the same song multiple times in a row, it simply bumps the re-played track back to the #1 spot and removes the older entry. For example, if you listen to Song A → Song B, your history is [Song B, Song A]. If you then listen to Song A again, the API returns [Song A, Song B] (Song A was bumped to the top). If Multi-Scrobbler polled when the top track was Song A, and polls again after it's bumped back to the top, the top track appears functionally unchanged. This usually confuses standard scrobblers into ignoring the update entirely. By default, MS correctly detects this \"top-rebound\" pattern, extracts the intermediate tracks that were squeezed in (Song B), and scrobbles Song A again as a re-listen. Note: Because of this strict deduplication, \"pure loops\" (listening to Song A continuously on repeat without playing anything else in between) cannot be tracked. The history list never changes shape, so MS has no way of knowing it was played again. If you ever experience false positives (tracks being scrobbled that you didn't actually re-listen to), you can disable this recovery behavior with \"recoverUnchangedTopHistory\": false in your config options or by setting the APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY=false env var. Album name normalization​ The Apple Music API appends - EP or - Single to the album name for EPs and singles. These suffixes are not part of the official names of the album and can cause issues when trying to scrobble or match metadata. By default, Multi-Scrobbler strips these suffixes out so only the official name is used. If you do not want this behavior it can be disabled with ENV APPLEMUSIC_NORMALIZE_ALBUM=false or File/AIO option \"normalizeAlbum\": false. Stripping Suffix with User Stage If you still want this stripping functionality but with more control over how it is applied you can use a User Stage. Here is an example of creating a User Stage to only strip suffixes for a specific scrobble client: Example config.json { // ... \"transformers\": [ { \"type\": \"user\", \"name\": \"AppleAlbumStip\", \"defaults\": { \"album\": [ \"/ - (EP|Single)$/i\" ] } } ] } applemusic.json { { \"id\": \"myAppleMusic\", \"name\": \"My Apple Music\", \"data\": { // ... }, \"options\": { \"normalizeAlbum\": false } } } lastfm.json [ { \"name\": \"Foxx LFM Client\", \"id\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"user\", \"name\": \"AppleAlbumStip\", } ] } } } ]","s":"How Multi-Scrobbler handles Apple Music quirks","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#how-multi-scrobbler-handles-apple-music-quirks","p":191},{"i":200,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description APPLEMUSIC_ID string A globally unique ID EX myComponentId APPLEMUSIC_NAME string Value of APPLEMUSIC_ID A vanity name EX My Cool Component APPLEMUSIC_ENABLE boolean true Should this component be used? APPLEMUSIC_KEY_ID string APPLEMUSIC_TEAM_ID string APPLEMUSIC_KEY_P8 string APPLEMUSIC_MEDIA_USER_TOKEN string APPLEMUSIC_TOKEN string APPLEMUSIC_ORIGIN_HEADER string Origin header to include in every Apple Music API request. APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY boolean true Fixes a quirk where Apple Music's history API hides duplicate plays. APPLEMUSIC_NORMALIZE_ALBUM boolean true Removes extraneous suffixes from album data Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a applemusic type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a applemusic Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source applemusic configs will validate correctly in the editor but both source and client applemusic configs are allowed in the real CONFIG/applemusic.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a applemusic Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/applemusic.json [ { \"id\": \"myAppleMusic\", \"name\": \"My Apple Music\", \"enable\": true, \"clients\": [], \"data\": { \"key\": { \"id\": \"2HPSNJZ88N\", \"teamId\": \"SN6YASW8G4\", \"p8\": \"-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----\" }, \"token\": \"your-jwt-token-here\", \"mediaUserToken\": \"your-media-user-token-here\", \"origin\": \"https://music.apple.com\", \"interval\": 60 }, \"options\": { \"logDiff\": true, \"recoverUnchangedTopHistory\": true, \"normalizeAlbum\": true } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the applemusic type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a applemusic Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a applemusic Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myAppleMusic\", \"name\": \"My Apple Music\", \"enable\": true, \"clients\": [], \"data\": { \"key\": { \"id\": \"2HPSNJZ88N\", \"teamId\": \"SN6YASW8G4\", \"p8\": \"-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----\" }, \"token\": \"your-jwt-token-here\", \"mediaUserToken\": \"your-media-user-token-here\", \"origin\": \"https://music.apple.com\", \"interval\": 60 }, \"options\": { \"logDiff\": true, \"recoverUnchangedTopHistory\": true, \"normalizeAlbum\": true }, \"type\": \"applemusic\" } ] }","s":"Configuration Reference","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#configuration-reference","p":191},{"i":202,"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":201},{"i":204,"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":201},{"i":206,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description KODI_ID string A globally unique ID EX myComponentId KODI_NAME string Value of KODI_ID A vanity name EX My Cool Component KODI_ENABLE boolean true Should this component be used? KODI_URL string http://localhost:8080/jsonrpc URL of the Kodi HTTP server to connect to KODI_USER string The username set for Remote Control via Web Sever KODI_PASSWORD string The password set for Remote Control via Web Sever Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a kodi type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a kodi Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source kodi configs will validate correctly in the editor but both source and client kodi configs are allowed in the real CONFIG/kodi.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a kodi Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/kodi.json [ { \"name\": \"My Kodi Server\", \"id\": \"myKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the kodi type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a kodi Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a kodi Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"My Kodi Server\", \"id\": \"myKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" }, \"type\": \"kodi\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":201},{"i":208,"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 library types (like those labelled as mixed or book for audiobooks) multi-scrobbler will only scrobble media Jellyfin detects as Audio. To allow other media types to be scrobbled set allowMediaTypes or JELLYFIN_MEDIATYPES_ALLOW with a list of official types. One or more of: Unknown, Video, Audio, Photo, Book If you use this setting you must explicitly specify Audio, it will no longer be provided as a default External Asset URL If you use MS and Jellyfin on an internal or otherwise inaccessible network but still want album art assets used in the UI or for Discord to be accessible you can specify a URL to replace your internal url. Use (file) frontendUrlOverride or (env) JELLYFIN_FRONTEND_URL_OVERRIDE to replace url/JELLYFIN_URL, respectively, when rendering links for the dashboard UI or other resources. Example: Your JELLYFIN_URL is http://jellyfin:8096 but your Jellyfin instance is externally accessible (by MS or in general) at https://jellyfin.mydomain.com. Use JELLYFIN_FRONTEND_URL_OVERRIDE=https://jellyfin.mydomain.com in order for the MS dashboard to use https://jellyfin.mydomain.com/art/1234.jpg when linking to album art. Configuration​ ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description JELLYFIN_ID string A globally unique ID EX myComponentId JELLYFIN_NAME string Value of JELLYFIN_ID A vanity name EX My Cool Component JELLYFIN_ENABLE boolean true Should this component be used? JELLYFIN_USER string The username of the user to authenticate for or track scrobbles for JELLYFIN_PASSWORD string Password of the username to authenticate for JELLYFIN_APIKEY string API Key to authenticate with. JELLYFIN_URL string HOST:PORT of the Jellyfin server to connect to JELLYFIN_USERS_ALLOW string OR true Only scrobble for specific users from this comma-delimited list. If true, scrobble for all users. JELLYFIN_USERS_BLOCK string Do not scrobble for users from this comma-delimited list JELLYFIN_DEVICES_ALLOW string Only scrobble if device or application name contains strings from this comma-delimited list JELLYFIN_DEVICES_BLOCK string Do not scrobble if device or application name contains strings from this comma-delimited list JELLYFIN_LIBRARIES_ALLOW string Only scrobble if library name contains string from this comma-delimited list JELLYFIN_LIBRARIES_BLOCK string Do not scrobble if library name contains strings from this comma-delimited list JELLYFIN_FRONTEND_URL_OVERRIDE string HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from) JELLYFIN_MEDIATYPES_ALLOW string Allow media types from this comma-delimited list to be scrobbled Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a jellyfin type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a jellyfin Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source jellyfin configs will validate correctly in the editor but both source and client jellyfin configs are allowed in the real CONFIG/jellyfin.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a jellyfin Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/jellyfin.json [ { \"name\": \"Cool JF Server\", \"enable\": true, \"id\": \"myJellyfin\", \"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\" ], \"allowMediaTypes\": [ \"audio\" ], \"frontendUrlOverride\": \"https://myJellyfinExternal.tld\" }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the jellyfin type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a jellyfin Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a jellyfin Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Cool JF Server\", \"enable\": true, \"id\": \"myJellyfin\", \"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\" ], \"allowMediaTypes\": [ \"audio\" ], \"frontendUrlOverride\": \"https://myJellyfinExternal.tld\" }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" }, \"type\": \"jellyfin\" } ] }","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","h":"","p":207},{"i":210,"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 monitoring for Icecast Sources is off by default. Use Monitoring Behavior to initiate scrobbling or configure automatic scrobble. Auto Monitoring Behavior This Source supports toggling monitoring on or off manually. This action can be taken on the Web Dashboard by clicking the link next to Monitoring found in each Source's status card. Additionally, the default monitoring behavior 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 monitor (unless manually invoked) // set to false to never monitor (unless manually invoked) \"autoMonitor\": true } }} This component's default monitoring behavior, when the above is not set, is to never monitor. 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":209},{"i":212,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description ICECAST_ID string A globally unique ID EX myComponentId ICECAST_NAME string Value of ICECAST_ID A vanity name EX My Cool Component ICECAST_ENABLE boolean true Should this component be used? ICECAST_URL string The Icecast stream URL ICECAST_AUTO_MONITOR boolean Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a icecast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a icecast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source icecast configs will validate correctly in the editor but both source and client icecast configs are allowed in the real CONFIG/icecast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a icecast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/icecast.json [ { \"name\": \"Station 1\", \"enable\": true, \"id\": \"myIceStation1\", \"data\": { \"url\": \"http://myIcecast.com/radio\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the icecast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a icecast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a icecast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Station 1\", \"enable\": true, \"id\": \"myIceStation1\", \"data\": { \"url\": \"http://myIcecast.com/radio\" }, \"type\": \"icecast\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":209},{"i":214,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can be found 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":213},{"i":216,"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":213},{"i":218,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description JRIVER_ID string A globally unique ID EX myComponentId JRIVER_NAME string Value of JRIVER_ID A vanity name EX My Cool Component JRIVER_ENABLE boolean true Should this component be used? JRIVER_URL string http://localhost:52199/MCWS/v1/ URL of the JRiver HTTP server to connect to JRIVER_USER string If you have enabled authentication, the username you set JRIVER_PASSWORD string If you have enabled authentication, the password you set Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a jriver type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a jriver Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source jriver configs will validate correctly in the editor but both source and client jriver configs are allowed in the real CONFIG/jriver.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a jriver Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/jriver.json [ { \"name\": \"My JRiver Server\", \"id\": \"myRiver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the jriver type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a jriver Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a jriver Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"My JRiver Server\", \"id\": \"myRiver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" }, \"type\": \"jriver\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":213},{"i":220,"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) Recommended Alternative This Source has the same data limitations as the Last.fm (Source) and Last.fm (Client) have: Last.fm does not support separating artists/album artists fields which means any multi-artist tracks will have all artists combined into one string. This makes scrobbling to other services, and using metadata corrections like Musicbrainz, more difficult. If your application has the option to scrobble using Listenbrainz then use the Listenbrainz (Endpoint) Source instead.","s":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"","p":219},{"i":222,"t":"Scenario Picker Use one of the scenarios below based on how on your service(s) (things \"scrobbling\" to Multi-Scrobbler using this Source) will need to interact with MS. One Service Many Services, Same User Many Services, Many Users, Can use LFM Account Many Services, Many Users, Cannot use LFM Account Service cannot use standard URL You have one service, like Panoscrobbler, that will scrobble to Multi-Scrobbler. Configure one Last.fm Endpoint Source. Use the standard base URL to configure your service and apikey/user, if necessary. Use the same apikey/user in MS as you do in your service. You may have more than one service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler. All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same Clients. Configure one Lastfm Endpoint Source. Use the standard base URL to configure your service and configure apikey/user in MS, if necessary. Use the same apikey/user for all your services as you configure in MS. You have more than one service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All of these services can accept a apikey/user to authenticate a Last.fm user/account. Configure one Last.fm Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For each Lastfm Endpoint Source, configure a different apikey/user. Use that same apikey/user when configuring Last.fm for the associated service. All Last.fm Endpoint Sources should use the same standard base URL. You have more than one service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All, or some, of these services cannot accept an apikey/user to authenticate a Last.fm user/account. This is not a common scenario but if it fits your usecase then use these guidelines to differentiate your services: Configure one Last.fm Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For any groups of services that can use apikey/user, use the instructions for Many Services, Many Users, Can use LFM Account For any groups of services that cannot accept an apikey/user... You can still configure a Source without an apikey/user. Any services not using an account will use this \"default\" Source. If multiple groups cannot use an apikey/user, or the groups cannot use the standard base URL, then use different base url Slugs. You have one service, like PanoScrobbler, that will scrobble to Multi-Scrobbler. You have already tried the One Service scenario with the standard base URL but it is not working. This is not a common scenario. Check the Troubleshooting URL section before trying this. At this point, you can try to use a different base url Slug. Your service must be able to set a \"fully custom\" URL for Last.fm IE it must allow you to set more than just a domain/host.","s":"Setup","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#setup","p":219},{"i":224,"t":"When setting up your Last.fm client to communicate with Multi-Scrobbler replace the Last.fm domain with your Multi-Scrobbler domain: https://last.fm => https://yourMSDomain MS accepts Last.fm API calls with the same url base and structure as the last.fm api, IE http://yourMSDomain/2.0/","s":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#standard-base-url","p":219},{"i":226,"t":"If you are only setting up one Lastfm Endpoint Source then you do not need to configure any explicit username/apiKey/password for MS. If your Last.fm Client requires these credentials use any fake values you want. Supported Auth Types Currently, Multi-Scrobbler only supports the Mobile Application auth flow. If your client requires one of the other authentication flows please open an issue. Note: Your client does not need to implement any auth in order to use a Lastfm Endpoint Source. You can directly make track.scrobble or track.updateNowPlaying api calls to http://yourMSDomain/2.0/ with any fake auth data you want.","s":"Authentication","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#authentication","p":219},{"i":228,"t":"If you need configure more than one Lastfm Endpoint Source then you should configure username/apiKey for MS, per Source. This enables MS to differentiate scrobbles for each Source. Use the same username and/or API Key you configure with MS when setting up your Last.fm Client. These values can be anything you want, as long as they match between MS and your client. Password can be anything and is not checked. However, if you cannot configure username/apiKeys for your scenario you may also use a URL Slug to tell MS which Source belongs to a specific user. This is not a common scenario and should only be used if username/apiKey configuration is not sufficient or not possible. Different URL Base (Slug) If you cannot use different username/apiKey per Source (or Last.fm Client) you can still differentiate Sources by using a different url base (slug) for Last.fm communication. Setting a slug in config will change the url base for MS like this: slug: \"mySlug\" http://yourMsDomain/api/lastfm/mySlug The above url base is equivalent to making calls to http://yourMSDomain/2.0/","s":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#multiple-sources","p":219},{"i":230,"t":"If you think your service should be able to use the standard base URL but it is not working follow these steps before trying the the base URL Slug. Verify URL Format​ Some service may require http/https in the URL format (http://myMSDomainOrIp:9078) while others may not (myDomainOrIp:9078). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works. Some Services Require HTTPS Some services that can scrobble to a custom Last.fm URL may require the URL to have 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. Is MS is Reachable?​ Verify that MS can be accessed by your service, or from the same host as the service is running. See the FAQ for guidance on troubleshooting ingress connection issues. Service Logging​ If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Last.fm apiKey/user, or trying to make a scrobble request. If you decide to report this issue, please include this logging in your issue.","s":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#troubleshooting-url","p":219},{"i":232,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LFM_ID string A globally unique ID EX myComponentId LFM_NAME string Value of LFM_ID A vanity name EX My Cool Component LFM_ENABLE boolean true Should this component be used? LFM_SLUG string When using multiple sources without apikey/user, or not using the standard base URL, this is the URL base path that should be used to identify scrobbles for this source LFM_USERNAME string A fake username to differentiate LFM Endpoint Sources LFM_API_KEY string A fake api key to differentiate LFM Endpoint Sources Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a endpointlfm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a endpointlfm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source endpointlfm configs will validate correctly in the editor but both source and client endpointlfm configs are allowed in the real CONFIG/endpointlfm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a endpointlfm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/endpointlfm.json [ { \"name\": \"LFM For App\", \"enable\": true, \"id\": \"myLfmApp\", \"data\": { \"slug\": \"mySlug\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the endpointlfm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlfm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlfm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"LFM For App\", \"enable\": true, \"id\": \"myLfmApp\", \"data\": { \"slug\": \"mySlug\" }, \"type\": \"endpointlfm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":219},{"i":234,"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":233},{"i":236,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_LASTFM_ID string A globally unique ID EX myComponentId SOURCE_LASTFM_NAME string Value of SOURCE_LASTFM_ID A vanity name EX My Cool Component SOURCE_LASTFM_ENABLE boolean true Should this component be used? SOURCE_LASTFM_API_KEY string API Key generated from Last.fm/Libre.fm account SOURCE_LASTFM_SECRET string Secret generated from Last.fm/Libre.fm account SOURCE_LASTFM_REDIRECT_URI string http://localhost:9078/lastfm/callback Optional URI to use for callback. SOURCE_LASTFM_SESSION string Optional session id returned from a completed auth flow Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a lastfm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a lastfm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source lastfm configs will validate correctly in the editor but both source and client lastfm configs are allowed in the real CONFIG/lastfm.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a lastfm Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a lastfm Client config. This requirement does not apply to AIO lastfm configs. Config Example Mobile Experience This displays an example config file of a lastfm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/lastfm.json [ { \"name\": \"Foxx LFM Source\", \"id\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the lastfm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Foxx LFM Source\", \"id\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":233},{"i":238,"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: File/AIO config must include \"configureAs\": \"source\" Configuration​ ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_KOITO_ID string A globally unique ID EX myComponentId SOURCE_KOITO_NAME string Value of SOURCE_KOITO_ID A vanity name EX My Cool Component SOURCE_KOITO_ENABLE boolean true Should this component be used? SOURCE_KOITO_URL string URL for the Koito server SOURCE_KOITO_TOKEN string User token for the user to scrobble for SOURCE_KOITO_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a koito type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a koito Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source koito configs will validate correctly in the editor but both source and client koito configs are allowed in the real CONFIG/koito.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a koito Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a koito Client config. This requirement does not apply to AIO koito configs. Config Example Mobile Experience This displays an example config file of a koito Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/koito.json [ { \"name\": \"Koito Source B\", \"id\": \"myKoitoSource\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the koito type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a koito Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a koito Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Koito Source B\", \"id\": \"myKoitoSource\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] }","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","h":"","p":237},{"i":240,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server. If your service/player has a \"Scrobble to Listenbrainz\" feature and there is an option to set the Listenbrainz URL then multi-scrobbler can accept scrobbles from that service/player by imitating a real 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":239},{"i":242,"t":"Scenario Picker Use one of the scenarios below based on how on your service(s) (things \"scrobbling\" to Multi-Scrobbler using this Source) will need to interact with MS. One Service Many Services, Same User Many Services, Many Users, Can use Tokens Many Services, Many Users, Cannot use Tokens Service cannot use standard URL You have one service, like Navidrome, that will scrobble to Multi-Scrobbler. Configure one Listenbrainz Endpoint Source. Use the standard base URL to configure your service and set a Token, if necessary. Use the same Token in MS as you do in your service. You may have more than one service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler. All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same Clients. Configure one Listenbrainz Endpoint Source. Use the standard base URL to configure your service and configure a Token in MS, if necessary. Use the same token for all your services as you configure in MS. You have more than one service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All of these services can accept a Token to authenticate a Listenbrainz user/account. Configure one Listenbrainz Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For each Listenbrainz Endpoint Source, configure a different Token. Use that same token when configuring Listenbrainz for the associated service. All Listenbrainz Endpoint Sources should use the same standard base URL. You have more than one service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All, or some, of these services cannot accept a Token to authenticate a Listenbrainz user/account. This is not a common scenario but if it fits your usecase then use these guidelines to differentiate your services: Configure one Listenbrainz Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For any groups of services that can accept a token, use the instructions for Many Services, Many Users, Can use Tokens For any groups of services that cannot accept a token... You can still configure a Source without a Token. Any services not using a token will use this \"default\" Source. If multiple groups cannot use a token, or the groups cannot use the standard base URL, then use different base url Slugs. You have one service, like Navidrome, that will scrobble to Multi-Scrobbler. You have already tried the One Service scenario with both standard base URL and neither is working. This is not a common scenario. Check the Troubleshooting URL section before trying this. At this point, you can try to use a different base url Slug. Your service must be able to set a \"fully custom\" URL for Listenbrainz IE it must allow you to set more than just a domain/host.","s":"Setup","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#setup","p":239},{"i":244,"t":"In most scenarios you should use one of the following as the base URL when configuring your service to scrobble to multi-scrobbler: http://myMultiScrobblerIP:9078 http://myMultiScrobblerIP:9078/1/ Default Scrobble Submit URL Multi-scrobbler will accept Listenbrainz scrobbles at http://myMultiScrobblerIP:9078/1/submit-listens which is the standard Listenbrainz server path for scrobbling.","s":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#standard-base-url","p":239},{"i":246,"t":"Most Listenbrainz clients require an Authentication Token to be provided during setup. This value can be anything you want but ensure you use the same value for token (ENV LZE_TOKEN) in your configuration for this Listenbrainz Endpoint Source. If your service does not require a token, or does not let you set one, then do not configure it for this Source either.","s":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":239},{"i":248,"t":"If you need configure more than one Listenbrainz Endpoint Source then MS can differentiate scrobbles based on Token so that you can use the same, standard base URL for many users. However, if you cannot configure multiple tokens for your scenario you may also use a URL Slug to tell MS which Source belongs to a specific user. This is not a common scenario and should only be used if Token configuration is not sufficient or not possible. Different URL Base (Slug) When a slug is defined in ENV/File config MS will listen for listenbrainz submit-listens requests using the slug as the base route path. Example: LZE_SLUG=foobar MS will accept requests for submit-listens (scrobble submissions and now playing) at http://myMultiScrobblerIP:9078/api/listenbrainz/foobar http://myMultiScrobblerIP:9078/api/listenbrainz/foobar/submit-listens","s":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#multiple-sources","p":239},{"i":251,"t":"Details Set the ListenBrainz.BaseURL (env ND_LISTENBRAINZ_BASEURL) to http://myMultiScrobblerIP:9078/1/","s":"Navidrome","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#navidrome","p":239},{"i":253,"t":"Details Music Assistant Docs In your Music Assistant UI navigate to Settings -> Plugins Click Add a plugin Add ListenBrainz Scrobbler In the ListenBrainz Scrobbler configuration screen: User Token is the Token you configured Toggle Show advanced settings Base URL is the URL you can configured, or the equivalent of http://myMultiScrobblerIP:9078 for your MS instance Save the configuration and you are ready to scrobble To troubleshoot any errors, and assuming you are using Home Assistant, view the Logs in the Music Assistant Add-ons. Please include these logs in any reported issue.","s":"Music Assistant","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#music-assistant","p":239},{"i":255,"t":"If you think your service should be able to use the standard base URL but it is not working follow these steps before trying the the base URL Slug. Verify URL Format​ Some service may require http/https in the URL format (http://myMSDomainOrIp:9078) while others may not (myDomainOrIp:9078). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works. Some Services Require HTTPS Some services that can scrobble to a custom Listenbrainz URL may require the URL to have 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. Is MS is Reachable?​ Verify that MS can be accessed by your service, or from the same host as the service is running. See the FAQ for guidance on troubleshooting ingress connection issues. Service Logging​ If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Listenbrainz account/user, or trying to make a scrobble request. If you decide to report this issue, please include this logging in your issue.","s":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#troubleshooting-url","p":239},{"i":257,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LZE_ID string A globally unique ID EX myComponentId LZE_NAME string Value of LZE_ID A vanity name EX My Cool Component LZE_ENABLE boolean true Should this component be used? LZE_SLUG string When using multiple sources without tokens, or not using a standard base URL, this is the URL base path that should be used to identify scrobbles for this source LZE_TOKEN string If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source LZE_USERNAME string The listenbrainz \"username\" to associate with this Source Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a endpointlz type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a endpointlz Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source endpointlz configs will validate correctly in the editor but both source and client endpointlz configs are allowed in the real CONFIG/endpointlz.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a endpointlz Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/endpointlz.json [ { \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"enable\": true, \"data\": { \"token\": \"myToken\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the endpointlz type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlz Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlz Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"enable\": true, \"data\": { \"token\": \"myToken\" }, \"type\": \"endpointlz\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":239},{"i":259,"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":258},{"i":261,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_LIBREFM_ID string A globally unique ID EX myComponentId SOURCE_LIBREFM_NAME string Value of SOURCE_LIBREFM_ID A vanity name EX My Cool Component SOURCE_LIBREFM_ENABLE boolean true Should this component be used? SOURCE_LIBREFM_API_KEY string Optional Secret for Libre.fm account SOURCE_LIBREFM_SECRET string Optional Secret for Libre.fm account SOURCE_LIBREFM_REDIRECT_URI string http://localhost:9078/librefm/callback Optional URI to use for callback. SOURCE_LIBREFM_SESSION string Optional session id returned from a completed auth flow SOURCE_LIBREFM_URLBASE string https://libre.fm/2.0/ (Optional) The host and path prefix for your Libre.fm instance Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a librefm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a librefm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source librefm configs will validate correctly in the editor but both source and client librefm configs are allowed in the real CONFIG/librefm.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a librefm Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a librefm Client config. This requirement does not apply to AIO librefm configs. Config Example Mobile Experience This displays an example config file of a librefm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/librefm.json [ { \"name\": \"Foxx Libre Source\", \"id\": \"myLibreFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the librefm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Foxx Libre Source\", \"id\": \"myLibreFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" }, \"type\": \"librefm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/librefm-source/","h":"#configuration","p":258},{"i":263,"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":262},{"i":265,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_LZ_ID string A globally unique ID EX myComponentId SOURCE_LZ_NAME string Value of SOURCE_LZ_ID A vanity name EX My Cool Component SOURCE_LZ_ENABLE boolean true Should this component be used? SOURCE_LZ_URL string https://api.listenbrainz.org/ URL for the ListenBrainz server, if not using the default SOURCE_LZ_TOKEN string User token for the user to scrobble for SOURCE_LZ_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a listenbrainz type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a listenbrainz Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source listenbrainz configs will validate correctly in the editor but both source and client listenbrainz configs are allowed in the real CONFIG/listenbrainz.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a listenbrainz Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a listenbrainz Client config. This requirement does not apply to AIO listenbrainz configs. Config Example Mobile Experience This displays an example config file of a listenbrainz Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/listenbrainz.json [ { \"name\": \"Foxx LZ Source\", \"id\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the listenbrainz type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Foxx LZ Source\", \"id\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":262},{"i":267,"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: File/AIO config must include \"configureAs\": \"source\"","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","h":"","p":266},{"i":269,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_MALOJA_ID string A globally unique ID EX myComponentId SOURCE_MALOJA_NAME string Value of SOURCE_MALOJA_ID A vanity name EX My Cool Component SOURCE_MALOJA_ENABLE boolean true Should this component be used? SOURCE_MALOJA_URL string URL for maloja server SOURCE_MALOJA_API_KEY string API Key for Maloja server Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a maloja type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a maloja Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source maloja configs will validate correctly in the editor but both source and client maloja configs are allowed in the real CONFIG/maloja.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a maloja Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a maloja Client config. This requirement does not apply to AIO maloja configs. Config Example Mobile Experience This displays an example config file of a maloja Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/maloja.json [ { \"name\": \"Maloja Source\", \"id\": \"myMalojaSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the maloja type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Maloja Source\", \"id\": \"myMalojaSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":266},{"i":271,"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":270},{"i":273,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MC_ID string A globally unique ID EX myComponentId MC_NAME string Value of MC_ID A vanity name EX My Cool Component MC_ENABLE boolean true Should this component be used? MC_URL string ws://localhost:7905 URL of the Musikcube Websocket (Metadata) server to connect to MC_PASSWORD string Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a musikcube type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a musikcube Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source musikcube configs will validate correctly in the editor but both source and client musikcube configs are allowed in the real CONFIG/musikcube.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a musikcube Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/musikcube.json [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"Desktop\", \"id\": \"myMusikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the musikcube type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a musikcube Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a musikcube Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"Desktop\", \"id\": \"myMusikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":270},{"i":275,"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":274},{"i":277,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MPRIS_ID string A globally unique ID EX myComponentId MPRIS_NAME string Value of MPRIS_ID A vanity name EX My Cool Component MPRIS_ENABLE boolean true Should this component be used? MPRIS_BLACKLIST string DO NOT scrobble from any players that START WITH values from this comma-delimited list MPRIS_WHITELIST string ONLY scrobble from any players that START WITH values from this comma-delimited list Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a mpris type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a mpris Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source mpris configs will validate correctly in the editor but both source and client mpris configs are allowed in the real CONFIG/mpris.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a mpris Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/mpris.json [ { \"name\": \"Desktop\", \"id\": \"myMprisUbuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the mpris type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a mpris Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a mpris Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Desktop\", \"id\": \"myMprisUbuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] }, \"type\": \"mpris\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":274},{"i":279,"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\" Multi-scrobbler requires only the read permission in order to monitor your activity.","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","h":"","p":278},{"i":281,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MPD_ID string A globally unique ID EX myComponentId MPD_NAME string Value of MPD_ID A vanity name EX My Cool Component MPD_ENABLE boolean true Should this component be used? MPD_URL string localhost:6600 URL:PORT of the MPD server to connect to MPD_PASSWORD string Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a mpd type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a mpd Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source mpd configs will validate correctly in the editor but both source and client mpd configs are allowed in the real CONFIG/mpd.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a mpd Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/mpd.json [ { \"enable\": true, \"id\": \"myMPD\", \"name\": \"Desktop\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the mpd type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a mpd Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a mpd Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"enable\": true, \"id\": \"myMPD\", \"name\": \"Desktop\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false }, \"type\": \"mpd\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":278},{"i":283,"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":282},{"i":285,"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":282},{"i":287,"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":282},{"i":289,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MOPIDY_ID string A globally unique ID EX myComponentId MOPIDY_NAME string Value of MOPIDY_ID A vanity name EX My Cool Component MOPIDY_ENABLE boolean true Should this component be used? MOPIDY_URL string ws://localhost:6680/mopidy/ws/ URL of the Mopidy HTTP server to connect to MOPIDY_URI_DENYLIST string Do not scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive MOPIDY_URI_ALLOWLIST string Only scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive MOPIDY_ALBUM_DENYLIST string Soundcloud Remove album data that matches any case-insensitive string from this list when scrobbling, Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a mopidy type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a mopidy Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source mopidy configs will validate correctly in the editor but both source and client mopidy configs are allowed in the real CONFIG/mopidy.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a mopidy Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/mopidy.json [ { \"name\": \"Mopidy Desktop\", \"id\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the mopidy type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a mopidy Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a mopidy Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Mopidy Desktop\", \"id\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] }, \"type\": \"mopidy\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":282},{"i":291,"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":290},{"i":293,"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":290},{"i":295,"t":"See the Rocksky (Client) configuration for general setup. The only difference for Source configuration: File/AIO config must include \"configureAs\": \"source\" ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_ROCKSKY_ID string A globally unique ID EX myComponentId SOURCE_ROCKSKY_NAME string Value of SOURCE_ROCKSKY_ID A vanity name EX My Cool Component SOURCE_ROCKSKY_ENABLE boolean true Should this component be used? SOURCE_ROCKSKY_KEY string API Key generated from API Applications in Rocksky for your account SOURCE_ROCKSKY_HANDLE string The fully-qualified handle for your ATPRoto/Bluesky account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a rocksky type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a rocksky Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source rocksky configs will validate correctly in the editor but both source and client rocksky configs are allowed in the real CONFIG/rocksky.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a rocksky Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a rocksky Client config. This requirement does not apply to AIO rocksky configs. Config Example Mobile Experience This displays an example config file of a rocksky Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/rocksky.json [ { \"id\": \"myRockskySource\", \"name\": \"FoxxMD Rocksky Source\", \"configureAs\": \"source\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the rocksky type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myRockskySource\", \"name\": \"FoxxMD Rocksky Source\", \"configureAs\": \"source\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":290},{"i":297,"t":"Multi-scrobbler can use the Sonos local API to monitor what your Sonos system is playing. MS supports scrobbling simultaneous, different Plays based on what each Group/Zone is playing. Use Musicbrainz for better scrobbling For some services, including Spotify, Sonos only reports the first artist for a Track. You will most likely want to enable Musicbrainz scrobble enhancements so that your plays have correct information, including all artists, when scrobbled. Avoid Sonos activity through other Sources Activity reporting for other Sources does not work well when played through Sonos. If you have other Sources configured for Multi-Scrobbler that you may play through Sonos you should try to add Sonos to the \"deny\" list for that Source so that it does not try to monitor Sonos activity. Check the documentation for each individual Source to see how to configure this exclusion. For example, to prevent the Plex Source from monitoring audio played through Sonos, add Sonos to the \"block\" list ENV EX: PLEX_DEVICES_BLOCK=sonos How to report issues If your Sonos Source is logging errors or the scrobble data is not as expected please create a bug report after enabling the following debug logging options based on the config type you have: ENV File Enable Debug Mode using DEBUG_MODE=true Enable logPayload and logFitlerFailure in your sonos.json, or AIO file, config: [ { \"enable\": true, \"name\": \"MySonos\", \"data\": { \"host\": \"192.168.0.150\" }, \"options\": { \"logFilterFailure\": \"warn\", \"logPayload\": true } } ] Additional logging for the Sonos library may be enabled by including this environmental variable (regardless of config type): DEBUG=sonos:* The above changes: Triggers multi-scrobbler to log the raw data recieved from Sonos when a new track/device/service is seen for the first time Trigger multi-scrobbler to log the reason it considers a play from Sonos as invalid (and will not monitor it) Logs low-level activity from the Sonos library Please include these additional logs when creating a bug report. They are essential to troubleshooting your issue.","s":"Sonos","u":"/multi-scrobbler/configuration/sources/sonos/","h":"","p":296},{"i":299,"t":"The optional devices and groups related properties found in the config below can be used to include or exclude Sonos devices/groups by name, case-insensitive.","s":"Filtering Activity","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#filtering-activity","p":296},{"i":301,"t":"You must define the IP address of at least one Sonos/accessory in order for Multi-scrobbler to connect to your Sonos system. ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SONOS_ID string A globally unique ID EX myComponentId SONOS_NAME string Value of SONOS_ID A vanity name EX My Cool Component SONOS_ENABLE boolean true Should this component be used? SONOS_HOST string IP address of any connected Sonos speaker or device SONOS_DEVICES_ALLOW string Only scrobble if device name contains strings from this comma-delimited list SONOS_DEVICES_BLOCK string Do not scrobble if device name contains strings from this comma-delimited list SONOS_GROUPS_ALLOW string Only scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list SONOS_GROUPS_BLOCK string Do not scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a sonos type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a sonos Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source sonos configs will validate correctly in the editor but both source and client sonos configs are allowed in the real CONFIG/sonos.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a sonos Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/sonos.json [ { \"enable\": true, \"id\": \"MySonos\", \"name\": \"Boom 2\", \"data\": { \"host\": \"192.168.0.150\", \"devicesAllow\": [ \"move\", \"beam\" ], \"devicesBlock\": [ \"roam\" ], \"groupsAllow\": [ \"family\" ], \"groupsBlock\": [ \"bedroom\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the sonos type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a sonos Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a sonos Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"enable\": true, \"id\": \"MySonos\", \"name\": \"Boom 2\", \"data\": { \"host\": \"192.168.0.150\", \"devicesAllow\": [ \"move\", \"beam\" ], \"devicesBlock\": [ \"roam\" ], \"groupsAllow\": [ \"family\" ], \"groupsBlock\": [ \"bedroom\" ] }, \"type\": \"sonos\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#configuration","p":296},{"i":303,"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​ Premium Account Required Starting March 9th 2026 all applications on the Spotify Developer platform will only continue to work if they are owned by a Spotify Premium account. If your App is not created by a Premium account you will likely recieve a 403 error when trying to use MS with Spotify. If you do not have a Spotify Premium account you can still use Spotify with MS but it will require you to coordinate with a (friend?) user who does have Spotify Premium: Follow the steps below logged in as the Spotify Premium account user After completing App creation (step 4 or 5), navigate to the User Management page for the created App Add your (non-premium) account here using your account email/name Complete the rest of the authentication/configuration process normally Assure your friend: Creating a Spotify Developer app does not give anyone access to the owner's account. The authentication process within MS is where authorization is given: it requires clicking the link in MS's dashboard and following a separate auth flow. This auth flow only authorizes access to the specific account used in the flow, unrelated to the owner of the developer app. 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":302},{"i":305,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SPOTIFY_ID string A globally unique ID EX myComponentId SPOTIFY_NAME string Value of SPOTIFY_ID A vanity name EX My Cool Component SPOTIFY_ENABLE boolean true Should this component be used? SPOTIFY_CLIENT_ID string spotify client id SPOTIFY_CLIENT_SECRET string spotify client secret SPOTIFY_REDIRECT_URI string http://localhost:9078/callback spotify redirect URI -- required only if not the default shown here. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a spotify type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a spotify Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source spotify configs will validate correctly in the editor but both source and client spotify configs are allowed in the real CONFIG/spotify.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a spotify Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/spotify.json [ { \"id\": \"MySpotify\", \"name\": \"Foxx Spotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the spotify type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a spotify Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a spotify Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"MySpotify\", \"name\": \"Foxx Spotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 }, \"type\": \"spotify\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":302},{"i":307,"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","s":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":309,"t":"In Plex, if the Plex Music Agent is set on a Music Library then Plex attempts to match your music with Musicbrainz when it is first imported. Plex uses ID3/metdata tags to match or falls back to matching based on file name and folder names. If it cannot find a match it can be fixed through a Fix Match option in the album/track context menu. See plex documentation for more information. You can verify if an Item has been matched by: Clicking on the Item context menu (...) Get Info View XML If a node like this is present then it has been matched: ","s":"Matching With Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":311,"t":"The MBID from the above node is a Track, a special type of ID that specifically identifies a song on a specific album. If this is present then Multi-scrobbler can use it to gaurantee your scrobble, and all its metadata, is matched 1:1 with what is in your Plex library when using the Musicbrainz Stage to enrich your scrobble. To configure MS to use Musicbrainz with your Plex metadata use one of the methods below: ENV File File AIO Add to your multi-scrobbler docker compose file environment section for Musicbrainz ENV Configuration: # a real email that Musicbrainz can use to contact you in case of issues - MB_CONTACT=myEmail@myEmailProvider.com - MB_PRESETS=id,default - PLEX_TRANSFORMS=musicbrainz Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { // a real email that Musicbrainz can use to contact you in case of issues \"contact\": \"myEmail@myEmailProvider.com\" } ] } } ] } In your File Config: plex.json [ { \"name\": \"MyPlex\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" \"searchOrder\": [\"mbidrecording\", \"basicOrIds\", \"basic\"] } ] } } } ] Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { // a real email that Musicbrainz can use to contact you in case of issues \"contact\": \"myEmail@myEmailProvider.com\" } ] } } ] // ... \"sources\": [ // ... { \"name\": \"MyPlex\", \"type\": \"plex\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"searchOrder\": [\"mbidrecording\", \"basicOrIds\", \"basic\"] } ] } } } ] }","s":"Using Musicbrainz With Multi-Scrobbler","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":313,"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 service 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":312},{"i":315,"t":"Multi-Scrobbler supports the new Open Subsonic extension, Playback Report, that enables millisecond-accurate player position and state reporting. To use this new data, your Subsonic server must support the extension and the active playback Client must report it. The UI for your Subsonic Source and active Player will indicate support using contextual icons. Usage of Enhanced Playback Reporting is optional: MS will fallback to classic, less accurate Subsonic Now Playing when it is not available. Stale Players without Playback Reporting For Subsonic server/client combinations that do not support Enhanced Playback Reporting, multi-scrobbler will cleanup players that report they are playing for much longer period of time than the track's length (when length is reported). This prevents repeated scrobbles from Subsonic-compatible servers that continue returning a track after playback stops. If the server properly reports no playing song when playback has stopped or this causes issues for your setup, the detection can be disabled by setting detectStaleNowPlayingFromMinutesAgo to false in File/AIO config.","s":"Enhanced Playback Reporting","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#enhanced-playback-reporting","p":312},{"i":317,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SUBSONIC_ID string A globally unique ID EX myComponentId SUBSONIC_NAME string Value of SUBSONIC_ID A vanity name EX My Cool Component SUBSONIC_ENABLE boolean true Should this component be used? SUBSONIC_USER string Username to login to the server with SUBSONIC_PASSWORD string Password for the user to login to the server with SUBSONIC_URL string URL of the subsonic media server to query Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a subsonic type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a subsonic Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source subsonic configs will validate correctly in the editor but both source and client subsonic configs are allowed in the real CONFIG/subsonic.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a subsonic Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/subsonic.json [ { \"id\": \"mySubsonic\", \"name\": \"Airsonic Server\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ], \"detectStaleNowPlayingFromMinutesAgo\": true } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the subsonic type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a subsonic Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a subsonic Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"mySubsonic\", \"name\": \"Airsonic Server\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ], \"detectStaleNowPlayingFromMinutesAgo\": true }, \"type\": \"subsonic\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":312},{"i":319,"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*(?.+?) - (?.+?)\\\\.\\\\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":318},{"i":321,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description VLC_ID string A globally unique ID EX myComponentId VLC_NAME string Value of VLC_ID A vanity name EX My Cool Component VLC_ENABLE boolean true Should this component be used? VLC_URL string localhost:8080 URL:PORT of the VLC server to connect to VLC_PASSWORD string Password for the server Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a vlc type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a vlc Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source vlc configs will validate correctly in the editor but both source and client vlc configs are allowed in the real CONFIG/vlc.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a vlc Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/vlc.json [ { \"enable\": true, \"id\": \"myVlc\", \"name\": \"Desktop\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the vlc type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a vlc Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a vlc Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"enable\": true, \"id\": \"myVlc\", \"name\": \"Desktop\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" }, \"type\": \"vlc\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":318},{"i":323,"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":322},{"i":325,"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":322},{"i":327,"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":322},{"i":329,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description WS_ID string A globally unique ID EX myComponentId WS_NAME string Value of WS_ID A vanity name EX My Cool Component WS_ENABLE boolean true Should this component be used? WS_BLACKLIST string Block scrobbling from specific WebScrobbler Connectors WS_WHITELIST string Only allow scrobbling from specific WebScrobbler Connectors Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a webscrobbler type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a webscrobbler Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source webscrobbler configs will validate correctly in the editor but both source and client webscrobbler configs are allowed in the real CONFIG/webscrobbler.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a webscrobbler Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/webscrobbler.json [ { \"id\": \"MyWebScrobbler\", \"name\": \"Firefox Laptop\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the webscrobbler type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a webscrobbler Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a webscrobbler Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"MyWebScrobbler\", \"name\": \"Firefox Laptop\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] }, \"type\": \"webscrobbler\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":322},{"i":331,"t":"Monitor your Yandex Music listening activity in real-time. This Source requires a third party docker container to communicate with Yandex Music, yandex-music-bridge. Example Docker Compose with yandex-music-bridge ~/msData/docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # ...your other sources/clients here # add for yandex music - YMBRIDGE_URL=http://yandex-music-bridge:9980 - YMBRIDGE_API_KEY=change-me volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped yandex-music-bridge: image: ghcr.io/druidblack/yandex-music-bridge:latest environment: - TZ=Europe/Moscow - YM_TOKEN=AgAAAAACO3_345345 - YM_API_KEY=change-me - YM_PORT=9980 - YM_LANGUAGE=ru - YM_ENABLE_YNISON=true - YM_PUSH_TTL=45 - YM_QUEUE_CACHE_TTL=15 - YM_LOG_LEVEL=INFO ports: - \"9980:9980\" restart: unless-stopped You will need to acquire your own token for YM_TOKEN used in yandex-music-bridge using the instructions provided there. Need Help? If your issue is specifically related to yandex-music-bridge (errors in the container, usage instructions, general Yandex setup like token etc...) please open an issue on that repository instead of Multi-Scrobbler's. If you have issues specifically with the MS Source please mention Druidblack (@Druidblack) when opening an issue or discussion. Yandex Music is not available in the country of the main Multi-Scrobbler developer (FoxxMD) so they can only help troubleshooting general MS issues related to Yandex Music.","s":"Yandex Music","u":"/multi-scrobbler/configuration/sources/yandex-music/","h":"","p":330},{"i":333,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description YMBRIDGE_ID string A globally unique ID EX myComponentId YMBRIDGE_NAME string Value of YMBRIDGE_ID A vanity name EX My Cool Component YMBRIDGE_ENABLE boolean true Should this component be used? YMBRIDGE_URL string URL of the local Python bridge, for example http://yandex-music-bridge:9980 YMBRIDGE_API_KEY string Optional API key sent as X-API-Key to the bridge Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a ymbridge type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a ymbridge Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source ymbridge configs will validate correctly in the editor but both source and client ymbridge configs are allowed in the real CONFIG/ymbridge.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a ymbridge Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/ymbridge.json [ { \"id\": \"myYandex\", \"name\": \"Yandex Music\", \"type\": \"ymbridge\", \"data\": { \"url\": \"http://192.168.1.161:9980\", \"apiKey\": \"change-me\", \"interval\": 3 } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the ymbridge type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a ymbridge Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a ymbridge Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myYandex\", \"name\": \"Yandex Music\", \"type\": \"ymbridge\", \"data\": { \"url\": \"http://192.168.1.161:9980\", \"apiKey\": \"change-me\", \"interval\": 3 } } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/yandex-music/","h":"#configuration","p":330},{"i":335,"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":334},{"i":337,"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":334},{"i":339,"t":"See the teal.fm (Client) configuration for general setup. The main differences for Source configuration: File/AIO config must include \"configureAs\": \"source\"","s":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":334},{"i":341,"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 Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_TEALFM_ID string A globally unique ID EX myComponentId SOURCE_TEALFM_NAME string Value of SOURCE_TEALFM_ID A vanity name EX My Cool Component SOURCE_TEALFM_ENABLE boolean true Should this component be used? SOURCE_TEALFM_IDENTIFIER string Identify the account to login as SOURCE_TEALFM_APP_PW string The App Password you created for your account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a tealfm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a tealfm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source tealfm configs will validate correctly in the editor but both source and client tealfm configs are allowed in the real CONFIG/tealfm.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a tealfm Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a tealfm Client config. This requirement does not apply to AIO tealfm configs. Config Example Mobile Experience This displays an example config file of a tealfm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/tealfm.json [ { \"id\": \"myTealSource\", \"name\": \"Foxx Teal Source\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the tealfm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myTealSource\", \"name\": \"Foxx Teal Source\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] }, \"type\": \"tealfm\" } ] }","s":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":334},{"i":343,"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":342},{"i":345,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description YTM_ID string A globally unique ID EX myComponentId YTM_NAME string Value of YTM_ID A vanity name EX My Cool Component YTM_ENABLE boolean true Should this component be used? YTM_REDIRECT_URI string Google Cloud Console project OAuth Client Authorized redirect URI YTM_CLIENT_ID string Google Cloud Console project OAuth Client ID YTM_CLIENT_SECRET string Google Cloud Console project OAuth Client Secret YTM_COOKIE string The cookie retrieved from the Request Headers of music.youtube.com after logging in. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a ytmusic type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a ytmusic Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source ytmusic configs will validate correctly in the editor but both source and client ytmusic configs are allowed in the real CONFIG/ytmusic.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a ytmusic Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/ytmusic.json [ { \"id\": \"myYtMusic\", \"name\": \"Foxx YT Music\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the ytmusic type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a ytmusic Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a ytmusic Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myYtMusic\", \"name\": \"Foxx YT Music\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true }, \"type\": \"ytmusic\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":342},{"i":347,"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":346},{"i":349,"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":346},{"i":351,"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":"Lifecycle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecycle-hooks","p":346},{"i":353,"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":346},{"i":355,"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":346},{"i":357,"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":346},{"i":359,"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":346},{"i":361,"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":346},{"i":363,"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":346},{"i":365,"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":346},{"i":368,"t":"MS uses caching to reduce the number of API calls needed for stages like Musicbrainz and to speed up all transforms by caching steps and results. However, the default caching strategy uses a small cache size and very short TTLs because it is in-memory. If you are using any Transform stages you should configure secondary caching to increase the cache size and lifetime of cached items. This will also reduce memory usage in MS.","s":"Caching","u":"/multi-scrobbler/configuration/transforms/","h":"#caching","p":346},{"i":370,"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":346},{"i":373,"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":371},{"i":375,"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":371},{"i":377,"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":371},{"i":379,"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":371},{"i":381,"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":371},{"i":383,"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":371},{"i":385,"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":371},{"i":387,"t":"Source Development and Tutorial Client Development and Tutorial (TBD)","s":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":371},{"i":389,"t":"Run tsx with inspect args NODE_ENV=production node node_modules/.bin/tsx --inspect --heap-prof src/backend/index.ts Use chrome://inspect from a chromium-based browser and attach to the running process, usually localhost:9229 From the opened DevTools window use Performance or Memory to profile the running process.","s":"Profiling","u":"/multi-scrobbler/development/dev-common/","h":"#profiling","p":371},{"i":391,"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":390},{"i":393,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MCAST_ID string A globally unique ID EX myComponentId MCAST_NAME string Value of MCAST_ID A vanity name EX My Cool Component MCAST_ENABLE boolean true Should this component be used? MCAST_URL string The host or URL of the YamahaExtendedControl endpoint to use Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a musiccast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a musiccast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source musiccast configs will validate correctly in the editor but both source and client musiccast configs are allowed in the real CONFIG/musiccast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a musiccast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/musiccast.json [ { \"name\": \"Livingroom Reciever\", \"id\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the musiccast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a musiccast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a musiccast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Livingroom Reciever\", \"id\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" }, \"type\": \"musiccast\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":390},{"i":395,"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":394},{"i":397,"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":394},{"i":399,"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":394},{"i":401,"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":394},{"i":403,"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":394},{"i":406,"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":394},{"i":408,"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":394},{"i":410,"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":394},{"i":412,"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":411},{"i":414,"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\", \"title\": [ // removes badterm from track title \"badterm\" ] } ] } } } ]","s":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":411},{"i":416,"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":411},{"i":418,"t":"Each Rule must be an array of search-and-replace expressions: lastfm.json [ { \"name\": \"myLastFm\", \"configureAs\": \"source\", \"data\": { // ... }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"user\", \"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":411},{"i":421,"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 { \"type\": \"user\", \"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":411},{"i":423,"t":"Removes the phrase (Album Version) from the Title of a Play Example { \"type\": \"user\", \"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":411},{"i":425,"t":"Example { \"compare\": { \"candidate\": { \"type\": \"user\", \"title\": [ \"/(\\(.+\\))\\s*$/\" ] }, \"existing\": { \"type\": \"user\", \"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":411},{"i":427,"t":"Example { \"type\": \"user\", \"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":411},{"i":429,"t":"Example { \"type\": \"user\", \"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":411},{"i":431,"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 { \"type\": \"user\", \"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":411},{"i":435,"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":432},{"i":437,"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":432},{"i":440,"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":432},{"i":442,"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":432},{"i":444,"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":432},{"i":448,"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":445},{"i":450,"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":445},{"i":452,"t":"These are errors indicating a network issue is occuring between you and the Source/Client. ECONNRESET means the upstream service unexpectedly closed the connection ETIMEDOUT means the upstream service did not respond to a request MS ENOTFOUND means that MS could not find a DNS record for the domain of the upstream service EAI_AGAIN means that a DNS server did not respond to MS's request to lookup the record for a domain ECONNRESET and timeout issues can occur when you have a poor connection or if the upstream service is overloaded or is generally not behaving well. This is a common occurrence for Listenbrainz/Musicbrainz related requests. Please check the Upstream Services Status Page to independently verify if the service is misbehaving. If the service is up and has good uptime then the issue may be in your network. ENOTFOUND and EAI_AGAIN and generally caused by DNS caching (stale records) or misbehaving DNS servers. Though this can happen at the upstream service's end, it is usually an issue in your network. If you run a Pihole, AdGaurd, or other DNS solution try flushing the cache for the mishaving domain and check that your DNS application is working correctly.","s":"I get errors with ECONNRESET ETIMEDOUT ENOTFOUND EAI_AGAIN","u":"/multi-scrobbler/FAQ/","h":"#i-get-errors-with-econnreset-etimedout-enotfound-eai_again","p":445},{"i":454,"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":445},{"i":457,"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":445},{"i":460,"t":"Multi-scrobbler has a robust duplicate scrobble detection system that should handle this for you in the majority of usecases. If you have a simple setup without any circular dependencies then you are already protected against duplicates. If your scenario is more complex or you have a service(s) acting as both a Client and Source you should refer to the Duplicate Scrobble Guidance page to determine if you can avoid a configuration that may result in duplicate scrobbles.","s":"How do I prevent duplicate scrobbles?","u":"/multi-scrobbler/FAQ/","h":"#how-do-i-prevent-duplicate-scrobbles","p":445},{"i":462,"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":445},{"i":464,"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":445},{"i":466,"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":445},{"i":468,"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":445},{"i":470,"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":445},{"i":472,"t":"tip For the difference between ENV and File examples in this document see Configuration Types.","s":"Overview","u":"/multi-scrobbler/installation/","h":"","p":471},{"i":474,"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","s":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":471},{"i":476,"t":"Storage Networking Base URL Timezone Linux Host Read Only Caching You should bind a host directory into the container for storing configurations, credentials, database, and other files. Otherwise, these will be lost when the container is updated. docker-compose.yml services: multi-scrobbler: # ... volumes: - \"./config:/config\" Optionally, use a separate directory for data (database, cache, etc...) by mounting an additional directory and setting the DATA_DIR ENV to the directory that should be used inside the container: docker-compose.yml services: multi-scrobbler: # ... environment: # ... - DATA_DIR=/msData volumes: - \"./config:/config\" # used for config files - \"./my/host/folder:/msData\" # used for data files 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. docker-compose.yml services: multi-scrobbler: # ... ports: - \"9078:9078\" 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) docker-compose.yml services: multi-scrobbler: # ... environment: - BASE_URL=http://hostMachineIP Set the timezone for the container using the environmental variable TZ. docker-compose.yml services: multi-scrobbler: # ... environment: # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - TZ=America/New_York If you are running this container with Docker on a Linux Host you should specify user:group permissions of the user who owns the configuration and data directories 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 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 Optionally, add a Valkey service to your stack for secondary caching to take advantage of faster performance, reduced memory usage, and cached api calls to external services. docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler # ... environment: # ... CACHE_VALKEY=redis://valkey:6379 # ... valkey: image: valkey/valkey volumes: - valkeydata:/data volumes: valkeydata: driver: local","s":"Recommended Settings","u":"/multi-scrobbler/installation/","h":"#recommended-settings","p":471},{"i":478,"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 Optional caching using valkey (after uncommenting) 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 # uncomment along with valkey service/volume below for better caching #- CACHE_VALKEY=redis://valkey:6379 volumes: - ./config:/config ports: - 9078:9078 restart: unless-stopped #valkey: # image: valkey/valkey # volumes: # - valkeydata:/data #volumes: # valkeydata: # driver: local","s":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":471},{"i":480,"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":471},{"i":482,"t":"Clone this repository somewhere using the latest git tag and then install from the working directory. git clone --branch <LATEST_RELEASE_TAG> 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 Config And Data Directories​ The directories MS uses for Configuration (config.json, jellyfin.json, etc...) and Data (database, cache, etc...) can be specified by environmental variables passed directly to npm/node, or set in an .env file in the working directory. When parsing these ENVs MS will resolve relative directories but not bash expansions like ~ for home. Examples: CONFIG_DIR=/my/absolute/path => sets directory to use for config files DATA_DIR=./relative/data => sets directory relative to working directory for data files If you do not set these environmental variables then MS will attempt to use OS-standardized directories: Linux MacOS Windows Config => $XDG_CONFIG_HOME/multi-scrobbler or ~/.config/multi-scrobbler Data => $XDG_DATA_HOME/multi-scrobbler or ~/.local/share/multi-scrobbler Config => ~/Library/Preferences/multi-scrobbler Data => ~/Library/Application Support/multi-scrobbler Config => %APPDATA%\\multi-scrobbler\\Config Data => %LOCALAPPDATA%\\multi-scrobbler\\Data 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":471},{"i":484,"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":471},{"i":488,"t":"Multi-scrobbeler has a real-time log shown in the dashboard. These are the same logs you would find in docker logs. In the dashboard, logs can be filtered by LEVELS to give you a better view of errors/warnings. When creating an issue please include all logs at the lowest level possible (DEBUG) to help provide context for your issue. You should try to include logs that occurred before and after your issue/error occurs as this can help determine if MS was behaving normally.","s":"Logs","u":"/multi-scrobbler/help/","h":"#logs","p":485},{"i":490,"t":"If possible, turn on Debug Mode and replicate your issue. Debug Mode enables much more logging that can reveal additional data for troubleshooting. This mode will make your logs very noisy, though, so it's recommended to turn it off after collecting logs.","s":"Debug Mode","u":"/multi-scrobbler/help/","h":"#debug-mode","p":485},{"i":492,"t":"From the dashboard, each Source/Client has a few details page links: Opening the details page for the Source/Client reveals a lists all of the Plays that were discovered (Sources) or scrobbled (Clients). Click on the Debug icon to copy debugging data relevant to that Play. This data should be included in any issue you create. To include this data in an issue either paste the copied data into a text file and save as debugdata.json, attaching to the issue. Or directly paste the copied data into an issue/comment using fenced code blocks markdown to preserve the structure like: This is the contents of my comment/issue text on github. I am explaining my issue here. Here is the debug data: ```json { \"input\": { \"aProperty: 123, \"foo\": \"bar\" } } ``` Thank you for your time.","s":"Copy Play Debug Data","u":"/multi-scrobbler/help/","h":"#copy-play-debug-data","p":485},{"i":495,"t":"Check the FAQ to see if your issue is a known issue or a commonly-experienced issue with Multi-Scrobbler. The FAQ also includes fixes or ways to help troubleshoot these common issues.","s":"FAQ","u":"/multi-scrobbler/help/","h":"#faq","p":485},{"i":497,"t":"On the github repository for Multi-Scrobbler, search existing issues and discussions to see if anyone else has had this issue and if it has already been solved.","s":"Existing Issues","u":"/multi-scrobbler/help/","h":"#existing-issues","p":485},{"i":499,"t":"Before reporting an issue please consider: If this a how-do-I question, troublehooting, or generally not a bug/error with multi-scrobbler please consider starting a discussion instead of opening an issue If you want to request new functionality use the Feature Request issue template If you want to request a new Source/Client implementation use the New Source/Client issue template If none of the above apply to you then create a new bug report. Please include all logs and play debug data relevant to your issue. The more logs the better. If possible, replicate the issue with debug mode turned on.","s":"Reporting an Issue","u":"/multi-scrobbler/help/","h":"#reporting-an-issue","p":485},{"i":501,"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":500},{"i":503,"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":500},{"i":505,"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":500},{"i":507,"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":500},{"i":510,"t":"The majority of Multi-scrobbler updates can be completed without any manual intervention. This is guaranteed for patch version updates. Regardless, it is recommended to consult the Github Release Notes before any upgrades. The release notes contain all changelogs as well as most breaking changes/notices. The Upgrade Path docs contain information for upgrading through required versions or in-depth migration guides. Check this section before upgrading any minor versions.","s":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":508},{"i":512,"t":"Multi-scrobbler depends on a SQLite database (ms.db) that is created on first run and stored in the CONFIG_DIR. If any database migrations are required for an update then your database is automatically backed up before migration occurs. The backup file is created in the same directory. You can manually make a backup of this database by making a copy of ms.db and any similarly named files like ms.db-journal. tip If upgrading a minor version you may want to make a backup for extra safety.","s":"Database","u":"/multi-scrobbler/updating/","h":"#database","p":508},{"i":514,"t":"Minor versions may have breaking changes related to configuration. Consult the Github Release Notes and Upgrade Paths before upgrading.","s":"Configuration","u":"/multi-scrobbler/updating/","h":"#configuration","p":508},{"i":516,"t":"Assuming: upgrade(s) are only patch versions and the Release Notes do not contain any other guidance or you have checked the release notes, upgrade paths docs, and completed all migration steps for the specific version upgrade Docker Compose local docker compose pull docker compose up -d Assuming the repository was used for initial installation with git clone, update by pulling the latest commit: git pull and restart multi-scrobbler.","s":"Update Instructions","u":"/multi-scrobbler/updating/","h":"#update-instructions","p":508},{"i":518,"t":"Multi-scrobbler versioning uses semver without a major version (for now): Minor version bumps (0.12.2 => 0.13.0) may have breaking changes or include major new behavior Patch version bumps (0.12.2 => 0.12.3) may have new behavior or fix bugs, but have no breaking changes. These can be safely upgraded unattended. Check the Github Release Notes for breaking changes, changelogs, and any migration steps required between minor versions.","s":"Versioning","u":"/multi-scrobbler/updating/","h":"#versioning","p":508},{"i":520,"t":"The default master branch is not stable. The goal is to have it be functional bleeding-edge development with non-functioning development isolated to pull requests and other branches. For a stable release use the latest git tag EX: git clone --branch 0.13.0 https://github.com/FoxxMD/multi-scrobbler.git","s":"Git","u":"/multi-scrobbler/updating/","h":"#git","p":508},{"i":522,"t":"Docker image tags use this pattern: :latest is the latest stable release IE If the latest released version was 0.13.0 then :latest is also 0.13.0 :latest will always be the latest release. Before pulling a new image you should check if the version bump has breaking changes. :edge is built automatically from the master branch Pinned semver tags are published alongside releases EX :0.12.2 Additionally, Pull Requests may have docker images published with tags like :pr-521. These are not guaranteed to be stable and should only be used for testing.","s":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":508},{"i":524,"t":"The current version of Multi-Scrobbler can be found in several places: Open the Web Dashboard, the version is displayed next the Multi-Scrobbler logo in the top left corner On startup the version is immediately printed to logs EX: [2026-04-16 09:17:32.428 -0400] INFO : [Init] Version: 0.13.0 Checking the running docker container or image for the org.opencontainers.image.version label When running MS from a non-pinned source (like :edge tag, a pull request, or git branch) the version will be shown as the branch name and short commit hash EX master-1c78da79 tip Using the above information you can verify if you have pulled and successfully recreated a docker container with a new version. If the version string does not change from the previous version running then you are still running the old container","s":"What Version Am I Using?","u":"/multi-scrobbler/updating/","h":"#what-version-am-i-using","p":508},{"i":526,"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":525},{"i":528,"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":525},{"i":530,"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 - JELLYFIN_ID=myJellyin 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 - SPOTIFY_ID=mySpotify 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 - LZE_ID=navidromeLZ 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 - PLEX_ID=myPlex # 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. Add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SOURCE_LASTFM_API_KEY=MY_API_KEY_PLACEDHOLDER - SOURCE_LASTFM_SECRET=MY_SECRET_PLACEHOLDER - SOURCE_LASTFM_REDIRECT_URI=http://192.168.0.100:9078/lastfm/callback - SOURCE_LASTFM_ID=myLFMSource 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":525},{"i":532,"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 # isrc => then tries basic text fields => then tries extracted artists - MB_PRESETS=default,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":525},{"i":534,"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 # isrc => then tries basic text fields => then tries extracted artists - MB_PRESETS=default,sensible,native Presets are found here.","s":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":525},{"i":536,"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":525},{"i":538,"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. Koito Last.fm Maloja 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 - KOITO_ID=myKoito tip For Koito versions <=0.1.7, you must have the environment variable KOITO_ALLOWED_HOSTS set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. koito.mydomain.com. 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 - LASTFM_ID=myLfmClient 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 - MALOJA_ID=myMaloja","s":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":525},{"i":540,"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":525},{"i":542,"t":"See more advanced docker options as well as other install methods in the Installation docs Setup secondary caching with valkey for increased performance and reduced memory usage 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":525},{"i":544,"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":543},{"i":546,"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":543},{"i":548,"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":543},{"i":551,"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":543},{"i":553,"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":543},{"i":555,"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":543},{"i":557,"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":543},{"i":559,"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":543},{"i":561,"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":543},{"i":564,"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":543},{"i":566,"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":543},{"i":568,"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":543},{"i":571,"t":"You should setup metadata caching to reduce API calls, improve transform performance, and reduce memory usage when using this stage.","s":"Caching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#caching","p":543},{"i":573,"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":543},{"i":575,"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":543},{"i":577,"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":543},{"i":579,"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":543},{"i":581,"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":543},{"i":584,"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":543},{"i":586,"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":543},{"i":588,"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":543},{"i":590,"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":543},{"i":592,"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":543},{"i":594,"t":"The Discord Client can fetch album art images from Cover Art Archive if the Scrobble data contains a Release MBID. Use the Musicbrainz Stage on the preCompare hook for your Discord client so that missing Musicbrainz IDs are populated for this functionality. Example ENV File AIO Using the ENV Configuration from above, add these fields to your docker compose environment: - MB_CONTACT=contact@mydomain.com - MB_PRESETS=id,native,sensible - DISCORD_TRANSFORMS=musicbrainz Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { // sensible defaults \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"searchArtistMethod\": \"native\", \"searchOrder\": [\"isrc\",\"basic\", \"artist\"] } } ] } In your Discord File Config: discord.json [ { \"name\": \"MS\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", } ] } } } ] Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { // sensible defaults \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"searchArtistMethod\": \"native\", \"searchOrder\": [\"isrc\",\"basic\", \"artist\"] } } ], \"sources\": [ { \"name\": \"MS\", \"type\": \"discord\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", } ] } } } ] }","s":"Use Metadata for Discord Album Art","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-metadata-for-discord-album-art","p":543},{"i":596,"t":"A dockerized app that monitors your music listening activity from everywhere and scrobbles it anywhere. Supports monitoring activity from many Sources Apple Music 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 Music Assistant Plex Rocksky Sonos Spotify Subsonic-compatible APIs (like Airsonic and Navidrome) teal.fm WebScrobbler VLC Yamaha MusicCast Yandex Music Youtube Music Supports scrobbling to many Clients Discord (Now Playing) 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 New UI Preview A full rewrite of the UI is now available for preview. The new UI modernizes Multi-Scrobbler and gives you in depth insight into how your scrobbles are handled end-to-end. To try out the stable-release preview navigate to http://yourMSDomain:9078/next Or to try out the latest preview snapshot see the docker image pinned in this comment. 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":595},{"i":598,"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. Diagram","s":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":595},{"i":600,"t":"A Source is a data source that contains information about music you are playing or have listened to, such as: 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":595},{"i":602,"t":"A Client is an application that stores the historical information about what music you have played (scrobbles). Examples are Koito, 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":595},{"i":604,"t":"See the Quick Start Guide","s":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":595},{"i":606,"t":"See the Installation documentation","s":"Installation","u":"/multi-scrobbler/","h":"#installation","p":595},{"i":608,"t":"See the Configuration documentation","s":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":595},{"i":610,"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":595},{"i":612,"t":"Having issues with connections or configuration? Check the FAQ before creating an issue!","s":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":595},{"i":614,"t":"Detailed architecture and development guides for Sources/Clients","s":"Development","u":"/multi-scrobbler/","h":"#development","p":595},{"i":616,"t":"MIT","s":"License","u":"/multi-scrobbler/","h":"#license","p":595},{"i":619,"t":"MS 0.14.0 introduces a database for persisting Plays/Scrobbles, queues, and other data associated with a Source/Client. To make this association atomic a Source/Client ID is now configurable. This ID is what MS will use to identify the Source/Client in your config with the Source/Client in the database. This ID needs to be unique to the client or source type it is used on IE: two Koito Clients cannot both have the ID myKoitoID it is recommended that the ID be globally unique among all sources/clients, but it's not required","s":"Source/Client IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#sourceclient-ids","p":617},{"i":621,"t":"ENV File AIO For each Source/Client in your environmental variables, add a key with the suffix _ID and the ID value. EX compose.yaml services: multi-scrobbler: # ... environment: - KOTIO_TOKEN=... # ...more koito config - KOITO_ID=myKoitoID - JELLYFIN_URL=... # ...more jellyin config - JELLYFIN_ID=myJellyfinID Add an id to the top-level for each Source/Client configuration, next to data: koito.json [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"id\": \"myKoitoID\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Add an id to the top-level for each Source/Client configuration, next to data: config.json { \"sources\": [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"type\": \"koito\", \"id\": \"myKoitoID\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] } Default ID In 0.14.0, If you do not add an ID then Multi-Scrobbler will automatically use the name of the Source/Client as the ID. The name is shown in the Dashboard. If you decide to add an ID later, you must use the Source/Client name as the ID in order to keep Plays/Scobbles associated with the same config. In 0.16.0+ you are required to have an ID or a configuration error is thrown.","s":"Configuring IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#configuring-ids","p":617},{"i":623,"t":"tip Before upgrading, if your MS dashboard shows 0 queued/failed for all Scrobble Clients then you can ignore this section. important The cached scrobbles for a Client/Source were based on its name. If you plan on changing the name of a Client/Source with this upgrade you should do it after this migration has run or else MS will not be able to find any associated cached scrobbles. MS 0.14.0 introduces a database for persisting Plays/Scrobbles, queues, and other data. Prior to 0.14.0, queued/failed scrobbles were stored in a cache file inside your CONFIG_DIR named ms-scrobble.cache. When a Client is created and enabled in 0.14.0 it will attempt to automatically migrate scrobbles from this cache into the database. You can see progress/results for this process by filtering logs for [Cached Scrobble Migration] If the process fails MS will attempt to migrate failed scrobbles, again, the next time it is started Your cached scrobbles are not deleted in either the success or failure outcome If the process succeeds then MS knows to ignore the cache on subsequent startups note This process only occurs for Clients that are enabled. If you are using ENV for config then your Clients are automatically enabled If you are using File/AIO make sure that the enable property is either true or not present in your Client configs Even if your Client does not start successfully (EX due to authentication) you should still enable and start all Clients in order to get all scrobbled migrated.","s":"Cached Scrobble Migration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cached-scrobble-migration","p":617},{"i":625,"t":"In 0.14.0 Cache has been simplified with much of the required configuration being removed. tip This only applies to users who have cache in their AIO Config config.json or are using CACHE_* ENV Config If you do not have any of the above Cache configuration defined then you can ignore this section. Scrobble Caching Removed​ Scrobble caching has removed and replaced by the new database. Remove any ENV Config starting with CACHE_SCROBBLE Remove cache.scrobble from the AIO Config Metadata Config Simplified​ Metadata caching remains the same but the config has been simplified. If you were using Valkey for caching update your config: ENV AIO Remove CACHE_METADATA Rename CACHE_METADATA_CONN to CACHE_VALKEY Remove cache.metadata and add a new string key valkey to the cache object, containing your valkey connection string: \"cache\": { + \"valkey\": \"redis://valkey:6379\" - \"metadata\": { - \"provider\": \"valkey\", - \"connection\": \"redis://valkey:6379\" - } } Auth Config Simplified​ Auth caching remains the same but the config has been simplified. The connection option for Auth is no longer configurable. You may specify provider as either file (default, uses CONFIG_DIR) or valkey. If you want to use Valkey for auth it will use the same config as Metadata. ENV AIO Remove CACHE_AUTH_CONN Add CACHE_VALKEY (if using valkey) Remove the connection property from the auth object. If using file the entire auth object can be removed. \"cache\": { + \"valkey\": \"redis://valkey:6379\", \"auth\": { \"provider\": \"valkey\", - \"connection\": \"redis://valkey:6379\" } }","s":"Cache Configuration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cache-configuration","p":617},{"i":627,"t":"In an effort to standard ENV prefixes some ENV keys have been renamed: LZENDPOINT_ENABLE => LZE_ENABLE LFMENDPOINT_ENABLE => LFM_ENABLE","s":"Renamed ENV Keys","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#renamed-env-keys","p":617},{"i":629,"t":"In the MS Dashboard, prior to 0.14.0, UI Client/Sources configured with ENV Config always had generated names like unnamed-koito. ENV Config Clients/Sources can now be configured with a name by using the _NAME suffix, example: compose.yaml services: multi-scrobbler: # ... environment: - KOTIO_TOKEN=... # ... - KOITO_ID=myKoitoID - KOITO_NAME=Koito A - JELLYFIN_URL=... # .. - JELLYFIN_ID=myJellyfinID - JELLYFIN_NAME=Foxx Jelly important If you have cached scrobbles make sure to upgrade and run Cached Scrobble Migration before adding names to Client/Sources.","s":"(Optional) ENV Client/Source Names","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#optional-env-clientsource-names","p":617},{"i":631,"t":"The majority of changes are detailed in Github Release Notes, including most breaking changes. You should consult the release notes for each version you will be updating through/to. Upgrade paths for specific version, detailed here, are reserved for: Required Upgrades In Depth Upgrades Required Upgrade Versions you must upgrade to before upgrading to a newer version. Likely due to the codebase containing functionality to upgrade persistent data that cannot be migrating across multiple versions. Optional Upgrade (Breaking) Changes to configuration/data that require more detail or formatting than is feasible in Github release notes. These upgrades may be skipped. The type of upgrade is shown at the top of each page with the same colored callout shown above.","s":"Upgrade Path","u":"/multi-scrobbler/updating/upgrade-path/","h":"","p":630},{"i":633,"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":632},{"i":635,"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":632},{"i":638,"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":632},{"i":640,"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":632},{"i":642,"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":632},{"i":644,"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":632},{"i":646,"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":632},{"i":648,"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":632},{"i":651,"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":632},{"i":653,"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":632}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/2",[0,1.471,1,3.292,2,4.687,3,7.702,4,3.654,5,5.409,6,2.257,7,1.445,8,1.322,9,4.787,10,3.213,11,3.463]],["t/4",[6,2.186,9,4.636,10,3.112,11,3.354,12,1.424,13,3.806,14,4.059,15,1.189,16,5.394,17,4.059,18,5.098,19,5.566]],["t/7",[0,1.434,1,2.484,6,2.667,7,1.803,20,2.454,21,2.163,22,2.579,23,4.29,24,6.427,25,1.768,26,2.796,27,3.217,28,2.955,29,4.659,30,3.612,31,2.613,32,5.103,33,6.427,34,8.304,35,2.484,36,6.014,37,5.429,38,5.001,39,2.031,40,4.487,41,2.965,42,2.188,43,2.396,44,5.811,45,4.336,46,5.406,47,5.103,48,4.666,49,4.659,50,0.764,51,2.877,52,6.427,53,3.217,54,1.035,55,3.398,56,5.811,57,3.332,58,6.427,59,3.971,60,3.612,61,4.605,62,4.336,63,3.398,64,4.861,65,3.692,66,0.735,67,4.202,68,1.97]],["t/9",[0,1.323,7,1.799,20,2.926,23,3.381,31,3.115,69,1.097,70,1.127,71,7.664,72,7.011,73,6.446,74,5.35,75,7.913,76,5.01,77,5.556,78,4.866,79,2.637,80,2.149,81,4.132,82,3.381,83,3.591,84,3.333,85,7.664,86,4.866,87,4.306,88,3.976,89,5.17,90,7.664,91,7.664,92,6.084]],["t/11",[0,1.724,6,2.769,7,1.414,12,1.551,13,4.694,15,1.151,39,1.668,50,1.158,51,4.47,53,4.172,54,0.658,66,0.833,69,1.042,70,1.071,84,2.296,93,2.554,94,2.325,95,1.879,96,5.292,97,4.385,98,2.474,99,1.446,100,2.127,101,2.233,102,4.407,103,0.477,104,3.523,105,2.791,106,5.278,107,1.9,108,1.198,109,5.279,110,5.279,111,3.561,112,3.993,113,1.566,114,2.905,115,1.36,116,1.651,117,3.18,118,3.85,119,2.791,120,2.814,121,3.262,122,3.352,123,3.262,124,2.329,125,3.685,126,5.279,127,1.51,128,1.498,129,2.062,130,1.517,131,2.739,132,4.191,133,4.191,134,2.264,135,1.323,136,7.281,137,1.373,138,2.296,139,2.885,140,1.634,141,2.363,142,3.993,143,5.279]],["t/13",[22,3.533,66,1.007,144,4.332,145,6.147,146,3.403]],["t/15",[0,1.089,7,0.818,8,1.453,9,2.092,10,0.835,12,1.491,15,1.172,17,1.089,20,0.845,21,1.866,26,1.903,28,2.244,39,1.523,50,0.749,54,1.022,66,1.144,68,0.678,69,0.317,70,0.548,76,2.434,83,1.037,97,1.333,99,1.123,100,1.443,101,0.936,103,0.536,107,0.796,108,1.43,113,1.216,115,0.57,116,1.972,119,1.17,120,0.855,124,0.976,127,1.065,128,1.986,129,2.445,130,1.757,135,1.208,137,0.968,138,0.962,139,0.877,142,2.816,144,1.832,147,2.011,148,2.351,149,3.645,150,2.012,151,2.276,152,1.621,153,3.695,154,1.764,155,1.673,156,0.753,157,0.855,158,1.545,159,2.213,160,1.405,161,2.213,162,1.755,163,1.148,164,1.108,165,1.317,166,0.707,167,2.708,168,2.777,169,4.484,170,1.367,171,1.493,172,1.405,173,1.959,174,1.333,175,2.371,176,3.723,177,1.735,178,1.271,179,0.652,180,1.053,181,1.333,182,0.991,183,1.757,184,1.757,185,1.604,186,2.001,187,2.213,188,3.102,189,1.405,190,2.213,191,2.213,192,1.673,193,0.835,194,3.493,195,1.643,196,3.645,197,1.404,198,2.512,199,2.903,200,1.802,201,1.254,202,1.824,203,3.702,204,2.53,205,0.645,206,2.213,207,1.457,208,2.213,209,0.761,210,1.604,211,1.127,212,1.301,213,1.555,214,1.545,215,1.757,216,2.067,217,1.494,218,3.366,219,1.863,220,3.798,221,2.956,222,1.367,223,1.604,224,1.053,225,0.77,226,3.645,227,1.447,228,2.001,229,3.176,230,5.11,231,2.011,232,2.012,233,4.82,234,1.943,235,4.358,236,1.416,237,3.06,238,3.4,239,4.054,240,2.213,241,2.213,242,2.213,243,1.673,244,2.213,245,1.243,246,0.888,247,1.253,248,1.086,249,2.213,250,0.845,251,1.493,252,2.213,253,0.815,254,0.787,255,1.271,256,1.333,257,1.405,258,1.148,259,1.864,260,2.213,261,2.001,262,2.213,263,2.213,264,1.493,265,2.001,266,0.877,267,2.213,268,2.213,269,1.757,270,2.001,271,2.933,272,2.001,273,2.001,274,1.757,275,1.861,276,2.903,277,2.213,278,2.001,279,1.217,280,1.861,281,1.861,282,1.861,283,2.213,284,2.903,285,3.723,286,3.723,287,3.723,288,2.213,289,1.513,290,1.861,291,0.714,292,2.213,293,1.604,294,1.447,295,1.604,296,1.493,297,1.193,298,1.757,299,2.213,300,1.757,301,1.757,302,1.545,303,2.001,304,1.861,305,2.213,306,0.835,307,2.213,308,2.048,309,1.861,310,1.177,311,1.673,312,1.861,313,2.001,314,2.213,315,2.001,316,2.213,317,1.089,318,1.053,319,1.545,320,1.545,321,1.447,322,1.604,323,1.108,324,1.301,325,1.861]],["t/17",[0,1.739,7,1.597,26,2.647,28,2.797,50,1.198,66,1.221,103,0.45,135,1.97,154,1.821,166,2.51,203,4.005,217,3.154,259,4.712,324,5.533,326,3.519,327,6.611,328,2.142,329,5.699]],["t/19",[0,1.177,8,1.059,10,2.573,12,1.746,15,1.135,23,2.121,27,2.407,50,0.572,54,0.988,57,1.929,59,2.971,66,0.78,69,1.354,70,1.392,78,3.053,103,0.579,108,1.957,113,1.034,122,4.331,128,1.874,129,1.362,130,0.875,133,5.415,134,2.925,147,3.241,148,3.255,151,2.873,156,2.321,168,1.954,182,2.153,188,2.366,200,2.327,204,1.929,212,2.826,222,4.214,227,4.459,238,3.677,247,2.061,266,1.905,276,4.774,289,1.954,294,3.143,296,3.244,297,3.677,310,1.52,330,7.926,331,1.602,332,4.347,333,4.808,334,2.896,335,3.817,336,3.486,337,2.826,338,2.971,339,2.321,340,3.677,341,2.702,342,6.82,343,2.327,344,3.053,345,4.808,346,4.113,347,4.808,348,4.601,349,2.091,350,2.592,351,4.808,352,4.808,353,2.45,354,4.808,355,4.808,356,2.153,357,2.762,358,3.636,359,2.007,360,1.969,361,1.792,362,2.971,363,2.253,364,4.009,365,3.357,366,2.091,367,4.347,368,2.091,369,2.971,370,4.808,371,4.808,372,4.808,373,4.808,374,4.808,375,2.289,376,4.808]],["t/21",[8,1.016,15,0.698,21,1.538,28,2.328,57,2.625,66,1.061,99,1.669,103,0.56,105,3.459,108,1.484,113,1.806,138,2.845,152,1.552,157,2.528,162,2.382,168,2.659,179,1.926,195,4.093,205,1.908,209,2.251,234,2.771,289,2.659,297,3.527,377,6.428,378,2.497,379,5.732,380,3.676,381,5.915,382,5.502,383,8.388,384,5.194,385,6.668,386,4.825,387,2.659,388,3.76,389,4.742,390,4.413,391,6.542,392,5.915,393,6.542,394,6.542,395,6.542,396,6.542,397,6.542,398,6.542,399,6.542,400,6.542,401,6.542,402,6.542,403,6.542,404,6.542,405,6.542]],["t/23",[2,5.123,7,1.502,12,0.881,15,1.129,21,1.2,25,2.252,30,5.992,54,1.02,61,2.554,66,1.103,67,3.336,69,1.018,70,1.046,80,1.431,82,2.251,86,5.198,88,3.69,99,1.413,103,0.533,105,3.76,108,1.158,113,1.097,116,1.596,128,1.463,129,1.445,130,0.929,135,1.279,138,2.22,168,2.074,169,4.18,179,2.094,182,2.284,219,3.163,248,1.488,253,3.552,254,1.816,257,3.24,350,2.751,353,3.623,378,1.948,406,2.698,407,3.442,408,4.649,409,5.473,410,2.189,411,4.051,412,4.292,413,3.562,414,1.58,415,3.699,416,5.714,417,4.614,418,4.614,419,5.443,420,5.103,421,5.103,422,2.429,423,4.18,424,5.103,425,5.103,426,2.751,427,2.698,428,2.751,429,3.336,430,4.614,431,4.614,432,4.292,433,5.103,434,3.699,435,4.292,436,5.103,437,5.103,438,4.965,439,3.442,440,4.965,441,4.614,442,3,443,3.336,444,5.103]],["t/25",[2,5.055,8,0.864,12,0.961,15,1.16,30,4.815,31,2.263,50,0.662,54,1.068,66,0.637,69,1.45,70,1.49,86,3.536,88,2.889,93,2.694,100,1.421,101,2.355,103,0.526,108,1.263,115,1.434,129,1.577,167,3.129,168,3.483,178,4.338,179,2.523,180,3.595,182,2.493,197,2.848,202,1.797,224,2.651,248,1.624,253,2.051,254,1.981,349,2.422,350,3.002,360,2.18,415,4.036,416,5.271,435,4.683,438,3.887,440,7.07,442,5.401,443,3.64,445,2.152,446,3.64,447,5.271,448,5.568,449,4.683,450,5.568,451,5.568,452,5.568,453,3.198,454,2.651,455,5.568,456,5.568,457,4.338,458,4.211,459,5.034,460,6.351,461,6.351,462,4.683,463,4.683,464,5.034,465,3.727,466,4.036,467,5.568,468,5.568,469,5.568]],["t/27",[2,4.926,4,3.105,6,2.372,28,3.186,39,2.288,60,4.068,66,1.024,69,1.282,70,1.317,80,2.031,82,3.194,113,1.557,146,2.798,162,2.636,165,1.687,166,2.312,196,5.475,203,3.689,220,4.36,232,2.132,380,4.068,426,3.903,428,3.903,470,4.256,471,6.546,472,5.516,473,6.546,474,3.392,475,4.733,476,3.446,477,4.068,478,4.733,479,4.884,480,4.597,481,3.983,482,4.474,483,7.24,484,5.248]],["t/29",[0,1.048,2,4.21,6,2.774,7,1.227,8,0.635,11,1.664,15,1.142,21,1.229,28,2.574,31,1.664,39,0.784,50,0.86,51,1.11,54,1.136,55,2.164,60,2.938,61,1.241,66,0.948,69,0.962,70,1.064,76,2.676,77,6.486,78,2.599,99,1.334,103,0.544,108,0.929,113,0.533,115,1.055,125,1.731,127,1.495,129,1.159,146,0.958,150,1.708,154,1.3,157,1.582,165,0.578,166,0.792,179,0.73,197,0.935,198,2.761,205,1.77,213,2.675,219,2.02,220,1.493,231,0.882,236,0.621,247,1.064,248,1.77,251,2.761,253,2.818,254,0.882,258,1.286,279,2.252,280,6.727,289,1.664,309,2.085,311,3.096,319,6.246,328,0.676,338,2.529,349,1.078,353,1.263,407,1.673,408,1.621,422,1.18,441,2.242,472,4.15,481,1.364,485,2.761,486,5.333,487,2.479,488,2.242,489,2.858,490,2.479,491,1.797,492,2.124,493,2.599,494,3.25,495,3.362,496,1.875,497,4.093,498,1.731,499,1.393,500,2.479,501,2.479,502,2.479,503,5.487,504,2.489,505,3.443,506,1.424,507,6.782,508,2.479,509,2.764,510,10.028,511,4.397,512,5.228,513,4.727,514,2.479,515,5.487,516,2.479,517,5.228,518,2.479,519,2.207,520,3.701,521,2.479,522,2.479,523,2.479,524,1.968,525,2.479,526,2.479,527,2.479,528,7.651,529,7.723,530,7.677,531,2.242,532,1.968,533,1.708,534,2.085,535,1.875,536,2.479,537,2.479,538,2.085,539,1.393,540,2.479,541,1.731,542,2.085,543,2.479,544,2.479,545,8.696,546,2.858,547,4.093,548,5.104,549,3.25,550,4.093,551,2.761,552,2.479,553,2.479,554,2.479,555,2.479,556,3.853,557,2.479,558,4.093,559,2.479,560,2.479,561,2.479,562,0.826,563,4.093,564,1.673,565,2.967,566,3.701,567,1.393,568,2.479,569,1.968,570,1.731,571,1.968,572,2.085,573,2.479,574,2.479,575,2.085,576,4.093,577,0.958,578,2.479,579,2.479,580,2.858,581,2.085,582,2.479,583,2.479,584,2.479,585,2.479,586,2.479,587,2.479,588,4.093]],["t/31",[15,1.111,50,0.854,51,3.216,57,3.887,60,5.85,66,0.821,100,2.274,103,0.51,108,1.629,113,2.083,129,2.034,135,2.233,137,1.868,146,2.776,171,4.846,248,2.598,266,2.846,270,6.495,390,4.846,481,4.902,589,5.825,590,3.485,591,5.657,592,7.183,593,6.041,594,6.495,595,7.183,596,6.495,597,2.81,598,5.432]],["t/33",[25,2.118,39,2.432,50,1.105,59,4.755,84,3.347,103,0.532,106,7.238,108,1.746,127,2.201,128,1.584,137,2.001,152,1.826,182,3.445,209,2.648,231,2.739,255,4.421,272,6.958,276,4.635,363,3.606,531,6.958,599,4.234,600,6.17,601,5.82,602,7.696,603,3.445,604,3.445,605,4.755,606,7.696,607,4.524]],["t/36",[10,2.879,11,3.102,21,1.795,22,3.71,25,2.914,63,4.889,77,5.533,95,3.29,101,3.229,103,0.437,118,4.035,162,2.779,179,2.93,220,4.596,254,2.716,259,3.82,489,5.328,603,3.417,608,6.059,609,5.149,610,7.632,611,6.9,612,7.632,613,6.9,614,4.486,615,7.632,616,5.328,617,7.632]],["t/38",[0,1.143,7,1.123,8,1.314,12,1.611,15,1.19,28,1.642,50,1.006,59,2.851,66,0.886,69,1.109,70,1.14,75,3.664,76,4.33,81,2.488,86,4.206,96,4.206,101,3.277,113,1.424,124,2.036,127,1.32,128,0.95,129,1.307,130,1.41,135,2.121,142,6.402,154,1.86,193,1.741,198,4.468,231,1.642,234,2.264,245,2.593,248,2.614,265,7.005,276,5.099,302,6.514,303,4.172,304,7.12,306,2.498,308,4.658,309,3.881,310,2.833,311,3.49,312,6.516,313,4.172,315,4.172,317,2.27,318,2.197,319,3.221,320,3.221,324,4.554,356,2.066,380,2.593,603,2.066,607,2.713,618,4.172,619,5.859,620,3.49,621,5.065,622,3.345,623,6.623,624,4.614,625,4.614,626,4.614,627,4.614,628,5.57,629,5.988,630,4.614,631,4.614,632,4.614,633,4.614,634,4.614,635,5.988,636,4.614,637,6.623,638,3.277,639,4.33,640,4.614,641,4.614,642,4.614,643,4.614,644,4.614]],["t/40",[12,1.184,50,0.815,95,2.441,103,0.393,118,4.577,119,3.627,146,2.651,149,6.547,151,2.285,154,1.327,165,1.599,220,4.132,223,4.973,231,2.441,234,1.835,259,3.434,289,2.789,310,2.168,329,4.973,359,2.863,378,3.305,410,2.942,498,4.789,556,4.356,621,5.66,628,5.77,638,2.902,645,5.77,646,6.86,647,4.901,648,5.446,649,5.446,650,5.188,651,10.271,652,4.485,653,4.356,654,5.77,655,8.576,656,8.657,657,7.827,658,6.86,659,4.485,660,6.86,661,6.86,662,4.789,663,5.77,664,5.77,665,2.527,666,3.375]],["t/42",[0,1.098,6,1.685,7,1.079,8,0.987,15,1.034,30,3.574,50,0.756,66,0.727,69,0.911,70,0.936,78,4.039,84,3.981,100,1.623,103,0.364,108,1.443,128,1.309,146,2.458,151,2.119,157,2.458,164,3.184,166,2.031,189,4.039,203,4.202,236,1.594,259,3.184,280,5.349,326,2.847,328,1.733,413,4.44,511,6.937,597,2.489,638,2.691,667,9.153,668,6.36,669,9.073,670,3.831,671,6.175,672,6.36,673,4.81,674,4.291,675,3.499,676,3.739,677,3.739,678,6.36,679,4.538,680,6.36,681,3.574,682,4.611,683,6.36,684,8.248,685,6.36,686,6.36,687,3.864,688,6.36,689,6.36,690,6.36,691,6.36,692,6.36,693,6.36,694,6.36,695,8.248,696,4.039,697,6.36,698,5.349,699,6.36,700,6.36]],["t/44",[6,2.186,13,3.806,14,4.766,69,1.181,70,1.425,93,3.992,95,2.936,98,3.866,103,0.472,113,1.774,154,1.596,539,4.636,665,3.039,701,5.239,702,5.394,703,4.739,704,5.566]],["t/46",[1,3.41,14,5.099,23,3.893,103,0.55,113,1.521,120,2.733,131,3.669,146,2.733,150,2.952,165,2.056,173,2.875,197,2.668,200,3.422,201,2.381,202,2.282,257,4.491,321,4.623,323,4.417,349,3.076,368,3.838,454,3.367,465,3.076,495,3.54,580,4.937,601,5.348,659,4.623,701,4.491,702,4.623,703,4.062,705,4.259,706,7.072,707,7.072,708,2.668,709,5.348,710,6.714,711,5.615,712,6.394,713,4.157,714,5.615,715,5.615,716,5.615,717,5.127,718,2.488]],["t/48",[1,3.592,14,5.223,23,3.396,25,2.118,103,0.571,113,1.655,120,2.974,131,3.993,165,2.166,200,3.724,202,2.483,236,1.929,306,2.903,368,3.347,701,4.887,702,5.031,703,5.339,709,5.82,710,6.488,719,7.378,720,7.696,721,2.708,722,6.11,723,5.82]],["t/50",[1,3.012,6,2.065,13,3.596,14,4.94,22,3.128,23,3.439,63,4.121,69,1.116,70,1.378,87,4.38,93,3.771,95,2.774,98,3.652,103,0.536,113,2.014,144,3.835,200,3.771,368,3.39,665,2.871,701,5.946,702,6.122,703,4.477,710,5.441,724,5.441,725,6.188]],["t/53",[0,1.301,1,3.547,12,1.301,14,4.515,15,0.979,69,1.079,70,1.109,79,2.594,103,0.431,108,1.71,128,1.551,130,1.801,141,3.374,166,2.93,172,4.786,232,2.914,368,3.992,597,2.949,703,4.33,726,5.7,727,4.54,728,3.985,729,6.34,730,2.484,731,2.652,732,2.511,733,2.334,734,5.464,735,5.984,736,5.7,737,6.815]],["t/55",[0,0.618,1,2.121,6,0.397,8,0.413,12,1.152,13,0.692,14,4.996,15,1.08,21,2.273,23,1.173,26,0.895,28,0.534,35,2.121,39,0.474,48,0.843,50,0.426,51,1.19,55,1.406,63,0.793,66,0.724,67,0.98,68,0.46,69,0.906,70,0.874,82,2.422,88,0.778,99,0.298,103,0.562,104,1.287,108,0.603,113,0.932,115,1.414,116,2.522,128,1.021,130,0.273,135,0.376,141,0.671,146,0.579,148,1.233,150,1.495,152,0.356,162,2.801,163,4.183,165,1.01,167,1.494,168,3.833,169,0.881,173,2.414,179,1.864,180,2.828,181,0.903,182,3.681,188,2.133,193,1.003,197,2.24,201,0.505,204,1.437,209,1.707,211,1.355,212,0.881,213,0.484,216,1.536,217,0.602,219,1.028,224,1.266,236,1.243,246,0.602,256,0.903,259,0.751,266,0.594,276,0.903,284,0.903,318,0.714,334,0.903,338,0.927,350,3.203,359,2.479,363,0.703,364,0.881,366,0.652,378,1.655,387,1.762,388,3.681,406,0.793,408,0.98,409,0.881,410,1.14,419,0.825,438,2.501,442,4.255,443,4.362,454,1.705,458,3.278,465,2.387,470,0.881,480,0.952,485,1.012,491,4.306,495,0.751,519,1.931,533,1.495,551,3.346,597,2.832,601,2.709,603,3.747,604,0.671,609,2.417,619,2.011,620,1.134,622,1.087,673,6.432,675,0.825,676,2.106,698,1.261,701,0.952,702,0.98,703,0.861,705,1.601,708,1.003,709,1.134,710,1.047,711,2.844,713,3.721,714,3.938,715,2.844,718,0.936,721,0.528,728,0.793,732,0.499,735,1.19,738,3.283,739,1.355,740,2.436,741,2.659,742,2,743,3.92,744,1.356,745,1.047,746,1.499,747,1.859,748,3.239,749,1.287,750,1.261,751,1.261,752,1.499,753,1.19,754,1.012,755,1.38,756,1.475,757,0.98,758,1.499,759,1.356,760,1.356,761,1.19,762,1.499,763,1.499,764,2.659,765,1.563,766,0.843,767,1.499,768,1.261,769,1.499,770,0.559,771,1.261,772,2.611,773,1.261,774,1.356,775,4.492,776,6.645,777,5.273,778,0.952,779,5.611,780,0.534,781,0.738,782,1.261,783,1.32,784,2.404,785,8.64,786,1.356,787,3.013,788,0.98,789,1.356,790,1.356,791,1.356,792,1.356,793,2.236,794,1.356,795,1.356,796,3.239,797,1.356,798,1.356,799,2.404,800,1.356,801,1.356,802,2.404,803,1.356,804,1.356,805,2.404,806,2.404,807,2.404,808,1.356,809,1.356,810,1.356,811,1.356,812,1.356,813,2.404,814,2.404,815,0.714,816,1.19,817,3.226,818,0.793,819,1.356,820,1.356,821,1.356,822,3.026,823,1.356,824,1.047,825,0.903,826,1.134,827,1.356,828,0.469,829,1.705,830,3.92,831,3.703,832,4.306,833,2.659,834,2.659,835,2.659,836,2.659,837,4.335,838,3.278,839,2.659,840,2.659,841,2.659,842,2.659,843,2.659,844,5.94,845,3.268,846,5.94,847,1.356,848,1.261,849,1.499,850,1.499,851,1.499,852,0.534,853,1.499,854,2.659,855,1.499,856,1.499,857,1.499,858,4.962,859,3.582,860,6.469,861,2.709,862,3.239,863,2.158,864,2.753,865,3.239,866,2.844,867,6.304,868,2.404,869,3.239,870,3.582,871,2.659,872,2.844,873,2.659,874,2.659,875,3.582,876,1.499,877,0.927,878,1.087,879,1.499,880,1.499,881,1.499,882,1.499,883,0.98,884,1.499,885,0.867,886,1.356,887,1.499,888,1.499,889,1.356,890,1.499,891,0.952,892,1.19,893,1.012,894,3.582,895,1.087,896,2.659,897,0.764,898,1.499,899,1.499,900,1.499]],["t/57",[14,4.211,21,2.012,103,0.49,116,3.095,168,3.479,173,3.479,211,4.36,603,3.831,755,4.441,772,5.155]],["t/59",[8,1.119,12,1.428,14,2.561,15,1.155,21,1.224,23,2.296,55,2.752,66,0.595,69,1.032,70,1.061,103,0.473,108,1.181,113,1.119,115,2.131,168,3.362,169,3.059,179,2.436,180,3.432,181,3.134,182,3.228,197,2.719,236,2.238,318,2.477,350,2.806,388,3.228,438,5.775,442,5.703,443,5.408,458,5.452,597,3.669,604,2.33,673,5.452,708,1.963,735,4.132,743,7.479,747,2.7,748,6.519,773,4.377,774,4.705,775,5.452,776,6.567,777,6.256,778,3.305,779,4.377,780,1.852,781,2.561,782,4.377,783,2.656,784,4.705,785,4.705,786,4.705,787,6.064,788,3.402,789,4.705,790,4.705,791,4.705,792,4.705,793,4.377,794,4.705,795,4.705,796,7.479,797,4.705,798,4.705,799,6.519,800,4.705,801,4.705,802,6.519,803,4.705,804,4.705,805,6.519,806,6.519,807,6.519,808,4.705,809,4.705,810,4.705,811,4.705,812,4.705,813,6.519,814,6.519,815,2.477,816,4.132]],["t/61",[6,1.933,13,3.367,14,4.427,15,1.041,21,2.294,51,3.267,69,1.045,82,3.22,88,3.786,103,0.418,108,1.655,113,1.935,135,1.829,162,2.657,173,2.966,179,2.149,211,3.718,213,2.355,236,1.829,359,3.046,378,2.786,388,3.267,419,4.015,465,3.174,620,5.519,622,5.29,675,4.015,747,3.786,787,6.138,793,6.138,817,5.734,818,3.858,819,6.598,820,6.598,821,6.598,822,5.094,823,6.598,824,5.094,825,4.395,826,5.519]],["t/63",[14,4.096,25,2.291,35,3.217,48,4.678,118,4.402,120,3.217,131,4.32,167,5.472,246,3.341,259,4.167,266,3.298,703,4.782,710,5.812,723,6.296,863,5.014,901,4.894]],["t/65",[4,2.244,6,0.892,7,1.089,8,0.812,14,3.158,15,1.107,21,2.105,23,1.486,39,1.064,43,2.921,50,0.86,54,0.652,66,0.598,69,0.919,70,0.944,82,1.486,84,2.276,99,1.648,103,0.563,104,1.63,106,2.441,108,1.187,113,1.685,115,1.348,116,1.053,118,2.767,128,1.077,130,1.168,131,2.715,137,1.361,139,1.334,140,3.084,141,2.343,154,0.652,156,1.146,164,1.686,165,0.785,175,3.561,179,2.55,180,3.949,193,1.27,197,3.129,199,2.028,204,2.1,205,0.982,209,1.159,211,1.716,219,1.302,232,0.992,234,2.831,236,1.311,254,1.862,259,1.686,349,1.465,366,1.465,369,2.081,378,1.286,386,5.832,387,2.942,408,5.66,414,1.62,474,1.578,491,2.441,499,1.892,533,1.406,541,2.351,556,2.138,603,1.508,609,4.33,665,2.364,675,1.853,708,2.421,733,1.62,756,1.387,765,1.98,866,5.095,897,2.666,902,1.198,903,6.784,904,7.818,905,3.045,906,3.045,907,5.852,908,2.674,909,2.547,910,1.892,911,4.155,912,2.674,913,3.045,914,2.833,915,4.401,916,3.045,917,3.045,918,6.592,919,5.746,920,1.781,921,2.833,922,4.732,923,3.045,924,5.803,925,3.045,926,3.045,927,3.045,928,5.803,929,4.732,930,3.045,931,4.732,932,3.045,933,3.045,934,5.052,935,2.833,936,3.323,937,3.773,938,1.747,939,1.98,940,2.547,941,1.318,942,2.351,943,3.045,944,3.045,945,3.045,946,2.674]],["t/67",[0,1.57,1,1.258,8,1.496,12,1.084,14,4.578,15,1.114,43,1.213,50,0.387,54,0.635,66,1.04,68,1.561,79,1.753,80,1.429,99,1.012,100,1.813,103,0.506,107,1.171,108,1.156,115,0.838,127,1.457,128,2.011,129,0.922,130,1.917,137,1.325,139,2.019,140,1.577,147,1.158,148,1.12,151,2.366,152,1.49,154,1.583,165,0.758,177,2.944,180,1.549,194,2.011,201,1.096,205,1.486,213,1.644,225,3.079,232,2.092,234,1.679,247,0.846,248,1.831,250,1.242,271,1.688,291,1.05,310,1.61,328,1.389,331,1.697,339,2.784,360,2.227,361,2.34,408,2.127,414,1.577,445,1.969,562,2.091,577,1.969,590,2.815,705,3.068,718,2.878,721,1.793,730,1.679,732,1.697,733,2.532,736,3.853,740,1.829,770,1.899,775,2.461,776,2.584,777,2.461,779,2.737,780,1.813,783,1.877,828,1.594,845,1.79,852,1.813,872,2.584,885,1.661,902,2.91,903,2.272,904,2.584,919,2.584,920,1.721,947,1.258,948,4.607,949,1.158,950,1.273,951,2.942,952,1.273,953,1.185,954,2.942,955,2.942,956,2.995,957,2.272,958,2.011,959,2.942,960,2.461,961,1.273,962,1.922,963,1.993,964,1.945,965,1.922,966,3.042,967,1.922,968,2.779,969,1.993,970,1.993,971,1.773,972,1.793,973,1.993,974,1.096,975,2.909,976,1.108,977,4.607,978,1.877,979,1.945,980,1.945,981,1.793,982,1.922,983,1.993,984,1.877,985,5.095,986,4.285,987,5.095,988,5.095,989,1.132,990,1.227,991,1.171,992,1.242,993,1.258]],["t/69",[1,1.961,6,1.877,13,2.341,14,4.86,21,2.185,22,2.036,25,2.246,31,3.317,35,1.961,54,0.633,63,2.683,69,1.378,70,1.453,82,2.239,87,2.852,93,2.455,95,2.521,98,2.378,99,1.008,103,0.551,104,2.455,113,1.523,118,3.746,120,3.591,131,2.633,144,2.497,150,2.118,152,1.204,162,1.848,165,1.651,193,3.078,200,2.455,204,2.036,209,3.04,236,1.775,306,1.914,363,3.319,368,3.081,406,2.683,454,2.416,470,2.983,477,2.306,519,2.736,533,2.118,614,2.983,653,3.222,665,1.869,676,2.983,679,2.792,681,5.551,701,4.498,702,6.458,703,2.915,710,4.945,722,4.029,723,3.838,724,3.542,725,4.029,738,2.497,749,2.455,756,2.09,824,3.542,829,2.416,981,1.786,990,1.914,994,5.074,995,5.074,996,5.074,997,3.679,998,5.609,999,5.074,1000,5.074,1001,5.074,1002,5.074,1003,5.074,1004,4.588,1005,3.317,1006,4.588,1007,4.588,1008,4.798,1009,3.679,1010,4.029,1011,3.838,1012,5.958,1013,3.679,1014,4.588,1015,3.838,1016,3.542,1017,4.588,1018,4.268,1019,3.222]],["t/72",[14,5.171,21,1.431,25,1.674,38,4.826,47,4.832,70,0.895,79,2.094,89,4.106,98,2.851,103,0.566,141,2.724,162,2.918,165,1.418,179,1.792,207,2.381,216,2.61,217,2.442,219,3.097,236,2.634,251,4.106,258,3.158,306,4.08,324,3.577,326,2.724,332,5.502,366,2.647,375,2.897,378,2.323,495,3.046,519,3.281,529,5.502,679,3.348,708,2.295,709,4.602,722,4.832,723,4.602,755,4.158,775,6.06,817,3.577,829,2.897,832,5.809,861,4.602,964,3.059,1020,6.086,1021,6.362,1022,5.118,1023,6.086,1024,6.086,1025,4.602,1026,6.086,1027,4.832,1028,3.76,1029,6.086,1030,3.158,1031,5.239,1032,5.118,1033,4.832,1034,7.535,1035,6.086]],["t/75",[8,1.023,12,1.332,14,4.151,15,1.108,21,2.386,31,1.862,35,3.921,39,1.447,54,0.821,65,2.631,66,1.022,83,2.146,99,0.91,100,1.681,103,0.441,104,3.187,108,1.494,113,1.417,114,3.624,116,1.433,118,4.461,120,4.047,137,1.713,138,1.992,140,2.767,142,4.982,154,1.632,164,2.292,193,1.727,204,1.838,205,1.335,236,1.148,247,1.191,256,2.758,289,3.429,306,2.485,323,3.297,363,3.087,368,3.356,454,2.18,474,2.146,484,3.32,676,2.692,681,5.389,701,2.908,702,6.27,723,7.253,730,1.509,733,1.418,736,4.982,756,2.713,778,2.908,838,3.464,911,3.636,976,2.872,986,5.54,998,4.183,1006,4.141,1007,4.141,1008,3.872,1012,3.852,1018,7.518,1022,3.852,1036,3.32,1037,3.852,1038,7.715,1039,6.587,1040,6.38,1041,5.956,1042,4.58,1043,4.58,1044,4.141,1045,4.775,1046,4.141,1047,4.58,1048,4.58,1049,2.83,1050,2.994,1051,4.58,1052,4.58]],["t/77",[0,1.23,1,3.73,12,1.23,14,4.362,15,0.946,43,2.656,69,1.02,70,1.048,79,2.453,98,3.339,100,1.819,103,0.408,108,1.617,118,3.768,128,1.467,130,1.756,131,3.698,166,3.082,172,4.526,180,3.393,202,2.3,232,2.842,368,3.857,416,4.975,453,4.094,597,2.789,701,4.526,702,4.659,726,5.39,727,4.293,728,3.768,729,5.994,730,2.349,731,2.508,732,2.374,733,2.207,734,5.167,735,5.658,736,5.39,737,6.444,903,4.975,910,4.005,934,4.975]],["t/79",[1,2.938,4,2.135,6,0.837,7,1.045,8,0.773,14,4.159,15,1.095,21,2.059,23,1.394,29,2.29,39,0.998,43,2.834,50,0.831,54,0.62,66,1.002,69,0.882,70,0.906,82,1.394,84,2.165,99,1.74,103,0.562,104,1.528,106,2.29,108,1.129,113,1.635,115,1.282,116,0.988,118,3.256,128,1.024,130,1.121,131,3.196,137,1.294,139,1.252,140,3.042,141,2.228,154,0.611,156,1.075,164,1.581,165,0.736,175,3.439,179,2.489,180,4.169,193,1.191,197,3.046,199,1.902,204,1.997,205,0.921,209,1.087,211,1.609,219,1.221,232,2.378,234,2.818,236,1.247,246,1.268,254,1.771,259,1.581,349,1.374,366,1.374,369,1.952,378,1.206,386,5.761,387,2.841,408,5.526,414,1.907,474,1.48,491,2.29,499,1.775,533,1.318,541,2.205,556,2.006,603,1.414,609,4.155,665,2.269,675,1.738,708,2.323,733,1.541,756,1.301,765,1.857,866,4.89,897,2.536,902,1.771,903,6.774,904,7.885,905,2.856,906,2.856,907,5.726,908,2.508,909,2.389,910,1.775,911,3.951,912,2.508,913,2.856,914,2.657,915,4.186,916,2.856,917,2.856,918,6.395,919,5.548,920,1.67,921,2.657,922,4.5,923,2.856,924,5.569,925,2.856,926,2.856,927,2.856,928,5.569,929,4.5,930,2.856,931,4.5,932,2.856,933,2.856,934,4.879,935,2.657,936,3.16,937,3.62,938,1.639,939,1.857,940,2.389,941,1.236,942,2.205,943,2.856,944,2.856,945,2.856,946,2.508,972,1.111]],["t/81",[0,1.555,1,1.219,8,1.484,12,1.205,14,4.705,15,1.079,21,0.741,31,1.282,35,1.219,43,1.853,50,0.375,54,0.62,66,1.03,68,1.523,79,1.71,80,1.394,99,0.987,100,1.782,103,0.515,107,1.135,108,1.128,115,0.812,116,0.986,120,1.921,127,1.421,128,1.968,129,0.893,130,1.909,137,1.292,139,2.437,140,2.162,147,1.122,148,1.085,151,2.326,152,1.46,154,1.562,165,0.735,177,2.905,180,1.501,201,1.062,205,1.449,213,1.604,225,3.046,232,2.056,234,1.645,236,0.79,247,0.82,248,1.794,250,1.204,271,1.636,291,1.017,306,2.32,310,1.571,328,1.355,331,1.656,339,2.747,360,2.439,361,2.293,408,2.062,414,1.539,445,1.921,562,2.049,577,1.921,590,2.777,702,3.249,718,2.84,721,1.749,730,1.638,732,1.656,733,2.499,736,3.759,770,1.853,775,2.385,780,1.769,783,1.831,828,1.555,852,1.769,885,1.621,902,3.006,903,3.47,904,2.504,919,2.504,920,1.667,947,1.219,948,4.494,949,1.122,950,1.234,951,2.851,952,1.234,953,1.148,954,2.851,955,2.851,956,2.922,957,2.201,958,3.071,959,2.851,960,2.385,961,1.234,962,1.875,963,1.945,964,1.898,965,1.875,966,3.006,967,1.875,968,2.732,969,1.945,970,1.945,971,1.729,972,1.749,973,1.945,974,1.062,975,2.865,976,1.073,977,4.494,978,1.831,979,1.898,980,1.898,981,1.749,982,1.875,983,1.945,984,1.831,986,4.18,989,1.097,990,1.189,991,1.135,992,1.204,993,1.219,998,2.002,1040,2.385,1041,4.494,1053,3.153,1054,2.851,1055,3.153,1056,3.153,1057,3.153,1058,3.153,1059,3.153,1060,4.97]],["t/83",[7,1.228,8,1.288,12,0.904,15,0.772,17,5.301,21,1.231,23,2.309,25,2.283,26,1.762,27,2.62,39,2.97,48,2.941,50,0.622,65,3.007,69,1.036,70,1.065,84,3.609,95,1.863,103,0.581,104,2.533,113,1.925,115,1.865,120,2.023,144,2.575,148,1.801,165,1.22,166,2.649,173,2.128,182,2.343,200,2.533,201,1.762,205,2.111,207,2.048,224,2.492,231,2.576,234,2.843,246,2.1,317,2.575,328,1.426,329,3.794,356,4.207,476,2.492,708,3.13,731,1.842,732,2.411,815,2.492,818,2.767,825,3.152,845,3.982,864,3.323,872,4.155,920,2.767,942,5.053,1049,3.234,1061,4.155,1062,3.794,1063,3.323,1064,4.732,1065,4.732,1066,4.732,1067,3.794,1068,6.56,1069,6.544,1070,5.234,1071,5.234,1072,7.238,1073,7.238,1074,5.234,1075,5.234,1076,7.238,1077,5.234,1078,4.732,1079,4.732,1080,4.732,1081,3.654,1082,4.732,1083,4.732]],["t/85",[0,1.697,7,0.881,8,1.505,12,1.101,15,1.09,17,4.771,50,0.397,54,0.648,66,1.048,68,1.592,79,1.788,80,1.457,99,0.663,100,1.326,103,0.447,107,1.201,108,1.179,115,0.86,127,1.486,128,1.995,129,0.945,130,1.924,134,2.229,137,0.868,140,1.033,147,1.188,148,1.148,151,2.399,152,1.514,154,1.599,165,0.778,177,2.975,201,1.124,205,1.515,213,1.677,225,3.105,231,1.188,232,1.879,234,1.706,236,1.599,247,0.868,248,1.861,250,1.274,291,1.077,306,2.407,310,1.642,317,3.139,328,1.416,331,1.731,339,2.813,360,2.253,361,1.244,414,1.609,445,2.008,562,2.125,577,2.008,590,2.844,718,2.908,721,1.828,730,1.712,732,1.731,733,2.559,770,1.937,780,1.849,783,1.914,828,1.625,852,1.849,885,1.694,902,2.941,947,1.29,949,1.188,950,1.306,952,1.306,953,1.892,961,1.306,962,1.96,963,2.033,964,1.984,965,1.96,966,3.071,967,1.96,968,2.818,969,2.033,970,2.033,971,1.808,972,1.828,973,2.033,974,1.124,975,2.944,976,1.136,978,1.914,979,1.984,980,1.984,981,1.828,982,1.96,983,2.033,984,1.914,989,1.161,990,1.259,991,1.201,992,1.274,993,1.29,1066,3.017,1068,3.627,1069,3.017,1084,5.196,1085,3.337,1086,3.337,1087,3.337,1088,4.698,1089,5.196,1090,3.627,1091,3.627,1092,3.627,1093,3.627,1094,3.627,1095,3.505]],["t/87",[0,0.919,1,2.058,7,1.755,10,3.949,20,2.796,25,2.481,31,2.977,36,5.474,50,0.633,54,0.664,69,1.199,70,1.232,74,3.718,75,4.228,93,2.577,95,1.895,100,1.359,101,2.253,103,0.516,113,1.145,116,1.666,120,2.058,123,5.174,124,2.35,146,3.236,150,3.057,166,2.88,177,1.917,179,1.568,207,3.823,209,1.833,217,2.137,234,1.959,236,1.334,246,2.137,247,1.385,284,3.207,319,3.718,331,1.774,346,2.763,356,2.384,410,3.142,466,3.86,477,2.42,539,2.992,551,4.941,569,4.228,570,5.113,638,2.253,662,3.718,681,2.992,687,2.495,731,1.874,734,3.86,739,2.713,749,2.577,766,4.116,781,2.62,815,2.535,822,5.113,831,4.941,863,3.207,885,1.736,1030,3.801,1049,3.291,1096,4.027,1097,3.481,1098,4.027,1099,4.815,1100,7.325,1101,3.059,1102,4.815,1103,5.325,1104,5.325,1105,5.325,1106,5.325,1107,4.815,1108,2.992,1109,4.479,1110,5.325,1111,5.325,1112,3.381,1113,5.325,1114,4.027,1115,4.479,1116,2.992,1117,2.871,1118,4.815]],["t/89",[8,1.137,39,2.85,66,0.838,69,1.399,70,1.438,84,3.923,103,0.583,105,3.874,107,2.637,108,1.662,113,1.576,115,1.888,116,2.292,130,1.333,151,2.44,195,3.233,213,2.364,234,2.8,297,3.95,377,6.205,378,2.797,604,3.28,747,4.68,818,4.769,1096,5.541,1116,4.117,1119,4.652,1120,5.817,1121,6.624,1122,5.541]],["t/91",[0,1.689,8,1.498,12,1.088,15,1.086,25,0.9,50,0.389,54,0.638,66,1.042,68,1.568,79,1.761,80,1.435,99,0.65,100,1.819,103,0.469,107,1.178,108,1.161,115,0.843,127,1.463,128,1.986,129,0.926,130,1.919,133,4.062,134,2.194,135,1.282,137,1.638,140,1.013,147,1.164,148,1.126,151,2.373,152,1.495,154,1.586,157,1.977,165,0.762,177,2.95,201,1.102,205,1.492,207,2.002,213,2.033,225,3.084,229,2.875,232,2.098,238,2.758,247,0.851,248,1.837,250,1.249,291,1.056,294,3.345,296,3.451,297,2.758,310,1.617,328,1.394,331,1.704,339,2.79,346,3.269,348,4.25,356,1.465,360,2.367,361,1.219,379,5.63,414,1.584,419,1.8,445,1.977,562,2.098,577,1.977,590,2.821,647,1.61,718,2.884,721,1.8,730,1.686,732,1.704,733,2.538,770,1.907,780,1.821,783,1.885,828,1.6,852,1.821,885,1.668,902,2.917,947,1.264,949,1.164,950,1.28,952,1.28,953,1.863,961,1.28,962,1.93,963,2.002,964,1.953,965,1.93,966,3.048,967,1.93,968,2.788,969,2.002,970,2.002,971,1.78,972,1.8,973,2.002,974,1.102,975,2.916,976,1.114,978,1.885,979,1.953,980,1.953,981,1.8,982,1.93,983,2.002,984,1.885,989,1.138,990,1.234,991,1.178,992,1.249,993,1.264,998,2.077,1096,3.869,1116,1.838,1121,2.958,1123,5.116,1124,3.272,1125,3.272,1126,3.272,1127,3.272,1128,1.97,1129,3.272,1130,2.022,1131,4.626,1132,3.709]],["t/93",[7,1.253,16,6.685,25,2.814,50,1.077,66,0.845,93,3.574,95,2.628,103,0.585,120,2.854,140,2.287,162,2.689,166,2.358,207,4.001,209,3.119,224,3.516,236,1.851,247,1.921,346,3.832,356,3.306,366,3.212,377,4.69,378,2.82,708,2.786,749,3.574,815,3.516,825,4.448,1133,4.983,1134,7.386,1135,7.386,1136,5.354,1137,7.386]],["t/95",[8,1.137,16,4.79,39,2.85,66,0.838,69,1.399,70,1.438,84,3.923,103,0.583,105,3.874,107,2.637,108,1.662,113,1.576,115,1.888,116,2.292,130,1.333,151,2.44,195,3.233,213,2.364,234,2.8,297,3.95,377,6.205,378,2.797,604,3.28,747,4.68,818,4.769,1116,4.117,1119,4.652,1120,5.817,1138,6.624,1139,7.327]],["t/97",[16,5.369,54,1.024,103,0.553,108,1.863,114,4.519,127,2.349,130,1.495,131,4.262,195,3.624,205,2.395,217,3.296,224,4.599,247,2.136,749,3.974,1140,7.426,1141,8.213,1142,8.213,1143,8.213]],["t/99",[0,1.683,8,1.493,12,1.078,15,1.084,16,4.081,50,0.383,54,0.631,66,1.037,68,1.551,79,1.741,80,1.419,99,0.641,100,1.805,103,0.466,107,1.161,108,1.148,115,0.831,127,1.447,128,1.979,129,0.913,130,1.915,134,2.17,135,1.924,137,1.623,140,0.999,147,1.148,148,1.11,151,2.355,152,1.481,154,1.577,165,0.752,177,2.933,201,1.086,205,1.475,207,1.98,213,2.014,224,1.536,225,3.07,229,2.843,232,2.082,238,2.728,247,0.839,248,1.82,250,1.231,291,1.041,297,2.728,310,1.599,328,1.379,331,1.685,339,2.774,346,3.668,360,2.46,361,1.202,414,1.567,419,1.775,445,1.955,562,2.079,577,1.955,590,2.804,603,1.444,647,1.587,653,4.489,718,2.867,721,1.78,730,1.667,732,1.685,733,2.523,770,1.886,780,1.8,783,1.864,828,1.583,845,1.775,852,1.8,885,1.65,902,2.9,947,1.247,949,1.148,950,1.262,952,1.262,953,1.842,961,1.262,962,1.908,963,1.98,964,1.932,965,1.908,966,3.032,967,1.908,968,2.766,969,1.98,970,1.98,971,1.761,972,1.78,973,1.98,974,1.086,975,2.897,976,1.098,978,1.864,979,1.932,980,1.932,981,1.78,982,1.908,983,1.98,984,1.864,989,1.122,990,1.217,991,1.161,992,1.231,993,1.247,998,2.048,1116,1.813,1128,1.943,1130,1.993,1138,2.916,1140,2.916,1144,5.06,1145,3.225,1146,3.225,1147,3.225,1148,3.225,1149,5.645,1150,3.225,1151,2.916,1152,2.338,1153,8.202,1154,4.575,1155,4.575,1156,5.06]],["t/101",[8,1.073,9,5.348,15,0.738,25,2.393,27,3.46,66,0.79,80,1.939,103,0.498,113,1.486,115,1.781,154,1.337,157,2.671,166,2.207,168,3.536,173,3.536,178,4.996,182,3.094,193,2.607,197,2.607,231,3.095,234,1.849,247,1.797,318,3.29,350,3.727,356,4.472,597,3.403,696,4.389,704,4.663,731,2.432,732,2.302,765,4.063,818,3.655,825,4.163,967,2.607,1063,4.389,1095,5.868,1157,6.25,1158,6.25,1159,6.25,1160,5.488,1161,6.25,1162,6.25,1163,5.227,1164,5.813,1165,6.25,1166,6.25,1167,5.813,1168,6.912,1169,3.884]],["t/103",[0,1.706,8,1.514,9,5.552,12,1.118,15,1.095,25,0.94,50,0.406,54,0.66,66,1.056,68,1.622,79,1.822,80,1.485,99,0.679,100,1.862,103,0.452,107,1.23,108,1.201,115,0.881,127,1.514,128,2.007,129,0.968,130,1.93,134,2.27,137,1.685,140,1.058,147,1.216,148,1.176,151,2.43,152,1.537,154,1.615,165,0.797,177,3.004,201,1.151,205,1.544,213,1.708,225,3.13,231,1.884,232,1.908,234,1.733,238,2.854,247,0.889,248,1.889,250,1.305,291,1.103,300,4.203,301,4.203,310,1.673,328,1.443,331,1.763,339,2.841,356,1.53,360,2.106,361,1.274,414,1.639,445,2.046,562,2.158,577,2.046,590,2.872,718,2.937,721,1.863,730,1.744,732,1.763,733,2.584,770,1.973,780,1.884,783,1.95,828,1.656,852,1.884,885,1.726,902,2.97,947,1.321,949,1.216,950,1.337,952,1.337,953,1.927,961,1.337,962,1.997,963,2.071,964,2.021,965,1.997,966,3.098,967,1.997,968,2.854,969,2.071,970,2.071,971,1.842,972,1.863,973,2.071,974,1.151,975,2.977,976,1.163,978,1.95,979,2.021,980,2.021,981,1.863,982,1.997,983,2.071,984,1.95,989,1.189,990,1.289,991,1.23,992,1.305,993,1.321,1170,5.293,1171,3.418,1172,3.418,1173,3.418,1174,3.418,1175,4.786,1176,5.293]],["t/105",[1,2.974,7,1.576,11,4.315,50,0.915,63,4.069,66,0.88,69,1.102,70,1.132,95,2.739,103,0.44,120,2.974,162,2.802,166,2.968,207,3.636,209,2.648,216,3.301,224,3.664,231,3.307,236,2.329,306,2.903,638,3.256,749,3.724,815,3.664,1030,3.993,1045,5.579,1097,5.031]],["t/107",[0,1.69,7,0.87,8,1.499,11,3.792,12,1.09,15,1.087,50,0.39,54,0.64,66,1.043,68,1.572,79,1.766,80,1.439,99,1.019,100,1.822,103,0.47,107,1.182,108,1.164,115,0.846,127,1.467,128,1.987,129,0.93,130,1.92,134,2.2,137,1.642,140,1.017,147,1.168,148,1.13,151,2.378,152,1.498,154,1.588,165,0.765,177,2.955,201,1.105,205,1.496,213,1.655,225,3.088,229,2.883,231,1.168,232,1.859,234,1.689,236,1.582,237,3.258,247,0.854,248,1.841,250,1.253,291,1.059,306,2.382,310,1.621,317,3.107,328,1.398,331,1.709,339,2.794,360,2.236,361,1.224,414,1.588,445,1.983,562,2.103,577,1.983,590,2.825,718,2.889,721,1.805,730,1.691,732,1.709,733,2.542,770,1.912,780,1.826,783,1.89,828,1.605,852,1.826,885,1.673,902,2.921,947,1.269,949,1.168,950,1.285,952,1.285,953,1.868,961,1.285,962,1.935,963,2.007,964,1.959,965,1.935,966,3.052,967,1.935,968,2.793,969,2.007,970,2.007,971,1.785,972,1.805,973,2.007,974,1.105,975,2.921,976,1.118,978,1.89,979,1.959,980,1.959,981,1.805,982,1.935,983,2.007,984,1.89,989,1.142,990,1.238,991,1.182,992,1.253,993,1.269,1090,3.582,1091,3.582,1092,3.582,1093,3.582,1094,3.582,1177,5.13,1178,3.283,1179,3.283,1180,3.283,1181,5.709,1182,3.283,1183,3.283,1184,4.639,1185,3.88,1186,5.13]],["t/109",[0,0.789,1,1.766,2,4.239,4,1.959,6,1.21,7,1.789,8,0.709,10,1.723,11,1.857,18,5.518,28,2.34,38,2.751,50,0.782,54,1.293,69,0.941,70,0.967,72,3.455,80,1.281,86,4.175,94,2.1,95,1.626,99,0.908,103,0.482,120,1.766,122,2.901,138,1.987,139,1.81,151,2.19,154,0.884,156,2.238,164,2.287,166,2.1,170,4.063,172,2.901,193,1.723,194,2.823,198,3.082,207,3.297,209,1.572,213,1.474,219,1.766,225,2.288,231,1.626,236,1.145,245,2.567,323,2.287,328,1.245,359,1.907,368,3.665,378,1.744,385,7.089,406,2.416,428,2.463,492,2.37,493,2.901,499,4.329,504,2.175,513,4.131,533,1.907,567,2.567,571,3.627,599,2.514,603,2.045,609,5.685,650,4.973,665,1.683,674,3.082,675,2.514,677,2.686,701,2.901,708,1.723,718,1.607,738,2.248,739,2.328,745,3.189,815,2.175,907,2.987,909,3.455,956,2.686,965,2.48,981,2.314,1011,3.455,1025,4.973,1028,2.823,1117,2.463,1187,4.767,1188,4.175,1189,2.567,1190,5.585,1191,3.627,1192,4.436,1193,2.108,1194,5.945,1195,3.455,1196,4.131,1197,3.842,1198,5.945,1199,4.131,1200,4.131,1201,3.189,1202,4.131,1203,4.131,1204,4.131,1205,3.618,1206,4.436,1207,6.966,1208,4.568,1209,3.082,1210,3.455,1211,2.624,1212,3.312,1213,3.627,1214,3.627,1215,3.189,1216,4.131,1217,4.568,1218,4.131,1219,3.627,1220,3.627,1221,3.312,1222,4.131,1223,4.568,1224,4.568,1225,4.568]],["t/111",[18,5.954,103,0.551,113,1.758,166,2.611,207,3.77,209,2.814,306,3.635,708,3.084,731,2.877,818,5.095,1190,6.985,1226,8.176,1227,7.393,1228,8.176,1229,8.176]],["t/114",[0,1.632,1,1.767,8,1.444,11,1.155,12,0.991,13,1.31,15,1.075,18,5.996,25,2.23,27,1.422,50,0.338,54,0.57,62,1.916,66,1.044,68,1.402,69,0.942,70,0.845,79,1.574,80,1.283,82,1.253,98,2.143,99,0.564,100,1.167,103,0.532,107,1.022,108,1.302,114,1.563,115,0.732,127,1.308,128,1.914,129,0.804,130,1.879,134,1.962,137,0.739,140,0.879,147,1.011,148,0.978,151,2.192,152,1.362,154,1.492,157,1.767,165,0.662,173,1.859,177,2.775,201,0.956,202,0.917,205,1.334,207,3.171,213,1.476,217,1.835,225,2.934,232,1.691,236,0.712,237,2.904,247,1.189,248,1.674,250,1.084,291,0.917,306,2.908,310,1.445,326,1.272,328,1.794,331,1.523,339,2.624,343,1.374,356,2.946,360,2.083,361,1.059,366,1.236,414,1.416,445,1.767,476,1.352,519,1.532,562,1.912,577,1.767,590,2.653,708,2.165,718,2.712,721,1.609,727,1.711,730,1.507,732,1.523,733,2.387,738,1.398,742,1.31,749,1.374,770,1.705,780,1.627,781,1.398,783,1.685,828,1.431,852,1.627,885,1.491,902,2.743,920,1.502,947,1.098,949,1.011,950,1.111,952,1.111,953,1.665,961,1.111,962,1.725,963,1.789,964,1.746,965,1.725,966,2.884,967,1.725,968,2.575,969,1.789,970,1.789,971,1.591,972,1.609,973,1.789,974,0.956,975,2.721,976,0.967,978,1.685,979,1.746,980,1.746,981,1.609,982,1.725,983,1.789,984,1.685,989,0.988,990,1.071,991,1.022,992,1.084,993,1.098,1050,1.857,1109,2.389,1133,1.916,1190,2.059,1206,3.873,1207,2.568,1209,1.916,1211,1.632,1230,5.468,1231,4.135,1232,1.916,1233,4.558,1234,2.568,1235,2.568,1236,2.568,1237,4.573,1238,2.841,1239,2.841,1240,2.841,1241,2.255,1242,1.983,1243,4.573,1244,2.841,1245,1.474,1246,4.573,1247,2.841,1248,2.841,1249,2.841,1250,2.841,1251,2.841,1252,2.255,1253,2.568,1254,2.568,1255,4.135,1256,4.573,1257,4.135]],["t/116",[1,1.811,2,4.299,6,1.241,7,1.675,8,0.727,10,1.767,11,1.904,19,6.661,28,2.383,50,0.557,54,1.299,69,1.119,70,1.149,83,3.137,95,1.667,99,0.931,103,0.552,120,1.811,137,1.218,138,2.038,139,1.856,151,2.23,154,0.907,157,1.811,164,2.345,166,2.138,170,4.137,172,2.975,193,1.767,194,2.895,198,3.161,207,3.335,219,1.811,225,2.33,231,1.667,234,1.253,236,1.174,245,2.633,328,1.277,359,1.955,368,3.922,378,1.789,385,6.768,406,2.477,492,2.431,499,4.391,504,2.23,533,1.955,567,2.633,603,2.098,609,5.751,650,5.064,671,3.161,674,3.161,675,2.578,677,2.754,708,1.767,714,3.72,718,1.649,728,3.54,738,2.305,739,2.387,745,3.271,765,3.936,815,2.23,907,3.063,909,3.543,956,2.754,965,2.526,981,2.356,1028,2.895,1045,3.397,1117,2.526,1133,3.161,1187,3.397,1190,5.664,1191,5.316,1192,4.517,1193,2.161,1194,6.054,1195,3.543,1196,4.236,1197,3.941,1198,6.054,1199,4.236,1200,4.236,1201,3.271,1202,4.236,1203,4.236,1204,4.236,1205,2.578,1206,4.517,1209,3.161,1210,3.543,1211,2.691,1212,3.397,1213,3.72,1214,3.72,1215,3.271,1258,3.941,1259,3.72,1260,6.696,1261,4.685,1262,4.685,1263,5.632,1264,4.685,1265,4.685,1266,4.236,1267,4.685,1268,4.685,1269,4.685,1270,4.685,1271,3.941,1272,4.236,1273,3.271,1274,3.543]],["t/118",[15,0.984,26,2.559,27,3.804,66,0.869,69,1.088,70,1.118,112,5.748,113,1.634,115,1.958,130,1.383,152,1.803,166,2.945,207,3.609,219,2.937,246,3.05,318,4.727,359,3.172,368,4.012,446,4.969,601,5.748,731,2.674,733,2.353,818,4.018,909,5.748,1190,5.51,1206,6.699,1275,7.6,1276,7.6,1277,6.392,1278,5.748]],["t/121",[0,1.67,8,1.48,12,1.054,15,1.077,27,1.56,50,0.37,54,0.614,66,1.026,68,1.509,69,0.705,70,0.724,79,1.694,80,1.381,82,1.375,99,0.619,100,1.257,103,0.499,107,1.121,108,1.117,115,0.803,127,1.408,128,1.962,129,0.882,130,1.905,134,2.112,137,0.81,140,0.965,147,1.109,148,1.072,151,2.31,152,1.448,154,1.554,165,0.726,166,0.995,177,2.89,193,1.175,201,1.049,205,1.436,207,3.142,213,1.589,225,3.033,229,2.767,232,1.798,236,0.781,247,1.28,248,1.78,250,1.19,291,1.005,310,1.556,318,1.483,328,1.89,331,1.64,337,1.832,339,2.733,360,2.003,361,1.161,368,1.355,414,1.524,426,4.072,445,1.903,519,1.68,562,2.033,577,1.903,590,2.763,718,2.825,721,1.732,730,1.623,732,1.64,733,2.486,770,1.835,780,1.752,783,1.814,817,1.832,828,1.54,852,1.752,885,1.605,902,2.857,920,2.603,947,1.204,949,1.109,950,1.219,952,1.219,953,1.793,961,1.219,962,1.857,963,1.926,964,1.88,965,1.857,966,3.102,967,1.857,968,2.714,969,1.926,970,1.926,971,1.713,972,1.732,973,1.926,974,1.049,975,2.849,976,1.061,978,1.814,979,1.88,980,1.88,981,1.732,982,1.857,983,1.926,984,1.814,989,1.084,990,1.175,991,1.121,992,1.19,993,1.204,1050,2.037,1190,2.259,1192,2.102,1206,4.118,1209,2.102,1211,1.79,1230,4.679,1231,4.452,1232,2.102,1233,4.846,1234,2.817,1235,2.817,1236,2.817,1258,4.141,1263,4.141,1279,3.116,1280,3.116,1281,4.924,1282,3.116,1283,3.116,1284,3.116,1285,3.116,1286,7.124,1287,4.452,1288,4.924,1289,4.452,1290,4.452,1291,4.452,1292,4.452,1293,4.452]],["t/123",[4,3.555,6,2.196,8,1.287,50,1.154,53,4.148,54,1.033,94,2.646,175,4.078,197,3.126,289,3.369,363,3.883,665,3.578,938,4.3,1188,5.262,1294,6.58,1295,6.58]],["t/125",[7,1.062,9,2.4,10,2.362,11,2.545,12,0.737,15,1.233,16,2.792,17,2.101,18,2.639,19,2.881,25,1.175,53,2.138,69,0.611,95,1.52,120,4.352,175,2.101,289,1.736,600,4.581,605,2.639,638,2.649,665,3.007,666,2.101,740,2.4,938,2.216,1241,3.39,1294,3.39,1296,4.27,1297,3.861,1298,3.861,1299,2.881,1300,3.39,1301,2.981,1302,5.175,1303,3.096,1304,2.981,1305,2.981,1306,3.096,1307,3.39,1308,3.23,1309,3.23,1310,3.23,1311,3.096,1312,3.23,1313,3.23,1314,3.23,1315,3.096,1316,2.981,1317,3.861,1318,3.39,1319,3.39]],["t/128",[5,3.514,6,2.263,7,1.715,10,2.087,11,2.25,17,2.723,21,2.155,26,1.863,31,3.057,35,3.82,50,1.254,53,3.764,54,1.232,69,1.372,70,1.41,81,2.984,93,2.678,94,3.06,95,2.676,103,0.317,104,2.678,120,3.542,139,2.193,154,1.071,157,2.139,163,2.872,165,1.29,179,2.515,212,3.253,236,1.387,279,3.045,327,4.655,331,1.843,388,2.478,406,2.926,410,2.374,422,2.635,454,2.635,476,2.635,491,5.452,493,3.514,532,4.394,539,3.11,600,3.42,647,2.723,662,3.863,708,2.087,731,1.947,738,2.723,740,3.11,893,3.734,976,2.56,1005,4.916,1221,4.012,1299,3.734,1302,4.276,1320,5.534,1321,4.655,1322,5.004,1323,7.52,1324,4.394,1325,3.863,1326,5.004,1327,5.004,1328,4.655,1329,5.004,1330,4.012,1331,5.534,1332,5.534,1333,5.534,1334,5.534,1335,5.534]],["t/130",[6,2.573,50,1.154,51,3.71,66,0.948,94,3.101,95,2.949,120,3.203,150,3.459,236,2.434,599,4.56,739,4.222,1008,5.709,1336,5.418]],["t/132",[0,1.888,7,1.603,8,1.057,12,1.769,15,1.135,22,2.732,50,1.024,54,0.849,66,1.081,69,0.975,70,1.002,84,2.962,99,1.353,103,0.541,108,1.545,114,4.741,117,4.101,127,2.703,130,1.239,154,1.318,157,2.632,195,3.004,216,2.921,226,5.15,245,3.826,246,3.457,344,4.324,567,3.826,863,4.101,1337,5.406,1338,6.809,1339,4.936,1340,5.406,1341,6.809,1342,4.936,1343,6.809]],["t/134",[0,1.501,1,1.893,5,3.11,7,1.614,10,1.848,11,2.809,15,1.121,20,1.87,21,1.625,31,1.991,35,4.023,39,2.748,50,1.187,53,2.452,54,0.861,62,3.304,66,0.56,69,0.989,70,1.017,77,3.551,80,1.374,94,2.777,95,1.743,99,0.973,102,2.59,103,0.458,104,4.208,107,1.763,108,1.111,117,2.95,120,3.78,128,1.008,129,1.387,130,0.891,131,2.541,135,1.732,140,1.517,152,1.162,164,2.452,175,2.41,202,2.959,247,1.797,278,4.429,279,3.802,281,5.812,282,4.12,289,1.991,320,3.419,363,2.295,380,2.752,406,2.59,434,3.551,477,2.226,486,3.889,493,4.388,539,2.752,546,3.419,600,4.27,605,3.027,638,2.923,666,2.41,669,4.429,670,2.95,731,1.723,738,3.4,780,1.743,938,2.541,1067,3.551,1221,5.01,1242,4.824,1299,4.662,1302,4.008,1324,3.889,1327,7.24,1344,5.01,1345,5.812,1346,4.429,1347,4.429,1348,4.898,1349,3.419,1350,3.304,1351,4.12,1352,4.898,1353,4.429,1354,6.91,1355,6.91,1356,4.429,1357,3.419,1358,4.898,1359,4.898]],["t/136",[7,1.555,15,1.155,21,1.501,22,2.561,26,2.149,28,2.942,35,2.467,50,1.153,54,0.796,66,0.73,69,1.184,70,1.216,82,4.045,84,2.776,89,4.306,93,3.088,95,3.263,99,1.268,101,2.7,102,3.375,104,3.088,105,3.375,113,1.972,117,5.522,118,3.375,120,3.195,128,1.313,129,1.807,130,1.161,135,2.072,137,2.15,165,1.487,236,2.072,246,2.561,247,1.66,259,3.195,266,2.529,271,3.312,323,3.195,411,5.067,414,1.976,457,3.666,604,2.857,676,3.752,730,2.103,829,3.038,910,3.586,957,4.456,984,2.351,1101,3.666,1360,5.368,1361,3.944,1362,4.627,1363,5.771,1364,5.368]],["t/138",[6,2.065,7,1.703,13,3.596,15,0.832,35,3.012,51,3.489,69,1.116,70,1.147,94,2.489,100,1.989,103,0.536,113,1.676,201,3.153,231,2.774,279,4.288,357,4.477,407,5.258,681,4.38,1299,6.318,1303,6.789,1330,5.65,1357,5.441,1365,6.555,1366,5.258,1367,6.555,1368,5.258]],["t/140",[8,0.808,15,1.149,21,2.1,28,1.852,35,2.011,39,2.614,50,0.619,54,0.649,66,0.946,69,0.745,70,0.766,82,3.65,84,2.264,89,3.511,95,3.663,99,1.774,101,2.202,102,4.722,103,0.473,105,4.722,113,2.139,117,4.342,118,3.812,128,1.071,129,1.474,130,1.312,131,2.7,135,1.807,137,1.875,165,1.213,201,1.752,209,1.791,219,2.786,234,2.388,247,1.353,266,2.062,271,2.7,369,3.216,411,4.132,414,1.611,435,4.377,457,2.989,465,2.264,511,4.377,597,2.036,604,2.33,676,3.059,708,1.963,730,1.715,829,2.477,845,4.913,852,1.852,893,3.511,910,2.924,936,3.305,1108,4.051,1300,4.132,1303,3.773,1325,3.633,1342,3.773,1351,4.377,1360,4.377,1361,3.216,1362,3.773,1363,4.705,1364,6.064,1369,4.705,1370,5.724,1371,5.204,1372,4.705,1373,5.204,1374,5.204,1375,5.204,1376,7.209,1377,4.132,1378,5.838,1379,6.064,1380,4.705,1381,4.705,1382,4.705,1383,4.705,1384,3.936]],["t/142",[8,0.834,12,1.452,15,1.045,25,1.478,54,0.67,63,4.447,69,1.055,70,1.084,95,1.912,100,2.147,103,0.574,108,1.219,113,1.155,114,2.956,115,1.384,127,1.536,130,0.978,141,2.405,151,1.789,152,1.275,163,2.787,177,1.934,194,3.319,205,1.566,209,2.536,216,3.161,232,1.582,234,2.62,236,1.346,246,2.156,247,1.916,266,2.128,284,3.235,291,3.161,362,3.319,378,2.051,410,2.304,426,5.113,466,3.894,609,6.398,647,2.643,662,3.75,665,1.979,708,3.173,738,2.643,747,2.787,766,3.019,815,2.557,818,2.84,847,4.857,902,1.912,947,2.076,1040,4.063,1273,3.75,1303,6.098,1308,4.063,1367,4.518,1385,8.766,1386,4.857,1387,9.051,1388,9.484,1389,5.372,1390,5.372,1391,5.372,1392,4.518,1393,4.518,1394,5.372,1395,5.372,1396,5.372]],["t/144",[0,0.568,8,1.5,12,1.338,15,1.088,25,0.905,39,1.039,50,1.085,54,0.788,66,1.044,68,1.575,79,1.768,80,1.441,95,1.17,99,0.653,100,1.824,103,0.47,107,1.184,108,1.165,115,0.847,127,1.469,128,1.988,129,0.931,130,1.92,137,2.016,140,1.018,147,1.17,148,1.132,150,1.373,151,2.38,152,1.5,154,1.661,165,0.766,177,2.957,201,1.107,205,1.498,213,1.658,224,1.566,225,3.09,232,1.862,234,1.691,247,0.855,248,1.843,250,1.256,284,3.094,291,2.04,310,1.624,328,1.4,331,1.711,339,2.796,356,1.473,360,2.372,361,1.915,414,1.591,445,1.985,562,2.106,577,1.985,590,2.827,708,1.241,718,2.891,721,1.808,730,1.693,732,1.711,733,2.544,770,1.915,780,1.828,783,1.893,828,1.607,838,2.488,852,1.828,885,1.675,902,2.923,947,1.271,949,1.17,950,1.287,952,1.287,953,1.871,961,1.287,962,1.938,963,2.01,964,1.961,965,1.938,966,3.054,967,1.938,968,2.796,969,2.01,970,2.01,971,1.788,972,1.808,973,2.01,974,1.107,975,2.924,976,1.12,978,1.893,979,1.961,980,1.961,981,1.808,982,1.938,983,2.01,984,1.893,989,1.145,990,1.241,991,1.184,992,1.256,993,1.271,1303,6.894,1372,4.645,1380,2.974,1381,4.645,1382,2.974,1383,4.645,1385,6.814,1386,2.974,1397,5.138,1398,3.289,1399,3.289,1400,3.289,1401,3.289,1402,2.611,1403,5.138,1404,5.138]],["t/147",[8,1.599,63,3.985,66,1.178,69,1.314,70,1.35,103,0.525,116,2.358,144,3.709,154,1.776,193,2.843,202,2.432,216,3.233,219,3.547,221,5.984,266,2.986,322,5.464,349,3.279,504,3.588,533,3.146,780,2.682,971,2.623,1405,7.537,1406,7.286,1407,7.537,1408,5.984,1409,6.815,1410,6.815,1411,5.984]],["t/150",[0,1.371,7,1.347,10,1.306,11,2.174,12,1.689,15,1.205,17,3.906,35,1.338,50,0.636,54,1.18,66,0.396,69,0.935,70,1.081,81,1.867,88,1.797,98,1.623,103,0.42,108,1.213,124,1.528,128,1.1,129,1.514,130,1.189,132,2.75,134,3.151,150,1.445,154,1.536,179,1.575,180,1.649,181,2.086,182,1.55,195,1.528,204,3.186,207,2.092,224,2.546,229,5.076,231,1.232,232,2.788,234,1.965,236,0.868,238,2.883,266,1.372,269,2.75,289,3.227,293,3.877,294,3.496,295,3.877,296,3.608,297,3.961,298,4.245,306,3.165,317,2.631,346,2.775,348,3.608,379,4.539,388,1.55,442,2.036,443,2.264,472,1.797,492,1.797,616,3.733,638,1.465,687,1.623,788,2.264,938,4.119,939,2.036,1068,3.733,1090,3.733,1091,4.56,1092,4.56,1093,4.56,1094,4.56,1095,3.608,1098,4.94,1108,1.946,1185,4.044,1189,1.946,1195,2.619,1412,4.539,1413,6.532,1414,3.463,1415,2.913,1416,2.619,1417,2.619,1418,2.619,1419,2.619,1420,3.131,1421,3.131,1422,3.131,1423,3.131,1424,3.131,1425,3.131,1426,3.463,1427,3.463,1428,3.463,1429,3.463,1430,3.463,1431,3.131,1432,2.913,1433,3.131,1434,3.131,1435,3.463,1436,3.463,1437,3.463,1438,3.463,1439,2.336,1440,2.336,1441,3.131,1442,4.835,1443,3.877,1444,3.131,1445,4.498,1446,4.498,1447,3.131,1448,4.835,1449,4.835,1450,4.835,1451,3.877,1452,4.498,1453,4.245,1454,4.835,1455,4.835,1456,3.131,1457,4.835,1458,2.913]],["t/152",[0,1.714,6,0.926,7,1.115,10,1.319,12,1.693,15,1.211,17,3.633,28,1.917,50,0.416,54,1.222,66,0.751,68,1.651,101,1.479,103,0.308,108,1.222,116,1.094,128,1.352,129,1.861,130,1.196,132,2.776,134,3.613,152,1.278,154,1.799,164,1.75,175,4.318,202,1.128,203,2.744,204,2.637,207,1.368,229,4.733,231,2.338,232,2.887,234,2.423,236,1.85,238,4.886,239,4.531,269,2.776,297,3.981,306,2.785,317,2.65,346,3.831,348,4.981,379,5.205,671,2.359,938,3.831,1068,3.761,1090,3.761,1091,3.761,1092,3.761,1093,3.761,1094,3.761,1095,3.634,1447,3.161,1448,4.871,1449,4.871,1450,4.871,1451,2.535,1456,3.161,1457,6.675,1459,3.496,1460,2.776,1461,9.296,1462,8.406,1463,4.277,1464,3.496,1465,5.387,1466,7.383,1467,5.387,1468,5.387,1469,7.383,1470,5.387,1471,5.387,1472,5.387,1473,5.387,1474,5.387,1475,5.387]],["t/154",[0,1.182,6,0.806,7,1.348,10,1.148,11,1.964,12,1.608,15,1.216,20,1.162,25,1.33,42,2.046,43,1.801,50,0.814,54,1.078,66,0.687,69,0.692,70,0.884,81,1.641,88,1.579,98,1.426,99,1.579,103,0.51,108,1.364,124,1.343,127,1.382,128,1.237,129,1.702,130,1.359,132,2.416,134,2.073,135,1.211,154,1.612,165,0.709,170,2.986,173,1.964,179,0.896,180,1.449,181,1.833,182,1.362,194,1.881,195,1.343,204,2.747,207,1.891,211,3.062,224,1.449,229,2.716,232,2.341,238,2.606,248,0.887,253,2.521,254,3.169,266,1.206,269,3.837,289,3.035,293,3.503,294,3.159,295,3.503,296,3.26,297,3.691,298,3.837,306,1.823,346,2.508,348,3.26,375,1.449,379,4.23,380,1.71,388,1.362,427,1.609,442,1.789,443,1.99,472,1.579,519,1.641,590,1.047,616,3.374,638,1.287,665,1.78,687,1.426,727,1.833,742,2.773,749,2.338,788,1.99,897,1.551,941,1.191,976,1.036,1098,3.655,1108,1.71,1112,3.069,1185,3.655,1189,1.71,1193,1.404,1245,2.508,1412,4.911,1416,2.302,1417,2.302,1418,2.302,1419,2.302,1420,2.752,1421,2.752,1422,2.752,1423,2.752,1424,2.752,1425,2.752,1431,2.752,1432,2.56,1433,2.752,1434,2.752,1439,2.053,1440,2.053,1441,2.752,1442,4.37,1443,3.503,1444,2.752,1445,4.065,1446,4.065,1453,3.837,1454,4.37,1455,4.37,1458,2.56,1476,3.043,1477,3.374,1478,2.56,1479,2.752,1480,2.56,1481,2.302,1482,4.055,1483,2.416,1484,3.817,1485,3.93,1486,2.416,1487,2.56,1488,2.56,1489,4.37,1490,4.37,1491,3.846,1492,2.776,1493,3.159,1494,3.26,1495,3.503,1496,2.716,1497,3.374,1498,3.655,1499,3.503,1500,3.374,1501,2.229,1502,2.229]],["t/156",[31,3.237,50,1.204,54,0.993,98,3.731,103,0.543,163,4.922,207,3.116,276,4.796,308,4.381,359,3.324,477,3.618,708,3.004,709,6.023,722,6.322,757,5.206,1021,6.322,1245,4.132,1304,7.073,1503,6.698,1504,7.2,1505,7.2]],["t/158",[1,2.4,2,3.416,4,2.663,12,1.402,15,0.867,25,1.709,35,2.4,57,2.492,69,0.889,70,0.913,103,0.518,115,1.6,152,1.473,163,3.222,198,4.189,199,5.449,202,2.004,216,2.663,245,3.489,247,2.59,339,2.114,410,2.663,422,2.956,454,3.865,541,5.668,567,3.489,727,4.89,728,4.293,730,2.982,732,2.705,733,1.923,747,3.222,817,3.65,831,4.189,942,4.335,989,2.161,992,2.371,1063,3.943,1302,3.108,1304,5.668,1336,4.059,1504,5.614,1506,7.906,1507,7.531,1508,3.74,1509,5.614,1510,4.696,1511,9.596,1512,8.12,1513,5.222,1514,5.886,1515,6.209,1516,4.501,1517,4.335,1518,6.209,1519,5.614,1520,5.614,1521,4.93,1522,5.222,1523,6.209,1524,5.614]],["t/160",[4,2.878,7,1.138,8,1.042,12,1.158,15,1.145,21,1.578,26,2.259,31,3.47,35,2.593,39,2.12,48,3.77,49,6.188,50,0.798,51,3.004,54,0.836,61,3.358,94,2.998,116,2.099,128,1.381,130,1.221,135,2.353,146,2.593,202,2.165,222,4.146,328,1.829,359,2.8,492,3.481,703,3.854,718,2.361,739,3.418,781,3.301,831,4.526,1019,4.26,1219,5.327,1302,3.358,1304,6.554,1315,4.864,1506,5.327,1525,6.067,1526,8.536,1527,6.806,1528,8.536,1529,6.067,1530,6.71,1531,4.864,1532,6.71,1533,6.71,1534,5.643,1535,4.386,1536,6.71,1537,6.71]],["t/162",[0,0.919,12,1.632,15,1.164,35,2.831,50,0.871,54,0.913,57,2.137,69,1.199,70,1.232,88,2.763,95,3.209,100,1.359,103,0.516,108,1.208,113,1.575,127,1.523,128,1.096,129,1.508,137,1.385,150,2.223,168,2.165,182,2.384,193,2.763,204,2.137,207,4.171,217,2.939,232,2.784,237,3.381,245,2.992,291,1.718,337,4.306,350,2.871,366,2.316,368,2.316,482,3.291,597,2.084,647,2.62,659,3.481,724,5.113,755,2.763,817,3.13,828,1.666,910,5.49,1302,3.666,1304,6.295,1402,7.757,1462,4.815,1506,7.506,1529,4.815,1538,5.815,1539,3.718,1540,5.325,1541,5.325,1542,5.325,1543,7.57,1544,5.325,1545,7.325,1546,4.479,1547,5.325,1548,5.325,1549,9.018,1550,5.325,1551,5.325,1552,5.325]],["t/164",[0,1.105,8,1.507,12,1.105,15,1.106,50,1.091,54,0.65,66,1.05,68,1.599,79,1.796,80,1.464,95,1.194,99,0.667,100,1.844,103,0.448,107,1.208,108,1.184,115,0.864,127,1.492,128,1.998,129,0.95,130,1.925,137,1.665,140,1.039,147,1.194,148,1.155,151,2.406,152,1.519,154,1.603,165,0.782,177,2.982,201,1.13,205,1.522,207,2.505,213,1.684,225,3.111,232,2.127,236,0.841,247,0.873,248,1.867,250,1.281,291,1.083,310,1.649,328,1.422,331,1.738,339,2.82,360,2.259,361,1.251,414,1.616,445,2.017,541,2.342,562,2.133,577,2.017,590,2.851,662,2.342,718,2.915,721,1.836,730,1.72,732,1.738,733,2.565,770,1.945,772,2.021,780,1.857,783,1.922,828,1.632,852,1.857,885,1.701,902,2.948,910,1.886,947,1.297,949,1.194,950,1.313,952,1.313,953,1.9,961,1.313,962,1.968,963,2.042,964,1.992,965,1.968,966,3.077,967,1.968,968,2.826,969,2.042,970,2.042,971,1.816,972,1.836,973,2.042,974,1.13,975,2.951,976,1.142,978,1.922,979,1.992,980,1.992,981,1.836,982,1.968,983,2.042,984,1.922,989,1.168,990,1.266,991,1.208,992,1.281,993,1.297,1304,6.553,1506,5.083,1538,4.143,1553,5.218,1554,3.355,1555,3.355,1556,3.355,1557,2.342,1558,3.355,1559,3.355,1560,3.355,1561,3.034,1562,3.034,1563,3.355,1564,3.355,1565,3.034,1566,3.355,1567,2.822,1568,5.218,1569,5.218,1570,5.218]],["t/166",[1,3.415,4,2.179,6,1.346,7,1.063,8,1.101,12,1.41,15,1.133,21,1.667,23,1.431,26,1.092,31,1.318,39,1.98,50,0.915,51,3.822,53,1.623,54,0.96,55,1.715,57,2.514,60,2.855,66,0.976,69,0.727,70,0.922,82,1.431,93,1.569,94,2.608,95,1.154,99,1.244,100,1.297,101,1.372,102,1.715,103,0.488,105,1.715,113,1.093,115,0.835,120,1.253,127,0.927,128,1.289,130,0.59,135,0.813,137,1.321,139,2.013,140,2.384,141,1.452,146,2.975,150,2.12,153,2.12,154,1.863,157,1.253,162,2.803,165,1.184,168,2.546,181,1.953,197,2.363,201,1.092,211,1.652,219,1.253,246,2.039,274,2.574,310,1.606,323,2.543,328,1.707,368,2.21,388,1.452,414,2.195,428,1.748,453,1.863,454,1.544,465,1.41,470,1.906,480,3.226,481,1.784,492,1.683,495,2.543,504,1.544,535,2.452,580,2.264,589,2.12,590,1.116,591,3.226,603,2.275,663,2.727,665,2.308,670,1.953,687,1.519,703,1.863,711,2.574,713,2.987,718,1.788,755,1.683,766,1.822,772,3.06,777,2.452,822,2.264,831,2.188,858,2.932,863,1.953,869,4.594,885,2.043,886,2.932,889,2.932,901,1.906,1008,4.801,1013,2.351,1015,3.842,1050,2.12,1163,2.452,1187,2.351,1189,1.822,1197,2.727,1211,1.863,1220,2.574,1273,2.264,1305,4.373,1306,6.587,1307,4.973,1313,3.842,1378,2.12,1571,6.019,1572,2.727,1573,3.243,1574,2.932,1575,4.034,1576,2.574,1577,2.932,1578,6.264,1579,3.243,1580,7.09,1581,3.243,1582,2.932,1583,3.243,1584,3.243,1585,3.243,1586,2.059,1587,3.243,1588,2.727,1589,3.243,1590,3.243,1591,3.243,1592,3.243,1593,3.243,1594,3.243,1595,2.932,1596,2.932,1597,3.243,1598,2.932,1599,5.581,1600,3.243,1601,5.081,1602,6.264,1603,5.664,1604,4.034,1605,5.081,1606,3.139,1607,3.06,1608,2.574,1609,5.081,1610,2.932,1611,2.727,1612,5.269,1613,3.243,1614,3.243]],["t/168",[0,0.553,1,1.945,7,1.195,8,1.49,12,1.073,15,1.131,39,1.012,50,1.076,54,0.627,66,1.059,68,1.542,79,1.732,80,1.411,99,0.636,100,1.284,103,0.438,107,1.153,108,1.141,115,0.825,127,1.439,128,2.003,129,0.907,130,1.921,137,0.833,139,2.79,140,0.992,147,1.14,148,1.102,151,2.346,152,1.475,154,1.572,165,0.746,177,2.924,193,2.656,201,1.078,205,1.467,212,1.883,213,1.624,225,3.062,232,1.83,246,1.285,247,1.99,248,1.812,250,1.223,259,1.603,291,1.033,310,1.59,328,1.371,331,1.676,339,2.765,360,2.346,361,1.194,414,1.558,445,1.945,465,1.393,562,2.07,577,1.945,590,2.796,718,2.859,721,1.771,730,1.658,732,1.676,733,2.515,770,1.875,780,1.791,783,1.854,828,1.574,852,1.791,885,1.641,902,2.891,947,1.238,949,1.14,950,1.253,952,1.253,953,1.832,958,4.352,961,1.253,962,1.898,963,1.969,964,1.921,965,1.898,966,3.024,967,1.898,968,2.755,969,1.969,970,1.969,971,1.751,972,1.771,973,1.969,974,1.078,975,2.887,976,1.09,978,1.854,979,1.921,980,1.921,981,1.771,982,1.898,983,1.969,984,1.854,989,1.114,990,1.208,991,1.153,992,1.223,993,1.238,1008,3.653,1306,5.549,1307,7.186,1378,2.094,1603,4.55,1615,5.032,1616,3.203,1617,3.203,1618,3.203,1619,4.241,1620,3.203,1621,3.203,1622,3.203,1623,5.032,1624,5.032,1625,5.032,1626,5.032,1627,5.032]],["t/170",[7,1.674,61,4.264,66,0.974,69,1.22,140,2.637,221,6.763,1628,5.747,1629,8.519,1630,5.131,1631,8.519,1632,8.519]],["t/172",[0,0.872,6,1.733,7,1.63,8,1.162,13,1.089,15,1.121,21,0.924,23,3.459,26,0.795,28,1.399,29,1.712,31,2.87,32,3.121,35,2.276,36,4.894,37,5.49,38,3.042,39,1.242,40,4.565,41,2.33,42,2.771,43,0.88,44,3.554,45,4.412,48,2.838,50,0.839,51,1.057,54,0.734,55,1.248,56,2.135,57,0.947,59,1.459,61,1.968,64,1.786,66,0.577,68,1.548,69,1.072,70,1.039,79,1.353,89,1.593,94,1.255,95,1.399,96,1.499,101,0.999,103,0.404,105,1.248,115,0.608,116,2.341,121,2.429,124,2.228,141,2.261,152,0.56,153,1.544,156,2.858,171,1.593,193,0.891,202,0.762,209,0.813,216,1.013,217,0.947,222,1.459,236,1.266,246,0.947,247,0.614,253,1.448,257,1.499,279,1.299,284,3.546,289,0.96,306,1.905,311,2.973,320,4.111,321,4.275,326,3.351,338,3.12,339,1.719,341,1.327,344,2.496,353,2.003,360,2.714,363,1.106,364,1.388,477,2.971,489,1.648,494,1.874,496,1.786,504,3.113,506,2.258,519,1.273,533,2.458,539,1.327,542,1.986,546,4.565,548,1.986,551,2.652,564,3.972,566,2.135,567,1.327,580,3.525,614,1.388,666,1.162,675,1.299,725,3.121,731,1.777,739,1.203,742,1.089,815,1.124,825,1.422,877,1.459,883,2.57,907,2.57,949,0.84,956,1.388,976,1.338,984,0.87,1005,1.544,1108,1.327,1169,1.327,1205,1.299,1211,1.356,1245,1.225,1299,1.593,1302,1.182,1347,3.554,1443,2.85,1496,1.327,1527,1.712,1535,1.544,1598,3.554,1607,1.422,1628,1.593,1633,5.888,1634,2.135,1635,4.247,1636,2.361,1637,2.361,1638,3.931,1639,2.361,1640,3.931,1641,2.361,1642,3.931,1643,2.361,1644,2.361,1645,2.361,1646,2.361,1647,3.931,1648,2.361,1649,2.361,1650,3.121,1651,3.931,1652,3.931,1653,3.931,1654,1.786,1655,2.361,1656,2.361,1657,2.361,1658,2.361,1659,2.361,1660,2.361,1661,1.459,1662,3.24,1663,3.306,1664,2.135,1665,1.874,1666,2.85,1667,1.986,1668,3.931,1669,3.931,1670,3.931,1671,3.931,1672,3.931,1673,3.931,1674,3.931,1675,3.931,1676,3.554,1677,3.931,1678,3.931,1679,3.931,1680,3.931,1681,3.931,1682,3.931,1683,3.931,1684,3.931,1685,3.931,1686,2.135,1687,1.986,1688,2.361,1689,2.361,1690,2.361,1691,2.135,1692,4.566,1693,3.306,1694,2.361,1695,2.361,1696,2.361,1697,2.361,1698,2.361,1699,2.361,1700,2.361,1701,2.135,1702,2.135,1703,5.888,1704,5.888,1705,5.888,1706,5.888,1707,4.453,1708,5.888,1709,5.888,1710,4.952,1711,5.324,1712,3.931,1713,7.06,1714,3.931,1715,3.931,1716,3.931,1717,2.361,1718,2.361,1719,2.361,1720,3.306,1721,2.361,1722,2.361,1723,3.931,1724,3.931,1725,2.361,1726,2.135,1727,2.361,1728,2.361,1729,2.361,1730,2.135,1731,2.361,1732,2.361,1733,2.361,1734,2.361,1735,1.874,1736,2.361,1737,2.361,1738,2.361,1739,2.361,1740,2.973,1741,1.986,1742,2.361,1743,2.361,1744,1.593,1745,2.361,1746,2.361,1747,2.361,1748,3.121,1749,1.986]],["t/174",[0,1.631,6,1.581,7,1.667,10,2.983,15,0.637,21,1.86,23,2.633,28,3.157,29,4.326,31,2.425,50,1.244,54,1.178,61,2.987,66,1.015,69,1.132,70,1.164,80,1.674,103,0.341,116,3.16,119,4.691,124,3.49,144,3.892,152,2.105,155,4.513,156,2.031,172,3.789,203,4.03,207,3.095,209,2.053,282,5.018,334,3.594,349,3.44,353,3.04,414,2.449,484,4.326,504,2.84,507,6.28,575,5.018,649,4.737,677,3.508,949,2.123,1130,3.687,1205,3.283,1230,4.025,1322,5.395,1410,5.395,1531,4.326,1586,3.789,1654,4.513,1749,5.018,1750,5.967,1751,4.737,1752,5.018,1753,5.967,1754,5.395,1755,4.326,1756,5.967,1757,5.967,1758,5.967,1759,5.967,1760,4.025,1761,4.513,1762,5.967]],["t/177",[7,1.837,8,1.094,10,3.621,15,0.939,17,4.331,21,2.07,22,2.827,23,3.108,31,3.578,38,4.243,48,3.959,50,0.837,54,1.097,61,4.406,66,0.806,69,1.26,70,1.479,96,4.473,103,0.403,116,2.204,257,4.473,289,3.578,349,3.064,353,3.589,533,3.674,562,2.347,781,3.466,936,4.473,1008,4.141,1755,5.107,1763,7.959,1764,7.045,1765,7.045,1766,5.593,1767,4.606]],["t/179",[0,1.751,7,1.826,10,3.66,11,2.931,15,0.953,17,3.548,21,1.696,23,3.182,38,4.343,48,4.052,50,1.062,54,1.113,61,3.61,74,5.034,80,2.023,93,3.489,146,3.452,156,2.455,259,3.61,349,3.137,478,4.714,506,4.142,524,5.725,533,4.049,781,3.548,1117,3.888,1606,4.456,1755,5.228,1767,4.714,1768,7.211,1769,6.52,1770,7.211,1771,6.52,1772,5.454]],["t/182",[28,2.976,50,1.161,61,4.887,66,1.117,103,0.479,120,3.232,121,5.168,410,3.587,766,4.699,1654,6.325,1772,6.325,1773,7.034,1774,8.363]],["t/184",[0,1.255,7,1.652,10,3.836,21,2.11,61,3.638,65,4.175,80,2.039,83,3.406,103,0.582,116,2.274,120,2.809,125,5.074,149,5.497,166,2.321,204,2.917,207,4.087,209,2.501,257,4.615,323,3.638,349,3.161,366,3.161,470,4.273,724,6.797,1008,5.276,1028,4.491,1191,5.771,1205,3.999,1535,4.752,1771,6.572,1775,7.268,1776,7.268,1777,7.268,1778,6.113]],["t/186",[0,1.708,7,1.843,8,1.17,10,3.462,17,3.709,50,1.224,61,3.773,65,4.33,66,0.862,69,1.079,70,1.109,99,1.497,103,0.431,203,3.84,220,4.54,470,6.053,599,4.147,687,3.532,863,5.527,1298,8.298,1415,6.34,1779,6.815,1780,6.34]],["t/188",[7,1.522,20,2.775,21,1.709,38,4.378,48,4.084,54,1.119,61,3.638,66,0.831,68,2.228,83,3.406,103,0.598,152,2.129,156,2.474,158,5.074,203,3.703,253,3.306,254,2.587,257,4.615,276,4.378,326,3.254,349,3.161,359,3.034,387,2.955,470,4.273,472,3.771,474,3.406,524,5.771,675,4.938,815,3.46,892,5.771,941,3.512,1527,5.269,1661,4.491,1748,5.771,1778,6.113,1781,7.548,1782,7.268,1783,7.268]],["t/190",[0,0.893,7,1.766,10,3.653,13,2.387,17,4.058,21,1.939,25,1.424,26,2.418,31,2.103,41,3.313,42,3.543,43,3.074,50,0.854,54,1.166,61,3.595,69,1.028,70,1.31,94,2.988,96,4.56,102,2.736,116,1.619,152,1.228,156,1.761,164,3.595,171,3.491,179,1.524,202,1.67,216,2.22,219,2,231,1.841,236,1.297,243,6.737,291,2.874,334,3.117,349,2.251,360,1.494,365,3.613,426,4.446,457,2.973,476,3.419,498,3.613,524,4.108,533,2.16,567,4.634,570,3.613,621,3.383,638,2.189,662,3.613,731,1.821,739,2.636,749,2.504,781,4.383,824,3.613,825,3.117,828,1.619,908,4.108,937,3.042,949,2.555,1030,2.685,1063,3.286,1097,3.383,1132,3.751,1215,3.613,1242,5.013,1302,2.59,1516,6.458,1665,5.701,1763,6.493,1767,3.383,1784,5.175,1785,5.206,1786,5.175,1787,4.352,1788,3.914,1789,4.352,1790,5.175,1791,3.491,1792,5.175,1793,5.175,1794,5.175,1795,5.175,1796,5.175]],["t/192",[0,1.307,7,1.284,21,1.78,25,2.727,35,2.925,50,0.9,66,0.866,69,1.084,70,1.113,95,2.693,96,4.806,98,3.546,120,2.925,165,1.764,170,4.677,207,2.961,236,1.897,306,3.739,359,3.159,378,2.889,426,4.081,533,3.159,539,4.253,665,3.651,708,2.855,731,2.663,749,3.662,1301,6.92,1302,3.789,1508,4.558,1571,4.449]],["t/194",[1,2.603,6,1.784,12,1.163,15,1.056,49,4.882,57,3.433,66,0.77,69,0.964,70,0.991,165,1.569,193,2.54,198,4.543,199,5.153,216,2.888,236,1.688,247,1.751,306,3.547,310,2.128,365,4.701,368,2.929,378,2.571,454,3.206,495,3.371,569,5.346,604,3.015,665,2.481,673,5.093,682,4.882,708,2.54,721,2.37,728,3.561,732,2.243,747,3.494,818,3.561,989,2.343,992,2.571,1016,4.701,1034,5.664,1062,4.882,1119,4.276,1301,4.701,1302,3.371,1507,6.471,1513,5.664,1514,4.882,1521,5.346,1571,3.959,1662,3.705,1797,7.196,1798,6.089,1799,6.734,1800,6.734,1801,6.734,1802,5.664,1803,6.734,1804,6.734,1805,6.089,1806,4.543,1807,5.346,1808,6.734]],["t/196",[12,0.812,15,1.113,20,1.123,22,1.18,25,1.617,53,2.354,54,0.586,55,3.107,57,1.887,63,2.486,66,0.336,67,1.923,69,0.421,70,0.433,76,1.923,82,2.593,100,0.751,103,0.269,112,3.556,113,0.632,115,1.212,128,1.209,130,0.856,139,1.165,144,1.447,146,1.137,151,1.566,156,1.001,157,2.594,163,1.526,165,1.711,166,1.502,171,1.984,193,1.109,199,4.043,207,3.341,209,2.022,210,2.132,216,2.017,217,1.887,219,1.817,232,1.73,236,1.682,245,2.642,246,1.887,258,1.526,266,1.165,284,2.832,306,3.728,319,3.283,320,3.283,326,1.317,328,0.802,334,1.771,337,1.729,339,1.601,340,1.586,343,1.423,356,4.129,360,1.697,366,1.279,378,1.123,410,2.52,422,3.913,434,3.409,454,3.196,470,1.729,495,1.472,496,2.224,504,1.4,506,3.856,539,1.653,545,2.659,551,3.172,571,2.335,597,1.84,604,3.287,607,1.729,665,2.473,681,1.653,687,2.203,698,2.473,704,1.984,708,1.109,712,4.252,726,4.444,727,1.771,728,5.042,729,2.473,730,1.936,732,1.566,733,0.911,740,2.642,747,4.062,749,1.423,750,2.473,753,4.665,756,1.211,757,1.923,766,1.653,783,1.732,818,3.107,824,2.053,827,2.659,829,1.4,848,2.473,920,1.555,966,1.673,972,1.655,984,1.083,1013,2.132,1061,2.335,1062,3.409,1063,1.867,1119,2.986,1133,1.984,1152,3.409,1164,2.473,1193,1.357,1201,2.053,1205,1.618,1301,6.555,1321,2.473,1336,4.389,1378,3.074,1402,5.33,1496,1.653,1508,3.539,1509,2.659,1510,2.224,1513,2.473,1514,3.409,1516,2.132,1517,2.053,1520,2.659,1521,2.335,1524,2.659,1557,5.125,1571,2.764,1572,2.473,1662,3.694,1693,2.473,1766,3.733,1787,2.473,1797,3.955,1798,4.252,1802,2.473,1805,2.659,1806,1.984,1809,6.638,1810,2.941,1811,2.224,1812,2.941,1813,2.941,1814,6.713,1815,7.341,1816,4.702,1817,4.702,1818,2.659,1819,1.923,1820,2.941,1821,2.941,1822,2.659,1823,2.473,1824,2.941,1825,2.659,1826,2.335,1827,2.473,1828,4.702,1829,4.702,1830,6.99,1831,2.941,1832,2.659,1833,2.941,1834,3.955,1835,2.941,1836,2.941,1837,4.252,1838,5.876,1839,5.876,1840,2.473,1841,4.252,1842,2.941,1843,2.941,1844,2.941,1845,2.473,1846,5.313,1847,2.659,1848,2.941,1849,2.659,1850,2.659,1851,2.659,1852,2.659,1853,2.941,1854,2.473]],["t/198",[0,1.116,5,6.269,6,2.38,7,1.336,8,1.003,12,1.551,13,1.571,15,1.176,20,1.3,21,1.241,25,2.003,28,1.212,31,2.627,35,3.044,36,4.225,43,2.713,48,1.914,49,2.469,54,0.658,61,1.705,69,0.925,70,1.071,83,1.596,87,1.914,89,2.297,93,1.648,94,3.064,98,2.473,99,1.446,100,0.869,102,2.791,103,0.302,106,3.826,108,1.197,113,0.732,114,1.874,116,1.065,124,1.502,130,0.62,133,2.704,134,1.461,135,1.824,137,0.886,139,1.349,146,1.316,150,1.421,152,0.808,154,1.021,156,1.159,166,1.087,201,1.147,202,1.099,204,2.118,219,1.316,227,2.226,229,1.914,232,1.554,236,1.974,238,1.836,246,1.366,248,0.993,253,1.254,255,1.956,256,2.051,258,1.767,264,2.297,271,3.777,279,2.904,284,2.051,294,2.226,296,2.297,297,1.836,327,2.864,331,1.134,334,2.051,338,2.104,341,1.914,346,1.767,348,2.297,366,1.481,387,1.384,427,1.801,428,1.836,453,1.956,477,1.547,478,3.451,509,1.801,546,3.685,567,1.914,607,4.631,614,2.002,616,2.377,621,4.225,647,1.676,653,2.162,665,2.682,675,1.874,681,1.914,682,2.469,687,1.596,718,1.198,739,1.735,749,2.554,756,1.402,815,3.077,941,2.529,962,1.284,972,1.198,978,1.254,1016,2.377,1019,2.162,1028,2.104,1049,2.104,1099,4.772,1132,2.469,1193,1.571,1209,2.297,1211,1.956,1245,1.767,1278,5.506,1301,5.082,1302,3.235,1330,2.469,1350,2.297,1443,2.469,1496,2.966,1497,3.685,1501,1.571,1502,1.571,1522,2.864,1650,5.78,1662,1.874,1807,2.704,1823,2.864,1840,2.864,1841,3.079,1855,6.463,1856,3.405,1857,3.405,1858,2.575,1859,3.079,1860,3.405,1861,3.079,1862,5.278,1863,3.405,1864,5.278,1865,5.436,1866,3.405,1867,3.405,1868,2.377,1869,3.405,1870,3.405,1871,3.405,1872,3.405,1873,3.405,1874,3.405,1875,3.405,1876,3.079,1877,3.405,1878,3.405,1879,5.78,1880,7.28,1881,3.405,1882,4.772,1883,5.278,1884,3.405,1885,3.079]],["t/200",[0,1.003,6,0.766,8,1.451,12,1.003,15,1.139,25,1.276,43,1.077,50,1.04,54,0.724,61,1.446,66,1.001,68,1.421,79,1.596,80,1.301,99,0.574,100,1.697,103,0.416,107,1.04,108,1.052,115,0.745,127,1.326,128,1.923,129,0.818,130,1.884,135,1.162,137,2.386,140,0.895,147,1.028,148,0.994,151,2.214,152,1.378,154,1.503,165,0.673,177,2.796,201,0.973,205,1.352,213,1.496,225,2.952,232,2.143,236,1.162,247,0.751,248,1.693,250,1.103,291,0.932,306,2.93,310,1.465,328,1.583,331,1.545,339,2.644,356,3.478,360,2.45,361,2.165,414,1.436,422,1.376,445,1.792,506,3.336,562,1.934,577,1.792,590,2.673,616,3.237,665,2.139,687,3.114,718,2.733,721,1.632,730,1.528,732,1.545,733,2.405,770,1.728,780,1.65,783,1.708,828,1.45,852,1.65,885,1.512,902,2.764,947,1.117,949,1.028,950,1.131,952,1.131,953,1.688,961,1.131,962,1.749,963,1.814,964,1.77,965,1.749,966,2.905,967,1.749,968,2.601,969,1.814,970,1.814,971,1.613,972,1.632,973,1.814,974,0.973,975,2.745,976,0.984,978,1.708,979,1.77,980,1.77,981,1.632,982,1.749,983,1.814,984,1.708,989,1.006,990,1.09,991,1.04,992,1.103,993,1.117,1112,1.835,1205,2.551,1245,1.499,1301,4.64,1302,1.446,1402,5.277,1443,3.362,1557,2.017,1571,2.726,1797,3.9,1802,3.9,1806,3.128,1809,4.193,1832,2.613,1846,4.193,1849,4.193,1850,4.193,1851,4.193,1852,4.193,1876,4.193,1879,2.294,1882,4.193,1885,4.193,1886,4.637,1887,2.89,1888,2.89,1889,2.89,1890,2.89,1891,2.89,1892,2.89,1893,2.89,1894,2.89,1895,2.89,1896,2.89,1897,2.89,1898,2.89,1899,2.89,1900,8.754,1901,4.637,1902,3.681]],["t/202",[15,1.002,22,3.141,65,4.496,66,0.895,69,1.121,70,1.151,96,4.97,100,1.998,113,2.019,115,2.017,140,2.423,141,3.504,179,2.305,209,2.694,219,3.025,255,5.393,317,3.851,318,3.726,386,4.496,604,3.504,738,3.851,825,4.714,1310,7.101,1903,4.601,1904,7.077,1905,6.214,1906,6.583]],["t/204",[8,1.289,15,0.886,69,1.189,70,1.222,78,4.081,99,1.65,103,0.576,105,3.398,113,1.978,116,2.01,128,1.709,130,1.511,138,2.796,156,2.188,164,3.217,188,3.162,217,2.579,234,2.898,247,1.671,253,3.059,255,3.692,266,2.546,326,2.877,341,4.666,344,4.081,364,3.778,366,2.796,369,3.971,387,2.613,388,3.718,410,2.757,465,4.229,466,4.659,713,3.778,766,3.612,852,2.287,1169,3.612,1193,2.965,1310,6.957,1773,5.406,1907,5.406,1908,5.406,1909,7.508,1910,4.202,1911,5.406,1912,6.427,1913,6.427,1914,5.406,1915,6.427,1916,6.427,1917,6.427]],["t/206",[0,0.574,8,1.504,12,1.099,15,1.09,50,1.088,54,0.646,66,1.047,68,1.588,79,1.783,80,1.453,96,3.29,99,0.661,100,1.835,103,0.446,107,1.197,108,1.175,113,1.114,115,0.857,127,1.482,128,1.994,129,0.942,130,1.923,137,1.655,140,1.029,147,1.183,148,1.144,151,2.394,152,1.51,154,1.597,165,0.775,177,2.97,201,1.12,205,1.511,213,1.672,225,3.101,231,2.265,232,1.875,234,1.702,247,0.865,248,1.856,250,1.269,255,2.976,291,1.073,310,1.637,317,3.132,318,3.03,328,1.412,331,1.726,339,2.809,360,2.25,361,1.239,386,1.91,414,1.604,445,2.002,465,1.446,562,2.12,577,2.002,590,2.84,604,2.32,718,2.904,721,1.823,730,1.707,732,1.726,733,2.555,770,1.931,780,1.844,783,1.909,828,1.621,852,1.844,885,1.689,902,2.937,947,1.285,949,1.183,950,1.301,952,1.301,953,1.886,961,1.301,962,1.954,963,2.027,964,1.978,965,1.954,966,3.066,967,1.954,968,2.812,969,2.027,970,2.027,971,1.803,972,1.823,973,2.027,974,1.12,975,2.939,976,1.132,978,1.909,979,1.978,980,1.978,981,1.823,982,1.954,983,2.027,984,1.909,989,1.157,990,1.254,991,1.197,992,1.269,993,1.285,1036,3.756,1310,7.327,1905,4.113,1909,5.756,1918,5.181,1919,3.325,1920,3.325,1921,3.325,1922,3.325,1923,3.325,1924,5.181,1925,5.181,1926,4.358,1927,5.181]],["t/208",[0,0.779,1,1.333,7,1.481,8,1.33,12,1.266,14,0.995,15,1.159,21,1.061,25,1.793,43,1.286,48,1.136,50,0.909,54,0.43,60,1.939,66,0.934,68,1.057,69,0.857,70,0.88,79,1.187,80,0.968,83,0.948,84,1.962,94,0.646,99,1.059,100,1.361,103,0.508,105,1.069,107,0.728,108,1.023,113,0.742,115,0.889,123,2.788,127,0.986,128,1.763,129,0.573,130,1.766,135,0.865,137,1.809,139,2.904,140,1.853,141,0.905,147,0.72,148,0.696,150,0.844,151,1.776,152,1.265,154,1.533,155,1.529,157,0.782,165,0.471,166,1.441,175,4.607,177,2.345,180,0.963,195,1.522,197,2.011,201,0.681,202,1.113,204,1.384,205,1.006,213,1.113,219,0.782,224,1.642,225,2.551,230,3.119,231,1.897,232,1.328,234,1.6,235,3.119,236,1.917,237,3.385,238,1.86,239,2.901,247,0.897,248,1.315,250,0.772,266,0.801,274,2.739,275,2.901,291,1.456,310,1.09,317,2.623,318,1.642,323,1.012,328,0.94,331,1.149,339,2.218,343,1.669,356,2.917,360,2.674,361,0.754,368,0.88,378,2.285,390,1.364,408,2.255,414,1.068,417,1.829,445,1.333,447,1.412,453,1.162,465,0.88,562,1.503,577,1.333,590,2.242,604,0.905,652,2.255,665,0.745,705,1.218,708,1.702,718,2.293,721,1.214,730,1.487,731,0.712,732,1.503,733,2.017,740,1.136,747,1.049,749,0.979,770,1.286,780,1.228,783,1.271,818,1.069,828,1.079,852,1.228,872,2.739,885,1.125,902,2.319,903,2.408,910,2.535,939,3.134,947,0.782,949,0.72,950,0.791,952,0.791,953,1.256,958,4.299,961,0.791,962,1.301,963,1.35,964,1.317,965,1.301,966,2.476,967,1.702,968,2.086,969,1.35,970,1.35,971,1.2,972,1.214,973,1.35,974,1.162,975,2.257,976,0.688,978,1.271,979,1.317,980,1.317,981,1.214,982,1.301,983,1.35,984,1.271,989,0.704,990,1.301,991,0.728,992,0.772,993,0.782,1008,2.028,1095,1.364,1213,1.606,1305,2.408,1337,2.739,1342,1.466,1367,1.701,1392,1.701,1451,3.27,1452,3.794,1510,2.609,1571,3.134,1572,1.701,1599,1.466,1619,4.191,1830,2.739,1928,2.022,1929,2.022,1930,3.45,1931,1.412,1932,3.45,1933,4.511,1934,1.529,1935,3.45,1936,2.022,1937,5.033,1938,4.511,1939,3.45,1940,2.022,1941,2.022,1942,3.45,1943,2.022,1944,4.511,1945,3.45,1946,2.022,1947,2.022,1948,2.901,1949,2.022,1950,2.022,1951,2.022,1952,2.022,1953,3.45,1954,2.022,1955,2.022,1956,2.022,1957,2.022,1958,2.022,1959,2.022,1960,2.022,1961,2.022,1962,2.022,1963,2.022,1964,3.45,1965,3.45,1966,3.45,1967,3.45,1968,3.119,1969,3.119,1970,2.739,1971,3.45,1972,3.45,1973,3.45,1974,3.45,1975,3.45]],["t/210",[4,2.69,6,1.134,7,1.542,8,0.664,12,0.739,15,1.129,28,1.523,35,2.424,39,2.583,50,1.145,51,1.916,54,0.925,66,0.717,69,1.17,70,1.202,82,3.839,84,1.862,89,4.231,94,2.37,95,3.555,99,1.475,100,1.093,101,2.653,102,4.321,103,0.537,104,3.035,105,2.263,113,1.955,116,1.962,117,3.777,118,2.263,128,0.881,129,1.212,130,1.141,135,1.86,137,1.93,153,5.343,160,2.718,223,3.103,234,2.327,246,1.718,247,1.113,248,1.248,258,2.221,266,2.941,271,2.221,279,2.355,281,3.6,323,2.143,326,1.916,328,2.023,360,1.236,366,1.862,387,1.74,411,3.398,414,1.325,428,4.902,457,2.459,604,1.916,638,1.811,676,2.516,704,2.888,730,1.411,733,1.325,829,2.038,838,6.181,910,2.405,1040,3.237,1108,3.524,1117,2.308,1193,1.975,1232,2.888,1271,6.243,1299,4.231,1300,3.398,1308,7.285,1357,2.988,1360,3.6,1361,2.645,1362,3.103,1364,3.6,1377,3.398,1378,5.343,1379,5.275,1384,3.237,1385,4.979,1496,2.405,1577,3.87,1586,2.718,1811,3.237,1934,3.237,1937,3.6,1976,4.378,1977,4.28,1978,4.28,1979,4.28,1980,3.6,1981,4.28,1982,4.28,1983,3.87,1984,4.28,1985,3.87,1986,6.272,1987,6.272,1988,4.28]],["t/212",[0,0.604,8,1.522,12,1.134,15,1.099,50,1.105,54,0.671,66,1.063,68,1.651,79,1.854,80,1.511,99,0.695,100,1.885,103,0.456,107,1.258,108,1.222,115,0.901,127,1.54,128,2.018,129,0.99,130,1.936,137,1.709,140,1.083,147,1.244,148,1.203,151,2.459,152,1.559,154,1.63,165,0.815,177,3.032,201,1.177,205,1.571,213,1.738,225,3.153,232,1.935,234,1.757,247,0.909,248,1.916,250,1.335,284,3.244,291,1.128,310,1.702,328,1.468,331,1.794,339,2.867,360,1.897,361,2.008,414,1.668,445,2.082,562,2.189,577,2.082,590,2.899,718,2.964,721,1.895,730,1.775,732,1.794,733,2.608,770,2.008,780,1.917,783,1.984,828,1.685,838,2.644,852,1.917,885,1.757,902,2.997,947,1.351,949,1.244,950,1.368,952,1.368,953,1.961,961,1.368,962,2.032,963,2.108,964,2.057,965,2.032,966,3.123,967,2.032,968,2.889,969,2.108,970,2.108,971,1.874,972,1.895,973,2.108,974,1.177,975,3.008,976,1.19,978,1.984,979,2.057,980,2.057,981,1.895,982,2.032,983,2.108,984,1.984,989,1.217,990,1.319,991,1.258,992,1.335,993,1.351,1308,7.18,1385,4.277,1985,4.871,1989,5.387,1990,3.496,1991,3.496,1992,3.496,1993,3.496,1994,5.387,1995,5.387]],["t/214",[15,0.997,22,3.748,66,0.887,69,1.111,70,1.142,100,1.981,103,0.444,115,1.999,135,1.945,141,3.474,209,2.671,219,2.999,231,2.762,266,3.075,317,3.819,318,3.695,378,2.963,604,3.474,738,3.819,740,5.249,939,4.562,1195,5.869,1309,7.064,1514,5.626,1571,5.491,1903,4.562,1904,7.017,1906,6.527]],["t/216",[8,1.289,15,0.886,69,1.189,70,1.222,78,4.081,99,1.65,103,0.576,105,3.398,113,1.978,116,2.01,128,1.709,130,1.511,135,1.611,138,2.796,156,2.188,164,3.217,188,3.162,210,4.659,217,2.579,234,2.898,247,1.671,253,3.059,266,2.546,341,4.666,344,4.081,364,3.778,366,2.796,369,3.971,387,2.613,388,2.877,410,2.757,465,4.229,466,4.659,713,3.778,740,3.612,766,3.612,852,2.287,1169,3.612,1193,2.965,1309,6.957,1571,3.778,1907,5.406,1908,5.406,1910,4.202,1911,5.406,1914,5.406,1996,7.508,1997,6.427,1998,6.427,1999,6.427,2000,8.304]],["t/218",[0,0.58,8,1.508,12,1.107,15,1.092,50,1.092,54,0.651,66,1.051,68,1.602,79,1.798,80,1.466,99,0.668,100,2.116,103,0.448,107,1.21,108,1.185,113,1.124,115,0.866,127,1.494,128,1.999,129,0.952,130,1.926,137,1.667,140,1.041,147,1.196,148,1.157,151,2.408,152,1.521,154,1.604,165,0.783,177,2.984,201,1.132,205,1.524,213,1.686,225,3.113,231,2.281,232,1.888,234,1.714,247,0.874,248,1.869,250,1.283,291,1.085,310,1.651,317,3.154,318,3.052,328,1.424,331,1.741,339,2.822,360,2.261,361,1.253,378,1.995,386,1.931,414,1.618,445,2.019,465,1.462,562,2.135,577,2.019,590,2.853,718,2.917,721,1.839,730,1.722,732,1.741,733,2.567,770,1.948,780,1.86,783,1.925,828,1.634,852,1.86,885,1.704,902,2.95,947,1.299,949,1.196,950,1.315,952,1.315,953,1.903,961,1.315,962,1.971,963,2.045,964,1.995,965,1.971,966,3.079,967,1.971,968,2.829,969,2.045,970,2.045,971,1.818,972,1.839,973,2.045,974,1.132,975,2.954,976,1.144,978,1.925,979,1.995,980,1.995,981,1.839,982,1.971,983,2.045,984,1.925,989,1.17,990,1.268,991,1.21,992,1.283,993,1.299,1309,7.346,1911,4.395,1996,3.039,2001,5.225,2002,3.362,2003,3.362,2004,3.362,2005,3.362,2006,3.362,2007,5.225,2008,5.225,2009,5.225,2010,5.225]],["t/220",[0,1.48,1,3.314,7,1.734,10,4.052,11,3.486,42,3.206,50,1.215,54,0.843,69,1.228,70,0.994,94,2.158,95,2.405,100,1.725,101,2.859,103,0.567,116,2.114,120,2.612,135,1.694,152,1.604,164,3.383,166,2.738,179,1.99,202,2.181,207,2.645,231,2.405,254,2.405,340,3.644,360,1.952,366,2.94,410,2.899,428,3.644,453,3.883,638,2.859,717,4.9,815,3.218,828,2.114,863,4.071,877,4.177,956,3.973,1030,3.507,1097,4.419,2011,6.759,2012,6.759]],["t/222",[0,1.157,7,1.675,10,3.452,20,1.377,21,1.764,22,1.447,27,1.805,28,1.283,39,2.892,50,1.157,66,1.113,69,1.221,70,1.255,83,1.69,99,0.716,103,0.606,113,1.186,115,0.929,116,2.934,119,1.907,124,2.956,131,1.871,140,1.117,152,2.397,157,2.132,174,3.322,179,3.233,202,2.421,207,2.936,209,2.305,217,1.447,234,2.56,236,2.351,253,2.032,264,3.722,349,3.517,359,1.505,378,2.106,379,3.409,387,2.723,481,1.984,482,2.228,492,4.604,504,2.626,533,4.063,638,3.608,671,3.722,727,2.172,755,1.871,756,1.485,780,1.283,1009,2.614,1030,3.476,1032,6.311,1132,4.857,1193,3.934,1252,2.863,1406,2.863,1931,3.851,2013,3.261,2014,3.033,2015,3.033,2016,7.311,2017,8.306,2018,6.699,2019,4.988,2020,5.953,2021,3.261,2022,3.261,2023,2.727,2024,3.503,2025,3.261]],["t/224",[0,1.363,10,3.945,15,0.843,21,1.856,25,2.597,39,2.495,69,1.351,70,1.388,80,2.214,113,1.698,116,2.469,119,4.174,225,2.747,234,2.111,343,3.82,409,4.641,738,3.884,920,4.99,1030,4.096,2026,7.895,2027,7.895,2028,6.64]],["t/226",[0,1.652,1,2.702,10,2.637,21,1.644,25,1.924,50,1.041,54,0.871,66,0.799,69,1.001,70,1.028,80,1.961,93,3.383,101,3.706,103,0.501,113,1.504,141,3.13,146,2.702,152,2.079,154,1.353,165,2.041,204,3.515,209,3.015,246,2.805,247,1.818,378,2.669,379,5.413,406,3.697,409,4.11,410,2.999,419,5.518,454,3.328,638,3.706,721,2.46,770,2.606,885,2.28,1031,4.571,1130,5.413,2028,5.88,2029,6.321,2030,6.991,2031,7.368,2032,6.991,2033,6.991]],["t/228",[0,1.547,7,1.032,10,3.379,21,2.389,22,2.442,25,1.674,28,2.166,39,3.009,50,1.207,66,1.131,68,1.865,80,1.707,83,2.851,87,3.42,100,1.553,103,0.566,113,1.723,116,1.904,130,1.107,150,2.54,152,1.444,156,2.071,202,1.964,204,2.442,209,2.094,234,2.646,236,1.525,247,1.582,317,2.994,318,2.897,322,4.412,326,2.724,349,3.486,356,2.724,379,3.76,409,3.577,410,2.61,434,4.412,477,2.765,504,2.897,533,3.739,599,3.348,638,2.575,653,5.088,671,5.406,738,2.994,2023,6.06,2024,6.282,2028,5.118,2034,9.521,2035,4.106,2036,4.832,2037,5.502,2038,5.502,2039,6.086]],["t/230",[7,1.336,8,0.92,10,2.971,20,2.263,21,1.852,22,3.16,26,3.173,39,2.489,51,2.654,57,3.549,62,3.999,68,1.817,69,0.849,70,0.872,98,2.778,101,2.508,103,0.451,116,1.854,122,5.001,131,3.076,145,4.138,146,3.418,152,1.407,162,2.158,165,2.061,173,2.41,179,3.115,195,2.616,200,2.868,234,2.752,328,1.616,357,3.405,359,3.287,378,2.263,386,4.524,387,3.831,410,2.543,422,2.822,465,2.579,476,2.822,481,3.262,495,2.967,562,1.975,591,3.764,599,3.262,600,3.663,603,2.654,608,4.706,708,2.971,829,2.822,885,1.933,893,3.999,920,3.134,940,4.483,976,2.018,1193,2.735,1201,4.138,1325,4.138,1785,4.298,1788,4.483,1976,5.498,2017,4.986,2024,3.764,2040,5.36,2041,5.36,2042,5.36,2043,5.36,2044,4.986,2045,4.706]],["t/232",[0,0.573,7,0.563,8,1.503,12,1.098,15,1.089,25,0.913,39,1.635,50,1.167,54,0.645,66,1.047,68,1.586,79,1.78,80,1.451,99,0.659,100,1.833,103,0.51,107,1.195,108,1.174,115,0.855,124,1.464,127,1.479,128,1.993,129,0.94,130,1.923,137,1.653,140,1.028,147,1.181,148,1.142,151,2.392,152,1.509,154,1.596,165,0.773,177,2.968,201,1.118,205,1.509,213,1.669,225,3.099,232,1.872,234,1.384,247,0.863,248,1.854,250,1.267,291,1.071,310,1.635,317,1.633,328,1.41,331,1.723,339,2.807,356,1.486,360,2.248,361,1.237,368,2.25,414,1.602,426,1.789,445,1.999,562,2.118,577,1.999,590,2.838,638,2.189,718,2.902,721,1.82,730,1.705,732,1.723,733,2.553,756,1.367,770,1.928,780,1.841,783,1.906,828,1.618,845,1.826,852,1.841,885,1.687,902,2.934,947,1.283,949,1.181,950,1.299,952,1.299,953,1.884,961,1.299,962,1.952,963,2.024,964,1.975,965,1.952,966,3.064,967,1.952,968,2.809,969,2.024,970,2.024,971,1.8,972,1.82,973,2.024,974,1.118,975,2.936,976,1.13,978,1.906,979,1.975,980,1.975,981,1.82,982,1.952,983,2.024,984,1.906,989,1.155,990,1.252,991,1.195,992,1.267,993,1.283,1132,5.205,1193,1.531,2017,2.791,2023,3.913,2024,3.285,2031,4.352,2038,4.678,2046,5.174,2047,3.319,2048,3.001,2049,3.319,2050,3.319,2051,3.319,2052,9.152,2053,5.174,2054,5.174]],["t/234",[0,1.69,1,2.843,7,1.732,10,3.954,50,1.164,54,0.917,66,1.168,69,1.053,70,1.082,95,2.618,103,0.517,114,4.047,115,1.895,116,2.301,120,2.843,134,3.155,138,3.2,166,2.887,533,3.07,638,3.112,731,2.588,733,2.278,739,3.748,755,3.817,815,3.502,1030,3.817,1096,5.563,1097,4.809,1302,3.682,2055,6.651]],["t/236",[0,0.855,8,1.482,12,1.058,15,1.078,25,0.863,50,1.179,54,0.617,66,1.053,68,1.517,69,0.449,70,0.462,79,1.704,80,1.388,99,0.623,100,1.777,103,0.461,107,1.129,108,1.123,113,0.675,115,0.808,127,1.753,128,1.993,129,1.402,130,1.938,134,2.986,135,1.241,137,1.594,140,0.971,147,1.116,148,1.08,151,2.319,152,1.455,154,1.558,157,1.913,165,1.429,177,2.899,201,1.056,205,1.443,207,1.937,213,1.978,225,3.04,229,2.782,232,2.05,238,2.669,247,0.816,248,1.788,250,1.198,291,1.012,294,3.236,296,3.34,297,2.669,310,1.564,328,1.349,331,1.649,339,2.741,346,3.181,348,4.136,356,1.404,360,2.325,361,1.169,379,5.901,414,1.533,419,1.726,427,1.659,445,1.913,509,1.659,562,2.042,577,1.913,590,2.771,647,1.544,718,2.834,721,1.742,730,1.631,732,1.649,733,2.493,756,1.292,770,1.845,780,1.762,783,1.823,828,1.548,852,1.762,885,1.614,902,2.866,947,1.212,949,1.116,950,1.227,952,1.227,953,1.802,961,1.227,962,1.867,963,1.937,964,1.89,965,1.867,966,3,967,1.867,968,2.724,969,1.937,970,1.937,971,1.722,972,1.742,973,1.937,974,1.056,975,2.858,976,1.068,978,1.823,979,1.89,980,1.89,981,1.742,982,1.867,983,1.937,984,1.823,989,1.092,990,1.183,991,1.129,992,1.198,993,1.212,998,1.992,1096,3.744,1116,1.763,1128,1.889,1130,1.939,1131,4.476,1132,3.589,2056,4.95,2057,3.137,2058,3.137,2059,3.137,2060,3.137,2061,3.137,2062,3.137,2063,4.163]],["t/238",[0,1.282,7,1.259,8,1.466,12,1.03,15,1.069,17,5.007,26,1.013,50,1.201,54,0.597,66,1.111,68,1.468,69,0.431,70,0.443,79,1.648,80,1.343,94,0.961,95,1.071,99,0.598,100,1.222,103,0.452,107,1.083,108,1.086,113,0.647,114,1.655,115,0.775,127,1.706,128,1.973,129,1.356,130,1.934,134,3.184,137,0.782,140,0.931,147,1.071,148,1.035,151,2.265,152,1.415,154,1.53,157,1.163,165,1.39,166,0.961,173,1.223,177,2.846,201,1.013,205,1.396,213,1.545,225,2.996,231,1.704,232,1.757,234,1.595,236,1.495,247,0.782,248,1.739,250,1.149,291,0.971,306,2.25,310,1.513,317,2.935,328,1.626,331,1.595,339,2.692,360,2.144,361,1.121,414,1.483,427,1.591,445,1.851,509,1.591,533,1.256,562,1.987,577,1.851,590,2.721,670,1.812,718,2.783,721,1.685,730,1.578,732,1.595,733,2.448,756,1.239,770,1.785,780,1.704,783,1.764,815,1.432,828,1.498,852,1.704,885,1.561,902,2.814,947,1.163,949,1.071,950,1.177,952,1.177,953,1.744,961,1.177,962,1.806,963,1.874,964,1.828,965,1.806,966,2.951,967,1.806,968,2.661,969,1.874,970,1.874,971,1.666,972,1.685,973,1.874,974,1.013,975,2.8,976,1.024,978,1.764,979,1.828,980,1.828,981,1.685,982,1.806,983,1.874,984,1.764,989,1.047,990,1.135,991,1.083,992,1.149,993,1.163,1068,3.343,1088,4.33,1090,3.343,1091,3.343,1092,3.343,1093,3.343,1094,3.343,1095,3.23,1302,1.506,1650,3.802,2064,2.72,2065,4.788,2066,3.008,2067,3.008,2068,3.008,2069,3.008,2070,3.008,2071,4.788]],["t/240",[0,1.291,1,2.889,7,1.786,11,4.451,50,1.085,69,1.307,70,1.343,95,2.66,100,1.908,103,0.428,113,1.608,120,2.889,135,1.873,166,2.916,207,2.925,231,3.249,234,1.999,815,3.559,976,2.545,984,2.754,1030,4.738,1097,4.888,2072,9.131,2073,7.476]],["t/242",[0,1.158,7,1.676,11,3.893,20,1.38,21,1.766,22,1.45,27,1.809,28,1.286,39,2.894,50,1.158,66,1.114,69,1.222,70,1.255,83,1.693,99,0.718,103,0.603,113,1.443,115,0.931,116,2.936,119,1.911,124,2.959,131,1.875,140,1.119,152,2.398,157,2.135,174,3.328,179,3.234,202,2.424,209,2.308,217,1.45,234,2.561,236,2.352,253,2.035,264,3.727,306,3.879,349,3.52,359,1.508,378,2.109,387,2.726,481,1.988,482,2.233,492,4.607,504,2.63,533,4.065,562,1.204,638,3.61,671,3.727,727,2.176,755,1.875,756,1.488,780,1.286,1009,2.62,1030,3.897,1032,6.318,1193,3.937,1252,2.869,1406,2.869,1412,5.001,1931,3.857,2013,3.267,2014,3.039,2015,3.039,2016,6.065,2019,4.995,2020,5.958,2021,3.267,2022,3.267,2023,2.733,2024,3.508,2025,3.267]],["t/244",[7,1.774,11,3.836,35,3.051,39,2.495,66,0.903,69,1.351,70,1.388,72,5.971,99,1.568,103,0.452,152,1.873,179,2.325,231,2.809,234,2.524,349,3.434,829,3.758,845,4.344,1030,4.096,1193,3.642,2074,7.138,2075,6.64,2076,7.895]],["t/246",[0,1.363,11,3.836,50,1.122,65,4.535,66,1.079,103,0.452,108,1.791,113,1.698,116,2.469,152,1.873,165,2.199,173,3.209,179,2.325,204,3.168,219,3.051,247,2.454,306,3.808,378,3.014,564,5.326,638,3.34,653,5.013,2077,6.64]],["t/248",[6,1.765,7,1.441,8,1.034,11,3.454,13,3.073,21,2.317,35,3.808,39,3.114,50,1.01,66,1.07,68,2.041,72,6.426,103,0.564,116,2.083,124,2.939,130,1.212,138,2.897,150,2.78,152,1.58,202,2.149,209,2.292,234,2.502,236,2.129,306,3.529,349,3.696,422,4.045,492,3.456,504,3.171,533,2.78,638,2.818,845,3.665,1030,3.456,1193,3.073,1906,5.602,2023,5.037,2024,6.257,2035,4.494,2036,5.288,2037,6.023,2078,6.023,2079,6.661,2080,6.023,2081,6.661,2082,6.661]],["t/251",[55,4.633,108,1.988,113,1.885,2075,7.37,2083,7.923,2084,7.923]],["t/253",[7,1.19,11,3.57,15,0.749,21,1.65,39,2.218,51,3.142,55,3.711,57,3.524,66,1.148,70,1.292,103,0.402,113,1.889,123,4.337,146,2.712,152,1.665,200,3.396,210,5.088,224,3.341,234,2.349,236,1.759,306,3.312,310,2.218,322,5.088,328,1.913,446,4.588,481,3.861,509,3.711,597,3.75,665,3.53,730,2.313,765,4.125,818,3.711,885,2.288,972,2.469,980,2.679,1377,5.572,1970,5.572,2074,6.345,2085,9.081,2086,8.781,2087,6.345]],["t/255",[7,1.336,8,0.92,11,3.201,20,2.263,21,1.852,22,3.16,26,3.173,39,2.489,51,2.654,57,3.549,62,3.999,68,1.817,69,0.849,70,0.872,98,2.778,101,2.508,103,0.451,116,1.854,122,5.001,131,3.076,145,4.138,146,3.418,152,1.407,162,2.158,165,2.061,173,2.41,179,3.115,195,2.616,200,2.868,234,2.752,328,1.616,357,3.405,359,3.287,378,2.263,386,4.524,387,3.831,410,2.543,422,2.822,465,2.579,476,2.822,481,3.262,495,2.967,562,1.975,591,3.764,599,3.262,600,3.663,603,2.654,608,4.706,708,2.971,829,2.822,885,1.933,893,3.999,920,3.134,940,4.483,976,2.018,1193,2.735,1201,4.138,1325,4.138,1785,4.298,1788,4.483,1976,5.498,2024,3.764,2040,5.36,2041,5.36,2042,5.36,2043,5.36,2044,4.986,2045,4.706,2088,5.928]],["t/257",[0,0.571,7,0.561,8,1.502,11,1.344,12,1.095,15,1.089,39,1.63,50,1.166,54,0.643,66,1.045,68,1.581,79,1.775,80,1.447,99,0.657,100,1.829,103,0.523,107,1.19,108,1.17,115,0.852,124,1.459,127,1.475,128,1.991,129,0.937,130,1.922,137,1.65,140,1.024,147,1.177,148,1.138,151,2.387,152,1.505,154,1.593,156,1.126,165,0.771,177,2.964,197,1.247,201,1.113,205,1.504,213,1.665,225,3.096,232,1.868,234,1.38,247,0.86,248,1.85,250,1.263,291,1.067,306,2.703,310,1.63,317,1.627,328,1.406,331,1.719,339,2.803,360,2.244,361,1.233,414,1.597,422,1.574,426,1.783,445,1.994,482,2.043,562,2.113,577,1.994,590,2.834,718,2.897,721,1.815,730,1.7,732,1.719,733,2.549,756,1.362,770,1.923,780,1.836,783,1.901,828,1.614,845,1.82,852,1.836,885,1.682,902,2.93,947,1.278,949,1.177,950,1.294,952,1.294,953,1.879,961,1.294,962,1.946,963,2.019,964,1.97,965,1.946,966,3.06,967,1.946,968,2.804,969,2.019,970,2.019,971,1.795,972,1.815,973,2.019,974,1.113,975,2.931,976,1.126,978,1.901,979,1.97,980,1.97,981,1.815,982,1.946,983,2.019,984,1.901,989,1.151,990,1.247,991,1.19,992,1.263,993,1.278,1185,4.798,1193,1.526,1412,3.188,1445,4.339,1446,4.339,1458,7.689,1508,1.992,1557,2.309,2077,2.781,2080,4.665,2089,5.159,2090,3.307,2091,2.99,2092,3.307,2093,3.307,2094,5.159]],["t/259",[0,1.721,7,1.69,16,6.77,50,1.185,54,0.955,66,1.184,95,2.727,103,0.53,114,4.217,115,1.974,116,2.397,120,2.962,134,3.287,138,3.333,166,2.447,533,3.199,731,2.697,733,2.373,739,3.905,755,3.976,815,3.648,1302,3.836,2055,6.929]],["t/261",[0,0.845,8,1.477,12,1.049,15,1.075,16,3.973,50,1.175,54,0.61,66,1.049,68,1.501,69,0.443,70,0.455,79,1.685,80,1.374,99,0.615,100,1.764,103,0.458,107,1.114,108,1.111,113,0.666,115,0.797,127,1.738,128,1.987,129,1.387,130,1.934,134,2.964,135,1.887,137,1.58,140,0.958,147,1.101,148,1.065,151,2.302,152,1.442,154,1.549,165,1.416,177,2.882,201,1.042,205,1.428,207,1.916,213,1.961,224,1.473,225,3.026,229,2.752,232,2.035,238,2.64,247,0.805,248,1.772,250,1.181,291,0.999,297,2.64,310,1.548,328,1.335,331,1.631,339,2.725,346,3.585,360,2.422,361,1.154,414,1.516,419,1.703,427,1.636,445,1.893,509,1.636,562,2.024,577,1.893,590,2.755,603,1.385,647,1.523,653,4.387,718,2.817,721,1.723,730,1.614,732,1.631,733,2.479,756,1.275,770,1.825,780,1.743,783,1.804,828,1.532,845,1.703,852,1.743,885,1.597,902,2.849,947,1.196,949,1.101,950,1.211,952,1.211,953,1.783,961,1.211,962,1.847,963,1.916,964,1.87,965,1.847,966,2.984,967,1.847,968,2.703,969,1.916,970,1.916,971,1.704,972,1.723,973,1.916,974,1.042,975,2.84,976,1.053,978,1.804,979,1.87,980,1.87,981,1.723,982,1.847,983,1.916,984,1.804,989,1.077,990,1.167,991,1.114,992,1.181,993,1.196,998,1.965,1116,1.739,1128,1.864,1130,1.912,1149,5.495,1151,2.798,1152,2.244,1153,8.604,1154,4.428,1155,4.428,2095,4.897,2096,3.095,2097,3.095,2098,3.095,2099,3.095,2100,3.095,2101,3.095,2102,3.095,2103,4.897]],["t/263",[0,1.569,1,2.866,7,1.737,11,4.346,50,0.881,63,3.921,66,1.039,69,1.062,70,1.091,94,2.368,95,2.639,103,0.52,162,2.7,166,2.901,207,2.901,209,2.552,216,3.181,224,3.53,231,3.496,236,1.858,306,2.797,638,3.137,670,4.466,749,3.588,815,3.53,1030,3.848,1045,5.376,1097,4.848,1302,3.712,2064,6.705]],["t/265",[0,0.857,7,0.842,8,1.484,11,3.941,12,1.061,15,1.079,50,1.18,54,0.619,66,1.054,68,1.521,69,0.451,70,0.463,79,1.708,80,1.392,99,0.986,100,1.78,103,0.461,107,1.133,108,1.126,113,0.677,115,0.811,127,1.757,128,1.995,129,1.406,130,1.939,134,2.992,137,1.598,140,0.975,147,1.12,148,1.083,151,2.323,152,1.458,154,1.56,165,1.432,177,2.903,201,1.06,205,1.447,213,1.602,225,3.044,229,2.789,231,1.12,232,1.81,234,1.643,236,1.54,237,3.152,247,0.819,248,1.792,250,1.202,291,1.016,306,2.318,310,1.569,317,3.024,328,1.353,331,1.653,339,2.745,360,2.192,361,1.173,414,1.537,427,1.664,445,1.918,509,1.664,562,2.047,577,1.918,590,2.775,718,2.838,721,1.747,730,1.636,732,1.653,733,2.497,756,1.296,770,1.85,780,1.766,783,1.828,828,1.553,852,1.766,885,1.619,902,2.87,947,1.217,949,1.12,950,1.232,952,1.232,953,1.807,961,1.232,962,1.872,963,1.942,964,1.895,965,1.872,966,3.004,967,1.872,968,2.729,969,1.942,970,1.942,971,1.727,972,1.747,973,1.942,974,1.06,975,2.863,976,1.071,978,1.828,979,1.895,980,1.895,981,1.747,982,1.872,983,1.942,984,1.828,989,1.095,990,1.187,991,1.133,992,1.202,993,1.217,1090,3.465,1091,3.465,1092,3.465,1093,3.465,1094,3.465,1181,5.556,1184,4.488,1185,3.754,2104,4.964,2105,3.148,2106,3.148,2107,3.148,2108,3.148,2109,3.148,2110,4.964]],["t/267",[0,1.663,7,1.387,9,5.757,26,2.753,50,1.145,66,1.102,103,0.468,114,4.499,130,1.488,134,3.507,157,3.16,166,2.611,173,3.324,231,2.91,328,2.228,533,3.413]],["t/269",[0,0.883,8,1.498,9,5.674,12,1.088,15,1.086,25,0.9,50,1.189,54,0.638,66,1.066,68,1.568,69,0.468,70,0.481,79,1.761,80,1.435,99,0.65,100,1.819,103,0.442,107,1.178,108,1.161,113,0.704,115,0.843,127,1.802,128,2.013,129,1.449,130,1.948,134,3.056,137,1.638,140,1.013,147,1.164,148,1.126,151,2.373,152,1.495,154,1.586,165,1.468,177,2.95,201,1.102,205,1.492,213,1.651,225,3.084,231,1.821,232,1.855,234,1.685,238,2.758,247,0.851,248,1.837,250,1.249,291,1.056,300,4.062,301,4.062,310,1.617,328,1.394,331,1.704,339,2.79,356,1.465,360,2.057,361,1.219,414,1.584,427,1.73,445,1.977,509,1.73,562,2.098,577,1.977,590,2.821,718,2.884,721,1.8,730,1.686,732,1.704,733,2.538,756,1.347,770,1.907,780,1.821,783,1.885,828,1.6,852,1.821,885,1.668,902,2.917,947,1.264,949,1.164,950,1.28,952,1.28,953,1.863,961,1.28,962,1.93,963,2.002,964,1.953,965,1.93,966,3.048,967,1.93,968,2.788,969,2.002,970,2.002,971,1.78,972,1.8,973,2.002,974,1.102,975,2.916,976,1.114,978,1.885,979,1.953,980,1.953,981,1.8,982,1.93,983,2.002,984,1.885,989,1.138,990,1.234,991,1.178,992,1.249,993,1.264,1175,4.626,2111,5.116,2112,3.272,2113,3.272,2114,3.272,2115,3.272,2116,5.116]],["t/271",[15,0.955,21,2.285,66,0.828,99,1.438,100,2.285,103,0.556,113,1.925,116,2.265,141,3.241,173,3.951,219,3.46,231,3.713,234,2.394,245,4.068,266,2.868,318,3.446,326,3.241,387,2.943,388,4.008,428,4.827,465,3.149,562,2.411,733,2.242,852,2.576,1030,3.756,1314,6.771,1369,6.546,1370,5.748,2117,7.24,2118,7.24,2119,7.24,2120,6.546]],["t/273",[0,0.588,8,1.513,12,1.116,15,1.094,25,0.937,50,1.096,54,0.658,66,1.055,68,1.618,79,1.816,80,1.48,99,0.677,100,1.858,103,0.451,107,1.226,108,1.197,113,0.732,115,0.877,127,1.509,128,2.005,129,0.964,130,1.929,137,1.681,140,1.054,147,1.212,148,1.172,151,2.425,152,1.533,154,1.682,165,0.794,177,3,201,1.147,205,1.539,213,1.703,225,3.126,231,1.212,232,1.903,234,1.728,247,0.886,248,1.885,250,1.3,291,1.099,310,1.668,318,3.077,328,1.439,331,1.758,339,2.837,360,2.102,361,1.269,414,1.634,428,1.836,445,2.04,465,1.481,562,2.153,577,2.04,590,2.868,705,3.179,718,2.932,721,1.857,730,1.739,732,1.758,733,2.58,770,1.967,780,1.878,783,1.944,828,1.651,852,1.878,885,1.721,902,2.966,947,1.316,949,1.212,950,1.332,952,1.332,953,1.922,961,1.332,962,1.991,963,2.065,964,2.015,965,1.991,966,3.094,967,1.991,968,2.848,969,2.065,970,2.065,971,1.837,972,1.857,973,2.065,974,1.147,975,2.971,976,1.159,978,1.944,979,2.015,980,2.015,981,1.857,982,1.991,983,2.065,984,1.944,989,1.185,990,1.284,991,1.226,992,1.3,993,1.316,1101,1.956,1314,7.369,1370,2.704,2120,5.844,2121,5.278,2122,3.405,2123,3.405,2124,3.405,2125,3.405,2126,3.405,2127,5.278,2128,5.278,2129,4.772]],["t/275",[6,1.33,7,0.851,26,1.69,35,3.135,53,3.519,66,0.574,68,1.538,69,1.373,70,1.361,94,1.603,103,0.287,108,1.595,116,2.199,162,3.201,163,2.604,165,1.891,167,4.559,168,3.573,173,3.298,182,2.247,188,2.469,197,3.316,199,3.023,217,2.014,236,1.762,247,1.828,256,3.023,258,2.604,259,2.512,276,3.023,323,2.512,349,2.183,350,2.706,388,3.632,410,3.015,438,3.504,442,2.95,443,3.281,458,3.796,491,3.638,515,4.538,597,1.964,601,3.796,603,3.632,619,3.796,659,3.281,665,1.849,674,4.742,708,3.316,714,3.985,715,3.985,721,1.766,738,4.325,740,3.95,766,2.82,772,4.234,776,7.347,777,7.254,781,2.469,829,2.389,860,5.912,861,3.796,867,6.356,868,4.538,972,1.766,997,3.638,998,3.187,1108,2.82,1193,2.315,1313,3.796,1368,4.742,1571,4.132,1628,3.386,1791,3.386,1807,3.985,1903,4.132,1905,6.441,2130,8.067,2131,5.019,2132,7.03,2133,9.254,2134,5.019,2135,4.538,2136,4.538,2137,5.019,2138,5.019,2139,4.538,2140,5.019,2141,5.019,2142,5.019,2143,5.019]],["t/277",[0,0.578,7,0.884,8,1.507,12,1.104,15,1.138,50,1.091,53,2.608,54,0.65,66,1.049,68,1.597,79,1.793,80,1.461,99,0.665,100,1.842,103,0.447,107,1.206,108,1.182,115,0.863,127,1.49,128,1.997,129,0.949,130,1.925,137,1.663,139,2.064,140,1.037,147,1.192,148,1.153,151,2.403,152,1.517,154,1.602,165,0.781,177,2.979,193,1.965,201,1.128,205,1.519,213,1.681,225,3.109,232,1.883,247,1.663,248,1.865,250,1.279,289,2.118,291,1.081,310,1.647,328,1.42,331,1.736,339,2.817,360,2.084,361,1.248,414,1.613,445,2.014,562,2.13,577,2.014,590,2.848,705,3.138,718,2.912,721,1.833,730,1.717,732,1.736,733,2.563,770,1.942,780,1.854,783,1.919,828,1.63,852,1.854,885,1.699,902,2.946,947,1.294,949,1.192,950,1.31,952,1.31,953,1.897,958,3.22,961,1.31,962,1.965,963,2.039,964,1.989,965,1.965,966,3.075,967,1.965,968,2.823,969,2.039,970,2.039,971,1.813,972,1.833,973,2.039,974,1.128,975,2.949,976,1.14,978,1.919,979,1.989,980,1.989,981,1.833,982,1.965,983,2.039,984,1.919,989,1.165,990,1.263,991,1.206,992,1.279,993,1.294,1312,3.941,1316,3.638,1576,4.137,1619,3.138,2130,7.719,2144,5.211,2145,3.349,2146,3.349,2147,3.349,2148,3.349,2149,5.211,2150,5.211,2151,4.382]],["t/279",[0,1.375,15,0.85,21,1.873,69,1.14,70,1.171,95,2.834,103,0.456,113,1.713,120,3.078,130,1.449,141,3.565,150,3.324,165,1.856,388,3.565,465,3.464,738,3.918,829,3.791,860,6.698,981,2.802,997,5.773,1081,5.559,1312,7.174,2152,7.963,2153,7.963,2154,7.963,2155,7.963]],["t/281",[0,0.582,8,1.509,12,1.109,15,1.12,50,1.093,54,0.653,66,1.052,68,1.606,79,1.803,80,1.47,99,0.67,100,1.849,103,0.449,107,1.214,108,1.189,113,0.726,115,0.869,127,1.499,128,2.001,129,0.955,130,1.927,135,1.313,137,1.671,140,1.045,147,1.201,148,1.161,151,2.413,152,1.525,154,1.606,165,0.786,177,2.988,201,1.136,205,1.528,213,1.691,225,3.116,231,1.865,232,1.892,234,1.402,247,0.877,248,1.874,250,1.288,271,2.719,291,1.089,310,1.656,318,3.449,328,1.428,331,1.746,339,2.826,360,2.092,361,1.258,414,1.623,445,2.025,465,1.468,562,2.14,577,2.025,590,2.857,705,3.156,718,2.921,721,1.844,730,1.727,732,1.746,733,2.57,770,1.953,780,1.865,783,1.93,828,1.639,852,1.865,885,1.709,902,2.954,947,1.304,949,1.201,950,1.32,952,1.32,953,1.908,961,1.32,962,1.977,963,2.05,964,2.001,965,1.977,966,3.083,967,1.977,968,2.834,969,2.05,970,2.05,971,1.823,972,1.844,973,2.05,974,1.136,975,2.959,976,1.148,978,1.93,979,2.001,980,2.001,981,1.844,982,1.977,983,2.05,984,1.93,989,1.174,990,1.273,991,1.214,992,1.288,993,1.304,1312,7.11,2129,4.738,2156,5.24,2157,3.374,2158,3.374,2159,3.374,2160,3.374,2161,3.051,2162,3.374,2163,3.374,2164,5.24,2165,5.24,2166,5.24,2167,5.24]],["t/283",[6,2.047,7,0.977,8,1.199,15,0.994,35,2.226,50,0.918,66,0.884,69,1.248,70,1.282,78,3.658,94,1.839,99,1.535,100,1.47,101,2.437,103,0.533,105,3.046,113,1.662,128,1.794,130,1.406,138,2.506,156,1.961,164,2.883,174,3.469,231,2.749,234,2.867,246,2.312,247,1.498,253,2.846,266,2.282,341,4.342,344,3.658,359,2.404,364,3.386,369,3.559,386,4.438,388,3.459,410,2.471,465,3.792,466,4.176,492,2.989,519,3.106,665,2.846,703,3.309,710,4.021,766,3.237,852,2.05,1169,3.237,1193,4.022,1311,7.406,1393,4.845,1607,3.469,1907,4.845,1908,4.845,1910,3.766,1914,4.845,2168,5.208,2169,5.76,2170,5.76,2171,4.021,2172,6.986,2173,7.726,2174,5.76,2175,5.76,2176,5.76,2177,5.76,2178,5.76,2179,5.76,2180,5.76]],["t/285",[6,1.957,7,1.537,8,1.147,15,0.967,22,2.964,26,2.487,50,0.878,69,1.298,70,1.333,94,2.894,103,0.519,130,1.344,139,2.926,140,2.287,156,2.514,193,3.419,195,3.259,212,4.342,357,4.243,358,5.586,360,2.617,439,4.983,1128,5.459,1311,6.571,1535,4.828,1576,5.864,1868,5.156,2151,6.212,2181,7.386,2182,8.195,2183,6.678,2184,6.212,2185,7.386,2186,7.386]],["t/287",[7,1.617,8,1.077,12,1.505,15,0.93,42,3.404,43,3.841,50,0.825,54,1.087,69,1.365,70,1.403,83,3.251,94,3.409,103,0.499,139,2.749,291,3.227,308,3.817,357,3.986,358,5.247,360,2.003,366,3.792,457,3.986,532,5.508,756,2.857,1311,5.03,1535,4.536,2031,5.835,2184,8.412,2187,7.333,2188,6.273,2189,6.938]],["t/289",[0,0.556,7,1.058,8,1.492,12,1.076,15,1.123,43,1.2,50,1.078,54,0.777,66,1.037,68,1.549,79,1.739,80,1.417,94,1.613,99,0.64,100,1.803,103,0.439,107,1.159,108,1.146,115,0.83,127,1.445,128,1.978,129,0.912,130,1.914,137,1.622,139,1.276,140,0.997,147,1.146,148,1.108,151,2.353,152,1.48,154,1.576,156,1.096,165,0.75,177,2.931,193,1.906,201,1.084,205,1.473,213,1.63,225,3.068,231,1.146,232,1.836,234,1.668,247,0.837,248,1.818,250,1.229,291,1.039,310,1.597,328,1.377,331,1.683,339,2.771,357,3.582,358,4.716,360,2.618,361,1.2,386,1.85,414,1.564,445,1.953,465,1.401,562,2.077,577,1.953,590,2.802,705,3.043,718,2.865,721,1.778,730,1.665,732,1.683,733,2.521,770,1.883,780,1.798,783,1.861,828,1.58,852,1.798,885,1.648,902,2.898,947,1.244,949,1.146,950,1.26,952,1.26,953,1.84,961,1.26,962,1.906,963,1.977,964,1.929,965,1.906,966,3.03,967,1.906,968,2.763,969,1.977,970,1.977,971,1.758,972,1.778,973,1.977,974,1.084,975,2.894,976,1.096,978,1.861,979,1.929,980,1.929,981,1.778,982,1.906,983,1.977,984,1.861,989,1.12,990,1.215,991,1.159,992,1.229,993,1.244,1128,3.043,1245,1.671,1311,6.968,1910,3.303,2172,2.911,2182,4.568,2183,4.568,2184,2.708,2188,4.568,2190,5.053,2191,3.22,2192,3.22,2193,3.22,2194,3.22,2195,5.053,2196,3.22,2197,3.22,2198,5.053,2199,5.053]],["t/291",[0,1.73,7,1.764,18,6.678,50,0.922,64,5.869,66,0.887,94,2.983,95,2.762,103,0.444,166,2.478,200,3.755,202,2.504,359,3.239,385,6.162,665,2.859,670,4.674,815,3.695,1187,5.626,1188,4.928,1189,4.361,1192,5.236,1206,5.236]],["t/293",[0,1.471,7,1.445,18,5.264,54,1.062,173,3.463,200,4.122,499,4.787,708,3.213,755,4.42,829,4.055,1192,5.747,1206,5.747]],["t/295",[0,1.067,1,1.227,8,1.487,12,1.067,15,1.08,18,6.203,25,1.375,26,1.069,50,1.203,54,0.623,66,1.095,68,1.532,69,0.455,70,0.467,79,1.72,80,1.402,99,0.631,100,1.276,103,0.436,107,1.143,108,1.134,113,0.683,114,1.747,115,0.818,127,1.767,128,1.999,129,1.415,130,1.947,134,3.269,137,0.826,140,0.983,147,1.13,148,1.093,151,2.335,152,1.466,154,1.566,157,1.931,165,1.44,173,1.291,177,2.913,201,1.069,205,1.457,207,1.955,213,1.613,225,3.053,232,1.82,237,3.173,247,0.826,248,1.802,250,1.212,291,1.025,306,1.885,310,1.579,328,1.684,331,1.665,339,2.755,356,1.421,360,2.024,361,1.183,414,1.547,427,1.679,445,1.931,509,1.679,533,1.325,562,2.058,577,1.931,590,2.786,718,2.848,721,1.758,730,1.647,732,1.665,733,2.506,756,1.308,770,1.863,780,1.778,783,1.841,828,1.563,852,1.778,885,1.63,902,2.88,947,1.227,949,1.13,950,1.242,952,1.242,953,1.82,961,1.242,962,1.885,963,1.955,964,1.908,965,1.885,966,3.014,967,1.885,968,2.742,969,1.955,970,1.955,971,1.739,972,1.758,973,1.955,974,1.069,975,2.875,976,1.081,978,1.841,979,1.908,980,1.908,981,1.758,982,1.885,983,1.955,984,1.841,989,1.105,990,1.198,991,1.143,992,1.212,993,1.227,1230,4.169,1233,3.968,1252,2.521,1253,2.871,1254,2.871,1255,4.519,1257,4.519,2200,4.997,2201,3.175,2202,3.175,2203,3.175,2204,3.175,2205,4.997]],["t/297",[4,1.926,6,2.586,7,1.504,8,0.697,12,0.775,15,1.042,21,1.056,22,1.802,25,1.235,26,1.512,28,2.311,31,1.825,39,2.052,42,2.21,50,1.133,51,3.971,54,0.951,57,3.825,59,2.775,60,3.649,66,0.743,67,2.935,69,1.197,70,1.23,94,1.434,95,2.975,97,2.704,100,2.36,101,1.9,103,0.437,108,1.473,120,3.231,128,1.336,129,1.272,130,1.388,135,1.627,137,1.689,139,2.573,146,2.51,147,1.598,148,1.545,154,1.257,158,3.135,166,2.074,167,2.523,179,1.322,204,1.802,205,1.309,212,4.914,251,3.029,254,2.311,261,4.06,274,5.156,275,3.776,276,2.704,289,1.825,310,1.419,323,3.251,326,2.01,328,2.278,359,1.874,380,2.523,387,2.64,429,2.935,474,3.043,477,2.04,481,2.47,533,1.874,590,1.545,597,2.541,598,3.396,603,2.01,731,1.58,828,1.404,829,2.138,885,2.118,891,2.851,938,2.33,939,3.817,1010,5.156,1101,2.579,1273,3.135,1315,7.677,1368,3.029,1535,2.935,1607,2.704,1755,3.255,1861,4.06,1937,3.776,2206,4.49,2207,4.49,2208,3.565,2209,3.565,2210,4.49,2211,3.396,2212,5.462,2213,4.49,2214,4.49,2215,4.06,2216,4.06,2217,4.49,2218,4.49,2219,3.255,2220,3.776,2221,4.06]],["t/299",[12,1.444,103,0.479,115,2.155,127,2.391,130,1.522,135,2.096,266,3.314,328,2.279,357,4.804,358,6.325,1008,4.916,1315,6.063,1744,5.642,2020,5.838,2222,7.562,2223,8.363]],["t/301",[0,0.513,6,1.257,7,1.146,8,1.462,12,1.425,15,1.149,50,1.05,54,0.591,66,1.011,68,1.454,69,0.426,70,0.438,79,1.633,80,1.331,99,0.591,100,1.725,103,0.422,107,1.071,108,1.076,115,0.766,127,1.357,128,1.938,129,0.842,130,1.892,137,1.539,138,1.294,139,2.677,140,0.921,141,1.332,147,1.058,148,1.024,151,2.251,152,1.603,154,1.523,165,0.693,177,2.832,197,2.549,201,1.001,205,1.384,213,1.531,225,2.983,232,1.743,247,0.773,248,1.726,250,1.135,291,0.96,310,1.5,328,1.293,331,1.581,339,2.678,360,2.672,361,1.109,414,1.469,445,1.834,465,2.064,551,3.201,562,1.972,577,1.834,590,2.708,603,2.124,718,2.769,721,1.67,730,1.564,732,1.581,733,2.436,770,1.769,780,1.689,783,1.748,826,3.589,828,1.484,852,1.689,864,3.013,885,1.547,902,2.8,947,1.149,949,1.058,950,1.164,952,1.164,953,1.728,958,4.175,961,1.164,962,1.79,963,1.857,964,1.812,965,1.79,966,2.938,967,1.79,968,2.644,969,1.857,970,1.857,971,1.651,972,1.67,973,1.857,974,1.001,975,2.785,976,1.012,978,1.748,979,1.812,980,1.812,981,1.67,982,1.79,983,1.857,984,1.748,989,1.035,990,1.122,991,1.071,992,1.135,993,1.149,1008,4.34,1081,3.313,1315,6.708,1368,2.006,1538,3.767,1619,4.069,1968,4.29,1969,4.29,2020,3.313,2036,3.767,2215,4.29,2216,4.29,2224,2.974,2225,4.745,2226,2.974,2227,2.974,2228,2.974,2229,2.974,2230,2.974,2231,2.974,2232,2.974,2233,2.974,2234,4.745,2235,4.745,2236,4.745,2237,4.745,2238,4.745,2239,4.745,2240,4.745]],["t/303",[0,1.074,1,0.999,4,1.108,6,1.426,7,0.438,8,0.401,21,1.735,23,1.14,25,0.711,27,1.294,31,1.722,40,1.804,50,0.307,51,1.896,53,1.294,54,0.322,57,1.037,63,2.845,66,0.615,68,0.792,69,1.39,70,1.413,74,1.804,76,1.689,79,0.889,83,1.211,84,2.341,94,1.352,100,1.081,103,0.543,104,2.049,108,1.412,111,2.857,113,1.338,115,1.091,116,1.683,125,1.804,140,0.8,141,1.157,150,1.079,152,0.613,155,1.954,162,2.836,163,2.197,165,1.254,166,2.488,167,2.38,168,1.722,170,1.597,172,1.641,179,0.761,180,1.23,193,2.783,194,1.597,195,1.14,197,2.591,207,3.39,211,1.317,213,2.38,217,1.037,222,1.597,224,2.016,231,0.92,232,0.761,234,2.175,236,1.349,237,1.641,255,3.091,279,1.422,289,4.306,306,0.975,310,0.817,320,2.957,343,1.25,344,1.641,346,1.341,349,1.124,359,1.768,366,1.124,368,3.768,377,5.751,378,2.974,386,4.238,387,1.05,414,0.8,419,2.961,422,2.016,446,1.689,447,2.957,477,1.174,478,1.689,495,3.115,519,1.393,551,1.743,567,1.452,569,2.052,570,2.957,593,2.173,597,1.657,603,1.157,604,1.896,611,2.337,614,1.519,652,1.689,675,1.422,677,4.037,687,1.211,708,2.591,713,3.163,715,2.052,717,1.873,727,1.556,728,3.901,730,1.396,731,0.909,732,1.411,734,1.873,745,1.804,747,3.229,750,3.562,755,2.792,756,1.064,778,2.689,781,1.271,817,1.519,818,3.29,828,0.808,829,2.562,861,1.954,864,1.641,885,0.843,893,1.743,910,1.452,920,3.631,956,1.519,966,1.507,978,0.952,982,1.597,990,0.975,1021,3.362,1028,2.617,1030,1.341,1031,1.689,1033,2.052,1081,1.804,1097,1.689,1108,1.452,1116,1.452,1119,1.641,1128,5.345,1130,3.325,1136,3.07,1169,1.452,1188,1.641,1201,2.957,1205,1.422,1215,1.804,1274,1.954,1302,1.294,1325,1.804,1350,1.743,1357,1.804,1362,1.873,1378,1.689,1460,2.052,1477,1.804,1505,7.044,1508,3.241,1517,1.804,1628,1.743,1634,2.337,1710,2.173,1755,3.07,1910,1.689,1931,1.804,1983,2.337,2044,2.173,2241,4.235,2242,2.584,2243,2.173,2244,2.337,2245,2.584,2246,2.584,2247,2.337,2248,2.173,2249,2.584,2250,3.829,2251,1.954,2252,2.584,2253,2.584,2254,2.584,2255,2.584,2256,2.584,2257,2.584,2258,2.584,2259,4.866,2260,2.584,2261,3.829,2262,2.584,2263,7.377,2264,2.584,2265,2.584,2266,2.584,2267,2.584,2268,5.627,2269,2.584,2270,2.584,2271,1.954,2272,2.584,2273,5.381,2274,5.381,2275,2.584,2276,2.337,2277,2.584,2278,2.584,2279,2.584,2280,2.584,2281,2.584,2282,2.584,2283,2.584,2284,2.584,2285,2.584,2286,2.584,2287,2.584,2288,2.584,2289,2.052]],["t/305",[0,1.343,8,1.503,12,1.096,15,1.104,50,1.087,54,0.644,66,1.046,68,1.583,79,1.778,80,1.449,99,1.026,100,1.831,103,0.445,107,1.192,108,1.172,115,0.854,127,1.477,128,1.992,129,0.938,130,1.922,137,1.651,140,1.026,147,1.179,148,1.14,151,2.389,152,1.507,154,1.594,165,1.204,177,2.966,201,1.115,205,1.507,213,1.667,225,3.098,229,2.903,232,2.112,247,0.861,248,1.852,250,1.265,289,4.035,291,1.069,293,3.745,294,3.378,295,3.745,296,3.485,297,2.786,298,5.042,310,1.633,328,1.408,331,1.721,339,2.805,346,1.719,360,2.246,361,1.235,377,2.104,414,1.6,445,1.997,562,2.115,577,1.997,590,2.836,616,3.607,687,1.552,718,2.899,721,1.818,730,1.703,732,1.721,733,2.664,770,1.926,780,1.839,783,1.903,828,1.616,852,1.839,885,1.685,902,2.932,947,1.28,949,1.179,950,1.296,952,1.296,953,1.881,961,1.296,962,1.949,963,2.022,964,1.972,965,1.949,966,3.062,967,1.949,968,2.807,969,2.022,970,2.022,971,1.798,972,1.818,973,2.022,974,1.115,975,2.934,976,1.128,978,1.903,979,1.972,980,1.972,981,1.818,982,1.949,983,2.022,984,1.903,989,1.153,990,1.25,991,1.192,992,1.265,993,1.28,1128,1.995,1443,3.745,2268,2.996,2290,5.167,2291,3.313,2292,3.313,2293,3.313,2294,3.313,2295,5.167,2296,4.671]],["t/307",[7,1.739,8,0.846,15,0.582,21,1.282,66,0.623,69,1.066,70,1.095,82,2.405,99,2.001,103,0.426,105,2.883,108,1.237,113,1.172,115,1.405,123,3.369,138,2.371,139,2.16,140,2.624,150,3.107,167,5.66,200,2.638,204,2.188,209,1.876,216,2.338,224,2.595,234,1.458,236,2.771,237,5.382,246,2.188,266,2.16,306,3.596,378,3.757,388,2.441,390,5.022,410,2.338,426,2.939,465,2.371,509,2.883,665,2.008,708,2.056,721,1.918,817,3.205,864,3.462,938,5.553,939,4.376,1033,4.328,1451,6.602,1452,4.585,1571,3.205,1830,4.328,2297,7.444,2298,9.107,2299,9.533,2300,5.452,2301,5.452]],["t/309",[4,2.999,12,1.512,15,0.746,26,2.354,39,2.209,103,0.4,113,1.504,122,4.439,128,1.439,135,1.752,156,3.64,160,4.439,202,2.256,212,4.11,216,2.999,254,2.488,308,3.847,474,3.276,478,4.571,639,4.571,665,3.524,730,2.304,765,4.11,938,5.359,939,4.11,971,2.433,974,2.354,991,2.516,1101,4.016,1112,5.563,1567,5.88,1661,4.32,1752,5.88,2271,5.287,2302,6.991,2303,6.991,2304,6.955,2305,7.921,2306,7.921,2307,6.991,2308,6.991,2309,6.991]],["t/311",[5,2.865,7,1.105,12,1.599,15,1.222,21,1.061,25,1.793,43,1.682,50,0.536,54,1.044,66,0.745,69,0.933,70,0.959,94,1.441,103,0.546,108,1.478,115,1.162,128,1.724,129,2.166,130,1.392,135,1.633,146,2.956,150,2.72,152,1.071,154,1.792,156,1.536,160,2.865,163,2.341,168,1.834,182,2.02,211,3.32,217,1.811,232,1.329,248,1.9,253,2.401,254,3.598,326,2.02,350,2.433,357,4.395,426,2.433,428,3.514,597,1.765,937,2.652,938,3.969,939,2.652,941,1.765,971,1.57,976,2.604,991,1.624,1481,5.786,1484,4.138,1491,4.708,1492,5.105,1501,3.007,1502,3.007,1748,3.582,2310,3.582,2311,4.512,2312,4.512,2313,4.512,2314,4.512,2315,3.795,2316,6.517,2317,4.512,2318,6.517,2319,5.174,2320,5.174]],["t/313",[1,2.584,4,2.867,7,1.59,11,3.462,25,2.343,42,2.899,50,1.114,51,2.993,66,0.764,101,3.603,103,0.583,124,3.757,127,1.912,128,1.376,129,1.893,135,1.675,138,2.908,139,2.649,146,2.584,150,2.79,152,2.021,174,5.129,179,2.508,202,2.748,210,4.846,219,2.584,236,1.675,245,3.757,247,1.738,318,3.182,321,4.37,366,2.908,406,4.503,453,3.84,638,3.603,659,4.37,666,4.19,717,4.846,891,4.245,907,4.37,956,3.93,1031,4.37,1295,6.761,1350,4.51,1412,5.262,1451,4.846,2321,6.685,2322,6.685,2323,6.685]],["t/315",[0,1.027,5,3.776,6,2.347,7,1.009,13,2.744,21,1.398,31,2.418,48,3.342,49,4.312,50,0.707,51,4.739,53,4.723,54,0.741,69,1.13,70,1.161,81,4.255,94,1.899,100,1.518,101,3.992,103,0.452,106,4.312,113,1.279,114,3.272,120,3.05,123,3.675,130,1.082,135,1.49,146,2.298,173,2.418,231,3.152,259,2.977,271,3.086,429,5.16,447,4.152,449,5.002,454,2.831,485,4.012,580,4.152,647,2.926,666,4.966,679,3.272,731,2.777,756,2.449,877,3.675,942,4.152,957,4.152,960,4.498,1005,3.888,1019,3.776,1028,3.675,1241,4.722,1330,4.312,1350,5.324,1356,5.377,1357,5.51,1535,3.888,2171,5.51,2324,10.298,2325,5.947,2326,5.947,2327,5.947,2328,5.377,2329,5.947,2330,5.947,2331,4.722,2332,5.377]],["t/317",[0,0.57,8,1.501,12,1.094,15,1.116,50,1.086,54,0.642,66,1.045,68,1.579,79,1.773,80,1.445,99,0.656,100,1.827,103,0.444,107,1.188,108,1.169,115,0.85,127,1.473,128,1.99,129,0.935,130,1.921,137,2.019,140,1.022,147,1.175,148,1.136,151,2.385,152,1.503,154,1.592,165,0.769,177,2.961,201,1.111,205,1.502,213,1.662,225,3.094,231,2.763,232,1.866,234,1.695,236,1.588,247,0.858,248,1.848,250,1.26,291,1.065,310,1.628,317,1.624,318,3.016,328,1.404,331,1.716,339,2.801,360,2.242,361,1.23,414,1.595,445,1.991,498,2.304,562,2.111,577,1.991,590,2.831,666,4.597,718,2.895,721,1.813,730,1.698,732,1.716,733,2.547,770,1.92,780,1.833,783,1.898,817,3.029,828,1.612,852,1.833,885,1.68,902,2.928,947,1.276,949,1.175,950,1.292,952,1.292,953,1.876,961,1.292,962,1.943,963,2.016,964,1.967,965,1.943,966,3.058,967,1.943,968,2.801,969,2.016,970,2.016,971,1.793,972,1.813,973,2.016,974,1.111,975,2.929,976,1.124,978,1.898,979,1.967,980,1.967,981,1.813,982,1.943,983,2.016,984,1.898,989,1.149,990,1.245,991,1.188,992,1.26,993,1.276,1295,4.09,1451,3.735,1571,1.941,2332,4.658,2333,5.152,2334,3.301,2335,3.301,2336,3.301,2337,3.301,2338,3.301,2339,5.152,2340,3.103,2341,5.152,2342,7.159,2343,5.152]],["t/319",[4,3.757,6,1.024,8,0.903,12,1.439,13,1.783,15,1.175,20,1.476,21,1.828,39,1.221,41,3.224,42,2.646,43,2.167,51,3.732,54,0.871,57,3.12,60,2.172,66,0.665,69,0.832,70,1.144,86,2.454,88,2.005,94,1.234,100,1.984,103,0.52,113,1.672,116,1.209,122,3.692,124,1.705,128,1.438,130,0.703,135,1.751,137,2.022,146,1.494,150,1.613,152,0.917,153,3.801,154,0.748,156,1.979,172,2.454,177,1.391,193,1.458,201,1.301,216,1.658,217,1.551,247,1.005,291,1.247,318,3.327,328,1.053,337,2.272,340,4.192,356,1.73,357,2.22,386,5.495,387,1.571,388,3.129,428,3.135,446,2.527,454,1.84,474,1.811,477,2.642,504,1.84,538,3.251,589,3.801,591,2.454,599,2.127,603,2.603,604,2.603,679,2.127,681,2.172,708,2.193,724,4.059,730,1.274,733,1.197,738,1.902,739,1.969,747,2.005,781,1.902,783,2.142,818,2.044,831,2.607,832,4.215,885,1.26,901,2.272,934,2.698,972,1.36,989,2.023,1011,2.923,1030,2.005,1061,4.616,1062,2.802,1232,2.607,1273,2.698,1316,7.149,1514,2.802,1608,3.069,1661,2.388,1662,4.587,1819,2.527,1827,3.251,1903,5.818,2020,2.698,2087,3.495,2305,3.495,2344,5.814,2345,3.865,2346,5.814,2347,3.865,2348,3.865,2349,3.865,2350,8.336,2351,3.495,2352,3.865,2353,4.879,2354,5.814,2355,5.257,2356,4.89,2357,3.865,2358,3.865,2359,3.865,2360,3.865,2361,3.865,2362,3.865]],["t/321",[0,0.597,8,1.518,12,1.126,15,1.097,50,1.101,54,0.666,66,1.059,68,1.637,79,1.838,80,1.498,99,0.687,100,1.873,103,0.454,107,1.244,108,1.211,115,0.891,127,1.527,128,2.012,129,0.979,130,1.933,137,1.697,140,1.07,147,1.23,148,1.19,151,2.444,152,1.548,154,1.622,165,0.806,177,3.018,201,1.164,205,1.557,213,1.723,225,3.141,231,1.9,232,1.921,234,1.428,247,0.899,248,1.902,250,1.32,291,1.115,310,1.687,318,3.106,328,1.455,331,1.779,339,2.854,360,2.119,361,1.288,414,1.653,445,2.064,465,1.504,562,2.173,577,2.064,590,2.885,705,3.216,718,2.95,721,1.879,730,1.76,732,1.779,733,2.596,770,1.99,780,1.9,783,1.967,828,1.67,852,1.9,885,1.741,902,2.984,947,1.336,949,1.23,950,1.353,952,1.353,953,1.944,961,1.353,962,2.014,963,2.089,964,2.039,965,2.014,966,3.11,967,2.014,968,2.871,969,2.089,970,2.089,971,1.858,972,1.879,973,2.089,974,1.164,975,2.992,976,1.177,978,1.967,979,2.039,980,2.039,981,1.879,982,2.014,983,2.089,984,1.967,989,1.203,990,1.304,991,1.244,992,1.32,993,1.336,1316,6.607,2161,3.125,2355,4.828,2356,4.491,2363,5.34,2364,3.457,2365,3.457,2366,3.457,2367,6.524,2368,3.457,2369,5.34]],["t/323",[1,2.565,12,1.146,21,1.561,25,2.57,39,2.097,69,0.95,70,0.976,83,3.11,101,3.586,103,0.38,154,1.284,165,1.547,167,3.729,188,3.265,204,2.663,205,1.935,207,2.597,212,4.983,234,2.632,245,3.729,302,5.918,359,2.77,378,2.534,386,3.812,453,3.812,454,3.159,457,3.812,571,5.269,597,2.597,605,5.771,609,4.477,679,3.652,708,3.197,740,3.729,747,4.398,866,5.269,893,4.477,901,3.901,915,5.582,920,3.509,1067,4.811,1097,4.339,1325,4.633,1328,5.582,1510,6.411,1834,5.582,1910,4.339,2171,5.918,2261,6.001,2370,6.637,2371,6.637,2372,5.582,2373,6.637,2374,6.637,2375,6.001,2376,6.637,2377,6.637,2378,6.637,2379,5.269]],["t/325",[0,1.487,8,1.057,12,1.487,15,1.19,25,2.601,39,2.152,50,1.181,54,1.074,103,0.586,113,1.853,124,3.004,128,1.401,130,1.239,138,2.962,144,3.35,156,2.933,165,1.587,234,2.528,474,3.19,605,4.208,1205,3.746,2024,6.308,2372,5.727,2380,6.809,2381,8.616,2382,6.809,2383,6.809,2384,8.616,2385,6.809,2386,6.809,2387,6.809,2388,6.809]],["t/327",[7,1.613,12,1.381,21,1.881,66,1.088,101,3.384,102,5.029,103,0.458,111,6.416,157,3.091,199,4.817,222,4.942,246,3.209,605,4.942,778,5.079,1133,6.416,2171,6.639,2389,7.998,2390,9.178]],["t/329",[0,0.591,7,0.899,8,1.515,12,1.12,15,1.122,50,1.098,54,0.661,66,1.057,68,1.625,79,1.824,80,1.487,99,0.68,100,1.353,103,0.452,107,1.233,108,1.203,115,0.882,127,1.516,128,2.008,129,0.97,130,1.931,137,0.89,140,1.641,147,1.219,148,1.178,150,2.212,151,2.432,152,1.539,154,1.616,165,0.798,177,3.006,201,1.153,205,1.546,213,1.71,225,3.132,232,1.91,247,0.89,248,1.891,250,1.307,291,1.105,310,1.675,328,1.445,331,1.766,339,2.843,360,2.108,361,1.276,414,1.641,445,2.049,562,2.16,577,2.049,590,2.874,605,5.938,718,2.939,721,1.865,730,1.747,732,1.766,733,2.586,770,1.976,780,1.886,783,1.953,828,1.658,852,1.886,885,1.729,902,2.972,947,1.323,949,1.219,950,1.34,952,1.34,953,1.93,961,1.34,962,2,963,2.074,964,2.024,965,2,966,3.1,967,2,968,2.857,969,2.074,970,2.074,971,1.845,972,1.865,973,2.074,974,1.153,975,2.979,976,1.166,978,1.953,979,2.024,980,2.024,981,1.865,982,2,983,2.074,984,1.953,989,1.192,990,1.292,991,1.233,992,1.307,993,1.323,1510,4.009,1576,4.209,2024,3.366,2151,4.459,2209,2.719,2390,4.793,2391,5.301,2392,3.424,2393,3.424,2394,3.424,2395,3.424,2396,5.301,2397,5.301,2398,5.301,2399,5.301]],["t/331",[8,0.827,15,0.782,21,1.722,31,2.165,35,2.058,50,0.871,69,1.291,70,1.327,81,3.949,88,3.801,95,1.895,103,0.419,120,2.058,146,3.654,150,3.057,157,2.831,165,1.241,168,2.977,173,2.165,178,3.059,179,1.568,180,3.487,181,3.207,182,3.279,197,2.763,209,2.521,219,2.058,220,3.207,237,3.381,259,2.666,306,2.763,310,1.683,350,2.871,363,2.495,366,2.316,388,3.279,442,3.13,454,3.487,480,4.651,481,2.93,499,2.992,597,2.084,665,3.927,679,2.93,687,2.495,724,3.718,728,2.816,738,2.62,755,3.801,788,3.481,885,2.388,976,1.813,1054,4.815,1108,4.116,1219,4.228,1319,8.394,1416,4.027,1439,3.592,1440,3.592,1525,4.815,1628,3.592,1744,4.941,1773,4.479,2400,7.952,2401,3.718,2402,5.325,2403,4.815,2404,5.325,2405,5.325,2406,5.325,2407,5.325,2408,5.325,2409,5.325,2410,5.325,2411,5.325,2412,5.325,2413,5.325,2414,5.325,2415,5.325,2416,5.325,2417,5.325,2418,7.325,2419,4.479,2420,4.815]],["t/333",[0,0.582,8,1.529,12,1.109,15,1.093,25,1.442,50,1.093,54,0.653,66,1.052,68,1.606,79,1.803,80,1.47,99,0.67,100,1.338,103,0.449,107,1.214,108,1.189,115,0.869,127,1.499,128,2.001,129,0.955,130,1.927,135,0.846,137,0.877,140,1.045,147,1.201,148,1.161,151,2.413,152,1.525,154,1.676,165,0.786,167,1.896,177,2.988,201,1.136,205,1.528,213,1.691,225,3.116,232,1.892,234,1.718,238,2.825,247,0.877,248,1.874,250,1.288,291,1.089,310,1.656,319,3.658,328,1.428,331,1.746,339,2.826,356,2.346,360,2.092,361,1.258,414,1.623,445,2.025,477,2.381,549,2.679,562,2.14,570,2.355,577,2.025,590,2.857,616,3.658,665,2.367,718,2.921,721,1.844,730,1.727,732,1.746,733,2.57,770,1.953,780,1.865,783,1.93,828,1.639,852,1.865,885,1.709,902,2.954,947,1.304,949,1.201,950,1.32,952,1.32,953,1.908,961,1.32,962,1.977,963,2.05,964,2.001,965,1.977,966,3.083,967,1.977,968,2.834,969,2.05,970,2.05,971,1.823,972,1.844,973,2.05,974,1.136,975,2.959,976,1.148,978,1.93,979,2.001,980,2.001,981,1.844,982,1.977,983,2.05,984,1.93,989,1.174,990,1.273,991,1.214,992,1.288,993,1.304,1319,4.16,2400,4.408,2403,3.051,2421,5.24,2422,3.374,2423,3.374,2424,3.374,2425,3.051,2426,3.374,2427,3.374,2428,9.401,2429,5.24,2430,5.24,2431,5.24]],["t/335",[0,1.705,7,1.788,19,7.112,50,0.892,54,0.936,64,5.677,66,0.858,94,2.397,95,2.671,103,0.43,166,2.397,170,4.639,179,2.211,200,3.632,202,2.422,231,2.671,359,3.133,499,4.218,604,3.361,670,4.521,765,4.413,815,3.574,1187,5.442,1191,5.96,1192,6.663,1258,7.699,2432,7.507,2433,7.507]],["t/337",[0,1.471,7,1.445,19,5.747,54,1.062,173,3.463,200,4.122,499,4.787,708,3.213,755,4.42,829,4.055,1192,5.747,1206,5.747]],["t/339",[0,1.45,19,5.668,26,2.829,50,1.164,66,1.12,114,4.623,130,1.529,134,3.603,157,3.247,173,3.415,328,2.29,533,3.506,724,5.865]],["t/341",[0,0.724,6,1.413,7,1.157,8,1.426,10,2.012,12,1.338,15,1.155,19,1.721,22,1.682,28,0.908,31,1.037,39,0.806,50,1.162,54,0.914,66,1.011,68,1.285,69,0.365,70,0.375,79,1.442,80,1.176,99,0.507,100,1.07,103,0.494,107,0.918,108,0.951,113,0.549,115,0.657,127,1.766,128,1.89,129,1.187,130,1.883,134,3.323,137,0.664,139,1.661,140,1.652,147,0.908,148,0.878,151,2.057,152,1.465,154,1.419,156,0.869,165,1.243,166,0.815,177,2.639,179,2.009,201,0.859,205,1.222,207,1.64,209,0.878,213,1.352,225,2.815,229,2.355,232,1.571,247,1.09,248,1.555,250,0.974,291,0.823,310,1.325,318,1.215,328,1.142,331,1.396,339,2.496,360,1.783,361,0.951,368,1.11,414,1.298,426,3.954,427,1.349,445,1.62,482,1.577,506,1.466,509,1.349,562,1.777,577,1.62,590,2.524,614,1.5,665,1.544,718,2.58,721,1.475,730,1.381,732,1.396,733,2.27,739,1.3,756,1.051,765,1.5,770,1.562,780,1.492,783,1.544,817,1.5,828,1.311,852,1.492,885,1.367,902,2.61,920,1.349,921,2.146,947,0.986,949,0.908,950,0.998,952,0.998,953,1.526,961,0.998,962,1.581,963,1.64,964,1.6,965,1.581,966,2.757,967,1.581,968,2.416,969,1.64,970,1.64,971,1.458,972,1.475,973,1.64,974,0.859,975,2.573,976,0.869,978,1.544,979,1.6,980,1.6,981,1.475,982,1.581,983,1.64,984,1.544,989,0.888,990,0.963,991,0.918,992,0.974,993,0.986,1192,1.721,1233,5.416,1263,3.525,1272,2.307,1273,1.781,1286,7.164,1287,3.79,1289,6.168,1290,6.168,1291,6.168,1292,6.168,1293,6.168,1336,2.74,1349,1.781,1477,1.781,1599,3.867,1693,2.146,1761,1.93,1868,1.781,2208,2.026,2310,2.026,2434,7.333,2435,6.822,2436,1.93,2437,2.552,2438,2.552,2439,2.552,2440,2.307,2441,2.552,2442,2.552,2443,2.552,2444,4.192,2445,5.334,2446,6.822,2447,6.176,2448,4.192,2449,2.552,2450,2.552,2451,2.552,2452,2.552]],["t/343",[0,1.557,1,1.618,7,0.71,12,1.065,13,1.931,15,1.082,20,0.973,21,2.077,23,1.124,25,1.466,26,1.41,31,1.702,35,0.985,39,1.323,48,1.432,50,0.498,51,1.874,54,0.769,55,2.214,57,2.138,66,0.479,68,0.781,69,0.365,70,0.375,77,1.847,79,0.877,80,0.715,81,1.374,82,1.124,84,3.188,88,2.172,94,0.814,95,1.49,100,1.36,101,1.078,103,0.506,108,1.209,111,1.719,113,1.146,116,1.93,119,1.347,130,0.762,131,3.202,135,1.335,137,2.178,141,1.141,145,1.779,146,0.985,152,0.993,154,1.194,157,0.985,163,2.172,164,1.276,166,2.177,173,1.036,177,0.917,179,1.233,193,2.571,202,0.822,204,1.023,205,0.743,207,0.997,209,2.124,213,0.822,214,1.779,217,1.68,219,1.618,232,1.569,234,1.823,236,1.049,245,1.432,247,0.663,259,2.096,276,3.21,293,3.035,295,3.035,297,1.374,310,1.323,328,0.695,331,0.849,334,1.535,341,1.432,346,2.172,359,2.845,360,0.736,364,1.498,367,3.786,377,5.135,378,3.292,382,2.143,387,1.036,410,1.796,419,2.304,446,3.484,447,1.779,453,1.464,474,2.497,477,1.902,478,1.666,481,1.402,489,1.779,498,1.779,506,1.464,530,1.927,564,1.719,597,2.414,604,1.141,621,1.666,659,1.666,664,5.19,665,2.273,675,1.402,687,1.194,703,1.464,704,1.719,708,1.579,718,0.897,719,3.324,727,1.535,728,1.347,730,1.38,731,1.875,732,0.849,738,1.254,739,2.133,747,2.765,755,2.765,766,2.353,773,2.143,778,2.659,780,0.907,815,1.213,817,1.498,818,1.347,829,1.993,863,1.535,883,1.666,901,2.461,902,1.896,910,2.353,920,2.214,939,1.498,946,2.023,978,0.939,980,1.598,989,1.854,997,3.035,998,3.384,1013,1.847,1018,2.143,1019,1.618,1028,2.587,1031,4.457,1034,2.143,1036,1.847,1049,1.575,1067,1.847,1098,1.927,1109,2.143,1119,1.618,1128,4.871,1130,3.293,1136,3.035,1189,1.432,1205,1.402,1227,2.304,1259,2.023,1278,1.927,1302,1.276,1305,5.406,1324,2.023,1339,3.035,1362,3.035,1460,2.023,1463,2.023,1503,3.521,1507,6.116,1508,4.664,1519,2.304,1539,1.779,1557,1.779,1741,2.143,1748,2.023,1760,1.719,1766,4.231,1772,1.927,1785,1.847,1806,2.824,1845,2.143,1859,2.304,1902,4.231,1931,1.779,2045,2.023,2220,3.521,2271,1.927,2289,2.023,2331,2.023,2453,2.548,2454,5.19,2455,2.143,2456,6.801,2457,3.786,2458,2.548,2459,2.548,2460,2.548,2461,2.304,2462,4.818,2463,5.733,2464,4.818,2465,2.304,2466,2.304,2467,2.304,2468,5.329,2469,2.548,2470,2.548,2471,2.548,2472,3.786,2473,2.548,2474,2.548,2475,1.927,2476,2.548,2477,2.548,2478,4.187,2479,2.304,2480,2.548,2481,2.304,2482,4.187,2483,4.187,2484,4.187,2485,2.548,2486,2.548,2487,2.548,2488,2.548,2489,2.548,2490,2.548,2491,2.548,2492,2.304,2493,2.548,2494,2.548,2495,2.548,2496,2.548,2497,2.548,2498,2.548,2499,2.548,2500,2.548,2501,2.548,2502,2.548,2503,2.548,2504,2.304,2505,2.023]],["t/345",[0,1.39,8,1.482,12,1.058,15,1.128,50,1.069,54,0.617,57,1.259,66,1.028,68,1.517,79,1.704,80,1.388,99,0.623,100,1.777,103,0.434,107,1.129,108,1.123,115,0.808,127,1.416,128,1.965,129,0.888,130,1.907,135,1.241,137,1.971,140,0.971,147,1.116,148,1.08,151,2.319,152,1.455,154,1.558,165,0.731,177,2.899,201,1.056,205,1.443,213,1.597,214,4.28,225,3.04,229,2.782,232,2.05,247,0.816,248,1.788,250,1.198,291,1.012,293,3.589,295,3.589,310,1.564,328,1.349,331,1.649,339,2.741,346,1.628,360,2.325,361,1.169,377,1.992,414,1.533,422,1.493,445,1.913,541,2.19,562,2.042,577,1.913,590,2.771,664,4.163,665,1.823,718,2.834,719,4.868,721,1.742,730,1.631,732,1.649,733,2.493,770,1.845,780,1.762,783,1.823,828,1.548,852,1.762,885,1.614,902,2.866,947,1.212,949,1.116,950,1.227,952,1.227,953,1.802,961,1.227,962,1.867,963,1.937,964,1.89,965,1.867,966,3,967,1.867,968,2.724,969,1.937,970,1.937,971,1.722,972,1.742,973,1.937,974,1.056,975,2.858,976,1.068,978,1.823,979,1.89,980,1.89,981,1.742,982,1.867,983,1.937,984,1.823,989,1.092,990,1.183,991,1.129,992,1.198,993,1.212,1128,1.889,1305,4.28,1507,4.637,1508,1.889,1557,2.19,1902,3.93,2456,5.157,2463,7.563,2465,4.476,2466,4.476,2467,4.476,2472,5.544,2506,4.95,2507,3.137,2508,3.137,2509,3.137,2510,3.137,2511,3.137,2512,3.137,2513,3.137,2514,4.95,2515,4.95,2516,4.95,2517,4.95]],["t/347",[0,1.421,7,1.641,20,3.142,31,2.576,35,2.449,41,4.624,42,3.292,43,3.067,49,5.966,50,0.978,54,1.249,61,4.119,69,1.308,70,1.211,78,4.025,80,1.778,87,3.562,101,2.681,117,3.817,119,4.351,130,1.153,156,2.157,179,1.866,209,2.181,251,4.276,266,2.511,338,3.917,340,3.417,343,3.067,349,2.757,360,1.83,429,4.144,476,3.017,480,5.225,492,3.289,493,4.025,533,3.435,597,2.48,639,4.144,665,2.335,901,3.726,1019,4.025,1112,4.025,1408,5.032,1477,4.425,1535,4.144,1608,5.032,1628,4.276,2243,5.331,2351,5.731,2518,5.731,2519,6.338,2520,5.032,2521,5.731,2522,6.338,2523,6.338,2524,6.338,2525,5.731,2526,6.338,2527,5.331]],["t/349",[0,1.753,5,4.199,6,2.933,7,1.791,27,4.919,35,3.268,50,1.235,69,0.947,70,0.973,179,1.947,216,2.836,321,5.529,434,4.794,474,3.098,597,3.309,670,5.094,731,2.976,949,3.01,966,2.353,1040,5.001,1107,5.979,1606,4.086,1767,4.323,1806,4.461,2219,7.125,2520,5.25,2527,5.562,2528,6.613,2529,6.613,2530,6.613,2531,6.613,2532,8.457,2533,8.457]],["t/351",[0,1.484,7,1.151,12,1.171,15,1.21,20,2.59,50,1.122,54,1.237,66,0.776,100,1.732,103,0.388,134,2.91,135,1.7,137,1.764,202,2.189,222,4.192,225,2.361,227,4.435,321,6.486,326,3.037,337,3.988,338,4.192,562,2.26,564,4.577,677,3.988,780,2.414,781,3.338,1037,5.706,1215,4.736,1501,3.13,1502,3.13,2520,5.386,2534,6.784,2535,6.784,2536,5.458,2537,6.134,2538,5.706,2539,6.134]],["t/353",[0,1.195,6,2.692,7,1.616,8,0.762,12,0.848,15,1.177,20,2.643,23,3.055,26,2.331,27,4.014,31,1.996,38,2.958,50,0.823,54,1.284,69,0.703,70,0.723,94,2.211,103,0.498,111,3.313,116,1.536,117,2.958,135,1.231,138,2.136,152,1.165,179,1.446,209,1.69,227,3.211,253,1.809,321,6.733,331,1.636,362,3.035,366,2.136,457,2.821,493,3.119,533,2.05,542,4.131,565,3.56,567,2.76,670,2.958,677,4.07,725,5.497,731,2.436,739,4.436,781,5.31,878,3.56,1037,4.131,1117,2.648,1344,5.019,1501,2.266,1502,4.235,1531,3.56,1606,4.955,1735,3.899,1791,3.313,1818,4.441,2219,3.56,2520,5.497,2527,5.823,2536,5.829,2538,4.131,2539,7.25,2540,6.923,2541,4.441,2542,4.911,2543,5.823,2544,4.441,2545,4.911,2546,4.911,2547,3.899]],["t/355",[6,2.445,8,1.005,15,0.985,28,3.285,42,2.839,54,1.288,80,1.815,103,0.37,135,1.622,138,2.815,140,2.004,150,3.482,152,1.536,154,1.614,156,2.203,197,2.441,202,2.088,222,4,236,2.09,254,2.968,258,3.358,343,3.132,360,1.869,375,3.081,387,2.631,426,3.49,429,4.231,472,3.358,496,4.895,505,5.444,687,3.033,742,3.848,745,4.518,778,4.11,781,3.185,941,4.298,949,2.303,1117,3.49,1189,3.637,1193,2.986,1215,4.518,1496,3.637,1606,4,1662,3.561,1687,5.444,1858,4.895,2536,5.861,2547,5.139,2548,7.542]],["t/357",[8,1.141,12,1.747,15,1.226,25,0.955,28,1.235,41,3.017,42,2.705,54,1.047,59,2.144,66,0.96,99,1.969,102,1.835,103,0.531,107,1.249,113,1.152,116,1.085,124,1.531,127,0.992,128,1.635,129,2.082,130,1.645,135,1.843,138,2.845,140,1.074,154,1.866,165,0.809,197,1.309,222,2.144,234,0.928,248,2.144,253,2.927,257,2.203,266,2.122,317,1.707,318,1.652,360,1.002,362,3.309,363,1.626,390,3.613,474,1.626,607,2.04,666,3.218,679,1.909,742,4.279,941,3.879,949,1.235,1036,2.515,1117,1.871,1316,2.422,1384,2.624,1501,3.392,1502,3.392,1619,5.271,1662,1.909,2209,2.755,2340,3.939,2356,2.918,2536,5.558,2549,3.47,2550,6.184,2551,6.683,2552,3.939,2553,5.355,2554,5.355,2555,3.47,2556,3.47]],["t/359",[6,2.716,15,1.176,22,2.188,23,2.405,26,1.836,28,3.393,41,3.91,42,3.1,43,3.395,47,4.328,54,1.057,66,0.623,94,1.741,103,0.485,104,2.638,116,1.705,127,2.424,137,2.368,154,1.055,157,2.107,195,4.018,200,2.638,204,2.188,246,2.188,247,2.204,253,3.122,271,2.829,279,4.096,289,2.216,341,3.064,343,2.638,353,3.792,362,4.6,363,2.554,369,3.369,414,2.82,423,4.376,427,5.326,477,4.471,509,2.883,533,3.107,567,3.064,599,3,614,3.205,679,3,742,2.515,877,3.369,910,3.064,936,3.462,937,3.205,941,3.85,1357,3.806,2379,4.328,2557,4.585,2558,4.328,2559,5.196]],["t/361",[6,1.315,8,1.083,12,1.51,15,1.194,39,1.569,54,0.87,59,3.068,66,0.568,81,4.349,92,3.941,93,3.376,99,1.831,102,2.625,116,1.553,119,2.625,127,1.42,131,2.576,135,2.021,137,1.291,138,2.159,144,2.443,150,2.072,154,1.693,156,1.69,162,3.575,195,2.19,216,2.129,253,1.829,254,3.113,255,5.026,310,1.569,326,2.223,349,2.159,353,2.529,423,2.918,457,2.852,556,5.555,677,4.741,742,4.409,754,3.349,901,2.918,936,3.152,941,4.207,978,1.829,1004,4.489,1028,5.406,1130,5.406,1205,2.731,1342,3.599,1361,4.311,1463,3.941,1491,3.92,1501,3.218,1502,3.218,1611,4.175,1788,3.755,1791,3.349,1931,3.466,2505,5.538,2552,4.202,2560,4.964,2561,4.489,2562,4.489,2563,3.941,2564,6.308,2565,6.784,2566,4.489,2567,4.964,2568,4.964,2569,6.976]],["t/363",[6,2.605,8,1.028,15,1.213,28,2.357,41,3.574,42,3.569,43,3.583,54,0.826,97,3.989,101,1.952,103,0.379,127,1.894,137,1.2,154,1.282,156,3.347,162,2.821,202,1.489,222,4.093,223,3.345,247,1.722,253,1.7,279,2.539,341,4.353,353,2.351,360,1.332,362,5.539,414,1.429,423,4.554,432,3.881,677,2.713,742,4.136,754,3.113,822,5.408,883,5.065,936,5.376,941,3.761,1232,4.468,1501,3.055,1502,3.055,2353,4.624,2536,2.93,2558,3.664,2559,3.221,2566,4.172,2570,4.614,2571,6.623,2572,4.614,2573,8.891,2574,8.891,2575,8.466,2576,4.614,2577,5.258,2578,4.614]],["t/365",[6,2.323,8,0.775,12,0.862,15,1.192,21,1.174,28,1.776,41,2.303,42,2.753,43,3.269,50,0.593,54,0.622,57,3.842,60,2.805,87,2.805,93,2.415,94,1.594,100,1.274,103,0.401,121,3.084,130,0.908,135,1.251,137,1.821,155,3.775,168,2.029,203,2.543,223,5.077,253,3.402,254,1.776,341,2.805,362,3.084,368,2.171,369,3.084,379,3.084,476,3.334,494,6.962,506,5.648,591,5.864,598,3.775,852,1.776,941,3.614,972,1.756,1169,3.935,1326,4.513,1453,3.963,1491,2.805,1501,3.231,1502,3.231,1711,6.332,1761,3.775,1858,3.775,2559,3.485,2579,4.992,2580,4.198,2581,4.513,2582,8.769,2583,4.992,2584,4.992,2585,4.992,2586,4.992,2587,4.992,2588,4.992,2589,4.992,2590,4.992,2591,4.992,2592,7.003,2593,7.003,2594,8.769,2595,4.992,2596,4.992,2597,4.992,2598,4.992,2599,4.992,2600,4.992,2601,4.992,2602,4.992,2603,4.992,2604,4.992,2605,4.992,2606,4.992,2607,4.992,2608,4.992,2609,4.992,2610,4.992,2611,4.992,2612,4.992,2613,4.992,2614,4.992,2615,4.992]],["t/368",[21,2.142,25,2.049,30,6.09,66,0.851,78,4.728,80,2.088,99,1.479,103,0.563,171,5.023,209,2.562,253,3.355,254,2.65,353,3.793,407,6.145,409,4.377,413,6.359,416,5.198,430,6.732,495,3.727,503,8.236,679,4.097,941,3.564,2306,6.732,2616,7.446,2617,7.446,2618,6.732,2619,7.446,2620,6.732,2621,7.446]],["t/370",[8,1.316,26,2.855,150,3.539,200,4.103,217,3.403,236,2.125,254,3.017,742,3.912,941,4.188,1521,6.732]],["t/373",[25,2.109,35,2.962,50,0.911,69,1.097,70,1.127,84,3.333,96,4.866,103,0.438,141,3.431,203,3.905,231,2.727,264,5.17,368,3.333,419,4.217,438,5.35,600,4.736,604,3.431,638,3.242,738,3.771,1116,4.306,1117,4.132,1213,6.084,1230,5.17,1392,8.382,1393,8.382,2622,7.664,2623,6.929,2624,7.664,2625,7.664,2626,6.084,2627,7.664,2628,7.664]],["t/375",[15,0.963,69,1.049,70,1.078,103,0.516,113,1.576,135,1.836,144,3.605,162,3.558,165,1.707,167,4.117,169,4.307,188,5.017,192,6.821,193,2.764,336,5.311,359,3.058,476,4.294,499,4.117,728,3.874,756,3.017,828,2.292,991,3.517,1277,6.162,1368,4.943,2251,5.541,2629,7.327,2630,5.817,2631,8.155,2632,8.155,2633,7.16,2634,6.162,2635,6.162,2636,6.624]],["t/377",[1,2.937,27,3.804,66,0.869,103,0.568,113,1.634,160,4.826,162,3.358,166,2.427,172,4.826,188,4.538,192,5.748,197,3.479,328,2.071,454,3.618,470,4.468,499,5.183,619,5.748,728,4.877,731,2.674,744,6.872,883,6.03,2171,5.306,2631,8.979,2637,9.223,2638,7.6,2639,7.6,2640,7.6]],["t/379",[0,1.291,20,2.854,50,0.889,66,0.855,87,4.201,203,4.652,225,2.601,308,4.113,324,5.368,329,5.42,341,5.131,350,4.031,504,4.347,539,4.201,562,3.042,674,6.16,953,3.739,1027,5.935,1101,4.295,1189,4.201,1195,6.906,1760,5.043,1903,4.395,2537,6.76,2623,6.76,2641,6.76,2642,5.97,2643,5.935,2644,6.76,2645,7.476,2646,7.476]],["t/381",[12,1.25,15,0.955,25,1.992,54,1.212,57,2.905,66,0.828,102,3.828,103,0.414,111,4.884,113,1.557,135,2.436,165,2.086,174,4.36,197,2.731,205,2.111,234,1.936,290,6.089,323,3.624,356,3.241,360,2.09,362,5.532,363,3.392,414,2.242,575,6.089,638,3.063,674,4.884,679,3.983,953,3.539,962,2.731,990,2.731,1027,5.748,1031,4.733,1116,4.068,1377,5.748,1903,5.263,2647,6.546,2648,6.546,2649,7.24,2650,7.24,2651,7.24]],["t/383",[2,3.62,8,1.021,21,1.877,22,2.165,26,1.179,28,1.247,29,2.539,31,1.424,39,2.079,50,0.416,54,1.051,57,1.406,65,3.099,66,0.401,68,1.074,80,0.982,81,1.889,88,2.799,98,1.641,99,1.072,103,0.309,104,1.695,113,1.415,115,1.39,119,2.852,121,2.165,127,2.113,128,1.354,130,1.452,137,1.922,138,1.524,139,1.388,140,1.085,141,2.415,153,3.527,157,1.354,165,2.047,179,1.937,193,1.321,197,2.035,209,1.856,211,1.785,213,1.13,231,1.247,234,1.76,236,2.112,247,0.911,251,2.363,258,1.818,271,3.835,302,2.445,306,2.035,308,3.62,310,1.705,318,1.668,323,1.753,329,2.539,344,3.426,353,1.785,360,1.011,365,5.159,378,3.047,380,3.031,387,1.424,406,3.479,410,2.314,419,4.989,422,3.518,439,2.363,454,1.668,465,2.346,470,2.059,474,1.641,533,1.462,539,1.968,556,3.426,564,2.363,565,4.769,591,2.224,600,2.165,620,2.649,622,5.357,638,2.282,647,4.321,674,2.363,708,1.321,738,2.654,740,3.697,756,1.443,815,1.668,883,2.29,901,2.059,907,2.29,941,4.164,953,3.572,962,1.321,966,2.84,981,2.315,1009,4.769,1028,2.165,1031,3.527,1050,2.29,1114,2.649,1116,1.968,1119,2.224,1169,1.968,1189,3.031,1209,2.363,1222,3.167,1370,2.781,1379,6.712,1384,4.08,1508,2.11,1630,2.11,1661,3.334,1760,2.363,1837,3.167,1931,2.445,2248,4.537,2547,2.781,2642,5.928,2643,2.781,2644,3.167,2652,3.167,2653,3.503,2654,3.503,2655,3.167,2656,6.579,2657,3.503,2658,2.649,2659,3.167,2660,3.167,2661,6.579,2662,3.503,2663,3.503,2664,3.503,2665,3.503,2666,3.503,2667,3.503,2668,3.503,2669,3.167,2670,3.167,2671,3.167,2672,3.503,2673,3.503,2674,2.781,2675,3.503,2676,3.503,2677,3.503,2678,4.878,2679,3.503,2680,3.167,2681,5.395,2682,3.167,2683,2.781,2684,3.167]],["t/385",[0,1.133,2,4.632,4,2.816,6,2.597,7,1.114,20,2.506,21,1.544,35,3.253,42,2.235,43,2.447,50,0.78,54,1.263,94,3.41,103,0.532,135,1.645,150,3.878,165,1.53,174,3.954,179,1.933,202,2.118,203,3.345,214,4.583,225,2.284,232,2.479,234,1.756,253,2.418,279,3.612,308,3.612,324,3.859,363,3.944,428,3.54,562,2.187,604,2.939,953,2.39,1009,4.759,1101,3.771,1117,3.54,1188,4.169,1193,3.884,1297,5.936,1606,4.057,1744,4.429,1903,3.859,1976,4.583,2304,5.212,2436,4.965,2685,7.105,2686,5.936,2687,5.522,2688,6.565]],["t/387",[0,1.506,50,1.037,728,5.289,2689,10.004,2690,8.721]],["t/389",[39,2.484,103,0.539,162,3.669,413,5.488,454,3.742,677,5.533,682,5.699,747,4.079,831,5.303,991,2.829,1045,5.699,1366,5.303,2375,7.108,2691,7.861,2692,9.413,2693,7.108,2694,7.861,2695,7.861,2696,7.861,2697,7.861,2698,7.861,2699,7.861,2700,7.108,2701,7.861,2702,7.861]],["t/391",[6,1.866,7,1.628,25,1.938,35,2.723,39,2.226,51,3.154,69,1.26,70,1.295,82,3.108,94,2.25,95,2.507,99,1.4,103,0.504,105,3.725,131,3.655,194,4.353,201,2.964,205,2.054,219,3.402,234,2.69,253,2.595,279,3.876,357,4.047,407,4.753,507,5.593,665,2.595,845,4.843,893,4.753,914,5.925,1008,4.141,1201,4.918,1209,4.753,1299,5.938,1318,7.984,1325,4.918,1357,4.918,2703,7.045,2704,7.045,2705,7.045,2706,7.045,2707,8.802]],["t/393",[0,0.604,8,1.522,12,1.134,15,1.099,50,1.105,54,0.671,66,1.063,68,1.651,79,1.854,80,1.511,99,0.695,100,1.885,103,0.482,107,1.258,108,1.222,115,0.901,127,1.54,128,2.018,129,0.99,130,1.936,137,1.709,140,1.083,147,1.244,148,1.203,151,2.459,152,1.559,154,1.63,165,0.815,177,3.032,201,1.177,205,1.571,213,1.738,225,3.153,232,1.935,234,1.757,247,0.909,248,1.916,250,1.335,291,1.128,310,1.702,328,1.468,331,1.794,339,2.867,360,1.897,361,1.303,392,4.871,414,1.668,445,2.082,562,2.189,577,2.082,590,2.899,603,1.565,638,1.479,718,2.964,721,1.895,730,1.775,732,1.794,733,2.608,770,2.008,780,1.917,783,1.984,828,1.685,852,1.917,885,1.757,902,2.997,947,1.351,949,1.244,950,1.368,952,1.368,953,1.961,961,1.368,962,2.032,963,2.108,964,2.057,965,2.032,966,3.123,967,2.032,968,2.889,969,2.108,970,2.108,971,1.874,972,1.895,973,2.108,974,1.177,975,3.008,976,1.19,978,1.984,979,2.057,980,2.057,981,1.895,982,2.032,983,2.108,984,1.984,989,1.217,990,1.319,991,1.258,992,1.335,993,1.351,1318,7.381,1755,3.905,2708,5.387,2709,3.496,2710,3.496,2711,3.496,2712,3.496,2713,5.387,2714,5.387,2715,5.387]],["t/395",[5,4.948,6,2.324,7,0.99,8,0.906,12,1.345,15,1.071,41,4.047,42,3.656,50,0.693,51,3.488,54,1.094,68,2.388,103,0.536,139,2.311,152,1.384,160,4.948,174,3.514,205,2.272,243,4.412,253,2.149,291,2.514,360,2.25,363,2.733,387,2.371,504,3.709,519,3.145,666,3.834,742,3.595,863,3.514,941,3.433,1189,3.278,1220,4.632,1496,3.278,1516,4.229,1546,4.907,1604,6.186,1619,5.284,1662,4.287,1663,6.553,1664,5.275,1665,4.632,1666,6.36,1667,4.907,1687,6.553,2716,9.363,2717,5.834,2718,4.632,2719,5.834,2720,4.907,2721,6.553,2722,6.553,2723,6.553,2724,6.553,2725,6.553,2726,6.553,2727,6.553]],["t/397",[7,0.861,8,0.788,15,1.128,21,1.193,41,4.557,42,3.734,50,0.603,54,0.883,66,0.58,69,0.727,79,1.746,94,2.262,99,1.755,102,2.683,103,0.467,127,2.026,130,0.923,135,1.272,137,1.842,139,3.993,152,1.681,156,1.727,160,5.609,164,2.54,202,1.637,219,2.738,243,6.172,247,1.32,253,1.869,259,2.54,266,2.011,291,1.637,323,3.546,343,2.455,360,2.91,361,1.891,363,2.378,387,3.59,432,4.268,562,2.36,599,2.792,742,2.341,781,2.497,891,4.498,941,1.985,1232,3.423,1516,5.916,1619,5.32,1628,3.423,1635,5.958,1661,3.136,1662,5.296,1665,5.624,1666,3.679,1667,4.268,1934,3.838,2353,3.542,2551,8.308,2728,5.074,2729,4.588,2730,5.074,2731,4.588,2732,5.074,2733,5.074,2734,5.074,2735,4.588,2736,8.161]],["t/399",[6,2.571,15,1.201,28,2.566,41,4.12,42,3.04,43,3.329,54,0.899,69,1.032,70,1.061,99,1.433,103,0.413,137,2.322,154,1.395,160,4.579,195,3.182,253,2.656,271,3.742,340,3.888,361,2.688,414,2.233,423,5.25,427,5.13,477,4.409,742,3.327,936,4.579,2557,6.065]],["t/401",[8,1.102,12,1.663,15,1.205,54,0.885,66,1.011,69,1.016,70,1.044,82,3.132,99,1.757,103,0.551,128,1.461,130,1.292,135,1.779,138,3.088,152,1.685,154,1.374,328,1.935,666,3.493,733,2.198,742,4.445,941,3.77,1274,5.369,1340,5.636,1501,3.275,1502,3.275,1630,4.276,1791,4.789,2340,4.276,2552,4.276]],["t/403",[7,1.043,8,1.398,9,4.533,15,1.02,28,2.87,50,0.959,66,1.03,69,1.155,70,1.324,81,3.314,88,3.189,97,4.858,99,1.221,100,1.569,103,0.568,108,2.252,130,1.119,168,2.499,175,4.43,179,1.81,180,2.926,181,3.702,182,2.752,183,4.88,184,4.88,185,4.456,203,4.11,216,2.636,217,2.467,220,3.702,324,3.613,325,5.17,326,2.752,337,3.613,356,2.752,363,2.88,388,2.752,423,3.613,427,5.054,429,4.019,439,4.147,442,3.613,666,3.024,733,1.903,742,2.836,788,4.019,816,4.88,941,3.523,1050,4.019,1108,3.454,1152,4.456,1411,4.88,1439,4.147,1440,4.147,1487,6.784,1606,3.798,2536,3.903,2737,6.147,2738,5.558,2739,5.558,2740,6.147,2741,6.147,2742,5.17,2743,5.17]],["t/406",[8,1.049,12,1.626,15,1.223,42,2.301,54,0.843,99,1.871,103,0.491,128,1.391,129,1.914,130,1.561,135,1.694,154,1.659,248,1.971,253,2.49,666,3.326,742,3.956,941,3.355,1501,3.118,1502,3.118,1619,5.673,2340,4.071,2536,5.446,2550,7.213,2551,5.685,2552,4.071]],["t/408",[8,1.077,12,1.646,15,1.223,54,0.865,83,3.251,99,1.378,128,1.428,129,1.965,130,1.587,135,1.739,154,1.687,248,2.023,253,2.556,666,3.414,742,4.022,1501,3.201,1502,3.201,2340,4.179,2550,7.333,2552,4.179,2729,6.273,2744,6.938,2745,6.938,2746,6.938,2747,6.938,2748,6.938]],["t/410",[8,1.102,12,1.226,15,1.205,41,4.652,42,2.416,54,0.885,66,0.812,94,2.824,99,1.41,103,0.406,128,1.461,130,1.292,135,1.779,154,1.374,165,1.654,204,3.549,271,3.684,291,2.291,323,3.554,331,2.365,349,3.088,666,3.493,742,3.275,781,3.493,941,3.461,1501,3.275,1502,3.275,1662,3.906,1663,5.971,1666,5.147,2340,4.276,2552,4.276,2749,7.099]],["t/412",[6,1.981,8,1.161,12,1.291,41,3.449,42,3.356,43,2.787,54,1.28,97,5.5,103,0.522,154,1.447,219,2.889,224,3.559,236,2.471,338,4.62,341,4.201,343,3.617,349,3.252,375,3.559,476,3.559,828,2.856,907,4.888,941,3.858,1245,4.738,2187,6.288,2353,5.219,2525,6.76,2577,5.935,2750,7.476,2751,7.476]],["t/414",[8,1.233,12,1.537,15,1.217,41,4.106,42,2.704,43,2.239,54,0.749,66,1.018,69,0.86,70,0.884,82,2.65,83,2.814,94,1.918,97,3.617,99,1.882,103,0.509,128,1.236,130,1.093,135,1.505,138,2.612,152,1.425,154,1.537,236,2.231,248,1.751,253,2.212,343,2.906,375,2.859,423,4.67,476,2.859,666,2.955,675,3.304,825,4.784,941,3.854,1245,3.116,1274,4.542,1339,4.354,1340,4.768,1501,2.771,1502,2.771,1630,3.617,1791,4.052,2340,3.617,2353,4.193,2552,3.617,2577,4.768,2752,4.768,2753,6.681]],["t/416",[15,1.165,98,2.909,103,0.518,127,1.776,156,3.477,193,2.342,195,2.74,205,1.811,224,2.956,291,3.406,343,5.108,360,3.184,362,3.837,375,4.307,654,6.829,1232,5.478,1245,4.213,1635,5.222,2310,4.93,2353,6.952,2753,6.829,2754,6.209,2755,6.209,2756,6.209,2757,9.048,2758,9.048,2759,6.209,2760,6.209,2761,9.048,2762,6.209,2763,6.209]],["t/418",[12,1.184,15,1.213,28,2.441,41,4.595,42,2.335,43,2.557,50,0.815,54,0.855,134,2.942,135,1.719,154,1.327,223,4.973,227,4.485,236,1.719,246,2.753,247,1.784,253,2.527,340,4.668,343,4.589,360,1.981,375,4.121,423,4.033,1245,4.921,1339,4.973,1501,3.165,1502,3.165,2353,4.789,2538,5.77,2753,7.281,2764,8.657,2765,8.657]],["t/421",[8,1.124,15,1.205,41,4.484,42,3.047,103,0.414,154,1.401,156,2.464,162,3.26,236,1.814,343,4.703,375,4.627,423,4.256,754,4.884,936,4.597,1245,3.756,1720,7.53,1791,4.884,2573,8.095,2574,8.095,2766,8.095,2767,7.24,2768,7.24,2769,7.24]],["t/423",[6,2.216,8,1.298,15,1.137,41,4.504,43,3.639,154,1.618,236,2.096,476,4.648,1245,4.339,1604,6.64]],["t/425",[8,1.253,15,1.206,23,3.56,41,4.41,154,1.85,236,2.396,321,5.275,1720,8.041,1735,6.406]],["t/427",[8,1.298,15,1.173,42,2.847,154,1.618,236,2.096,343,4.047,375,3.981,2770,9.764,2771,8.363,2772,8.363]],["t/429",[8,1.304,15,1.185,42,2.86,43,3.131,154,1.626,236,2.105,343,4.065,375,4,2577,6.67]],["t/431",[8,0.964,15,1.158,42,3.754,55,3.283,69,0.889,87,3.489,103,0.355,115,1.6,119,4.784,152,2.277,154,1.201,202,2.004,205,1.811,236,1.556,266,2.46,284,3.74,343,4.643,349,2.701,357,3.567,360,2.613,366,2.701,375,3.865,474,2.909,504,2.956,534,6.829,539,5.084,614,3.65,958,3.837,1011,4.696,1210,6.843,1242,5.668,1517,4.335,1546,8.071,1619,5.449,2020,4.335,2766,5.614,2773,9.048,2774,9.048,2775,6.209,2776,6.209,2777,6.209,2778,6.209,2779,6.209]],["t/435",[157,3.292,165,1.985,188,4.856,991,3.066,2425,7.702,2780,7.88,2781,7.702,2782,8.519,2783,8.519]],["t/437",[21,2.031,50,1.027,103,0.494,113,1.858,217,3.467,335,6.859,639,5.648,2784,6.534,2785,7.811]],["t/440",[15,1.037,23,3.194,50,1.064,103,0.556,113,1.557,138,3.149,157,3.46,162,2.636,163,3.756,169,5.263,194,4.474,214,5.054,219,2.798,368,3.149,453,4.159,530,5.475,756,2.982,771,6.089,845,3.983,852,2.576,1102,6.546,1274,5.475,1630,4.36,1650,7.108,2518,6.546,2693,6.546,2780,7.351,2786,6.546,2787,7.24,2788,7.24,2789,6.089,2790,8.095,2791,7.24,2792,7.24,2793,7.24,2794,6.546,2795,7.24,2796,6.546,2797,7.24]],["t/442",[2,3.337,21,1.426,50,1.063,70,1.399,103,0.512,115,2.06,157,4.146,169,4.7,188,3.934,192,6.047,214,5.582,215,6.348,236,1.52,308,3.337,326,2.715,343,2.935,368,3.478,410,2.602,474,2.842,530,4.587,562,2.02,755,3.147,766,3.408,826,6.047,829,2.887,832,5.797,991,3.22,1005,3.965,1015,4.587,1209,4.092,1339,4.397,1344,4.397,1378,3.965,1588,5.101,1630,4.816,2521,5.484,2780,7.943,2781,5.484,2785,5.484,2789,5.101,2794,5.484,2798,6.065,2799,7.996,2800,6.065,2801,7.996,2802,7.996,2803,7.996,2804,8.945,2805,6.065,2806,6.065,2807,6.065,2808,7.996,2809,6.065,2810,6.065,2811,6.065,2812,6.065,2813,6.065]],["t/444",[13,3.876,21,1.976,99,1.669,103,0.56,162,3.565,188,4.134,236,2.105,832,6.091,1189,4.721,2780,6.354,2789,7.066,2814,7.596,2815,8.401]],["t/448",[4,3.15,8,0.652,11,1.708,12,1.268,15,0.922,20,1.604,22,3.465,25,2.021,26,2.083,31,1.708,39,1.328,50,0.963,54,0.524,57,3.845,60,4.552,65,2.414,66,0.708,69,1.444,70,1.484,72,3.178,103,0.42,104,2.033,113,0.904,116,2.297,146,2.391,147,1.495,148,1.446,162,2.253,164,3.097,179,1.822,205,1.225,209,1.446,224,2,231,2.883,234,2.166,264,2.835,308,3.404,311,4.679,323,2.103,337,2.47,366,1.828,368,3.524,369,2.596,387,2.515,388,3.288,389,3.046,410,1.802,422,3.496,454,2.945,465,3.194,474,2.899,481,2.312,495,2.103,509,2.222,556,2.668,589,4.045,591,2.668,598,3.178,600,5.336,603,2.77,604,1.881,605,5.581,608,3.336,638,2.617,708,1.585,713,4.317,731,1.478,740,3.477,766,2.361,772,3.726,828,1.314,862,5.594,864,2.668,920,2.222,1081,4.319,1101,2.414,1112,2.668,1210,3.178,1242,4.319,1324,3.336,1492,3.554,1539,4.319,1561,5.594,1562,5.594,1565,5.594,1599,3.046,1606,4.538,1903,2.47,1905,3.336,1910,2.747,2024,2.668,2078,3.799,2171,4.319,2372,3.534,2581,5.594,2816,3.534,2817,6.187,2818,4.202,2819,5.594,2820,6.187,2821,5.204,2822,7.344,2823,6.187,2824,6.187,2825,6.187,2826,4.202,2827,3.799,2828,3.799,2829,3.799,2830,4.202,2831,4.202,2832,4.202,2833,4.202,2834,4.202,2835,4.202,2836,4.202,2837,4.202,2838,4.202,2839,4.202]],["t/450",[0,1.255,15,0.776,65,4.175,66,0.831,69,1.285,70,1.32,73,6.113,103,0.514,104,3.517,116,2.807,162,2.646,174,4.378,179,2.14,205,2.119,213,2.345,232,2.14,234,2.4,346,3.771,348,4.903,359,3.034,378,2.775,604,4.359,708,3.385,713,4.273,747,4.657,828,2.274,1081,6.797,1116,4.084,1118,6.572,1903,5.724,1910,4.752,2045,5.771,2840,7.268,2841,7.268,2842,7.268,2843,7.268]],["t/452",[1,2.284,21,1.848,22,3.154,30,4.416,45,3.986,63,3.124,80,1.657,87,3.32,118,3.124,121,4.856,122,3.752,146,3.637,157,3.037,162,2.151,164,4.711,179,3.028,201,1.99,203,3.011,216,2.534,231,2.797,310,1.867,359,2.466,380,3.32,387,2.402,422,4.203,465,3.418,504,2.813,613,5.343,682,4.284,740,4.962,778,3.752,824,4.125,885,1.927,920,4.669,957,4.125,1019,3.752,1205,3.251,1349,6.164,1582,9.109,1654,4.469,1740,4.469,1744,3.986,1772,7.619,1781,4.97,2328,5.343,2379,4.691,2440,5.343,2671,5.343,2844,7.859,2845,5.909,2846,5.909,2847,7.859,2848,7.859,2849,7.859,2850,5.909,2851,5.909,2852,5.909,2853,5.343,2854,5.343,2855,5.909,2856,7.859,2857,5.909,2858,5.909,2859,5.909,2860,5.909]],["t/454",[0,0.988,21,2.043,26,1.927,31,2.327,45,3.862,65,3.288,69,1.244,70,1.278,80,1.606,81,3.086,84,2.49,88,2.97,103,0.593,113,1.231,118,3.027,131,2.97,179,1.686,195,2.526,197,2.159,213,1.847,236,1.435,255,3.288,257,3.635,258,2.97,310,2.431,331,1.907,359,2.389,378,3.959,422,2.725,474,2.682,480,3.635,493,3.635,535,4.329,541,3.996,596,5.176,604,2.563,614,3.365,708,2.902,731,2.014,739,2.917,747,4.509,749,2.77,755,2.97,778,3.635,815,2.725,829,2.725,863,3.448,910,3.217,939,3.365,982,2.159,998,5.518,1010,4.545,1114,4.329,1136,5.578,1259,4.545,1344,4.15,1408,4.545,1507,7.332,1539,3.996,1575,4.545,1599,4.15,1741,4.815,1811,4.329,1845,4.815,2220,7.309,2248,4.815,2289,4.545,2454,8.154,2456,6.471,2457,6.956,2461,5.176,2504,5.176,2684,5.176,2686,5.176,2861,7.694,2862,5.176,2863,5.724]],["t/457",[15,1.039,23,3.207,26,2.447,57,2.917,66,1.026,128,1.847,130,1.323,151,2.421,153,5.867,164,3.638,216,3.118,248,2.119,276,4.378,310,3.301,334,4.378,368,4.423,732,2.421,753,5.771,966,2.587,982,2.742,1017,6.572,1112,4.615,1539,5.074,2828,8.804,2829,8.804,2864,9.737,2865,9.737,2866,7.268,2867,7.268]],["t/460",[0,1.312,7,1.684,27,3.804,38,4.577,48,4.271,50,0.903,61,5.169,62,5.127,63,4.018,66,0.869,67,4.969,69,1.088,70,1.118,104,3.677,172,4.826,173,3.089,202,2.452,221,6.034,324,4.468,349,3.306,353,3.872,470,4.468,562,2.532,756,3.13,935,6.392,1230,5.127,1368,5.127,1406,6.034,1586,4.826,2014,6.392,2868,7.6,2869,7.6,2870,6.034]],["t/462",[6,2.101,7,1.345,10,3.815,25,2.182,42,3.565,69,1.355,70,1.166,94,2.532,116,2.48,152,1.881,289,3.223,340,4.275,359,3.949,360,2.289,380,4.455,474,3.715,703,4.555,749,3.837,863,4.775,877,4.899,2827,7.169]],["t/464",[4,2.999,21,1.644,50,0.831,54,1.092,57,3.839,69,1.001,70,1.028,87,3.929,100,1.785,103,0.4,116,2.187,146,3.386,150,2.918,162,3.19,202,2.256,289,2.842,328,1.905,340,5.158,363,3.276,406,3.697,489,4.881,504,4.17,519,3.769,533,2.918,591,4.439,647,3.44,663,5.88,703,4.016,756,2.879,1008,5.15,1044,6.321,1114,5.287,1188,5.563,1273,4.881,1305,6.116,1306,7.488,1575,5.55,1606,4.32,1612,5.88,1823,5.88,2168,6.321,2871,6.991,2872,6.991,2873,6.991]],["t/466",[6,1.965,8,1.411,21,1.744,42,3.093,51,4.068,57,2.976,94,3.355,140,2.296,154,2.033,217,3.646,324,5.341,368,3.225,665,2.732,783,2.732,1008,4.359,1015,5.608,1112,5.77,1306,5.376,1571,6.285,1599,6.587,1608,5.887,2035,5.003,2874,7.415,2875,7.415]],["t/468",[20,3.252,21,2.003,26,2.868,51,3.814,57,3.418,66,0.974,146,3.292,428,4.593,589,5.569,1101,4.893,1316,6.89]],["t/470",[0,0.576,5,5.479,6,0.884,7,1.514,12,1.243,15,1.105,20,1.274,21,1.5,22,2.56,31,2.112,35,3.016,39,1.642,40,2.33,42,1.136,43,1.244,48,4.047,50,0.928,51,2.326,54,0.795,55,2.747,57,3.761,61,1.67,66,0.382,69,1.031,70,1.059,74,2.33,77,2.419,87,2.92,94,2.037,102,2.747,103,0.365,104,2.514,108,0.757,113,0.718,121,4.45,125,2.33,128,1.313,130,0.607,135,1.956,137,1.659,139,3.419,141,1.494,146,3.194,154,1.005,163,1.732,193,1.259,207,1.306,209,1.148,219,3.016,224,1.589,245,1.875,255,1.917,258,1.732,284,3.129,319,4.454,320,2.33,328,1.416,363,1.564,410,1.431,439,2.251,449,2.807,477,3.755,478,2.182,480,2.119,481,1.836,492,1.732,506,4.137,534,2.807,539,2.92,549,5.066,551,4.304,581,2.807,589,4.171,597,2.033,598,2.524,607,1.962,614,1.962,649,2.649,665,1.914,705,3.129,708,1.259,718,1.174,731,2.534,768,2.807,770,1.244,778,2.119,815,1.589,824,2.33,826,5.446,828,1.044,829,1.589,861,2.524,878,2.419,885,1.088,891,2.119,892,2.649,901,1.962,939,1.962,956,1.962,965,1.259,978,1.229,979,1.274,1019,3.299,1117,1.799,1133,2.251,1188,3.299,1218,3.017,1219,2.649,1221,4.625,1245,1.732,1259,2.649,1278,2.524,1302,3.906,1321,2.807,1350,2.251,1503,2.807,1522,2.807,1539,2.33,1761,2.524,1787,2.807,1840,2.807,1868,2.33,1902,5.066,1980,2.807,2015,2.807,2211,2.524,2219,2.419,2221,3.017,2271,2.524,2304,2.649,2454,8.155,2455,6.057,2462,3.017,2463,6.057,2464,5.769,2790,3.017,2796,4.698,2862,4.698,2876,3.337,2877,3.337,2878,3.337,2879,3.337,2880,3.337,2881,3.337,2882,3.337,2883,3.337,2884,3.017,2885,3.337,2886,3.337,2887,3.337,2888,3.337,2889,3.337,2890,3.337,2891,3.337,2892,3.337,2893,3.337,2894,3.337,2895,4.125,2896,3.337,2897,3.337,2898,3.337,2899,3.337,2900,3.337,2901,3.337,2902,3.337,2903,3.337,2904,3.337,2905,3.337,2906,3.017,2907,3.337,2908,3.337,2909,3.337,2910,3.337,2911,2.649,2912,5.196,2913,3.337,2914,3.337,2915,3.337,2916,3.017,2917,5.196]],["t/472",[8,1.335,26,2.895,66,0.983,87,4.832,108,1.951,128,1.769,144,4.231,154,1.664,533,3.589,1101,4.939]],["t/474",[63,5.068,119,4.285,180,4.563,259,4.057,499,5.386,696,5.146,759,7.328,782,8.062,1188,5.146,1189,4.554,1588,6.816,2918,8.104,2919,8.104,2920,8.104,2921,8.104,2922,8.104,2923,8.104,2924,8.104,2925,8.104]],["t/476",[0,0.663,2,2.113,12,0.663,15,1.149,21,1.637,25,1.057,30,4.355,39,1.829,50,0.688,54,0.868,66,0.662,67,2.511,69,1.298,70,1.405,84,3.028,93,1.858,99,1.15,103,0.573,105,2.031,108,0.871,113,1.667,128,1.711,130,0.699,135,1.745,137,0.999,138,1.671,141,1.719,147,2.059,148,1.991,152,0.911,162,2.107,167,2.158,168,3.955,169,4.887,173,1.561,178,5.209,179,2.812,180,3.314,181,3.485,182,3.469,188,1.89,195,3.072,197,3.42,198,2.591,232,1.704,234,1.548,236,1.45,266,1.522,323,1.922,363,1.8,377,2.439,388,3.117,389,2.784,407,2.591,408,2.511,409,2.258,412,3.23,413,2.681,416,2.681,431,3.473,438,2.681,440,4.04,442,4.556,458,2.905,459,3.473,460,3.23,461,3.23,462,3.23,463,3.23,472,3.613,489,2.681,533,1.603,535,2.905,565,2.784,597,1.503,603,3.722,605,2.373,629,3.473,638,1.625,679,2.113,681,2.158,687,1.8,708,1.449,713,3.402,740,3.912,747,1.993,751,3.23,765,3.402,772,3.485,832,2.784,864,3.674,956,2.258,981,2.036,997,4.195,1031,2.511,1049,2.373,1128,2.313,1342,2.784,1366,2.591,1368,2.591,1417,5.265,1418,4.376,1419,2.905,1439,3.904,1440,2.591,2135,3.473,2136,3.473,2139,5.232,2247,3.473,2400,4.867,2752,3.049,2814,3.473,2926,3.841,2927,3.841,2928,3.841,2929,3.841,2930,3.841,2931,3.841,2932,3.841,2933,5.786,2934,3.841,2935,5.232,2936,3.841,2937,3.841,2938,5.786,2939,3.841,2940,3.841,2941,3.841,2942,3.473]],["t/478",[0,0.998,8,1.202,9,3.247,12,0.998,15,1.109,26,2.607,30,4.351,39,1.826,50,0.687,69,1.109,70,1.285,81,3.116,88,2.998,103,0.443,115,1.489,135,1.94,144,2.843,158,4.034,167,3.247,168,3.953,169,4.551,175,2.843,178,5.016,179,1.702,180,3.686,181,3.48,182,2.587,185,4.189,193,2.18,194,3.571,195,2.55,197,2.18,202,1.865,234,1.545,266,2.29,326,2.587,349,2.513,350,3.116,368,2.513,388,3.466,389,4.189,440,6.096,442,5.133,460,4.86,461,4.86,462,4.86,463,4.86,472,2.998,496,4.37,533,2.412,603,2.587,687,2.708,713,3.397,772,3.48,788,3.778,864,3.669,971,2.694,1108,3.247,1160,6.147,1210,4.37,1361,3.571,1416,4.37,1417,4.37,1418,4.37,1419,4.37,1439,3.898,1440,3.898,2626,4.588,2821,4.86,2942,5.225,2943,4.588,2944,5.779,2945,5.779,2946,5.779,2947,5.779,2948,5.225,2949,5.225,2950,5.225,2951,5.225,2952,5.779,2953,5.779,2954,5.779,2955,5.779,2956,5.779]],["t/480",[26,2.909,66,0.988,69,1.237,70,1.271,82,3.812,162,3.146,188,4.251,1822,7.811,2957,8.639]],["t/482",[0,1.049,8,0.943,9,2.303,12,1.049,15,1.181,21,1.702,25,1.671,26,1.38,30,2.303,50,0.487,54,1.186,55,2.167,66,0.469,69,0.587,70,1.363,93,1.983,101,1.734,103,0.53,108,1.642,113,1.838,123,2.533,128,1.647,130,1.555,135,1.027,144,2.017,146,1.584,147,2.575,148,2.491,153,2.679,154,1.175,162,2.914,169,5.713,175,2.017,185,2.971,188,2.989,192,6.463,193,2.291,195,1.808,202,1.322,226,3.1,234,1.625,236,1.027,238,3.275,248,1.195,250,2.319,289,1.666,290,5.109,294,2.679,300,3.254,301,3.254,310,1.92,336,4.403,343,1.983,359,3.021,363,2.846,388,2.719,389,2.971,390,4.098,472,2.127,476,1.951,499,2.303,564,2.765,604,2.719,639,2.679,679,2.255,711,3.254,721,1.442,742,1.891,772,2.468,781,2.989,822,2.861,828,1.282,830,3.706,831,2.765,877,2.533,895,2.971,991,2.881,1114,3.1,1188,2.602,1193,1.891,1277,3.447,1611,3.447,1630,4.82,1661,2.533,1926,3.447,1970,3.254,2626,3.254,2632,3.706,2633,4.822,2634,3.447,2635,3.447,2636,3.706,2784,3.1,2786,3.706,2949,3.706,2950,3.706,2958,4.098,2959,4.098,2960,4.098,2961,6.074,2962,4.098,2963,4.098,2964,4.098,2965,4.098,2966,4.098,2967,4.098,2968,4.098,2969,4.098,2970,4.098,2971,4.098,2972,4.098,2973,4.098,2974,4.098,2975,4.098,2976,8.003,2977,6.074,2978,3.706,2979,4.098,2980,4.098,2981,4.098,2982,4.822,2983,4.098,2984,4.098,2985,4.098,2986,4.098,2987,4.098,2988,4.098,2989,4.098]],["t/484",[4,3.587,21,1.967,26,2.816,50,0.994,83,3.919,101,3.538,188,4.115,202,2.699,368,3.638,447,5.838,1595,7.562,1630,5.037,2780,7.384,2990,8.363,2991,8.363]],["t/488",[20,2.82,21,1.737,31,3.002,57,4.286,59,5.601,60,4.15,68,2.264,69,1.057,79,2.542,84,3.942,104,3.574,116,2.31,121,5.601,146,3.503,158,5.156,166,2.358,168,3.002,216,3.168,219,2.854,328,2.47,387,3.002,480,5.755,675,4.064,733,2.287,765,4.342,885,2.408,976,2.514,1046,6.678,1336,4.828,2304,5.864,2853,6.678,2992,7.386,2993,7.386,2994,7.386]],["t/490",[54,0.993,57,4.066,60,5.33,68,2.441,100,2.033,146,3.078,171,5.372,202,2.57,323,3.986,410,3.416,453,4.574,481,4.381,485,5.372,567,4.475,589,6.202,590,3.487,594,7.2,1477,5.559,2379,6.322,2995,7.2,2996,7.2]],["t/492",[0,1.129,6,2.225,7,1.11,15,1.08,28,2.328,31,2.659,50,0.778,54,1.291,55,4.441,60,5.213,63,4.441,84,2.845,103,0.374,128,1.346,139,2.592,146,3.783,151,2.179,166,2.089,203,4.279,225,2.276,243,4.947,328,2.289,339,2.859,446,4.277,454,3.114,489,4.567,507,5.194,670,3.94,687,3.935,696,4.154,721,2.302,730,2.156,732,3.09,753,6.668,908,5.194,910,3.676,942,4.567,1136,4.742,1345,5.502,1516,4.742,1517,4.567,2209,5.194,2700,5.915,2916,5.915,2996,5.915,2997,6.542,2998,6.542,2999,6.542,3000,6.542,3001,6.542,3002,6.542,3003,6.542,3004,6.542]],["t/495",[22,3.311,26,2.778,69,1.181,70,1.214,145,6.762,146,4.1,258,4.281,328,2.249,480,5.239,481,4.539,504,3.928,907,5.394,1112,5.239,3005,8.25,3006,8.25]],["t/497",[23,3.741,26,2.855,27,4.244,69,1.214,70,1.247,146,3.804,375,4.037,499,4.765,696,5.384,1033,6.732,2419,7.132,3007,8.479]],["t/499",[6,1.838,20,2.649,51,3.903,54,0.865,57,3.499,60,4.899,68,2.126,69,0.993,70,1.021,98,3.251,103,0.499,146,4.065,157,2.681,158,4.844,166,2.215,193,2.617,202,2.239,203,4.442,204,3.499,326,3.106,328,1.891,366,3.018,369,4.287,406,3.669,422,4.539,427,3.669,454,3.303,589,4.536,590,2.388,731,3.519,885,3.109,891,5.536,984,2.556,1345,5.835,1574,7.883,2212,5.835,2419,5.835,2995,6.273,3008,6.938,3009,6.938,3010,6.938]],["t/501",[103,0.47,162,2.99,166,2.623,173,3.339,179,2.845,236,2.058,328,2.238,760,7.426,772,4.947,817,4.828,1368,5.541,2251,6.211,3011,8.213,3012,8.213,3013,8.213,3014,8.213,3015,8.213,3016,8.213,3017,8.213]],["t/503",[69,1.321,70,1.357,115,1.958,128,1.898,130,1.383,162,2.767,166,2.945,179,2.716,188,3.739,193,2.867,245,4.271,339,2.587,548,6.392,597,2.974,731,2.674,975,2.867,1517,5.306,1970,6.034,2276,6.872,3018,7.6,3019,7.6,3020,7.6,3021,7.6,3022,8.34,3023,7.6,3024,7.6,3025,7.6,3026,7.6,3027,7.6,3028,7.6,3029,7.6,3030,7.6]],["t/505",[13,3.596,69,1.437,70,1.147,82,3.439,100,2.39,128,1.604,162,3.41,179,3.067,193,3.532,236,2.516,446,5.095,731,2.742,817,4.582,1313,5.894,1834,6.555,3022,8.467,3031,10.039,3032,7.794,3033,7.794]],["t/507",[69,1.237,70,1.271,80,2.423,113,1.858,179,2.544,454,4.113,1101,4.963,2251,6.534,3034,7.811]],["t/510",[4,3.168,20,3.46,22,2.964,69,1.057,70,1.087,165,1.721,197,3.419,200,3.574,212,4.342,213,2.383,217,2.964,246,3.637,380,4.15,453,4.243,475,6.685,476,4.668,479,4.983,681,5.093,696,4.69,756,3.042,757,4.828,845,4.064,897,4.618,971,2.57,1025,5.586,1378,4.828,1586,4.69,1607,4.448,1707,5.586,3035,7.386,3036,6.212,3037,5.864,3038,6.678,3039,7.386,3040,6.212]],["t/512",[2,4.015,12,1.26,20,2.786,69,1.045,70,1.074,80,2.047,82,3.22,116,2.283,121,4.509,128,1.851,144,3.59,162,2.657,165,1.701,166,2.873,169,4.29,196,5.519,204,2.928,410,4.184,470,4.29,471,6.598,472,5.283,473,8.819,474,3.419,475,4.771,476,3.474,478,4.771,479,6.07,538,6.138,681,4.101,732,2.431,1378,4.771,1415,8.204,1707,5.519,2492,6.598,3041,7.297,3042,7.297]],["t/514",[20,3.222,66,0.965,246,3.387,475,6.417,476,4.018,477,3.835,696,5.359,757,5.518,845,4.644,897,4.3,1707,6.383,1744,5.694,3037,6.701]],["t/516",[22,2.952,62,4.962,69,1.053,70,1.082,80,2.063,88,3.817,103,0.421,150,3.07,167,4.134,168,3.979,188,3.619,197,2.775,200,3.559,213,2.374,246,3.628,335,5.84,336,6.554,350,5.278,475,5.911,476,4.304,479,4.962,495,3.682,499,4.134,509,4.781,681,4.134,845,4.047,895,5.333,897,4.606,1163,5.563,1212,7.096,1384,5.563,2633,5.84,3036,6.187,3043,7.356]],["t/518",[13,3.353,15,0.958,22,2.917,69,1.041,70,1.069,87,4.084,102,4.745,103,0.416,165,1.694,246,2.917,328,1.981,475,4.752,476,4.973,477,4.424,479,4.903,495,3.638,696,4.615,731,3.158,756,2.993,757,6.366,897,3.703,1112,4.615,1586,5.699,1707,6.788,1865,7.548,2212,6.113,3036,6.113,3038,6.572,3044,6.572,3045,8.115,3046,5.771,3047,7.268,3048,7.268,3049,7.268]],["t/520",[98,4.422,99,1.568,103,0.452,205,2.302,336,6.841,422,3.758,519,4.257,639,5.161,728,4.99,895,5.723,897,4.022,1212,5.723,1216,7.138,1778,6.64,1826,6.268,2633,6.268,2634,6.64,2635,6.64,2784,7.634,3046,6.268,3050,6.64,3051,7.937,3052,7.895]],["t/522",[20,2.71,22,2.849,82,3.132,103,0.506,119,3.754,168,3.595,180,4.587,205,2.07,338,4.387,414,2.198,422,3.38,476,4.211,477,3.226,639,6.299,676,4.173,731,2.498,757,4.641,883,4.641,895,7.669,897,5.138,1025,5.369,1189,3.989,1212,6.412,1826,5.636,1865,5.971,2563,5.636,2784,5.369,3034,6.419,3044,6.419,3045,6.419,3046,7.022,3050,5.971,3051,7.439,3053,5.971,3054,8.845,3055,7.099]],["t/524",[4,2.728,12,1.098,15,0.679,21,1.496,22,2.552,50,0.756,57,2.552,69,1.181,70,1.213,73,5.349,83,2.98,84,2.766,92,5.05,93,3.078,103,0.364,122,4.039,144,3.129,162,3.526,168,3.353,180,3.028,197,3.453,205,2.405,266,2.52,308,3.499,326,2.847,335,5.05,336,4.611,360,1.837,422,3.028,454,3.028,476,5.051,477,2.89,519,3.429,604,2.847,607,3.739,639,4.158,731,2.238,733,1.969,902,2.263,1036,4.611,1062,4.611,1098,4.81,1167,5.349,1212,5.979,1344,4.611,1361,3.93,1710,5.349,1760,4.291,1826,5.05,1830,5.05,1858,4.81,2618,5.751,2784,6.238,2819,5.751,2935,5.751,3046,5.05,3050,5.349,3053,5.349,3056,6.36,3057,6.36,3058,6.36,3059,6.36,3060,6.36,3061,6.36,3062,6.36,3063,6.36,3064,6.36]],["t/526",[7,1.164,9,3.855,10,2.588,17,3.375,35,2.651,54,0.855,69,1.426,70,1.465,80,1.924,84,3.765,95,2.441,103,0.393,115,1.767,116,2.708,119,3.627,120,2.651,128,1.412,162,2.498,168,3.855,169,4.033,175,3.375,178,3.941,197,2.588,246,2.753,289,2.789,343,3.319,350,3.699,379,4.239,383,6.203,388,3.071,389,4.973,446,4.485,599,4.763,603,3.071,676,4.033,679,4.763,713,5.089,765,4.033,864,4.356,938,3.56,971,3.012,1205,3.775,1245,3.56,1412,4.239,1868,4.789,1910,5.66,2626,5.446,2821,7.281]],["t/528",[8,1.133,12,1.26,15,0.96,54,0.91,69,1.397,70,1.498,81,3.935,88,3.786,115,1.88,147,2.597,148,2.511,166,2.873,168,2.966,178,5.168,179,2.149,180,3.474,181,4.395,182,3.267,195,3.22,266,2.891,388,3.267,442,4.29,472,3.786,687,4.215,727,4.395,731,2.568,788,4.771,1108,4.101,1416,5.519,1417,5.519,1418,5.519,1419,5.519,1439,4.923,1440,4.923,1517,5.094,1744,4.923,2271,5.519,2401,5.094,2951,6.598]],["t/530",[0,1.116,1,1.316,7,1.565,10,3.143,11,3.388,15,0.841,25,2.003,26,1.147,27,1.705,35,1.316,42,1.159,50,1.096,53,1.705,66,0.604,69,1.349,70,1.387,80,0.955,82,2.329,84,2.296,88,2.739,95,2.3,96,3.352,98,1.596,100,0.869,101,2.233,103,0.539,108,1.197,113,1.39,115,0.877,120,2.498,123,2.104,124,1.502,130,0.62,135,1.323,139,1.349,152,0.808,163,1.767,166,3.152,168,3.534,173,2.627,175,3.582,178,5.512,182,3.731,183,2.704,184,2.704,185,2.469,186,3.079,188,2.597,193,1.991,199,2.051,200,2.554,202,1.703,204,1.366,207,2.848,213,1.703,216,1.461,217,3.344,219,1.316,224,1.621,234,1.728,236,1.62,246,2.118,247,1.893,289,3.202,306,2.971,317,1.676,324,3.103,337,2.002,346,1.767,356,2.893,366,1.481,368,1.481,377,3.352,378,1.3,386,1.956,388,1.525,410,3.123,439,3.561,465,1.481,477,2.398,495,1.705,509,2.791,597,3.082,638,2.734,652,2.226,653,2.162,659,2.226,666,2.597,708,1.284,730,1.739,731,1.857,734,2.469,755,3.353,771,2.864,781,1.676,829,3.077,878,2.469,902,1.212,938,3.777,939,2.002,958,2.104,966,1.212,1014,3.079,1115,2.864,1116,1.914,1119,3.352,1120,4.19,1122,2.575,1128,3.179,1362,3.826,1412,5.372,1508,4.385,1619,2.051,1692,3.079,1751,2.704,1780,2.864,1806,3.561,1858,2.575,2075,2.864,2077,2.864,2083,3.079,2084,3.079,2259,3.079,2289,4.19,2401,5.499,2543,4.439,3065,3.405,3066,3.405,3067,3.405,3068,3.405,3069,3.405,3070,3.405,3071,3.405,3072,3.405,3073,3.405,3074,3.405,3075,3.405,3076,3.405,3077,3.405,3078,3.405,3079,3.405,3080,3.405,3081,3.405,3082,3.405,3083,3.405,3084,3.405]],["t/532",[0,0.821,7,0.807,8,0.739,10,1.795,12,0.821,15,1.152,20,1.817,23,2.099,25,1.309,28,1.693,42,1.62,50,1.153,54,0.982,66,0.544,69,0.681,70,0.7,100,2.012,103,0.451,115,1.744,120,1.839,124,2.099,128,0.979,134,2.041,135,1.697,141,2.13,154,0.921,156,2.304,166,3.01,168,3.687,170,2.94,173,2.752,175,2.341,178,5.876,182,4.061,199,2.866,204,1.909,209,1.637,211,2.424,217,3.892,219,1.839,227,3.111,238,2.565,246,1.909,247,2.359,254,3.64,258,2.469,266,1.885,289,1.934,297,2.565,339,1.62,340,2.565,346,2.469,364,2.797,375,2.265,387,2.752,492,2.469,495,3.945,597,3.688,607,2.797,687,2.229,755,2.469,781,2.341,829,2.265,938,2.469,958,2.94,974,1.602,989,1.656,1013,3.449,1122,3.599,1133,3.21,1366,3.21,1412,2.94,1481,3.599,1485,3.111,1486,3.778,1488,4.002,1492,3.889,1501,2.195,1502,2.195,1607,2.866,1662,2.618,1751,3.778,2063,4.002,2315,4.002,2401,6.332,2475,3.599,2580,5.694,3085,4.758,3086,4.302,3087,4.002,3088,4.002,3089,4.302,3090,4.302,3091,4.302,3092,4.302]],["t/534",[15,1.111,42,2.445,50,0.854,103,0.51,156,2.445,166,2.294,168,2.92,170,4.439,178,5.118,182,3.216,204,2.882,209,2.472,211,3.66,217,2.882,219,2.776,246,2.882,247,1.868,254,3.604,258,3.727,266,2.846,339,2.445,340,3.873,375,3.419,387,3.622,492,3.727,495,3.595,597,2.81,687,3.366,989,2.499,1013,5.207,1133,4.846,1366,4.846,1481,5.432,1485,4.696,1486,5.703,1492,5.118,1607,4.326,1662,3.952,2401,5.014,3086,6.495,3087,6.041]],["t/536",[8,0.935,10,2.273,12,1.04,15,1.16,28,2.144,50,1.127,54,0.751,100,2.032,115,1.552,124,2.659,128,1.24,134,2.584,135,1.51,154,1.166,166,3.149,168,3.855,173,2.449,175,2.965,178,6.025,182,4.246,199,3.629,217,4.065,227,3.939,238,3.249,247,2.466,254,2.833,289,2.449,297,3.249,346,3.126,495,3.016,597,3.859,607,3.542,781,2.965,829,2.868,938,3.126,958,3.723,974,2.029,1122,4.557,1412,3.723,1488,5.068,1501,2.78,1502,2.78,1751,4.784,2063,5.068,2315,5.068,2401,6.621,2580,6.696,3088,5.068,3089,5.448,3090,5.448,3091,5.448,3092,5.448]],["t/538",[0,1.086,2,2.366,4,1.844,7,1.067,8,0.977,9,4.182,10,2.374,12,0.742,15,0.794,17,4.842,23,1.897,25,2.254,27,3.15,35,1.662,50,0.511,65,2.47,66,0.72,69,1.248,70,1.282,80,1.206,84,3.237,103,0.563,104,2.081,113,1.762,115,1.621,120,1.662,144,2.116,148,1.48,157,1.662,166,2.908,168,3.543,173,3.026,178,5.541,179,1.266,182,3.903,193,1.622,197,1.622,200,2.081,201,1.448,202,1.388,205,1.835,207,2.462,217,2.987,224,2.047,231,2.649,234,2.331,246,1.726,247,2.267,308,2.366,317,2.116,318,2.047,326,1.925,343,2.081,350,2.319,356,4.318,476,2.047,597,3.205,687,2.015,696,2.731,708,2.807,731,2.214,732,2.479,734,3.118,765,2.528,818,3.328,825,3.79,829,2.047,864,2.731,878,5.396,902,1.53,920,2.274,942,4.393,967,1.622,1049,2.657,1050,2.811,1061,3.414,1062,3.118,1063,3.996,1064,3.888,1065,3.888,1067,3.118,1068,4.393,1078,3.888,1079,3.888,1080,3.888,1081,3.002,1082,3.888,1083,3.888,1095,4.246,1115,3.617,1116,2.417,1122,3.252,1157,3.888,1158,3.888,1159,3.888,1160,3.414,1161,3.888,1162,3.888,1163,3.252,1164,3.617,1165,3.888,1166,3.888,1167,3.617,1169,2.417,1432,3.617,1926,3.617,2401,5.196,2742,3.617,2743,3.617,3093,4.3,3094,4.3,3095,4.3,3096,4.3,3097,4.3,3098,4.3,3099,4.3,3100,4.3,3101,4.3,3102,4.3]],["t/540",[0,1.184,6,1.818,7,1.164,13,3.994,26,2.915,31,2.789,50,0.815,57,2.753,66,0.99,69,1.358,70,1.274,80,2.428,84,2.984,93,3.319,94,2.191,95,2.441,113,1.862,116,2.146,118,4.577,120,2.651,128,1.412,135,1.719,144,3.375,162,3.152,166,2.191,168,3.519,169,4.033,178,3.941,193,2.588,197,3.265,220,4.132,350,3.699,378,2.619,603,3.071,755,3.56,772,4.132,825,4.132,878,4.973,902,2.441,972,3.046,976,2.335,997,4.973,1119,4.356,1120,5.446,1163,5.188,1628,4.628,2735,6.203,3103,6.86,3104,6.86,3105,6.203,3106,6.86]],["t/542",[0,1.184,4,2.942,7,1.468,8,1.344,22,2.753,26,2.915,30,3.855,50,0.815,64,6.547,66,1.085,69,0.982,70,1.009,80,1.924,82,3.027,94,2.191,103,0.393,113,1.475,128,1.412,135,1.719,145,4.789,163,3.56,168,2.789,173,3.519,188,4.259,200,4.189,202,2.793,203,3.495,210,4.973,218,6.203,254,2.441,259,3.434,302,4.789,334,4.132,349,2.984,364,4.033,380,3.855,407,4.628,413,4.789,416,4.789,429,4.485,440,4.789,504,3.266,535,5.188,619,5.188,679,3.775,828,2.146,1366,4.628,1781,5.77,2475,5.188,2563,5.446,2620,6.203,3037,5.446,3107,6.203,3108,6.86]],["t/544",[4,2.135,6,2.14,7,0.844,23,2.196,25,1.37,27,2.492,28,1.771,30,3.928,32,3.952,37,3.254,42,3.256,43,1.855,46,4.187,50,0.831,54,1.225,66,0.569,69,1.001,70,1.028,76,3.254,80,1.396,94,1.59,97,4.21,103,0.462,108,1.586,113,1.071,130,0.906,137,1.294,144,3.439,156,2.749,173,2.023,177,1.792,179,2.058,197,1.878,202,3.087,204,1.998,216,2.135,225,1.732,236,1.247,254,3.496,256,2.998,258,3.627,289,2.023,322,3.609,353,2.536,359,2.078,364,2.926,387,2.023,409,2.926,412,4.187,415,3.609,428,2.684,440,3.475,457,4.015,472,4.191,484,3.609,485,5.449,486,3.952,492,2.583,506,2.86,648,3.952,652,3.254,659,3.254,665,2.975,677,2.926,716,3.952,754,3.358,761,3.952,828,1.557,891,3.161,901,2.926,934,3.475,937,2.926,941,3.16,975,1.878,1063,3.161,1117,2.684,1193,2.297,1214,3.952,1365,4.187,1531,3.609,1607,2.998,1767,3.254,1819,3.254,2475,3.765,2718,3.952,2911,5.549,2943,3.952,3109,4.978,3110,4.501,3111,4.978,3112,6.32,3113,4.501,3114,7.303,3115,4.501,3116,4.501,3117,4.501,3118,4.501,3119,4.501,3120,4.501,3121,4.501,3122,4.501,3123,4.501,3124,4.501,3125,3.765,3126,4.187,3127,4.501,3128,4.501,3129,6.32,3130,4.501,3131,4.187,3132,4.501,3133,4.501,3134,4.501,3135,4.501]],["t/546",[28,2.566,32,5.725,42,3.04,43,2.688,54,0.899,76,4.714,94,2.303,177,2.596,179,2.124,197,2.72,202,2.882,216,3.093,236,1.807,254,2.566,256,4.343,472,4.634,485,6.025,492,3.742,648,5.725,652,4.714,659,4.714,665,3.29,901,4.239,934,5.034,975,2.72,1214,5.725,2911,5.725,3112,6.52,3113,6.52,3114,8.773,3115,6.52,3116,6.52,3117,6.52,3118,6.52,3119,6.52,3120,6.52,3121,6.52,3122,6.52,3123,6.52,3124,6.52,3125,5.454,3126,6.065,3127,6.52,3128,6.52]],["t/548",[42,3.398,54,1.158,97,5.597,137,2.001,179,2.266,202,3.222,225,2.678,254,2.739,258,3.993,289,3.128,322,5.579,353,3.921,359,3.212,387,3.128,485,5.192,486,6.11,506,4.421,761,6.11,1063,4.887,1117,4.149,2718,6.11,2911,6.11,3129,6.958,3130,6.958,3131,6.473,3132,6.958,3133,6.958,3134,6.958,3135,6.958]],["t/551",[8,0.867,12,1.306,15,1.21,25,2.645,39,1.765,54,1.07,66,0.865,67,3.651,69,1.083,70,1.113,99,1.109,103,0.526,113,1.201,124,2.464,129,1.582,130,1.016,138,3.733,152,1.325,154,1.464,165,1.301,197,2.107,202,1.802,231,3.607,234,2.571,236,1.896,248,2.206,253,2.787,254,3.669,323,4.296,409,3.283,426,3.011,457,3.208,509,2.953,863,3.364,941,2.185,967,2.107,1481,4.224,1491,4.252,1492,4.93,1493,5.61,1567,4.697,1676,5.05,3136,5.585,3137,5.585,3138,5.585,3139,5.585,3140,5.585,3141,4.697,3142,7.567,3143,5.585]],["t/553",[8,1.165,12,1.296,15,1.209,25,2.065,54,0.936,66,1.047,99,1.819,127,2.147,137,1.952,154,1.453,156,2.555,217,3.012,248,2.189,253,2.765,254,3.258,266,2.974,749,3.632,941,2.937,1491,4.218,1492,4.312,1493,4.908,1494,5.064,3144,6.787]],["t/555",[0,0.859,6,2.14,7,0.844,8,1.085,12,1.651,15,1.226,28,2.487,41,3.224,42,2.379,43,2.605,50,0.592,54,1.15,66,0.569,99,1.605,103,0.285,113,1.071,127,1.999,135,2.024,137,1.818,154,1.563,195,3.084,253,1.834,254,3.117,271,2.583,340,2.684,361,1.855,390,4.715,414,1.541,423,2.926,427,4.271,477,3.67,597,3.16,671,4.715,731,1.752,877,3.076,897,2.536,936,3.161,937,2.926,941,3.16,953,1.812,1484,3.161,1491,4.539,1494,3.358,1501,3.726,1502,3.726,2340,4.865,2536,4.438,2552,4.865,2557,4.187,2559,3.475,3145,4.978,3146,4.187,3147,3.952]],["t/557",[1,1.752,7,1.109,8,1.191,9,3.675,15,1.094,28,2.327,37,2.964,40,3.166,42,2.611,50,0.777,66,1.061,69,0.936,70,1.129,81,2.445,88,2.353,97,3.939,99,1.668,100,1.157,103,0.547,108,2.104,111,3.059,115,1.168,116,1.418,130,0.825,139,1.797,152,1.552,156,2.226,157,1.752,163,2.353,168,1.843,175,3.775,179,1.335,180,2.159,181,2.731,182,2.03,183,3.6,184,3.6,185,3.287,202,1.463,203,3.332,211,3.332,216,1.945,217,1.82,220,2.731,232,1.926,254,1.614,324,2.666,325,3.814,326,2.03,328,1.236,337,2.666,339,2.226,340,3.526,356,2.03,357,2.605,363,2.125,375,3.652,388,2.03,414,1.404,423,2.666,426,2.445,427,5.056,429,2.964,439,4.412,442,2.666,506,2.605,590,2.251,597,3.286,666,2.231,704,3.059,726,3.429,733,1.404,742,3.539,788,2.964,816,3.6,877,2.802,897,3.332,941,3.286,958,2.802,989,1.578,1050,2.964,1108,2.548,1152,3.287,1169,2.548,1411,3.6,1439,3.059,1440,3.059,1480,5.501,1482,5.175,1483,6.091,1484,5.89,1485,4.276,1486,3.6,1487,5.501,1527,3.287,1606,2.802,1619,2.731,1662,2.495,2319,3.6,2320,3.6,2536,2.879,2738,4.1,2739,4.1,2742,3.814,2743,3.814,3087,7.488,3088,3.814,3125,3.429,3147,3.6,3148,4.534,3149,4.534,3150,4.534,3151,4.534,3152,4.1,3153,4.534,3154,4.534]],["t/559",[6,2.014,7,1.289,46,6.392,54,0.947,66,0.869,99,1.51,103,0.435,127,2.173,135,1.905,156,3.38,204,3.05,217,3.701,246,3.05,254,3.282,266,3.011,324,4.468,341,4.271,353,4.699,375,3.618,495,4.617,498,5.306,539,4.271,562,2.532,956,4.468,989,2.644,993,2.937,1482,5.127,1811,5.748,2720,6.392,3155,7.6,3156,7.6,3157,7.6]],["t/561",[6,0.514,7,1.275,8,1.339,12,0.335,15,1.174,20,1.272,21,0.783,22,0.779,23,0.856,25,0.534,26,0.654,27,2.19,35,1.287,37,1.269,39,0.613,41,4.321,42,3.489,43,3.455,45,1.309,50,0.231,54,1.112,62,1.309,66,0.966,68,1.79,69,0.976,70,1.003,94,1.397,99,1.744,100,0.495,103,0.575,113,0.716,116,0.607,117,1.169,124,1.47,135,1.096,137,0.505,138,1.903,139,1.32,141,2.614,144,0.955,150,0.81,152,1.386,154,0.847,156,2.449,157,0.75,160,2.115,162,1.593,163,4.474,164,0.972,165,1.209,174,1.169,195,0.856,197,2.571,209,0.668,211,2.229,216,1.429,222,1.199,232,0.572,246,0.779,247,0.505,251,1.309,254,2.862,255,1.913,257,1.232,259,1.667,264,1.309,266,1.733,271,1.007,276,1.169,279,1.833,289,0.789,291,1.674,323,0.972,326,1.491,331,0.647,337,1.141,338,1.199,339,2.449,340,3.436,341,1.091,353,2.643,360,2.17,364,2.572,366,1.449,375,4.944,380,1.872,387,1.354,409,1.141,410,1.429,414,0.601,453,1.115,472,1.007,474,1.561,477,0.882,484,2.415,492,1.728,495,0.972,498,1.355,504,2.47,556,1.232,565,1.407,590,2.193,614,1.141,647,2.153,653,1.232,654,1.632,665,1.227,682,1.407,687,0.909,704,1.309,717,1.407,726,3.924,742,3.597,754,1.309,756,0.799,897,2.975,937,4.419,941,3.539,1015,1.468,1022,1.632,1063,1.232,1130,1.199,1160,1.541,1211,1.115,1245,1.007,1346,1.755,1349,3.622,1350,1.309,1361,1.199,1365,1.632,1366,1.309,1463,1.541,1478,2.801,1484,5.475,1485,4.457,1500,4.076,1527,1.407,1607,1.169,1610,1.755,1619,2.635,1661,1.199,1662,4.544,1666,4.233,1702,1.755,1735,1.541,1767,1.269,1785,1.407,1806,1.309,1934,1.468,2211,1.468,2319,3.473,2320,2.644,2436,1.468,2548,1.755,2565,1.632,2678,1.755,2718,3.473,2721,4.911,2722,6.05,2723,5.734,2724,5.734,2725,4.363,2726,4.363,2727,4.363,2895,1.541,3146,1.632,3147,2.644,3158,1.941,3159,1.941,3160,3.331,3161,1.941,3162,1.941,3163,1.941,3164,1.941,3165,1.941,3166,1.941,3167,1.941,3168,4.375,3169,1.941,3170,3.331,3171,1.941,3172,1.941,3173,1.941,3174,1.941,3175,1.941,3176,4.375,3177,6.817,3178,1.941,3179,1.941,3180,1.941,3181,1.941,3182,1.941,3183,1.941,3184,1.941,3185,1.941]],["t/564",[15,1.136,28,2.762,37,6.956,45,5.236,66,0.887,99,1.542,113,2.009,156,3.411,197,2.927,254,2.762,375,3.695,647,3.819,891,4.928,1351,6.527,2630,6.162,2647,7.017,3186,7.761,3187,6.527,3188,7.761,3189,10.021]],["t/566",[4,2.041,6,1.261,12,0.821,15,1.076,21,1.119,28,2.409,38,2.866,43,3.514,54,0.593,66,0.544,89,3.21,94,1.519,97,2.866,99,0.945,103,0.539,105,3.58,112,3.599,113,1.023,118,3.58,127,1.361,130,0.866,137,1.76,140,2.808,150,1.986,154,1.31,156,3.209,204,2.717,205,1.974,254,1.693,255,2.733,258,2.469,326,2.13,328,1.845,363,4.022,414,1.473,416,3.322,482,4.183,564,3.21,614,2.797,716,3.778,749,4.154,768,4.002,828,1.488,897,5.568,989,1.656,1036,3.449,1136,3.449,1169,2.674,1215,3.322,1245,2.469,1336,5.612,1339,3.449,1349,6.332,1496,3.804,1497,4.726,1499,3.449,1586,3.021,1767,3.111,1788,3.599,1806,3.21,1819,4.426,2020,4.726,2036,5.375,2208,3.778,2222,6.121,2310,3.778,2420,7.762,2547,3.778,3126,4.002,3141,4.002,3144,6.121,3187,4.002,3190,8.202,3191,4.758,3192,6.77,3193,4.758,3194,4.758,3195,8.585,3196,4.758,3197,4.758,3198,4.758,3199,4.758,3200,4.758,3201,4.758,3202,4.302,3203,4.758,3204,4.758,3205,4.758,3206,4.758,3207,4.758,3208,4.302,3209,4.758,3210,4.758,3211,4.758,3212,4.758,3213,4.758]],["t/568",[7,1.279,8,0.565,12,1.402,15,1.08,28,1.978,37,6.549,39,2.13,40,5.265,41,3.11,42,2.914,43,3.637,45,2.457,65,3.872,66,0.636,68,1.116,76,2.381,79,1.253,80,1.559,83,1.707,94,1.775,99,0.724,100,1.925,103,0.538,111,2.457,113,0.783,116,1.139,124,2.452,127,2.157,141,1.631,142,2.755,152,1.599,156,3.41,202,2.175,204,2.23,205,1.621,245,2.047,247,0.947,254,2.399,256,3.348,266,1.443,284,3.348,289,1.481,323,1.823,331,1.213,334,2.194,339,2.294,340,3.634,344,2.313,349,1.584,353,1.856,359,1.52,366,1.584,414,1.128,457,2.092,474,1.707,506,4.666,519,1.964,567,3.788,597,2.175,607,3.267,650,4.204,676,3.267,704,2.457,717,2.64,739,1.856,749,2.69,756,1.5,828,1.739,877,3.435,897,5.205,941,1.425,1027,2.892,1169,4.238,1205,2.004,1245,1.89,1336,5.597,1349,4.705,1409,3.293,1483,7.069,1489,5.026,1494,3.75,1495,2.64,1496,3.123,1534,3.063,1691,3.293,1701,6.094,1726,3.293,1730,3.293,1740,4.204,1744,2.457,1811,2.755,1819,3.634,1827,3.063,1847,3.293,1854,3.063,1934,2.755,2630,2.892,2816,3.063,2906,3.293,3125,2.755,3146,3.063,3190,6.82,3202,5.026,3214,3.642,3215,3.642,3216,6.74,3217,3.642,3218,8.122,3219,3.642,3220,3.642,3221,6.74,3222,3.642,3223,3.642,3224,5.558,3225,3.642,3226,3.642,3227,3.642,3228,3.642,3229,3.642,3230,3.642,3231,5.558,3232,6.094,3233,5.026,3234,6.74,3235,6.094,3236,3.293,3237,3.642,3238,3.642]],["t/571",[25,2.322,30,4.743,103,0.483,173,3.431,253,3.109,407,6.622,409,4.962,413,5.892,428,4.551,679,4.644,892,6.701,941,3.302,1366,5.694]],["t/573",[6,1.521,12,0.991,15,1.143,26,1.933,37,3.754,41,2.649,42,3.401,43,3.468,50,0.683,54,0.961,55,3.036,59,3.548,66,0.657,83,2.691,101,2.429,103,0.532,124,2.534,135,1.439,156,2.963,157,2.219,179,1.691,202,1.853,211,2.926,254,2.043,256,4.644,353,2.926,375,3.67,380,3.227,457,3.299,590,1.976,607,3.376,639,3.754,653,4.896,665,2.84,742,3.557,749,4.502,756,2.365,761,4.559,828,1.796,891,3.646,897,4.74,941,2.247,1477,4.009,1484,3.646,1485,3.754,1494,5.201,1495,5.589,1496,5.228,1497,6.495,1498,5.831,1499,5.589,1500,4.009,1661,3.548,1662,4.242,1740,5.831,1761,4.343,1767,3.754,1780,4.83,1819,6.082,2211,4.343,2475,4.343,3110,5.192,3208,6.971,3239,5.742,3240,4.83]],["t/575",[0,0.789,7,1.72,8,0.709,10,3.508,11,1.857,15,0.953,20,1.744,39,2.663,41,4.119,42,3.338,43,1.703,50,1.061,54,1.222,67,2.987,68,2.361,101,1.933,103,0.511,112,3.455,124,2.016,152,1.084,156,3.165,157,1.766,163,4.972,164,2.287,174,2.751,175,2.248,197,2.48,201,1.538,202,2.719,213,1.474,216,1.959,232,1.936,254,2.741,258,2.37,289,1.857,340,5.014,353,2.328,360,1.319,366,1.987,375,4.012,387,1.857,426,2.463,472,2.37,478,2.987,493,2.901,504,2.175,519,2.463,532,3.627,539,2.567,567,3.695,580,3.189,593,3.842,597,1.787,647,3.79,666,2.248,675,3.618,877,2.823,937,3.865,938,2.37,949,1.626,956,2.686,964,1.744,1021,3.627,1030,2.37,1108,2.567,1117,3.545,1211,2.624,1349,3.189,1350,5.197,1485,2.987,1527,3.312,1531,3.312,1586,2.901,1604,3.627,1607,2.751,1661,2.823,1666,3.312,1752,3.842,1779,4.131,1819,2.987,1980,3.842,2187,3.842,2319,5.22,2320,5.22,2436,3.455,2455,3.842,2721,5.53,2722,5.53,2723,5.53,2724,5.53,2725,5.53,2726,5.53,2727,5.53,2854,4.131,3125,3.455,3141,3.842,3241,4.568,3242,4.568,3243,4.568,3244,4.568,3245,4.131,3246,4.568,3247,4.568,3248,4.568,3249,4.568,3250,4.131]],["t/577",[6,1.926,37,4.752,54,1.214,103,0.416,140,2.779,154,1.406,156,3.556,157,2.809,158,5.074,213,2.345,254,2.587,256,5.405,328,1.981,334,4.378,565,5.269,756,2.993,828,2.274,891,4.615,897,4.573,1220,5.771,1328,6.113,1336,6.648,1483,7.125,1490,6.572,1531,5.269,1534,7.548,1819,5.867,1976,5.074,2029,6.572,2208,5.771,2481,6.572,2630,5.771,3251,7.268,3252,7.268]],["t/579",[0,1.463,8,1.03,11,2.698,12,1.463,15,1.194,17,3.265,18,4.101,41,3.062,42,2.259,43,2.474,54,1.227,83,3.972,101,2.808,103,0.485,135,1.663,137,1.726,154,1.284,156,2.885,204,2.663,254,3.324,271,5.106,363,3.11,380,3.729,415,4.811,423,3.901,427,4.482,477,3.016,570,4.633,665,2.445,937,3.901,989,2.309,1211,3.812,1286,5.269,1477,4.633,1478,5.582,1491,3.729,1501,3.062,1502,3.062,2340,3.997,2552,3.997,2558,5.269,2559,5.918,3253,6.637]],["t/581",[6,1.703,7,1.408,8,0.998,12,1.434,15,1.19,20,2.454,25,1.768,26,2.164,28,2.287,54,0.801,57,4.04,60,4.666,69,0.92,70,0.946,87,3.612,97,3.871,100,2.348,103,0.368,124,2.836,128,1.323,130,1.17,135,1.611,146,3.555,154,1.244,156,2.826,166,2.052,209,2.858,254,3.274,328,1.752,353,3.275,429,5.429,480,4.081,494,5.103,589,4.202,590,2.212,647,3.162,666,3.162,885,2.096,941,3.599,1491,3.612,1501,2.965,1502,2.965,1612,5.406,1791,5.602,2211,4.861,2340,3.871,2552,3.871,3250,5.811]],["t/584",[8,1.094,12,1.657,15,1.225,25,1.938,54,1.097,128,1.45,129,1.995,130,1.602,135,1.765,154,1.703,248,2.054,253,2.595,254,3.132,666,3.466,1491,4.946,1492,4.047,1493,4.606,1501,3.25,1502,3.25,2340,4.243,2552,4.243]],["t/586",[8,0.991,12,1.583,15,1.22,25,1.756,42,2.172,43,2.379,54,1.03,99,1.642,103,0.365,108,1.448,114,3.512,128,1.313,129,1.807,130,1.828,135,1.599,154,1.6,211,3.252,248,1.861,253,2.351,254,2.942,366,2.776,666,3.14,733,1.976,742,2.944,749,3.088,1482,4.306,1484,4.053,1485,4.173,1491,4.645,1492,3.666,1493,4.173,1494,4.306,1495,4.627,1496,3.586,1497,4.456,1498,4.827,1499,4.627,1500,4.456,1501,2.944,1502,2.944,2340,3.844,2552,3.844]],["t/588",[0,1.03,7,1.603,8,0.926,12,1.532,15,1.217,17,2.936,18,3.687,25,1.642,41,2.753,42,2.031,43,2.224,54,1.106,83,2.796,99,1.571,103,0.341,128,1.228,129,1.69,130,1.439,135,1.495,137,1.552,154,1.53,156,2.692,175,2.936,195,2.633,204,3.174,226,4.513,248,1.74,253,2.198,254,3.157,271,4.902,415,4.326,423,3.508,428,3.217,482,3.687,681,4.445,781,2.936,937,3.508,1286,4.737,1337,4.737,1479,5.395,1482,4.025,1491,4.445,1492,3.428,1493,3.901,1501,2.753,1502,2.753,1539,4.165,2558,4.737,2559,5.522,3254,5.967,3255,5.395]],["t/590",[8,0.9,12,1.51,15,1.217,25,1.595,42,2.641,43,2.161,54,0.967,66,0.663,81,3.125,99,1.737,103,0.332,128,1.193,129,1.642,130,1.412,135,1.453,154,1.692,156,2.641,162,3.184,175,2.852,216,2.486,226,4.384,248,1.69,253,2.135,254,3.566,255,3.33,375,2.76,556,3.681,742,4.622,749,2.805,941,3.036,960,4.384,1028,3.582,1130,3.582,1337,4.602,1482,3.911,1484,3.681,1491,4.36,1492,3.33,1493,3.79,1494,3.911,1495,4.202,1496,3.257,1497,4.047,1498,4.384,1499,4.202,1500,4.047,1501,2.674,1502,2.674,1662,3.189,2505,4.602,2564,5.241,2565,6.526,3256,5.241]],["t/592",[7,0.842,8,0.771,10,2.631,12,1.591,15,1.22,25,1.366,28,1.767,40,3.466,42,1.69,45,3.349,50,0.829,54,1.091,66,0.798,99,1.386,102,2.625,103,0.527,134,2.129,135,1.748,154,1.561,156,2.375,195,2.19,202,1.602,204,2.799,211,3.554,219,1.919,227,3.246,232,2.054,248,1.448,253,1.829,254,2.87,289,2.836,339,2.375,344,3.152,375,4.55,390,3.349,474,2.326,506,4.007,533,2.072,671,3.349,742,2.29,828,1.553,937,2.918,941,2.73,953,1.808,960,3.755,1049,3.068,1067,3.599,1117,2.677,1353,4.489,1453,3.941,1482,4.706,1484,4.43,1485,5.273,1491,4.532,1492,2.852,1493,3.246,1500,3.466,1501,3.218,1502,3.218,1575,3.941,1976,3.466,2296,4.489,3147,3.941,3152,4.489,3232,4.489,3233,4.489,3235,7.293,3236,4.489,3245,4.489,3255,4.489,3257,4.964,3258,4.964]],["t/594",[0,1.158,7,0.797,8,0.729,12,1.473,14,4.199,15,1.224,21,1.577,25,1.846,29,3.405,42,2.283,43,2.916,50,0.558,54,1.125,66,0.537,98,2.201,99,1.695,103,0.384,108,1.522,128,1.38,129,2.216,130,1.424,135,1.681,154,1.747,168,1.909,180,2.236,182,2.103,197,1.772,232,1.383,248,1.956,253,2.471,254,3.34,326,2.103,340,2.533,350,2.533,364,2.761,597,1.838,742,3.095,749,3.246,897,2.393,903,4.683,918,3.951,934,3.279,937,2.761,941,1.838,1480,3.951,1482,4.525,1484,4.259,1491,3.769,1492,3.853,1493,4.385,1494,4.525,1495,4.863,1496,3.769,1497,4.683,1498,5.073,1499,4.863,1500,4.683,1501,3.095,1502,3.61,2536,2.983,3256,6.065,3259,4.697,3260,4.697,3261,4.697,3262,4.697]],["t/596",[0,1.538,6,2.154,7,1.748,9,3.128,10,3.066,11,3.069,13,3.113,14,1.796,16,3.639,17,2.739,18,3.44,19,3.755,25,1.532,26,1.229,27,1.827,35,2.151,50,1.092,53,1.827,54,1.013,55,1.93,57,1.464,61,1.827,65,2.096,66,0.637,68,1.119,69,0.966,70,1.111,75,2.897,79,1.256,83,1.71,86,2.317,93,1.766,94,1.778,95,2.402,101,3.194,103,0.49,108,0.828,118,1.93,120,2.608,123,4.17,124,1.61,150,1.523,151,1.216,152,0.866,156,1.242,167,2.051,168,2.743,170,2.255,173,2.263,175,1.796,179,1.075,180,2.65,188,1.796,193,2.1,194,2.255,199,2.198,202,1.178,209,1.256,211,1.859,212,3.272,231,1.299,236,0.915,254,1.981,255,2.096,256,2.198,258,1.894,259,1.827,289,1.483,302,2.548,304,3.069,312,3.069,331,1.854,334,3.353,338,2.255,341,2.051,368,3.284,375,1.737,387,2.263,415,2.646,454,1.737,472,2.888,492,3.502,599,2.008,603,1.634,604,1.634,605,2.255,622,2.646,635,3.3,638,2.855,650,2.76,665,3.282,666,1.796,701,2.317,705,2.198,716,2.897,721,1.284,731,1.959,738,1.796,739,1.859,740,2.051,745,2.548,747,1.894,756,2.293,770,1.36,772,2.198,818,1.93,828,1.741,848,3.069,895,2.646,897,1.859,938,1.894,940,2.76,956,2.145,971,1.27,1011,2.76,1031,2.386,1045,2.646,1050,2.386,1188,3.535,1189,2.051,1193,1.684,1205,3.063,1211,2.096,1230,5.093,1241,2.897,1242,2.548,1266,6.827,1271,3.069,1294,2.897,1295,2.897,1300,2.897,1301,2.548,1303,2.646,1304,2.548,1305,2.548,1306,2.646,1307,2.897,1308,2.76,1309,2.76,1310,2.76,1311,2.646,1312,2.76,1313,2.76,1314,2.76,1315,2.646,1316,2.548,1317,3.3,1318,2.897,1319,2.897,1411,2.897,1412,2.255,1496,2.051,1508,2.198,1538,4.42,1543,3.3,1596,3.3,1607,3.353,1654,2.76,1686,3.3,1766,2.897,1769,3.3,1903,2.145,2085,3.3,2130,3.069,2171,2.548,2250,5.033,2251,2.76,2541,3.3,2544,3.3,2943,2.897,3040,3.069,3051,3.069,3053,3.069,3263,3.649,3264,3.649,3265,3.649,3266,3.649,3267,3.649,3268,3.649,3269,3.649,3270,3.649,3271,3.649,3272,3.649,3273,3.649,3274,3.649,3275,3.649,3276,3.649,3277,3.649]],["t/598",[0,1.638,4,3.416,6,2.11,7,1.351,21,2.231,50,1.247,66,1.159,80,2.234,94,2.543,95,2.834,113,1.713,152,2.251,202,3.061,493,5.057,731,2.802,1242,5.559,1825,7.2,3278,7.963]],["t/600",[0,1.561,4,3.155,6,1.949,7,1.534,8,1.142,12,1.561,35,2.843,50,1.268,53,4.526,54,1.127,66,1.034,135,1.843,139,2.914,174,4.43,175,3.619,179,2.166,197,2.775,209,2.531,289,2.99,363,3.447,378,2.808,604,3.293,665,3.761,705,4.43,719,5.84,738,3.619,938,3.817,1117,3.966,1294,5.84,1340,5.84,1412,4.545,3279,6.651]],["t/602",[0,1.765,1,3.146,2,4.479,3,7.36,4,3.491,6,2.157,7,1.381,8,1.264,10,3.07,11,3.309,12,1.405,17,4.005,54,1.015,66,0.931,209,2.801,378,3.108,665,2.999,738,4.005,1117,4.389,3279,7.36]],["t/604",[26,2.979,193,3.337,971,3.079,2943,7.024]],["t/606",[26,2.993,188,4.374,1101,5.107]],["t/608",[26,2.993,66,1.017,1101,5.107]],["t/610",[1,2.937,10,2.867,57,3.05,63,5.251,66,1.055,118,5.251,128,1.564,135,1.905,195,3.353,209,2.615,216,3.26,219,2.937,234,2.033,266,3.011,289,3.089,326,3.402,380,4.271,382,6.392,474,3.561,591,4.826,599,4.182,708,2.867,910,4.271,1010,6.034,1016,5.306,1116,4.271,1119,5.857,1508,4.577,1760,5.127,3105,6.872,3280,7.6,3281,7.6]],["t/612",[20,3.298,22,3.467,66,0.988,125,6.031,145,6.031,146,3.845,166,2.759,465,3.758]],["t/614",[55,4.656,220,5.303,728,4.656,971,3.064,2978,7.961]],["t/616",[3282,8.978]],["t/619",[0,1.561,13,3.394,17,3.619,21,2.126,50,0.874,54,0.917,66,0.841,74,5.135,86,4.671,103,0.517,107,2.648,119,3.889,130,1.339,154,1.423,165,1.714,203,5.202,209,2.531,220,4.43,232,3.087,410,3.155,426,3.966,453,4.226,472,4.691,482,5.587,539,4.134,562,2.45,567,4.134,572,6.187,949,3.217,3283,5.563,3284,6.651,3285,7.356,3286,6.651]],["t/621",[12,1.632,15,1.173,17,4.437,28,2.979,50,1.124,54,1.124,59,4.526,66,0.957,69,1.049,70,1.078,82,2.35,84,2.316,99,1.058,103,0.419,108,1.208,116,1.666,128,1.096,129,1.508,130,1.524,134,3.142,141,2.384,147,1.895,148,1.833,154,1.03,165,1.241,179,1.568,182,2.384,202,2.363,203,4.817,205,1.553,228,4.815,232,3.113,234,1.959,247,1.385,248,1.553,306,2.763,310,1.683,317,3.604,331,1.774,356,2.384,443,3.481,482,3.291,597,3.699,607,4.306,733,1.649,1068,5.113,1090,5.113,1091,5.113,1092,5.113,1093,5.113,1094,5.113,1095,4.941,1361,4.526,1785,3.86,1879,4.228,1948,4.479,2543,4.479,3283,4.027,3286,6.623,3287,5.325,3288,4.815,3289,4.815,3290,5.325,3291,4.815,3292,5.325,3293,5.325,3294,5.325]],["t/623",[0,1.746,2,3.045,7,1.769,12,1.475,20,2.113,21,2.324,26,1.863,30,5.682,31,2.25,39,1.749,54,0.69,57,2.221,74,3.863,82,3.318,83,2.593,84,2.407,86,3.514,92,4.394,100,2.446,103,0.43,108,1.255,114,3.045,121,3.42,127,1.583,128,1.139,130,1.368,137,1.439,141,2.478,144,2.723,149,5.687,160,3.514,162,2.015,166,1.767,193,3.222,196,4.185,205,1.614,216,2.374,217,2.221,246,2.221,378,2.113,410,2.374,472,3.902,475,4.916,477,2.515,479,6.465,482,3.42,484,4.012,530,4.185,556,4.775,572,4.655,622,4.012,673,4.185,677,5.387,766,3.11,901,3.253,972,1.947,974,1.863,1211,3.179,1278,4.185,1336,3.618,1361,3.42,1661,4.647,1760,3.734,1868,5.25,2505,4.394,2561,5.004,2562,5.004,2682,5.004,2752,4.394,3283,6.46,3284,5.004,3295,7.52,3296,5.534,3297,5.004,3298,5.534,3299,5.534]],["t/625",[7,1.218,15,1.111,30,5.91,66,0.943,99,1.028,103,0.568,108,2.021,116,2.58,127,1.48,128,1.478,129,2.523,130,1.894,135,1.297,138,2.251,144,2.546,165,1.206,193,1.952,195,2.283,196,3.914,197,1.952,204,2.077,215,4.108,217,2.077,219,3.187,236,1.297,248,1.509,264,3.491,326,2.317,343,2.504,356,2.317,360,2.074,362,5.096,419,5.464,427,2.736,428,4.803,440,7.267,447,3.613,464,8.054,465,4.07,472,2.685,485,3.491,597,2.81,681,2.908,731,2.527,739,2.636,1245,5.401,1854,6.04,1868,3.613,3283,3.914,3300,8.461,3301,5.175,3302,5.175,3303,5.175,3304,5.175,3305,5.175,3306,7.181,3307,5.175,3308,5.175]],["t/627",[15,1.05,108,2.233,215,6.732,356,3.796,1152,6.147,1193,3.912,2048,7.667,2091,7.667,3131,7.132,3309,8.479,3310,8.479]],["t/629",[7,1.497,8,1.098,12,1.66,13,3.263,15,1.128,17,3.48,20,2.7,21,1.663,30,4.958,66,1.009,69,1.013,70,1.04,84,3.076,103,0.405,108,2.002,123,4.37,130,1.606,149,6.673,157,2.733,162,2.575,179,2.083,182,3.166,410,3.033,414,2.19,443,4.623,457,4.062,475,4.623,479,4.771,657,6.394,766,3.974,974,2.381,1879,5.615,1948,5.948,3283,5.348,3288,6.394,3289,6.394,3291,6.394,3297,6.394,3311,6.394,3312,7.072,3313,7.072,3314,7.072,3315,7.072]],["t/631",[20,2.552,28,3.031,54,0.833,55,4.955,63,3.535,86,4.245,98,3.132,116,2.091,124,2.95,135,1.675,150,2.79,154,1.294,165,2.184,197,2.522,202,2.157,246,3.761,326,2.993,328,1.822,475,7.13,476,4.851,477,4.258,479,4.51,607,3.93,681,3.757,687,3.132,696,5.408,733,2.637,754,4.51,757,5.567,845,3.678,897,4.775,901,3.93,1586,4.245,1976,4.667,2659,6.044,3037,5.307,3040,5.623,3316,6.685,3317,6.685,3318,6.685,3319,6.685,3320,6.685,3321,6.685,3322,6.685]],["t/633",[20,3.067,21,1.889,39,2.539,50,1.133,103,0.546,166,2.565,179,2.366,209,2.764,219,3.104,329,5.824,406,4.247,495,4.773,504,3.824,520,7.263,728,4.247,731,2.827,971,2.795,1101,5.477,2563,6.378,2641,7.263,3107,7.263]],["t/635",[4,3.437,6,2.123,7,1.032,21,2.107,25,2.62,36,3.979,39,1.923,50,0.952,53,5.261,54,0.759,93,2.945,94,2.861,99,1.209,103,0.348,120,2.352,139,2.411,157,2.352,162,2.216,165,1.418,170,3.76,179,2.36,224,2.897,236,1.525,291,3.192,302,4.248,306,2.295,363,2.851,378,2.323,388,2.724,409,3.577,422,2.897,492,3.158,493,5.088,600,3.76,603,3.587,604,2.724,621,3.979,638,4.028,645,5.118,647,3.943,648,4.832,655,5.502,708,3.023,728,3.218,731,2.141,745,4.248,981,2.141,1005,3.979,1016,4.248,1330,4.412,1508,3.665,1557,4.248,1571,3.577,1903,3.577,2331,4.832,2669,5.502,2731,5.502,2816,5.118,3323,6.086,3324,6.086,3325,6.086,3326,6.086,3327,6.086,3328,6.086,3329,6.086,3330,6.086,3331,5.502,3332,5.502,3333,6.086]],["t/638",[6,1.139,8,0.977,13,2.903,15,1.211,21,1.011,50,0.974,53,4.363,54,1.021,93,2.081,94,2.01,98,2.015,103,0.426,113,0.925,127,1.23,128,0.885,130,1.586,139,2.493,152,1.02,154,1.687,157,1.662,163,2.231,165,1.734,166,2.616,189,5.973,200,2.081,236,1.865,248,1.254,253,1.584,289,2.558,291,2.643,306,2.807,360,1.817,384,3.414,388,1.925,406,3.935,419,3.463,426,4.013,504,2.996,597,2.462,599,2.366,603,2.817,687,2.015,727,2.59,728,2.274,731,2.882,883,2.811,941,2.462,946,3.414,966,2.649,974,2.758,1005,2.811,1030,2.231,1169,2.417,1630,2.59,1903,5.53,2035,2.901,2643,3.414,2648,5.69,2652,3.888,2685,3.118,2948,3.888,3332,3.888,3334,4.3,3335,6.293,3336,4.3,3337,6.293,3338,4.3,3339,6.293,3340,5.196,3341,4.3,3342,4.3,3343,4.3,3344,4.3,3345,4.3,3346,6.889,3347,7.443,3348,6.26,3349,4.3,3350,4.3,3351,4.3,3352,4.3,3353,4.3,3354,4.3,3355,4.3,3356,4.3,3357,4.3,3358,4.3,3359,6.73,3360,3.002,3361,4.3]],["t/640",[12,1.054,15,1.184,21,1.436,25,1.68,39,2.538,50,1.067,53,3.056,95,2.173,99,1.213,102,3.228,103,0.349,120,2.36,130,1.802,137,2.088,154,1.554,165,1.871,166,1.95,173,2.482,189,3.877,195,2.694,212,3.589,236,1.53,271,3.168,291,1.97,337,3.589,359,2.548,378,2.331,381,5.521,409,3.589,419,4.419,474,2.861,621,3.992,652,5.25,731,2.148,974,3.022,1009,4.426,1030,3.168,1211,3.507,2035,4.119,2642,5.867,2674,4.848,2687,5.135,3340,4.263,3346,7.548,3362,5.606,3363,6.106,3364,6.106,3365,6.506,3366,6.106,3367,8.031,3368,4.848,3369,6.106,3370,6.106,3371,8.031,3372,6.106,3373,6.106,3374,6.106,3375,6.106,3376,6.106]],["t/642",[12,0.859,15,1.22,21,1.171,39,1.573,50,0.96,54,0.621,99,1.74,104,2.409,108,1.586,130,1.594,134,2.135,135,1.247,154,1.695,165,1.16,166,1.59,189,3.161,193,1.878,209,1.713,266,2.769,273,4.501,306,1.878,357,5.3,384,3.952,549,3.952,590,1.713,597,2.735,652,3.254,687,2.332,731,2.459,757,6.254,781,2.449,974,1.676,979,2.668,981,1.752,1189,2.797,1314,5.286,1496,2.797,1630,4.21,2035,3.358,2642,3.254,2658,5.286,2895,3.952,3311,4.501,3346,4.187,3348,7.76,3359,7.303,3360,4.879,3362,6.441,3377,4.978,3378,4.978,3379,6.989,3380,4.978,3381,4.978,3382,4.978,3383,4.978,3384,6.989,3385,4.978,3386,6.989,3387,4.978,3388,4.978,3389,4.978,3390,4.978,3391,4.978,3392,4.978,3393,4.978,3394,6.989,3395,4.501,3396,3.952,3397,4.978,3398,4.978,3399,4.978]],["t/644",[0,1.02,13,2.726,15,1.206,25,2.162,36,3.863,42,2.011,43,2.202,50,0.702,54,1.101,94,2.82,98,2.769,99,1.174,103,0.45,135,1.481,166,1.887,189,3.752,279,4.324,291,2.536,509,4.155,546,4.125,581,4.97,647,4.344,974,2.973,976,2.011,1049,3.651,1193,2.726,1342,4.284,1630,3.559,1903,4.62,2559,4.125,2642,3.863,2685,6.401,2687,4.97,3187,4.97,3340,4.125,3348,6.61,3360,4.125,3362,4.125,3365,4.284,3368,4.691,3400,7.106,3401,7.859,3402,4.469,3403,7.859,3404,7.859,3405,5.343,3406,7.859,3407,5.909,3408,5.909,3409,7.859,3410,7.859,3411,7.859,3412,7.859,3413,5.909,3414,5.909,3415,5.909]],["t/646",[15,1.222,22,2.659,25,0.975,53,2.724,54,0.678,99,1.477,127,1.013,137,1.933,138,2.367,151,1.18,153,4.332,162,1.29,165,0.826,189,4.208,219,1.369,234,2.265,236,1.364,271,1.839,291,1.756,306,3.194,308,2.995,310,2.094,360,2.445,365,5.912,366,1.541,384,7.564,387,2.694,406,3.931,419,2.995,422,3.155,465,2.367,474,1.66,476,3.155,546,2.474,597,1.387,628,2.98,645,2.98,647,4.478,662,2.474,675,2.995,676,2.083,731,2.823,883,3.558,911,2.813,941,2.909,974,2.701,981,1.247,1019,2.25,1169,1.991,1361,2.19,1630,3.278,2642,4.332,2655,5.992,2658,5.012,2660,3.204,2670,3.204,2680,3.204,2683,5.261,2870,4.321,2895,5.903,2982,4.321,3331,3.204,3340,4.626,3360,5.601,3362,5.19,3365,4.804,3396,4.321,3400,3.204,3402,5.012,3416,3.544,3417,3.544,3418,3.544,3419,3.544,3420,3.544,3421,3.544,3422,6.627,3423,5.443,3424,5.443,3425,3.544,3426,5.443,3427,3.544,3428,3.544,3429,3.544,3430,3.544,3431,3.544,3432,3.544,3433,7.123,3434,3.544,3435,3.544,3436,3.544,3437,5.443,3438,5.443,3439,4.578,3440,3.544,3441,3.544,3442,3.204,3443,2.98,3444,2.98,3445,2.98]],["t/648",[0,0.955,4,2.373,5,2.299,6,2.651,7,1.374,10,1.366,11,1.472,13,1.67,15,1.191,20,1.382,21,1.579,22,2.22,26,1.219,31,1.472,35,2.138,36,2.367,38,2.181,39,1.144,50,1.056,51,1.621,53,4.878,54,0.937,69,0.518,70,0.533,78,2.299,81,1.952,93,3.249,94,2.926,95,1.969,98,1.696,99,0.719,102,1.914,103,0.384,104,2.677,117,2.181,119,1.914,123,2.237,139,1.435,141,1.621,179,2.214,189,2.299,202,1.168,209,1.904,212,2.128,253,1.334,256,2.181,279,1.992,291,1.168,306,1.366,308,1.992,331,1.206,359,1.511,365,2.528,387,1.472,406,3.976,422,2.634,434,4.868,470,2.128,477,3.051,488,3.274,505,3.045,546,2.528,580,2.528,599,1.992,618,3.274,621,2.367,647,4.372,665,2.77,670,2.181,674,3.733,676,2.128,677,2.128,713,4.42,731,1.274,751,4.654,822,3.863,912,2.875,974,1.863,1005,6.371,1012,3.045,1049,3.419,1169,2.035,1193,1.67,1205,1.992,1221,2.625,1232,2.443,1302,2.77,1329,3.274,1330,4.868,1586,2.299,1767,3.617,2219,2.625,2244,3.274,2331,2.875,2479,3.274,2642,2.367,2643,2.875,2658,2.738,2683,2.875,2685,4.011,2752,2.875,2870,2.875,2982,2.875,3240,3.045,3340,2.528,3360,5.655,3362,4.688,3365,5.451,3368,2.875,3396,2.875,3402,2.738,3433,4.654,3439,4.654,3443,3.045,3444,3.045,3445,3.045,3446,3.621,3447,3.621,3448,3.621,3449,5.003,3450,5.533,3451,6.072,3452,3.621,3453,3.621,3454,5.533,3455,5.533,3456,5.533,3457,3.621,3458,3.274,3459,3.274,3460,3.621,3461,3.621,3462,3.621,3463,3.621,3464,3.621,3465,3.621,3466,3.621,3467,3.621,3468,3.621,3469,6.716,3470,3.621,3471,3.621]],["t/651",[4,2.381,6,2.267,7,0.942,15,1.213,21,1.772,36,3.629,50,0.896,80,1.557,94,3.063,99,1.103,113,1.621,117,3.343,121,3.43,135,1.391,137,1.443,139,2.199,179,1.635,189,3.525,193,2.094,217,2.227,219,2.145,253,2.045,306,2.094,308,3.054,337,3.263,362,3.43,364,3.263,365,3.875,387,3.477,406,3.984,418,5.019,422,3.587,509,2.935,647,3.708,731,1.953,957,3.875,974,2.537,1016,3.875,1019,3.525,1408,4.407,1749,6.338,1760,3.745,1789,4.669,2035,3.745,2642,3.629,2658,4.198,2674,5.983,2683,4.407,2685,4.024,2870,4.407,2982,4.407,3340,3.875,3360,5.261,3362,3.875,3365,4.024,3368,4.407,3396,4.407,3402,4.198,3433,6.338,3439,6.338,3442,5.019,3443,4.669,3444,4.669,3445,6.338,3458,5.019,3459,5.019,3472,7.535,3473,5.551,3474,5.551,3475,5.551,3476,5.551]],["t/653",[0,1.231,6,2.558,7,1.772,10,1.932,11,2.083,15,1.149,20,1.251,21,1.677,22,2.056,23,1.446,26,2.124,27,3.157,35,1.267,36,2.143,38,3.086,47,2.602,50,1.19,53,1.641,54,0.965,61,2.564,63,1.733,66,0.375,82,1.446,83,2.4,84,1.426,94,2.911,98,3.341,99,1.253,103,0.469,104,3.451,113,0.705,117,3.086,119,1.733,122,2.081,125,3.577,128,0.674,130,0.596,139,2.03,140,1.015,154,0.634,171,2.211,175,2.521,179,2.524,189,4.005,209,1.128,211,1.67,214,2.288,217,1.315,236,0.821,246,1.315,251,2.211,308,1.803,321,2.143,324,1.927,331,1.092,349,1.426,366,1.426,406,4.091,414,2.208,439,2.211,519,1.767,570,2.288,599,1.803,600,2.025,605,3.166,614,1.927,620,5.393,621,5.059,638,1.387,647,3.509,649,2.602,652,2.143,665,2.323,670,5.616,676,1.927,713,3.708,731,2.723,739,2.61,754,2.211,756,1.35,825,1.974,865,2.963,912,2.602,938,2.658,957,2.288,966,1.823,974,1.104,1005,4.123,1016,3.577,1025,2.479,1049,2.025,1063,2.081,1108,1.842,1187,2.376,1211,1.883,1221,2.376,1230,4.811,1299,2.211,1302,2.564,1344,2.376,1361,2.025,1460,2.602,1492,2.943,1514,2.376,1535,3.349,1606,3.897,1607,1.974,1740,3.875,1754,2.963,1772,4.77,1789,2.757,1807,2.602,1819,2.143,2035,2.211,2219,5.61,2243,2.757,2436,2.479,2642,4.662,2674,4.067,2685,5.17,2720,2.757,2884,2.963,3240,2.757,3300,2.963,3340,4.403,3360,3.577,3362,3.577,3365,3.714,3395,5.703,3402,2.479,3405,2.963,3449,4.632,3451,2.963,3477,5.123,3478,3.277,3479,3.277,3480,3.277,3481,3.277,3482,3.277,3483,3.277,3484,3.277,3485,3.277,3486,3.277,3487,3.277,3488,5.123,3489,3.277,3490,5.123,3491,5.123,3492,6.307,3493,3.277,3494,3.277,3495,3.277,3496,3.277]]],"invertedIndex":[["",{"_index":15,"t":{"4":{"position":[[25,1],[35,1],[46,1],[61,1],[69,1],[78,1],[88,1],[98,1]]},"11":{"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]]},"15":{"position":[[705,1],[990,1],[992,3],[996,1],[998,3],[1297,1],[1339,1],[2586,1],[2588,1],[2640,1],[2737,1],[2739,1],[2741,1],[2789,1],[2791,1],[2843,1],[2940,1],[2942,2],[2945,1],[2997,1],[3095,1],[3097,1],[3099,1],[3473,1],[3515,1],[4522,1],[4583,1],[4681,1],[4713,2],[4784,2],[4805,1],[4854,2],[4868,1],[4870,1],[4990,1],[5140,1],[5142,1],[5144,2],[5158,1],[5160,1],[5247,1],[5306,1],[5308,1],[5310,2],[5325,1],[5327,1],[5448,1],[5484,1],[5486,2],[5489,1],[5672,1],[5707,1],[5709,1],[5711,1],[5713,1],[5888,1],[5901,1],[5903,1],[5974,1],[6071,1],[6073,1],[6075,1],[6077,1]]},"19":{"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":[[161,2]]},"23":{"position":[[1468,1],[1470,3],[1507,1],[1509,3],[1525,1],[1536,1],[1546,1],[1569,1],[1571,2],[1574,2],[1577,3],[1581,1]]},"25":{"position":[[619,1],[621,3],[763,1],[765,3],[1082,1],[1084,3],[1143,1],[1145,3],[1169,1],[1180,1],[1221,2],[1224,2],[1227,3],[1231,1]]},"29":{"position":[[2357,1],[2787,1],[2848,1],[2912,1],[3090,1],[3104,1],[3119,1],[3158,1],[3181,1],[3183,1],[3185,1],[3187,1],[3311,1],[3325,1],[3340,1],[3358,1],[3425,2],[3439,1],[3449,1],[3451,1],[3453,1],[3455,1],[4332,1],[4706,1],[4768,1],[4919,1],[4933,1],[4948,1],[4974,1],[4976,1],[4978,1],[5068,1],[5082,1],[5097,1],[5114,1],[5181,2],[5184,1],[5186,1],[5188,1]]},"31":{"position":[[468,1],[500,6],[507,2],[510,3],[514,1]]},"38":{"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]]},"42":{"position":[[275,1],[620,1],[622,1],[652,1]]},"53":{"position":[[292,2],[339,2]]},"55":{"position":[[1902,1],[1904,3],[1942,1],[2011,1],[2013,3],[2017,1],[2050,1],[2052,3],[2056,1],[2058,2],[2159,1],[2232,1],[2439,2],[2486,2],[2542,2],[2898,1],[2917,1],[2935,1],[4133,1],[4155,1],[4177,1],[4183,1],[4316,1],[4322,1],[4539,1],[4561,1],[4583,1],[4589,1],[4722,1],[4728,1],[6058,1],[6296,1],[6298,3],[6528,1],[6530,3],[7615,1],[7946,1],[8176,1],[8178,3],[8408,1],[8410,3],[9979,1],[9981,3]]},"59":{"position":[[501,1],[503,3],[541,1],[610,1],[612,3],[616,1],[649,1],[651,3],[655,1],[657,2],[758,1],[831,1],[1038,2],[1085,2],[1141,2]]},"61":{"position":[[122,1],[141,1],[159,1]]},"65":{"position":[[1122,2],[1225,2],[1271,2],[1410,1],[1465,1],[1569,1],[1656,1],[1725,1],[1836,1],[1985,1],[2052,1],[2107,1],[2159,1],[2259,1],[2326,1],[2381,1],[2489,1],[3687,2],[3761,2]]},"67":{"position":[[729,1],[964,3],[1962,1],[1964,1],[2033,1],[2091,1],[2114,1],[2116,1],[2118,1],[2120,1],[2420,3],[3325,1],[3338,1],[3340,1],[3409,1],[3467,1],[3490,1],[3492,2],[3513,1],[3515,1],[3517,1]]},"75":{"position":[[878,1],[880,1],[920,1],[1087,1],[1089,1],[1091,1],[1974,1],[1976,1],[2016,1],[2179,1],[2181,1],[2183,1]]},"77":{"position":[[439,2],[486,2]]},"79":{"position":[[1263,2],[1366,2],[1412,2],[1551,1],[1606,1],[1710,1],[1797,1],[1866,1],[1977,1],[2126,1],[2193,1],[2248,1],[2300,1],[2400,1],[2467,1],[2522,1],[2630,1],[3895,2],[3969,2]]},"81":{"position":[[970,1],[1205,3],[2203,1],[2205,1],[2275,1],[2399,1],[2401,1],[2403,1],[2703,3],[3608,1],[3621,1],[3623,1],[3693,1],[3817,2],[3838,1],[3840,1],[3842,1]]},"83":{"position":[[248,2],[659,2]]},"85":{"position":[[477,1],[710,3],[1696,1],[1698,1],[1782,1],[1890,1],[1892,1],[1894,1],[2192,3],[3093,1],[3106,1],[3108,1],[3192,1],[3300,2],[3319,1],[3321,1],[3323,1]]},"91":{"position":[[640,1],[874,3],[1866,1],[1868,1],[1970,1],[2119,1],[2121,1],[2123,1],[2422,3],[3325,1],[3338,1],[3340,1],[3442,1],[3591,2],[3611,1],[3613,1],[3615,1]]},"99":{"position":[[736,1],[971,3],[1969,1],[1971,1],[2076,1],[2178,1],[2180,1],[2182,1],[2482,3],[3387,1],[3400,1],[3402,1],[3507,1],[3609,2],[3630,1],[3632,1],[3634,1]]},"101":{"position":[[382,1]]},"103":{"position":[[413,1],[647,3],[1639,1],[1641,1],[1741,1],[1800,1],[1802,1],[1804,1],[2103,3],[3006,1],[3019,1],[3021,1],[3121,1],[3180,2],[3200,1],[3202,1],[3204,1]]},"107":{"position":[[519,1],[759,3],[1787,1],[1789,1],[1888,1],[2000,1],[2002,1],[2004,1],[2309,3],[3224,1],[3237,1],[3239,1],[3338,1],[3450,2],[3476,1],[3478,1],[3480,1]]},"114":{"position":[[461,1],[827,3],[1661,1],[1896,3],[2894,1],[2896,1],[2989,1],[3113,1],[3115,1],[3117,1],[3417,3],[4322,1],[4335,1],[4337,1],[4430,1],[4554,2],[4575,1],[4577,1],[4579,1]]},"118":{"position":[[259,1],[283,1]]},"121":{"position":[[1026,1],[1260,3],[2252,1],[2254,1],[2339,1],[2413,1],[2415,1],[2417,1],[2716,3],[3619,1],[3632,1],[3634,1],[3719,1],[3793,2],[3813,1],[3815,1],[3817,1]]},"125":{"position":[[122,1],[124,1],[126,1],[128,1],[156,1],[158,1],[160,1],[162,2],[187,1],[189,1],[191,1],[193,1],[236,1],[238,1],[240,1],[242,1],[268,1],[270,1],[272,1],[274,2],[302,1],[304,1],[306,1],[308,1],[333,1],[335,1],[337,1],[339,1],[362,1],[364,1],[366,1],[368,1],[391,1],[393,1],[395,1],[397,1],[422,1],[424,1],[426,1],[428,1],[454,1],[456,1],[458,1],[460,1],[497,1],[499,1],[501,1],[503,1],[533,1],[535,1],[537,1],[539,1],[581,1],[583,1],[585,1],[587,1],[611,1],[613,1],[615,1],[617,1],[642,1],[644,1],[646,1],[648,1],[692,1],[694,1],[696,1],[698,1],[726,1],[728,1],[730,1],[732,1],[755,1],[757,1],[759,1],[761,1],[786,1],[788,1],[790,1],[792,1],[816,1],[818,1],[820,1],[822,1],[848,1],[850,1],[852,1],[854,1],[897,1],[899,1],[901,1],[903,1],[928,1],[930,1],[932,1],[934,1],[965,1],[967,1],[969,1],[971,1],[993,1],[995,1],[997,1],[999,1],[1034,1],[1036,1],[1038,1],[1040,1],[1071,1],[1073,1],[1075,1],[1106,1],[1108,1],[1110,1],[1112,1]]},"132":{"position":[[197,1],[280,1],[282,2],[285,3],[289,2],[292,1],[331,3]]},"134":{"position":[[1452,1],[1462,1],[1464,2],[1467,3],[1471,2],[1485,1],[1509,1],[1527,2],[1593,2],[1660,1],[1662,1],[1664,1]]},"136":{"position":[[690,1],[700,1],[702,2],[705,3],[709,2],[723,1],[725,2],[773,2],[841,1],[843,1]]},"138":{"position":[[319,1]]},"140":{"position":[[382,2],[414,2],[492,2],[590,2],[994,1],[1004,1],[1006,2],[1009,3],[1013,2],[1027,1],[1029,2],[1088,2],[1167,1],[1169,2]]},"142":{"position":[[404,4],[418,2],[741,1],[743,1],[910,3],[1181,1]]},"144":{"position":[[539,1],[776,3],[1786,1],[1788,1],[1876,1],[1988,1],[1990,1],[1992,1],[2294,3],[3203,1],[3216,1],[3218,1],[3306,1],[3418,1],[3420,1],[3422,1],[3424,1]]},"150":{"position":[[613,1],[726,1],[938,1],[1015,1],[1160,1],[1311,1],[1564,1],[1566,1],[1621,1],[1787,1],[1789,1],[1791,1],[1820,1],[1822,1],[1883,1],[1904,1],[1906,1],[1908,1],[1931,1],[1933,1],[1982,1],[2101,1],[2103,1],[2105,1],[2130,1],[2132,1],[2204,1],[2305,1],[2307,1],[2309,1],[2333,1],[2335,1],[2409,1],[2517,1],[2519,1],[2521,1],[2563,1],[2576,1],[2578,1],[2652,1],[2818,1],[2820,2],[2823,1],[2906,1],[2927,1],[2929,2],[2932,1],[2997,1],[3115,1],[3117,1],[3119,2],[3133,1],[3135,1],[3225,1],[3326,1],[3328,2],[3331,1],[3422,1],[3530,1],[3532,1],[3534,1],[3536,1]]},"152":{"position":[[588,1],[590,1],[666,1],[765,1],[767,2],[770,1],[846,1],[945,1],[947,1],[949,1],[972,1],[974,1],[1047,1],[1111,1],[1113,1],[1115,1],[1140,1],[1142,1],[1218,1],[1323,1],[1325,2],[1328,1],[1404,1],[1509,1],[1511,1],[1513,1],[1537,1],[1539,1],[1613,1],[1721,1],[1723,1],[1725,1],[1767,1],[1780,1],[1782,1],[1857,1],[1869,2],[1880,1],[1979,1],[1981,2],[1984,1],[2059,1],[2071,2],[2082,1],[2181,1],[2183,2],[2186,1],[2254,1],[2266,2],[2277,1],[2356,1],[2365,1],[2367,1],[2369,1],[2371,2],[2385,1],[2387,1],[2481,1],[2586,1],[2588,2],[2591,1],[2685,1],[2790,1],[2792,2],[2795,1],[2886,1],[2994,1],[2996,1],[2998,1],[3000,1]]},"154":{"position":[[746,1],[859,1],[926,1],[941,1],[1003,1],[1010,2],[1019,2],[1080,1],[1292,1],[1369,1],[1462,1],[1954,1],[1972,1],[1974,1],[2023,1],[2033,1],[2035,1],[2071,1],[2073,1],[2075,2],[2090,1],[2166,1],[2192,2],[2276,1],[2304,1],[2306,1],[2308,1],[2310,1],[2312,1],[2338,1],[2340,1],[2395,1],[2561,1],[2563,1],[2565,1],[2594,1],[2596,1],[2657,1],[2678,2],[2692,1],[2711,1],[2727,1],[2729,1],[2769,1],[2771,1],[2773,1],[2775,1],[2777,1],[2779,1],[2804,1],[2806,1],[2878,1],[2979,1],[2981,1],[2983,1],[3153,1],[3171,1],[3173,1],[3222,1],[3232,1],[3234,1],[3270,1],[3272,1],[3274,2],[3289,1],[3365,1],[3391,2],[3475,1],[3503,1],[3505,1],[3507,1],[3509,2],[3523,1],[3525,1],[3599,1],[3765,1],[3767,2],[3770,1],[3853,1],[3874,2],[3888,1],[3907,1],[3923,1],[3925,1],[3965,1],[3967,1],[3969,1],[3971,1],[3973,1],[3975,2],[3989,1],[3991,1],[4081,1],[4182,1],[4184,1],[4186,1],[4188,1]]},"158":{"position":[[402,4],[787,1]]},"160":{"position":[[291,1],[293,1],[323,1],[357,2],[371,1],[410,1],[412,1],[414,1]]},"162":{"position":[[343,1],[359,1],[386,1],[401,1],[430,1],[446,1],[476,1],[492,1],[698,1],[700,1],[750,3],[762,1],[825,1],[827,1],[829,1],[1210,1]]},"164":{"position":[[566,1],[800,3],[1792,1],[1794,1],[1869,3],[1881,1],[2013,1],[2015,1],[2017,1],[2316,3],[3219,1],[3232,1],[3234,1],[3309,3],[3321,1],[3453,2],[3473,1],[3475,1],[3477,1]]},"166":{"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]]},"168":{"position":[[887,1],[1125,3],[2141,1],[2143,1],[2188,1],[2212,3],[2238,3],[2261,3],[2284,2],[2287,1],[2289,1],[2291,1],[2594,3],[3505,1],[3518,1],[3520,1],[3565,1],[3589,3],[3615,3],[3638,3],[3661,2],[3664,2],[3688,1],[3690,1],[3692,1]]},"172":{"position":[[410,2],[461,2],[512,2],[549,2],[567,2],[782,2],[827,2],[885,2],[935,2],[1539,1],[1723,1],[3041,2],[3067,1],[3830,1],[3858,1],[3891,1],[3946,1],[3974,1],[4264,1],[4330,1],[4385,1],[4431,1],[4457,1],[4464,1],[4490,1],[4509,1],[4515,1],[4538,1],[4544,1],[4563,2],[4619,1],[4646,1],[4676,1],[4710,2]]},"174":{"position":[[830,1]]},"177":{"position":[[157,1],[401,1]]},"179":{"position":[[205,1],[391,1]]},"194":{"position":[[231,1],[233,1],[235,1],[237,1]]},"196":{"position":[[236,1],[1044,1],[1130,1],[1132,1],[1134,1],[1136,1],[1138,1],[1734,2],[1737,1],[1739,3],[1913,1],[2442,1],[2452,1],[2592,1],[2594,1],[3317,1],[3484,1],[3494,1],[3503,1],[3555,1],[3637,1],[3639,2],[3689,1],[3691,1]]},"198":{"position":[[771,1],[2579,1],[2581,2],[2584,3],[2604,1],[2606,1],[2662,1],[2673,1],[2675,2],[2696,1],[2698,1],[2700,1],[2702,1],[2704,1],[2722,1],[2724,1],[2782,1],[2784,2],[2787,3],[2791,2],[2805,1],[2831,1],[2833,1],[2835,1],[2849,1],[2851,1],[2953,1],[3102,2],[3116,1],[3135,1],[3151,1],[3153,1],[3197,1],[3199,1],[3201,1],[3203,1],[3205,1],[3207,1]]},"200":{"position":[[774,1],[1012,3],[2028,1],[2030,1],[2107,3],[2119,1],[2128,1],[2180,1],[2262,1],[2264,2],[2399,2],[2413,1],[2491,1],[2493,1],[2495,1],[2798,3],[3709,1],[3722,1],[3724,1],[3801,3],[3813,1],[3822,1],[3874,1],[3956,1],[3958,2],[4093,2],[4107,1],[4185,2],[4209,1],[4211,1],[4213,1]]},"202":{"position":[[139,1],[151,1]]},"204":{"position":[[133,2],[182,2]]},"206":{"position":[[543,1],[775,3],[1755,1],[1757,1],[1825,1],[1914,1],[1916,1],[1918,1],[2215,3],[3114,1],[3127,1],[3129,1],[3197,1],[3286,2],[3304,1],[3306,1],[3308,1]]},"208":{"position":[[121,1],[139,1],[152,1],[225,1],[380,1],[3674,1],[3910,3],[4914,1],[4916,1],[4991,3],[5003,1],[5115,1],[5143,2],[5160,1],[5176,2],[5195,1],[5207,2],[5226,1],[5242,2],[5263,1],[5277,2],[5298,1],[5311,2],[5347,1],[5363,2],[5385,1],[5395,2],[5454,2],[5468,1],[5518,1],[5520,1],[5522,1],[5823,3],[6730,1],[6743,1],[6745,1],[6820,3],[6832,1],[6944,1],[6972,2],[6989,1],[7005,2],[7024,1],[7036,2],[7055,1],[7071,2],[7092,1],[7106,2],[7127,1],[7140,2],[7176,1],[7192,2],[7214,1],[7224,2],[7283,2],[7297,1],[7347,2],[7369,1],[7371,1],[7373,1]]},"210":{"position":[[1092,1],[1102,1],[1104,2],[1107,3],[1111,2],[1125,1],[1127,2],[1186,2],[1265,1],[1267,2],[1913,1],[1915,1],[1958,1],[2036,1],[2038,1],[2040,1]]},"212":{"position":[[400,1],[635,3],[1633,1],[1635,1],[1705,1],[1743,1],[1745,1],[1747,1],[2047,3],[2952,1],[2965,1],[2967,1],[3037,1],[3075,2],[3096,1],[3098,1],[3100,1]]},"214":{"position":[[144,1],[155,1]]},"216":{"position":[[135,2],[184,2]]},"218":{"position":[[575,1],[809,3],[1801,1],[1803,1],[1874,1],[1939,1],[1941,1],[1943,1],[2242,3],[3145,1],[3158,1],[3160,1],[3231,1],[3296,2],[3316,1],[3318,1],[3320,1]]},"224":{"position":[[149,2]]},"232":{"position":[[644,1],[883,3],[1905,1],[1907,1],[1974,1],[1993,1],[1995,1],[1997,1],[2301,3],[3214,1],[3227,1],[3229,1],[3296,1],[3315,2],[3340,1],[3342,1],[3344,1]]},"236":{"position":[[696,1],[930,3],[2178,1],[2180,1],[2282,1],[2431,1],[2433,1],[2435,1],[2734,3],[3637,1],[3650,1],[3652,1],[3754,1],[3903,2],[3923,1],[3925,1],[3927,1]]},"238":{"position":[[881,1],[1114,3],[2353,1],[2355,1],[2439,1],[2547,1],[2549,1],[2551,1],[2849,3],[3750,1],[3763,1],[3765,1],[3849,1],[3957,2],[3976,1],[3978,1],[3980,1]]},"253":{"position":[[78,1]]},"257":{"position":[[719,1],[957,3],[1973,1],[1975,1],[2052,1],[2073,1],[2075,1],[2077,1],[2380,3],[3291,1],[3304,1],[3306,1],[3383,1],[3404,2],[3428,1],[3430,1],[3432,1]]},"261":{"position":[[799,1],[1034,3],[2291,1],[2293,1],[2398,1],[2500,1],[2502,1],[2504,1],[2804,3],[3709,1],[3722,1],[3724,1],[3829,1],[3931,2],[3952,1],[3954,1],[3956,1]]},"265":{"position":[[568,1],[808,3],[2110,1],[2112,1],[2211,1],[2323,1],[2325,1],[2327,1],[2632,3],[3547,1],[3560,1],[3562,1],[3661,1],[3773,2],[3799,1],[3801,1],[3803,1]]},"269":{"position":[[455,1],[689,3],[1937,1],[1939,1],[2039,1],[2098,1],[2100,1],[2102,1],[2401,3],[3304,1],[3317,1],[3319,1],[3419,1],[3478,2],[3498,1],[3500,1],[3502,1]]},"271":{"position":[[177,1],[191,1]]},"273":{"position":[[518,1],[755,3],[1765,1],[1767,1],[1854,1],[1912,1],[1914,1],[1916,1],[2218,3],[3127,1],[3140,1],[3142,1],[3229,1],[3287,1],[3289,1],[3291,1],[3293,1]]},"277":{"position":[[539,1],[772,3],[1758,1],[1760,1],[1828,1],[1843,1],[1858,2],[1874,1],[1886,1],[1888,1],[1890,1],[1892,1],[2190,3],[3091,1],[3104,1],[3106,1],[3174,1],[3189,1],[3204,2],[3220,1],[3232,1],[3234,2],[3253,1],[3255,1],[3257,1]]},"279":{"position":[[151,1]]},"281":{"position":[[509,1],[740,3],[1714,1],[1716,1],[1776,1],[1833,2],[1847,1],[1875,1],[1877,1],[1879,1],[2175,3],[3072,1],[3085,1],[3087,1],[3147,1],[3204,2],[3218,1],[3246,2],[3263,1],[3265,1],[3267,1]]},"283":{"position":[[490,2],[539,2],[883,1],[900,1]]},"285":{"position":[[350,1],[383,1]]},"287":{"position":[[353,1],[400,1]]},"289":{"position":[[770,1],[1004,3],[1996,1],[1998,1],[2068,1],[2106,3],[2126,3],[2148,2],[2151,1],[2153,1],[2155,1],[2454,3],[3357,1],[3370,1],[3372,1],[3442,1],[3480,3],[3500,3],[3522,2],[3525,2],[3545,1],[3547,1],[3549,1]]},"295":{"position":[[697,1],[932,3],[2189,1],[2191,1],[2284,1],[2408,1],[2410,1],[2412,1],[2712,3],[3617,1],[3630,1],[3632,1],[3725,1],[3849,2],[3870,1],[3872,1],[3874,1]]},"297":{"position":[[1373,1],[1375,1],[1420,1],[1446,2],[1460,1],[1509,1],[1511,1],[1513,1]]},"301":{"position":[[1010,1],[1243,3],[2229,1],[2231,1],[2292,1],[2335,1],[2352,2],[2371,1],[2380,2],[2398,1],[2409,2],[2427,1],[2439,1],[2441,1],[2443,1],[2445,1],[2743,3],[3644,1],[3657,1],[3659,1],[3720,1],[3763,1],[3780,2],[3799,1],[3808,2],[3826,1],[3837,2],[3855,1],[3867,1],[3869,2],[3888,1],[3890,1],[3892,1]]},"305":{"position":[[551,1],[786,3],[1784,1],[1786,1],[1858,3],[1870,1],[2036,1],[2038,1],[2040,1],[2340,3],[3245,1],[3258,1],[3260,1],[3332,3],[3344,1],[3510,2],[3531,1],[3533,1],[3535,1]]},"307":{"position":[[1059,1]]},"309":{"position":[[469,5]]},"311":{"position":[[544,1],[741,1],[743,2],[746,3],[766,1],[768,1],[817,1],[827,1],[829,1],[831,2],[946,1],[948,1],[950,1],[952,1],[954,1],[956,1],[989,1],[991,1],[1019,1],[1021,2],[1024,3],[1028,4],[1044,1],[1063,1],[1079,1],[1081,1],[1177,1],[1179,1],[1181,1],[1183,1],[1185,1],[1187,1],[1218,1],[1220,2],[1223,3],[1243,1],[1245,1],[1294,1],[1304,1],[1306,1],[1308,2],[1423,1],[1425,1],[1427,1],[1429,1],[1431,1],[1433,2],[1436,3],[1451,1],[1453,2],[1456,3],[1460,1],[1504,1],[1506,2],[1509,3],[1513,4],[1529,1],[1548,1],[1564,1],[1566,1],[1663,1],[1665,1],[1667,1],[1669,1],[1671,1],[1673,1],[1675,1]]},"317":{"position":[[528,1],[764,3],[1768,1],[1770,1],[1843,1],[1948,1],[1961,2],[2008,1],[2010,1],[2012,1],[2313,3],[3220,1],[3233,1],[3235,1],[3308,1],[3413,1],[3426,2],[3473,2],[3495,1],[3497,1],[3499,1]]},"319":{"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]]},"321":{"position":[[428,1],[659,3],[1633,1],[1635,1],[1695,1],[1745,1],[1747,1],[1749,1],[2045,3],[2942,1],[2955,1],[2957,1],[3017,1],[3067,2],[3084,1],[3086,1],[3088,1]]},"325":{"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]]},"329":{"position":[[464,1],[704,3],[1732,1],[1734,1],[1794,1],[1835,3],[1852,2],[1855,1],[1857,1],[1859,1],[2164,3],[3079,1],[3092,1],[3094,1],[3154,1],[3195,3],[3212,2],[3215,2],[3241,1],[3243,1],[3245,1]]},"331":{"position":[[357,1],[394,1]]},"333":{"position":[[502,1],[738,3],[1742,1],[1744,1],[1816,1],[1891,1],[1893,1],[1895,1],[2196,3],[3103,1],[3116,1],[3118,1],[3190,1],[3265,1],[3267,1],[3269,1],[3271,1]]},"341":{"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],[1941,1],[2175,3],[3423,1],[3425,1],[3510,1],[3601,1],[3610,2],[3628,1],[3640,1],[3642,1],[3644,1],[3646,1],[3945,3],[4848,1],[4861,1],[4863,1],[4948,1],[5039,1],[5048,2],[5066,1],[5078,1],[5080,2],[5100,1],[5102,1],[5104,1]]},"343":{"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]]},"345":{"position":[[646,1],[881,3],[1879,1],[1881,1],[1954,3],[1966,1],[2015,8],[2105,2],[2119,1],[2137,1],[2139,1],[2141,1],[2441,3],[3346,1],[3359,1],[3361,1],[3434,3],[3446,1],[3495,8],[3585,2],[3599,1],[3617,2],[3638,1],[3640,1],[3642,1]]},"351":{"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]]},"353":{"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]]},"355":{"position":[[655,1],[674,2],[715,1]]},"357":{"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]]},"359":{"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]]},"361":{"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]]},"363":{"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]]},"365":{"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]]},"375":{"position":[[311,1],[340,1]]},"381":{"position":[[175,1],[221,1]]},"393":{"position":[[399,1],[636,3],[1646,1],[1648,1],[1723,1],[1748,1],[1750,1],[1752,1],[2054,3],[2963,1],[2976,1],[2978,1],[3053,1],[3078,2],[3101,1],[3103,1],[3105,1]]},"395":{"position":[[384,1],[733,1],[813,1],[835,1],[867,1],[965,1]]},"397":{"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]]},"399":{"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]]},"401":{"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]]},"403":{"position":[[266,1],[572,1],[839,1],[937,1]]},"406":{"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]]},"408":{"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]]},"410":{"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]]},"414":{"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],[734,1],[736,2],[782,1],[784,1],[786,1],[788,1],[790,1],[792,1],[794,1]]},"416":{"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]]},"418":{"position":[[74,1],[76,1],[131,1],[133,2],[136,3],[140,2],[154,1],[173,1],[189,1],[191,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]]},"421":{"position":[[48,2],[81,2],[117,2],[170,2],[173,2],[218,1],[245,1],[247,1],[312,3],[324,1],[326,1],[355,1],[357,1],[359,2],[417,2],[420,1]]},"423":{"position":[[68,1],[95,1],[115,1],[117,1]]},"425":{"position":[[8,1],[21,1],[36,1],[63,1],[82,1],[84,2],[99,1],[126,1],[145,1],[147,2],[150,2],[153,1]]},"427":{"position":[[8,1],[37,1],[39,1],[89,1],[91,1],[93,1]]},"429":{"position":[[8,1],[35,1],[37,1],[79,2],[82,1],[84,1],[86,1]]},"431":{"position":[[176,1],[192,1],[270,3],[563,1],[579,1],[664,1],[693,1],[695,1],[758,1],[760,1],[762,1]]},"440":{"position":[[304,2],[362,2],[488,2]]},"448":{"position":[[385,1],[640,1],[985,1],[992,1],[2101,1]]},"450":{"position":[[637,1]]},"457":{"position":[[76,1],[164,1],[231,1]]},"470":{"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]]},"476":{"position":[[293,1],[295,3],[571,1],[573,3],[590,1],[592,3],[645,1],[698,1],[992,1],[994,3],[1391,1],[1393,3],[1560,1],[1562,3],[1579,1],[2299,1],[2301,3],[2605,1],[2607,3],[2624,1],[2626,3],[2663,1],[2665,3]]},"478":{"position":[[586,1],[927,1],[997,1],[1113,1],[1136,1],[1147,1],[1178,1],[1192,1]]},"482":{"position":[[215,1],[288,2],[674,1],[725,2],[792,2],[987,2],[1057,2],[1132,2],[1178,2],[1234,2],[1275,2],[1602,1],[1628,1],[1658,1],[1668,1],[1711,1],[1713,1],[1965,1],[1978,1],[1980,1],[2063,1],[2164,1],[2166,1],[2168,2],[2182,1],[2184,1],[2232,1],[2291,1],[2293,1],[2295,2],[2298,1]]},"492":{"position":[[701,1],[712,1],[744,1],[746,1],[748,3]]},"518":{"position":[[102,2],[197,2]]},"524":{"position":[[268,1]]},"528":{"position":[[250,1],[400,1]]},"530":{"position":[[361,1],[427,1],[485,1],[2862,1],[2929,1]]},"532":{"position":[[543,1],[651,1],[698,1],[705,2],[737,2],[1779,1],[1781,1],[1842,1],[1975,2],[1989,1],[2008,1],[2024,1],[2048,1],[2050,1],[2052,1],[2054,1],[2056,1]]},"534":{"position":[[276,1],[384,1],[431,1],[438,2],[470,2]]},"536":{"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]]},"538":{"position":[[340,2],[747,2],[2140,1]]},"551":{"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]]},"553":{"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]]},"555":{"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]]},"557":{"position":[[628,1],[644,1],[657,1],[1157,1],[1469,1],[1639,1],[1701,1],[1708,2],[1717,2],[1880,1],[1977,1]]},"561":{"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]]},"564":{"position":[[210,1],[212,2],[215,3],[231,2],[283,1]]},"566":{"position":[[1338,1],[1340,5],[1925,2],[1928,3],[1944,1],[1946,2],[1949,3],[1979,2],[2052,1]]},"568":{"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]]},"573":{"position":[[377,1],[379,2],[461,2],[561,2],[622,1],[790,1],[792,2],[874,2],[974,2],[1036,2],[1167,1]]},"575":{"position":[[636,1],[716,1],[738,1],[834,1],[932,1]]},"579":{"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]]},"581":{"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]]},"584":{"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]]},"586":{"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]]},"588":{"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]]},"590":{"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]]},"592":{"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]]},"594":{"position":[[500,1],[502,2],[505,3],[525,1],[527,1],[576,1],[586,1],[588,1],[624,1],[626,1],[628,2],[643,1],[645,2],[875,1],[877,1],[879,1],[881,1],[925,1],[927,1],[951,1],[953,2],[956,3],[960,4],[976,1],[995,1],[1011,1],[1013,1],[1038,1],[1040,1],[1042,1],[1044,1],[1046,1],[1048,1],[1079,1],[1081,2],[1084,3],[1104,1],[1106,1],[1155,1],[1165,1],[1167,1],[1203,1],[1205,1],[1207,2],[1222,1],[1224,2],[1454,1],[1456,1],[1458,2],[1472,1],[1474,1],[1517,1],[1519,2],[1522,3],[1526,4],[1542,1],[1561,1],[1577,1],[1579,1],[1604,1],[1606,1],[1608,1],[1610,1],[1612,1],[1614,1],[1616,1]]},"621":{"position":[[160,1],[162,3],[197,1],[260,1],[402,1],[404,1],[482,1],[590,1],[592,1],[594,1],[687,1],[700,1],[702,1],[797,1],[905,1],[907,1],[909,1],[911,1]]},"625":{"position":[[835,1],[837,1],[885,1],[951,1],[953,1],[1438,1],[1440,1],[1483,1],[1545,1],[1547,1]]},"627":{"position":[[89,2],[122,2]]},"629":{"position":[[267,1],[269,3],[304,1],[306,3],[371,1],[373,2]]},"638":{"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]]},"640":{"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]]},"642":{"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]]},"644":{"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]]},"646":{"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]]},"648":{"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]]},"651":{"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]]},"653":{"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]]}}}],["0",{"_index":673,"t":{"42":{"position":[[277,1]]},"55":{"position":[[2000,1],[2391,3],[4389,1],[4451,1],[4795,1],[4857,1],[5097,1],[5105,1],[5240,1],[6140,1],[6573,1],[6632,1],[7697,1],[7933,1],[8019,2],[8449,1],[8508,1],[9799,2]]},"59":{"position":[[599,1],[990,3]]},"194":{"position":[[477,4]]},"623":{"position":[[49,1]]}}}],["0.0.0.0",{"_index":1911,"t":{"204":{"position":[[581,7]]},"216":{"position":[[589,7]]},"218":{"position":[[1883,10],[3240,10]]}}}],["0.05",{"_index":1727,"t":{"172":{"position":[[4484,5]]}}}],["0.1.7",{"_index":1078,"t":{"83":{"position":[[1490,8]]},"538":{"position":[[1138,8]]}}}],["0.12.2",{"_index":3045,"t":{"518":{"position":[[94,7],[189,7]]},"522":{"position":[[382,7]]}}}],["0.12.3",{"_index":3047,"t":{"518":{"position":[[200,7]]}}}],["0.13.0",{"_index":3046,"t":{"518":{"position":[[105,7]]},"520":{"position":[[250,6]]},"522":{"position":[[111,6],[139,6]]},"524":{"position":[[286,6]]}}}],["0.14.0",{"_index":3283,"t":{"619":{"position":[[3,6]]},"621":{"position":[[927,7]]},"623":{"position":[[387,6],[481,7],[629,6]]},"625":{"position":[[3,6]]},"629":{"position":[[30,7]]}}}],["0.14.1",{"_index":1238,"t":{"114":{"position":[[463,7]]}}}],["0.16.0",{"_index":3293,"t":{"621":{"position":[[1228,7]]}}}],["0.29",{"_index":1728,"t":{"172":{"position":[[4492,4]]}}}],["0.3",{"_index":1726,"t":{"172":{"position":[[4459,4]]},"568":{"position":[[2135,3]]}}}],["0.30",{"_index":1722,"t":{"172":{"position":[[4425,5]]}}}],["0.33",{"_index":3235,"t":{"568":{"position":[[2544,5],[2607,5],[2672,4]]},"592":{"position":[[1235,5],[1256,5],[1278,4]]}}}],["0.4",{"_index":1730,"t":{"172":{"position":[[4511,3]]},"568":{"position":[[2111,3]]}}}],["0.40",{"_index":1731,"t":{"172":{"position":[[4517,4]]}}}],["0.5",{"_index":1732,"t":{"172":{"position":[[4540,3]]}}}],["0.50",{"_index":1733,"t":{"172":{"position":[[4546,4]]}}}],["0.52",{"_index":1725,"t":{"172":{"position":[[4451,5]]}}}],["02",{"_index":2829,"t":{"448":{"position":[[958,2]]},"457":{"position":[[50,2],[137,2],[204,2]]}}}],["029b081ba",{"_index":1090,"t":{"85":{"position":[[1793,10],[3203,10]]},"107":{"position":[[1899,10],[3349,10]]},"150":{"position":[[2420,10],[3433,10]]},"152":{"position":[[1624,10],[2897,10]]},"238":{"position":[[2450,10],[3860,10]]},"265":{"position":[[2222,10],[3672,10]]},"621":{"position":[[493,10],[808,10]]}}}],["04",{"_index":3057,"t":{"524":{"position":[[237,2]]}}}],["0400",{"_index":2819,"t":{"448":{"position":[[374,5],[629,5]]},"524":{"position":[[257,5]]}}}],["04:00",{"_index":1713,"t":{"172":{"position":[[3852,5],[3968,5],[4286,5],[4407,5],[4585,5],[4613,5]]}}}],["04t13:01:48",{"_index":1716,"t":{"172":{"position":[[3956,11],[4395,11]]}}}],["04t13:01:51",{"_index":1712,"t":{"172":{"position":[[3840,11],[4274,11]]}}}],["05",{"_index":1711,"t":{"172":{"position":[[3837,2],[3953,2],[4271,2],[4392,2]]},"365":{"position":[[894,3],[949,3]]}}}],["0500",{"_index":2585,"t":{"365":{"position":[[654,5]]}}}],["05:00",{"_index":2831,"t":{"448":{"position":[[973,5]]}}}],["06:00",{"_index":2865,"t":{"457":{"position":[[65,5],[152,5],[219,5]]}}}],["07",{"_index":2817,"t":{"448":{"position":[[354,2],[609,2]]}}}],["0845bdc965b4",{"_index":3345,"t":{"638":{"position":[[724,12]]}}}],["08:53:10.467",{"_index":2584,"t":{"365":{"position":[[640,12]]}}}],["09:17:32.428",{"_index":3059,"t":{"524":{"position":[[243,12]]}}}],["0:/run/discord",{"_index":875,"t":{"55":{"position":[[6613,14],[7914,14],[8489,14]]}}}],["0:48/3:56",{"_index":3464,"t":{"648":{"position":[[2187,9]]}}}],["1",{"_index":284,"t":{"15":{"position":[[4734,2],[4758,2],[4828,2]]},"55":{"position":[[1338,2]]},"87":{"position":[[455,3]]},"142":{"position":[[751,2]]},"144":{"position":[[1986,1],[3416,1]]},"172":{"position":[[754,1],[1472,1],[2412,1],[4536,1]]},"196":{"position":[[1279,3],[2089,3]]},"198":{"position":[[697,2]]},"212":{"position":[[1654,3],[2986,3]]},"431":{"position":[[753,4]]},"470":{"position":[[1776,2],[1949,1]]},"568":{"position":[[2744,2],[2807,2]]}}}],["1.00",{"_index":1729,"t":{"172":{"position":[[4504,4]]}}}],["1.19",{"_index":1739,"t":{"172":{"position":[[4705,4]]}}}],["1.5",{"_index":287,"t":{"15":{"position":[[4780,3],[4850,3]]}}}],["10",{"_index":311,"t":{"15":{"position":[[5481,2]]},"29":{"position":[[2359,2],[4334,2]]},"38":{"position":[[991,2]]},"172":{"position":[[2562,2],[4670,5]]},"448":{"position":[[357,2],[612,2]]}}}],["10'",{"_index":578,"t":{"29":{"position":[[3898,4]]}}}],["10,000",{"_index":3118,"t":{"544":{"position":[[733,7]]},"546":{"position":[[130,7]]}}}],["10.2mb",{"_index":518,"t":{"29":{"position":[[683,6]]}}}],["10.7",{"_index":1928,"t":{"208":{"position":[[23,4]]}}}],["100",{"_index":513,"t":{"29":{"position":[[660,3],[825,3],[1049,3]]},"109":{"position":[[2194,4]]}}}],["1000",{"_index":515,"t":{"29":{"position":[[670,4],[835,4],[1059,4],[4040,4]]},"275":{"position":[[1571,4]]}}}],["1000:1000",{"_index":2946,"t":{"478":{"position":[[321,9]]}}}],["10k",{"_index":517,"t":{"29":{"position":[[679,3],[844,3],[1071,3]]}}}],["11026149",{"_index":839,"t":{"55":{"position":[[4202,8],[4608,8]]}}}],["11036791",{"_index":842,"t":{"55":{"position":[[4341,8],[4747,8]]}}}],["12",{"_index":2582,"t":{"365":{"position":[[634,2],[824,3],[917,3],[972,3]]}}}],["12.38",{"_index":1680,"t":{"172":{"position":[[1695,5],[1796,5]]}}}],["123",{"_index":3003,"t":{"492":{"position":[[726,4]]}}}],["1234",{"_index":2186,"t":{"285":{"position":[[497,4]]}}}],["12345678",{"_index":737,"t":{"53":{"position":[[359,10]]},"77":{"position":[[506,10]]}}}],["127.0.0.1",{"_index":2261,"t":{"303":{"position":[[2302,9],[3065,10]]},"323":{"position":[[379,9]]}}}],["127.0.0.1:5079",{"_index":2280,"t":{"303":{"position":[[4318,14]]}}}],["127.0.0.1:5079:8080",{"_index":2277,"t":{"303":{"position":[[3903,19]]}}}],["128522478",{"_index":1547,"t":{"162":{"position":[[482,9]]}}}],["12:32:21.417",{"_index":2818,"t":{"448":{"position":[[360,12]]}}}],["12:32:21.418",{"_index":2826,"t":{"448":{"position":[[615,12]]}}}],["13:01:48",{"_index":1734,"t":{"172":{"position":[[4576,8]]}}}],["13:01:51",{"_index":1736,"t":{"172":{"position":[[4604,8]]}}}],["13b0",{"_index":2309,"t":{"309":{"position":[[576,10]]}}}],["16",{"_index":3058,"t":{"524":{"position":[[240,2]]}}}],["160kb",{"_index":514,"t":{"29":{"position":[[664,5]]}}}],["1641787/discord",{"_index":840,"t":{"55":{"position":[[4211,15],[4617,15]]}}}],["1642030/ex",{"_index":843,"t":{"55":{"position":[[4350,11],[4756,11]]}}}],["166276334",{"_index":1542,"t":{"162":{"position":[[349,9]]}}}],["1673e4d57ce7",{"_index":2615,"t":{"365":{"position":[[1205,12]]}}}],["17",{"_index":2583,"t":{"365":{"position":[[637,2]]}}}],["192.168.0.100",{"_index":2821,"t":{"448":{"position":[[510,15],[721,15]]},"478":{"position":[[192,15]]},"526":{"position":[[203,13],[635,13]]}}}],["192.168.0.100:6600",{"_index":2166,"t":{"281":{"position":[[1785,21],[3156,21]]}}}],["192.168.0.100:6655",{"_index":899,"t":{"55":{"position":[[9808,20]]}}}],["192.168.0.101",{"_index":392,"t":{"21":{"position":[[635,13]]},"393":{"position":[[1732,15],[3062,15]]}}}],["192.168.0.101:3456",{"_index":1914,"t":{"204":{"position":[[845,18]]},"216":{"position":[[863,18]]},"283":{"position":[[1161,18]]}}}],["192.168.0.101:4000/my/subfold",{"_index":402,"t":{"21":{"position":[[993,31]]}}}],["192.168.0.105:6655",{"_index":988,"t":{"67":{"position":[[2093,20],[3469,20]]}}}],["192.168.0.150",{"_index":2216,"t":{"297":{"position":[[1430,15]]},"301":{"position":[[2302,16],[3730,16]]}}}],["192.168.0.233:32400",{"_index":1450,"t":{"150":{"position":[[2024,22],[3039,22]]},"152":{"position":[[1089,21],[2319,22]]}}}],["192.168.0.xxx",{"_index":2262,"t":{"303":{"position":[[2345,15]]}}}],["19t10:05:42",{"_index":2864,"t":{"457":{"position":[[53,11],[140,11],[207,11]]}}}],["1:1",{"_index":2311,"t":{"311":{"position":[[238,3]]}}}],["1:50/2:40",{"_index":1331,"t":{"128":{"position":[[803,11]]}}}],["1c78da79",{"_index":3063,"t":{"524":{"position":[[553,8]]}}}],["1gb",{"_index":762,"t":{"55":{"position":[[893,6]]}}}],["1m:20",{"_index":1332,"t":{"128":{"position":[[862,7]]}}}],["1mb",{"_index":516,"t":{"29":{"position":[[675,3]]}}}],["1psidts=sidt",{"_index":2466,"t":{"343":{"position":[[1108,13]]},"345":{"position":[[1988,13],[3468,13]]}}}],["2",{"_index":551,"t":{"29":{"position":[[2444,1],[4419,1]]},"55":{"position":[[2756,2],[4175,1],[4314,1],[4581,1],[4720,1]]},"87":{"position":[[312,1],[459,3]]},"172":{"position":[[854,1],[1674,1]]},"196":{"position":[[1352,3],[2116,3]]},"301":{"position":[[2280,3],[3708,3]]},"303":{"position":[[5075,2]]},"470":{"position":[[1861,2],[2049,1],[3304,1]]}}}],["2.7",{"_index":3115,"t":{"544":{"position":[[674,3]]},"546":{"position":[[71,3]]}}}],["20",{"_index":1355,"t":{"134":{"position":[[1590,2],[1626,3]]}}}],["200",{"_index":648,"t":{"40":{"position":[[128,3]]},"544":{"position":[[703,3]]},"546":{"position":[[100,3]]},"635":{"position":[[268,3]]}}}],["2023",{"_index":2828,"t":{"448":{"position":[[953,4]]},"457":{"position":[[45,4],[132,4],[199,4]]}}}],["2025",{"_index":2581,"t":{"365":{"position":[[628,5]]},"448":{"position":[[348,5],[603,5]]}}}],["2026",{"_index":1710,"t":{"172":{"position":[[3832,4],[3948,4],[4266,4],[4387,4]]},"303":{"position":[[546,4]]},"524":{"position":[[231,5]]}}}],["21",{"_index":1681,"t":{"172":{"position":[[1708,2],[1765,2]]}}}],["22t11:16:12",{"_index":2830,"t":{"448":{"position":[[961,11]]}}}],["25",{"_index":2470,"t":{"343":{"position":[[1365,3]]}}}],["25th",{"_index":3226,"t":{"568":{"position":[[1758,4]]}}}],["26fe9c5dc6374542adc4f4d5e8352838",{"_index":1471,"t":{"152":{"position":[[910,34],[2146,34]]}}}],["28c1b7b7",{"_index":2600,"t":{"365":{"position":[[1064,8]]}}}],["29.6mb",{"_index":523,"t":{"29":{"position":[[848,6]]}}}],["2hpsnjz88n",{"_index":1849,"t":{"196":{"position":[[3511,13]]},"200":{"position":[[2136,13],[3830,13]]}}}],["2x",{"_index":206,"t":{"15":{"position":[[1609,2]]}}}],["3",{"_index":319,"t":{"15":{"position":[[5682,2]]},"29":{"position":[[2220,1],[2874,1],[3137,2],[3243,1],[3396,2],[3416,2],[4731,1],[4899,1],[4965,2],[4997,1],[5152,2],[5172,2]]},"38":{"position":[[1366,2]]},"87":{"position":[[463,3]]},"196":{"position":[[1379,3],[2183,3]]},"333":{"position":[[1889,1],[3263,1]]},"470":{"position":[[1951,2],[2132,1],[3306,1]]}}}],["3.7",{"_index":2782,"t":{"435":{"position":[[80,5]]}}}],["30",{"_index":280,"t":{"15":{"position":[[4695,3]]},"29":{"position":[[2425,2],[2957,2],[3288,2],[3373,3],[4400,2],[4813,2],[5045,2],[5129,3]]},"42":{"position":[[699,3]]}}}],["343b",{"_index":2613,"t":{"365":{"position":[[1195,4]]}}}],["35",{"_index":1844,"t":{"196":{"position":[[2850,2]]}}}],["355a",{"_index":2601,"t":{"365":{"position":[[1073,4]]}}}],["356kb",{"_index":521,"t":{"29":{"position":[[829,5]]}}}],["3600",{"_index":547,"t":{"29":{"position":[[2352,4],[4327,4]]}}}],["36759a8a",{"_index":2595,"t":{"365":{"position":[[1008,8]]}}}],["37",{"_index":3113,"t":{"544":{"position":[[637,2]]},"546":{"position":[[34,2]]}}}],["3be671f5ea2b",{"_index":1094,"t":{"85":{"position":[[1819,14],[3229,14]]},"107":{"position":[[1925,14],[3375,14]]},"150":{"position":[[1377,12],[2446,14],[3459,14]]},"152":{"position":[[1650,14],[2923,14]]},"238":{"position":[[2476,14],[3886,14]]},"265":{"position":[[2248,14],[3698,14]]},"621":{"position":[[519,14],[834,14]]}}}],["3mb",{"_index":522,"t":{"29":{"position":[[840,3]]}}}],["3rd",{"_index":1218,"t":{"109":{"position":[[1800,3]]},"470":{"position":[[2759,3]]}}}],["3s",{"_index":1737,"t":{"172":{"position":[[4659,2]]}}}],["3x",{"_index":208,"t":{"15":{"position":[[1630,2]]}}}],["4",{"_index":320,"t":{"15":{"position":[[5693,2]]},"38":{"position":[[1377,2]]},"134":{"position":[[1278,2]]},"172":{"position":[[3809,1],[3925,1],[4243,1],[4364,1]]},"196":{"position":[[1461,3],[2332,3]]},"303":{"position":[[1072,1],[4152,1]]},"470":{"position":[[2051,2]]}}}],["40",{"_index":1354,"t":{"134":{"position":[[1523,3],[1560,2]]}}}],["400",{"_index":1742,"t":{"172":{"position":[[4905,4]]}}}],["401",{"_index":2861,"t":{"454":{"position":[[58,3],[142,3]]}}}],["403",{"_index":2248,"t":{"303":{"position":[[751,3]]},"383":{"position":[[3282,3],[3294,3]]},"454":{"position":[[65,3]]}}}],["4303",{"_index":3173,"t":{"561":{"position":[[3129,4]]}}}],["4676",{"_index":2607,"t":{"365":{"position":[[1133,4]]}}}],["47da",{"_index":2597,"t":{"365":{"position":[[1022,4]]}}}],["48",{"_index":3463,"t":{"648":{"position":[[2179,2]]}}}],["48475231",{"_index":1544,"t":{"162":{"position":[[392,8]]}}}],["48b1",{"_index":2602,"t":{"365":{"position":[[1078,4]]}}}],["49d7",{"_index":3343,"t":{"638":{"position":[[714,4]]}}}],["4ac0dfa2348f",{"_index":3175,"t":{"561":{"position":[[3139,14]]}}}],["4dhe",{"_index":1292,"t":{"121":{"position":[[2402,4],[3782,4]]},"341":{"position":[[955,4],[1164,4],[1394,4],[3573,4],[5011,4]]}}}],["4pe7",{"_index":1092,"t":{"85":{"position":[[1809,4],[3219,4]]},"107":{"position":[[1915,4],[3365,4]]},"150":{"position":[[1367,4],[2436,4],[3449,4]]},"152":{"position":[[1640,4],[2913,4]]},"238":{"position":[[2466,4],[3876,4]]},"265":{"position":[[2238,4],[3688,4]]},"621":{"position":[[509,4],[824,4]]}}}],["4rft5",{"_index":697,"t":{"42":{"position":[[817,5]]}}}],["5",{"_index":76,"t":{"9":{"position":[[126,1]]},"15":{"position":[[5458,2],[5705,1]]},"29":{"position":[[2436,1],[4411,1]]},"38":{"position":[[968,2],[1389,1]]},"196":{"position":[[1625,3]]},"303":{"position":[[1077,3]]},"544":{"position":[[656,1]]},"546":{"position":[[53,1]]},"568":{"position":[[2065,24]]}}}],["50",{"_index":282,"t":{"15":{"position":[[4710,2]]},"134":{"position":[[1213,4]]},"174":{"position":[[1151,2]]}}}],["500",{"_index":651,"t":{"40":{"position":[[165,3],[335,3],[467,3],[629,3],[732,3]]}}}],["512m",{"_index":792,"t":{"55":{"position":[[2214,4]]},"59":{"position":[[813,4]]}}}],["52",{"_index":1709,"t":{"172":{"position":[[3827,2],[3943,2],[4261,2],[4382,2]]}}}],["521",{"_index":3055,"t":{"522":{"position":[[470,4]]}}}],["5353/udp",{"_index":1579,"t":{"166":{"position":[[955,9]]}}}],["6",{"_index":2896,"t":{"470":{"position":[[1859,1]]}}}],["6.28mb",{"_index":526,"t":{"29":{"position":[[1064,6]]}}}],["60",{"_index":1443,"t":{"150":{"position":[[1784,2],[2815,2]]},"154":{"position":[[2558,2],[3762,2]]},"172":{"position":[[2629,2],[2693,2]]},"198":{"position":[[495,2]]},"200":{"position":[[2396,2],[4090,2]]},"305":{"position":[[2033,2],[3507,2]]}}}],["60f84fdc0cab",{"_index":2599,"t":{"365":{"position":[[1032,12]]}}}],["61.3mb",{"_index":527,"t":{"29":{"position":[[1075,6]]}}}],["6600",{"_index":2155,"t":{"279":{"position":[[188,6]]}}}],["6644",{"_index":2140,"t":{"275":{"position":[[1594,5]]}}}],["6655:6655",{"_index":880,"t":{"55":{"position":[[7864,11]]}}}],["6680",{"_index":2175,"t":{"283":{"position":[[902,4]]}}}],["684kb",{"_index":525,"t":{"29":{"position":[[1053,5]]}}}],["6901:6901",{"_index":790,"t":{"55":{"position":[[2194,9]]},"59":{"position":[[793,9]]}}}],["6969",{"_index":3331,"t":{"635":{"position":[[673,4]]},"646":{"position":[[653,7]]}}}],["7",{"_index":309,"t":{"15":{"position":[[5469,2]]},"29":{"position":[[4197,1]]},"38":{"position":[[979,2]]}}}],["70",{"_index":1743,"t":{"172":{"position":[[4922,3]]}}}],["700",{"_index":804,"t":{"55":{"position":[[2420,3]]},"59":{"position":[[1019,3]]}}}],["75b8eb8080ef",{"_index":2604,"t":{"365":{"position":[[1088,12]]}}}],["7905",{"_index":2119,"t":{"271":{"position":[[416,5]]}}}],["7ef1",{"_index":2606,"t":{"365":{"position":[[1128,4]]}}}],["8190211179716453570",{"_index":986,"t":{"67":{"position":[[2052,22],[3428,22]]},"75":{"position":[[1022,22],[2118,22]]},"81":{"position":[[2377,21],[3795,21]]}}}],["846b",{"_index":3344,"t":{"638":{"position":[[719,4]]}}}],["882e",{"_index":2608,"t":{"365":{"position":[[1138,4]]}}}],["88e5",{"_index":1093,"t":{"85":{"position":[[1814,4],[3224,4]]},"107":{"position":[[1920,4],[3370,4]]},"150":{"position":[[1372,4],[2441,4],[3454,4]]},"152":{"position":[[1645,4],[2918,4]]},"238":{"position":[[2471,4],[3881,4]]},"265":{"position":[[2243,4],[3693,4]]},"621":{"position":[[514,4],[829,4]]}}}],["8910....6jqupl.apps.googleusercontent.com",{"_index":2482,"t":{"343":{"position":[[2647,44],[3876,44]]}}}],["891098404....apps.googleusercontent.com",{"_index":2516,"t":{"345":{"position":[[2036,42],[3516,42]]}}}],["896225281",{"_index":1545,"t":{"162":{"position":[[436,9],[813,11]]}}}],["8dcc73a59",{"_index":2835,"t":{"448":{"position":[[1082,10]]}}}],["90",{"_index":3189,"t":{"564":{"position":[[206,3],[228,2],[253,2]]}}}],["9078",{"_index":389,"t":{"21":{"position":[[316,4]]},"448":{"position":[[2259,4]]},"476":{"position":[[940,5]]},"478":{"position":[[144,4]]},"482":{"position":[[2355,5]]},"526":{"position":[[161,4]]}}}],["9078:9078",{"_index":1440,"t":{"150":{"position":[[1486,11]]},"154":{"position":[[1652,11]]},"331":{"position":[[532,11]]},"403":{"position":[[1052,11]]},"476":{"position":[[1007,11]]},"478":{"position":[[1070,9]]},"528":{"position":[[496,11]]},"557":{"position":[[2132,11]]}}}],["9156",{"_index":1091,"t":{"85":{"position":[[1804,4],[3214,4]]},"107":{"position":[[1910,4],[3360,4]]},"150":{"position":[[1362,4],[2431,4],[3444,4]]},"152":{"position":[[1635,4],[2908,4]]},"238":{"position":[[2461,4],[3871,4]]},"265":{"position":[[2233,4],[3683,4]]},"621":{"position":[[504,4],[819,4]]}}}],["9390",{"_index":2614,"t":{"365":{"position":[[1200,4]]}}}],["984e",{"_index":3172,"t":{"561":{"position":[[3124,4]]}}}],["99",{"_index":1812,"t":{"196":{"position":[[261,3]]}}}],["99/year",{"_index":1817,"t":{"196":{"position":[[511,11],[3027,10]]}}}],["9980:9980",{"_index":2416,"t":{"331":{"position":[[852,11]]}}}],["9a51",{"_index":3174,"t":{"561":{"position":[[3134,4]]}}}],["9c5bb56bd6540c756fbf481ebd9c5c40",{"_index":244,"t":{"15":{"position":[[3060,34]]}}}],["9th",{"_index":2246,"t":{"303":{"position":[[542,3]]}}}],["__secur",{"_index":2465,"t":{"343":{"position":[[1098,9]]},"345":{"position":[[1978,9],[3458,9]]}}}],["_id",{"_index":3287,"t":{"621":{"position":[[95,3]]}}}],["_name",{"_index":3312,"t":{"629":{"position":[[204,5]]}}}],["_transforms=musicbrainz",{"_index":3153,"t":{"557":{"position":[[1001,24]]}}}],["_transforms=n",{"_index":2737,"t":{"403":{"position":[[115,19]]}}}],["a0d51240",{"_index":2605,"t":{"365":{"position":[[1119,8]]}}}],["a236",{"_index":2598,"t":{"365":{"position":[[1027,4]]}}}],["a89cba1569901a0671d5a9875fed4be1",{"_index":294,"t":{"15":{"position":[[5004,35]]},"19":{"position":[[1033,35]]},"91":{"position":[[1982,35],[3454,35]]},"150":{"position":[[1635,35],[2666,35]]},"154":{"position":[[2409,35],[3613,35]]},"198":{"position":[[2965,35]]},"236":{"position":[[2294,35],[3766,35]]},"305":{"position":[[1884,35],[3358,35]]},"482":{"position":[[2075,35]]}}}],["abcc",{"_index":2612,"t":{"365":{"position":[[1190,4]]}}}],["abcd",{"_index":624,"t":{"38":{"position":[[510,6]]}}}],["abil",{"_index":2243,"t":{"303":{"position":[[355,7]]},"347":{"position":[[36,7]]},"653":{"position":[[2008,7]]}}}],["abov",{"_index":326,"t":{"17":{"position":[[28,5]]},"42":{"position":[[889,6]]},"72":{"position":[[528,5]]},"114":{"position":[[680,6]]},"172":{"position":[[1956,5],[2040,7],[3290,5],[3388,6],[3522,5],[3696,5],[4733,5]]},"188":{"position":[[20,5]]},"196":{"position":[[2787,6]]},"204":{"position":[[487,6]]},"210":{"position":[[1325,5]]},"228":{"position":[[1007,5]]},"271":{"position":[[330,6]]},"297":{"position":[[1659,5]]},"311":{"position":[[18,5]]},"351":{"position":[[33,5]]},"361":{"position":[[824,5]]},"403":{"position":[[32,5]]},"442":{"position":[[1036,5]]},"478":{"position":[[412,5]]},"499":{"position":[[398,5]]},"524":{"position":[[576,5]]},"538":{"position":[[868,5]]},"557":{"position":[[32,5]]},"561":{"position":[[728,5],[2712,5]]},"566":{"position":[[1164,5]]},"594":{"position":[[312,6]]},"610":{"position":[[377,5]]},"625":{"position":[[231,5]]},"631":{"position":[[759,6]]}}}],["above...aft",{"_index":3066,"t":{"530":{"position":[[796,13]]}}}],["absolut",{"_index":2793,"t":{"440":{"position":[[369,8]]}}}],["abstract",{"_index":2644,"t":{"379":{"position":[[325,8]]},"383":{"position":[[27,8]]}}}],["abstractcompon",{"_index":2652,"t":{"383":{"position":[[48,18]]},"638":{"position":[[1924,17]]}}}],["abstractsourc",{"_index":3395,"t":{"642":{"position":[[1230,15]]},"653":{"position":[[2702,14],[2844,14],[3522,14]]}}}],["abstractsource'",{"_index":3485,"t":{"653":{"position":[[1970,16]]}}}],["abuse/spam",{"_index":1024,"t":{"72":{"position":[[393,10]]}}}],["acc",{"_index":837,"t":{"55":{"position":[[4179,3],[4318,3],[4585,3],[4724,3]]}}}],["accept",{"_index":1030,"t":{"72":{"position":[[564,10]]},"87":{"position":[[112,6],[260,6]]},"105":{"position":[[110,6]]},"190":{"position":[[21,6]]},"220":{"position":[[39,6]]},"222":{"position":[[1315,6],[2095,6],[2643,6]]},"224":{"position":[[176,7]]},"234":{"position":[[177,6]]},"240":{"position":[[39,6],[258,6]]},"242":{"position":[[1292,6],[2078,6],[2501,6],[2623,6]]},"244":{"position":[[246,6]]},"248":{"position":[[635,6]]},"263":{"position":[[209,6]]},"271":{"position":[[42,6]]},"303":{"position":[[1825,6]]},"319":{"position":[[1453,7]]},"575":{"position":[[1514,6]]},"638":{"position":[[1948,7]]},"640":{"position":[[82,6]]}}}],["access",{"_index":708,"t":{"46":{"position":[[118,6]]},"55":{"position":[[2257,6],[5335,10]]},"59":{"position":[[856,6]]},"65":{"position":[[133,11],[709,10],[3848,10]]},"72":{"position":[[697,6]]},"79":{"position":[[133,11],[850,10],[4056,10]]},"83":{"position":[[523,6],[570,10],[1675,6]]},"93":{"position":[[409,6]]},"109":{"position":[[1316,9]]},"111":{"position":[[145,6]]},"114":{"position":[[694,6],[923,6],[1477,6]]},"116":{"position":[[1310,9]]},"128":{"position":[[461,10]]},"140":{"position":[[291,6]]},"142":{"position":[[332,6],[969,7],[1350,6]]},"144":{"position":[[447,6]]},"156":{"position":[[47,6]]},"192":{"position":[[348,8]]},"194":{"position":[[34,6]]},"196":{"position":[[17,7]]},"208":{"position":[[1525,10],[1856,10],[3501,6]]},"230":{"position":[[735,8],[917,10]]},"255":{"position":[[740,8],[922,10]]},"275":{"position":[[201,6],[429,6],[1056,6],[1377,6]]},"293":{"position":[[66,6]]},"303":{"position":[[1349,6],[1565,6],[1662,6],[2206,6],[2977,10]]},"307":{"position":[[327,9]]},"319":{"position":[[521,10],[607,11]]},"323":{"position":[[607,10],[698,9]]},"337":{"position":[[66,6]]},"343":{"position":[[1420,6],[4516,6]]},"383":{"position":[[1869,10]]},"448":{"position":[[2012,6]]},"450":{"position":[[155,6],[222,10]]},"454":{"position":[[784,6],[827,6]]},"470":{"position":[[506,6]]},"476":{"position":[[826,6]]},"530":{"position":[[540,6]]},"538":{"position":[[611,6],[658,10],[1323,6]]},"610":{"position":[[323,8]]},"635":{"position":[[656,8],[770,8]]}}}],["accident",{"_index":1691,"t":{"172":{"position":[[1903,12]]},"568":{"position":[[485,12]]}}}],["account",{"_index":207,"t":{"15":{"position":[[1620,9],[1642,8]]},"72":{"position":[[47,7]]},"83":{"position":[[60,7]]},"87":{"position":[[75,7],[1218,7],[1270,8],[1299,7],[1341,7],[1504,7]]},"91":{"position":[[375,7],[443,7]]},"93":{"position":[[67,7],[156,8],[236,8],[426,7]]},"99":{"position":[[369,7],[428,7]]},"105":{"position":[[68,7],[296,7]]},"109":{"position":[[185,8],[230,7],[878,7],[994,7]]},"111":{"position":[[28,7],[115,7]]},"114":{"position":[[68,7],[119,7],[176,8],[217,7],[1448,7],[1559,7],[1641,7]]},"116":{"position":[[183,8],[228,7],[876,7],[992,7]]},"118":{"position":[[51,8],[158,8]]},"121":{"position":[[142,7],[219,7],[276,8],[316,7],[927,7],[1006,7]]},"150":{"position":[[165,7],[407,7]]},"152":{"position":[[490,8]]},"154":{"position":[[338,7],[566,7]]},"156":{"position":[[286,8]]},"162":{"position":[[50,8],[85,8],[156,8],[193,8],[323,9],[512,7],[880,8],[1014,7],[1072,7],[1101,9],[1156,7],[1186,7]]},"164":{"position":[[429,7],[1812,9],[3252,9]]},"174":{"position":[[231,7],[271,7]]},"184":{"position":[[197,7],[265,7],[368,7],[495,7],[570,7]]},"192":{"position":[[295,8]]},"196":{"position":[[383,8],[436,9],[673,8],[727,8],[2130,7],[2921,7],[3086,8],[3405,7]]},"220":{"position":[[228,8]]},"222":{"position":[[245,7],[295,7],[2596,7],[2751,7]]},"236":{"position":[[410,7],[485,7]]},"240":{"position":[[471,8]]},"261":{"position":[[404,7],[470,7]]},"263":{"position":[[395,7]]},"295":{"position":[[588,7],[677,7]]},"303":{"position":[[510,7],[668,8],[717,7],[834,7],[1023,7],[1161,7],[1185,7],[1371,8],[1588,7],[1813,7]]},"323":{"position":[[88,8]]},"341":{"position":[[1835,7],[1921,7]]},"343":{"position":[[1810,8]]},"470":{"position":[[2633,7]]},"530":{"position":[[1290,8],[3409,7],[3513,7],[4077,8]]},"538":{"position":[[1386,7],[1490,7]]}}}],["account'",{"_index":2064,"t":{"238":{"position":[[29,9]]},"263":{"position":[[36,9]]}}}],["account/us",{"_index":2088,"t":{"255":{"position":[[1036,13]]}}}],["account?meta",{"_index":1835,"t":{"196":{"position":[[1440,13]]}}}],["accountid",{"_index":1549,"t":{"162":{"position":[[659,9],[800,12],[1138,9],[1218,10]]}}}],["accumul",{"_index":3237,"t":{"568":{"position":[[2899,11]]}}}],["accur",{"_index":1350,"t":{"134":{"position":[[976,10]]},"198":{"position":[[369,8]]},"303":{"position":[[122,10]]},"313":{"position":[[548,8]]},"315":{"position":[[100,8],[443,8]]},"470":{"position":[[59,10]]},"561":{"position":[[6588,8]]},"575":{"position":[[18,9],[1079,8],[1390,8]]}}}],["accuraci",{"_index":2244,"t":{"303":{"position":[[411,8]]},"648":{"position":[[479,8]]}}}],["achiev",{"_index":1004,"t":{"69":{"position":[[676,7]]},"361":{"position":[[424,7]]}}}],["achiv",{"_index":906,"t":{"65":{"position":[[314,6]]},"79":{"position":[[405,6]]}}}],["acquir",{"_index":1054,"t":{"81":{"position":[[290,8]]},"331":{"position":[[905,7]]}}}],["act",{"_index":935,"t":{"65":{"position":[[2635,4]]},"79":{"position":[[2810,4]]},"460":{"position":[[296,6]]}}}],["action",{"_index":411,"t":{"23":{"position":[[78,7]]},"136":{"position":[[392,6]]},"140":{"position":[[719,6]]},"210":{"position":[[819,6]]}}}],["activ",{"_index":120,"t":{"11":{"position":[[606,7],[723,6]]},"15":{"position":[[1660,8]]},"46":{"position":[[207,6]]},"48":{"position":[[268,6]]},"63":{"position":[[73,8]]},"69":{"position":[[544,7],[850,10],[900,6],[1522,6],[1551,6]]},"75":{"position":[[268,6],[503,10],[1159,11],[1280,10],[1335,8],[1380,8],[1421,8],[1479,8],[1565,8],[1659,9],[1684,8],[1790,10],[1951,9]]},"81":{"position":[[307,6],[886,8]]},"83":{"position":[[38,8]]},"87":{"position":[[39,8]]},"93":{"position":[[39,8]]},"105":{"position":[[39,8]]},"109":{"position":[[38,8]]},"116":{"position":[[38,8]]},"125":{"position":[[107,6],[140,6],[147,8],[172,6],[220,6],[227,8],[252,6],[259,8],[286,6],[293,8],[317,6],[324,8],[346,6],[353,8],[376,6],[407,6],[439,6],[518,6],[596,6],[626,6],[633,8],[676,6],[683,8],[710,6],[717,8],[739,6],[746,8],[771,6],[800,6],[807,8],[832,6],[839,8],[881,6],[888,8],[913,6],[977,6],[984,8],[1018,6],[1025,8],[1055,6],[1062,8],[1091,6]]},"128":{"position":[[168,6],[302,8],[644,8],[948,8]]},"130":{"position":[[164,8]]},"134":{"position":[[349,8],[596,9],[627,6],[663,8],[801,6],[866,8],[1089,8]]},"136":{"position":[[204,8],[377,9]]},"166":{"position":[[1635,8]]},"182":{"position":[[205,9]]},"184":{"position":[[281,8]]},"192":{"position":[[107,8]]},"220":{"position":[[201,8]]},"234":{"position":[[72,8]]},"240":{"position":[[439,8]]},"259":{"position":[[73,8]]},"279":{"position":[[270,9]]},"297":{"position":[[476,8],[507,8],[783,9],[1923,8]]},"315":{"position":[[224,6],[299,6]]},"331":{"position":[[36,8]]},"526":{"position":[[373,8]]},"530":{"position":[[86,9],[560,8],[3206,8]]},"532":{"position":[[45,8]]},"538":{"position":[[87,8]]},"540":{"position":[[624,8]]},"596":{"position":[[52,8],[124,8],[2080,8]]},"635":{"position":[[848,8]]},"640":{"position":[[969,8]]}}}],["activity/scrobbl",{"_index":1774,"t":{"182":{"position":[[130,18]]}}}],["actual",{"_index":614,"t":{"36":{"position":[[197,6]]},"69":{"position":[[891,8]]},"172":{"position":[[1858,6]]},"198":{"position":[[1644,8]]},"303":{"position":[[251,6]]},"341":{"position":[[244,6]]},"359":{"position":[[681,6]]},"431":{"position":[[34,8]]},"454":{"position":[[658,6]]},"470":{"position":[[3142,8]]},"561":{"position":[[6792,8]]},"566":{"position":[[1716,6]]},"653":{"position":[[3940,8]]}}}],["ad",{"_index":457,"t":{"25":{"position":[[429,6],[498,5]]},"136":{"position":[[603,6]]},"140":{"position":[[907,6]]},"190":{"position":[[316,6]]},"210":{"position":[[1007,6]]},"287":{"position":[[196,6]]},"323":{"position":[[271,6]]},"353":{"position":[[485,6]]},"361":{"position":[[192,5]]},"544":{"position":[[438,6],[508,6]]},"551":{"position":[[442,5]]},"568":{"position":[[2880,5]]},"573":{"position":[[633,6]]},"629":{"position":[[531,6]]}}}],["add",{"_index":597,"t":{"31":{"position":[[430,3]]},"42":{"position":[[554,3]]},"53":{"position":[[238,3]]},"55":{"position":[[1341,3],[1422,3],[1638,3],[1944,3],[2019,3],[2061,3],[6173,3],[6440,3],[8053,3],[8320,3],[9860,3]]},"59":{"position":[[21,3],[237,3],[543,3],[618,3],[660,3]]},"77":{"position":[[385,3]]},"101":{"position":[[209,3],[503,3]]},"140":{"position":[[104,3]]},"162":{"position":[[652,3]]},"196":{"position":[[2362,3],[3434,3]]},"253":{"position":[[94,3],[107,3],[529,3]]},"275":{"position":[[1675,3]]},"297":{"position":[[697,3],[968,3]]},"303":{"position":[[1138,3],[5284,3]]},"311":{"position":[[441,3]]},"323":{"position":[[97,3]]},"331":{"position":[[396,3]]},"343":{"position":[[959,3],[2082,3],[3228,3],[3712,3]]},"347":{"position":[[501,4]]},"349":{"position":[[385,4],[804,4]]},"470":{"position":[[1166,4],[1487,3]]},"476":{"position":[[2366,3]]},"503":{"position":[[172,3]]},"530":{"position":[[216,3],[837,3],[2288,4],[2660,3],[3586,3]]},"532":{"position":[[433,3],[1015,3],[1158,3],[1300,3],[1438,3],[1646,3]]},"534":{"position":[[166,3]]},"536":{"position":[[153,3],[296,3],[438,3],[576,3],[784,3]]},"538":{"position":[[905,3],[1541,3],[1967,3],[2264,3]]},"555":{"position":[[0,3],[769,4],[1204,3]]},"557":{"position":[[470,4],[566,4],[674,4],[749,4]]},"568":{"position":[[2363,3],[2797,3]]},"575":{"position":[[1249,3]]},"594":{"position":[[319,3]]},"621":{"position":[[69,3],[312,3],[596,3],[949,3],[1097,3]]},"625":{"position":[[735,3],[1288,3]]},"638":{"position":[[1152,3],[1633,3]]},"642":{"position":[[220,3],[578,3]]},"646":{"position":[[257,3]]}}}],["add/substitut",{"_index":3094,"t":{"538":{"position":[[846,14]]}}}],["addit",{"_index":323,"t":{"15":{"position":[[5850,10]]},"46":{"position":[[292,11],[356,10]]},"75":{"position":[[304,10],[1183,10]]},"109":{"position":[[2239,10]]},"136":{"position":[[288,10]]},"166":{"position":[[1449,10],[1523,10]]},"184":{"position":[[349,10]]},"208":{"position":[[721,10]]},"210":{"position":[[1663,10]]},"275":{"position":[[1118,10]]},"297":{"position":[[1515,10],[1976,10]]},"381":{"position":[[496,10]]},"383":{"position":[[859,10]]},"397":{"position":[[144,8],[734,10]]},"410":{"position":[[160,10]]},"448":{"position":[[1572,10]]},"476":{"position":[[416,10]]},"490":{"position":[[111,10]]},"551":{"position":[[354,10],[395,11],[975,10]]},"561":{"position":[[5331,10]]},"568":{"position":[[665,10]]}}}],["addition",{"_index":676,"t":{"42":{"position":[[349,13]]},"55":{"position":[[5730,13],[7116,13],[9375,13]]},"69":{"position":[[699,13]]},"75":{"position":[[211,13]]},"136":{"position":[[509,13]]},"140":{"position":[[836,13]]},"210":{"position":[[936,13]]},"522":{"position":[[390,13]]},"526":{"position":[[604,13]]},"568":{"position":[[1077,12],[1834,13]]},"646":{"position":[[213,13]]},"648":{"position":[[984,12]]},"653":{"position":[[3106,12]]}}}],["additionalallowedlibrarytyp",{"_index":1933,"t":{"208":{"position":[[906,29],[5314,32],[7143,32]]}}}],["additionalconfig",{"_index":3383,"t":{"642":{"position":[[452,19]]}}}],["additon",{"_index":2499,"t":{"343":{"position":[[5044,7]]}}}],["address",{"_index":1081,"t":{"83":{"position":[[1636,7]]},"279":{"position":[[175,7]]},"301":{"position":[[23,7],[455,7]]},"303":{"position":[[2291,7]]},"448":{"position":[[484,8],[1830,7]]},"450":{"position":[[130,7],[388,9],[458,7]]},"538":{"position":[[1284,7]]}}}],["address/ip",{"_index":2281,"t":{"303":{"position":[[4342,10]]}}}],["addsourc",{"_index":3392,"t":{"642":{"position":[[1125,9]]}}}],["adgaurd",{"_index":2858,"t":{"452":{"position":[[1048,8]]}}}],["adher",{"_index":968,"t":{"67":{"position":[[1064,7],[1712,7],[2556,7],[3076,7]]},"81":{"position":[[1305,7],[1953,7],[2839,7],[3359,7]]},"85":{"position":[[808,7],[1448,7],[2326,7],[2844,7]]},"91":{"position":[[973,7],[1617,7],[2557,7],[3076,7]]},"99":{"position":[[1071,7],[1719,7],[2618,7],[3138,7]]},"103":{"position":[[746,7],[1390,7],[2238,7],[2757,7]]},"107":{"position":[[864,7],[1532,7],[2450,7],[2975,7]]},"114":{"position":[[1996,7],[2644,7],[3553,7],[4073,7]]},"121":{"position":[[1359,7],[2003,7],[2851,7],[3370,7]]},"144":{"position":[[878,7],[1534,7],[2432,7],[2954,7]]},"164":{"position":[[899,7],[1543,7],[2451,7],[2970,7]]},"168":{"position":[[1228,7],[1888,7],[2733,7],[3256,7]]},"200":{"position":[[1115,7],[1775,7],[2937,7],[3460,7]]},"206":{"position":[[872,7],[1508,7],[2348,7],[2865,7]]},"208":{"position":[[4011,7],[4663,7],[5960,7],[6481,7]]},"212":{"position":[[735,7],[1383,7],[2183,7],[2703,7]]},"218":{"position":[[908,7],[1552,7],[2377,7],[2896,7]]},"232":{"position":[[987,7],[1651,7],[2441,7],[2965,7]]},"236":{"position":[[1029,7],[1929,7],[2869,7],[3388,7]]},"238":{"position":[[1212,7],[2105,7],[2983,7],[3501,7]]},"257":{"position":[[1060,7],[1720,7],[2519,7],[3042,7]]},"261":{"position":[[1134,7],[2041,7],[2940,7],[3460,7]]},"265":{"position":[[913,7],[1855,7],[2773,7],[3298,7]]},"269":{"position":[[788,7],[1688,7],[2536,7],[3055,7]]},"273":{"position":[[857,7],[1513,7],[2356,7],[2878,7]]},"277":{"position":[[870,7],[1510,7],[2324,7],[2842,7]]},"281":{"position":[[836,7],[1468,7],[2307,7],[2823,7]]},"289":{"position":[[1103,7],[1747,7],[2589,7],[3108,7]]},"295":{"position":[[1032,7],[1939,7],[2848,7],[3368,7]]},"301":{"position":[[1341,7],[1981,7],[2877,7],[3395,7]]},"305":{"position":[[886,7],[1534,7],[2476,7],[2996,7]]},"317":{"position":[[865,7],[1517,7],[2450,7],[2971,7]]},"321":{"position":[[755,7],[1387,7],[2177,7],[2693,7]]},"329":{"position":[[809,7],[1477,7],[2305,7],[2830,7]]},"333":{"position":[[839,7],[1491,7],[2333,7],[2854,7]]},"341":{"position":[[2274,7],[3174,7],[4080,7],[4599,7]]},"345":{"position":[[981,7],[1629,7],[2577,7],[3097,7]]},"393":{"position":[[738,7],[1394,7],[2192,7],[2714,7]]}}}],["admin",{"_index":1095,"t":{"85":{"position":[[1846,8],[3256,8]]},"101":{"position":[[255,5],[341,5]]},"150":{"position":[[2473,8],[3486,8]]},"152":{"position":[[1677,8],[2950,8]]},"208":{"position":[[413,5]]},"238":{"position":[[2503,8],[3913,8]]},"538":{"position":[[2013,5],[2099,5]]},"621":{"position":[[546,8],[861,8]]}}}],["administr",{"_index":1367,"t":{"138":{"position":[[303,14]]},"142":{"position":[[1310,14]]},"208":{"position":[[123,14]]}}}],["advanc",{"_index":210,"t":{"15":{"position":[[1746,8]]},"196":{"position":[[1759,8]]},"216":{"position":[[455,8]]},"253":{"position":[[237,8]]},"313":{"position":[[248,8]]},"542":{"position":[[9,8]]}}}],["advantag",{"_index":751,"t":{"55":{"position":[[586,10]]},"476":{"position":[[2431,9]]},"648":{"position":[[932,9],[1253,9]]}}}],["adventur",{"_index":884,"t":{"55":{"position":[[8865,12]]}}}],["affect",{"_index":111,"t":{"11":{"position":[[400,7]]},"303":{"position":[[343,6],[400,6]]},"327":{"position":[[192,7],[232,6]]},"343":{"position":[[4220,7]]},"353":{"position":[[642,6]]},"381":{"position":[[476,6]]},"557":{"position":[[541,6]]},"568":{"position":[[2936,6]]}}}],["after=network.target",{"_index":3024,"t":{"503":{"position":[[276,20]]}}}],["afterward",{"_index":596,"t":{"31":{"position":[[393,11]]},"454":{"position":[[1117,11]]}}}],["again",{"_index":1278,"t":{"118":{"position":[[369,5]]},"198":{"position":[[844,6],[983,5],[1294,5],[1558,6]]},"343":{"position":[[4663,5]]},"470":{"position":[[3198,6]]},"623":{"position":[[884,6]]}}}],["against",{"_index":38,"t":{"7":{"position":[[293,7],[566,7]]},"72":{"position":[[216,7],[998,7]]},"109":{"position":[[2006,7]]},"172":{"position":[[92,7],[3614,7],[4024,7]]},"177":{"position":[[309,8]]},"179":{"position":[[631,8]]},"188":{"position":[[335,7]]},"353":{"position":[[1590,7]]},"460":{"position":[[218,7]]},"566":{"position":[[228,7]]},"648":{"position":[[802,7]]},"653":{"position":[[2446,7],[4001,7]]}}}],["agent",{"_index":1567,"t":{"164":{"position":[[548,5]]},"309":{"position":[[27,5]]},"551":{"position":[[89,5]]}}}],["aggreg",{"_index":656,"t":{"40":{"position":[[238,10],[396,10]]}}}],["aggress",{"_index":1527,"t":{"160":{"position":[[246,12],[397,12],[464,12]]},"172":{"position":[[1139,11]]},"188":{"position":[[72,12]]},"557":{"position":[[736,10]]},"561":{"position":[[4166,10]]},"575":{"position":[[1567,12]]}}}],["aggressive/broad",{"_index":3245,"t":{"575":{"position":[[1348,16]]},"592":{"position":[[873,16]]}}}],["agnost",{"_index":1275,"t":{"118":{"position":[[115,8]]}}}],["agress",{"_index":3242,"t":{"575":{"position":[[148,11]]}}}],["aio",{"_index":129,"t":{"11":{"position":[[891,3],[984,3]]},"15":{"position":[[302,3],[1898,3],[2003,3],[3269,3],[3651,3],[3969,3],[4071,3],[4079,3],[4112,3],[5729,3],[5835,3],[6150,3]]},"19":{"position":[[19,3]]},"23":{"position":[[1424,3]]},"25":{"position":[[1038,3]]},"29":{"position":[[2455,3],[4430,3]]},"31":{"position":[[440,3]]},"38":{"position":[[218,3]]},"67":{"position":[[9,3]]},"81":{"position":[[9,3]]},"85":{"position":[[9,3]]},"91":{"position":[[9,3]]},"99":{"position":[[9,3]]},"103":{"position":[[9,3]]},"107":{"position":[[9,3]]},"114":{"position":[[1061,3]]},"121":{"position":[[585,3]]},"134":{"position":[[1427,3]]},"136":{"position":[[663,3]]},"140":{"position":[[967,3]]},"144":{"position":[[9,3]]},"150":{"position":[[464,3],[2529,3]]},"152":{"position":[[123,3],[542,3],[1733,3]]},"154":{"position":[[597,3],[1774,3],[2991,3]]},"162":{"position":[[570,3]]},"164":{"position":[[9,3]]},"168":{"position":[[9,3]]},"200":{"position":[[9,3]]},"206":{"position":[[9,3]]},"208":{"position":[[2119,3]]},"210":{"position":[[1067,3]]},"212":{"position":[[9,3]]},"218":{"position":[[9,3]]},"232":{"position":[[9,3]]},"236":{"position":[[9,3],[1796,3]]},"238":{"position":[[364,3],[1974,3]]},"257":{"position":[[9,3]]},"261":{"position":[[9,3],[1906,3]]},"265":{"position":[[9,3],[1710,3]]},"269":{"position":[[9,3],[1555,3]]},"273":{"position":[[9,3]]},"277":{"position":[[9,3]]},"281":{"position":[[9,3]]},"289":{"position":[[9,3]]},"295":{"position":[[166,3],[1804,3]]},"297":{"position":[[1355,3]]},"301":{"position":[[134,3]]},"305":{"position":[[9,3]]},"311":{"position":[[437,3],[717,3],[1194,3]]},"313":{"position":[[685,3]]},"317":{"position":[[9,3]]},"321":{"position":[[9,3]]},"329":{"position":[[9,3]]},"333":{"position":[[9,3]]},"341":{"position":[[1458,3],[3041,3]]},"345":{"position":[[9,3]]},"357":{"position":[[40,3],[457,3],[1137,3],[1972,3]]},"393":{"position":[[9,3]]},"406":{"position":[[13,3]]},"408":{"position":[[13,3]]},"551":{"position":[[193,3]]},"584":{"position":[[13,3]]},"586":{"position":[[101,3]]},"588":{"position":[[290,3]]},"590":{"position":[[198,3]]},"594":{"position":[[275,3],[476,3],[1055,3]]},"621":{"position":[[9,3]]},"625":{"position":[[146,3],[470,3],[640,3],[1261,3]]}}}],["airson",{"_index":1295,"t":{"123":{"position":[[167,9]]},"313":{"position":[[126,8],[239,8]]},"317":{"position":[[1800,9],[3265,9]]},"596":{"position":[[459,8]]}}}],["aka",{"_index":3209,"t":{"566":{"position":[[1104,3]]}}}],["album",{"_index":43,"t":{"7":{"position":[[354,5]]},"65":{"position":[[28,5],[2578,5],[2774,5],[2920,7],[3359,5]]},"67":{"position":[[652,5]]},"77":{"position":[[49,5]]},"79":{"position":[[28,5],[2753,5],[2949,5],[3095,7],[3567,5]]},"81":{"position":[[392,5],[625,5]]},"154":{"position":[[2168,8],[3367,8]]},"172":{"position":[[185,10]]},"190":{"position":[[229,5],[795,6],[1070,6]]},"198":{"position":[[1845,5],[1923,5],[2012,5],[2664,8]]},"200":{"position":[[751,5]]},"208":{"position":[[1472,5],[2084,5]]},"287":{"position":[[69,7],[118,5],[182,5],[212,5],[437,6]]},"289":{"position":[[674,5]]},"311":{"position":[[119,6]]},"319":{"position":[[1136,5],[1443,6]]},"347":{"position":[[150,5],[549,6]]},"359":{"position":[[148,5],[434,5],[448,8],[500,5]]},"363":{"position":[[580,8],[626,5],[758,8],[804,5],[923,8],[958,5],[1040,5]]},"365":{"position":[[853,5],[877,5],[932,5],[1001,6]]},"385":{"position":[[200,6]]},"399":{"position":[[326,8],[377,5]]},"412":{"position":[[243,6]]},"414":{"position":[[282,7]]},"418":{"position":[[437,6]]},"423":{"position":[[19,6],[97,7]]},"429":{"position":[[26,8]]},"470":{"position":[[2910,5]]},"544":{"position":[[667,6]]},"546":{"position":[[64,6]]},"555":{"position":[[696,8],[747,5]]},"561":{"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]]},"566":{"position":[[302,7],[365,5],[408,6],[473,5],[530,5],[796,6]]},"568":{"position":[[952,7],[1030,9],[1484,5],[1566,8],[1674,9],[1725,5],[1827,6],[1869,5],[2178,5],[2498,5],[3103,5]]},"573":{"position":[[471,6],[534,9],[884,6],[947,9]]},"575":{"position":[[179,6]]},"579":{"position":[[567,8]]},"586":{"position":[[344,9]]},"588":{"position":[[721,8]]},"590":{"position":[[441,9]]},"594":{"position":[[29,5],[740,9],[1319,9]]},"644":{"position":[[795,6]]}}}],["album/artist/titl",{"_index":3169,"t":{"561":{"position":[[2647,18]]}}}],["album/track",{"_index":2303,"t":{"309":{"position":[[317,11]]}}}],["albumartist",{"_index":2558,"t":{"359":{"position":[[375,15]]},"363":{"position":[[1046,11]]},"579":{"position":[[583,15]]},"588":{"position":[[737,15]]}}}],["albumblacklist",{"_index":2188,"t":{"287":{"position":[[355,17]]},"289":{"position":[[2130,17],[3504,17]]}}}],["albummbid",{"_index":3170,"t":{"561":{"position":[[3101,12],[3247,9]]}}}],["albumnam",{"_index":3411,"t":{"644":{"position":[[715,10],[802,10]]}}}],["albumweight",{"_index":3232,"t":{"568":{"position":[[2096,14],[2529,14],[2860,11]]},"592":{"position":[[1220,14]]}}}],["algorithm",{"_index":1659,"t":{"172":{"position":[[1057,9]]}}}],["alice.bsky.soci",{"_index":1233,"t":{"114":{"position":[[146,17],[3093,19],[4534,19]]},"121":{"position":[[246,17],[2355,20],[3735,20]]},"295":{"position":[[2388,19],[3829,19]]},"341":{"position":[[908,20],[1117,20],[1347,20],[3526,20],[4964,20]]}}}],["allow",{"_index":140,"t":{"11":{"position":[[1220,7]]},"65":{"position":[[1418,8],[1473,8],[1573,8],[1660,8],[1733,8],[1844,8],[1989,8],[2060,8],[2111,8],[2163,8],[2263,8],[2334,8],[2389,8],[2493,8]]},"67":{"position":[[544,7],[1467,7]]},"75":{"position":[[579,7],[726,7],[781,5],[1812,7],[1874,5]]},"79":{"position":[[1559,8],[1614,8],[1714,8],[1801,8],[1874,8],[1985,8],[2130,8],[2201,8],[2252,8],[2304,8],[2404,8],[2475,8],[2530,8],[2634,8]]},"81":{"position":[[517,7],[782,7],[907,7],[1708,7]]},"85":{"position":[[1207,7]]},"91":{"position":[[1374,7]]},"93":{"position":[[400,8]]},"99":{"position":[[1474,7]]},"103":{"position":[[1147,7]]},"107":{"position":[[1277,7]]},"114":{"position":[[2399,7]]},"121":{"position":[[1760,7]]},"134":{"position":[[901,6]]},"144":{"position":[[1285,7]]},"164":{"position":[[1300,7]]},"166":{"position":[[928,5],[1974,5],[2061,7],[2175,5],[2351,5]]},"168":{"position":[[1637,7]]},"170":{"position":[[47,6]]},"200":{"position":[[1524,7]]},"202":{"position":[[167,5]]},"206":{"position":[[1269,7]]},"208":{"position":[[623,7],[939,5],[1089,5],[3597,5],[4416,7]]},"212":{"position":[[1138,7]]},"218":{"position":[[1309,7]]},"222":{"position":[[3326,5]]},"232":{"position":[[1398,7]]},"236":{"position":[[1430,7]]},"238":{"position":[[1611,7]]},"242":{"position":[[3285,5]]},"257":{"position":[[1469,7]]},"261":{"position":[[1537,7]]},"265":{"position":[[1326,7]]},"269":{"position":[[1189,7]]},"273":{"position":[[1264,7]]},"277":{"position":[[1269,7]]},"281":{"position":[[1231,7]]},"285":{"position":[[32,5]]},"289":{"position":[[1504,7]]},"295":{"position":[[1435,7]]},"301":{"position":[[1740,7]]},"303":{"position":[[2238,6]]},"305":{"position":[[1289,7]]},"307":{"position":[[94,7],[398,5],[1338,7]]},"317":{"position":[[1270,7]]},"321":{"position":[[1150,7]]},"329":{"position":[[397,5],[1222,7]]},"333":{"position":[[1244,7]]},"341":{"position":[[781,8],[1207,5],[2675,7]]},"345":{"position":[[1384,7]]},"355":{"position":[[166,6]]},"357":{"position":[[1067,8]]},"383":{"position":[[351,5]]},"393":{"position":[[1145,7]]},"466":{"position":[[280,5]]},"566":{"position":[[482,7],[1217,5],[1384,5],[1800,5],[1866,5]]},"577":{"position":[[55,5],[106,5]]},"653":{"position":[[2587,8]]}}}],["allowed/deni",{"_index":2438,"t":{"341":{"position":[[469,14]]}}}],["allowmediatyp",{"_index":1938,"t":{"208":{"position":[[1133,15],[5366,18],[7195,18]]}}}],["allowunknownmedia",{"_index":1601,"t":{"166":{"position":[[2080,20],[2407,20]]}}}],["allowunknownmedia=fals",{"_index":2874,"t":{"466":{"position":[[231,24]]}}}],["along",{"_index":496,"t":{"29":{"position":[[338,5]]},"172":{"position":[[4148,5]]},"196":{"position":[[2396,5]]},"355":{"position":[[605,5]]},"478":{"position":[[939,5]]}}}],["alongsid",{"_index":2563,"t":{"361":{"position":[[230,9]]},"522":{"position":[[360,9]]},"542":{"position":[[348,9]]},"633":{"position":[[90,9]]}}}],["alphabet",{"_index":126,"t":{"11":{"position":[[835,14]]}}}],["alpin",{"_index":1585,"t":{"166":{"position":[[1120,7]]}}}],["alpine/socat",{"_index":879,"t":{"55":{"position":[[7842,12]]}}}],["alreadi",{"_index":27,"t":{"7":{"position":[[113,7]]},"19":{"position":[[1893,7]]},"83":{"position":[[129,7]]},"101":{"position":[[38,7]]},"114":{"position":[[295,7]]},"118":{"position":[[180,7]]},"121":{"position":[[398,7]]},"222":{"position":[[3010,7]]},"242":{"position":[[2962,7]]},"303":{"position":[[2680,7]]},"349":{"position":[[271,7],[414,8],[652,7],[838,7]]},"353":{"position":[[153,7],[389,7],[495,7]]},"377":{"position":[[201,7]]},"460":{"position":[[200,7]]},"497":{"position":[[140,7]]},"530":{"position":[[3141,7]]},"538":{"position":[[221,7],[1796,7]]},"544":{"position":[[393,7]]},"561":{"position":[[77,7],[169,7],[4357,7]]},"596":{"position":[[2515,7]]},"653":{"position":[[472,7],[2366,7],[2454,7]]}}}],["altern",{"_index":717,"t":{"46":{"position":[[525,11]]},"220":{"position":[[275,11]]},"303":{"position":[[2936,14]]},"313":{"position":[[325,11]]},"561":{"position":[[6461,11]]},"568":{"position":[[239,11]]}}}],["although",{"_index":1204,"t":{"109":{"position":[[707,8]]},"116":{"position":[[705,8]]}}}],["alway",{"_index":414,"t":{"23":{"position":[[146,6]]},"65":{"position":[[1125,6],[2669,6]]},"67":{"position":[[1215,6],[2707,6]]},"79":{"position":[[205,6],[1266,6],[2844,6]]},"81":{"position":[[1456,6],[2990,6]]},"85":{"position":[[959,6],[2477,6]]},"91":{"position":[[1124,6],[2708,6]]},"99":{"position":[[1222,6],[2769,6]]},"103":{"position":[[897,6],[2389,6]]},"107":{"position":[[1015,6],[2601,6]]},"114":{"position":[[2147,6],[3704,6]]},"121":{"position":[[1510,6],[3002,6]]},"136":{"position":[[743,6]]},"140":{"position":[[1047,6]]},"144":{"position":[[1029,6],[2583,6]]},"164":{"position":[[1050,6],[2602,6]]},"166":{"position":[[479,6],[1875,6],[2778,6],[2935,6]]},"168":{"position":[[1379,6],[2884,6]]},"174":{"position":[[567,6],[587,6]]},"200":{"position":[[1266,6],[3088,6]]},"206":{"position":[[1023,6],[2499,6]]},"208":{"position":[[4162,6],[6111,6]]},"210":{"position":[[1145,6]]},"212":{"position":[[886,6],[2334,6]]},"218":{"position":[[1059,6],[2528,6]]},"232":{"position":[[1138,6],[2592,6]]},"236":{"position":[[1180,6],[3020,6]]},"238":{"position":[[1363,6],[3134,6]]},"257":{"position":[[1211,6],[2670,6]]},"261":{"position":[[1285,6],[3091,6]]},"265":{"position":[[1064,6],[2924,6]]},"269":{"position":[[939,6],[2687,6]]},"273":{"position":[[1008,6],[2507,6]]},"277":{"position":[[1021,6],[2475,6]]},"281":{"position":[[987,6],[2458,6]]},"289":{"position":[[1254,6],[2740,6]]},"295":{"position":[[1183,6],[2999,6]]},"301":{"position":[[1492,6],[3028,6]]},"303":{"position":[[4917,6]]},"305":{"position":[[1037,6],[2627,6]]},"317":{"position":[[1016,6],[2601,6]]},"321":{"position":[[906,6],[2328,6]]},"329":{"position":[[960,6],[2456,6]]},"333":{"position":[[990,6],[2484,6]]},"341":{"position":[[2425,6],[4231,6]]},"345":{"position":[[1132,6],[2728,6]]},"359":{"position":[[405,6],[471,6],[532,6],[610,6]]},"363":{"position":[[1417,6]]},"381":{"position":[[41,6]]},"393":{"position":[[889,6],[2343,6]]},"399":{"position":[[348,6]]},"522":{"position":[[159,6]]},"555":{"position":[[718,6]]},"557":{"position":[[147,6]]},"561":{"position":[[705,6]]},"566":{"position":[[334,6]]},"568":{"position":[[461,6]]},"629":{"position":[[83,6]]},"653":{"position":[[231,6],[445,6],[695,6],[2619,8]]}}}],["ambplayobject",{"_index":2688,"t":{"385":{"position":[[750,13]]}}}],["amount",{"_index":486,"t":{"29":{"position":[[44,6],[593,6],[731,6],[905,6],[1192,6]]},"134":{"position":[[1230,6]]},"544":{"position":[[1463,6]]},"548":{"position":[[367,6]]}}}],["and/or",{"_index":599,"t":{"33":{"position":[[33,6]]},"109":{"position":[[2028,6]]},"130":{"position":[[50,6]]},"186":{"position":[[234,6]]},"228":{"position":[[203,6]]},"230":{"position":[[565,6]]},"255":{"position":[[570,6]]},"319":{"position":[[1436,6]]},"359":{"position":[[141,6]]},"397":{"position":[[394,6]]},"526":{"position":[[344,6],[428,6]]},"596":{"position":[[1743,6]]},"610":{"position":[[260,6]]},"638":{"position":[[2133,6]]},"648":{"position":[[1078,6]]},"653":{"position":[[39,6]]}}}],["anecdot",{"_index":3239,"t":{"573":{"position":[[164,12]]}}}],["anniversari",{"_index":3227,"t":{"568":{"position":[[1763,11]]}}}],["annot",{"_index":2948,"t":{"478":{"position":[[439,12]]},"638":{"position":[[554,10]]}}}],["anoth",{"_index":1210,"t":{"109":{"position":[[1338,7]]},"116":{"position":[[1332,7]]},"431":{"position":[[194,7],[581,7],[644,7]]},"448":{"position":[[2288,7]]},"478":{"position":[[34,7]]}}}],["anotherbadterm",{"_index":2757,"t":{"416":{"position":[[463,17],[507,16],[595,14]]}}}],["anotherus",{"_index":1967,"t":{"208":{"position":[[5162,13],[6991,13]]}}}],["any/al",{"_index":1610,"t":{"166":{"position":[[3099,7]]},"561":{"position":[[2398,7]]}}}],["anyon",{"_index":1033,"t":{"72":{"position":[[667,6]]},"303":{"position":[[1342,6]]},"307":{"position":[[311,6]]},"497":{"position":[[95,6]]}}}],["anyth",{"_index":653,"t":{"40":{"position":[[194,8]]},"69":{"position":[[1405,9]]},"99":{"position":[[2088,11],[2110,11],[3519,11],[3541,11]]},"198":{"position":[[1433,8]]},"228":{"position":[[297,8],[382,8]]},"246":{"position":[[105,8]]},"261":{"position":[[2410,11],[2432,11],[3841,11],[3863,11]]},"530":{"position":[[2007,9]]},"561":{"position":[[5385,8]]},"573":{"position":[[408,8],[821,8]]}}}],["anywher",{"_index":2544,"t":{"353":{"position":[[783,8]]},"596":{"position":[[94,9]]}}}],["apassword",{"_index":2010,"t":{"218":{"position":[[1927,11],[3284,11]]}}}],["apeen",{"_index":835,"t":{"55":{"position":[[4149,5],[4555,5]]}}}],["api",{"_index":25,"t":{"7":{"position":[[86,3]]},"23":{"position":[[54,3],[317,3],[647,3]]},"33":{"position":[[161,3]]},"36":{"position":[[204,4],[299,3],[315,3],[335,3],[347,3]]},"48":{"position":[[158,4]]},"63":{"position":[[49,3]]},"69":{"position":[[344,3],[411,3],[669,3]]},"72":{"position":[[516,3]]},"83":{"position":[[167,3],[251,3],[1034,3]]},"87":{"position":[[1245,4],[1295,3],[1337,3],[1479,3]]},"91":{"position":[[335,3]]},"93":{"position":[[232,3],[245,3],[304,4],[337,3]]},"101":{"position":[[384,3],[533,3]]},"103":{"position":[[375,3]]},"114":{"position":[[430,3],[501,3],[516,4],[575,3],[737,3],[1388,3],[1411,3]]},"125":{"position":[[876,4]]},"142":{"position":[[1279,4]]},"144":{"position":[[431,3]]},"154":{"position":[[2025,7],[3224,7]]},"158":{"position":[[153,3]]},"190":{"position":[[399,3]]},"192":{"position":[[85,3],[175,3],[344,3]]},"196":{"position":[[13,3],[114,3],[3226,3]]},"198":{"position":[[38,3],[557,3],[855,3],[1887,3]]},"200":{"position":[[542,3],[651,3]]},"208":{"position":[[49,3],[154,3],[302,3],[372,3],[618,4],[2613,3]]},"224":{"position":[[192,3],[254,4]]},"226":{"position":[[553,3]]},"228":{"position":[[210,3]]},"232":{"position":[[586,3]]},"236":{"position":[[370,3]]},"269":{"position":[[417,3]]},"273":{"position":[[488,3]]},"295":{"position":[[528,3],[551,3]]},"297":{"position":[[40,3]]},"303":{"position":[[324,4]]},"311":{"position":[[819,7],[1296,7]]},"313":{"position":[[73,3],[630,4]]},"323":{"position":[[109,3],[407,3],[500,3]]},"325":{"position":[[103,3],[376,3],[458,3]]},"333":{"position":[[450,3],[468,3]]},"343":{"position":[[1860,4],[3054,4],[3524,3]]},"357":{"position":[[407,3]]},"368":{"position":[[40,3]]},"373":{"position":[[317,3]]},"381":{"position":[[322,3]]},"391":{"position":[[396,3]]},"448":{"position":[[393,5],[648,5],[832,3]]},"462":{"position":[[36,3]]},"476":{"position":[[2497,3]]},"482":{"position":[[1617,3],[2333,3]]},"530":{"position":[[201,3],[429,3],[3405,3],[3547,3]]},"532":{"position":[[263,3]]},"538":{"position":[[259,3],[343,3],[1382,3],[2142,3]]},"544":{"position":[[1666,3]]},"551":{"position":[[45,3],[295,7],[455,3],[560,3],[864,7]]},"553":{"position":[[215,7]]},"561":{"position":[[1282,3]]},"571":{"position":[[44,3]]},"581":{"position":[[230,3]]},"584":{"position":[[115,7]]},"586":{"position":[[203,7]]},"588":{"position":[[392,7]]},"590":{"position":[[300,7]]},"592":{"position":[[524,7]]},"594":{"position":[[578,7],[1157,7]]},"596":{"position":[[448,4],[1855,4]]},"635":{"position":[[187,4],[196,4],[763,3],[832,3]]},"640":{"position":[[996,3]]},"644":{"position":[[101,3],[596,3]]},"646":{"position":[[706,8]]}}}],["api.music.apple.com/v1/me/account",{"_index":1829,"t":{"196":{"position":[[1238,33],[2048,33]]}}}],["api/health",{"_index":655,"t":{"40":{"position":[[224,13],[605,11],[715,11]]},"635":{"position":[[243,11]]}}}],["api/health?name=mymaloja",{"_index":661,"t":{"40":{"position":[[438,25]]}}}],["api/health?type=spotifi",{"_index":660,"t":{"40":{"position":[[410,24]]}}}],["api/live/nowplaying/websocket",{"_index":1371,"t":{"140":{"position":[[142,31]]}}}],["api/metr",{"_index":691,"t":{"42":{"position":[[717,14]]}}}],["api/now",{"_index":3330,"t":{"635":{"position":[[492,8]]}}}],["api/rec",{"_index":3329,"t":{"635":{"position":[[414,11]]}}}],["apikey",{"_index":238,"t":{"15":{"position":[[2692,9],[2895,9],[3050,9],[5282,9],[6026,9]]},"19":{"position":[[587,9],[1023,9]]},"91":{"position":[[1972,9],[3444,9]]},"99":{"position":[[2078,9],[3509,9]]},"103":{"position":[[1776,9],[3156,9]]},"150":{"position":[[2206,9],[3227,9]]},"152":{"position":[[720,9],[900,9],[1220,9],[1406,9],[1934,9],[2136,9],[2483,9],[2687,9]]},"154":{"position":[[2880,9],[4083,9]]},"198":{"position":[[2955,9]]},"208":{"position":[[5055,9],[6884,9]]},"236":{"position":[[2284,9],[3756,9]]},"261":{"position":[[2400,9],[3831,9]]},"269":{"position":[[2074,9],[3454,9]]},"333":{"position":[[1854,9],[3228,9]]},"482":{"position":[[2065,9],[2267,9]]},"532":{"position":[[1844,9]]},"536":{"position":[[982,9]]}}}],["apikey/us",{"_index":2017,"t":{"222":{"position":[[511,12],[551,11],[926,11],[972,11],[1324,11],[1637,12],[1664,11],[2105,11],[2519,12],[2653,14],[2712,12],[2824,12]]},"230":{"position":[[1026,12]]},"232":{"position":[[353,12]]}}}],["apis/listenbrainz",{"_index":1070,"t":{"83":{"position":[[742,18]]}}}],["app",{"_index":368,"t":{"19":{"position":[[1598,5]]},"46":{"position":[[4,3],[572,3]]},"48":{"position":[[252,3]]},"50":{"position":[[287,3]]},"53":{"position":[[26,3],[76,3]]},"69":{"position":[[306,3],[1668,3]]},"75":{"position":[[190,4],[471,4],[1248,4]]},"77":{"position":[[19,3],[121,3]]},"109":{"position":[[501,4],[566,4],[894,4],[1441,3]]},"116":{"position":[[139,3],[499,4],[564,4],[892,4],[1435,3]]},"118":{"position":[[285,3],[312,3]]},"121":{"position":[[972,3]]},"162":{"position":[[280,5]]},"166":{"position":[[640,3],[2368,3]]},"194":{"position":[[124,4]]},"208":{"position":[[260,3]]},"232":{"position":[[1926,5],[3248,5]]},"303":{"position":[[685,3],[1053,3],[1134,3],[1324,3],[1654,4],[1716,3],[1914,3],[1987,3],[2842,4],[5209,4]]},"341":{"position":[[1887,3]]},"365":{"position":[[668,5]]},"373":{"position":[[291,3]]},"440":{"position":[[105,3]]},"442":{"position":[[95,4],[1062,3]]},"448":{"position":[[105,3],[387,5],[642,5],[987,4]]},"457":{"position":[[78,5],[84,3],[166,5],[233,5]]},"466":{"position":[[17,3]]},"478":{"position":[[132,3]]},"484":{"position":[[98,3]]},"530":{"position":[[595,3]]},"596":{"position":[[13,3],[1216,4],[1757,3],[1947,4]]}}}],["app'",{"_index":2287,"t":{"303":{"position":[[5254,5]]}}}],["app.rockski",{"_index":1208,"t":{"109":{"position":[[1238,14]]}}}],["appdata%\\multi",{"_index":2972,"t":{"482":{"position":[[1237,15]]}}}],["appear",{"_index":1840,"t":{"196":{"position":[[2151,7]]},"198":{"position":[[1038,7]]},"470":{"position":[[831,6]]}}}],["append",{"_index":1209,"t":{"109":{"position":[[1271,8]]},"114":{"position":[[388,6]]},"116":{"position":[[1265,8]]},"121":{"position":[[534,6]]},"198":{"position":[[1891,7]]},"383":{"position":[[615,6]]},"391":{"position":[[367,6]]},"442":{"position":[[1005,6]]}}}],["appic",{"_index":1240,"t":{"114":{"position":[[505,10]]}}}],["appl",{"_index":1301,"t":{"125":{"position":[[95,5]]},"192":{"position":[[26,5],[73,5],[163,5]]},"194":{"position":[[108,5]]},"196":{"position":[[102,5],[325,5],[367,5],[420,5],[487,5],[826,5],[2664,5],[2905,5],[3003,5],[3214,5],[3245,5],[3389,5]]},"198":{"position":[[26,5],[537,5],[1875,5],[2760,5]]},"200":{"position":[[530,5],[629,5],[2066,5],[3760,5]]},"596":{"position":[[151,5]]}}}],["applealbumstip",{"_index":1883,"t":{"198":{"position":[[2632,17],[3179,17]]}}}],["applemus",{"_index":1900,"t":{"200":{"position":[[862,10],[1073,10],[1417,10],[1501,10],[1733,10],[2718,10],[2914,10],[3437,10],[4196,12]]}}}],["applemusic.json",{"_index":1841,"t":{"196":{"position":[[2426,15],[3468,15]]},"198":{"position":[[2706,15]]}}}],["applemusic_en",{"_index":1888,"t":{"200":{"position":[[267,17]]}}}],["applemusic_id",{"_index":1886,"t":{"200":{"position":[[127,13],[218,13]]}}}],["applemusic_interv",{"_index":1860,"t":{"198":{"position":[[453,21]]}}}],["applemusic_key_id",{"_index":1889,"t":{"200":{"position":[[329,17]]}}}],["applemusic_key_p8",{"_index":1891,"t":{"200":{"position":[[380,17]]}}}],["applemusic_media_user_token",{"_index":1892,"t":{"200":{"position":[[405,27]]}}}],["applemusic_nam",{"_index":1887,"t":{"200":{"position":[[186,15]]}}}],["applemusic_normalize_album",{"_index":1898,"t":{"200":{"position":[[678,26]]}}}],["applemusic_normalize_album=fals",{"_index":1881,"t":{"198":{"position":[[2232,32]]}}}],["applemusic_origin_head",{"_index":1894,"t":{"200":{"position":[[464,24]]}}}],["applemusic_recover_unchanged_top_histori",{"_index":1895,"t":{"200":{"position":[[555,40]]}}}],["applemusic_recover_unchanged_top_history=fals",{"_index":1877,"t":{"198":{"position":[[1789,46]]}}}],["applemusic_team_id",{"_index":1890,"t":{"200":{"position":[[354,18]]}}}],["applemusic_token",{"_index":1893,"t":{"200":{"position":[[440,16]]}}}],["appli",{"_index":427,"t":{"23":{"position":[[638,8]]},"154":{"position":[[1371,7]]},"198":{"position":[[2426,7]]},"236":{"position":[[1787,5]]},"238":{"position":[[1965,5]]},"261":{"position":[[1897,5]]},"265":{"position":[[1701,5]]},"269":{"position":[[1546,5]]},"295":{"position":[[1795,5]]},"341":{"position":[[3032,5]]},"359":{"position":[[41,5],[230,5],[309,5],[412,5],[478,5],[539,5],[617,5]]},"399":{"position":[[181,5],[260,5],[355,5]]},"403":{"position":[[50,7],[169,5],[195,7],[841,7]]},"499":{"position":[[404,5]]},"555":{"position":[[551,5],[630,5],[725,5]]},"557":{"position":[[337,6],[372,8],[806,7],[920,7],[1060,5],[1086,7],[1882,7]]},"579":{"position":[[13,5],[234,8]]},"625":{"position":[[105,7]]}}}],["applic",{"_index":1,"t":{"2":{"position":[[15,11]]},"7":{"position":[[481,11]]},"46":{"position":[[45,11],[241,11]]},"48":{"position":[[126,11],[290,11]]},"50":{"position":[[186,11]]},"53":{"position":[[149,12],[190,11]]},"55":{"position":[[51,11],[175,12],[448,12],[551,11],[3468,11],[3841,12]]},"67":{"position":[[288,11]]},"69":{"position":[[217,11]]},"77":{"position":[[235,11],[296,12],[337,11]]},"79":{"position":[[156,11],[444,11],[2681,11],[3465,11],[4096,11]]},"81":{"position":[[361,11]]},"87":{"position":[[142,12]]},"105":{"position":[[140,12]]},"109":{"position":[[1346,11]]},"114":{"position":[[434,12],[1415,12]]},"116":{"position":[[1340,11]]},"134":{"position":[[441,11]]},"158":{"position":[[374,12]]},"166":{"position":[[1715,11],[1834,11],[2214,12],[2246,11],[2539,11],[2598,11],[2748,11],[2889,12]]},"168":{"position":[[687,11],[805,11]]},"194":{"position":[[259,11]]},"208":{"position":[[2986,11],[3110,11]]},"220":{"position":[[69,12],[643,11]]},"226":{"position":[[287,11]]},"234":{"position":[[207,12]]},"240":{"position":[[69,12]]},"263":{"position":[[239,12]]},"295":{"position":[[555,12]]},"303":{"position":[[555,12]]},"313":{"position":[[32,11]]},"323":{"position":[[206,11]]},"343":{"position":[[2188,11],[2212,11]]},"377":{"position":[[128,11]]},"452":{"position":[[1151,11]]},"530":{"position":[[814,11]]},"557":{"position":[[198,12]]},"602":{"position":[[15,11]]},"610":{"position":[[395,10]]}}}],["applicationid",{"_index":736,"t":{"53":{"position":[[342,16]]},"67":{"position":[[2035,16],[3411,16]]},"75":{"position":[[1005,16],[2101,16]]},"77":{"position":[[489,16]]},"81":{"position":[[2360,16],[3778,16]]}}}],["apppassword",{"_index":1289,"t":{"121":{"position":[[2376,14],[3756,14]]},"341":{"position":[[929,14],[1138,14],[1368,14],[3547,14],[4985,14]]}}}],["appriori",{"_index":1389,"t":{"142":{"position":[[236,11]]}}}],["appris",{"_index":635,"t":{"38":{"position":[[1395,8],[1564,10]]},"596":{"position":[[839,8]]}}}],["appriseconfig",{"_index":636,"t":{"38":{"position":[[1435,13]]}}}],["approach",{"_index":750,"t":{"55":{"position":[[480,8]]},"196":{"position":[[793,9]]},"303":{"position":[[4600,8],[5046,9]]}}}],["appropri",{"_index":2481,"t":{"343":{"position":[[2553,11]]},"577":{"position":[[280,11]]}}}],["aproperti",{"_index":3002,"t":{"492":{"position":[[714,11]]}}}],["aqzi58fa.rfszbm",{"_index":631,"t":{"38":{"position":[[925,18]]}}}],["arch",{"_index":760,"t":{"55":{"position":[[858,4]]},"501":{"position":[[128,5]]}}}],["architectur",{"_index":2978,"t":{"482":{"position":[[1414,12]]},"614":{"position":[[9,12]]}}}],["archiv",{"_index":918,"t":{"65":{"position":[[1043,7],[2563,7],[2724,7],[3024,7],[3384,7]]},"79":{"position":[[1184,7],[2738,7],[2899,7],[3199,7],[3592,7]]},"594":{"position":[[61,7]]}}}],["archivetun",{"_index":2018,"t":{"222":{"position":[[675,11],[1105,11],[1872,11]]}}}],["aren't",{"_index":847,"t":{"55":{"position":[[4899,6]]},"142":{"position":[[1303,6]]}}}],["arg",{"_index":2693,"t":{"389":{"position":[[21,4]]},"440":{"position":[[295,5]]}}}],["arl",{"_index":1506,"t":{"158":{"position":[[4,3],[103,3],[270,3],[505,4],[718,3]]},"160":{"position":[[325,6]]},"162":{"position":[[139,3],[764,6],[985,3],[1040,3],[1152,3]]},"164":{"position":[[331,3],[1883,6],[3323,6]]}}}],["arm64",{"_index":2920,"t":{"474":{"position":[[56,5]]}}}],["around",{"_index":1718,"t":{"172":{"position":[[4087,6]]}}}],["arrang",{"_index":1649,"t":{"172":{"position":[[656,8]]}}}],["array",{"_index":223,"t":{"15":{"position":[[2412,5]]},"40":{"position":[[521,5]]},"210":{"position":[[1823,5]]},"363":{"position":[[1137,5]]},"365":{"position":[[210,5],[351,5]]},"418":{"position":[[21,5]]}}}],["arriv",{"_index":1765,"t":{"177":{"position":[[207,6]]}}}],["art",{"_index":903,"t":{"65":{"position":[[34,3],[310,3],[1039,3],[2559,3],[2584,4],[2720,3],[2780,3],[2792,3],[2984,4],[3020,3],[3365,3],[3380,3]]},"67":{"position":[[658,3]]},"77":{"position":[[61,3]]},"79":{"position":[[34,3],[196,3],[401,3],[1180,3],[2734,3],[2759,4],[2895,3],[2955,3],[2967,3],[3159,4],[3195,3],[3573,3],[3588,3]]},"81":{"position":[[398,3],[631,3]]},"208":{"position":[[1478,3],[2090,4]]},"594":{"position":[[35,3],[57,3]]}}}],["artist",{"_index":42,"t":{"7":{"position":[[341,8]]},"154":{"position":[[1022,6],[2295,8],[3494,8]]},"172":{"position":[[177,7],[1155,8],[1207,7],[1253,6],[1301,6],[1390,7],[1845,7],[4417,7],[4958,6]]},"190":{"position":[[210,8],[622,6],[634,6],[753,6],[784,6],[829,6],[841,6],[1028,6],[1059,6],[1216,6]]},"220":{"position":[[430,7],[467,6],[495,7]]},"287":{"position":[[478,7],[493,6],[565,7],[580,6]]},"297":{"position":[[290,6],[439,8]]},"313":{"position":[[172,7],[596,8]]},"319":{"position":[[1117,7],[1423,6],[1701,6],[1755,6]]},"347":{"position":[[137,8],[446,6],[531,6],[607,6]]},"355":{"position":[[296,7],[318,6]]},"357":{"position":[[728,11],[1291,11],[1391,7],[2243,11],[2508,11]]},"359":{"position":[[133,7],[262,10],[331,7],[440,7]]},"363":{"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]]},"365":{"position":[[833,7],[859,8],[1056,7]]},"385":{"position":[[191,8]]},"395":{"position":[[60,7],[188,7],[259,7],[270,6],[315,7],[371,7],[442,6],[496,7],[561,7],[783,10],[901,10]]},"397":{"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]]},"399":{"position":[[213,10],[282,7]]},"406":{"position":[[284,11]]},"410":{"position":[[42,7]]},"412":{"position":[[292,7],[305,6],[361,6]]},"414":{"position":[[303,10],[325,8]]},"418":{"position":[[429,7]]},"421":{"position":[[87,6],[328,9]]},"427":{"position":[[26,10]]},"429":{"position":[[58,9]]},"431":{"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],[682,10]]},"462":{"position":[[50,6],[141,8],[263,6],[281,6]]},"466":{"position":[[179,6],[328,6]]},"470":{"position":[[3008,7]]},"530":{"position":[[1551,7]]},"532":{"position":[[761,7]]},"534":{"position":[[494,7]]},"544":{"position":[[687,7],[1064,8],[1080,6],[1247,6],[1324,8],[1345,6]]},"546":{"position":[[84,7],[461,8]]},"548":{"position":[[151,6],[228,8],[249,6]]},"555":{"position":[[583,10],[652,7]]},"557":{"position":[[689,7],[697,8],[1720,6]]},"561":{"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]]},"568":{"position":[[1500,6],[1533,10],[1852,7],[2194,6],[2624,6],[3050,6]]},"573":{"position":[[258,6],[640,6],[658,8],[729,7],[1062,6],[1125,10]]},"575":{"position":[[171,7],[485,6],[574,6],[611,7],[686,10],[788,7],[813,6],[868,10]]},"579":{"position":[[549,10]]},"586":{"position":[[469,9]]},"588":{"position":[[703,10]]},"590":{"position":[[73,6],[566,9]]},"592":{"position":[[924,9]]},"594":{"position":[[865,9],[1444,9]]},"644":{"position":[[772,8]]}}}],["artist(",{"_index":3168,"t":{"561":{"position":[[2599,10],[2957,10],[3341,10]]}}}],["artist/album/titl",{"_index":3185,"t":{"561":{"position":[[6952,18]]}}}],["artist/album/track",{"_index":1978,"t":{"210":{"position":[[329,18]]}}}],["artist/title/album",{"_index":2548,"t":{"355":{"position":[[219,18],[432,18]]},"561":{"position":[[5998,19]]}}}],["artist/track",{"_index":1664,"t":{"172":{"position":[[1361,12]]},"395":{"position":[[78,12]]}}}],["artist/track/album",{"_index":1694,"t":{"172":{"position":[[2876,18]]}}}],["artistnam",{"_index":3410,"t":{"644":{"position":[[703,11],[781,13]]}}}],["artists(",{"_index":3166,"t":{"561":{"position":[[2455,11]]}}}],["artists/album",{"_index":2011,"t":{"220":{"position":[[416,13]]}}}],["artists/album/titl",{"_index":1479,"t":{"154":{"position":[[257,19]]},"588":{"position":[[53,21]]}}}],["artists/title/album",{"_index":3253,"t":{"579":{"position":[[146,19]]}}}],["artistsignor",{"_index":2729,"t":{"397":{"position":[[360,13]]},"408":{"position":[[129,16]]}}}],["artistsparsefrom",{"_index":2551,"t":{"357":{"position":[[708,19],[1271,19],[1421,19],[2223,19],[2488,19]]},"397":{"position":[[500,16],[916,16],[1424,16],[1516,19],[1586,19],[1640,19],[1679,19]]},"406":{"position":[[264,19]]}}}],["artistsparsemonolithiconli",{"_index":2732,"t":{"397":{"position":[[1001,26]]}}}],["artistweight",{"_index":3233,"t":{"568":{"position":[[2119,15],[2656,15]]},"592":{"position":[[1262,15]]}}}],["artwork",{"_index":904,"t":{"65":{"position":[[259,7],[361,8],[652,7],[969,7],[991,7],[1054,7],[1088,7],[1191,7],[1274,10],[3418,7],[3442,7],[3481,7],[3528,7]]},"67":{"position":[[486,7]]},"79":{"position":[[350,7],[502,8],[793,7],[1110,7],[1132,7],[1195,7],[1229,7],[1332,7],[1415,10],[3626,7],[3650,7],[3689,7],[3736,7],[4172,7],[4266,7]]},"81":{"position":[[459,7]]}}}],["artworkdefaulturl",{"_index":944,"t":{"65":{"position":[[3764,20]]},"79":{"position":[[3972,20]]}}}],["ascii",{"_index":1640,"t":{"172":{"position":[[324,5],[364,5]]}}}],["asid",{"_index":999,"t":{"69":{"position":[[552,5]]}}}],["ask",{"_index":2494,"t":{"343":{"position":[[4471,4]]}}}],["aspect",{"_index":2641,"t":{"379":{"position":[[41,7]]},"633":{"position":[[116,7]]}}}],["asset",{"_index":1942,"t":{"208":{"position":[[1371,5],[1482,6]]}}}],["assist",{"_index":2085,"t":{"253":{"position":[[14,9],[43,9],[481,10],[519,9]]},"596":{"position":[[391,9]]}}}],["associ",{"_index":482,"t":{"27":{"position":[[398,10]]},"162":{"position":[[202,10]]},"222":{"position":[[1709,10]]},"242":{"position":[[1689,10]]},"257":{"position":[[680,9]]},"341":{"position":[[434,10]]},"566":{"position":[[29,10],[1587,10]]},"588":{"position":[[106,11]]},"619":{"position":[[87,10],[133,11]]},"621":{"position":[[1192,10]]},"623":{"position":[[355,10]]}}}],["assum",{"_index":509,"t":{"29":{"position":[[556,8],[690,8],[855,8]]},"198":{"position":[[231,7]]},"236":{"position":[[1712,6]]},"238":{"position":[[1891,6]]},"253":{"position":[[453,8]]},"261":{"position":[[1821,6]]},"265":{"position":[[1620,6]]},"269":{"position":[[1471,6]]},"295":{"position":[[1719,6]]},"307":{"position":[[1071,9]]},"341":{"position":[[2957,6]]},"359":{"position":[[987,7]]},"448":{"position":[[1674,6]]},"516":{"position":[[0,9],[289,8]]},"530":{"position":[[717,8],[2218,8]]},"551":{"position":[[674,7]]},"644":{"position":[[834,8],[864,8]]},"651":{"position":[[862,8]]}}}],["assumpt",{"_index":2568,"t":{"361":{"position":[[830,11]]}}}],["assur",{"_index":2255,"t":{"303":{"position":[[1275,6]]}}}],["async",{"_index":2658,"t":{"383":{"position":[[880,5]]},"642":{"position":[[446,5],[1137,5]]},"646":{"position":[[741,5],[1695,5],[2342,5]]},"648":{"position":[[1762,5]]},"651":{"position":[[675,5]]}}}],["asynchron",{"_index":1222,"t":{"109":{"position":[[1964,14]]},"383":{"position":[[335,12]]}}}],["atlu",{"_index":3223,"t":{"568":{"position":[[1544,7]]}}}],["atmospher",{"_index":1190,"t":{"109":{"position":[[174,10],[219,10],[867,10]]},"111":{"position":[[17,10],[104,10]]},"114":{"position":[[57,10]]},"116":{"position":[[172,10],[217,10],[865,10]]},"118":{"position":[[40,10]]},"121":{"position":[[131,10]]}}}],["atom",{"_index":3285,"t":{"619":{"position":[[145,6]]}}}],["atproto",{"_index":1258,"t":{"116":{"position":[[54,7]]},"121":{"position":[[4,7],[150,7]]},"335":{"position":[[29,7],[160,7]]}}}],["atproto.at",{"_index":1272,"t":{"116":{"position":[[1986,10]]},"341":{"position":[[612,10]]}}}],["atproto/blueski",{"_index":1254,"t":{"114":{"position":[[1625,15]]},"295":{"position":[[661,15]]}}}],["attach",{"_index":2700,"t":{"389":{"position":[[171,6]]},"492":{"position":[[435,9]]}}}],["attempt",{"_index":1661,"t":{"172":{"position":[[1180,8]]},"188":{"position":[[499,7]]},"309":{"position":[[69,8]]},"319":{"position":[[1098,7]]},"383":{"position":[[2835,7],[3302,7]]},"397":{"position":[[1101,7]]},"482":{"position":[[916,7]]},"561":{"position":[[3708,7]]},"573":{"position":[[1084,7]]},"575":{"position":[[1580,7]]},"623":{"position":[[644,7],[847,7]]}}}],["attribut",{"_index":3190,"t":{"566":{"position":[[18,10],[164,10],[564,11],[582,10],[1170,10]]},"568":{"position":[[116,9],[622,11],[647,9],[2922,10]]}}}],["attribute_nam",{"_index":3196,"t":{"566":{"position":[[593,15]]}}}],["attribute_name]allow",{"_index":3210,"t":{"566":{"position":[[1316,21]]}}}],["attribute_name]deni",{"_index":3211,"t":{"566":{"position":[[1346,20]]}}}],["attribute_name]prior",{"_index":3219,"t":{"568":{"position":[[814,24]]}}}],["audio",{"_index":1937,"t":{"208":{"position":[[1079,6],[1241,6],[1312,6],[5387,7],[7216,7]]},"210":{"position":[[1656,6]]},"297":{"position":[[940,5]]}}}],["audiobook",{"_index":1936,"t":{"208":{"position":[[1006,11]]}}}],["auser",{"_index":2009,"t":{"218":{"position":[[1906,8],[3263,8]]}}}],["auserw",{"_index":2381,"t":{"325":{"position":[[191,10],[357,7]]}}}],["auth",{"_index":419,"t":{"23":{"position":[[277,4],[821,4],[846,4],[1033,4],[1217,4],[1387,4],[1538,7]]},"55":{"position":[[2906,4]]},"61":{"position":[[130,4]]},"91":{"position":[[618,4]]},"99":{"position":[[606,4]]},"226":{"position":[[224,4],[299,4],[443,4],[605,4]]},"236":{"position":[[674,4]]},"261":{"position":[[662,4]]},"303":{"position":[[1523,4],[1539,4],[5503,4]]},"343":{"position":[[4329,4],[5360,4]]},"373":{"position":[[179,4]]},"383":{"position":[[1946,5],[1969,4],[2192,4],[2314,4],[2602,4],[2626,4],[3095,4],[3334,4]]},"625":{"position":[[955,4],[979,4],[1071,4],[1211,4],[1363,4],[1401,4],[1475,7]]},"638":{"position":[[397,4],[629,4]]},"640":{"position":[[112,4],[877,4]]},"646":{"position":[[2057,5],[2090,4]]}}}],["auth.cach",{"_index":433,"t":{"23":{"position":[[954,11]]}}}],["authent",{"_index":378,"t":{"21":{"position":[[67,14]]},"23":{"position":[[327,14]]},"40":{"position":[[590,14],[649,13]]},"55":{"position":[[3144,14],[5580,14],[6966,14],[9225,14]]},"61":{"position":[[368,14]]},"65":{"position":[[919,14]]},"72":{"position":[[67,12]]},"79":{"position":[[1060,14]]},"89":{"position":[[86,14]]},"93":{"position":[[374,14]]},"95":{"position":[[86,14]]},"109":{"position":[[453,12]]},"116":{"position":[[451,12]]},"142":{"position":[[1006,14]]},"192":{"position":[[311,14]]},"194":{"position":[[573,14]]},"196":{"position":[[53,14]]},"208":{"position":[[459,12],[595,13],[2480,12],[2573,12],[2624,12]]},"214":{"position":[[232,14]]},"218":{"position":[[446,15],[526,15]]},"222":{"position":[[1339,12],[2120,12]]},"226":{"position":[[351,14]]},"230":{"position":[[999,14]]},"242":{"position":[[1310,12],[2096,12]]},"246":{"position":[[37,14]]},"255":{"position":[[1004,14]]},"303":{"position":[[459,12],[1384,14],[2463,14],[3348,15],[3597,15],[4061,12],[4501,15]]},"307":{"position":[[202,13],[602,13],[776,13],[978,13],[1090,13],[1268,13]]},"323":{"position":[[770,14]]},"343":{"position":[[489,15],[750,14],[1225,14],[4650,12],[4777,14],[4881,14],[4926,12],[5002,14],[5145,14],[5225,14]]},"383":{"position":[[2383,14],[2538,14],[2671,14],[2849,13],[2954,14]]},"450":{"position":[[269,14]]},"454":{"position":[[176,15],[234,15],[267,14],[440,15],[469,14],[563,15],[841,13],[1135,12]]},"530":{"position":[[676,14]]},"540":{"position":[[485,14]]},"600":{"position":[[326,12]]},"602":{"position":[[242,12]]},"623":{"position":[[1388,15]]},"635":{"position":[[311,13]]},"640":{"position":[[791,14]]}}}],["authentication/configur",{"_index":2254,"t":{"303":{"position":[[1229,28]]}}}],["author",{"_index":1508,"t":{"158":{"position":[[121,10]]},"192":{"position":[[332,11]]},"196":{"position":[[3,9],[1543,13],[2250,13]]},"257":{"position":[[551,13]]},"303":{"position":[[1426,13],[1554,10],[2114,14]]},"343":{"position":[[2015,10],[2101,10],[2257,13],[2296,10],[3199,10],[3739,10],[4121,10]]},"345":{"position":[[367,10]]},"383":{"position":[[3205,13]]},"530":{"position":[[1252,9],[1341,13],[4039,9],[4128,13]]},"596":{"position":[[1194,13]]},"610":{"position":[[242,9]]},"635":{"position":[[385,13]]}}}],["auto",{"_index":1300,"t":{"125":{"position":[[79,4]]},"140":{"position":[[628,4]]},"210":{"position":[[728,4]]},"596":{"position":[[1139,4]]}}}],["autom",{"_index":2518,"t":{"347":{"position":[[75,9]]},"440":{"position":[[43,9]]}}}],["automat",{"_index":82,"t":{"9":{"position":[[193,13]]},"23":{"position":[[980,9]]},"27":{"position":[[217,13]]},"55":{"position":[[3070,13],[3495,13],[3637,14],[6679,13],[8555,13],[10071,13]]},"61":{"position":[[294,13]]},"65":{"position":[[3109,13]]},"69":{"position":[[1349,13]]},"79":{"position":[[3284,13]]},"114":{"position":[[374,13]]},"121":{"position":[[520,13]]},"136":{"position":[[213,14],[759,13],[807,13]]},"140":{"position":[[90,13],[1466,13],[1553,9]]},"166":{"position":[[812,13]]},"196":{"position":[[556,13],[2955,14],[3154,13]]},"210":{"position":[[518,13],[588,9],[708,9],[1762,9],[2197,13]]},"307":{"position":[[142,13]]},"343":{"position":[[4609,14]]},"391":{"position":[[353,13]]},"401":{"position":[[96,13]]},"414":{"position":[[453,13]]},"480":{"position":[[70,13]]},"505":{"position":[[254,13]]},"512":{"position":[[188,13]]},"522":{"position":[[290,13]]},"530":{"position":[[1321,13],[4108,13]]},"542":{"position":[[505,13]]},"621":{"position":[[985,13]]},"623":{"position":[[655,13],[1193,13]]},"653":{"position":[[2122,13]]}}}],["automix",{"_index":2241,"t":{"303":{"position":[[12,7],[47,7]]}}}],["automonitor",{"_index":1364,"t":{"136":{"position":[[821,14]]},"140":{"position":[[1147,14],[1177,11]]},"210":{"position":[[1245,14]]}}}],["avahi",{"_index":1580,"t":{"166":{"position":[[1038,5],[1167,5],[1205,5],[1250,5]]}}}],["avail",{"_index":259,"t":{"15":{"position":[[4032,9],[4058,9]]},"17":{"position":[[146,9],[204,9]]},"36":{"position":[[97,9]]},"40":{"position":[[60,9]]},"42":{"position":[[32,9]]},"55":{"position":[[840,9]]},"63":{"position":[[151,9]]},"65":{"position":[[2676,9]]},"79":{"position":[[2851,9]]},"136":{"position":[[31,9]]},"168":{"position":[[137,9]]},"179":{"position":[[549,12]]},"275":{"position":[[1576,9]]},"315":{"position":[[488,10]]},"331":{"position":[[1384,9]]},"343":{"position":[[5061,9],[5287,9]]},"397":{"position":[[0,9]]},"474":{"position":[[80,9]]},"542":{"position":[[318,9]]},"561":{"position":[[1811,9],[2406,9]]},"596":{"position":[[1389,9]]}}}],["averag",{"_index":502,"t":{"29":{"position":[[464,7]]}}}],["avoid",{"_index":67,"t":{"7":{"position":[[792,6]]},"23":{"position":[[760,5]]},"55":{"position":[[1010,5]]},"196":{"position":[[3172,5]]},"297":{"position":[[464,5]]},"460":{"position":[[412,5]]},"476":{"position":[[1893,5]]},"551":{"position":[[3,5]]},"575":{"position":[[1871,5]]}}}],["await",{"_index":3396,"t":{"642":{"position":[[1332,5]]},"646":{"position":[[1778,5],[2375,5]]},"648":{"position":[[1945,5]]},"651":{"position":[[761,5]]}}}],["awar",{"_index":593,"t":{"31":{"position":[[231,5]]},"303":{"position":[[4695,6]]},"575":{"position":[[1332,5]]}}}],["azura_en",{"_index":1399,"t":{"144":{"position":[[252,12]]}}}],["azura_id",{"_index":1397,"t":{"144":{"position":[[127,8],[208,8]]}}}],["azura_key",{"_index":1401,"t":{"144":{"position":[[414,9]]}}}],["azura_l",{"_index":1380,"t":{"140":{"position":[[1333,11]]},"144":{"position":[[508,10]]}}}],["azura_listeners_num",{"_index":1382,"t":{"140":{"position":[[1383,20]]},"144":{"position":[[481,19]]}}}],["azura_nam",{"_index":1398,"t":{"144":{"position":[[181,10]]}}}],["azura_st",{"_index":1386,"t":{"142":{"position":[[69,13]]},"144":{"position":[[309,13]]}}}],["azura_url",{"_index":1400,"t":{"144":{"position":[[362,9]]}}}],["azuracast",{"_index":1303,"t":{"125":{"position":[[130,9]]},"138":{"position":[[21,9],[222,9]]},"140":{"position":[[33,9]]},"142":{"position":[[159,9],[1041,10],[1328,10]]},"144":{"position":[[395,9],[627,9],[837,9],[1180,9],[1263,9],[1493,9],[1798,12],[2215,9],[2410,9],[2932,9],[3228,12]]},"596":{"position":[[163,9]]}}}],["azuracast.json",{"_index":1363,"t":{"136":{"position":[[675,14]]},"140":{"position":[[979,14]]}}}],["b",{"_index":1650,"t":{"172":{"position":[[808,2],[913,2]]},"198":{"position":[[778,2],[803,2],[881,2],[1269,3]]},"238":{"position":[[2379,3],[3789,3]]},"440":{"position":[[266,1],[360,1]]}}}],["b2c4",{"_index":2603,"t":{"365":{"position":[[1083,4]]}}}],["back",{"_index":478,"t":{"27":{"position":[[231,6]]},"179":{"position":[[439,6]]},"198":{"position":[[685,4],[1007,4]]},"303":{"position":[[3854,4]]},"309":{"position":[[187,4]]},"343":{"position":[[4402,4]]},"470":{"position":[[3026,4]]},"512":{"position":[[202,6]]},"575":{"position":[[2041,4]]}}}],["backend",{"_index":1393,"t":{"142":{"position":[[885,10]]},"283":{"position":[[204,7]]},"373":{"position":[[68,7],[94,7],[328,7]]}}}],["background",{"_index":1822,"t":{"196":{"position":[[861,10]]},"480":{"position":[[91,11]]}}}],["backlog",{"_index":1749,"t":{"172":{"position":[[5124,11]]},"174":{"position":[[1092,10]]},"651":{"position":[[266,11],[582,10]]}}}],["backslash",{"_index":2778,"t":{"431":{"position":[[511,9]]}}}],["backup",{"_index":1415,"t":{"150":{"position":[[434,6]]},"186":{"position":[[461,8]]},"512":{"position":[[241,6],[311,6],[467,6]]}}}],["backward",{"_index":1857,"t":{"198":{"position":[[195,10]]}}}],["bad",{"_index":2187,"t":{"287":{"position":[[178,3],[301,3]]},"412":{"position":[[172,3]]},"575":{"position":[[537,3]]}}}],["bad/incomplet",{"_index":1613,"t":{"166":{"position":[[3218,14]]}}}],["bad\\w+/i",{"_index":2755,"t":{"416":{"position":[[246,11]]}}}],["badmus",{"_index":1973,"t":{"208":{"position":[[5300,10],[7129,10]]}}}],["badsometh",{"_index":2756,"t":{"416":{"position":[[267,12]]}}}],["badterm",{"_index":2753,"t":{"414":{"position":[[747,7],[772,9]]},"416":{"position":[[107,9],[126,7]]},"418":{"position":[[231,9],[252,10]]}}}],["bais",{"_index":3151,"t":{"557":{"position":[[862,6]]}}}],["balanc",{"_index":3140,"t":{"551":{"position":[[552,7]]}}}],["ballad",{"_index":1705,"t":{"172":{"position":[[3797,7],[3913,7],[4231,7],[4352,7]]}}}],["band",{"_index":2718,"t":{"395":{"position":[[336,4]]},"544":{"position":[[1409,4]]},"548":{"position":[[313,4]]},"561":{"position":[[4595,6],[4656,4],[4930,6]]}}}],["bandcamp",{"_index":2169,"t":{"283":{"position":[[123,9]]}}}],["bar",{"_index":1516,"t":{"158":{"position":[[496,3]]},"190":{"position":[[641,3],[791,3],[848,3],[1066,3]]},"196":{"position":[[1982,3]]},"395":{"position":[[323,3]]},"397":{"position":[[1455,4],[1574,5],[1635,4]]},"492":{"position":[[738,5]]}}}],["barterm",{"_index":2765,"t":{"418":{"position":[[318,9],[360,9]]}}}],["base",{"_index":39,"t":{"7":{"position":[[310,5]]},"11":{"position":[[799,5]]},"15":{"position":[[530,5],[1468,5],[3655,5]]},"27":{"position":[[446,5]]},"29":{"position":[[96,5]]},"33":{"position":[[202,5]]},"55":{"position":[[409,5]]},"65":{"position":[[93,5]]},"75":{"position":[[606,5]]},"79":{"position":[[93,5]]},"83":{"position":[[714,4],[856,4],[904,4],[968,4],[1008,4]]},"89":{"position":[[124,4],[590,4]]},"95":{"position":[[124,4],[584,4]]},"134":{"position":[[62,5],[220,5],[1159,5],[1323,5]]},"140":{"position":[[246,5],[1269,5],[1488,5]]},"144":{"position":[[379,4]]},"160":{"position":[[188,5]]},"166":{"position":[[789,5],[2118,5],[2715,5]]},"168":{"position":[[160,5]]},"172":{"position":[[2238,5],[3410,5]]},"210":{"position":[[426,5],[1481,5],[1696,5],[1780,5]]},"222":{"position":[[47,5],[472,4],[877,4],[1787,4],[2875,4],[2904,4],[3067,4],[3234,4]]},"224":{"position":[[220,4]]},"228":{"position":[[695,4],[843,4],[927,4],[1017,4]]},"230":{"position":[[61,4],[133,4]]},"232":{"position":[[392,4],[418,4]]},"242":{"position":[[47,5],[463,4],[866,4],[1772,4],[2831,4],[2860,4],[3020,4],[3188,4]]},"244":{"position":[[61,4]]},"248":{"position":[[101,5],[155,4],[453,4],[585,4]]},"253":{"position":[[255,4]]},"255":{"position":[[61,4],[133,4]]},"257":{"position":[[385,4],[411,4]]},"297":{"position":[[143,5],[1209,5]]},"309":{"position":[[204,5]]},"319":{"position":[[1567,5]]},"323":{"position":[[458,5]]},"325":{"position":[[139,5]]},"341":{"position":[[129,4]]},"343":{"position":[[1730,5],[3316,4]]},"361":{"position":[[109,5]]},"383":{"position":[[36,4],[1165,4],[2002,5]]},"389":{"position":[[153,5]]},"391":{"position":[[515,4]]},"448":{"position":[[26,5]]},"470":{"position":[[625,5],[2557,6]]},"476":{"position":[[19,4],[1239,4]]},"478":{"position":[[215,4]]},"551":{"position":[[593,4]]},"561":{"position":[[1426,5]]},"568":{"position":[[719,5],[1107,5],[1348,5]]},"575":{"position":[[1175,5],[1264,5],[2012,5],[2052,5]]},"623":{"position":[[180,5]]},"633":{"position":[[161,5]]},"635":{"position":[[54,5]]},"640":{"position":[[398,4],[538,4]]},"642":{"position":[[73,5]]},"648":{"position":[[1207,5]]}}}],["base_url",{"_index":383,"t":{"21":{"position":[[199,8],[613,8],[847,8]]},"526":{"position":[[582,8]]}}}],["base_url:port/lastfm/callback",{"_index":391,"t":{"21":{"position":[[517,29]]}}}],["base_url=http://192.168.0.100:9078",{"_index":2951,"t":{"478":{"position":[[809,34]]},"528":{"position":[[365,34]]}}}],["base_url=http://hostmachineip",{"_index":2930,"t":{"476":{"position":[[1412,29]]}}}],["baseurl",{"_index":384,"t":{"21":{"position":[[211,7]]},"638":{"position":[[852,8]]},"642":{"position":[[743,8]]},"646":{"position":[[162,7],[245,7],[418,9],[818,7],[991,8],[1012,7],[1045,7],[1257,8],[1266,12],[1327,10]]}}}],["baseurl.trim",{"_index":3429,"t":{"646":{"position":[[1069,14]]}}}],["bash",{"_index":2786,"t":{"440":{"position":[[14,4]]},"482":{"position":[[653,4]]}}}],["basic",{"_index":211,"t":{"15":{"position":[[1822,5]]},"55":{"position":[[1241,9],[2900,5]]},"57":{"position":[[9,9]]},"61":{"position":[[124,5]]},"65":{"position":[[2933,10]]},"79":{"position":[[3108,10]]},"154":{"position":[[1013,5],[2286,8],[3485,8]]},"166":{"position":[[423,5]]},"303":{"position":[[5260,5]]},"311":{"position":[[1168,8],[1654,8]]},"383":{"position":[[3089,5]]},"532":{"position":[[719,5]]},"534":{"position":[[452,5]]},"557":{"position":[[659,5],[1711,5]]},"561":{"position":[[1797,5],[2360,7],[2635,9]]},"573":{"position":[[1116,8]]},"586":{"position":[[460,8]]},"592":{"position":[[914,9],[1159,8]]},"596":{"position":[[1038,5]]},"653":{"position":[[1916,5]]}}}],["basic\",\"freetext",{"_index":3165,"t":{"561":{"position":[[1671,19]]}}}],["basicorid",{"_index":2320,"t":{"311":{"position":[[1154,13],[1640,13]]},"557":{"position":[[646,10]]},"561":{"position":[[2675,12],[2993,14]]},"575":{"position":[[1030,11],[1901,10]]}}}],["baz",{"_index":2717,"t":{"395":{"position":[[332,3]]}}}],["be",{"_index":739,"t":{"55":{"position":[[198,5],[1211,5]]},"87":{"position":[[1032,5]]},"109":{"position":[[950,5]]},"116":{"position":[[948,5]]},"130":{"position":[[85,5]]},"160":{"position":[[629,5]]},"172":{"position":[[1916,5]]},"190":{"position":[[494,5]]},"198":{"position":[[1612,5]]},"234":{"position":[[416,5]]},"259":{"position":[[302,5]]},"319":{"position":[[1014,5]]},"341":{"position":[[555,5]]},"343":{"position":[[259,5],[5055,5]]},"353":{"position":[[119,5],[357,5],[1479,5],[1575,5]]},"454":{"position":[[1002,5]]},"568":{"position":[[2330,5]]},"596":{"position":[[2054,5]]},"625":{"position":[[76,5]]},"653":{"position":[[209,5],[2176,5]]}}}],["be9f354075cb",{"_index":2609,"t":{"365":{"position":[[1143,12]]}}}],["beam",{"_index":2236,"t":{"301":{"position":[[2345,6],[3773,6]]}}}],["bearer",{"_index":1837,"t":{"196":{"position":[[1604,6],[2311,6]]},"383":{"position":[[3072,6]]}}}],["becom",{"_index":1347,"t":{"134":{"position":[[815,7]]},"172":{"position":[[1572,7],[1739,7]]}}}],["bedroom",{"_index":2240,"t":{"301":{"position":[[2429,9],[3857,9]]}}}],["befor",{"_index":20,"t":{"7":{"position":[[0,6]]},"9":{"position":[[158,6]]},"15":{"position":[[1049,6]]},"87":{"position":[[750,6],[1164,6]]},"134":{"position":[[840,6]]},"154":{"position":[[491,6]]},"188":{"position":[[560,6]]},"196":{"position":[[1636,6]]},"198":{"position":[[331,6]]},"222":{"position":[[3168,6]]},"230":{"position":[[111,6]]},"242":{"position":[[3122,6]]},"255":{"position":[[111,6]]},"319":{"position":[[2230,6]]},"343":{"position":[[3046,7]]},"347":{"position":[[282,6],[823,6]]},"351":{"position":[[61,6]]},"353":{"position":[[203,6],[438,6]]},"379":{"position":[[461,6]]},"385":{"position":[[659,6]]},"448":{"position":[[1386,6]]},"468":{"position":[[0,6]]},"470":{"position":[[3288,6]]},"488":{"position":[[380,6]]},"499":{"position":[[0,6]]},"510":{"position":[[202,6],[437,6]]},"512":{"position":[[212,6]]},"514":{"position":[[118,6]]},"522":{"position":[[189,6]]},"532":{"position":[[142,6]]},"561":{"position":[[19,6],[4436,6]]},"575":{"position":[[2026,6]]},"581":{"position":[[260,6]]},"612":{"position":[[63,6]]},"623":{"position":[[4,6]]},"629":{"position":[[524,6]]},"631":{"position":[[333,6]]},"633":{"position":[[191,6]]},"648":{"position":[[2908,6]]},"653":{"position":[[2930,6]]}}}],["begin",{"_index":1806,"t":{"194":{"position":[[557,6]]},"196":{"position":[[3561,5]]},"200":{"position":[[2186,5],[3880,5]]},"343":{"position":[[3016,9],[5468,5]]},"349":{"position":[[83,9]]},"530":{"position":[[1315,5],[4102,5]]},"561":{"position":[[29,6]]},"566":{"position":[[1851,5]]}}}],["behalf",{"_index":1002,"t":{"69":{"position":[[634,8]]}}}],["behav",{"_index":2853,"t":{"452":{"position":[[557,8]]},"488":{"position":[[458,8]]}}}],["behavior",{"_index":102,"t":{"11":{"position":[[214,8],[432,8],[948,8]]},"134":{"position":[[401,8]]},"136":{"position":[[554,8]]},"140":{"position":[[644,8],[873,8],[1260,8],[1663,9]]},"166":{"position":[[3272,8]]},"190":{"position":[[1362,8]]},"198":{"position":[[1698,8],[2195,8]]},"210":{"position":[[663,8],[744,8],[973,8],[1306,9]]},"327":{"position":[[210,8],[261,8]]},"357":{"position":[[1114,9]]},"361":{"position":[[610,9]]},"381":{"position":[[483,9]]},"397":{"position":[[1411,8]]},"470":{"position":[[2182,9],[3078,8]]},"518":{"position":[[160,8],[221,8]]},"592":{"position":[[380,8]]},"640":{"position":[[117,9]]},"648":{"position":[[259,8]]}}}],["behind",{"_index":1201,"t":{"109":{"position":[[683,6]]},"116":{"position":[[681,6]]},"196":{"position":[[803,6]]},"230":{"position":[[638,6]]},"255":{"position":[[643,6]]},"303":{"position":[[2712,6],[2988,6]]},"391":{"position":[[442,6]]}}}],["bell",{"_index":3325,"t":{"635":{"position":[[136,5]]}}}],["belong",{"_index":2036,"t":{"228":{"position":[[531,7]]},"248":{"position":[[299,7]]},"301":{"position":[[796,7],[939,7]]},"566":{"position":[[93,7],[448,7]]}}}],["below",{"_index":115,"t":{"11":{"position":[[458,7]]},"15":{"position":[[4478,5]]},"25":{"position":[[899,6]]},"29":{"position":[[2309,5],[4284,5]]},"55":{"position":[[1948,5],[2023,5],[2081,5],[3681,6],[3708,5],[7276,5]]},"59":{"position":[[547,5],[622,5],[680,5]]},"65":{"position":[[252,6],[1327,5]]},"67":{"position":[[2389,6]]},"79":{"position":[[343,6],[1468,5]]},"81":{"position":[[2672,6]]},"83":{"position":[[450,5],[948,5]]},"85":{"position":[[2161,6]]},"89":{"position":[[560,6]]},"91":{"position":[[2391,6]]},"95":{"position":[[554,6]]},"99":{"position":[[2451,6]]},"101":{"position":[[586,6]]},"103":{"position":[[2072,6]]},"107":{"position":[[2278,6]]},"114":{"position":[[3386,6]]},"118":{"position":[[96,5]]},"121":{"position":[[2685,6]]},"142":{"position":[[219,5]]},"144":{"position":[[2263,6]]},"158":{"position":[[248,5]]},"164":{"position":[[2285,6]]},"166":{"position":[[3420,5]]},"168":{"position":[[2563,6]]},"172":{"position":[[5298,5]]},"196":{"position":[[626,6],[1024,6]]},"200":{"position":[[2767,6]]},"202":{"position":[[302,6]]},"206":{"position":[[2184,6]]},"208":{"position":[[341,5],[5792,6]]},"212":{"position":[[2016,6]]},"214":{"position":[[336,6]]},"218":{"position":[[2211,6]]},"222":{"position":[[41,5]]},"232":{"position":[[2270,6]]},"234":{"position":[[484,6]]},"236":{"position":[[2703,6]]},"238":{"position":[[2818,6]]},"242":{"position":[[41,5]]},"257":{"position":[[2349,6]]},"259":{"position":[[370,6]]},"261":{"position":[[2773,6]]},"265":{"position":[[2601,6]]},"269":{"position":[[2370,6]]},"273":{"position":[[2187,6]]},"277":{"position":[[2159,6]]},"281":{"position":[[2144,6]]},"289":{"position":[[2423,6]]},"295":{"position":[[2681,6]]},"299":{"position":[[71,5]]},"301":{"position":[[2712,6]]},"303":{"position":[[984,5],[5385,5]]},"305":{"position":[[2309,6]]},"307":{"position":[[485,5]]},"311":{"position":[[416,6]]},"317":{"position":[[2282,6]]},"321":{"position":[[2014,6]]},"329":{"position":[[2133,6]]},"333":{"position":[[2165,6]]},"341":{"position":[[3914,6]]},"345":{"position":[[2410,6]]},"383":{"position":[[281,5],[445,6]]},"393":{"position":[[2023,6]]},"431":{"position":[[287,6]]},"442":{"position":[[38,5],[639,5]]},"478":{"position":[[972,5]]},"503":{"position":[[185,5]]},"526":{"position":[[597,6]]},"528":{"position":[[433,5]]},"530":{"position":[[3382,6]]},"532":{"position":[[180,6],[1689,6]]},"536":{"position":[[827,6]]},"538":{"position":[[542,5],[764,5]]},"557":{"position":[[453,6]]}}}],["benchmark",{"_index":500,"t":{"29":{"position":[[440,9]]}}}],["benefici",{"_index":451,"t":{"25":{"position":[[226,10]]}}}],["benefit",{"_index":415,"t":{"23":{"position":[[153,7]]},"25":{"position":[[200,8]]},"544":{"position":[[495,7]]},"579":{"position":[[205,7]]},"588":{"position":[[93,7]]},"596":{"position":[[2792,7]]}}}],["best",{"_index":1811,"t":{"196":{"position":[[252,4]]},"210":{"position":[[315,4]]},"454":{"position":[[713,4]]},"559":{"position":[[122,4]]},"568":{"position":[[425,4]]}}}],["better",{"_index":158,"t":{"15":{"position":[[259,6]]},"188":{"position":[[467,6]]},"297":{"position":[[205,6]]},"478":{"position":[[982,6]]},"488":{"position":[[179,6]]},"499":{"position":[[533,7]]},"577":{"position":[[422,6]]}}}],["between",{"_index":87,"t":{"9":{"position":[[304,7]]},"50":{"position":[[279,7]]},"69":{"position":[[298,7]]},"198":{"position":[[1450,8]]},"228":{"position":[[338,7]]},"347":{"position":[[655,7]]},"365":{"position":[[506,7]]},"379":{"position":[[88,7]]},"431":{"position":[[432,7]]},"452":{"position":[[56,7]]},"464":{"position":[[230,7]]},"470":{"position":[[677,7],[934,7]]},"472":{"position":[[23,7]]},"518":{"position":[[412,7]]},"581":{"position":[[452,7]]}}}],["bia",{"_index":3258,"t":{"592":{"position":[[1171,4]]}}}],["bidirection",{"_index":868,"t":{"55":{"position":[[5880,15],[7437,15]]},"275":{"position":[[1451,15]]}}}],["bind",{"_index":459,"t":{"25":{"position":[[562,4]]},"476":{"position":[[77,4]]}}}],["bind_to_address",{"_index":2153,"t":{"279":{"position":[[129,15]]}}}],["blackheart",{"_index":1675,"t":{"172":{"position":[[1545,12],[1640,12]]}}}],["blacklist",{"_index":1576,"t":{"166":{"position":[[626,9]]},"277":{"position":[[1861,12],[3207,12]]},"285":{"position":[[286,9]]},"329":{"position":[[1839,12],[3199,12]]}}}],["blacklistedapp",{"_index":1626,"t":{"168":{"position":[[2242,18],[3619,18]]}}}],["blacklisteddevic",{"_index":1624,"t":{"168":{"position":[[2190,21],[3567,21]]}}}],["blank",{"_index":2478,"t":{"343":{"position":[[2290,5],[2396,5]]}}}],["bleed",{"_index":3052,"t":{"520":{"position":[[78,8]]}}}],["block",{"_index":2209,"t":{"297":{"position":[[985,7]]},"329":{"position":[[317,5]]},"357":{"position":[[98,6]]},"492":{"position":[[533,6]]}}}],["blueski",{"_index":1206,"t":{"109":{"position":[[958,8],[1477,7]]},"114":{"position":[[111,7],[168,7],[267,7]]},"116":{"position":[[956,8],[1471,7]]},"118":{"position":[[69,8],[132,8],[150,7]]},"121":{"position":[[211,7],[268,7],[366,7]]},"291":{"position":[[135,10]]},"293":{"position":[[81,7]]},"337":{"position":[[81,7]]}}}],["bodi",{"_index":3445,"t":{"646":{"position":[[2573,4]]},"648":{"position":[[2056,5]]},"651":{"position":[[881,4],[973,4]]}}}],["body.map(x",{"_index":3474,"t":{"651":{"position":[[1000,10]]}}}],["bold/ital",{"_index":961,"t":{"67":{"position":[[717,11]]},"81":{"position":[[958,11]]},"85":{"position":[[465,11]]},"91":{"position":[[628,11]]},"99":{"position":[[724,11]]},"103":{"position":[[401,11]]},"107":{"position":[[507,11]]},"114":{"position":[[1649,11]]},"121":{"position":[[1014,11]]},"144":{"position":[[527,11]]},"164":{"position":[[554,11]]},"168":{"position":[[875,11]]},"200":{"position":[[762,11]]},"206":{"position":[[531,11]]},"208":{"position":[[3662,11]]},"212":{"position":[[388,11]]},"218":{"position":[[563,11]]},"232":{"position":[[632,11]]},"236":{"position":[[684,11]]},"238":{"position":[[869,11]]},"257":{"position":[[707,11]]},"261":{"position":[[787,11]]},"265":{"position":[[556,11]]},"269":{"position":[[443,11]]},"273":{"position":[[506,11]]},"277":{"position":[[527,11]]},"281":{"position":[[497,11]]},"289":{"position":[[758,11]]},"295":{"position":[[685,11]]},"301":{"position":[[998,11]]},"305":{"position":[[539,11]]},"317":{"position":[[516,11]]},"321":{"position":[[416,11]]},"329":{"position":[[452,11]]},"333":{"position":[[490,11]]},"341":{"position":[[1929,11]]},"345":{"position":[[634,11]]},"393":{"position":[[387,11]]}}}],["bonet",{"_index":1685,"t":{"172":{"position":[[1732,6],[1788,5]]}}}],["bonu",{"_index":1724,"t":{"172":{"position":[[4445,5],[4478,5]]}}}],["book",{"_index":1935,"t":{"208":{"position":[[997,4],[1255,4]]}}}],["boolean",{"_index":361,"t":{"19":{"position":[[1332,9]]},"67":{"position":[[445,7],[455,7],[598,7]]},"81":{"position":[[418,7],[428,7],[571,7]]},"85":{"position":[[265,7]]},"91":{"position":[[269,7]]},"99":{"position":[[273,7]]},"103":{"position":[[269,7]]},"107":{"position":[[253,7]]},"114":{"position":[[1325,7]]},"121":{"position":[[845,7]]},"144":{"position":[[265,7],[519,7]]},"164":{"position":[[269,7]]},"168":{"position":[[348,7]]},"200":{"position":[[285,7],[596,7],[705,7]]},"206":{"position":[[261,7]]},"208":{"position":[[2387,7]]},"212":{"position":[[273,7],[380,7]]},"218":{"position":[[269,7]]},"232":{"position":[[257,7]]},"236":{"position":[[297,7]]},"238":{"position":[[648,7]]},"257":{"position":[[257,7]]},"261":{"position":[[301,7]]},"265":{"position":[[281,7]]},"269":{"position":[[297,7]]},"273":{"position":[[253,7]]},"277":{"position":[[265,7]]},"281":{"position":[[257,7]]},"289":{"position":[[269,7]]},"295":{"position":[[458,7]]},"301":{"position":[[390,7]]},"305":{"position":[[273,7]]},"317":{"position":[[277,7]]},"321":{"position":[[257,7]]},"329":{"position":[[253,7]]},"333":{"position":[[277,7]]},"341":{"position":[[1746,7]]},"345":{"position":[[257,7]]},"393":{"position":[[265,7]]},"397":{"position":[[1030,7]]},"399":{"position":[[29,8]]},"555":{"position":[[262,8]]}}}],["boom",{"_index":2235,"t":{"301":{"position":[[2274,5],[3702,5]]}}}],["bootleg",{"_index":3192,"t":{"566":{"position":[[387,7],[706,8]]}}}],["both",{"_index":562,"t":{"29":{"position":[[3052,4]]},"67":{"position":[[1251,4],[1424,4],[2743,4]]},"81":{"position":[[1492,4],[1665,4],[3026,4]]},"85":{"position":[[995,4],[1166,4],[2513,4]]},"91":{"position":[[1160,4],[1332,4],[2744,4]]},"99":{"position":[[1258,4],[1431,4],[2805,4]]},"103":{"position":[[933,4],[1105,4],[2425,4]]},"107":{"position":[[1051,4],[1229,4],[2637,4]]},"114":{"position":[[2183,4],[2356,4],[3740,4]]},"121":{"position":[[1546,4],[1718,4],[3038,4]]},"144":{"position":[[1065,4],[1240,4],[2619,4]]},"164":{"position":[[1086,4],[1258,4],[2638,4]]},"168":{"position":[[1415,4],[1591,4],[2920,4]]},"177":{"position":[[352,4]]},"200":{"position":[[1302,4],[1478,4],[3124,4]]},"206":{"position":[[1059,4],[1229,4],[2535,4]]},"208":{"position":[[4198,4],[4372,4],[6147,4]]},"212":{"position":[[922,4],[1095,4],[2370,4]]},"218":{"position":[[1095,4],[1267,4],[2564,4]]},"230":{"position":[[376,4]]},"232":{"position":[[1174,4],[1351,4],[2628,4]]},"236":{"position":[[1216,4],[1388,4],[3056,4]]},"238":{"position":[[1399,4],[1570,4],[3170,4]]},"242":{"position":[[3006,4]]},"255":{"position":[[376,4]]},"257":{"position":[[1247,4],[1423,4],[2706,4]]},"261":{"position":[[1321,4],[1494,4],[3127,4]]},"265":{"position":[[1100,4],[1278,4],[2960,4]]},"269":{"position":[[975,4],[1147,4],[2723,4]]},"271":{"position":[[130,4]]},"273":{"position":[[1044,4],[1219,4],[2543,4]]},"277":{"position":[[1057,4],[1228,4],[2511,4]]},"281":{"position":[[1023,4],[1192,4],[2494,4]]},"289":{"position":[[1290,4],[1462,4],[2776,4]]},"295":{"position":[[1219,4],[1392,4],[3035,4]]},"301":{"position":[[1528,4],[1699,4],[3064,4]]},"305":{"position":[[1073,4],[1246,4],[2663,4]]},"317":{"position":[[1052,4],[1226,4],[2637,4]]},"321":{"position":[[942,4],[1111,4],[2364,4]]},"329":{"position":[[996,4],[1174,4],[2492,4]]},"333":{"position":[[1026,4],[1200,4],[2520,4]]},"341":{"position":[[2461,4],[2633,4],[4267,4]]},"345":{"position":[[1168,4],[1341,4],[2764,4]]},"351":{"position":[[146,4]]},"379":{"position":[[96,5],[397,4]]},"385":{"position":[[490,4]]},"393":{"position":[[925,4],[1100,4],[2379,4]]},"397":{"position":[[613,5],[631,4]]},"442":{"position":[[215,4]]},"460":{"position":[[306,4]]},"559":{"position":[[362,4]]},"619":{"position":[[404,4]]}}}],["bottom",{"_index":1061,"t":{"83":{"position":[[229,7]]},"196":{"position":[[1830,7]]},"319":{"position":[[129,6],[449,6]]},"538":{"position":[[321,7]]}}}],["bowl",{"_index":2723,"t":{"395":{"position":[[794,9],[912,9]]},"561":{"position":[[3080,9],[4547,9],[4613,7],[4879,9],[5497,9],[5593,8],[5717,9]]},"575":{"position":[[697,9],[879,9]]}}}],["box",{"_index":1827,"t":{"196":{"position":[[1190,3]]},"319":{"position":[[427,3]]},"568":{"position":[[1788,3]]}}}],["boz",{"_index":2770,"t":{"427":{"position":[[51,4],[76,4]]}}}],["brainz",{"_index":2594,"t":{"365":{"position":[[994,6],[1049,6],[1105,6],[1160,6]]}}}],["brainzclient",{"_index":1186,"t":{"107":{"position":[[1823,15],[3273,15]]}}}],["brainzsourc",{"_index":2110,"t":{"265":{"position":[[2146,15],[3596,15]]}}}],["branch",{"_index":2784,"t":{"437":{"position":[[8,6]]},"482":{"position":[[114,6]]},"520":{"position":[[19,6],[173,9],[243,6]]},"522":{"position":[[320,6]]},"524":{"position":[[468,7],[509,6]]}}}],["brand",{"_index":2476,"t":{"343":{"position":[[1996,8]]}}}],["break",{"_index":757,"t":{"55":{"position":[[797,5]]},"156":{"position":[[167,8]]},"196":{"position":[[3786,6]]},"510":{"position":[[280,8]]},"514":{"position":[[24,8]]},"518":{"position":[[122,8],[255,8],[349,8]]},"522":{"position":[[257,8]]},"631":{"position":[[77,8],[517,10]]},"642":{"position":[[704,6],[1009,6],[1025,6],[1294,6],[1433,6],[1449,6]]}}}],["breakdown",{"_index":56,"t":{"7":{"position":[[555,10]]},"172":{"position":[[4169,9]]}}}],["bridg",{"_index":2400,"t":{"331":{"position":[[158,7],[207,6],[581,7],[962,6],[1073,6]]},"333":{"position":[[365,7],[483,6]]},"476":{"position":[[739,6],[1136,6]]}}}],["bridge:9980",{"_index":2403,"t":{"331":{"position":[[452,11]]},"333":{"position":[[405,11]]}}}],["bridge:latest",{"_index":2406,"t":{"331":{"position":[[628,13]]}}}],["broadcast",{"_index":1040,"t":{"75":{"position":[[480,12],[1257,12],[1823,9],[1926,12]]},"81":{"position":[[918,9]]},"142":{"position":[[832,10]]},"210":{"position":[[451,11]]},"349":{"position":[[427,10]]}}}],["broken",{"_index":1320,"t":{"128":{"position":[[50,6]]}}}],["brother",{"_index":1672,"t":{"172":{"position":[[1509,8],[1615,9]]}}}],["brows",{"_index":1259,"t":{"116":{"position":[[130,8]]},"343":{"position":[[949,9]]},"454":{"position":[[121,7]]},"470":{"position":[[2971,7]]}}}],["browser",{"_index":747,"t":{"55":{"position":[[401,7],[2184,7],[2793,7]]},"59":{"position":[[783,7]]},"61":{"position":[[17,7]]},"89":{"position":[[53,7],[348,10]]},"95":{"position":[[53,7],[348,10]]},"142":{"position":[[567,8]]},"158":{"position":[[13,7]]},"194":{"position":[[159,7]]},"196":{"position":[[216,7],[633,7],[1016,7],[2655,8],[2800,7],[3103,7]]},"208":{"position":[[3477,7]]},"303":{"position":[[2084,7],[3160,7],[3538,7],[3750,7]]},"319":{"position":[[579,7]]},"323":{"position":[[464,8],[518,8]]},"343":{"position":[[207,8],[804,8],[3117,7]]},"389":{"position":[[159,7]]},"450":{"position":[[242,7],[349,7]]},"454":{"position":[[665,7],[692,8],[1109,7]]},"476":{"position":[[1336,8]]},"596":{"position":[[1725,7]]}}}],["browser'",{"_index":1799,"t":{"194":{"position":[[189,9]]}}}],["bsky.soci",{"_index":1236,"t":{"114":{"position":[[395,12]]},"121":{"position":[[541,12]]}}}],["bu",{"_index":1589,"t":{"166":{"position":[[1238,3]]}}}],["bug",{"_index":2212,"t":{"297":{"position":[[1147,3],[2008,3]]},"499":{"position":[[435,3]]},"518":{"position":[[237,5]]}}}],["bug/error",{"_index":3010,"t":{"499":{"position":[[107,9]]}}}],["buggi",{"_index":887,"t":{"55":{"position":[[9009,5]]}}}],["build",{"_index":1630,"t":{"170":{"position":[[61,5]]},"383":{"position":[[779,5]]},"401":{"position":[[110,6]]},"414":{"position":[[467,6]]},"440":{"position":[[84,8]]},"442":{"position":[[77,5],[617,5]]},"482":{"position":[[299,5],[1321,5],[1341,8],[1487,6]]},"484":{"position":[[76,5]]},"638":{"position":[[377,5]]},"642":{"position":[[67,5],[123,5]]},"644":{"position":[[528,5]]},"646":{"position":[[76,5],[111,5]]}}}],["build/artifact",{"_index":2794,"t":{"440":{"position":[[432,16]]},"442":{"position":[[744,16]]}}}],["builder",{"_index":2781,"t":{"435":{"position":[[32,7]]},"442":{"position":[[789,7]]}}}],["buildsourcesfromconfig",{"_index":3382,"t":{"642":{"position":[[421,22]]}}}],["built",{"_index":1189,"t":{"109":{"position":[[135,5]]},"150":{"position":[[224,5]]},"154":{"position":[[397,5]]},"166":{"position":[[1190,5]]},"291":{"position":[[110,5]]},"343":{"position":[[4758,5]]},"355":{"position":[[265,5]]},"379":{"position":[[375,5]]},"383":{"position":[[121,5],[2470,5]]},"395":{"position":[[22,5]]},"444":{"position":[[3,5]]},"474":{"position":[[26,5]]},"522":{"position":[[284,5]]},"596":{"position":[[721,5]]},"642":{"position":[[549,5]]}}}],["bukem",{"_index":2591,"t":{"365":{"position":[[847,5]]}}}],["bump",{"_index":1865,"t":{"198":{"position":[[659,5],[896,6],[1000,6]]},"518":{"position":[[88,5],[183,5]]},"522":{"position":[[248,4]]}}}],["buserw",{"_index":2384,"t":{"325":{"position":[[275,10],[439,7]]}}}],["busi",{"_index":2911,"t":{"470":{"position":[[2243,4]]},"544":{"position":[[968,8],[1431,8]]},"546":{"position":[[365,8]]},"548":{"position":[[335,8]]}}}],["button",{"_index":1572,"t":{"166":{"position":[[47,6]]},"196":{"position":[[1310,6]]},"208":{"position":[[227,6]]}}}],["bvki",{"_index":2502,"t":{"343":{"position":[[5129,5]]}}}],["c",{"_index":802,"t":{"55":{"position":[[2411,1],[2559,1]]},"59":{"position":[[1010,1],[1158,1]]}}}],["c9f91cdc",{"_index":3171,"t":{"561":{"position":[[3114,9]]}}}],["c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":239,"t":{"15":{"position":[[2702,34],[2905,34],[6036,34]]},"152":{"position":[[730,34],[1944,34]]},"208":{"position":[[5065,35],[6894,35]]}}}],["cach",{"_index":30,"t":{"7":{"position":[[163,8]]},"23":{"position":[[27,7],[114,5],[171,8],[239,7],[269,7],[369,6],[469,6],[606,6],[750,6],[826,5],[851,7],[1209,7],[1527,8]]},"25":{"position":[[48,6],[147,7],[1171,8]]},"42":{"position":[[333,7]]},"368":{"position":[[8,7],[119,7],[167,7],[197,5],[322,7],[346,5],[373,6]]},"452":{"position":[[881,7],[1096,5]]},"476":{"position":[[58,7],[386,6],[2415,7],[2490,6]]},"478":{"position":[[340,7],[989,7]]},"482":{"position":[[447,6]]},"542":{"position":[[107,7]]},"544":{"position":[[1637,7],[1648,5]]},"571":{"position":[[26,7]]},"623":{"position":[[138,6],[366,6],[530,5],[697,5],[790,7],[924,6],[1050,5]]},"625":{"position":[[10,5],[131,5],[237,5],[308,7],[334,7],[518,7],[608,7],[770,5],[826,8],[984,7],[1429,8]]},"629":{"position":[[452,6],[498,6]]}}}],["cache.metadata",{"_index":3307,"t":{"625":{"position":[[716,14]]}}}],["cache.scrobbl",{"_index":3303,"t":{"625":{"position":[[446,14]]}}}],["cache_",{"_index":3301,"t":{"625":{"position":[[182,7]]}}}],["cache_auth=valkey",{"_index":444,"t":{"23":{"position":[[1489,17]]}}}],["cache_auth_conn",{"_index":3308,"t":{"625":{"position":[[1272,15]]}}}],["cache_metadata",{"_index":3304,"t":{"625":{"position":[[651,14]]}}}],["cache_metadata_conn",{"_index":3305,"t":{"625":{"position":[[673,19]]}}}],["cache_scrobbl",{"_index":3302,"t":{"625":{"position":[[424,14]]}}}],["cache_valkey",{"_index":3306,"t":{"625":{"position":[[696,12],[1292,12]]}}}],["cache_valkey=redis://192.168.0.120:6379",{"_index":468,"t":{"25":{"position":[[1103,39]]}}}],["cache_valkey=redis://valkey:6379",{"_index":2942,"t":{"476":{"position":[[2630,32]]},"478":{"position":[[1000,32]]}}}],["call",{"_index":409,"t":{"23":{"position":[[58,5],[321,5],[651,5],[721,5],[776,5]]},"55":{"position":[[3872,6]]},"224":{"position":[[196,5]]},"226":{"position":[[557,5]]},"228":{"position":[[1046,5]]},"368":{"position":[[44,5]]},"476":{"position":[[2501,5]]},"544":{"position":[[1670,5]]},"551":{"position":[[564,6]]},"561":{"position":[[1286,5]]},"571":{"position":[[48,6]]},"635":{"position":[[73,6]]},"640":{"position":[[29,6]]}}}],["callback",{"_index":1116,"t":{"87":{"position":[[1317,8]]},"89":{"position":[[13,10]]},"91":{"position":[[540,9]]},"95":{"position":[[13,10]]},"99":{"position":[[527,9]]},"236":{"position":[[589,9]]},"261":{"position":[[576,9]]},"303":{"position":[[3571,8]]},"373":{"position":[[184,9]]},"381":{"position":[[307,8]]},"383":{"position":[[2344,8]]},"450":{"position":[[580,8]]},"530":{"position":[[3451,8]]},"538":{"position":[[1428,8]]},"610":{"position":[[291,8]]}}}],["callback/redirect",{"_index":1118,"t":{"87":{"position":[[1430,17]]},"450":{"position":[[71,17]]}}}],["callout",{"_index":3322,"t":{"631":{"position":[[745,7]]}}}],["canari",{"_index":856,"t":{"55":{"position":[[5168,7]]}}}],["cancel",{"_index":3193,"t":{"566":{"position":[[398,9]]}}}],["candid",{"_index":1735,"t":{"172":{"position":[[4593,10]]},"353":{"position":[[1428,12]]},"425":{"position":[[23,12]]},"561":{"position":[[896,11]]}}}],["capabl",{"_index":418,"t":{"23":{"position":[[247,13]]},"651":{"position":[[278,13]]}}}],["captur",{"_index":1011,"t":{"69":{"position":[[1072,7]]},"109":{"position":[[2199,8]]},"319":{"position":[[1344,7]]},"431":{"position":[[328,7]]},"596":{"position":[[2803,9]]}}}],["card",{"_index":1362,"t":{"136":{"position":[[503,5]]},"140":{"position":[[830,5]]},"210":{"position":[[930,5]]},"303":{"position":[[5485,4]]},"343":{"position":[[4309,4],[5400,4]]},"530":{"position":[[1244,4],[4031,4]]}}}],["care",{"_index":912,"t":{"65":{"position":[[593,5]]},"79":{"position":[[734,5]]},"648":{"position":[[1170,4]]},"653":{"position":[[2742,4]]}}}],["case",{"_index":357,"t":{"19":{"position":[[1226,4]]},"138":{"position":[[97,4]]},"230":{"position":[[600,4]]},"255":{"position":[[605,4]]},"285":{"position":[[324,4]]},"287":{"position":[[327,4]]},"289":{"position":[[500,4],[610,4],[702,4]]},"299":{"position":[[141,4]]},"311":{"position":[[602,4],[890,4],[1367,4]]},"319":{"position":[[2223,6]]},"391":{"position":[[163,4]]},"431":{"position":[[374,5]]},"557":{"position":[[390,4]]},"642":{"position":[[590,4],[679,4],[711,4],[1269,4],[1301,4]]}}}],["cast",{"_index":1306,"t":{"125":{"position":[[202,4]]},"166":{"position":[[28,4],[162,4],[456,4],[654,5],[697,4],[738,4],[1584,4],[1773,4],[3062,4]]},"168":{"position":[[105,4],[445,4],[567,4],[2157,6],[3534,6]]},"464":{"position":[[11,4],[92,7],[132,4],[463,4],[576,4]]},"466":{"position":[[36,4]]},"596":{"position":[[187,4]]}}}],["catalog",{"_index":1225,"t":{"109":{"position":[[2045,9]]}}}],["catch",{"_index":2683,"t":{"383":{"position":[[3286,5]]},"646":{"position":[[1212,5],[2025,5],[2488,5]]},"648":{"position":[[2546,5]]},"651":{"position":[[1052,5]]}}}],["categori",{"_index":1322,"t":{"128":{"position":[[71,11]]},"174":{"position":[[355,11]]}}}],["caus",{"_index":1019,"t":{"69":{"position":[[1627,5]]},"160":{"position":[[49,5]]},"198":{"position":[[2026,5]]},"315":{"position":[[978,6]]},"343":{"position":[[332,5]]},"347":{"position":[[691,6]]},"452":{"position":[[867,6]]},"470":{"position":[[1676,5],[2476,5]]},"646":{"position":[[1279,7]]},"651":{"position":[[1128,7]]}}}],["caveat",{"_index":354,"t":{"19":{"position":[[1176,7]]}}}],["cc_blacklist_app",{"_index":1621,"t":{"168":{"position":[[637,17]]}}}],["cc_blacklist_devic",{"_index":1618,"t":{"168":{"position":[[392,20]]}}}],["cc_enabl",{"_index":1617,"t":{"168":{"position":[[338,9]]}}}],["cc_id",{"_index":1615,"t":{"168":{"position":[[222,5],[297,5]]}}}],["cc_name",{"_index":1616,"t":{"168":{"position":[[273,7]]}}}],["cc_whitelist_app",{"_index":1622,"t":{"168":{"position":[[757,17]]}}}],["cc_whitelist_devic",{"_index":1620,"t":{"168":{"position":[[516,20]]}}}],["cd",{"_index":2636,"t":{"375":{"position":[[313,2]]},"482":{"position":[[188,2]]}}}],["certain",{"_index":532,"t":{"29":{"position":[[1184,7]]},"128":{"position":[[994,7]]},"287":{"position":[[4,7]]},"575":{"position":[[57,7]]}}}],["certificates/http",{"_index":2265,"t":{"303":{"position":[[2596,18]]}}}],["cf5b",{"_index":3342,"t":{"638":{"position":[[709,4]]}}}],["chanc",{"_index":1741,"t":{"172":{"position":[[4796,6]]},"343":{"position":[[903,6]]},"454":{"position":[[979,6]]}}}],["chang",{"_index":477,"t":{"27":{"position":[[187,7],[586,8]]},"69":{"position":[[1565,6]]},"87":{"position":[[856,8]]},"134":{"position":[[786,7]]},"156":{"position":[[123,6]]},"172":{"position":[[772,6],[791,6],[820,6],[836,6],[2679,7]]},"198":{"position":[[1501,7]]},"228":{"position":[[912,6]]},"297":{"position":[[1665,8]]},"303":{"position":[[3649,8]]},"319":{"position":[[141,6],[472,7]]},"333":{"position":[[1864,7],[3238,7]]},"343":{"position":[[174,6],[4108,8]]},"359":{"position":[[240,7],[315,7],[418,7],[484,7],[545,7],[623,7]]},"399":{"position":[[191,7],[266,7],[361,7]]},"470":{"position":[[646,7],[927,6],[1428,6],[1704,7],[1747,7],[2789,7]]},"514":{"position":[[33,7]]},"518":{"position":[[131,7],[264,8],[358,8]]},"522":{"position":[[266,8]]},"524":{"position":[[725,6]]},"530":{"position":[[2061,7],[2403,7]]},"555":{"position":[[561,7],[636,7],[731,7]]},"561":{"position":[[1266,6]]},"579":{"position":[[135,6]]},"623":{"position":[[214,8]]},"631":{"position":[[16,7],[86,8],[528,7]]},"648":{"position":[[1230,7],[2631,7],[2655,7]]}}}],["changelog",{"_index":3038,"t":{"510":{"position":[[253,10]]},"518":{"position":[[367,11]]}}}],["changem",{"_index":2369,"t":{"321":{"position":[[1734,10],[3056,10]]}}}],["changes/notic",{"_index":3039,"t":{"510":{"position":[[289,16]]}}}],["channel",{"_index":764,"t":{"55":{"position":[[960,7],[998,8]]}}}],["charact",{"_index":1635,"t":{"172":{"position":[[196,9],[281,10],[330,10]]},"397":{"position":[[81,10],[226,10]]},"416":{"position":[[983,11]]}}}],["check",{"_index":22,"t":{"7":{"position":[[42,6]]},"13":{"position":[[4,5]]},"36":{"position":[[176,6],[278,7]]},"50":{"position":[[229,5]]},"69":{"position":[[248,5]]},"132":{"position":[[499,5]]},"136":{"position":[[64,5]]},"177":{"position":[[303,5]]},"196":{"position":[[1777,5]]},"202":{"position":[[161,5]]},"214":{"position":[[171,5],[247,7]]},"222":{"position":[[3130,5]]},"228":{"position":[[402,8]]},"230":{"position":[[292,5],[937,5]]},"242":{"position":[[3084,5]]},"255":{"position":[[292,5],[942,5]]},"285":{"position":[[183,5]]},"297":{"position":[[793,5]]},"341":{"position":[[593,5],[714,5]]},"359":{"position":[[744,5]]},"383":{"position":[[1407,5],[1912,5]]},"448":{"position":[[1357,5],[1547,5],[1596,5],[2146,5],[2398,5]]},"452":{"position":[[654,5],[1131,5]]},"470":{"position":[[697,7],[792,7],[946,6]]},"495":{"position":[[0,5]]},"510":{"position":[[418,5]]},"516":{"position":[[113,7]]},"518":{"position":[[314,5]]},"522":{"position":[[227,5]]},"524":{"position":[[293,8]]},"542":{"position":[[423,5]]},"561":{"position":[[48,6]]},"612":{"position":[[49,5]]},"646":{"position":[[137,5],[1398,5],[1445,5]]},"648":{"position":[[794,7],[2857,6]]},"653":{"position":[[2341,7],[3986,5]]}}}],["check/test",{"_index":2676,"t":{"383":{"position":[[2181,10]]}}}],["child",{"_index":2661,"t":{"383":{"position":[[1036,5],[1771,5],[3018,5]]}}}],["childish",{"_index":1678,"t":{"172":{"position":[[1676,8],[1747,8]]}}}],["chmod",{"_index":803,"t":{"55":{"position":[[2413,6]]},"59":{"position":[[1012,6]]}}}],["choic",{"_index":3216,"t":{"568":{"position":[[430,6],[516,7],[606,7]]}}}],["choos",{"_index":704,"t":{"44":{"position":[[191,6]]},"101":{"position":[[571,6]]},"196":{"position":[[597,6]]},"210":{"position":[[463,7]]},"343":{"position":[[2163,6]]},"557":{"position":[[418,6]]},"561":{"position":[[1215,7]]},"568":{"position":[[3153,6]]}}}],["chopin",{"_index":1704,"t":{"172":{"position":[[3788,6],[3884,6],[4222,6],[4323,6]]}}}],["chosen",{"_index":3231,"t":{"568":{"position":[[2032,7],[2336,6]]}}}],["chown",{"_index":805,"t":{"55":{"position":[[2442,5],[2489,5]]},"59":{"position":[[1041,5],[1088,5]]}}}],["chrome",{"_index":1509,"t":{"158":{"position":[[288,6]]},"196":{"position":[[1031,7]]}}}],["chrome/edg",{"_index":1800,"t":{"194":{"position":[[275,13]]}}}],["chrome://inspect",{"_index":2699,"t":{"389":{"position":[[120,16]]}}}],["chromecast",{"_index":1307,"t":{"125":{"position":[[207,12]]},"166":{"position":[[2319,13],[2851,13],[3510,13]]},"168":{"position":[[975,10],[1186,10],[1530,10],[1614,10],[1846,10],[2514,10],[2710,10],[3233,10],[3675,12]]},"596":{"position":[[192,12]]}}}],["chromecast.j",{"_index":3352,"t":{"638":{"position":[[1344,18]]}}}],["chromecast.json",{"_index":1602,"t":{"166":{"position":[[2273,15],[2805,15],[3464,15]]}}}],["chromecastsourceaioconfig",{"_index":3350,"t":{"638":{"position":[[1287,26]]}}}],["chromecastsourceconfig",{"_index":3351,"t":{"638":{"position":[[1314,22]]}}}],["chromium",{"_index":2375,"t":{"323":{"position":[[449,8]]},"389":{"position":[[144,8]]}}}],["circular",{"_index":2869,"t":{"460":{"position":[[165,8]]}}}],["circumst",{"_index":1552,"t":{"162":{"position":[[966,14]]}}}],["circumv",{"_index":1581,"t":{"166":{"position":[[1062,10]]}}}],["cjeb3egaevcd",{"_index":2467,"t":{"343":{"position":[[1122,12]]},"345":{"position":[[2002,12],[3482,12]]}}}],["class",{"_index":2642,"t":{"379":{"position":[[284,5],[334,5]]},"383":{"position":[[41,6],[1042,5],[1230,5],[1777,5],[2015,5],[2118,6],[3024,5],[3148,5]]},"640":{"position":[[403,5],[454,5],[543,5]]},"642":{"position":[[390,5]]},"644":{"position":[[351,5]]},"646":{"position":[[372,5],[1632,5],[2270,5]]},"648":{"position":[[1699,5]]},"651":{"position":[[454,5]]},"653":{"position":[[897,5],[1760,6],[2816,5],[3488,5]]}}}],["classic",{"_index":2327,"t":{"315":{"position":[[429,8]]}}}],["classif",{"_index":1696,"t":{"172":{"position":[[3296,14]]}}}],["classifi",{"_index":1598,"t":{"166":{"position":[[1882,10]]},"172":{"position":[[2350,10],[2968,10]]}}}],["claus",{"_index":2571,"t":{"363":{"position":[[327,6],[375,7]]}}}],["clean",{"_index":2521,"t":{"347":{"position":[[249,6]]},"442":{"position":[[994,5]]}}}],["cleanup",{"_index":2330,"t":{"315":{"position":[[650,7]]}}}],["cleanup/match",{"_index":1758,"t":{"174":{"position":[[703,16]]}}}],["click",{"_index":730,"t":{"53":{"position":[[135,5]]},"67":{"position":[[1185,5],[2677,5]]},"75":{"position":[[1718,8]]},"77":{"position":[[282,5]]},"81":{"position":[[1426,5],[2960,5]]},"85":{"position":[[929,5],[2447,5]]},"91":{"position":[[1094,5],[2678,5]]},"99":{"position":[[1192,5],[2739,5]]},"103":{"position":[[867,5],[2359,5]]},"107":{"position":[[985,5],[2571,5]]},"114":{"position":[[2117,5],[3674,5]]},"121":{"position":[[1480,5],[2972,5]]},"136":{"position":[[436,8]]},"140":{"position":[[763,8]]},"144":{"position":[[999,5],[2553,5]]},"158":{"position":[[464,5],[747,5],[780,5]]},"164":{"position":[[1020,5],[2572,5]]},"168":{"position":[[1349,5],[2854,5]]},"196":{"position":[[1283,5],[1408,5],[2120,5]]},"200":{"position":[[1236,5],[3058,5]]},"206":{"position":[[993,5],[2469,5]]},"208":{"position":[[219,5],[4132,5],[6081,5]]},"210":{"position":[[863,8]]},"212":{"position":[[856,5],[2304,5]]},"218":{"position":[[1029,5],[2498,5]]},"232":{"position":[[1108,5],[2562,5]]},"236":{"position":[[1150,5],[2990,5]]},"238":{"position":[[1333,5],[3104,5]]},"253":{"position":[[88,5]]},"257":{"position":[[1181,5],[2640,5]]},"261":{"position":[[1255,5],[3061,5]]},"265":{"position":[[1034,5],[2894,5]]},"269":{"position":[[909,5],[2657,5]]},"273":{"position":[[978,5],[2477,5]]},"277":{"position":[[991,5],[2445,5]]},"281":{"position":[[957,5],[2428,5]]},"289":{"position":[[1224,5],[2710,5]]},"295":{"position":[[1153,5],[2969,5]]},"301":{"position":[[1462,5],[2998,5]]},"303":{"position":[[1462,8],[5447,5]]},"305":{"position":[[1007,5],[2597,5]]},"309":{"position":[[435,8]]},"317":{"position":[[986,5],[2571,5]]},"319":{"position":[[431,5]]},"321":{"position":[[876,5],[2298,5]]},"329":{"position":[[930,5],[2426,5]]},"333":{"position":[[960,5],[2454,5]]},"341":{"position":[[2395,5],[4201,5]]},"343":{"position":[[4264,5],[5444,5]]},"345":{"position":[[1102,5],[2698,5]]},"393":{"position":[[859,5],[2313,5]]},"492":{"position":[[204,5]]},"530":{"position":[[1206,5],[3984,5]]}}}],["client",{"_index":0,"t":{"2":{"position":[[2,6]]},"7":{"position":[[32,6],[191,6]]},"9":{"position":[[55,6]]},"11":{"position":[[90,7],[185,7],[408,7],[515,7],[756,6],[910,7],[1072,9]]},"15":{"position":[[12,7],[670,6],[1715,7],[4907,10],[5147,10]]},"17":{"position":[[75,6],[175,7],[192,7]]},"19":{"position":[[567,9],[1003,9]]},"29":{"position":[[170,7],[236,6],[3605,8],[3718,8]]},"38":{"position":[[163,6],[380,10]]},"42":{"position":[[206,6]]},"53":{"position":[[205,7]]},"55":{"position":[[930,7],[975,6],[1203,7]]},"67":{"position":[[830,6],[1033,6],[1359,6],[1440,6],[1681,6],[2376,7],[2544,6],[3064,6],[3327,10]]},"77":{"position":[[352,7]]},"81":{"position":[[1071,6],[1274,6],[1600,6],[1681,6],[1922,6],[2659,7],[2827,6],[3347,6],[3610,10]]},"85":{"position":[[576,6],[777,6],[1103,6],[1182,6],[1417,6],[1715,6],[1764,9],[2148,7],[2314,6],[2832,6],[3095,10],[3125,6],[3174,9]]},"87":{"position":[[736,6]]},"91":{"position":[[740,6],[942,6],[1268,6],[1348,6],[1586,6],[1888,8],[1952,9],[2378,7],[2545,6],[3064,6],[3327,10],[3360,8],[3424,9]]},"99":{"position":[[837,6],[1040,6],[1366,6],[1447,6],[1688,6],[1993,8],[2058,9],[2438,7],[2606,6],[3126,6],[3389,10],[3424,8],[3489,9]]},"103":{"position":[[513,6],[715,6],[1041,6],[1121,6],[1359,6],[1659,8],[1723,9],[2059,7],[2226,6],[2745,6],[3008,10],[3039,8],[3103,9]]},"107":{"position":[[625,6],[833,6],[1159,6],[1245,6],[1501,6],[1808,8],[1870,9],[2265,7],[2438,6],[2963,6],[3226,10],[3258,8],[3320,9]]},"109":{"position":[[2259,7]]},"114":{"position":[[1762,6],[1965,6],[2291,6],[2372,6],[2613,6],[2947,8],[2971,9],[3373,7],[3541,6],[4061,6],[4324,10],[4388,8],[4412,9]]},"121":{"position":[[1126,6],[1328,6],[1654,6],[1734,6],[1972,6],[2297,8],[2321,9],[2672,7],[2839,6],[3358,6],[3621,10],[3677,8],[3701,9]]},"132":{"position":[[15,7],[57,7],[147,7],[221,10],[302,7],[319,11],[414,8],[433,6],[579,6],[647,6]]},"134":{"position":[[171,8],[286,6],[499,6],[572,8]]},"144":{"position":[[1256,6]]},"150":{"position":[[2186,9],[2391,9],[3122,10],[3207,9],[3404,9]]},"152":{"position":[[634,10],[814,10],[1015,10],[1200,9],[1386,9],[1595,9],[1846,10],[2048,10],[2243,10],[2374,10],[2463,9],[2667,9],[2868,9]]},"154":{"position":[[521,7],[2860,9],[3978,10],[4063,9]]},"162":{"position":[[739,10]]},"164":{"position":[[1274,6],[1858,10],[3298,10]]},"168":{"position":[[1607,6]]},"172":{"position":[[2545,8],[4001,6],[4064,7]]},"174":{"position":[[71,6],[224,6],[653,7],[1000,7]]},"179":{"position":[[29,6],[110,6],[196,8],[426,6]]},"184":{"position":[[587,7]]},"186":{"position":[[60,8],[381,7],[476,7]]},"190":{"position":[[942,6]]},"192":{"position":[[135,8]]},"198":{"position":[[2551,7],[2871,8],[2935,9]]},"200":{"position":[[1494,6],[2096,10],[3790,10]]},"206":{"position":[[1245,6]]},"208":{"position":[[4388,6],[4980,10],[6809,10]]},"212":{"position":[[1111,6]]},"218":{"position":[[1283,6]]},"220":{"position":[[165,8],[365,8]]},"222":{"position":[[813,8],[1218,8],[1985,8]]},"224":{"position":[[29,6]]},"226":{"position":[[150,6],[318,6],[405,6]]},"228":{"position":[[269,7],[358,7],[774,7]]},"232":{"position":[[1367,6]]},"234":{"position":[[95,8],[165,8],[387,8]]},"236":{"position":[[1404,6],[1746,6]]},"238":{"position":[[110,8],[176,8],[199,8],[1586,6],[1924,6]]},"240":{"position":[[403,8]]},"242":{"position":[[796,8],[1195,8],[1968,8]]},"246":{"position":[[18,7]]},"257":{"position":[[1439,6]]},"259":{"position":[[96,8],[159,8],[273,8]]},"261":{"position":[[1510,6],[1856,6]]},"263":{"position":[[117,8],[197,8]]},"265":{"position":[[1294,6],[1660,6]]},"267":{"position":[[59,8],[83,8]]},"269":{"position":[[1163,6],[1505,6]]},"273":{"position":[[1235,6]]},"277":{"position":[[1244,6]]},"279":{"position":[[39,6]]},"281":{"position":[[1208,6]]},"289":{"position":[[1478,6]]},"291":{"position":[[52,8],[255,8],[323,8]]},"293":{"position":[[45,8]]},"295":{"position":[[16,8],[1408,6],[1754,6]]},"301":{"position":[[1715,6]]},"303":{"position":[[1729,6],[4882,6],[5228,6],[5292,6]]},"305":{"position":[[350,6],[397,6],[1262,6],[1847,10],[3321,10]]},"315":{"position":[[240,6]]},"317":{"position":[[1242,6]]},"321":{"position":[[1127,6]]},"325":{"position":[[202,10],[286,10]]},"329":{"position":[[1190,6]]},"333":{"position":[[1216,6]]},"335":{"position":[[59,8],[334,8],[402,8]]},"337":{"position":[[45,8]]},"339":{"position":[[16,8]]},"341":{"position":[[2649,6],[2991,6]]},"343":{"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]]},"345":{"position":[[360,6],[447,6],[517,6],[1357,6],[1943,10],[3423,10]]},"347":{"position":[[311,6],[678,6]]},"349":{"position":[[474,7],[491,7],[551,6],[592,6],[739,6]]},"351":{"position":[[162,6],[358,8]]},"353":{"position":[[230,7],[242,8]]},"379":{"position":[[64,7]]},"385":{"position":[[507,7]]},"387":{"position":[[32,6]]},"393":{"position":[[1116,6]]},"450":{"position":[[11,6]]},"454":{"position":[[433,6]]},"460":{"position":[[313,6]]},"470":{"position":[[2769,7]]},"476":{"position":[[1054,6]]},"478":{"position":[[117,6]]},"482":{"position":[[2002,10],[2171,10]]},"492":{"position":[[193,10]]},"530":{"position":[[608,6],[3236,8],[3366,7]]},"532":{"position":[[172,7]]},"538":{"position":[[0,7],[135,7]]},"540":{"position":[[355,7]]},"542":{"position":[[340,7]]},"555":{"position":[[30,6]]},"575":{"position":[[1654,6]]},"579":{"position":[[183,7],[272,6]]},"588":{"position":[[170,7]]},"594":{"position":[[12,6],[181,6]]},"596":{"position":[[580,7],[801,7],[906,7],[1092,6],[2157,6],[2340,7],[2710,7]]},"598":{"position":[[66,8],[224,7]]},"600":{"position":[[376,6],[480,8]]},"602":{"position":[[2,6],[157,6],[264,7]]},"619":{"position":[[339,6],[389,7]]},"623":{"position":[[82,7],[596,6],[1113,7],[1181,7],[1314,6],[1342,6],[1442,7]]},"644":{"position":[[480,6]]},"648":{"position":[[903,7],[2929,7]]},"653":{"position":[[3014,7],[3373,7],[3669,7],[3973,7]]}}}],["client'",{"_index":24,"t":{"7":{"position":[[77,8]]}}}],["client/secret",{"_index":333,"t":{"19":{"position":[[184,14]]}}}],["client/sourc",{"_index":149,"t":{"15":{"position":[[72,13],[2372,14],[2464,14]]},"40":{"position":[[297,13],[381,14]]},"184":{"position":[[323,15]]},"623":{"position":[[161,13],[237,13]]},"629":{"position":[[41,14],[547,15]]}}}],["client1maloja",{"_index":2382,"t":{"325":{"position":[[215,15]]}}}],["client2maloja",{"_index":2385,"t":{"325":{"position":[[299,15]]}}}],["clientconfig",{"_index":3393,"t":{"642":{"position":[[1143,14]]}}}],["clientdefault",{"_index":288,"t":{"15":{"position":[[4787,17]]}}}],["clientid",{"_index":293,"t":{"15":{"position":[[4992,11]]},"150":{"position":[[1623,11],[2654,11]]},"154":{"position":[[2397,11],[3601,11]]},"305":{"position":[[1872,11],[3346,11]]},"343":{"position":[[2635,11],[3864,11]]},"345":{"position":[[2024,11],[3504,11]]}}}],["clients/sourc",{"_index":657,"t":{"40":{"position":[[263,15],[561,15]]},"629":{"position":[[141,15]]}}}],["clientsecret",{"_index":295,"t":{"15":{"position":[[5040,15]]},"150":{"position":[[1671,15],[2702,15]]},"154":{"position":[[2445,15],[3649,15]]},"305":{"position":[[1920,15],[3394,15]]},"343":{"position":[[2692,15],[3921,15]]},"345":{"position":[[2079,15],[3559,15]]}}}],["clone",{"_index":2633,"t":{"375":{"position":[[179,5],[259,5]]},"482":{"position":[[0,5],[106,5]]},"516":{"position":[[356,6]]},"520":{"position":[[235,5]]}}}],["close",{"_index":45,"t":{"7":{"position":[[369,9]]},"172":{"position":[[701,5],[2315,9],[2431,5],[4528,7],[4640,5]]},"452":{"position":[[142,6]]},"454":{"position":[[1097,7]]},"561":{"position":[[6829,6]]},"564":{"position":[[77,5]]},"568":{"position":[[1255,7]]},"592":{"position":[[150,5]]}}}],["closest",{"_index":1721,"t":{"172":{"position":[[4296,7]]}}}],["cloud",{"_index":719,"t":{"48":{"position":[[38,5],[152,5]]},"343":{"position":[[1785,5],[4156,5]]},"345":{"position":[[332,5],[419,5],[489,5]]},"600":{"position":[[149,5]]}}}],["clv",{"_index":2500,"t":{"343":{"position":[[5120,4]]}}}],["code",{"_index":1136,"t":{"93":{"position":[[223,5]]},"303":{"position":[[2154,4],[4824,4]]},"343":{"position":[[5115,4],[5258,4]]},"454":{"position":[[136,5],[302,5]]},"492":{"position":[[528,4]]},"566":{"position":[[1061,4]]}}}],["codebas",{"_index":3319,"t":{"631":{"position":[[388,8]]}}}],["coeffici",{"_index":1658,"t":{"172":{"position":[[1040,12]]}}}],["cog",{"_index":1165,"t":{"101":{"position":[[353,4]]},"538":{"position":[[2111,4]]}}}],["collect",{"_index":1477,"t":{"154":{"position":[[74,10],[213,10]]},"303":{"position":[[4711,7]]},"341":{"position":[[679,10]]},"347":{"position":[[371,10]]},"490":{"position":[[239,10]]},"573":{"position":[[751,10]]},"579":{"position":[[83,10]]}}}],["collid",{"_index":374,"t":{"19":{"position":[[1774,7]]}}}],["collis",{"_index":372,"t":{"19":{"position":[[1683,10]]}}}],["color",{"_index":3321,"t":{"631":{"position":[[737,7]]}}}],["column",{"_index":1524,"t":{"158":{"position":[[763,6]]},"196":{"position":[[1400,7]]}}}],["combin",{"_index":877,"t":{"55":{"position":[[7742,11]]},"172":{"position":[[3568,8]]},"220":{"position":[[503,8]]},"315":{"position":[[567,12]]},"359":{"position":[[881,9]]},"462":{"position":[[130,10]]},"482":{"position":[[1433,11]]},"555":{"position":[[1222,8]]},"557":{"position":[[400,8]]},"568":{"position":[[2825,8],[3066,8]]},"575":{"position":[[598,8]]}}}],["come",{"_index":1531,"t":{"160":{"position":[[428,5]]},"174":{"position":[[926,6]]},"353":{"position":[[987,6]]},"544":{"position":[[305,6]]},"575":{"position":[[1472,5]]},"577":{"position":[[70,4]]}}}],["comfort",{"_index":176,"t":{"15":{"position":[[729,11],[1502,11]]}}}],["comma",{"_index":958,"t":{"67":{"position":[[520,5]]},"81":{"position":[[493,5],[745,5]]},"168":{"position":[[466,5],[587,5],[707,5],[825,5]]},"208":{"position":[[2789,5],[2908,5],[3030,5],[3154,5],[3263,5],[3375,5],[3625,5]]},"277":{"position":[[398,5],[506,5]]},"301":{"position":[[587,5],[693,5],[834,5],[977,5]]},"431":{"position":[[605,5]]},"530":{"position":[[2907,5]]},"532":{"position":[[1700,5]]},"536":{"position":[[838,5]]},"557":{"position":[[293,5]]}}}],["command",{"_index":832,"t":{"55":{"position":[[4124,8],[4530,8],[6040,7],[7396,7],[7597,7],[7935,8],[9742,7]]},"72":{"position":[[780,9],[853,8]]},"319":{"position":[[755,7],[945,7]]},"442":{"position":[[645,7],[1042,7]]},"444":{"position":[[90,7]]},"476":{"position":[[2058,8]]}}}],["comment",{"_index":3273,"t":{"596":{"position":[[1687,8]]}}}],["comment/issu",{"_index":3001,"t":{"492":{"position":[[608,13]]}}}],["commera",{"_index":955,"t":{"67":{"position":[[334,7]]},"81":{"position":[[850,7]]}}}],["commerci",{"_index":3122,"t":{"544":{"position":[[855,10]]},"546":{"position":[[252,10]]}}}],["commit",{"_index":335,"t":{"19":{"position":[[251,9]]},"437":{"position":[[22,6]]},"516":{"position":[[392,7]]},"524":{"position":[[531,6]]}}}],["common",{"_index":504,"t":{"29":{"position":[[495,6],[2382,6],[4357,6]]},"109":{"position":[[935,6]]},"116":{"position":[[933,6]]},"147":{"position":[[398,7]]},"166":{"position":[[415,7]]},"172":{"position":[[1220,6],[1294,6],[1317,6],[1424,6],[3252,6]]},"174":{"position":[[1057,6]]},"196":{"position":[[243,8]]},"222":{"position":[[2171,6],[3113,6]]},"228":{"position":[[573,6]]},"242":{"position":[[2152,6],[3067,6]]},"248":{"position":[[341,6]]},"319":{"position":[[2178,6]]},"379":{"position":[[308,6],[434,6]]},"395":{"position":[[290,6],[507,6]]},"431":{"position":[[390,6]]},"452":{"position":[[582,6]]},"464":{"position":[[44,6],[353,6]]},"495":{"position":[[169,6]]},"542":{"position":[[617,6]]},"561":{"position":[[4236,6],[4258,6],[5170,6],[5566,6]]},"575":{"position":[[391,6]]},"633":{"position":[[236,6]]},"638":{"position":[[64,6],[415,6]]}}}],["common.j",{"_index":3336,"t":{"638":{"position":[[258,15]]}}}],["common/errors/upstreamerror.j",{"_index":3438,"t":{"646":{"position":[[1573,36],[2211,36]]}}}],["common/infrastructure/atomic.j",{"_index":3368,"t":{"640":{"position":[[337,37]]},"644":{"position":[[247,37]]},"648":{"position":[[1639,37]]},"651":{"position":[[394,37]]}}}],["common/infrastructure/config/source/coolplayer.j",{"_index":3364,"t":{"640":{"position":[[203,55]]}}}],["commonclientconfig",{"_index":2649,"t":{"381":{"position":[[136,19]]}}}],["commonli",{"_index":3005,"t":{"495":{"position":[[57,8]]}}}],["commonsourceconfig",{"_index":2648,"t":{"381":{"position":[[113,18]]},"638":{"position":[[283,19],[918,18]]}}}],["commonsourcedata",{"_index":3337,"t":{"638":{"position":[[303,16],[504,17]]}}}],["commun",{"_index":738,"t":{"55":{"position":[[66,11],[146,11],[3818,11],[3963,11],[5503,13],[5902,13],[6889,13],[7459,13],[9148,13]]},"69":{"position":[[415,13]]},"109":{"position":[[571,14]]},"114":{"position":[[530,13]]},"116":{"position":[[569,14]]},"128":{"position":[[86,13]]},"134":{"position":[[206,13],[634,13]]},"142":{"position":[[1024,11]]},"202":{"position":[[32,11]]},"214":{"position":[[32,11]]},"224":{"position":[[39,11]]},"228":{"position":[[867,14]]},"275":{"position":[[34,13],[315,12],[382,13],[1473,13]]},"279":{"position":[[3,12]]},"319":{"position":[[3,12]]},"331":{"position":[[114,11]]},"343":{"position":[[8,13]]},"373":{"position":[[300,12]]},"383":{"position":[[1468,11],[2410,11]]},"596":{"position":[[1820,12]]},"600":{"position":[[311,11]]},"602":{"position":[[227,11]]}}}],["compact",{"_index":510,"t":{"29":{"position":[[620,9],[795,10],[1020,9],[1312,10],[1336,10],[1656,9],[2090,7],[2159,7],[2239,10],[2500,7],[2599,7],[2670,7],[2737,7],[2812,10],[2850,7],[2927,7],[3013,10],[3147,10],[3214,10],[3225,7],[3273,8],[3428,10]]}}}],["compact_properti",{"_index":552,"t":{"29":{"position":[[2459,18]]}}}],["compact_properties=input",{"_index":559,"t":{"29":{"position":[[2823,24]]}}}],["compactaft",{"_index":563,"t":{"29":{"position":[[3121,15],[3342,15]]}}}],["compar",{"_index":321,"t":{"15":{"position":[[5767,8]]},"46":{"position":[[181,8]]},"172":{"position":[[993,8],[2194,8],[2285,9],[3582,9],[4014,9]]},"313":{"position":[[605,8]]},"349":{"position":[[218,8],[599,8]]},"351":{"position":[[76,8],[93,8],[116,8],[523,10]]},"353":{"position":[[69,7],[125,8],[307,7],[363,8],[718,7],[1050,7],[1067,7],[1413,10],[1485,8],[1581,8]]},"425":{"position":[[10,10]]},"653":{"position":[[2395,9]]}}}],["comparison",{"_index":725,"t":{"50":{"position":[[268,10]]},"69":{"position":[[287,10]]},"172":{"position":[[3642,10],[4684,10]]},"353":{"position":[[1198,10],[1326,11]]}}}],["comparison/norm",{"_index":1700,"t":{"172":{"position":[[3528,24]]}}}],["compat",{"_index":1241,"t":{"114":{"position":[[564,10]]},"125":{"position":[[865,10]]},"315":{"position":[[824,10]]},"596":{"position":[[437,10]]}}}],["compens",{"_index":2880,"t":{"470":{"position":[[532,10]]}}}],["compet",{"_index":1048,"t":{"75":{"position":[[1596,10]]}}}],["compil",{"_index":3195,"t":{"566":{"position":[[461,11],[899,12],[1470,12],[1516,15]]}}}],["complet",{"_index":213,"t":{"15":{"position":[[1910,8],[3912,8],[3987,10]]},"29":{"position":[[2055,8],[2612,9],[2935,9],[3257,9],[3360,12],[4535,9],[4791,9],[5011,9],[5116,12]]},"55":{"position":[[3043,8]]},"61":{"position":[[267,8]]},"67":{"position":[[1580,9],[2908,9]]},"81":{"position":[[1821,9],[3191,9]]},"85":{"position":[[1318,9],[2678,9]]},"89":{"position":[[105,10]]},"91":{"position":[[608,9],[1486,9],[2909,9]]},"95":{"position":[[105,10]]},"99":{"position":[[596,9],[1587,9],[2970,9]]},"103":{"position":[[1259,9],[2590,9]]},"107":{"position":[[1395,9],[2802,9]]},"109":{"position":[[1790,9]]},"114":{"position":[[2512,9],[3905,9]]},"121":{"position":[[1872,9],[3203,9]]},"144":{"position":[[1400,9],[2784,9]]},"164":{"position":[[1412,9],[2803,9]]},"168":{"position":[[1753,9],[3085,9]]},"200":{"position":[[1640,9],[3289,9]]},"206":{"position":[[1379,9],[2700,9]]},"208":{"position":[[4530,9],[6312,9]]},"212":{"position":[[1251,9],[2535,9]]},"218":{"position":[[1421,9],[2729,9]]},"232":{"position":[[1515,9],[2793,9]]},"236":{"position":[[664,9],[1542,9],[3221,9]]},"238":{"position":[[1722,9],[3335,9]]},"257":{"position":[[1585,9],[2871,9]]},"261":{"position":[[652,9],[1650,9],[3292,9]]},"265":{"position":[[1444,9],[3125,9]]},"269":{"position":[[1301,9],[2888,9]]},"273":{"position":[[1379,9],[2708,9]]},"277":{"position":[[1380,9],[2676,9]]},"281":{"position":[[1340,9],[2659,9]]},"289":{"position":[[1616,9],[2941,9]]},"295":{"position":[[1548,9],[3200,9]]},"301":{"position":[[1851,9],[3229,9]]},"303":{"position":[[1042,10],[1204,8],[2105,8],[2446,8],[3337,10],[4492,8]]},"305":{"position":[[1402,9],[2828,9]]},"317":{"position":[[1384,9],[2802,9]]},"321":{"position":[[1259,9],[2529,9]]},"329":{"position":[[1340,9],[2657,9]]},"333":{"position":[[1358,9],[2685,9]]},"341":{"position":[[2787,9],[4432,9]]},"343":{"position":[[5322,10]]},"345":{"position":[[1497,9],[2929,9]]},"383":{"position":[[2305,8]]},"393":{"position":[[1260,9],[2544,9]]},"450":{"position":[[258,10]]},"454":{"position":[[257,9]]},"510":{"position":[[47,9]]},"516":{"position":[[164,9]]},"530":{"position":[[1358,9],[4145,9]]},"575":{"position":[[4,9]]},"577":{"position":[[481,10]]}}}],["complex",{"_index":221,"t":{"15":{"position":[[2301,7],[4265,7]]},"147":{"position":[[33,7]]},"170":{"position":[[72,7]]},"460":{"position":[[263,7]]}}}],["complic",{"_index":3108,"t":{"542":{"position":[[274,11]]}}}],["compon",{"_index":953,"t":{"67":{"position":[[248,9]]},"81":{"position":[[248,9]]},"85":{"position":[[242,9],[290,9]]},"91":{"position":[[245,9],[294,9]]},"99":{"position":[[248,9],[298,9]]},"103":{"position":[[245,9],[294,9]]},"107":{"position":[[233,9],[278,9]]},"114":{"position":[[1300,9],[1350,9]]},"121":{"position":[[821,9],[870,9]]},"144":{"position":[[242,9],[290,9]]},"164":{"position":[[245,9],[294,9]]},"168":{"position":[[328,9],[373,9]]},"200":{"position":[[257,9],[310,9]]},"206":{"position":[[239,9],[286,9]]},"208":{"position":[[2361,9],[2412,9]]},"212":{"position":[[248,9],[298,9]]},"218":{"position":[[245,9],[294,9]]},"232":{"position":[[236,9],[282,9]]},"236":{"position":[[266,9],[322,9]]},"238":{"position":[[618,9],[673,9]]},"257":{"position":[[236,9],[282,9]]},"261":{"position":[[269,9],[326,9]]},"265":{"position":[[254,9],[306,9]]},"269":{"position":[[266,9],[322,9]]},"273":{"position":[[233,9],[278,9]]},"277":{"position":[[242,9],[290,9]]},"281":{"position":[[236,9],[282,9]]},"289":{"position":[[245,9],[294,9]]},"295":{"position":[[426,9],[483,9]]},"301":{"position":[[367,9],[415,9]]},"305":{"position":[[248,9],[298,9]]},"317":{"position":[[251,9],[302,9]]},"321":{"position":[[236,9],[282,9]]},"329":{"position":[[233,9],[278,9]]},"333":{"position":[[251,9],[302,9]]},"341":{"position":[[1715,9],[1771,9]]},"345":{"position":[[236,9],[282,9]]},"379":{"position":[[145,10],[158,9],[263,9],[362,9]]},"381":{"position":[[24,9],[265,9],[427,9]]},"383":{"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]]},"385":{"position":[[552,9]]},"393":{"position":[[242,9],[290,9]]},"555":{"position":[[825,9]]},"592":{"position":[[281,9]]}}}],["component'",{"_index":1982,"t":{"210":{"position":[[1275,11]]}}}],["compos",{"_index":350,"t":{"19":{"position":[[792,7]]},"23":{"position":[[1156,9]]},"25":{"position":[[534,7]]},"55":{"position":[[1387,7],[1462,7],[6160,7],[6371,7],[8040,7],[8251,7],[9847,7]]},"59":{"position":[[61,7]]},"101":{"position":[[311,7]]},"162":{"position":[[593,7]]},"275":{"position":[[1093,7]]},"311":{"position":[[476,7]]},"331":{"position":[[181,7]]},"379":{"position":[[171,8]]},"478":{"position":[[56,7]]},"516":{"position":[[234,7],[255,7],[275,7]]},"526":{"position":[[84,8]]},"538":{"position":[[2069,7]]},"540":{"position":[[237,7]]},"594":{"position":[[351,7]]}}}],["compose.yaml",{"_index":443,"t":{"23":{"position":[[1428,12]]},"25":{"position":[[1042,12]]},"55":{"position":[[1723,12],[1783,13],[1812,12],[6270,12],[6502,12],[7805,12],[8150,12],[8382,12],[9953,12]]},"59":{"position":[[322,12],[382,13],[411,12]]},"150":{"position":[[485,12]]},"154":{"position":[[618,12]]},"275":{"position":[[1144,12]]},"621":{"position":[[120,12]]},"629":{"position":[[227,12]]}}}],["compose.yml",{"_index":178,"t":{"15":{"position":[[782,11]]},"25":{"position":[[580,11],[724,11]]},"101":{"position":[[112,12],[145,11]]},"331":{"position":[[230,11]]},"476":{"position":[[254,11],[532,11],[953,11],[1352,11],[1521,11],[2230,11],[2536,11]]},"478":{"position":[[292,11],[393,11],[459,11]]},"526":{"position":[[264,11]]},"528":{"position":[[76,11],[123,11]]},"530":{"position":[[274,11],[315,11],[895,11],[936,11],[1892,11],[1933,11],[2300,11],[2718,11],[2759,11],[3644,11],[3685,11]]},"532":{"position":[[490,11],[531,11],[1071,11],[1112,11],[1214,11],[1255,11],[1356,11],[1397,11],[1494,11],[1535,11]]},"534":{"position":[[223,11],[264,11]]},"536":{"position":[[209,11],[250,11],[352,11],[393,11],[494,11],[535,11],[632,11],[673,11]]},"538":{"position":[[955,11],[1024,11],[1599,11],[1668,11],[1870,12],[1903,11],[2322,11],[2391,11]]},"540":{"position":[[168,11]]}}}],["compositeconfig",{"_index":3398,"t":{"642":{"position":[[1365,15]]}}}],["compris",{"_index":3155,"t":{"559":{"position":[[215,9]]}}}],["comput",{"_index":706,"t":{"46":{"position":[[70,8]]}}}],["concern",{"_index":602,"t":{"33":{"position":[[74,8]]}}}],["concret",{"_index":2537,"t":{"351":{"position":[[259,8]]},"379":{"position":[[275,8]]}}}],["condit",{"_index":936,"t":{"65":{"position":[[2857,9],[3296,10]]},"79":{"position":[[3032,9],[3504,10]]},"140":{"position":[[1508,10]]},"177":{"position":[[169,10]]},"359":{"position":[[898,9]]},"361":{"position":[[583,10]]},"363":{"position":[[1097,10],[1150,10],[1188,9],[1402,9]]},"399":{"position":[[114,11]]},"421":{"position":[[15,11]]},"555":{"position":[[347,10]]}}}],["confid",{"_index":1757,"t":{"174":{"position":[[679,9]]}}}],["config",{"_index":130,"t":{"11":{"position":[[902,7],[995,8],[1190,8]]},"15":{"position":[[100,6],[132,6],[426,6],[760,6],[1303,6],[1341,7],[2007,6],[2029,7],[2329,6],[2557,6],[2760,6],[3273,8],[3479,6],[3809,6],[3973,6],[4296,6],[4336,6],[4484,6],[5733,7],[6280,6]]},"19":{"position":[[502,7]]},"23":{"position":[[1126,8]]},"38":{"position":[[662,6],[1017,6],[1417,6]]},"53":{"position":[[274,6],[285,6],[332,6]]},"55":{"position":[[3385,6]]},"65":{"position":[[1264,6],[3680,6],[3754,6]]},"67":{"position":[[66,6],[740,6],[948,7],[968,6],[1008,6],[1085,6],[1374,7],[1455,7],[1590,7],[1598,6],[1656,6],[1733,6],[1763,6],[2122,6],[2324,7],[2424,6],[2464,6],[2577,6],[2918,7],[2926,6],[2984,6],[3097,6],[3127,6]]},"77":{"position":[[421,6],[432,6],[479,6]]},"79":{"position":[[1405,6],[3888,6],[3962,6]]},"81":{"position":[[66,6],[981,6],[1189,7],[1209,6],[1249,6],[1326,6],[1615,7],[1696,7],[1831,7],[1839,6],[1897,6],[1974,6],[2004,6],[2405,6],[2607,7],[2707,6],[2747,6],[2860,6],[3201,7],[3209,6],[3267,6],[3380,6],[3410,6]]},"85":{"position":[[66,6],[488,6],[694,7],[714,6],[754,6],[829,6],[1116,7],[1195,7],[1328,7],[1336,6],[1394,6],[1469,6],[1499,6],[1896,6],[2098,7],[2196,6],[2236,6],[2347,6],[2688,7],[2696,6],[2754,6],[2865,6],[2895,6]]},"89":{"position":[[434,7]]},"91":{"position":[[66,6],[651,6],[858,7],[878,6],[918,6],[994,6],[1282,7],[1362,7],[1496,7],[1504,6],[1562,6],[1638,6],[1668,6],[2125,6],[2327,7],[2426,6],[2466,6],[2578,6],[2919,7],[2927,6],[2985,6],[3097,6],[3127,6]]},"95":{"position":[[427,7]]},"97":{"position":[[164,7]]},"99":{"position":[[66,6],[747,6],[955,7],[975,6],[1015,6],[1092,6],[1381,7],[1462,7],[1597,7],[1605,6],[1663,6],[1740,6],[1770,6],[2184,6],[2386,7],[2486,6],[2526,6],[2639,6],[2980,7],[2988,6],[3046,6],[3159,6],[3189,6]]},"103":{"position":[[66,6],[424,6],[631,7],[651,6],[691,6],[767,6],[1055,7],[1135,7],[1269,7],[1277,6],[1335,6],[1411,6],[1441,6],[1806,6],[2008,7],[2107,6],[2147,6],[2259,6],[2600,7],[2608,6],[2666,6],[2778,6],[2808,6]]},"107":{"position":[[66,6],[530,6],[743,7],[763,6],[803,6],[885,6],[1179,7],[1265,7],[1405,7],[1413,6],[1471,6],[1553,6],[1583,6],[2006,6],[2208,7],[2313,6],[2353,6],[2471,6],[2812,7],[2820,6],[2878,6],[2996,6],[3026,6]]},"114":{"position":[[1118,6],[1672,6],[1880,7],[1900,6],[1940,6],[2017,6],[2306,7],[2387,7],[2522,7],[2530,6],[2588,6],[2665,6],[2695,6],[3119,6],[3321,7],[3421,6],[3461,6],[3574,6],[3915,7],[3923,6],[3981,6],[4094,6],[4124,6]]},"118":{"position":[[124,7]]},"121":{"position":[[642,6],[1037,6],[1244,7],[1264,6],[1304,6],[1380,6],[1668,7],[1748,7],[1882,7],[1890,6],[1948,6],[2024,6],[2054,6],[2419,6],[2621,7],[2720,6],[2760,6],[2872,6],[3213,7],[3221,6],[3279,6],[3391,6],[3421,6]]},"132":{"position":[[671,7]]},"134":{"position":[[1431,7]]},"136":{"position":[[667,7]]},"140":{"position":[[375,6],[971,7]]},"142":{"position":[[106,7]]},"144":{"position":[[66,6],[550,6],[760,7],[780,6],[820,6],[899,6],[1190,7],[1273,7],[1410,7],[1418,6],[1476,6],[1555,6],[1585,6],[1994,6],[2196,7],[2298,6],[2338,6],[2453,6],[2794,7],[2802,6],[2860,6],[2975,6],[3005,6]]},"150":{"position":[[478,6],[1533,6],[2533,6]]},"152":{"position":[[4,6],[557,6],[1737,6]]},"154":{"position":[[611,6],[1699,6],[1718,7],[1778,6],[2995,6]]},"160":{"position":[[175,6]]},"164":{"position":[[66,6],[577,6],[784,7],[804,6],[844,6],[920,6],[1208,7],[1288,7],[1422,7],[1430,6],[1488,6],[1564,6],[1594,6],[2019,6],[2221,7],[2320,6],[2360,6],[2472,6],[2813,7],[2821,6],[2879,6],[2991,6],[3021,6]]},"166":{"position":[[3403,6]]},"168":{"position":[[66,6],[166,7],[898,6],[1109,7],[1129,6],[1169,6],[1249,6],[1541,7],[1625,7],[1763,7],[1771,6],[1829,6],[1909,6],[1939,6],[2293,6],[2495,7],[2598,6],[2638,6],[2754,6],[3095,7],[3103,6],[3161,6],[3277,6],[3307,6]]},"196":{"position":[[2771,6],[3460,7]]},"198":{"position":[[1756,6]]},"200":{"position":[[66,6],[785,6],[996,7],[1016,6],[1056,6],[1136,6],[1428,7],[1512,7],[1650,7],[1658,6],[1716,6],[1796,6],[1826,6],[2497,6],[2699,7],[2802,6],[2842,6],[2958,6],[3299,7],[3307,6],[3365,6],[3481,6],[3511,6]]},"204":{"position":[[50,6],[658,6]]},"206":{"position":[[66,6],[554,6],[759,7],[779,6],[819,6],[893,6],[1179,7],[1257,7],[1389,7],[1397,6],[1455,6],[1529,6],[1559,6],[1920,6],[2122,7],[2219,6],[2259,6],[2369,6],[2710,7],[2718,6],[2776,6],[2886,6],[2916,6]]},"208":{"position":[[2176,6],[3685,6],[3894,7],[3914,6],[3954,6],[4032,6],[4322,7],[4404,7],[4540,7],[4548,6],[4606,6],[4684,6],[4714,6],[5524,6],[5726,7],[5827,6],[5867,6],[5981,6],[6322,7],[6330,6],[6388,6],[6502,6],[6532,6]]},"210":{"position":[[1071,7],[1837,6]]},"212":{"position":[[66,6],[411,6],[619,7],[639,6],[679,6],[756,6],[1045,7],[1126,7],[1261,7],[1269,6],[1327,6],[1404,6],[1434,6],[1749,6],[1951,7],[2051,6],[2091,6],[2204,6],[2545,7],[2553,6],[2611,6],[2724,6],[2754,6]]},"216":{"position":[[52,6],[666,6]]},"218":{"position":[[66,6],[586,6],[793,7],[813,6],[853,6],[929,6],[1217,7],[1297,7],[1431,7],[1439,6],[1497,6],[1573,6],[1603,6],[1945,6],[2147,7],[2246,6],[2286,6],[2398,6],[2739,7],[2747,6],[2805,6],[2917,6],[2947,6]]},"228":{"position":[[900,6]]},"232":{"position":[[66,6],[655,6],[867,7],[887,6],[927,6],[1008,6],[1301,7],[1386,7],[1525,7],[1533,6],[1591,6],[1672,6],[1702,6],[1999,6],[2201,7],[2305,6],[2345,6],[2462,6],[2803,7],[2811,6],[2869,6],[2986,6],[3016,6]]},"236":{"position":[[66,6],[707,6],[914,7],[934,6],[974,6],[1050,6],[1338,7],[1418,7],[1552,7],[1624,6],[1723,6],[1753,7],[1807,8],[1816,6],[1874,6],[1950,6],[1980,6],[2437,6],[2639,7],[2738,6],[2778,6],[2890,6],[3231,7],[3239,6],[3297,6],[3409,6],[3439,6]]},"238":{"position":[[296,6],[421,6],[892,6],[1098,7],[1118,6],[1158,6],[1233,6],[1520,7],[1599,7],[1732,7],[1803,6],[1902,6],[1931,7],[1984,8],[1993,6],[2051,6],[2126,6],[2156,6],[2553,6],[2755,7],[2853,6],[2893,6],[3004,6],[3345,7],[3353,6],[3411,6],[3522,6],[3552,6]]},"248":{"position":[[500,6]]},"257":{"position":[[66,6],[730,6],[941,7],[961,6],[1001,6],[1081,6],[1373,7],[1457,7],[1595,7],[1603,6],[1661,6],[1741,6],[1771,6],[2079,6],[2281,7],[2384,6],[2424,6],[2540,6],[2881,7],[2889,6],[2947,6],[3063,6],[3093,6]]},"261":{"position":[[66,6],[810,6],[1018,7],[1038,6],[1078,6],[1155,6],[1444,7],[1525,7],[1660,7],[1733,6],[1832,6],[1863,7],[1918,8],[1927,6],[1985,6],[2062,6],[2092,6],[2506,6],[2708,7],[2808,6],[2848,6],[2961,6],[3302,7],[3310,6],[3368,6],[3481,6],[3511,6]]},"265":{"position":[[66,6],[579,6],[792,7],[812,6],[852,6],[934,6],[1228,7],[1314,7],[1454,7],[1532,6],[1631,6],[1667,7],[1727,8],[1736,6],[1794,6],[1876,6],[1906,6],[2329,6],[2531,7],[2636,6],[2676,6],[2794,6],[3135,7],[3143,6],[3201,6],[3319,6],[3349,6]]},"267":{"position":[[180,6]]},"269":{"position":[[66,6],[466,6],[673,7],[693,6],[733,6],[809,6],[1097,7],[1177,7],[1311,7],[1383,6],[1482,6],[1512,7],[1566,8],[1575,6],[1633,6],[1709,6],[1739,6],[2104,6],[2306,7],[2405,6],[2445,6],[2557,6],[2898,7],[2906,6],[2964,6],[3076,6],[3106,6]]},"273":{"position":[[66,6],[529,6],[739,7],[759,6],[799,6],[878,6],[1169,7],[1252,7],[1389,7],[1397,6],[1455,6],[1534,6],[1564,6],[1918,6],[2120,7],[2222,6],[2262,6],[2377,6],[2718,7],[2726,6],[2784,6],[2899,6],[2929,6]]},"277":{"position":[[66,6],[550,6],[756,7],[776,6],[816,6],[891,6],[1178,7],[1257,7],[1390,7],[1398,6],[1456,6],[1531,6],[1561,6],[1894,6],[2096,7],[2194,6],[2234,6],[2345,6],[2686,7],[2694,6],[2752,6],[2863,6],[2893,6]]},"279":{"position":[[121,7]]},"281":{"position":[[66,6],[520,6],[724,7],[744,6],[784,6],[857,6],[1142,7],[1219,7],[1350,7],[1358,6],[1416,6],[1489,6],[1519,6],[1881,6],[2083,7],[2179,6],[2219,6],[2328,6],[2669,7],[2677,6],[2735,6],[2844,6],[2874,6]]},"283":{"position":[[407,6],[967,6]]},"285":{"position":[[154,7]]},"289":{"position":[[66,6],[781,6],[988,7],[1008,6],[1048,6],[1124,6],[1412,7],[1492,7],[1626,7],[1634,6],[1692,6],[1768,6],[1798,6],[2157,6],[2359,7],[2458,6],[2498,6],[2610,6],[2951,7],[2959,6],[3017,6],[3129,6],[3159,6]]},"295":{"position":[[113,6],[223,6],[708,6],[916,7],[936,6],[976,6],[1053,6],[1342,7],[1423,7],[1558,7],[1631,6],[1730,6],[1761,7],[1816,8],[1825,6],[1883,6],[1960,6],[1990,6],[2414,6],[2616,7],[2716,6],[2756,6],[2869,6],[3210,7],[3218,6],[3276,6],[3389,6],[3419,6]]},"297":{"position":[[1222,6],[1365,7],[1627,6]]},"299":{"position":[[64,6]]},"301":{"position":[[191,6],[1021,6],[1227,7],[1247,6],[1287,6],[1362,6],[1649,7],[1728,7],[1861,7],[1869,6],[1927,6],[2002,6],[2032,6],[2447,6],[2649,7],[2747,6],[2787,6],[2898,6],[3239,7],[3247,6],[3305,6],[3416,6],[3446,6]]},"305":{"position":[[66,6],[562,6],[770,7],[790,6],[830,6],[907,6],[1196,7],[1277,7],[1412,7],[1420,6],[1478,6],[1555,6],[1585,6],[2042,6],[2244,7],[2344,6],[2384,6],[2497,6],[2838,7],[2846,6],[2904,6],[3017,6],[3047,6]]},"311":{"position":[[721,7],[971,7],[1198,7]]},"315":{"position":[[1106,7]]},"317":{"position":[[66,6],[539,6],[748,7],[768,6],[808,6],[886,6],[1176,7],[1258,7],[1394,7],[1402,6],[1460,6],[1538,6],[1568,6],[2014,6],[2216,7],[2317,6],[2357,6],[2471,6],[2812,7],[2820,6],[2878,6],[2992,6],[3022,6]]},"319":{"position":[[1573,7]]},"321":{"position":[[66,6],[439,6],[643,7],[663,6],[703,6],[776,6],[1061,7],[1138,7],[1269,7],[1277,6],[1335,6],[1408,6],[1438,6],[1751,6],[1953,7],[2049,6],[2089,6],[2198,6],[2539,7],[2547,6],[2605,6],[2714,6],[2744,6]]},"325":{"position":[[145,7]]},"329":{"position":[[66,6],[475,6],[688,7],[708,6],[748,6],[830,6],[1124,7],[1210,7],[1350,7],[1358,6],[1416,6],[1498,6],[1528,6],[1861,6],[2063,7],[2168,6],[2208,6],[2326,6],[2667,7],[2675,6],[2733,6],[2851,6],[2881,6]]},"333":{"position":[[66,6],[513,6],[722,7],[742,6],[782,6],[860,6],[1150,7],[1232,7],[1368,7],[1376,6],[1434,6],[1512,6],[1542,6],[1897,6],[2099,7],[2200,6],[2240,6],[2354,6],[2695,7],[2703,6],[2761,6],[2875,6],[2905,6]]},"339":{"position":[[114,6]]},"341":{"position":[[1515,6],[1952,6],[2159,7],[2179,6],[2219,6],[2295,6],[2583,7],[2663,7],[2797,7],[2869,6],[2968,6],[2998,7],[3052,8],[3061,6],[3119,6],[3195,6],[3225,6],[3648,6],[3850,7],[3949,6],[3989,6],[4101,6],[4442,7],[4450,6],[4508,6],[4620,6],[4650,6]]},"343":{"position":[[995,6],[4724,7]]},"345":{"position":[[66,6],[657,6],[865,7],[885,6],[925,6],[1002,6],[1291,7],[1372,7],[1507,7],[1515,6],[1573,6],[1650,6],[1680,6],[2143,6],[2345,7],[2445,6],[2485,6],[2598,6],[2939,7],[2947,6],[3005,6],[3118,6],[3148,6]]},"347":{"position":[[16,7]]},"357":{"position":[[44,6],[461,7],[767,7],[1141,7],[1478,7],[1666,7],[1976,7],[2282,7]]},"365":{"position":[[110,6]]},"383":{"position":[[1145,6],[1236,6],[1257,6],[3128,6],[3376,6]]},"393":{"position":[[66,6],[410,6],[620,7],[640,6],[680,6],[759,6],[1050,7],[1133,7],[1270,7],[1278,6],[1336,6],[1415,6],[1445,6],[1754,6],[1956,7],[2058,6],[2098,6],[2213,6],[2554,7],[2562,6],[2620,6],[2735,6],[2765,6]]},"397":{"position":[[1488,6]]},"401":{"position":[[257,7]]},"403":{"position":[[68,6]]},"406":{"position":[[17,7],[323,7]]},"408":{"position":[[17,7],[222,7]]},"410":{"position":[[255,7]]},"414":{"position":[[589,7]]},"457":{"position":[[88,6]]},"470":{"position":[[2344,6]]},"476":{"position":[[656,6]]},"482":{"position":[[319,6],[754,6],[980,6],[1125,6],[1227,6]]},"503":{"position":[[62,7]]},"530":{"position":[[1848,6]]},"544":{"position":[[1527,6]]},"551":{"position":[[197,7]]},"557":{"position":[[99,6]]},"566":{"position":[[612,7]]},"581":{"position":[[557,7]]},"584":{"position":[[17,7],[193,7]]},"586":{"position":[[10,6],[57,7],[80,7],[105,7],[506,7]]},"588":{"position":[[294,7],[528,7]]},"590":{"position":[[202,7],[603,7]]},"594":{"position":[[480,7],[904,7],[1059,7]]},"619":{"position":[[258,6]]},"621":{"position":[[213,6],[278,6],[1217,7]]},"623":{"position":[[1164,6],[1321,7]]},"625":{"position":[[150,6],[194,6],[403,6],[474,6],[490,6],[551,6],[628,7],[960,6],[1017,6],[1237,6]]},"629":{"position":[[76,6],[134,6]]},"638":{"position":[[21,6],[71,6],[104,6],[156,7],[1960,6]]},"640":{"position":[[93,6],[549,6],[575,7],[630,7],[739,7]]},"642":{"position":[[28,7],[86,7],[166,6],[1097,6]]},"653":{"position":[[3428,7]]}}}],["config.json",{"_index":248,"t":{"15":{"position":[[3329,13],[5876,11]]},"23":{"position":[[1513,11]]},"25":{"position":[[1157,11]]},"29":{"position":[[3078,11],[3299,11],[4907,11],[5056,11]]},"31":{"position":[[444,11],[456,11]]},"38":{"position":[[222,11],[344,11],[809,11],[1162,11],[1542,11]]},"67":{"position":[[2185,13],[2492,13],[3012,13]]},"81":{"position":[[2468,13],[2775,13],[3295,13]]},"85":{"position":[[1959,13],[2264,13],[2782,13]]},"91":{"position":[[2188,13],[2494,13],[3013,13]]},"99":{"position":[[2247,13],[2554,13],[3074,13]]},"103":{"position":[[1869,13],[2175,13],[2694,13]]},"107":{"position":[[2069,13],[2381,13],[2906,13]]},"114":{"position":[[3182,13],[3489,13],[4009,13]]},"121":{"position":[[2482,13],[2788,13],[3307,13]]},"144":{"position":[[2057,13],[2366,13],[2888,13]]},"154":{"position":[[1785,11]]},"164":{"position":[[2082,13],[2388,13],[2907,13]]},"168":{"position":[[2356,13],[2666,13],[3189,13]]},"198":{"position":[[2567,11]]},"200":{"position":[[2560,13],[2870,13],[3393,13]]},"206":{"position":[[1983,13],[2287,13],[2804,13]]},"208":{"position":[[5587,13],[5895,13],[6416,13]]},"210":{"position":[[1901,11]]},"212":{"position":[[1812,13],[2119,13],[2639,13]]},"218":{"position":[[2008,13],[2314,13],[2833,13]]},"232":{"position":[[2062,13],[2373,13],[2897,13]]},"236":{"position":[[2500,13],[2806,13],[3325,13]]},"238":{"position":[[2616,13],[2921,13],[3439,13]]},"257":{"position":[[2142,13],[2452,13],[2975,13]]},"261":{"position":[[2569,13],[2876,13],[3396,13]]},"265":{"position":[[2392,13],[2704,13],[3229,13]]},"269":{"position":[[2167,13],[2473,13],[2992,13]]},"273":{"position":[[1981,13],[2290,13],[2812,13]]},"277":{"position":[[1957,13],[2262,13],[2780,13]]},"281":{"position":[[1944,13],[2247,13],[2763,13]]},"289":{"position":[[2220,13],[2526,13],[3045,13]]},"295":{"position":[[2477,13],[2784,13],[3304,13]]},"301":{"position":[[2510,13],[2815,13],[3333,13]]},"305":{"position":[[2105,13],[2412,13],[2932,13]]},"311":{"position":[[729,11],[1206,11]]},"317":{"position":[[2077,13],[2385,13],[2906,13]]},"321":{"position":[[1814,13],[2117,13],[2633,13]]},"329":{"position":[[1924,13],[2236,13],[2761,13]]},"333":{"position":[[1960,13],[2268,13],[2789,13]]},"341":{"position":[[3711,13],[4017,13],[4536,13]]},"345":{"position":[[2206,13],[2513,13],[3033,13]]},"357":{"position":[[51,11],[469,11],[1149,11],[1984,11]]},"393":{"position":[[1817,13],[2126,13],[2648,13]]},"406":{"position":[[25,11]]},"408":{"position":[[25,11]]},"414":{"position":[[178,11]]},"457":{"position":[[246,11]]},"482":{"position":[[390,13]]},"551":{"position":[[205,11],[774,11]]},"553":{"position":[[125,11]]},"584":{"position":[[25,11]]},"586":{"position":[[113,11]]},"588":{"position":[[302,11]]},"590":{"position":[[210,11]]},"592":{"position":[[434,11]]},"594":{"position":[[488,11],[1067,11]]},"621":{"position":[[675,11]]},"625":{"position":[[157,11]]},"638":{"position":[[1073,13]]}}}],["config/applemusic.json",{"_index":1901,"t":{"200":{"position":[[1544,22],[2005,22]]}}}],["config/azuracast.json",{"_index":1403,"t":{"144":{"position":[[1305,21],[1764,21]]}}}],["config/chromecast.json",{"_index":1623,"t":{"168":{"position":[[1657,22],[2118,22]]}}}],["config/config.json",{"_index":250,"t":{"15":{"position":[[3517,19]]},"67":{"position":[[3306,18]]},"81":{"position":[[3589,18]]},"85":{"position":[[3074,18]]},"91":{"position":[[3306,18]]},"99":{"position":[[3368,18]]},"103":{"position":[[2987,18]]},"107":{"position":[[3205,18]]},"114":{"position":[[4303,18]]},"121":{"position":[[3600,18]]},"144":{"position":[[3184,18]]},"164":{"position":[[3200,18]]},"168":{"position":[[3486,18]]},"200":{"position":[[3690,18]]},"206":{"position":[[3095,18]]},"208":{"position":[[6711,18]]},"212":{"position":[[2933,18]]},"218":{"position":[[3126,18]]},"232":{"position":[[3195,18]]},"236":{"position":[[3618,18]]},"238":{"position":[[3731,18]]},"257":{"position":[[3272,18]]},"261":{"position":[[3690,18]]},"265":{"position":[[3528,18]]},"269":{"position":[[3285,18]]},"273":{"position":[[3108,18]]},"277":{"position":[[3072,18]]},"281":{"position":[[3053,18]]},"289":{"position":[[3338,18]]},"295":{"position":[[3598,18]]},"301":{"position":[[3625,18]]},"305":{"position":[[3226,18]]},"317":{"position":[[3201,18]]},"321":{"position":[[2923,18]]},"329":{"position":[[3060,18]]},"333":{"position":[[3084,18]]},"341":{"position":[[4829,18]]},"345":{"position":[[3327,18]]},"393":{"position":[[2944,18]]},"482":{"position":[[1923,20],[1944,20]]}}}],["config/config.json.exampl",{"_index":268,"t":{"15":{"position":[[4435,27]]}}}],["config/data",{"_index":2944,"t":{"478":{"position":[[224,11]]}}}],["config/deezer.json",{"_index":1568,"t":{"164":{"position":[[1320,18],[1773,18]]}}}],["config/discord.json",{"_index":977,"t":{"67":{"position":[[1487,19],[1942,19]]},"81":{"position":[[1728,19],[2183,19]]}}}],["config/endpointlfm.json",{"_index":2053,"t":{"232":{"position":[[1418,23],[1881,23]]}}}],["config/endpointlz.json",{"_index":2094,"t":{"257":{"position":[[1489,22],[1950,22]]}}}],["config/icecast.json",{"_index":1994,"t":{"212":{"position":[[1158,19],[1613,19]]}}}],["config/jellyfin.json",{"_index":1964,"t":{"208":{"position":[[4436,20],[4893,20]]}}}],["config/jriver.json",{"_index":2007,"t":{"218":{"position":[[1329,18],[1782,18]]}}}],["config/kodi.json",{"_index":1924,"t":{"206":{"position":[[1289,16],[1738,16]]}}}],["config/koito.json",{"_index":1088,"t":{"85":{"position":[[1227,17],[1678,17]]},"238":{"position":[[1631,17],[2335,17]]}}}],["config/lastfm.json",{"_index":1131,"t":{"91":{"position":[[1394,18],[1847,18]]},"236":{"position":[[1450,18],[2159,18]]}}}],["config/librefm.json",{"_index":1154,"t":{"99":{"position":[[1494,19],[1949,19]]},"261":{"position":[[1557,19],[2271,19]]}}}],["config/listenbrainz.json",{"_index":1184,"t":{"107":{"position":[[1297,24],[1762,24]]},"265":{"position":[[1346,24],[2085,24]]}}}],["config/maloja.json",{"_index":1175,"t":{"103":{"position":[[1167,18],[1620,18]]},"269":{"position":[[1209,18],[1918,18]]}}}],["config/mopidy.json",{"_index":2198,"t":{"289":{"position":[[1524,18],[1977,18]]}}}],["config/mpd.json",{"_index":2164,"t":{"281":{"position":[[1251,15],[1698,15]]}}}],["config/mpris.json",{"_index":2149,"t":{"277":{"position":[[1289,17],[1740,17]]}}}],["config/multi",{"_index":2966,"t":{"482":{"position":[[1026,15]]}}}],["config/musiccast.json",{"_index":2713,"t":{"393":{"position":[[1165,21],[1624,21]]}}}],["config/musikcube.json",{"_index":2127,"t":{"273":{"position":[[1284,21],[1743,21]]}}}],["config/rocksky.json",{"_index":1255,"t":{"114":{"position":[[2419,19],[2874,19]]},"295":{"position":[[1455,19],[2169,19]]}}}],["config/sonos.json",{"_index":2234,"t":{"301":{"position":[[1760,17],[2211,17]]}}}],["config/spotify.json",{"_index":2295,"t":{"305":{"position":[[1309,19],[1764,19]]}}}],["config/subsonic.json",{"_index":2339,"t":{"317":{"position":[[1290,20],[1747,20]]}}}],["config/systemd/us",{"_index":3019,"t":{"503":{"position":[[79,22]]}}}],["config/systemd/user/multi",{"_index":3021,"t":{"503":{"position":[[108,28]]}}}],["config/tealfm.json",{"_index":1287,"t":{"121":{"position":[[1780,18],[2233,18]]},"341":{"position":[[2695,18],[3404,18]]}}}],["config/vlc.json",{"_index":2355,"t":{"319":{"position":[[1581,15],[2376,15]]},"321":{"position":[[1170,15],[1617,15]]}}}],["config/webscrobbler.json",{"_index":2396,"t":{"329":{"position":[[1242,24],[1707,24]]}}}],["config/ymbridge.json",{"_index":2429,"t":{"333":{"position":[[1264,20],[1721,20]]}}}],["config/ytmusic.json",{"_index":2514,"t":{"345":{"position":[[1404,19],[1859,19]]}}}],["config:/config",{"_index":1439,"t":{"150":{"position":[[1458,18]]},"154":{"position":[[1624,18]]},"331":{"position":[[504,18]]},"403":{"position":[[1024,18]]},"476":{"position":[[310,18],[626,18]]},"478":{"position":[[1044,16]]},"528":{"position":[[468,18]]},"557":{"position":[[2104,18]]}}}],["config_dir",{"_index":196,"t":{"15":{"position":[[1215,10],[2508,11],[3385,10]]},"27":{"position":[[100,11]]},"512":{"position":[[100,11]]},"623":{"position":[[553,10]]},"625":{"position":[[1158,11]]}}}],["config_dir/config.json",{"_index":269,"t":{"15":{"position":[[4499,22]]},"150":{"position":[[2540,22]]},"152":{"position":[[1744,22]]},"154":{"position":[[1931,22],[3130,22]]}}}],["config_dir/endpointlz.json",{"_index":1444,"t":{"150":{"position":[[1793,26]]},"154":{"position":[[2567,26]]}}}],["config_dir/jellyin.json",{"_index":1464,"t":{"152":{"position":[[564,23]]}}}],["config_dir/koito.json",{"_index":1456,"t":{"150":{"position":[[2311,21]]},"152":{"position":[[1515,21]]}}}],["config_dir/lastfm.json",{"_index":132,"t":{"11":{"position":[[1004,22]]},"150":{"position":[[2107,22]]},"152":{"position":[[1117,22]]},"154":{"position":[[2781,22]]}}}],["config_dir/plex.json",{"_index":1447,"t":{"150":{"position":[[1910,20]]},"152":{"position":[[951,20]]}}}],["config_dir/spotify.json",{"_index":1441,"t":{"150":{"position":[[1540,23]]},"154":{"position":[[2314,23]]}}}],["config_dir=/my/absolute/path",{"_index":2963,"t":{"482":{"position":[[696,28]]}}}],["configs.push",{"_index":3390,"t":{"642":{"position":[[860,14]]}}}],["configur",{"_index":66,"t":{"7":{"position":[[778,13]]},"11":{"position":[[535,10],[815,13]]},"13":{"position":[[47,14]]},"15":{"position":[[24,10],[158,13],[181,13],[224,14],[536,13],[1153,13],[1434,9],[1474,13],[1755,13],[1828,13],[1860,13],[1919,14],[1956,14],[2164,13],[2309,14],[3177,13],[3310,13],[3622,9],[3661,13],[3951,13],[4005,9],[4124,11],[4273,14],[5818,10],[6182,13]]},"17":{"position":[[8,13],[82,15],[256,13],[300,9],[321,13]]},"19":{"position":[[23,14],[211,13]]},"21":{"position":[[230,13],[468,14],[598,14]]},"23":{"position":[[216,10],[832,13],[1067,10],[1112,13],[1242,9],[1377,9]]},"25":{"position":[[884,14]]},"27":{"position":[[460,14],[569,13]]},"29":{"position":[[1108,10],[1214,13],[1554,14],[2098,13],[2227,11],[2284,13],[4113,13],[4204,11],[4259,13]]},"31":{"position":[[89,13]]},"38":{"position":[[42,10],[200,10],[302,10]]},"42":{"position":[[499,13]]},"55":{"position":[[512,11],[669,13],[1547,9],[3558,13],[3717,9],[6637,13],[8513,13],[10029,13]]},"59":{"position":[[146,9]]},"65":{"position":[[3206,9],[3559,14]]},"67":{"position":[[13,13],[40,13],[797,13],[1045,13],[1280,13],[1693,13],[2199,13],[2506,13],[3026,13]]},"75":{"position":[[113,13],[315,14],[560,9],[1194,14],[1751,9]]},"79":{"position":[[174,10],[462,10],[2699,10],[3381,9],[3483,10],[3767,14],[4118,10],[4200,14]]},"81":{"position":[[13,13],[40,13],[1038,13],[1286,13],[1521,13],[1934,13],[2482,13],[2789,13],[3309,13]]},"85":{"position":[[13,13],[40,13],[545,13],[789,13],[1024,13],[1429,13],[1973,13],[2278,13],[2796,13]]},"89":{"position":[[546,13]]},"91":{"position":[[13,13],[40,13],[708,13],[954,13],[1189,13],[1598,13],[2202,13],[2508,13],[3027,13]]},"93":{"position":[[359,14]]},"95":{"position":[[540,13]]},"99":{"position":[[13,13],[40,13],[804,13],[1052,13],[1287,13],[1700,13],[2261,13],[2568,13],[3088,13]]},"101":{"position":[[548,13]]},"103":{"position":[[13,13],[40,13],[481,13],[727,13],[962,13],[1371,13],[1883,13],[2189,13],[2708,13]]},"105":{"position":[[385,14]]},"107":{"position":[[13,13],[40,13],[587,13],[845,13],[1080,13],[1513,13],[2083,13],[2395,13],[2920,13]]},"114":{"position":[[779,13],[899,13],[1065,13],[1092,13],[1729,13],[1977,13],[2212,13],[2625,13],[3196,13],[3503,13],[4023,13]]},"118":{"position":[[82,13]]},"121":{"position":[[589,13],[616,13],[1094,13],[1340,13],[1575,13],[1984,13],[2496,13],[2802,13],[3321,13]]},"130":{"position":[[134,13]]},"132":{"position":[[97,13],[403,10],[443,10]]},"134":{"position":[[1684,10]]},"136":{"position":[[299,14]]},"140":{"position":[[1309,11],[1442,10],[1542,10]]},"144":{"position":[[13,13],[40,13],[607,13],[859,13],[1094,13],[1515,13],[2071,13],[2380,13],[2902,13]]},"147":{"position":[[106,13],[291,13],[338,13],[369,13]]},"150":{"position":[[441,13]]},"152":{"position":[[127,13],[172,13],[523,13]]},"154":{"position":[[574,13],[1808,13],[3007,13]]},"164":{"position":[[13,13],[40,13],[634,13],[880,13],[1115,13],[1524,13],[2096,13],[2402,13],[2921,13]]},"166":{"position":[[605,9],[767,10],[795,13],[914,10],[2124,14],[2156,10],[2721,13]]},"168":{"position":[[13,13],[40,13],[93,11],[955,13],[1209,13],[1444,13],[1869,13],[2370,13],[2680,13],[3203,13]]},"170":{"position":[[33,13]]},"172":{"position":[[2124,10],[5093,14],[5274,15]]},"174":{"position":[[18,13],[138,13],[324,14]]},"177":{"position":[[46,10]]},"182":{"position":[[6,13],[33,14]]},"186":{"position":[[103,13]]},"188":{"position":[[513,9]]},"192":{"position":[[124,10]]},"194":{"position":[[648,9]]},"196":{"position":[[2377,13]]},"200":{"position":[[13,13],[40,13],[842,13],[1096,13],[1331,13],[1756,13],[2574,13],[2884,13],[3407,13]]},"202":{"position":[[288,13]]},"206":{"position":[[13,13],[40,13],[611,13],[853,13],[1088,13],[1489,13],[1997,13],[2301,13],[2818,13]]},"208":{"position":[[327,13],[2095,14],[2123,13],[2150,13],[3742,13],[3992,13],[4227,13],[4644,13],[5601,13],[5909,13],[6430,13]]},"210":{"position":[[698,9],[2158,10]]},"212":{"position":[[13,13],[40,13],[468,13],[716,13],[951,13],[1364,13],[1826,13],[2133,13],[2653,13]]},"214":{"position":[[322,13]]},"218":{"position":[[13,13],[40,13],[643,13],[889,13],[1124,13],[1533,13],[2022,13],[2328,13],[2847,13]]},"222":{"position":[[416,9],[484,9],[822,9],[889,9],[916,9],[1013,9],[1376,9],[1615,9],[1681,11],[2273,9],[2682,9]]},"226":{"position":[[78,9]]},"228":{"position":[[12,9],[75,9],[222,9],[434,9],[632,13]]},"232":{"position":[[13,13],[40,13],[712,13],[968,13],[1203,13],[1632,13],[2076,13],[2387,13],[2911,13]]},"234":{"position":[[84,10],[286,9],[351,13],[470,13]]},"236":{"position":[[13,13],[40,13],[764,13],[1010,13],[1245,13],[1586,11],[1910,13],[2514,13],[2820,13],[3339,13]]},"238":{"position":[[99,10],[208,13],[272,14],[340,14],[368,13],[395,13],[949,13],[1193,13],[1428,13],[1766,11],[2086,13],[2630,13],[2935,13],[3453,13]]},"242":{"position":[[402,9],[475,9],[805,9],[878,9],[905,9],[992,9],[1352,9],[1602,9],[1656,11],[2254,9],[2655,9]]},"244":{"position":[[75,11]]},"246":{"position":[[191,13],[327,9]]},"248":{"position":[[12,9],[203,9],[390,13]]},"253":{"position":[[164,13],[214,10],[283,11],[377,13]]},"257":{"position":[[13,13],[40,13],[787,13],[1041,13],[1276,13],[1701,13],[2156,13],[2466,13],[2989,13]]},"259":{"position":[[85,10],[171,9],[236,13],[356,13]]},"261":{"position":[[13,13],[40,13],[867,13],[1115,13],[1350,13],[1694,11],[2022,13],[2583,13],[2890,13],[3410,13]]},"263":{"position":[[106,10],[485,14]]},"265":{"position":[[13,13],[40,13],[636,13],[894,13],[1129,13],[1488,11],[1836,13],[2406,13],[2718,13],[3243,13]]},"267":{"position":[[92,13],[156,14]]},"269":{"position":[[13,13],[40,13],[523,13],[769,13],[1004,13],[1345,11],[1669,13],[2181,13],[2487,13],[3006,13]]},"271":{"position":[[26,9]]},"273":{"position":[[13,13],[40,13],[586,13],[838,13],[1073,13],[1494,13],[1995,13],[2304,13],[2826,13]]},"275":{"position":[[1009,10]]},"277":{"position":[[13,13],[40,13],[607,13],[851,13],[1086,13],[1491,13],[1971,13],[2276,13],[2794,13]]},"281":{"position":[[13,13],[40,13],[577,13],[817,13],[1052,13],[1449,13],[1958,13],[2261,13],[2777,13]]},"283":{"position":[[748,13],[835,13]]},"289":{"position":[[13,13],[40,13],[838,13],[1084,13],[1319,13],[1728,13],[2234,13],[2540,13],[3059,13]]},"291":{"position":[[244,10]]},"295":{"position":[[25,13],[89,14],[170,13],[197,13],[765,13],[1013,13],[1248,13],[1592,11],[1920,13],[2491,13],[2798,13],[3318,13]]},"297":{"position":[[616,10],[858,9]]},"301":{"position":[[138,13],[165,13],[1078,13],[1322,13],[1557,13],[1962,13],[2524,13],[2829,13],[3347,13]]},"303":{"position":[[3097,10],[3409,13],[5363,13]]},"305":{"position":[[13,13],[40,13],[619,13],[867,13],[1102,13],[1515,13],[2119,13],[2426,13],[2946,13]]},"307":{"position":[[491,13]]},"311":{"position":[[337,9],[529,14]]},"313":{"position":[[689,13]]},"317":{"position":[[13,13],[40,13],[596,13],[846,13],[1081,13],[1498,13],[2091,13],[2399,13],[2920,13]]},"319":{"position":[[869,13],[2362,13]]},"321":{"position":[[13,13],[40,13],[496,13],[736,13],[971,13],[1368,13],[1828,13],[2131,13],[2647,13]]},"327":{"position":[[10,10],[279,10]]},"329":{"position":[[13,13],[40,13],[532,13],[790,13],[1025,13],[1458,13],[1938,13],[2250,13],[2775,13]]},"333":{"position":[[13,13],[40,13],[570,13],[820,13],[1055,13],[1472,13],[1974,13],[2282,13],[2803,13]]},"335":{"position":[[323,10]]},"339":{"position":[[25,13],[90,14]]},"341":{"position":[[362,10],[1462,13],[1489,13],[2009,13],[2255,13],[2490,13],[2831,11],[3155,13],[3725,13],[4031,13],[4550,13]]},"343":{"position":[[1879,9],[4984,14]]},"345":{"position":[[13,13],[40,13],[714,13],[962,13],[1197,13],[1610,13],[2220,13],[2527,13],[3047,13]]},"351":{"position":[[314,13]]},"357":{"position":[[23,10],[260,13],[370,9],[1055,11],[1836,14],[1863,13]]},"359":{"position":[[1079,11]]},"361":{"position":[[25,10]]},"368":{"position":[[302,9]]},"377":{"position":[[105,14]]},"379":{"position":[[240,13]]},"381":{"position":[[4,13]]},"383":{"position":[[834,14]]},"393":{"position":[[13,13],[40,13],[467,13],[719,13],[954,13],[1375,13],[1831,13],[2140,13],[2662,13]]},"397":{"position":[[31,14]]},"401":{"position":[[60,14],[149,14]]},"403":{"position":[[12,13],[368,13],[543,13]]},"410":{"position":[[177,13]]},"414":{"position":[[10,13],[102,13],[417,14]]},"448":{"position":[[1646,13],[1929,11]]},"450":{"position":[[52,14]]},"457":{"position":[[304,13],[357,13]]},"460":{"position":[[420,13]]},"468":{"position":[[65,14]]},"470":{"position":[[1458,13]]},"472":{"position":[[74,13]]},"476":{"position":[[130,15],[1843,13]]},"480":{"position":[[37,9]]},"482":{"position":[[376,13]]},"514":{"position":[[52,14]]},"530":{"position":[[156,13],[2069,9]]},"532":{"position":[[241,9]]},"538":{"position":[[117,10],[147,9]]},"540":{"position":[[328,10],[434,10]]},"542":{"position":[[189,13],[227,9],[358,13]]},"544":{"position":[[1604,14]]},"551":{"position":[[171,13],[459,14]]},"553":{"position":[[69,10],[89,13]]},"555":{"position":[[874,13]]},"557":{"position":[[12,13],[50,10],[246,9],[949,13],[1259,13],[1440,13]]},"559":{"position":[[387,14]]},"561":{"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]]},"564":{"position":[[129,13]]},"566":{"position":[[1910,14]]},"568":{"position":[[799,14],[2420,13]]},"573":{"position":[[73,13]]},"590":{"position":[[18,10]]},"592":{"position":[[338,13],[420,13]]},"594":{"position":[[293,13]]},"596":{"position":[[923,11],[1226,13]]},"598":{"position":[[11,14],[99,10],[247,10]]},"600":{"position":[[248,14],[469,10]]},"602":{"position":[[164,14]]},"608":{"position":[[8,13]]},"610":{"position":[[61,13],[194,14]]},"612":{"position":[[34,14]]},"619":{"position":[[178,13]]},"621":{"position":[[362,14],[646,14],[1272,13]]},"625":{"position":[[62,13],[243,13],[1089,13]]},"629":{"position":[[56,10],[168,10]]},"653":{"position":[[3391,10]]}}}],["configuraion",{"_index":993,"t":{"67":{"position":[[2772,12]]},"81":{"position":[[3055,12]]},"85":{"position":[[2542,12]]},"91":{"position":[[2773,12]]},"99":{"position":[[2834,12]]},"103":{"position":[[2454,12]]},"107":{"position":[[2666,12]]},"114":{"position":[[3769,12]]},"121":{"position":[[3067,12]]},"144":{"position":[[2648,12]]},"164":{"position":[[2667,12]]},"168":{"position":[[2949,12]]},"200":{"position":[[3153,12]]},"206":{"position":[[2564,12]]},"208":{"position":[[6176,12]]},"212":{"position":[[2399,12]]},"218":{"position":[[2593,12]]},"232":{"position":[[2657,12]]},"236":{"position":[[3085,12]]},"238":{"position":[[3199,12]]},"257":{"position":[[2735,12]]},"261":{"position":[[3156,12]]},"265":{"position":[[2989,12]]},"269":{"position":[[2752,12]]},"273":{"position":[[2572,12]]},"277":{"position":[[2540,12]]},"281":{"position":[[2523,12]]},"289":{"position":[[2805,12]]},"295":{"position":[[3064,12]]},"301":{"position":[[3093,12]]},"305":{"position":[[2692,12]]},"317":{"position":[[2666,12]]},"321":{"position":[[2393,12]]},"329":{"position":[[2521,12]]},"333":{"position":[[2549,12]]},"341":{"position":[[4296,12]]},"345":{"position":[[2793,12]]},"393":{"position":[[2408,12]]},"559":{"position":[[96,12]]}}}],["configuration/data",{"_index":2659,"t":{"383":{"position":[[941,18]]},"631":{"position":[[539,18]]}}}],["configurea",{"_index":134,"t":{"11":{"position":[[1057,14]]},"19":{"position":[[552,14],[988,14]]},"85":{"position":[[1749,14],[3159,14]]},"91":{"position":[[1937,14],[3409,14]]},"99":{"position":[[2043,14],[3474,14]]},"103":{"position":[[1708,14],[3088,14]]},"107":{"position":[[1855,14],[3305,14]]},"114":{"position":[[2956,14],[4397,14]]},"121":{"position":[[2306,14],[3686,14]]},"150":{"position":[[2171,14],[2376,14],[3192,14],[3389,14]]},"152":{"position":[[1185,14],[1371,14],[1580,14],[2448,14],[2652,14],[2853,14]]},"154":{"position":[[2845,14],[4048,14]]},"198":{"position":[[2920,14]]},"234":{"position":[[422,14]]},"236":{"position":[[1560,11],[1644,14],[2249,14],[3721,14]]},"238":{"position":[[316,14],[1740,11],[1823,14],[2406,14],[3816,14]]},"259":{"position":[[308,14]]},"261":{"position":[[1668,11],[1753,14],[2365,14],[3796,14]]},"265":{"position":[[1462,11],[1552,14],[2178,14],[3628,14]]},"267":{"position":[[200,14]]},"269":{"position":[[1319,11],[1403,14],[2006,14],[3386,14]]},"295":{"position":[[133,14],[1566,11],[1651,14],[2251,14],[3692,14]]},"339":{"position":[[134,14]]},"341":{"position":[[859,14],[1068,14],[1298,14],[2805,11],[2889,14],[3477,14],[4915,14]]},"351":{"position":[[419,14]]},"418":{"position":[[98,14]]},"532":{"position":[[1809,14]]},"536":{"position":[[947,14]]},"592":{"position":[[655,14]]},"621":{"position":[[430,14],[728,14]]},"642":{"position":[[943,12]]}}}],["confirm",{"_index":1102,"t":{"87":{"position":[[390,9]]},"440":{"position":[[507,10]]}}}],["conflict",{"_index":1007,"t":{"69":{"position":[[808,8]]},"75":{"position":[[170,8]]}}}],["confus",{"_index":1823,"t":{"196":{"position":[[921,10]]},"198":{"position":[[1083,8]]},"464":{"position":[[269,7]]}}}],["congratul",{"_index":3471,"t":{"648":{"position":[[2985,16]]}}}],["conjunct",{"_index":3217,"t":{"568":{"position":[[570,11]]}}}],["connect",{"_index":465,"t":{"25":{"position":[[859,10],[910,10],[955,7]]},"46":{"position":[[412,10]]},"55":{"position":[[722,10],[3062,7],[3298,7],[3770,11],[5294,10],[9529,7]]},"61":{"position":[[286,7]]},"140":{"position":[[22,7]]},"166":{"position":[[718,10]]},"168":{"position":[[117,11]]},"204":{"position":[[16,7],[81,7],[553,7],[711,7]]},"206":{"position":[[382,7]]},"208":{"position":[[2699,7]]},"216":{"position":[[16,7],[83,7],[561,7],[719,7]]},"218":{"position":[[396,7]]},"230":{"position":[[862,10]]},"255":{"position":[[867,10]]},"271":{"position":[[59,11]]},"273":{"position":[[383,7]]},"279":{"position":[[46,11]]},"281":{"position":[[361,7]]},"283":{"position":[[360,7],[438,7],[1020,7]]},"289":{"position":[[395,7]]},"301":{"position":[[95,7],[470,9]]},"307":{"position":[[63,7]]},"321":{"position":[[361,7]]},"383":{"position":[[1413,11],[1897,10]]},"448":{"position":[[271,8],[908,7],[1200,7]]},"452":{"position":[[153,10],[485,10]]},"530":{"position":[[2629,7]]},"612":{"position":[[19,11]]},"625":{"position":[[807,10],[913,13],[1049,10],[1334,10],[1509,13]]},"646":{"position":[[1404,11],[1451,10]]}}}],["connect:/run/discord",{"_index":881,"t":{"55":{"position":[[7994,20]]}}}],["connect:/run/user/1000/bu",{"_index":2142,"t":{"275":{"position":[[1642,26]]}}}],["connect:/run/user/1000/discord",{"_index":871,"t":{"55":{"position":[[6105,30],[7662,30]]}}}],["connector",{"_index":2390,"t":{"327":{"position":[[69,11],[149,10],[251,9]]},"329":{"position":[[361,10],[441,10]]}}}],["consecut",{"_index":2882,"t":{"470":{"position":[[685,11]]}}}],["consent",{"_index":2473,"t":{"343":{"position":[[1899,7]]}}}],["conserv",{"_index":1006,"t":{"69":{"position":[[753,14]]},"75":{"position":[[130,12]]}}}],["consid",{"_index":891,"t":{"55":{"position":[[9083,8]]},"297":{"position":[[1843,9]]},"313":{"position":[[418,11]]},"397":{"position":[[107,10],[252,10]]},"470":{"position":[[583,9]]},"499":{"position":[[33,9],[145,8]]},"544":{"position":[[429,8]]},"564":{"position":[[272,10]]},"573":{"position":[[624,8]]},"577":{"position":[[28,9]]}}}],["consider",{"_index":3164,"t":{"561":{"position":[[1370,14]]}}}],["consist",{"_index":1117,"t":{"87":{"position":[[1382,10]]},"109":{"position":[[238,8]]},"116":{"position":[[236,8]]},"179":{"position":[[393,11]]},"210":{"position":[[395,11]]},"353":{"position":[[1138,8]]},"355":{"position":[[557,8]]},"357":{"position":[[116,8]]},"373":{"position":[[54,8]]},"385":{"position":[[127,8]]},"470":{"position":[[968,11]]},"544":{"position":[[1144,10]]},"548":{"position":[[48,10]]},"575":{"position":[[1223,12],[1746,12]]},"592":{"position":[[62,10]]},"600":{"position":[[263,7]]},"602":{"position":[[179,7]]}}}],["consistu",{"_index":1719,"t":{"172":{"position":[[4186,11]]}}}],["consol",{"_index":2472,"t":{"343":{"position":[[1791,7],[4162,7]]},"345":{"position":[[338,7],[425,7],[495,7]]}}}],["const",{"_index":3360,"t":{"638":{"position":[[1806,5]]},"642":{"position":[[614,6],[730,5]]},"644":{"position":[[684,5]]},"646":{"position":[[481,5],[569,5],[803,5],[1765,5],[2362,5]]},"648":{"position":[[1848,5],[1932,5],[2048,5],[2295,5],[2769,5]]},"651":{"position":[[748,5],[965,5]]},"653":{"position":[[3037,5],[3570,5]]}}}],["constraint",{"_index":3179,"t":{"561":{"position":[[6026,11]]}}}],["constructor",{"_index":2674,"t":{"383":{"position":[[2072,11]]},"640":{"position":[[67,11]]},"651":{"position":[[236,11],[500,14]]},"653":{"position":[[659,12],[943,14]]}}}],["constructor(nam",{"_index":3370,"t":{"640":{"position":[[607,17]]}}}],["consult",{"_index":3037,"t":{"510":{"position":[[169,7]]},"514":{"position":[[67,7]]},"542":{"position":[[584,7]]},"631":{"position":[[106,7]]}}}],["consum",{"_index":1196,"t":{"109":{"position":[[516,7]]},"116":{"position":[[514,7]]}}}],["contact",{"_index":1492,"t":{"154":{"position":[[2037,10],[3236,10]]},"311":{"position":[[587,7],[875,7],[905,10],[1352,7],[1382,10]]},"448":{"position":[[140,7],[195,10]]},"532":{"position":[[420,7],[597,7]]},"534":{"position":[[153,7],[330,7]]},"551":{"position":[[307,10],[876,10],[995,10]]},"553":{"position":[[227,10]]},"584":{"position":[[127,10]]},"586":{"position":[[215,10]]},"588":{"position":[[404,10]]},"590":{"position":[[312,10]]},"592":{"position":[[536,10]]},"594":{"position":[[590,10],[1169,10]]},"653":{"position":[[1280,8],[1331,10]]}}}],["contact@mydomain.com",{"_index":1493,"t":{"154":{"position":[[2048,22],[3247,22]]},"551":{"position":[[318,22],[887,22],[1006,23]]},"553":{"position":[[238,22]]},"584":{"position":[[138,22]]},"586":{"position":[[226,22]]},"588":{"position":[[415,22]]},"590":{"position":[[323,22]]},"592":{"position":[[547,22]]},"594":{"position":[[601,22],[1180,22]]}}}],["contain",{"_index":197,"t":{"15":{"position":[[1357,10],[3545,10]]},"25":{"position":[[443,9],[481,9]]},"29":{"position":[[429,8]]},"46":{"position":[[504,9]]},"55":{"position":[[329,9],[873,9],[1037,9],[1496,10],[1628,9],[7729,9],[8842,11]]},"59":{"position":[[95,10],[227,9]]},"65":{"position":[[1210,7],[2420,7],[2515,8],[2763,7],[2889,8],[3410,7]]},"79":{"position":[[1351,7],[2561,7],[2656,8],[2938,7],[3064,8],[3618,7]]},"101":{"position":[[280,10]]},"123":{"position":[[31,8]]},"166":{"position":[[1278,9],[2377,8],[2907,8]]},"208":{"position":[[3003,8],[3127,8],[3237,8],[3348,8]]},"257":{"position":[[524,8]]},"275":{"position":[[735,9],[847,9],[965,10],[1027,9]]},"301":{"position":[[560,8],[666,8],[807,8],[950,8]]},"303":{"position":[[2142,7],[3503,9],[3712,9],[3807,9],[4576,9]]},"331":{"position":[[101,9],[1095,10]]},"355":{"position":[[62,10]]},"357":{"position":[[328,10]]},"377":{"position":[[16,8],[422,9]]},"381":{"position":[[228,8]]},"383":{"position":[[1152,10],[1269,8]]},"454":{"position":[[50,7]]},"476":{"position":[[108,9],[225,9],[514,10],[804,9],[922,9],[1467,9],[1738,9]]},"478":{"position":[[156,9]]},"510":{"position":[[241,7],[328,7]]},"516":{"position":[[74,7]]},"524":{"position":[[321,9],[664,9],[801,9]]},"526":{"position":[[469,9]]},"538":{"position":[[2038,10]]},"540":{"position":[[44,9],[210,10]]},"544":{"position":[[628,8]]},"546":{"position":[[25,8]]},"551":{"position":[[100,8]]},"561":{"position":[[85,9],[387,10],[1863,8],[2112,8],[2790,8],[3323,8],[3651,8]]},"564":{"position":[[35,8]]},"575":{"position":[[258,8],[1071,7]]},"594":{"position":[[90,8]]},"600":{"position":[[31,8]]},"625":{"position":[[784,10]]},"631":{"position":[[397,10]]}}}],["container",{"_index":741,"t":{"55":{"position":[[243,13],[466,13]]}}}],["container_nam",{"_index":788,"t":{"55":{"position":[[2097,15]]},"59":{"position":[[696,15]]},"150":{"position":[[555,15]]},"154":{"position":[[688,15]]},"331":{"position":[[299,15]]},"403":{"position":[[663,15]]},"478":{"position":[[528,15]]},"528":{"position":[[192,15]]},"557":{"position":[[1560,15]]}}}],["content",{"_index":1517,"t":{"158":{"position":[[523,8]]},"196":{"position":[[3714,8]]},"303":{"position":[[3373,8]]},"431":{"position":[[306,8]]},"492":{"position":[[593,8]]},"503":{"position":[[176,8]]},"528":{"position":[[98,8]]}}}],["context",{"_index":2304,"t":{"309":{"position":[[329,7],[456,7]]},"385":{"position":[[374,7]]},"470":{"position":[[2605,8]]},"488":{"position":[[311,7]]}}}],["contextu",{"_index":2326,"t":{"315":{"position":[[341,10]]}}}],["continu",{"_index":1028,"t":{"72":{"position":[[473,9]]},"109":{"position":[[1290,8]]},"116":{"position":[[1284,8]]},"184":{"position":[[545,8]]},"198":{"position":[[1394,12]]},"303":{"position":[[612,8],[4158,8]]},"315":{"position":[[848,8]]},"343":{"position":[[1619,8],[4388,8]]},"361":{"position":[[39,8],[266,9],[474,9],[1451,10]]},"383":{"position":[[747,8]]},"590":{"position":[[919,10]]}}}],["contribut",{"_index":3117,"t":{"544":{"position":[[718,11]]},"546":{"position":[[115,11]]}}}],["contriv",{"_index":1405,"t":{"147":{"position":[[22,10]]}}}],["control",{"_index":255,"t":{"15":{"position":[[3921,7]]},"33":{"position":[[108,7]]},"198":{"position":[[2403,7]]},"202":{"position":[[153,7],[180,7]]},"204":{"position":[[461,7]]},"206":{"position":[[438,7],[509,7]]},"303":{"position":[[2578,8],[4662,7],[4973,8]]},"361":{"position":[[629,7],[791,7],[887,7],[1168,7]]},"454":{"position":[[947,8]]},"470":{"position":[[434,7]]},"561":{"position":[[1003,8],[7119,8]]},"566":{"position":[[134,12]]},"590":{"position":[[122,7]]},"596":{"position":[[1044,8]]}}}],["conveni",{"_index":1274,"t":{"116":{"position":[[2018,12]]},"303":{"position":[[4526,12]]},"401":{"position":[[9,12]]},"414":{"position":[[368,12]]},"440":{"position":[[2,11]]}}}],["convert",{"_index":1638,"t":{"172":{"position":[[296,9],[345,9]]}}}],["cooki",{"_index":1507,"t":{"158":{"position":[[21,6],[274,6],[448,7],[545,6],[655,7]]},"194":{"position":[[329,7],[402,6]]},"343":{"position":[[549,7],[672,6],[784,6],[849,6],[967,6],[1088,9],[1337,8],[1721,8]]},"345":{"position":[[553,6],[1968,9],[3448,9]]},"454":{"position":[[391,7],[555,7],[640,7],[1035,6],[1204,7]]}}}],["cool",{"_index":291,"t":{"15":{"position":[[4940,5]]},"67":{"position":[[243,4]]},"81":{"position":[[243,4]]},"85":{"position":[[237,4]]},"91":{"position":[[240,4]]},"99":{"position":[[243,4]]},"103":{"position":[[240,4]]},"107":{"position":[[228,4]]},"114":{"position":[[1295,4]]},"121":{"position":[[816,4]]},"142":{"position":[[391,4],[428,4],[766,4],[798,4],[849,4],[921,4]]},"144":{"position":[[237,4],[1835,5],[3265,5]]},"162":{"position":[[467,4]]},"164":{"position":[[240,4]]},"168":{"position":[[323,4]]},"190":{"position":[[650,4],[769,4],[857,4],[1044,4]]},"200":{"position":[[252,4]]},"206":{"position":[[234,4]]},"208":{"position":[[2356,4],[4926,5],[6755,5]]},"212":{"position":[[243,4]]},"218":{"position":[[240,4]]},"232":{"position":[[231,4]]},"236":{"position":[[261,4]]},"238":{"position":[[613,4]]},"257":{"position":[[231,4]]},"261":{"position":[[264,4]]},"265":{"position":[[249,4]]},"269":{"position":[[261,4]]},"273":{"position":[[228,4]]},"277":{"position":[[237,4]]},"281":{"position":[[231,4]]},"287":{"position":[[466,4],[488,4],[553,4],[575,4]]},"289":{"position":[[240,4]]},"295":{"position":[[421,4]]},"301":{"position":[[362,4]]},"305":{"position":[[243,4]]},"317":{"position":[[246,4]]},"319":{"position":[[1767,4]]},"321":{"position":[[231,4]]},"329":{"position":[[228,4]]},"333":{"position":[[246,4]]},"341":{"position":[[1710,4]]},"345":{"position":[[231,4]]},"393":{"position":[[237,4]]},"395":{"position":[[346,4],[612,4]]},"397":{"position":[[1465,4]]},"410":{"position":[[89,4]]},"416":{"position":[[134,4],[161,4],[280,4],[307,4],[610,4],[644,4],[838,4],[878,4]]},"561":{"position":[[3167,4],[4590,4],[4651,4],[4925,4]]},"635":{"position":[[80,4],[93,4],[630,4],[704,4],[919,4]]},"638":{"position":[[42,4],[617,4],[645,4],[786,4]]},"640":{"position":[[770,4]]},"644":{"position":[[87,4],[582,4]]},"646":{"position":[[1978,5],[2506,4]]},"648":{"position":[[2432,4]]}}}],["coolplay",{"_index":3348,"t":{"638":{"position":[[1137,12],[1785,13],[1860,12]]},"642":{"position":[[155,10],[716,13],[881,13],[1112,12],[1306,13]]},"644":{"position":[[457,10],[951,12]]}}}],["coolplayer'",{"_index":3361,"t":{"638":{"position":[[2012,12]]}}}],["coolplayer.j",{"_index":3353,"t":{"638":{"position":[[1436,18]]}}}],["coolplayerdata",{"_index":3379,"t":{"642":{"position":[[328,14],[988,14]]}}}],["coolplayersourc",{"_index":3362,"t":{"640":{"position":[[36,16],[460,16]]},"642":{"position":[[131,16],[224,16],[310,17],[511,16],[1070,16]]},"644":{"position":[[357,16]]},"646":{"position":[[50,16],[378,16],[1638,16],[2276,16]]},"648":{"position":[[607,16],[1705,16],[3007,16]]},"651":{"position":[[460,16]]},"653":{"position":[[903,16],[2088,16]]}}}],["coolplayersource(nam",{"_index":3397,"t":{"642":{"position":[[1342,22]]}}}],["coolplayersource.formatplayobj(play",{"_index":3467,"t":{"648":{"position":[[2376,37]]}}}],["coolplayersource.formatplayobj(x",{"_index":3475,"t":{"651":{"position":[[1014,35]]}}}],["coolplayersource.j",{"_index":3380,"t":{"642":{"position":[[350,24]]}}}],["coolplayersource.parseconnectionurl(baseurl",{"_index":3432,"t":{"646":{"position":[[1164,45]]}}}],["coolplayersourceaioconfig",{"_index":3347,"t":{"638":{"position":[[985,25],[1379,26],[1597,26]]}}}],["coolplayersourceconfig",{"_index":3346,"t":{"638":{"position":[[887,22],[1019,22],[1406,22],[1511,23]]},"640":{"position":[[173,22],[583,23],[638,23]]},"642":{"position":[[1384,23]]}}}],["coolplayersourcedata",{"_index":3339,"t":{"638":{"position":[[475,20],[945,20]]}}}],["coordin",{"_index":2249,"t":{"303":{"position":[[903,10]]}}}],["copi",{"_index":732,"t":{"53":{"position":[[181,4]]},"55":{"position":[[686,4]]},"67":{"position":[[1557,4],[2885,4]]},"77":{"position":[[328,4]]},"81":{"position":[[1798,4],[3168,4]]},"83":{"position":[[302,4],[325,4]]},"85":{"position":[[1295,4],[2655,4]]},"91":{"position":[[1463,4],[2886,4]]},"99":{"position":[[1564,4],[2947,4]]},"101":{"position":[[465,4]]},"103":{"position":[[1236,4],[2567,4]]},"107":{"position":[[1372,4],[2779,4]]},"114":{"position":[[2489,4],[3882,4]]},"121":{"position":[[1849,4],[3180,4]]},"144":{"position":[[1377,4],[2761,4]]},"158":{"position":[[510,4],[789,4]]},"164":{"position":[[1389,4],[2780,4]]},"168":{"position":[[1730,4],[3062,4]]},"194":{"position":[[436,4]]},"196":{"position":[[1565,4],[2272,4]]},"200":{"position":[[1617,4],[3266,4]]},"206":{"position":[[1356,4],[2677,4]]},"208":{"position":[[285,4],[4507,4],[6289,4]]},"212":{"position":[[1228,4],[2512,4]]},"218":{"position":[[1398,4],[2706,4]]},"232":{"position":[[1492,4],[2770,4]]},"236":{"position":[[1519,4],[3198,4]]},"238":{"position":[[1699,4],[3312,4]]},"257":{"position":[[1562,4],[2848,4]]},"261":{"position":[[1627,4],[3269,4]]},"265":{"position":[[1421,4],[3102,4]]},"269":{"position":[[1278,4],[2865,4]]},"273":{"position":[[1356,4],[2685,4]]},"277":{"position":[[1357,4],[2653,4]]},"281":{"position":[[1317,4],[2636,4]]},"289":{"position":[[1593,4],[2918,4]]},"295":{"position":[[1525,4],[3177,4]]},"301":{"position":[[1828,4],[3206,4]]},"303":{"position":[[3364,4],[5219,4]]},"305":{"position":[[1379,4],[2805,4]]},"317":{"position":[[1361,4],[2779,4]]},"321":{"position":[[1236,4],[2506,4]]},"329":{"position":[[1317,4],[2634,4]]},"333":{"position":[[1335,4],[2662,4]]},"341":{"position":[[2764,4],[4409,4]]},"343":{"position":[[2522,4]]},"345":{"position":[[1474,4],[2906,4]]},"393":{"position":[[1237,4],[2521,4]]},"457":{"position":[[337,4]]},"492":{"position":[[231,4],[378,6],[481,6]]},"512":{"position":[[347,4]]},"538":{"position":[[394,4],[417,4],[2226,4]]}}}],["core",{"_index":3484,"t":{"653":{"position":[[1937,4]]}}}],["core/atomic.j",{"_index":3405,"t":{"644":{"position":[[312,23]]},"653":{"position":[[851,23]]}}}],["corner",{"_index":1167,"t":{"101":{"position":[[373,7]]},"524":{"position":[[166,6]]},"538":{"position":[[2131,7]]}}}],["corpor",{"_index":3134,"t":{"544":{"position":[[1421,9]]},"548":{"position":[[325,9]]}}}],["correct",{"_index":828,"t":{"55":{"position":[[3520,7]]},"67":{"position":[[1297,8],[2788,8]]},"81":{"position":[[1538,8],[3071,8]]},"85":{"position":[[1041,8],[2558,8]]},"91":{"position":[[1206,8],[2789,8]]},"99":{"position":[[1304,8],[2850,8]]},"103":{"position":[[979,8],[2470,8]]},"107":{"position":[[1097,8],[2682,8]]},"114":{"position":[[2229,8],[3785,8]]},"121":{"position":[[1592,8],[3083,8]]},"144":{"position":[[1111,8],[2664,8]]},"162":{"position":[[928,7]]},"164":{"position":[[1132,8],[2683,8]]},"168":{"position":[[1461,8],[2965,8]]},"190":{"position":[[345,7]]},"200":{"position":[[1348,8],[3169,8]]},"206":{"position":[[1105,8],[2580,8]]},"208":{"position":[[4244,8],[6192,8]]},"212":{"position":[[968,8],[2415,8]]},"218":{"position":[[1141,8],[2609,8]]},"220":{"position":[[589,11]]},"232":{"position":[[1220,8],[2673,8]]},"236":{"position":[[1262,8],[3101,8]]},"238":{"position":[[1445,8],[3215,8]]},"257":{"position":[[1293,8],[2751,8]]},"261":{"position":[[1367,8],[3172,8]]},"265":{"position":[[1146,8],[3005,8]]},"269":{"position":[[1021,8],[2768,8]]},"273":{"position":[[1090,8],[2588,8]]},"277":{"position":[[1103,8],[2556,8]]},"281":{"position":[[1069,8],[2539,8]]},"289":{"position":[[1336,8],[2821,8]]},"295":{"position":[[1265,8],[3080,8]]},"297":{"position":[[404,7]]},"301":{"position":[[1574,8],[3109,8]]},"303":{"position":[[1940,7]]},"305":{"position":[[1119,8],[2708,8]]},"317":{"position":[[1098,8],[2682,8]]},"321":{"position":[[988,8],[2409,8]]},"329":{"position":[[1042,8],[2537,8]]},"333":{"position":[[1072,8],[2565,8]]},"341":{"position":[[2507,8],[4312,8]]},"345":{"position":[[1214,8],[2809,8]]},"375":{"position":[[357,7]]},"393":{"position":[[971,8],[2424,8]]},"412":{"position":[[137,10],[317,10]]},"448":{"position":[[2381,7]]},"450":{"position":[[36,7]]},"470":{"position":[[327,7]]},"482":{"position":[[234,7]]},"542":{"position":[[519,7]]},"544":{"position":[[149,7]]},"566":{"position":[[1273,7]]},"568":{"position":[[1332,9],[2283,7]]},"573":{"position":[[193,10]]},"577":{"position":[[183,8]]},"592":{"position":[[247,10]]},"596":{"position":[[730,12],[2479,7]]}}}],["correct/norm",{"_index":3085,"t":{"532":{"position":[[109,17]]}}}],["correctli",{"_index":201,"t":{"15":{"position":[[1449,9],[3637,9]]},"46":{"position":[[331,9]]},"55":{"position":[[3983,10]]},"67":{"position":[[1396,9]]},"81":{"position":[[1637,9]]},"83":{"position":[[1562,9]]},"85":{"position":[[1138,9]]},"91":{"position":[[1304,9]]},"99":{"position":[[1403,9]]},"103":{"position":[[1077,9]]},"107":{"position":[[1201,9]]},"114":{"position":[[2328,9]]},"121":{"position":[[1690,9]]},"138":{"position":[[39,9],[207,10]]},"140":{"position":[[318,9]]},"144":{"position":[[1212,9]]},"164":{"position":[[1230,9]]},"166":{"position":[[1748,9]]},"168":{"position":[[1563,9]]},"198":{"position":[[1162,9]]},"200":{"position":[[1450,9]]},"206":{"position":[[1201,9]]},"208":{"position":[[4344,9]]},"212":{"position":[[1067,9]]},"218":{"position":[[1239,9]]},"232":{"position":[[1323,9]]},"236":{"position":[[1360,9]]},"238":{"position":[[1542,9]]},"257":{"position":[[1395,9]]},"261":{"position":[[1466,9]]},"265":{"position":[[1250,9]]},"269":{"position":[[1119,9]]},"273":{"position":[[1191,9]]},"277":{"position":[[1200,9]]},"281":{"position":[[1164,9]]},"289":{"position":[[1434,9]]},"295":{"position":[[1364,9]]},"301":{"position":[[1671,9]]},"305":{"position":[[1218,9]]},"317":{"position":[[1198,9]]},"319":{"position":[[2080,9]]},"321":{"position":[[1083,9]]},"329":{"position":[[1146,9]]},"333":{"position":[[1172,9]]},"341":{"position":[[2605,9]]},"345":{"position":[[1313,9]]},"391":{"position":[[117,9],[273,10]]},"393":{"position":[[1072,9]]},"452":{"position":[[1174,10]]},"538":{"position":[[1210,9]]},"575":{"position":[[1767,9]]}}}],["correspond",{"_index":2436,"t":{"341":{"position":[[111,10]]},"385":{"position":[[591,13]]},"561":{"position":[[2803,13]]},"575":{"position":[[744,13]]},"653":{"position":[[1445,13]]}}}],["count",{"_index":511,"t":{"29":{"position":[[646,5],[811,5],[1035,5]]},"42":{"position":[[118,5],[155,5]]},"140":{"position":[[1377,5]]}}}],["counterpart",{"_index":1641,"t":{"172":{"position":[[370,13]]}}}],["countri",{"_index":2420,"t":{"331":{"position":[[1401,7]]},"566":{"position":[[505,7],[946,7],[983,7],[1144,7]]}}}],["cover",{"_index":934,"t":{"65":{"position":[[2553,5],[2714,5],[3014,5],[3374,5]]},"77":{"position":[[55,5]]},"79":{"position":[[2728,5],[2889,5],[3189,5],[3582,5]]},"319":{"position":[[2209,5]]},"544":{"position":[[810,6]]},"546":{"position":[[207,6]]},"594":{"position":[[51,5]]}}}],["coverartarch",{"_index":617,"t":{"36":{"position":[[319,15]]}}}],["cp",{"_index":3386,"t":{"642":{"position":[[736,2],[982,2]]}}}],["cpu",{"_index":678,"t":{"42":{"position":[[392,3]]}}}],["crash",{"_index":889,"t":{"55":{"position":[[9028,8]]},"166":{"position":[[211,7]]}}}],["creat",{"_index":166,"t":{"15":{"position":[[457,6]]},"17":{"position":[[55,8]]},"27":{"position":[[61,7]]},"29":{"position":[[3665,6]]},"42":{"position":[[823,7]]},"53":{"position":[[9,6],[64,8]]},"77":{"position":[[0,8],[109,8],[225,6]]},"83":{"position":[[68,6],[148,6],[260,6]]},"87":{"position":[[83,6],[190,6],[1099,6],[1256,8]]},"93":{"position":[[75,6]]},"101":{"position":[[439,6]]},"105":{"position":[[76,6],[202,6]]},"109":{"position":[[60,6],[841,6]]},"111":{"position":[[197,6]]},"116":{"position":[[70,6],[839,6]]},"118":{"position":[[141,6],[299,6]]},"121":{"position":[[989,7]]},"184":{"position":[[339,6]]},"196":{"position":[[3042,6],[3272,6]]},"198":{"position":[[2482,8]]},"208":{"position":[[39,6],[238,6],[294,7]]},"220":{"position":[[148,6],[237,6]]},"234":{"position":[[148,6],[255,6]]},"238":{"position":[[161,6]]},"240":{"position":[[381,6],[480,6]]},"259":{"position":[[141,6]]},"263":{"position":[[175,6],[301,6]]},"267":{"position":[[43,6]]},"291":{"position":[[35,6]]},"297":{"position":[[1138,6],[1997,8]]},"303":{"position":[[696,7],[1126,7],[1295,8],[1699,6],[1907,6],[2627,6],[3703,6]]},"335":{"position":[[42,6]]},"341":{"position":[[1904,7]]},"343":{"position":[[1799,7],[1833,6],[2141,6],[2438,6],[2458,7]]},"377":{"position":[[435,8]]},"488":{"position":[[216,8]]},"492":{"position":[[320,7]]},"499":{"position":[[422,6]]},"501":{"position":[[150,6]]},"503":{"position":[[0,6],[207,8]]},"512":{"position":[[61,7],[256,7]]},"528":{"position":[[0,6],[62,6]]},"530":{"position":[[290,8],[437,7],[578,6],[829,7],[911,8],[1697,6],[1734,6],[1798,8],[1908,8],[2535,7],[2734,8],[2991,6],[3660,8]]},"532":{"position":[[506,8],[1087,8],[1230,8],[1372,8],[1510,8],[1609,7]]},"534":{"position":[[239,8]]},"536":{"position":[[225,8],[368,8],[510,8],[648,8],[747,7]]},"538":{"position":[[240,6],[352,6],[971,7],[1615,7],[2200,6],[2338,7]]},"540":{"position":[[184,7]]},"581":{"position":[[267,8]]},"612":{"position":[[70,8]]},"623":{"position":[[606,7]]},"633":{"position":[[52,8]]},"638":{"position":[[8,6],[129,6],[634,7],[1888,6]]},"640":{"position":[[9,6]]},"642":{"position":[[1059,6]]},"644":{"position":[[12,6]]}}}],["creation",{"_index":734,"t":{"53":{"position":[[229,8]]},"77":{"position":[[376,8]]},"87":{"position":[[1512,9]]},"303":{"position":[[1057,8]]},"530":{"position":[[3521,8]]},"538":{"position":[[1498,8]]}}}],["creator",{"_index":1690,"t":{"172":{"position":[[1889,8]]}}}],["credenti",{"_index":1031,"t":{"72":{"position":[[609,10],[655,11]]},"226":{"position":[[172,11]]},"303":{"position":[[3184,12]]},"313":{"position":[[282,12]]},"343":{"position":[[1555,11],[2129,11],[2148,11],[4579,11],[4705,11]]},"381":{"position":[[294,12]]},"383":{"position":[[1329,11],[3235,11]]},"476":{"position":[[146,12]]},"596":{"position":[[1169,11]]}}}],["critic",{"_index":1197,"t":{"109":{"position":[[528,11]]},"116":{"position":[[526,11]]},"166":{"position":[[3175,8]]}}}],["crosbi",{"_index":2744,"t":{"408":{"position":[[148,8]]}}}],["cross",{"_index":2918,"t":{"474":{"position":[[0,5]]}}}],["ctrl+shift+i",{"_index":1520,"t":{"158":{"position":[[583,12]]},"196":{"position":[[1117,12]]}}}],["current",{"_index":93,"t":{"11":{"position":[[31,9]]},"25":{"position":[[328,10]]},"44":{"position":[[101,9]]},"50":{"position":[[101,9]]},"69":{"position":[[101,9]]},"87":{"position":[[329,7]]},"93":{"position":[[267,9]]},"128":{"position":[[815,7]]},"136":{"position":[[21,9]]},"166":{"position":[[1627,7]]},"179":{"position":[[465,9]]},"198":{"position":[[150,7]]},"226":{"position":[[235,10]]},"361":{"position":[[137,9],[746,7]]},"365":{"position":[[560,7]]},"476":{"position":[[2035,7]]},"482":{"position":[[1387,7]]},"524":{"position":[[4,7]]},"540":{"position":[[466,7]]},"596":{"position":[[2745,7]]},"635":{"position":[[578,7]]},"638":{"position":[[2112,7]]},"648":{"position":[[397,10],[1889,9],[2670,9]]}}}],["custom",{"_index":131,"t":{"11":{"position":[[922,9]]},"46":{"position":[[167,13]]},"48":{"position":[[233,13]]},"63":{"position":[[110,14]]},"65":{"position":[[1155,6],[3664,11]]},"69":{"position":[[1613,6]]},"77":{"position":[[42,6]]},"79":{"position":[[1296,6],[3872,11],[4165,6]]},"97":{"position":[[70,6]]},"134":{"position":[[1381,10]]},"140":{"position":[[276,6]]},"222":{"position":[[3291,7]]},"230":{"position":[[490,6]]},"242":{"position":[[3245,7]]},"255":{"position":[[490,6]]},"343":{"position":[[2886,6],[3353,8],[3435,6],[3721,6]]},"361":{"position":[[1152,10]]},"391":{"position":[[451,6]]},"454":{"position":[[402,6]]}}}],["cwd/build",{"_index":2795,"t":{"440":{"position":[[473,11]]}}}],["d",{"_index":1163,"t":{"101":{"position":[[323,1]]},"166":{"position":[[1236,1]]},"516":{"position":[[287,1]]},"538":{"position":[[2081,1]]},"540":{"position":[[249,1]]}}}],["d3df",{"_index":2596,"t":{"365":{"position":[[1017,4]]}}}],["daemon",{"_index":1313,"t":{"125":{"position":[[668,7]]},"166":{"position":[[1044,6],[1256,6]]},"275":{"position":[[455,7]]},"505":{"position":[[34,6]]},"596":{"position":[[345,7]]}}}],["daemon/socket",{"_index":1593,"t":{"166":{"position":[[1390,13]]}}}],["daemon/socket:/var/run/avahi",{"_index":1592,"t":{"166":{"position":[[1361,28]]}}}],["dashboard",{"_index":84,"t":{"9":{"position":[[270,10]]},"11":{"position":[[686,9]]},"33":{"position":[[23,9]]},"42":{"position":[[795,9],[841,9],[914,9]]},"65":{"position":[[2799,10],[3459,10]]},"79":{"position":[[2974,10],[3667,10]]},"83":{"position":[[198,9],[541,9],[620,9]]},"89":{"position":[[227,10],[283,9]]},"95":{"position":[[227,10],[283,9]]},"132":{"position":[[525,9]]},"136":{"position":[[423,9]]},"140":{"position":[[750,9]]},"208":{"position":[[141,9],[1731,9],[2008,9]]},"210":{"position":[[850,9]]},"303":{"position":[[1488,9],[1883,9],[5433,9]]},"343":{"position":[[3097,9],[4254,9],[5080,10],[5172,9],[5304,11],[5390,9]]},"373":{"position":[[359,10]]},"454":{"position":[[533,10]]},"476":{"position":[[837,9],[1221,9],[1321,9]]},"488":{"position":[[50,10],[123,10]]},"492":{"position":[[9,10]]},"524":{"position":[[84,10]]},"526":{"position":[[136,9],[526,9]]},"530":{"position":[[1163,9],[3941,9]]},"538":{"position":[[290,9],[629,9],[708,9]]},"540":{"position":[[418,9]]},"621":{"position":[[1069,10]]},"623":{"position":[[33,9]]},"629":{"position":[[10,10]]},"653":{"position":[[3155,9]]}}}],["dashboard.json",{"_index":700,"t":{"42":{"position":[[945,14]]}}}],["data",{"_index":54,"t":{"7":{"position":[[532,5],[651,4]]},"11":{"position":[[1082,7]]},"15":{"position":[[472,4],[506,4],[1314,4],[2632,7],[2835,7],[2989,7],[3490,4],[4982,7],[5239,7],[5966,7]]},"19":{"position":[[165,4],[577,7],[1013,7]]},"23":{"position":[[282,4],[513,4],[1347,4]]},"25":{"position":[[55,4],[97,4],[155,4]]},"29":{"position":[[54,4],[129,4],[379,4],[603,4],[747,4],[921,4],[1152,5],[1407,4],[1610,5],[1639,4],[1721,4],[2196,4],[3649,4]]},"65":{"position":[[2749,4],[2884,4]]},"67":{"position":[[2025,7],[3401,7]]},"69":{"position":[[488,4]]},"75":{"position":[[912,7],[2008,7]]},"79":{"position":[[2924,4],[3059,4]]},"81":{"position":[[2267,7],[3685,7]]},"85":{"position":[[1774,7],[3184,7]]},"87":{"position":[[939,4]]},"91":{"position":[[1962,7],[3434,7]]},"97":{"position":[[139,4]]},"99":{"position":[[2068,7],[3499,7]]},"103":{"position":[[1733,7],[3113,7]]},"107":{"position":[[1880,7],[3330,7]]},"109":{"position":[[257,4],[330,4],[429,4],[551,5],[652,4],[1135,4],[1175,4],[1233,4],[1390,4],[1450,4],[1928,4],[2001,4]]},"114":{"position":[[2981,7],[4422,7]]},"116":{"position":[[255,4],[328,4],[427,4],[549,5],[650,4],[1133,4],[1173,4],[1231,4],[1384,4],[1444,4],[1773,4],[2013,4]]},"121":{"position":[[2331,7],[3711,7]]},"123":{"position":[[14,4]]},"128":{"position":[[133,4],[265,4],[381,4],[540,4],[725,4],[1275,4]]},"132":{"position":[[272,7]]},"134":{"position":[[301,4],[1454,7]]},"136":{"position":[[692,7]]},"140":{"position":[[996,7]]},"142":{"position":[[650,4]]},"144":{"position":[[454,4],[1868,7],[3298,7]]},"150":{"position":[[1613,7],[1875,7],[1974,7],[2196,7],[2401,7],[2644,7],[2898,7],[2989,7],[3217,7],[3414,7]]},"152":{"position":[[658,7],[838,7],[1039,7],[1210,7],[1396,7],[1605,7],[1872,7],[2074,7],[2269,7],[2473,7],[2677,7],[2878,7]]},"154":{"position":[[2015,7],[2387,7],[2649,7],[2870,7],[3214,7],[3591,7],[3845,7],[4073,7]]},"156":{"position":[[61,4]]},"160":{"position":[[315,7]]},"162":{"position":[[685,4],[754,7]]},"164":{"position":[[1873,7],[3313,7]]},"166":{"position":[[435,4],[510,4],[2333,7],[2865,7],[3524,7]]},"168":{"position":[[2180,7],[3557,7]]},"172":{"position":[[109,5],[2004,4],[2071,4],[3631,5]]},"174":{"position":[[499,4],[559,4],[640,4],[737,4]]},"177":{"position":[[422,5],[480,5]]},"179":{"position":[[226,5],[264,5]]},"188":{"position":[[108,4],[406,5]]},"190":{"position":[[48,4],[157,4],[741,4],[1476,4],[1530,5]]},"196":{"position":[[2444,7],[3486,7]]},"198":{"position":[[2774,7],[2945,7]]},"200":{"position":[[757,4],[2111,7],[3805,7]]},"206":{"position":[[1817,7],[3189,7]]},"208":{"position":[[4995,7],[6824,7]]},"210":{"position":[[370,4],[1094,7],[1950,7]]},"212":{"position":[[1697,7],[3029,7]]},"218":{"position":[[1866,7],[3223,7]]},"220":{"position":[[312,4]]},"226":{"position":[[610,4]]},"232":{"position":[[1966,7],[3288,7]]},"234":{"position":[[365,4]]},"236":{"position":[[2274,7],[3746,7]]},"238":{"position":[[2431,7],[3841,7]]},"257":{"position":[[2044,7],[3375,7]]},"259":{"position":[[250,4]]},"261":{"position":[[2390,7],[3821,7]]},"265":{"position":[[2203,7],[3653,7]]},"269":{"position":[[2031,7],[3411,7]]},"273":{"position":[[1846,7],[3221,7]]},"277":{"position":[[1820,7],[3166,7]]},"281":{"position":[[1768,7],[3139,7]]},"287":{"position":[[188,4],[305,5]]},"289":{"position":[[680,4],[2060,7],[3434,7]]},"293":{"position":[[117,5]]},"295":{"position":[[2276,7],[3717,7]]},"297":{"position":[[1107,4],[1412,7],[1714,4]]},"301":{"position":[[2284,7],[3712,7]]},"303":{"position":[[4728,4]]},"305":{"position":[[1862,7],[3336,7]]},"311":{"position":[[809,7],[1011,7],[1286,7],[1496,7]]},"315":{"position":[[162,5]]},"317":{"position":[[1835,7],[3300,7]]},"319":{"position":[[1634,7],[1876,4],[2429,7]]},"321":{"position":[[1687,7],[3009,7]]},"325":{"position":[[234,7],[318,7]]},"329":{"position":[[1786,7],[3146,7]]},"333":{"position":[[1808,7],[3182,7]]},"335":{"position":[[211,4]]},"337":{"position":[[117,5]]},"341":{"position":[[662,4],[884,7],[1093,7],[1323,7],[3502,7],[4940,7]]},"343":{"position":[[1005,4],[1078,7],[2625,7],[3854,7]]},"345":{"position":[[1958,7],[3438,7]]},"347":{"position":[[64,4],[260,4],[506,4],[780,4],[834,4]]},"351":{"position":[[68,4],[85,4],[108,4],[444,7]]},"353":{"position":[[38,4],[103,4],[198,4],[276,4],[341,4],[433,4],[607,4],[654,4],[931,4],[1264,5]]},"355":{"position":[[119,5],[374,4],[451,4],[491,4],[626,4],[702,4]]},"357":{"position":[[311,4],[343,4],[815,7],[1526,7],[1704,7],[2330,7]]},"359":{"position":[[107,4],[1011,4],[1202,5]]},"361":{"position":[[224,5],[525,4]]},"363":{"position":[[289,5],[1537,4]]},"365":{"position":[[378,7]]},"381":{"position":[[190,6],[223,4],[237,4]]},"383":{"position":[[785,5],[870,4],[1264,4],[2455,4],[2553,4],[2686,4]]},"385":{"position":[[31,4],[94,4],[146,4],[303,4],[636,4]]},"393":{"position":[[1715,7],[3045,7]]},"395":{"position":[[91,5],[155,4],[699,5]]},"397":{"position":[[1144,4],[1298,4]]},"399":{"position":[[68,4]]},"401":{"position":[[305,7]]},"406":{"position":[[371,7]]},"408":{"position":[[270,7]]},"410":{"position":[[303,7]]},"412":{"position":[[101,5],[176,5],[209,5],[312,4]]},"414":{"position":[[637,7]]},"418":{"position":[[123,7]]},"448":{"position":[[823,4]]},"464":{"position":[[65,4],[554,4]]},"470":{"position":[[219,4],[1562,7],[2397,7]]},"476":{"position":[[370,4],[709,4],[1861,4]]},"482":{"position":[[330,4],[431,4],[844,4],[1052,4],[1173,4],[1270,4],[2055,7],[2224,7]]},"490":{"position":[[122,4]]},"492":{"position":[[246,4],[279,4],[344,4],[385,4],[488,4],[687,5]]},"499":{"position":[[486,4]]},"526":{"position":[[217,4]]},"528":{"position":[[48,4]]},"532":{"position":[[100,5],[136,5],[1834,7]]},"536":{"position":[[972,7]]},"544":{"position":[[40,4],[202,5],[268,5],[598,4],[1021,4],[1158,4],[1201,4]]},"546":{"position":[[418,4]]},"548":{"position":[[62,4],[105,4]]},"551":{"position":[[151,4],[285,7],[854,7]]},"553":{"position":[[205,7]]},"555":{"position":[[105,7],[301,4],[406,7],[804,4],[991,7]]},"559":{"position":[[176,4]]},"561":{"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]]},"566":{"position":[[246,4]]},"573":{"position":[[238,4],[345,4]]},"575":{"position":[[42,4],[253,4],[439,4],[492,5],[541,4],[1088,4],[1312,4],[1829,4]]},"577":{"position":[[192,4],[242,4],[476,4]]},"579":{"position":[[37,4],[305,4],[368,5],[422,7]]},"581":{"position":[[605,7]]},"584":{"position":[[105,7],[241,7]]},"586":{"position":[[193,7],[554,7]]},"588":{"position":[[33,4],[382,7],[576,7]]},"590":{"position":[[290,7],[651,7]]},"592":{"position":[[514,7],[679,7],[996,7],[1215,4]]},"594":{"position":[[85,4],[568,7],[943,7],[1147,7],[1509,7]]},"596":{"position":[[694,4],[2046,4],[2389,4],[2468,4],[2818,4]]},"600":{"position":[[14,4],[296,4]]},"602":{"position":[[212,4]]},"619":{"position":[[82,4]]},"621":{"position":[[385,5],[474,7],[669,5],[789,7]]},"623":{"position":[[466,5]]},"631":{"position":[[444,4]]},"635":{"position":[[1057,4]]},"638":{"position":[[364,4],[383,4],[939,5],[2031,4]]},"642":{"position":[[976,5]]},"644":{"position":[[68,4],[572,4],[764,5]]},"646":{"position":[[82,5],[117,4]]},"648":{"position":[[1225,4],[1927,4],[2229,4],[2290,4]]},"653":{"position":[[116,4],[204,4],[1796,4],[2541,4],[2641,4]]}}}],["data.baseurl",{"_index":2663,"t":{"383":{"position":[[1179,13]]}}}],["data/credenti",{"_index":436,"t":{"23":{"position":[[1038,16]]}}}],["data_dir",{"_index":431,"t":{"23":{"position":[[900,8]]},"476":{"position":[[453,8]]}}}],["data_dir=./relative/data",{"_index":2964,"t":{"482":{"position":[[767,24]]}}}],["data_dir=/msdata",{"_index":2927,"t":{"476":{"position":[[598,16]]}}}],["databas",{"_index":472,"t":{"27":{"position":[[36,8],[178,8],[205,8],[259,8],[437,8],[527,8]]},"29":{"position":[[26,8],[472,8],[1167,8],[3092,11],[3313,11],[3558,9],[4921,11],[5070,11]]},"150":{"position":[[640,8]]},"154":{"position":[[773,8]]},"188":{"position":[[358,8]]},"355":{"position":[[400,8]]},"476":{"position":[[159,9],[375,10],[1606,8]]},"478":{"position":[[613,8]]},"482":{"position":[[436,10]]},"512":{"position":[[36,8],[119,8],[176,8],[326,8]]},"528":{"position":[[277,8]]},"544":{"position":[[66,9],[619,8],[801,8]]},"546":{"position":[[16,8],[198,8]]},"561":{"position":[[863,8]]},"575":{"position":[[210,8]]},"596":{"position":[[762,8],[2439,8]]},"619":{"position":[[23,8],[295,9]]},"623":{"position":[[407,8],[712,9]]},"625":{"position":[[378,9]]}}}],["date",{"_index":2686,"t":{"385":{"position":[[227,4]]},"454":{"position":[[738,4]]}}}],["datetim",{"_index":2533,"t":{"349":{"position":[[336,9],[717,9]]}}}],["day",{"_index":545,"t":{"29":{"position":[[2222,4],[2446,4],[2876,4],[2907,4],[3140,6],[3245,4],[3399,6],[3419,5],[4199,4],[4421,4],[4733,4],[4763,4],[4901,5],[4968,5],[4999,4],[5155,6],[5175,5]]},"196":{"position":[[2853,4]]}}}],["dayj",{"_index":3403,"t":{"644":{"position":[[186,5],[197,8]]}}}],["dayjs(playedat",{"_index":3415,"t":{"644":{"position":[[916,15]]}}}],["db",{"_index":512,"t":{"29":{"position":[[652,2],[817,2],[1041,2]]}}}],["dbu",{"_index":2133,"t":{"275":{"position":[[450,4],[939,4],[1350,4],[1503,4],[1548,4]]}}}],["dbus_session_bus_address=tcp:host=yourhostip,port=6644",{"_index":2143,"t":{"275":{"position":[[1726,54]]}}}],["dbus_session_bus_address=unix:path=/run/user/uid/bu",{"_index":2137,"t":{"275":{"position":[[1172,52]]}}}],["dead",{"_index":85,"t":{"9":{"position":[[281,4]]}}}],["debian",{"_index":3017,"t":{"501":{"position":[[116,7]]}}}],["debug",{"_index":60,"t":{"7":{"position":[[645,5]]},"27":{"position":[[334,9]]},"29":{"position":[[545,5],[1146,5],[1401,5]]},"31":{"position":[[11,5],[60,11],[121,5],[279,5],[412,5]]},"166":{"position":[[370,5],[3444,5]]},"208":{"position":[[5510,7],[7339,7]]},"297":{"position":[[1187,5],[1260,5]]},"319":{"position":[[1845,5]]},"365":{"position":[[660,5]]},"448":{"position":[[979,5],[1422,5],[1452,5],[2443,9]]},"488":{"position":[[287,7]]},"490":{"position":[[21,5],[58,5]]},"492":{"position":[[217,5],[236,9],[681,5]]},"499":{"position":[[480,5],[579,5]]},"581":{"position":[[170,5],[365,6]]}}}],["debug=sono",{"_index":2217,"t":{"297":{"position":[[1641,13]]}}}],["debug_mode=tru",{"_index":598,"t":{"31":{"position":[[531,15]]},"297":{"position":[[1277,15]]},"365":{"position":[[250,15]]},"448":{"position":[[1524,16]]},"470":{"position":[[1650,15]]}}}],["debugdata.json",{"_index":2997,"t":{"492":{"position":[[419,15]]}}}],["debugmod",{"_index":270,"t":{"15":{"position":[[4524,12]]},"31":{"position":[[470,12]]}}}],["decad",{"_index":1414,"t":{"150":{"position":[[387,7]]}}}],["decid",{"_index":1785,"t":{"190":{"position":[[82,7],[1265,7]]},"230":{"position":[[1084,6]]},"255":{"position":[[1095,6]]},"343":{"position":[[163,7]]},"561":{"position":[[1408,6]]},"621":{"position":[[1087,6]]}}}],["declar",{"_index":3369,"t":{"640":{"position":[[567,7]]}}}],["decod",{"_index":2322,"t":{"313":{"position":[[303,9]]}}}],["dedupl",{"_index":1864,"t":{"198":{"position":[[570,12],[1345,14]]}}}],["deezer",{"_index":1304,"t":{"125":{"position":[[165,6]]},"156":{"position":[[54,6],[112,6],[279,6]]},"158":{"position":[[33,6],[217,7]]},"160":{"position":[[30,6],[55,6],[161,6]]},"162":{"position":[[71,6],[222,6],[296,7],[902,6]]},"164":{"position":[[350,6],[654,6],[861,6],[1201,6],[1281,6],[1505,6],[2240,6],[2432,6],[2951,6],[3464,8]]},"596":{"position":[[173,6]]}}}],["deezer'",{"_index":1504,"t":{"156":{"position":[[98,8]]},"158":{"position":[[144,8]]}}}],["deezer.com",{"_index":1511,"t":{"158":{"position":[[306,11],[470,11],[567,11],[689,10]]}}}],["deezer.json",{"_index":1528,"t":{"160":{"position":[[259,11],[279,11]]}}}],["deezer_account_id",{"_index":1558,"t":{"164":{"position":[[373,17]]}}}],["deezer_account_id=896225281",{"_index":1548,"t":{"162":{"position":[[624,27]]}}}],["deezer_arl",{"_index":1556,"t":{"164":{"position":[[313,10]]}}}],["deezer_en",{"_index":1555,"t":{"164":{"position":[[255,13]]}}}],["deezer_id",{"_index":1553,"t":{"164":{"position":[[127,9],[210,9]]}}}],["deezer_nam",{"_index":1554,"t":{"164":{"position":[[182,11]]}}}],["deezer_user_ag",{"_index":1560,"t":{"164":{"position":[[449,17]]}}}],["deezerarl",{"_index":1550,"t":{"162":{"position":[[710,12]]}}}],["default",{"_index":99,"t":{"11":{"position":[[161,7],[768,7]]},"15":{"position":[[1264,8],[3440,8],[3757,7],[4136,7]]},"21":{"position":[[41,7],[153,7]]},"23":{"position":[[96,7],[859,8]]},"29":{"position":[[1247,7],[2073,8],[2534,7],[4080,8],[4459,7]]},"55":{"position":[[5198,7]]},"65":{"position":[[324,7],[439,8],[2976,7],[3500,7],[3578,7],[3643,7]]},"67":{"position":[[107,7],[708,8]]},"69":{"position":[[788,7]]},"75":{"position":[[105,7]]},"79":{"position":[[227,8],[415,7],[431,7],[580,8],[3151,7],[3708,7],[3786,7],[3851,7]]},"81":{"position":[[107,7],[681,8]]},"85":{"position":[[107,7]]},"91":{"position":[[107,7]]},"99":{"position":[[107,7]]},"103":{"position":[[107,7]]},"107":{"position":[[107,7],[391,7]]},"109":{"position":[[1469,7]]},"114":{"position":[[1159,7]]},"116":{"position":[[1463,7]]},"121":{"position":[[683,7]]},"132":{"position":[[358,7]]},"134":{"position":[[1304,7]]},"136":{"position":[[546,7]]},"140":{"position":[[854,7],[1241,7],[1574,8],[1655,7]]},"144":{"position":[[107,7]]},"154":{"position":[[1840,8],[1856,8],[2078,11],[3039,8],[3055,8],[3277,11]]},"164":{"position":[[107,7]]},"166":{"position":[[1908,8],[2442,8],[3029,8]]},"168":{"position":[[202,7]]},"186":{"position":[[23,8]]},"198":{"position":[[484,7],[1150,8],[2085,8],[2650,11]]},"200":{"position":[[107,7]]},"204":{"position":[[174,7],[277,7]]},"206":{"position":[[107,7]]},"208":{"position":[[524,8],[536,10],[1354,7],[2217,7]]},"210":{"position":[[639,8],[954,7],[1287,7]]},"212":{"position":[[107,7]]},"216":{"position":[[176,7],[281,7]]},"218":{"position":[[107,7]]},"222":{"position":[[2773,9]]},"232":{"position":[[107,7]]},"236":{"position":[[107,7]]},"238":{"position":[[462,7]]},"242":{"position":[[2736,9]]},"244":{"position":[[197,7]]},"257":{"position":[[107,7]]},"261":{"position":[[107,7]]},"265":{"position":[[107,7],[426,7]]},"269":{"position":[[107,7]]},"271":{"position":[[405,7]]},"273":{"position":[[107,7]]},"277":{"position":[[107,7]]},"281":{"position":[[107,7]]},"283":{"position":[[531,7],[634,7]]},"289":{"position":[[107,7]]},"295":{"position":[[264,7]]},"301":{"position":[[232,7]]},"305":{"position":[[107,7],[519,7]]},"307":{"position":[[112,8],[184,8],[551,7],[695,9],[1061,9],[1360,8],[1372,7]]},"317":{"position":[[107,7]]},"321":{"position":[[107,7]]},"329":{"position":[[107,7]]},"333":{"position":[[107,7]]},"341":{"position":[[1556,7]]},"345":{"position":[[107,7]]},"357":{"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]]},"361":{"position":[[257,8],[334,8],[465,8],[602,7],[874,7]]},"368":{"position":[[159,7]]},"383":{"position":[[2140,8],[2242,8]]},"391":{"position":[[378,7]]},"393":{"position":[[107,7]]},"397":{"position":[[174,7],[327,9],[619,8],[1045,8]]},"399":{"position":[[431,8]]},"401":{"position":[[131,8],[423,7]]},"403":{"position":[[4,7]]},"406":{"position":[[115,11],[132,7],[211,7]]},"408":{"position":[[115,11]]},"410":{"position":[[221,7]]},"414":{"position":[[94,7],[160,9],[257,11],[344,7]]},"444":{"position":[[31,8]]},"476":{"position":[[754,8],[914,7]]},"520":{"position":[[4,7]]},"551":{"position":[[918,7]]},"553":{"position":[[106,9],[266,11]]},"555":{"position":[[848,8],[1164,8],[1236,8]]},"557":{"position":[[262,8],[460,7],[479,7],[941,7]]},"559":{"position":[[84,7]]},"561":{"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]]},"564":{"position":[[195,7]]},"566":{"position":[[1932,11]]},"568":{"position":[[2466,11]]},"586":{"position":[[35,7],[256,11]]},"588":{"position":[[445,11],[492,8]]},"590":{"position":[[43,8],[91,7],[353,11]]},"592":{"position":[[310,7],[575,11]]},"594":{"position":[[631,11],[657,8],[1210,11],[1236,8]]},"621":{"position":[[913,7]]},"625":{"position":[[1143,9]]},"635":{"position":[[648,7]]},"640":{"position":[[446,7]]},"642":{"position":[[382,7],[1016,8],[1172,9],[1440,8]]},"644":{"position":[[343,7]]},"646":{"position":[[261,7],[364,7],[1624,7],[2262,7]]},"648":{"position":[[1691,7]]},"651":{"position":[[446,7]]},"653":{"position":[[889,7],[2808,7],[3480,7]]}}}],["default/exampl",{"_index":2840,"t":{"450":{"position":[[372,15]]}}}],["defaultconfigurea",{"_index":3391,"t":{"642":{"position":[[956,19]]}}}],["defaults/filt",{"_index":3080,"t":{"530":{"position":[[3060,18]]}}}],["defin",{"_index":138,"t":{"11":{"position":[[1166,6]]},"15":{"position":[[2418,7]]},"21":{"position":[[0,7]]},"23":{"position":[[933,7]]},"75":{"position":[[658,7]]},"109":{"position":[[412,7]]},"116":{"position":[[410,7]]},"204":{"position":[[373,6]]},"216":{"position":[[377,6]]},"234":{"position":[[446,7]]},"248":{"position":[[480,7]]},"259":{"position":[[332,7]]},"283":{"position":[[730,6]]},"301":{"position":[[9,6]]},"307":{"position":[[748,7]]},"313":{"position":[[739,7]]},"325":{"position":[[621,8]]},"353":{"position":[[1170,6]]},"355":{"position":[[183,6]]},"357":{"position":[[243,8],[956,8],[1083,6]]},"361":{"position":[[726,7]]},"383":{"position":[[72,7]]},"401":{"position":[[36,6]]},"414":{"position":[[395,6]]},"440":{"position":[[456,7]]},"476":{"position":[[1116,7]]},"551":{"position":[[501,7],[582,6],[650,7]]},"561":{"position":[[298,6],[1146,7],[7014,7]]},"625":{"position":[[257,7]]},"646":{"position":[[975,10],[1130,10]]}}}],["definit",{"_index":1335,"t":{"128":{"position":[[1166,12]]}}}],["degre",{"_index":3448,"t":{"648":{"position":[[468,7]]}}}],["delet",{"_index":530,"t":{"29":{"position":[[1122,6],[1323,8],[1375,6],[1666,8],[2167,8],[2794,6],[3043,8],[3189,6],[3461,8],[3498,6],[3582,6],[3624,8],[3996,8],[4097,8],[4174,6],[4216,8],[4523,6],[4592,6],[4657,6],[4708,6],[4784,6],[4869,8],[4980,6],[5031,7]]},"343":{"position":[[2042,6]]},"440":{"position":[[307,6]]},"442":{"position":[[194,7]]},"623":{"position":[[949,7]]}}}],["deleteaft",{"_index":588,"t":{"29":{"position":[[4950,14],[5099,14]]}}}],["delim",{"_index":2774,"t":{"431":{"position":[[322,5],[408,13],[593,11]]}}}],["delim>\\\\s*\\\\/\\\\",{"_index":2779,"t":{"431":{"position":[[707,34]]}}}],["delim>\\\\s*\\\\\\\\\\",{"_index":2777,"t":{"431":{"position":[[489,21]]}}}],["delimit",{"_index":1619,"t":{"168":{"position":[[472,9],[593,9],[713,9],[831,9]]},"208":{"position":[[2795,9],[2914,9],[3036,9],[3160,9],[3269,9],[3381,9],[3631,9]]},"277":{"position":[[404,9],[512,9]]},"301":{"position":[[593,9],[699,9],[840,9],[983,9]]},"357":{"position":[[584,10],[629,13],[663,10],[1248,13],[2099,10],[2144,13],[2178,10]]},"395":{"position":[[297,10],[404,10],[468,9]]},"397":{"position":[[118,10],[196,10],[263,10],[300,10]]},"406":{"position":[[140,10],[185,13],[219,10]]},"431":{"position":[[59,9],[232,9],[351,9]]},"530":{"position":[[2913,9]]},"557":{"position":[[299,9]]},"561":{"position":[[4243,10],[5177,9],[5573,10]]}}}],["delimitersextra",{"_index":2728,"t":{"397":{"position":[[46,15]]}}}],["deliv",{"_index":769,"t":{"55":{"position":[[1130,7]]}}}],["delux",{"_index":3228,"t":{"568":{"position":[[1775,6]]}}}],["demon",{"_index":2587,"t":{"365":{"position":[[793,6]]}}}],["deni",{"_index":2208,"t":{"297":{"position":[[714,6]]},"341":{"position":[[999,4]]},"566":{"position":[[1247,4]]},"577":{"position":[[45,4]]}}}],["depend",{"_index":470,"t":{"27":{"position":[[16,7]]},"55":{"position":[[1188,7]]},"69":{"position":[[186,6]]},"166":{"position":[[1698,9]]},"184":{"position":[[313,9]]},"186":{"position":[[138,9],[280,9],[363,9],[402,9]]},"188":{"position":[[184,9]]},"196":{"position":[[187,9]]},"377":{"position":[[188,12]]},"383":{"position":[[1653,7]]},"460":{"position":[[174,12]]},"512":{"position":[[16,7]]},"648":{"position":[[488,9]]}}}],["deploy",{"_index":816,"t":{"55":{"position":[[2737,6]]},"59":{"position":[[1336,6]]},"403":{"position":[[527,6]]},"557":{"position":[[1424,6]]}}}],["deprec",{"_index":1237,"t":{"114":{"position":[[447,10],[958,10]]}}}],["depth",{"_index":3040,"t":{"510":{"position":[[394,5]]},"596":{"position":[[1467,5]]},"631":{"position":[[272,5]]}}}],["deriv",{"_index":3452,"t":{"648":{"position":[[1178,8]]}}}],["descend",{"_index":1698,"t":{"172":{"position":[[3356,10]]}}}],["describ",{"_index":329,"t":{"17":{"position":[[283,9]]},"40":{"position":[[532,9]]},"83":{"position":[[772,8]]},"379":{"position":[[216,10]]},"383":{"position":[[420,10]]},"633":{"position":[[100,10]]}}}],["descript",{"_index":947,"t":{"67":{"position":[[115,11]]},"81":{"position":[[115,11]]},"85":{"position":[[115,11]]},"91":{"position":[[115,11]]},"99":{"position":[[115,11]]},"103":{"position":[[115,11]]},"107":{"position":[[115,11]]},"114":{"position":[[1167,11]]},"121":{"position":[[691,11]]},"142":{"position":[[813,14]]},"144":{"position":[[115,11]]},"164":{"position":[[115,11]]},"168":{"position":[[210,11]]},"200":{"position":[[115,11]]},"206":{"position":[[115,11]]},"208":{"position":[[2225,11]]},"212":{"position":[[115,11]]},"218":{"position":[[115,11]]},"232":{"position":[[115,11]]},"236":{"position":[[115,11]]},"238":{"position":[[470,11]]},"257":{"position":[[115,11]]},"261":{"position":[[115,11]]},"265":{"position":[[115,11]]},"269":{"position":[[115,11]]},"273":{"position":[[115,11]]},"277":{"position":[[115,11]]},"281":{"position":[[115,11]]},"289":{"position":[[115,11]]},"295":{"position":[[272,11]]},"301":{"position":[[240,11]]},"305":{"position":[[115,11]]},"317":{"position":[[115,11]]},"321":{"position":[[115,11]]},"329":{"position":[[115,11]]},"333":{"position":[[115,11]]},"341":{"position":[[1564,11]]},"345":{"position":[[115,11]]},"393":{"position":[[115,11]]}}}],["description=multi",{"_index":3023,"t":{"503":{"position":[[248,17]]}}}],["descriptions/typ",{"_index":963,"t":{"67":{"position":[[884,19],[2260,19]]},"81":{"position":[[1125,19],[2543,19]]},"85":{"position":[[630,19],[2034,19]]},"91":{"position":[[794,19],[2263,19]]},"99":{"position":[[891,19],[2322,19]]},"103":{"position":[[567,19],[1944,19]]},"107":{"position":[[679,19],[2144,19]]},"114":{"position":[[1816,19],[3257,19]]},"121":{"position":[[1180,19],[2557,19]]},"144":{"position":[[696,19],[2132,19]]},"164":{"position":[[720,19],[2157,19]]},"168":{"position":[[1045,19],[2431,19]]},"200":{"position":[[932,19],[2635,19]]},"206":{"position":[[695,19],[2058,19]]},"208":{"position":[[3830,19],[5662,19]]},"212":{"position":[[555,19],[1887,19]]},"218":{"position":[[729,19],[2083,19]]},"232":{"position":[[803,19],[2137,19]]},"236":{"position":[[850,19],[2575,19]]},"238":{"position":[[1034,19],[2691,19]]},"257":{"position":[[877,19],[2217,19]]},"261":{"position":[[954,19],[2644,19]]},"265":{"position":[[728,19],[2467,19]]},"269":{"position":[[609,19],[2242,19]]},"273":{"position":[[675,19],[2056,19]]},"277":{"position":[[692,19],[2032,19]]},"281":{"position":[[660,19],[2019,19]]},"289":{"position":[[924,19],[2295,19]]},"295":{"position":[[852,19],[2552,19]]},"301":{"position":[[1163,19],[2585,19]]},"305":{"position":[[706,19],[2180,19]]},"317":{"position":[[684,19],[2152,19]]},"321":{"position":[[579,19],[1889,19]]},"329":{"position":[[624,19],[1999,19]]},"333":{"position":[[658,19],[2035,19]]},"341":{"position":[[2095,19],[3786,19]]},"345":{"position":[[801,19],[2281,19]]},"393":{"position":[[556,19],[1892,19]]}}}],["design",{"_index":571,"t":{"29":{"position":[[3776,8]]},"109":{"position":[[1743,6]]},"196":{"position":[[121,8]]},"323":{"position":[[583,8]]}}}],["desir",{"_index":1490,"t":{"154":{"position":[[1922,8],[3121,8]]},"577":{"position":[[148,7]]}}}],["desired/allow",{"_index":3157,"t":{"559":{"position":[[340,15]]}}}],["desktop",{"_index":705,"t":{"46":{"position":[[62,7]]},"55":{"position":[[368,7],[3342,8]]},"67":{"position":[[1974,10],[3350,10]]},"208":{"position":[[93,7]]},"273":{"position":[[1814,10],[3189,10]]},"277":{"position":[[1770,10],[3116,10]]},"281":{"position":[[1757,10],[3128,10]]},"289":{"position":[[2016,9],[3390,9]]},"321":{"position":[[1676,10],[2998,10]]},"470":{"position":[[2741,9],[2825,7]]},"596":{"position":[[366,8]]},"600":{"position":[[112,7]]}}}],["destin",{"_index":1298,"t":{"125":{"position":[[56,11]]},"186":{"position":[[90,12],[180,12]]}}}],["deta",{"_index":508,"t":{"29":{"position":[[551,4]]}}}],["detail",{"_index":55,"t":{"7":{"position":[[538,8]]},"29":{"position":[[2258,7],[4233,7]]},"55":{"position":[[1401,8],[3915,7]]},"59":{"position":[[0,8]]},"166":{"position":[[331,8]]},"172":{"position":[[4556,6]]},"196":{"position":[[2194,7],[3424,9],[3444,7]]},"251":{"position":[[0,7]]},"253":{"position":[[0,7]]},"343":{"position":[[374,8],[412,7]]},"431":{"position":[[0,7]]},"470":{"position":[[2594,6],[2624,8]]},"482":{"position":[[1739,7]]},"492":{"position":[[49,7],[81,7]]},"573":{"position":[[782,7]]},"596":{"position":[[1057,8]]},"614":{"position":[[0,8]]},"631":{"position":[[28,8],[218,8],[576,6]]}}}],["detect",{"_index":48,"t":{"7":{"position":[[451,8],[741,8]]},"55":{"position":[[3509,6]]},"63":{"position":[[82,9]]},"83":{"position":[[999,8]]},"160":{"position":[[477,6]]},"172":{"position":[[1349,8],[4806,9],[5031,9]]},"177":{"position":[[582,8]]},"179":{"position":[[366,8]]},"188":{"position":[[273,9]]},"198":{"position":[[1172,7]]},"208":{"position":[[1068,7]]},"315":{"position":[[1012,9]]},"343":{"position":[[431,9]]},"460":{"position":[[48,9]]},"470":{"position":[[7,7],[731,8],[1259,9],[1435,10]]}}}],["detectstalenowplayingfromminutesago",{"_index":2332,"t":{"315":{"position":[[1049,35]]},"317":{"position":[[1964,38],[3429,38]]}}}],["determin",{"_index":104,"t":{"11":{"position":[[248,11],[1271,10]]},"55":{"position":[[3622,9],[3900,9]]},"65":{"position":[[180,10]]},"69":{"position":[[1103,9]]},"75":{"position":[[61,9],[1406,9]]},"79":{"position":[[271,10]]},"83":{"position":[[471,9]]},"128":{"position":[[574,9]]},"134":{"position":[[333,10],[847,11],[987,9],[1125,9]]},"136":{"position":[[159,9]]},"210":{"position":[[532,9],[1449,9]]},"303":{"position":[[133,9],[1926,9]]},"359":{"position":[[1113,9]]},"383":{"position":[[1955,10]]},"448":{"position":[[1813,9]]},"450":{"position":[[444,9]]},"460":{"position":[[391,9]]},"470":{"position":[[70,9],[339,9]]},"488":{"position":[[438,9]]},"538":{"position":[[559,9]]},"642":{"position":[[40,10]]},"648":{"position":[[863,9],[1439,9]]},"653":{"position":[[92,11],[339,13],[1861,10],[2275,10]]}}}],["devcontain",{"_index":2631,"t":{"375":{"position":[[111,13],[399,12]]},"377":{"position":[[150,12],[278,12],[337,13]]}}}],["develop",{"_index":728,"t":{"53":{"position":[[118,9]]},"55":{"position":[[9066,9]]},"77":{"position":[[265,9]]},"116":{"position":[[1648,11],[1680,12]]},"158":{"position":[[340,9],[604,9]]},"194":{"position":[[199,9]]},"196":{"position":[[134,11],[373,9],[426,9],[493,9],[717,9],[1093,9],[1696,9],[1806,11],[1905,7],[2911,9],[3009,9],[3251,9],[3395,9]]},"303":{"position":[[583,9],[1314,9],[1644,9],[1832,9],[1873,9],[4644,9]]},"331":{"position":[[1437,9]]},"343":{"position":[[1484,9]]},"375":{"position":[[0,11]]},"377":{"position":[[48,11],[167,11]]},"387":{"position":[[7,11],[39,11]]},"520":{"position":[[92,11],[125,11]]},"614":{"position":[[26,11]]},"633":{"position":[[243,12]]},"635":{"position":[[12,9]]},"638":{"position":[[422,11]]}}}],["devic",{"_index":1008,"t":{"69":{"position":[[912,7],[1495,6],[1558,6]]},"75":{"position":[[258,6],[395,6]]},"130":{"position":[[65,6],[186,7]]},"166":{"position":[[14,6],[461,6],[729,8],[743,7],[1589,7],[1778,6]]},"168":{"position":[[110,6],[450,7],[572,6]]},"177":{"position":[[22,6]]},"184":{"position":[[402,6],[461,6]]},"208":{"position":[[2976,6],[3100,6]]},"299":{"position":[[13,7]]},"301":{"position":[[497,6],[548,6],[654,6],[789,6],[932,6]]},"391":{"position":[[424,6]]},"464":{"position":[[100,7],[581,6]]},"466":{"position":[[41,6]]}}}],["device/play",{"_index":1775,"t":{"184":{"position":[[36,13]]}}}],["device/receiv",{"_index":2703,"t":{"391":{"position":[[18,16]]}}}],["device/us",{"_index":1297,"t":{"125":{"position":[[35,11]]},"385":{"position":[[444,11]]}}}],["devices/group",{"_index":2223,"t":{"299":{"position":[[117,14]]}}}],["devices/sourc",{"_index":1776,"t":{"184":{"position":[[117,15]]}}}],["devicesallow",{"_index":1968,"t":{"208":{"position":[[5179,15],[7008,15]]},"301":{"position":[[2319,15],[3747,15]]}}}],["devicesblock",{"_index":1969,"t":{"208":{"position":[[5210,15],[7039,15]]},"301":{"position":[[2355,15],[3783,15]]}}}],["devot",{"_index":3130,"t":{"544":{"position":[[1296,6]]},"548":{"position":[[200,6]]}}}],["devtool",{"_index":2702,"t":{"389":{"position":[[241,8]]}}}],["diagnos",{"_index":1612,"t":{"166":{"position":[[3187,10],[3209,8],[3365,8]]},"464":{"position":[[393,8]]},"581":{"position":[[189,8]]}}}],["diagram",{"_index":3278,"t":{"598":{"position":[[273,7]]}}}],["dice'",{"_index":1657,"t":{"172":{"position":[[1033,6]]}}}],["dictat",{"_index":3241,"t":{"575":{"position":[[79,7]]}}}],["did/handl",{"_index":2441,"t":{"341":{"position":[[638,10]]}}}],["did:plc",{"_index":1279,"t":{"121":{"position":[[94,11]]}}}],["did:web",{"_index":1280,"t":{"121":{"position":[[109,11]]}}}],["didn't",{"_index":1875,"t":{"198":{"position":[[1637,6]]}}}],["diff",{"_index":494,"t":{"29":{"position":[[309,4],[1979,4]]},"172":{"position":[[4653,5]]},"365":{"position":[[13,4],[501,4],[615,4],[750,4]]},"581":{"position":[[433,4]]}}}],["differ",{"_index":533,"t":{"29":{"position":[[1382,9],[3505,9]]},"55":{"position":[[5127,9],[5425,9],[6811,9]]},"65":{"position":[[85,7]]},"69":{"position":[[1658,9]]},"79":{"position":[[85,7]]},"109":{"position":[[1567,9]]},"116":{"position":[[1561,9]]},"147":{"position":[[359,9]]},"172":{"position":[[2206,9],[2402,6],[2448,6],[3324,9]]},"177":{"position":[[403,9],[544,9]]},"179":{"position":[[100,9],[207,9],[328,9]]},"190":{"position":[[1240,9]]},"192":{"position":[[220,9]]},"222":{"position":[[1179,9],[1208,9],[1251,11],[1450,12],[1627,9],[1946,9],[1975,9],[2018,11],[2347,12],[2894,9],[3224,9]]},"228":{"position":[[681,9],[725,9],[829,9]]},"234":{"position":[[405,10]]},"238":{"position":[[250,10]]},"242":{"position":[[1156,9],[1185,9],[1228,11],[1431,12],[1614,9],[1929,9],[1958,9],[2001,11],[2333,12],[2850,9],[3178,9]]},"248":{"position":[[439,9]]},"259":{"position":[[291,10]]},"267":{"position":[[134,10]]},"295":{"position":[[67,10]]},"297":{"position":[[127,9]]},"339":{"position":[[67,11]]},"347":{"position":[[164,9],[645,9]]},"353":{"position":[[1092,9]]},"359":{"position":[[79,9],[718,9]]},"383":{"position":[[80,9]]},"464":{"position":[[218,11]]},"472":{"position":[[12,10]]},"476":{"position":[[1173,9]]},"478":{"position":[[179,9]]},"592":{"position":[[363,9]]}}}],["differenti",{"_index":2023,"t":{"222":{"position":[[2244,13]]},"228":{"position":[[140,13],[796,13]]},"232":{"position":[[525,13],[597,13]]},"242":{"position":[[2225,13]]},"248":{"position":[[77,13]]}}}],["difficult",{"_index":2012,"t":{"220":{"position":[[624,10]]}}}],["dina",{"_index":1642,"t":{"172":{"position":[[539,4],[552,4]]}}}],["dir=/home/youruser/multi",{"_index":2811,"t":{"442":{"position":[[856,24]]}}}],["direct",{"_index":1751,"t":{"174":{"position":[[185,9]]},"530":{"position":[[2428,10]]},"532":{"position":[[922,10]]},"536":{"position":[[60,10]]}}}],["directli",{"_index":721,"t":{"48":{"position":[[57,9]]},"55":{"position":[[8768,8]]},"67":{"position":[[1136,9],[2628,9]]},"81":{"position":[[1377,9],[2911,9]]},"85":{"position":[[880,9],[2398,9]]},"91":{"position":[[1045,9],[2629,9]]},"99":{"position":[[1143,9],[2690,9]]},"103":{"position":[[818,9],[2310,9]]},"107":{"position":[[936,9],[2522,9]]},"114":{"position":[[2068,9],[3625,9]]},"121":{"position":[[1431,9],[2923,9]]},"144":{"position":[[950,9],[2504,9]]},"164":{"position":[[971,9],[2523,9]]},"168":{"position":[[1300,9],[2805,9]]},"194":{"position":[[90,8]]},"200":{"position":[[1187,9],[3009,9]]},"206":{"position":[[944,9],[2420,9]]},"208":{"position":[[4083,9],[6032,9]]},"212":{"position":[[807,9],[2255,9]]},"218":{"position":[[980,9],[2449,9]]},"226":{"position":[[498,8]]},"232":{"position":[[1059,9],[2513,9]]},"236":{"position":[[1101,9],[2941,9]]},"238":{"position":[[1284,9],[3055,9]]},"257":{"position":[[1132,9],[2591,9]]},"261":{"position":[[1206,9],[3012,9]]},"265":{"position":[[985,9],[2845,9]]},"269":{"position":[[860,9],[2608,9]]},"273":{"position":[[929,9],[2428,9]]},"275":{"position":[[531,8]]},"277":{"position":[[942,9],[2396,9]]},"281":{"position":[[908,9],[2379,9]]},"289":{"position":[[1175,9],[2661,9]]},"295":{"position":[[1104,9],[2920,9]]},"301":{"position":[[1413,9],[2949,9]]},"305":{"position":[[958,9],[2548,9]]},"307":{"position":[[318,8]]},"317":{"position":[[937,9],[2522,9]]},"321":{"position":[[827,9],[2249,9]]},"329":{"position":[[881,9],[2377,9]]},"333":{"position":[[911,9],[2405,9]]},"341":{"position":[[2346,9],[4152,9]]},"345":{"position":[[1053,9],[2649,9]]},"393":{"position":[[810,9],[2264,9]]},"482":{"position":[[513,8]]},"492":{"position":[[462,8]]},"596":{"position":[[1833,8]]}}}],["directori",{"_index":169,"t":{"15":{"position":[[511,10],[1188,9],[1319,11],[2037,9],[2487,9],[3358,9],[3495,11],[4422,9]]},"23":{"position":[[909,9],[1352,10]]},"55":{"position":[[1486,9]]},"59":{"position":[[85,9]]},"375":{"position":[[245,9]]},"440":{"position":[[223,9],[390,9]]},"442":{"position":[[244,12],[707,9]]},"476":{"position":[[89,9],[356,9],[427,9],[473,9],[1866,11]]},"478":{"position":[[236,9],[267,9]]},"482":{"position":[[91,10],[335,12],[352,11],[573,10],[633,11],[733,9],[800,9],[830,9],[947,12]]},"512":{"position":[[276,10]]},"526":{"position":[[240,9]]},"540":{"position":[[144,9]]}}}],["dirti",{"_index":2522,"t":{"347":{"position":[[386,5]]}}}],["disabl",{"_index":106,"t":{"11":{"position":[[324,8],[1118,7]]},"33":{"position":[[172,9],[267,9],[277,7]]},"65":{"position":[[427,8]]},"79":{"position":[[568,8]]},"198":{"position":[[1676,7],[2214,8]]},"315":{"position":[[1029,8]]}}}],["disable_web=tru",{"_index":606,"t":{"33":{"position":[[303,16]]}}}],["disablediscoveri",{"_index":2167,"t":{"281":{"position":[[1849,19],[3220,19]]}}}],["disableweb",{"_index":272,"t":{"15":{"position":[[4544,13]]},"33":{"position":[[366,13]]}}}],["disadvantag",{"_index":758,"t":{"55":{"position":[[815,13]]}}}],["disallow",{"_index":2181,"t":{"285":{"position":[[15,8]]}}}],["discord",{"_index":14,"t":{"4":{"position":[[17,7]]},"44":{"position":[[58,7],[167,7]]},"46":{"position":[[37,7],[128,8],[233,7],[404,7],[491,7]]},"48":{"position":[[30,7],[118,7],[144,7],[183,7],[282,7]]},"50":{"position":[[58,7],[178,7],[244,7]]},"53":{"position":[[18,7],[110,7]]},"55":{"position":[[43,7],[83,7],[167,7],[257,7],[272,7],[321,7],[440,7],[543,7],[619,7],[714,7],[803,7],[900,7],[1047,7],[1113,7],[1290,7],[1345,7],[2065,7],[2768,7],[3010,7],[3192,9],[3312,7],[3460,7],[3782,7],[3994,7],[4011,7],[4028,7],[4057,7],[4098,7],[4162,7],[4463,7],[4504,7],[4568,7],[5149,7],[5206,7],[5228,7],[5366,7],[5383,7],[5400,7],[5541,7],[6927,7],[7763,7],[9186,7],[9544,7],[9702,8]]},"57":{"position":[[58,7]]},"59":{"position":[[664,7]]},"61":{"position":[[234,7],[416,9]]},"63":{"position":[[35,7]]},"65":{"position":[[46,7],[489,7],[3252,7]]},"67":{"position":[[421,7],[817,7],[1025,7],[1366,7],[1447,7],[1673,7],[2343,7],[2536,7],[3056,7],[3503,9]]},"69":{"position":[[58,7],[209,7],[263,7],[336,7],[1012,7],[1482,7],[1537,7]]},"72":{"position":[[19,7],[85,8],[120,7],[180,7],[337,7],[508,7],[704,7],[1086,7]]},"75":{"position":[[41,7],[278,8],[372,7],[1351,7]]},"77":{"position":[[11,7],[257,7]]},"79":{"position":[[46,7],[219,7],[423,7],[630,7],[3427,7],[4129,7],[4238,7]]},"81":{"position":[[314,7],[1058,7],[1266,7],[1607,7],[1688,7],[1914,7],[2215,10],[2626,7],[2819,7],[3339,7],[3633,10],[3828,9]]},"208":{"position":[[1511,7]]},"594":{"position":[[4,7],[173,7],[891,7],[1498,10]]},"596":{"position":[[588,7]]}}}],["discord'",{"_index":775,"t":{"55":{"position":[[1507,9],[1567,9],[5039,9],[5921,9],[6402,9],[7478,9],[8282,9]]},"59":{"position":[[106,9],[166,9]]},"67":{"position":[[698,9]]},"72":{"position":[[224,9],[1006,9]]},"81":{"position":[[671,9]]}}}],["discord.json",{"_index":3262,"t":{"594":{"position":[[912,12]]}}}],["discord/oth",{"_index":916,"t":{"65":{"position":[[854,13]]},"79":{"position":[[995,13]]}}}],["discord/socat",{"_index":873,"t":{"55":{"position":[[6211,13],[8091,13]]}}}],["discord_application_id",{"_index":954,"t":{"67":{"position":[[258,22]]},"81":{"position":[[331,22]]}}}],["discord_application_id=12345678",{"_index":735,"t":{"53":{"position":[[295,31]]},"55":{"position":[[1910,31]]},"59":{"position":[[509,31]]},"77":{"position":[[442,31]]}}}],["discord_artwork",{"_index":919,"t":{"65":{"position":[[1096,17],[1496,15],[1779,15],[1890,15]]},"67":{"position":[[429,15]]},"79":{"position":[[1237,17],[1637,15],[1920,15],[2031,15]]},"81":{"position":[[402,15]]}}}],["discord_artwork=mycdn,jellyfin",{"_index":922,"t":{"65":{"position":[[1228,30],[2189,30]]},"79":{"position":[[1369,30],[2330,30]]}}}],["discord_artwork=tru",{"_index":930,"t":{"65":{"position":[[1925,20]]},"79":{"position":[[2066,20]]}}}],["discord_artwork_default_url",{"_index":959,"t":{"67":{"position":[[560,27]]},"81":{"position":[[533,27]]}}}],["discord_artwork_default_url=https://cooldomain.com/art.png",{"_index":943,"t":{"65":{"position":[[3690,58]]},"79":{"position":[[3898,58]]}}}],["discord_id",{"_index":948,"t":{"67":{"position":[[127,10],[212,10]]},"81":{"position":[[127,10],[212,10]]}}}],["discord_ipc_loc",{"_index":779,"t":{"55":{"position":[[1646,21],[6228,21],[6457,21],[6761,21],[8108,21],[8337,21],[8637,21],[9911,21],[10141,21]]},"59":{"position":[[245,21]]},"67":{"position":[[303,21]]}}}],["discord_ipc_locations=/discord",{"_index":882,"t":{"55":{"position":[[8414,30]]}}}],["discord_ipc_locations=/run/discord",{"_index":784,"t":{"55":{"position":[[1961,34],[6534,34]]},"59":{"position":[[560,34]]}}}],["discord_ipc_locations=192.168.0.100:6655",{"_index":900,"t":{"55":{"position":[[9985,40]]}}}],["discord_ipc_locations=192.168.discord_host.ip:6655",{"_index":874,"t":{"55":{"position":[[6302,50],[8182,50]]}}}],["discord_listening_activity_allow",{"_index":1058,"t":{"81":{"position":[[808,32]]}}}],["discord_listening_activity_allow=spotifi",{"_index":1052,"t":{"75":{"position":[[2193,40]]}}}],["discord_nam",{"_index":951,"t":{"67":{"position":[[183,12]]},"81":{"position":[[183,12]]}}}],["discord_status_override_allow",{"_index":1055,"t":{"81":{"position":[[690,29]]}}}],["discord_status_override_allow=online,idl",{"_index":1043,"t":{"75":{"position":[[1101,41]]}}}],["discord_token",{"_index":1053,"t":{"81":{"position":[[258,13]]}}}],["discord_transforms=musicbrainz",{"_index":3261,"t":{"594":{"position":[[440,30]]}}}],["discov",{"_index":670,"t":{"42":{"position":[[127,10]]},"134":{"position":[[115,10]]},"166":{"position":[[826,10]]},"238":{"position":[[78,10]]},"263":{"position":[[85,10]]},"291":{"position":[[223,10]]},"335":{"position":[[302,10]]},"349":{"position":[[365,9],[510,10]]},"353":{"position":[[161,10]]},"492":{"position":[[159,10]]},"648":{"position":[[821,12]]},"653":{"position":[[2019,8],[2379,12],[2462,10],[2721,10],[2959,10],[3043,11],[3180,11],[3241,10],[3576,11],[3800,10]]}}}],["discovered/scrobbl",{"_index":3106,"t":{"540":{"position":[[533,20]]}}}],["discoveri",{"_index":1187,"t":{"109":{"position":[[116,9],[1873,9]]},"116":{"position":[[116,9]]},"166":{"position":[[854,10]]},"291":{"position":[[91,9]]},"335":{"position":[[88,9]]},"653":{"position":[[2215,10]]}}}],["discuss",{"_index":2419,"t":{"331":{"position":[[1352,11]]},"497":{"position":[[73,11]]},"499":{"position":[[165,10]]}}}],["display",{"_index":902,"t":{"65":{"position":[[20,7]]},"67":{"position":[[762,8],[988,8],[1636,8],[2144,8],[2444,8],[2964,8]]},"79":{"position":[[20,7],[4251,7]]},"81":{"position":[[384,7],[1003,8],[1229,8],[1877,8],[2427,8],[2727,8],[3247,8]]},"85":{"position":[[510,8],[734,8],[1374,8],[1918,8],[2216,8],[2734,8]]},"91":{"position":[[673,8],[898,8],[1542,8],[2147,8],[2446,8],[2965,8]]},"99":{"position":[[769,8],[995,8],[1643,8],[2206,8],[2506,8],[3026,8]]},"103":{"position":[[446,8],[671,8],[1315,8],[1828,8],[2127,8],[2646,8]]},"107":{"position":[[552,8],[783,8],[1451,8],[2028,8],[2333,8],[2858,8]]},"114":{"position":[[1694,8],[1920,8],[2568,8],[3141,8],[3441,8],[3961,8]]},"121":{"position":[[1059,8],[1284,8],[1928,8],[2441,8],[2740,8],[3259,8]]},"142":{"position":[[186,7]]},"144":{"position":[[572,8],[800,8],[1456,8],[2016,8],[2318,8],[2840,8]]},"164":{"position":[[599,8],[824,8],[1468,8],[2041,8],[2340,8],[2859,8]]},"168":{"position":[[920,8],[1149,8],[1809,8],[2315,8],[2618,8],[3141,8]]},"200":{"position":[[807,8],[1036,8],[1696,8],[2519,8],[2822,8],[3345,8]]},"206":{"position":[[576,8],[799,8],[1435,8],[1942,8],[2239,8],[2756,8]]},"208":{"position":[[3707,8],[3934,8],[4586,8],[5546,8],[5847,8],[6368,8]]},"212":{"position":[[433,8],[659,8],[1307,8],[1771,8],[2071,8],[2591,8]]},"218":{"position":[[608,8],[833,8],[1477,8],[1967,8],[2266,8],[2785,8]]},"232":{"position":[[677,8],[907,8],[1571,8],[2021,8],[2325,8],[2849,8]]},"236":{"position":[[729,8],[954,8],[1854,8],[2459,8],[2758,8],[3277,8]]},"238":{"position":[[914,8],[1138,8],[2031,8],[2575,8],[2873,8],[3391,8]]},"257":{"position":[[752,8],[981,8],[1641,8],[2101,8],[2404,8],[2927,8]]},"261":{"position":[[832,8],[1058,8],[1965,8],[2528,8],[2828,8],[3348,8]]},"265":{"position":[[601,8],[832,8],[1774,8],[2351,8],[2656,8],[3181,8]]},"269":{"position":[[488,8],[713,8],[1613,8],[2126,8],[2425,8],[2944,8]]},"273":{"position":[[551,8],[779,8],[1435,8],[1940,8],[2242,8],[2764,8]]},"277":{"position":[[572,8],[796,8],[1436,8],[1916,8],[2214,8],[2732,8]]},"281":{"position":[[542,8],[764,8],[1396,8],[1903,8],[2199,8],[2715,8]]},"289":{"position":[[803,8],[1028,8],[1672,8],[2179,8],[2478,8],[2997,8]]},"295":{"position":[[730,8],[956,8],[1863,8],[2436,8],[2736,8],[3256,8]]},"301":{"position":[[1043,8],[1267,8],[1907,8],[2469,8],[2767,8],[3285,8]]},"305":{"position":[[584,8],[810,8],[1458,8],[2064,8],[2364,8],[2884,8]]},"317":{"position":[[561,8],[788,8],[1440,8],[2036,8],[2337,8],[2858,8]]},"321":{"position":[[461,8],[683,8],[1315,8],[1773,8],[2069,8],[2585,8]]},"329":{"position":[[497,8],[728,8],[1396,8],[1883,8],[2188,8],[2713,8]]},"333":{"position":[[535,8],[762,8],[1414,8],[1919,8],[2220,8],[2741,8]]},"341":{"position":[[1974,8],[2199,8],[3099,8],[3670,8],[3969,8],[4488,8]]},"343":{"position":[[2362,9],[3247,10],[5410,7]]},"345":{"position":[[679,8],[905,8],[1553,8],[2165,8],[2465,8],[2985,8]]},"393":{"position":[[432,8],[660,8],[1316,8],[1776,8],[2078,8],[2600,8]]},"524":{"position":[[110,9]]},"530":{"position":[[3575,10]]},"538":{"position":[[1515,9]]},"540":{"position":[[508,7]]}}}],["dissemin",{"_index":3494,"t":{"653":{"position":[[3344,12]]}}}],["distanc",{"_index":1656,"t":{"172":{"position":[[1020,8]]}}}],["distribut",{"_index":1587,"t":{"166":{"position":[[1145,13]]}}}],["distro",{"_index":3013,"t":{"501":{"position":[[73,7]]}}}],["diverg",{"_index":2646,"t":{"379":{"position":[[468,9]]}}}],["dn",{"_index":1582,"t":{"166":{"position":[[1090,3]]},"452":{"position":[[274,3],[347,3],[877,3],[920,3],[1066,3],[1147,3]]}}}],["dnd",{"_index":1038,"t":{"75":{"position":[[442,3],[721,4],[754,3]]}}}],["do",{"_index":1653,"t":{"172":{"position":[[929,5],[942,5]]}}}],["doauthent",{"_index":2680,"t":{"383":{"position":[[2993,16]]},"646":{"position":[[2323,16]]}}}],["dobuildinitdata",{"_index":2660,"t":{"383":{"position":[[1012,15]]},"646":{"position":[[747,18]]}}}],["doc",{"_index":200,"t":{"15":{"position":[[1418,4],[3606,4]]},"19":{"position":[[1839,4]]},"46":{"position":[[576,4]]},"48":{"position":[[321,4]]},"50":{"position":[[252,4]]},"69":{"position":[[271,4]]},"83":{"position":[[767,4]]},"230":{"position":[[302,4]]},"253":{"position":[[24,4]]},"255":{"position":[[302,4]]},"291":{"position":[[332,5]]},"293":{"position":[[54,4]]},"307":{"position":[[505,5]]},"335":{"position":[[411,5]]},"337":{"position":[[54,4]]},"359":{"position":[[754,4]]},"370":{"position":[[40,4]]},"510":{"position":[[323,4]]},"516":{"position":[[154,5]]},"530":{"position":[[711,5],[3098,4]]},"538":{"position":[[841,4]]},"542":{"position":[[86,4],[203,4]]},"638":{"position":[[434,5]]}}}],["docheckconnect",{"_index":2670,"t":{"383":{"position":[[1745,17]]},"646":{"position":[[1701,20]]}}}],["docker",{"_index":168,"t":{"15":{"position":[[499,6],[775,6],[1331,6],[1398,6],[3507,6],[3586,6]]},"19":{"position":[[785,6]]},"21":{"position":[[403,6]]},"23":{"position":[[1149,6]]},"25":{"position":[[527,6],[573,6],[717,6]]},"55":{"position":[[1328,9],[1380,6],[1716,6],[1776,6],[1805,6],[3425,7],[5456,8],[5486,7],[6153,6],[6263,6],[6364,6],[6495,6],[6735,8],[6842,8],[6872,7],[7708,6],[7798,6],[8033,6],[8143,6],[8244,6],[8375,6],[8611,8],[8687,6],[8715,7],[8780,6],[9840,6],[9946,6],[10117,6]]},"57":{"position":[[96,9]]},"59":{"position":[[315,6],[375,6],[404,6]]},"101":{"position":[[105,6],[304,6]]},"162":{"position":[[586,6]]},"166":{"position":[[1004,6],[1297,6],[1480,6]]},"275":{"position":[[469,6],[681,6],[728,6],[1137,6]]},"303":{"position":[[3496,6],[3884,6]]},"311":{"position":[[469,6]]},"331":{"position":[[94,6],[174,6]]},"365":{"position":[[578,6]]},"403":{"position":[[520,6]]},"476":{"position":[[247,6],[525,6],[763,6],[946,6],[1345,6],[1514,6],[1753,6],[1899,6],[2223,6],[2529,6]]},"478":{"position":[[49,6],[149,6],[285,6],[386,6],[452,6]]},"488":{"position":[[103,6]]},"516":{"position":[[227,6],[248,6],[268,6]]},"522":{"position":[[0,6],[427,6]]},"524":{"position":[[314,6],[657,6]]},"526":{"position":[[66,6],[77,6],[257,6]]},"528":{"position":[[69,6]]},"530":{"position":[[267,6],[888,6],[1885,6],[2245,6],[2293,6],[2711,6],[3637,6]]},"532":{"position":[[483,6],[1064,6],[1207,6],[1349,6],[1487,6]]},"534":{"position":[[216,6]]},"536":{"position":[[202,6],[345,6],[487,6],[625,6]]},"538":{"position":[[948,6],[1592,6],[1863,6],[2062,6],[2315,6]]},"540":{"position":[[161,6],[230,6]]},"542":{"position":[[18,6]]},"557":{"position":[[1417,6]]},"594":{"position":[[344,6]]},"596":{"position":[[2,10],[1275,6],[1659,6]]}}}],["docker.io/foxxmd/multi",{"_index":2924,"t":{"474":{"position":[[139,22]]}}}],["dockerhub",{"_index":2923,"t":{"474":{"position":[[97,9]]}}}],["dockerstartup/kasm_default_profile.sh",{"_index":810,"t":{"55":{"position":[[2561,39]]},"59":{"position":[[1160,39]]}}}],["dockerstartup/kasm_startup.sh",{"_index":812,"t":{"55":{"position":[[2631,32]]},"59":{"position":[[1230,32]]}}}],["dockerstartup/vnc_startup.sh",{"_index":811,"t":{"55":{"position":[[2601,29]]},"59":{"position":[[1200,29]]}}}],["docs:instal",{"_index":2959,"t":{"482":{"position":[[275,12]]}}}],["docsit",{"_index":2799,"t":{"442":{"position":[[236,7],[446,7]]}}}],["docsite/packag",{"_index":2806,"t":{"442":{"position":[[502,15]]}}}],["document",{"_index":1101,"t":{"87":{"position":[[366,10]]},"136":{"position":[[84,13]]},"273":{"position":[[492,13]]},"297":{"position":[[803,13]]},"309":{"position":[[352,13]]},"379":{"position":[[13,9]]},"385":{"position":[[718,13]]},"448":{"position":[[1660,13]]},"468":{"position":[[92,14]]},"472":{"position":[[61,8]]},"507":{"position":[[31,8]]},"606":{"position":[[21,13]]},"608":{"position":[[22,13]]},"633":{"position":[[5,8],[209,8]]}}}],["doin",{"_index":1651,"t":{"172":{"position":[[871,4],[892,4]]}}}],["domain",{"_index":920,"t":{"65":{"position":[[1162,7]]},"67":{"position":[[552,7]]},"79":{"position":[[1303,7]]},"81":{"position":[[525,7]]},"83":{"position":[[1647,6]]},"114":{"position":[[238,7]]},"121":{"position":[[300,6],[337,7]]},"196":{"position":[[2704,6]]},"224":{"position":[[92,6],[125,7]]},"230":{"position":[[544,6]]},"255":{"position":[[549,6]]},"303":{"position":[[2567,6],[3000,7],[3047,6],[3662,6],[4614,6]]},"323":{"position":[[479,6]]},"341":{"position":[[134,6]]},"343":{"position":[[2026,7],[3535,6]]},"448":{"position":[[1841,6]]},"452":{"position":[[293,6],[417,6],[1120,6]]},"538":{"position":[[1295,6]]}}}],["domain.tld",{"_index":2374,"t":{"323":{"position":[[350,13]]}}}],["domain/host",{"_index":2025,"t":{"222":{"position":[[3360,12]]},"242":{"position":[[3319,12]]}}}],["domain/ip:port",{"_index":2705,"t":{"391":{"position":[[299,14]]}}}],["don't",{"_index":112,"t":{"11":{"position":[[421,5]]},"118":{"position":[[174,5]]},"196":{"position":[[699,5],[3072,5]]},"566":{"position":[[1982,5]]},"575":{"position":[[462,5]]}}}],["done",{"_index":825,"t":{"55":{"position":[[3227,4]]},"61":{"position":[[451,4]]},"83":{"position":[[137,4]]},"93":{"position":[[392,4]]},"101":{"position":[[46,4]]},"172":{"position":[[1966,4]]},"190":{"position":[[448,4]]},"202":{"position":[[107,4]]},"414":{"position":[[27,4],[143,4]]},"538":{"position":[[229,4],[1804,4]]},"540":{"position":[[258,5]]},"653":{"position":[[2136,4]]}}}],["dottransform",{"_index":2553,"t":{"357":{"position":[[1216,17],[1623,16]]}}}],["doubl",{"_index":1523,"t":{"158":{"position":[[740,6]]}}}],["down",{"_index":1321,"t":{"128":{"position":[[57,4]]},"196":{"position":[[1497,4]]},"470":{"position":[[1136,4]]}}}],["download",{"_index":698,"t":{"42":{"position":[[896,8]]},"55":{"position":[[9592,8]]},"196":{"position":[[3295,8]]}}}],["downstream",{"_index":2527,"t":{"347":{"position":[[844,10]]},"349":{"position":[[765,10]]},"353":{"position":[[462,10],[1253,10]]}}}],["drastic",{"_index":3163,"t":{"561":{"position":[[1254,11]]}}}],["dream",{"_index":2575,"t":{"363":{"position":[[589,8],[641,8],[767,8],[819,8]]}}}],["drink",{"_index":2900,"t":{"470":{"position":[[1898,8]]}}}],["driver",{"_index":463,"t":{"25":{"position":[[703,7]]},"476":{"position":[[2747,7]]},"478":{"position":[[1194,7]]}}}],["drop",{"_index":2981,"t":{"482":{"position":[[1557,4]]}}}],["dropdown",{"_index":1229,"t":{"111":{"position":[[183,9]]}}}],["druidblack",{"_index":2418,"t":{"331":{"position":[[1302,10],[1313,13]]}}}],["due",{"_index":901,"t":{"63":{"position":[[5,3]]},"166":{"position":[[1105,3]]},"319":{"position":[[2100,3]]},"323":{"position":[[415,3]]},"343":{"position":[[241,3],[4812,3]]},"347":{"position":[[318,3]]},"361":{"position":[[530,3]]},"383":{"position":[[227,3]]},"470":{"position":[[2248,3]]},"544":{"position":[[961,3]]},"546":{"position":[[358,3]]},"623":{"position":[[1381,3]]},"631":{"position":[[377,3]]}}}],["dumpvlcmetadata",{"_index":2362,"t":{"319":{"position":[[2462,18]]}}}],["dupe",{"_index":566,"t":{"29":{"position":[[3387,8],[5143,8]]},"172":{"position":[[5026,4]]}}}],["duped/discard",{"_index":558,"t":{"29":{"position":[[2750,13],[4669,13]]}}}],["duplic",{"_index":61,"t":{"7":{"position":[[680,9],[726,10],[808,11]]},"23":{"position":[[766,9]]},"29":{"position":[[216,10]]},"160":{"position":[[550,11]]},"170":{"position":[[138,11]]},"172":{"position":[[3745,11],[4816,9]]},"174":{"position":[[434,10]]},"177":{"position":[[380,9],[596,10]]},"179":{"position":[[380,10]]},"182":{"position":[[54,10],[191,10]]},"184":{"position":[[522,11]]},"186":{"position":[[222,11]]},"188":{"position":[[263,9]]},"190":{"position":[[1284,9],[1347,9]]},"198":{"position":[[508,9]]},"200":{"position":[[661,9]]},"347":{"position":[[698,9],[874,9]]},"460":{"position":[[29,9],[226,11],[355,9],[453,9]]},"470":{"position":[[885,9]]},"596":{"position":[[2186,11]]},"653":{"position":[[2494,9],[4056,11]]}}}],["durat",{"_index":279,"t":{"15":{"position":[[4683,11]]},"29":{"position":[[2389,8],[4364,8]]},"128":{"position":[[832,8]]},"134":{"position":[[1245,10],[1511,11]]},"138":{"position":[[138,8]]},"172":{"position":[[3075,9]]},"198":{"position":[[185,9],[314,8]]},"210":{"position":[[1553,8]]},"303":{"position":[[427,8]]},"359":{"position":[[506,11],[561,8]]},"363":{"position":[[1058,8]]},"385":{"position":[[213,9]]},"391":{"position":[[204,8]]},"561":{"position":[[154,8],[426,8]]},"644":{"position":[[726,9],[851,9]]},"648":{"position":[[1410,8]]}}}],["dure",{"_index":564,"t":{"29":{"position":[[3207,6]]},"172":{"position":[[2705,6],[2800,6],[2925,6],[2982,7]]},"246":{"position":[[73,6]]},"343":{"position":[[2817,6]]},"351":{"position":[[139,6]]},"383":{"position":[[2065,6]]},"482":{"position":[[1334,6]]},"566":{"position":[[2003,6]]}}}],["e",{"_index":3433,"t":{"646":{"position":[[1218,3],[1287,4],[2031,3],[2043,2],[2494,3],[2621,2]]},"648":{"position":[[2552,3],[2564,2]]},"651":{"position":[[1058,3],[1136,4]]}}}],["e.g",{"_index":1082,"t":{"83":{"position":[[1693,4]]},"538":{"position":[[1341,4]]}}}],["e0cce74f",{"_index":2611,"t":{"365":{"position":[[1181,8]]}}}],["e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17",{"_index":643,"t":{"38":{"position":[[1732,69]]}}}],["each",{"_index":28,"t":{"7":{"position":[[141,4],[574,4]]},"15":{"position":[[2189,4],[2324,4],[2394,4],[3195,4],[6161,4]]},"17":{"position":[[214,4]]},"21":{"position":[[463,4]]},"27":{"position":[[385,4],[496,4]]},"29":{"position":[[70,4],[178,4],[231,4],[317,4],[2266,4],[4241,4]]},"38":{"position":[[317,4]]},"55":{"position":[[5122,4]]},"109":{"position":[[540,4],[716,4]]},"116":{"position":[[538,4],[714,4]]},"136":{"position":[[70,4],[482,4]]},"140":{"position":[[809,4]]},"152":{"position":[[348,4],[462,4]]},"172":{"position":[[3278,4],[3637,4]]},"174":{"position":[[604,4],[938,4],[969,4]]},"182":{"position":[[154,4]]},"198":{"position":[[269,4]]},"210":{"position":[[909,4]]},"222":{"position":[[1586,4]]},"228":{"position":[[168,4]]},"242":{"position":[[1567,4]]},"297":{"position":[[157,4],[821,4]]},"341":{"position":[[760,4]]},"355":{"position":[[0,4],[456,4],[536,4]]},"357":{"position":[[105,4]]},"359":{"position":[[0,4],[697,4],[732,4],[809,5],[836,4]]},"363":{"position":[[39,4],[153,4]]},"365":{"position":[[333,4]]},"383":{"position":[[434,4]]},"399":{"position":[[0,4]]},"403":{"position":[[138,4],[299,4]]},"418":{"position":[[0,4]]},"492":{"position":[[20,4]]},"532":{"position":[[936,4]]},"536":{"position":[[74,4]]},"544":{"position":[[749,4]]},"546":{"position":[[146,4]]},"555":{"position":[[227,4],[932,4]]},"557":{"position":[[1029,4],[1190,4]]},"564":{"position":[[0,4]]},"566":{"position":[[1152,4],[1299,4]]},"568":{"position":[[634,4],[2964,4]]},"581":{"position":[[460,4]]},"592":{"position":[[393,4]]},"621":{"position":[[17,4],[343,4],[627,4]]},"631":{"position":[[136,4],[713,4]]}}}],["eai_again",{"_index":2849,"t":{"452":{"position":[[324,9],[843,9]]}}}],["earli",{"_index":2560,"t":{"361":{"position":[[79,6]]}}}],["earlier",{"_index":878,"t":{"55":{"position":[[7789,8]]},"353":{"position":[[612,7]]},"470":{"position":[[1114,7]]},"530":{"position":[[2557,8]]},"538":{"position":[[999,8],[1643,8],[2366,8]]},"540":{"position":[[192,7]]}}}],["eas",{"_index":3275,"t":{"596":{"position":[[2169,4]]}}}],["easi",{"_index":716,"t":{"46":{"position":[[520,4]]},"544":{"position":[[1580,4]]},"566":{"position":[[258,4]]},"596":{"position":[[1221,4]]}}}],["easili",{"_index":848,"t":{"55":{"position":[[4906,6]]},"196":{"position":[[283,6]]},"596":{"position":[[2308,6]]}}}],["ec42e09d5ae0ee0f0816ca151008412a",{"_index":296,"t":{"15":{"position":[[5056,35]]},"19":{"position":[[1079,35]]},"91":{"position":[[2028,35],[3500,35]]},"150":{"position":[[1687,35],[2718,35]]},"154":{"position":[[2461,35],[3665,35]]},"198":{"position":[[3011,35]]},"236":{"position":[[2340,35],[3812,35]]},"305":{"position":[[1936,35],[3410,35]]}}}],["echo",{"_index":2263,"t":{"303":{"position":[[2521,4],[2526,4],[3021,4],[3848,5],[4595,4],[5041,4]]}}}],["echo.multi",{"_index":2264,"t":{"303":{"position":[[2536,10]]}}}],["echo:36",{"_index":2274,"t":{"303":{"position":[[3787,7],[3942,7],[4568,7]]}}}],["econnreset",{"_index":2844,"t":{"452":{"position":[[91,10],[424,10]]}}}],["edg",{"_index":1826,"t":{"196":{"position":[[1039,4]]},"520":{"position":[[87,4]]},"522":{"position":[[275,5]]},"524":{"position":[[434,5]]}}}],["edit",{"_index":177,"t":{"15":{"position":[[741,7],[1514,7],[4358,8]]},"67":{"position":[[1122,4],[1191,7],[1524,8],[2614,4],[2683,7],[2852,8]]},"81":{"position":[[1363,4],[1432,7],[1765,8],[2897,4],[2966,7],[3135,8]]},"85":{"position":[[866,4],[935,7],[1262,8],[2384,4],[2453,7],[2622,8]]},"87":{"position":[[912,7]]},"91":{"position":[[1031,4],[1100,7],[1430,8],[2615,4],[2684,7],[2853,8]]},"99":{"position":[[1129,4],[1198,7],[1531,8],[2676,4],[2745,7],[2914,8]]},"103":{"position":[[804,4],[873,7],[1203,8],[2296,4],[2365,7],[2534,8]]},"107":{"position":[[922,4],[991,7],[1339,8],[2508,4],[2577,7],[2746,8]]},"114":{"position":[[2054,4],[2123,7],[2456,8],[3611,4],[3680,7],[3849,8]]},"121":{"position":[[1417,4],[1486,7],[1816,8],[2909,4],[2978,7],[3147,8]]},"142":{"position":[[1158,4]]},"144":{"position":[[936,4],[1005,7],[1344,8],[2490,4],[2559,7],[2728,8]]},"164":{"position":[[957,4],[1026,7],[1356,8],[2509,4],[2578,7],[2747,8]]},"168":{"position":[[1286,4],[1355,7],[1697,8],[2791,4],[2860,7],[3029,8]]},"200":{"position":[[1173,4],[1242,7],[1584,8],[2995,4],[3064,7],[3233,8]]},"206":{"position":[[930,4],[999,7],[1323,8],[2406,4],[2475,7],[2644,8]]},"208":{"position":[[4069,4],[4138,7],[4474,8],[6018,4],[6087,7],[6256,8]]},"212":{"position":[[793,4],[862,7],[1195,8],[2241,4],[2310,7],[2479,8]]},"218":{"position":[[966,4],[1035,7],[1365,8],[2435,4],[2504,7],[2673,8]]},"232":{"position":[[1045,4],[1114,7],[1459,8],[2499,4],[2568,7],[2737,8]]},"236":{"position":[[1087,4],[1156,7],[1486,8],[2927,4],[2996,7],[3165,8]]},"238":{"position":[[1270,4],[1339,7],[1666,8],[3041,4],[3110,7],[3279,8]]},"257":{"position":[[1118,4],[1187,7],[1529,8],[2577,4],[2646,7],[2815,8]]},"261":{"position":[[1192,4],[1261,7],[1594,8],[2998,4],[3067,7],[3236,8]]},"265":{"position":[[971,4],[1040,7],[1388,8],[2831,4],[2900,7],[3069,8]]},"269":{"position":[[846,4],[915,7],[1245,8],[2594,4],[2663,7],[2832,8]]},"273":{"position":[[915,4],[984,7],[1323,8],[2414,4],[2483,7],[2652,8]]},"277":{"position":[[928,4],[997,7],[1324,8],[2382,4],[2451,7],[2620,8]]},"281":{"position":[[894,4],[963,7],[1284,8],[2365,4],[2434,7],[2603,8]]},"289":{"position":[[1161,4],[1230,7],[1560,8],[2647,4],[2716,7],[2885,8]]},"295":{"position":[[1090,4],[1159,7],[1492,8],[2906,4],[2975,7],[3144,8]]},"301":{"position":[[1399,4],[1468,7],[1795,8],[2935,4],[3004,7],[3173,8]]},"305":{"position":[[944,4],[1013,7],[1346,8],[2534,4],[2603,7],[2772,8]]},"317":{"position":[[923,4],[992,7],[1328,8],[2508,4],[2577,7],[2746,8]]},"319":{"position":[[899,7]]},"321":{"position":[[813,4],[882,7],[1203,8],[2235,4],[2304,7],[2473,8]]},"329":{"position":[[867,4],[936,7],[1284,8],[2363,4],[2432,7],[2601,8]]},"333":{"position":[[897,4],[966,7],[1302,8],[2391,4],[2460,7],[2629,8]]},"341":{"position":[[2332,4],[2401,7],[2731,8],[4138,4],[4207,7],[4376,8]]},"343":{"position":[[3157,4]]},"345":{"position":[[1039,4],[1108,7],[1441,8],[2635,4],[2704,7],[2873,8]]},"393":{"position":[[796,4],[865,7],[1204,8],[2250,4],[2319,7],[2488,8]]},"544":{"position":[[790,6]]},"546":{"position":[[187,6]]}}}],["editor",{"_index":975,"t":{"67":{"position":[[1413,6],[1775,6],[1925,6],[3139,6],[3289,6]]},"81":{"position":[[1654,6],[2016,6],[2166,6],[3422,6],[3572,6]]},"85":{"position":[[1155,6],[1511,6],[1661,6],[2907,6],[3057,6]]},"91":{"position":[[1321,6],[1680,6],[1830,6],[3139,6],[3289,6]]},"99":{"position":[[1420,6],[1782,6],[1932,6],[3201,6],[3351,6]]},"103":{"position":[[1094,6],[1453,6],[1603,6],[2820,6],[2970,6]]},"107":{"position":[[1218,6],[1595,6],[1745,6],[3038,6],[3188,6]]},"114":{"position":[[2345,6],[2707,6],[2857,6],[4136,6],[4286,6]]},"121":{"position":[[1707,6],[2066,6],[2216,6],[3433,6],[3583,6]]},"144":{"position":[[1229,6],[1597,6],[1747,6],[3017,6],[3167,6]]},"164":{"position":[[1247,6],[1606,6],[1756,6],[3033,6],[3183,6]]},"168":{"position":[[1580,6],[1951,6],[2101,6],[3319,6],[3469,6]]},"200":{"position":[[1467,6],[1838,6],[1988,6],[3523,6],[3673,6]]},"206":{"position":[[1218,6],[1571,6],[1721,6],[2928,6],[3078,6]]},"208":{"position":[[4361,6],[4726,6],[4876,6],[6544,6],[6694,6]]},"212":{"position":[[1084,6],[1446,6],[1596,6],[2766,6],[2916,6]]},"218":{"position":[[1256,6],[1615,6],[1765,6],[2959,6],[3109,6]]},"232":{"position":[[1340,6],[1714,6],[1864,6],[3028,6],[3178,6]]},"236":{"position":[[1377,6],[1992,6],[2142,6],[3451,6],[3601,6]]},"238":{"position":[[1559,6],[2168,6],[2318,6],[3564,6],[3714,6]]},"257":{"position":[[1412,6],[1783,6],[1933,6],[3105,6],[3255,6]]},"261":{"position":[[1483,6],[2104,6],[2254,6],[3523,6],[3673,6]]},"265":{"position":[[1267,6],[1918,6],[2068,6],[3361,6],[3511,6]]},"269":{"position":[[1136,6],[1751,6],[1901,6],[3118,6],[3268,6]]},"273":{"position":[[1208,6],[1576,6],[1726,6],[2941,6],[3091,6]]},"277":{"position":[[1217,6],[1573,6],[1723,6],[2905,6],[3055,6]]},"281":{"position":[[1181,6],[1531,6],[1681,6],[2886,6],[3036,6]]},"289":{"position":[[1451,6],[1810,6],[1960,6],[3171,6],[3321,6]]},"295":{"position":[[1381,6],[2002,6],[2152,6],[3431,6],[3581,6]]},"301":{"position":[[1688,6],[2044,6],[2194,6],[3458,6],[3608,6]]},"305":{"position":[[1235,6],[1597,6],[1747,6],[3059,6],[3209,6]]},"317":{"position":[[1215,6],[1580,6],[1730,6],[3034,6],[3184,6]]},"321":{"position":[[1100,6],[1450,6],[1600,6],[2756,6],[2906,6]]},"329":{"position":[[1163,6],[1540,6],[1690,6],[2893,6],[3043,6]]},"333":{"position":[[1189,6],[1554,6],[1704,6],[2917,6],[3067,6]]},"341":{"position":[[2622,6],[3237,6],[3387,6],[4662,6],[4812,6]]},"345":{"position":[[1330,6],[1692,6],[1842,6],[3160,6],[3310,6]]},"393":{"position":[[1089,6],[1457,6],[1607,6],[2777,6],[2927,6]]},"503":{"position":[[165,6]]},"544":{"position":[[741,7]]},"546":{"position":[[138,7]]}}}],["effect",{"_index":2879,"t":{"470":{"position":[[458,6]]}}}],["effort",{"_index":3131,"t":{"544":{"position":[[1303,6]]},"548":{"position":[[207,6]]},"627":{"position":[[6,6]]}}}],["eleph",{"_index":2573,"t":{"363":{"position":[[506,9],[559,9],[684,9],[737,9],[1220,8],[1335,10],[1465,9],[1630,10]]},"421":{"position":[[102,9],[338,10]]}}}],["elimin",{"_index":1534,"t":{"160":{"position":[[536,9]]},"568":{"position":[[318,9]]},"577":{"position":[[381,9],[522,10]]}}}],["elsewher",{"_index":376,"t":{"19":{"position":[[1906,9]]}}}],["email",{"_index":1481,"t":{"154":{"position":[[935,5]]},"311":{"position":[[553,5],[841,5],[1318,5]]},"532":{"position":[[548,5]]},"534":{"position":[[281,5]]},"551":{"position":[[112,5]]}}}],["email/nam",{"_index":2252,"t":{"303":{"position":[[1193,10]]}}}],["emit",{"_index":3492,"t":{"653":{"position":[[3287,4],[3633,4],[3729,5]]}}}],["emitt",{"_index":3371,"t":{"640":{"position":[[688,8],[757,9]]}}}],["empti",{"_index":1339,"t":{"132":{"position":[[313,5]]},"343":{"position":[[2053,5],[4969,5]]},"414":{"position":[[477,5]]},"418":{"position":[[450,5]]},"442":{"position":[[205,5]]},"566":{"position":[[1532,5]]}}}],["emul",{"_index":3447,"t":{"648":{"position":[[246,8]]}}}],["enabl",{"_index":100,"t":{"11":{"position":[[169,7],[313,7],[1129,6]]},"15":{"position":[[1902,7],[4116,7],[4891,9],[5180,9]]},"25":{"position":[[24,8]]},"31":{"position":[[40,6],[154,8]]},"42":{"position":[[420,7]]},"67":{"position":[[1913,6],[1985,9],[3277,6],[3361,9]]},"75":{"position":[[896,9],[1992,9]]},"77":{"position":[[23,7]]},"81":{"position":[[2154,6],[2226,9],[3560,6],[3644,9]]},"85":{"position":[[1649,6],[3045,6]]},"87":{"position":[[905,6]]},"91":{"position":[[1818,6],[1921,9],[3277,6],[3393,9]]},"99":{"position":[[1920,6],[2027,9],[3339,6],[3458,9]]},"103":{"position":[[1591,6],[1692,9],[2958,6],[3072,9]]},"107":{"position":[[1733,6],[1839,9],[3176,6],[3289,9]]},"114":{"position":[[2845,6],[4274,6]]},"121":{"position":[[2204,6],[3571,6]]},"138":{"position":[[292,7]]},"142":{"position":[[1236,8],[1245,6],[1265,6]]},"144":{"position":[[1735,6],[1811,9],[3155,6],[3241,9]]},"162":{"position":[[723,9]]},"164":{"position":[[1744,6],[1842,9],[3171,6],[3282,9]]},"166":{"position":[[3393,6],[3437,6]]},"168":{"position":[[2089,6],[3457,6]]},"196":{"position":[[1689,6]]},"198":{"position":[[2904,9]]},"200":{"position":[[1976,6],[2080,9],[3661,6],[3774,9]]},"202":{"position":[[86,8]]},"206":{"position":[[1709,6],[1801,9],[3066,6],[3173,9]]},"208":{"position":[[4864,6],[4944,9],[6682,6],[6773,9]]},"210":{"position":[[1934,9]]},"212":{"position":[[1584,6],[1658,9],[2904,6],[2990,9]]},"214":{"position":[[91,8]]},"218":{"position":[[438,7],[518,7],[1753,6],[1850,9],[3097,6],[3207,9]]},"220":{"position":[[12,7]]},"228":{"position":[[126,7]]},"232":{"position":[[1852,6],[1932,9],[3166,6],[3254,9]]},"236":{"position":[[2130,6],[2233,9],[3589,6],[3705,9]]},"238":{"position":[[2306,6],[3702,6]]},"240":{"position":[[12,7]]},"257":{"position":[[1921,6],[2028,9],[3243,6],[3359,9]]},"261":{"position":[[2242,6],[2349,9],[3661,6],[3780,9]]},"265":{"position":[[2056,6],[2162,9],[3499,6],[3612,9]]},"269":{"position":[[1889,6],[1990,9],[3256,6],[3370,9]]},"271":{"position":[[88,6],[359,8]]},"273":{"position":[[1714,6],[1790,9],[3079,6],[3165,9]]},"277":{"position":[[1711,6],[1804,9],[3043,6],[3150,9]]},"281":{"position":[[1669,6],[1718,9],[3024,6],[3089,9]]},"283":{"position":[[301,7]]},"289":{"position":[[1948,6],[2044,9],[3309,6],[3418,9]]},"295":{"position":[[2140,6],[3569,6]]},"297":{"position":[[339,6],[1164,8],[1253,6],[1293,6],[1377,9],[1563,7]]},"301":{"position":[[2182,6],[2233,9],[3596,6],[3661,9]]},"303":{"position":[[55,7],[2615,8]]},"305":{"position":[[1735,6],[1831,9],[3197,6],[3305,9]]},"315":{"position":[[80,7]]},"317":{"position":[[1718,6],[1819,9],[3172,6],[3284,9]]},"319":{"position":[[63,6],[278,6],[1618,9],[2413,9]]},"321":{"position":[[1588,6],[1637,9],[2894,6],[2959,9]]},"329":{"position":[[1678,6],[3031,6]]},"333":{"position":[[1692,6],[3055,6]]},"341":{"position":[[3375,6],[4800,6]]},"343":{"position":[[1045,9],[2592,9],[3821,9]]},"345":{"position":[[1830,6],[1927,9],[3298,6],[3407,9]]},"351":{"position":[[403,9]]},"365":{"position":[[233,7]]},"393":{"position":[[1595,6],[1699,9],[2915,6],[3029,9]]},"403":{"position":[[253,8]]},"464":{"position":[[424,6]]},"490":{"position":[[69,7]]},"505":{"position":[[65,6],[219,6]]},"530":{"position":[[2443,8]]},"532":{"position":[[830,6],[881,7],[948,6]]},"536":{"position":[[19,7],[86,6]]},"557":{"position":[[1144,8]]},"561":{"position":[[6353,6]]},"568":{"position":[[2437,6],[2490,7],[2553,7],[2616,7]]},"581":{"position":[[141,6],[292,6],[472,6]]},"623":{"position":[[618,7],[1130,8],[1207,7],[1260,6],[1421,6]]}}}],["encount",{"_index":1611,"t":{"166":{"position":[[3152,11]]},"361":{"position":[[364,10]]},"482":{"position":[[1357,9]]}}}],["end",{"_index":1205,"t":{"109":{"position":[[829,3],[2119,3]]},"116":{"position":[[827,3]]},"172":{"position":[[3156,3]]},"174":{"position":[[990,3]]},"184":{"position":[[167,3]]},"196":{"position":[[3617,3]]},"200":{"position":[[2242,3],[3936,3]]},"303":{"position":[[161,4]]},"325":{"position":[[92,3]]},"343":{"position":[[3620,3]]},"361":{"position":[[74,4]]},"452":{"position":[[982,4]]},"526":{"position":[[100,3]]},"568":{"position":[[498,6]]},"596":{"position":[[1517,3],[1524,4]]},"648":{"position":[[206,4]]}}}],["endless",{"_index":2721,"t":{"395":{"position":[[744,8],[878,8]]},"561":{"position":[[3030,8],[4497,8],[4845,8],[5447,8],[5667,8]]},"575":{"position":[[647,8],[845,8]]}}}],["endors",{"_index":2453,"t":{"343":{"position":[[71,8]]}}}],["endpoint",{"_index":638,"t":{"38":{"position":[[1507,9],[1714,9],[1823,9]]},"40":{"position":[[3,8]]},"42":{"position":[[20,8]]},"87":{"position":[[207,10]]},"105":{"position":[[224,10]]},"125":{"position":[[470,10],[554,10]]},"134":{"position":[[253,10],[479,10]]},"150":{"position":[[963,8]]},"154":{"position":[[1317,8]]},"190":{"position":[[900,8]]},"210":{"position":[[2089,9]]},"220":{"position":[[727,10]]},"222":{"position":[[438,8],[843,8],[1398,8],[1598,8],[1741,8],[2295,8]]},"226":{"position":[[38,8],[473,8]]},"228":{"position":[[43,8]]},"232":{"position":[[543,8],[615,8]]},"234":{"position":[[272,10]]},"242":{"position":[[429,8],[832,8],[1379,8],[1585,8],[1726,8],[2281,8]]},"246":{"position":[[227,8]]},"248":{"position":[[49,8]]},"263":{"position":[[323,10]]},"313":{"position":[[108,8],[451,10]]},"373":{"position":[[153,9]]},"381":{"position":[[332,10]]},"383":{"position":[[3191,8],[3339,8]]},"393":{"position":[[371,8]]},"448":{"position":[[128,8],[1714,8]]},"476":{"position":[[898,11]]},"530":{"position":[[1717,8],[1760,8],[1831,8]]},"596":{"position":[[265,10],[302,10],[863,8]]},"635":{"position":[[231,8],[325,9],[426,8],[509,8]]},"653":{"position":[[1409,9]]}}}],["endpointlfm",{"_index":2052,"t":{"232":{"position":[[732,11],[944,11],[1289,11],[1374,11],[1608,11],[2220,11],[2417,11],[2941,11],[3326,13]]}}}],["endpointlz",{"_index":1458,"t":{"150":{"position":[[2833,13]]},"154":{"position":[[3780,13]]},"257":{"position":[[807,10],[1018,10],[1362,10],[1446,10],[1678,10],[2300,10],[2496,10],[3019,10],[3415,12]]}}}],["enforc",{"_index":1027,"t":{"72":{"position":[[456,11]]},"379":{"position":[[345,8]]},"381":{"position":[[73,8]]},"568":{"position":[[2689,9]]}}}],["english",{"_index":3221,"t":{"568":{"position":[[1469,7],[1904,8],[2057,7]]}}}],["enhanc",{"_index":429,"t":{"23":{"position":[[697,7]]},"297":{"position":[[367,12]]},"315":{"position":[[368,8],[600,8]]},"347":{"position":[[47,7]]},"355":{"position":[[87,9]]},"403":{"position":[[955,8]]},"542":{"position":[[472,12]]},"557":{"position":[[1995,8]]},"581":{"position":[[98,8],[247,12]]}}}],["enhance/correct",{"_index":3263,"t":{"596":{"position":[[669,15]]}}}],["enotfound",{"_index":2848,"t":{"452":{"position":[[233,9],[829,9]]}}}],["enough",{"_index":1767,"t":{"177":{"position":[[554,6]]},"179":{"position":[[338,6]]},"190":{"position":[[1250,6]]},"349":{"position":[[149,6]]},"544":{"position":[[103,6]]},"561":{"position":[[6836,8]]},"566":{"position":[[1641,6]]},"573":{"position":[[182,6]]},"648":{"position":[[1476,6],[2719,6]]}}}],["enrich",{"_index":2312,"t":{"311":{"position":[[312,6]]}}}],["enrol",{"_index":1816,"t":{"196":{"position":[[466,8],[2982,8]]}}}],["ensur",{"_index":65,"t":{"7":{"position":[[766,6]]},"75":{"position":[[146,6]]},"83":{"position":[[1609,6]]},"184":{"position":[[429,7]]},"186":{"position":[[121,6]]},"202":{"position":[[197,6]]},"246":{"position":[[127,6]]},"383":{"position":[[1856,6],[2527,6]]},"448":{"position":[[2242,6]]},"450":{"position":[[0,6]]},"454":{"position":[[199,6]]},"538":{"position":[[1257,6]]},"568":{"position":[[356,6],[409,6],[2139,7]]},"596":{"position":[[2451,6]]}}}],["enter",{"_index":2504,"t":{"343":{"position":[[5248,5]]},"454":{"position":[[285,8]]}}}],["entir",{"_index":264,"t":{"15":{"position":[[4329,6]]},"198":{"position":[[1137,9]]},"222":{"position":[[1556,6],[2453,6]]},"242":{"position":[[1537,6],[2439,6]]},"373":{"position":[[27,8]]},"448":{"position":[[2304,8]]},"561":{"position":[[214,6]]},"625":{"position":[[1394,6]]}}}],["entiti",{"_index":1199,"t":{"109":{"position":[[635,8]]},"116":{"position":[[633,8]]}}}],["entri",{"_index":327,"t":{"17":{"position":[[219,5]]},"128":{"position":[[1313,5]]},"198":{"position":[[727,6]]}}}],["entrypoint",{"_index":800,"t":{"55":{"position":[[2395,11]]},"59":{"position":[[994,11]]}}}],["env",{"_index":108,"t":{"11":{"position":[[348,3]]},"15":{"position":[[56,5],[288,3],[526,3],[1850,4],[3898,4]]},"19":{"position":[[1184,3],[1366,4],[1674,3],[1796,3]]},"21":{"position":[[195,3]]},"23":{"position":[[1420,3]]},"25":{"position":[[1034,3]]},"29":{"position":[[2451,3],[4426,3]]},"31":{"position":[[527,3]]},"33":{"position":[[299,3]]},"42":{"position":[[437,3]]},"53":{"position":[[281,3]]},"55":{"position":[[1642,3],[2961,3]]},"59":{"position":[[241,3]]},"61":{"position":[[185,3]]},"65":{"position":[[1221,3],[3676,3]]},"67":{"position":[[0,3],[62,3]]},"75":{"position":[[1096,4],[2188,4]]},"77":{"position":[[428,3]]},"79":{"position":[[1362,3],[3884,3]]},"81":{"position":[[0,3],[62,3]]},"85":{"position":[[0,3],[62,3]]},"89":{"position":[[368,3]]},"91":{"position":[[0,3],[62,3]]},"95":{"position":[[368,3]]},"97":{"position":[[92,3]]},"99":{"position":[[0,3],[62,3]]},"103":{"position":[[0,3],[62,3]]},"107":{"position":[[0,3],[62,3]]},"114":{"position":[[831,5],[1052,3],[1114,3]]},"121":{"position":[[576,3],[638,3]]},"132":{"position":[[460,3]]},"134":{"position":[[1726,5]]},"142":{"position":[[64,4]]},"144":{"position":[[0,3],[62,3]]},"150":{"position":[[455,3],[474,3]]},"152":{"position":[[0,3],[168,3]]},"154":{"position":[[588,3],[607,3],[1714,3]]},"162":{"position":[[558,3]]},"164":{"position":[[0,3],[62,3]]},"168":{"position":[[0,3],[62,3]]},"198":{"position":[[1836,3],[2228,3]]},"200":{"position":[[0,3],[62,3]]},"206":{"position":[[0,3],[62,3]]},"208":{"position":[[1622,5],[2110,3],[2172,3]]},"212":{"position":[[0,3],[62,3]]},"218":{"position":[[0,3],[62,3]]},"232":{"position":[[0,3],[62,3]]},"236":{"position":[[0,3],[62,3]]},"238":{"position":[[355,3],[417,3]]},"246":{"position":[[167,4]]},"251":{"position":[[37,4]]},"257":{"position":[[0,3],[62,3]]},"261":{"position":[[0,3],[62,3]]},"265":{"position":[[0,3],[62,3]]},"269":{"position":[[0,3],[62,3]]},"273":{"position":[[0,3],[62,3]]},"275":{"position":[[1000,4],[1720,5]]},"277":{"position":[[0,3],[62,3]]},"281":{"position":[[0,3],[62,3]]},"289":{"position":[[0,3],[62,3]]},"295":{"position":[[157,3],[219,3]]},"297":{"position":[[998,3],[1244,3]]},"301":{"position":[[125,3],[187,3]]},"303":{"position":[[2888,4],[3326,4],[4020,3],[5190,4]]},"305":{"position":[[0,3],[62,3]]},"307":{"position":[[470,5]]},"311":{"position":[[423,3],[525,3]]},"317":{"position":[[0,3],[62,3]]},"321":{"position":[[0,3],[62,3]]},"329":{"position":[[0,3],[62,3]]},"333":{"position":[[0,3],[62,3]]},"341":{"position":[[1449,3],[1511,3]]},"343":{"position":[[1019,4],[2565,5],[3422,4]]},"345":{"position":[[0,3],[62,3]]},"393":{"position":[[0,3],[62,3]]},"403":{"position":[[64,3],[111,3],[320,3],[433,4],[539,3]]},"470":{"position":[[1626,5]]},"472":{"position":[[31,3]]},"476":{"position":[[462,3]]},"482":{"position":[[548,4],[603,4],[1763,3]]},"530":{"position":[[1844,3],[2119,4]]},"544":{"position":[[1523,3],[1600,3]]},"557":{"position":[[95,3],[177,3],[997,3],[1211,3],[1325,4],[1436,3]]},"586":{"position":[[76,3]]},"594":{"position":[[266,3],[289,3]]},"596":{"position":[[1248,4]]},"621":{"position":[[0,3]]},"623":{"position":[[1156,3]]},"625":{"position":[[190,3],[399,3],[636,3],[1257,3]]},"627":{"position":[[25,3],[43,3]]},"629":{"position":[[72,3],[130,3]]},"642":{"position":[[560,4],[920,6]]}}}],["env/fil",{"_index":1906,"t":{"202":{"position":[[279,8]]},"214":{"position":[[313,8]]},"248":{"position":[[491,8]]}}}],["environ",{"_index":182,"t":{"15":{"position":[[851,12]]},"19":{"position":[[766,11]]},"23":{"position":[[1474,12]]},"25":{"position":[[1088,12]]},"33":{"position":[[129,12]]},"55":{"position":[[1889,12],[2219,12],[3748,12],[6250,12],[6283,12],[6482,12],[6515,12],[6783,11],[8130,12],[8163,12],[8362,12],[8395,12],[8659,11],[9933,12],[9966,12],[10163,11]]},"59":{"position":[[488,12],[818,12]]},"83":{"position":[[1517,11]]},"101":{"position":[[193,11]]},"150":{"position":[[587,12]]},"154":{"position":[[720,12]]},"162":{"position":[[601,11]]},"275":{"position":[[1157,12]]},"311":{"position":[[489,11]]},"331":{"position":[[331,12],[642,12]]},"403":{"position":[[695,12]]},"476":{"position":[[577,12],[1397,12],[1566,12],[2611,12]]},"478":{"position":[[560,12]]},"528":{"position":[[224,12]]},"530":{"position":[[240,11],[861,11],[1858,11],[2273,11],[2684,11],[3610,11]]},"532":{"position":[[456,11],[1037,11],[1180,11],[1322,11],[1460,11]]},"534":{"position":[[189,11]]},"536":{"position":[[175,11],[318,11],[460,11],[598,11]]},"538":{"position":[[921,11],[1165,11],[1565,11],[1951,11],[2288,11]]},"557":{"position":[[1592,12]]},"594":{"position":[[359,12]]},"621":{"position":[[166,12]]},"629":{"position":[[273,12]]}}}],["environment",{"_index":147,"t":{"15":{"position":[[42,13],[320,13],[1226,13],[3396,13]]},"19":{"position":[[70,13],[434,13],[712,13],[1418,13],[1553,13]]},"67":{"position":[[79,13]]},"81":{"position":[[79,13]]},"85":{"position":[[79,13]]},"91":{"position":[[79,13]]},"99":{"position":[[79,13]]},"103":{"position":[[79,13]]},"107":{"position":[[79,13]]},"114":{"position":[[1131,13]]},"121":{"position":[[655,13]]},"144":{"position":[[79,13]]},"164":{"position":[[79,13]]},"168":{"position":[[174,13]]},"200":{"position":[[79,13]]},"206":{"position":[[79,13]]},"208":{"position":[[2189,13]]},"212":{"position":[[79,13]]},"218":{"position":[[79,13]]},"232":{"position":[[79,13]]},"236":{"position":[[79,13]]},"238":{"position":[[434,13]]},"257":{"position":[[79,13]]},"261":{"position":[[79,13]]},"265":{"position":[[79,13]]},"269":{"position":[[79,13]]},"273":{"position":[[79,13]]},"277":{"position":[[79,13]]},"281":{"position":[[79,13]]},"289":{"position":[[79,13]]},"295":{"position":[[236,13]]},"297":{"position":[[1589,13]]},"301":{"position":[[204,13]]},"305":{"position":[[79,13]]},"317":{"position":[[79,13]]},"321":{"position":[[79,13]]},"329":{"position":[[79,13]]},"333":{"position":[[79,13]]},"341":{"position":[[1528,13]]},"345":{"position":[[79,13]]},"393":{"position":[[79,13]]},"448":{"position":[[1501,13]]},"476":{"position":[[1487,13],[1965,13]]},"482":{"position":[[482,13],[879,13],[2397,13]]},"528":{"position":[[406,13]]},"621":{"position":[[44,13]]}}}],["environment/contain",{"_index":1080,"t":{"83":{"position":[[1586,22]]},"538":{"position":[[1234,22]]}}}],["eol",{"_index":2991,"t":{"484":{"position":[[150,4]]}}}],["ep",{"_index":1497,"t":{"154":{"position":[[2187,4],[3386,4]]},"198":{"position":[[1901,2],[1938,3]]},"566":{"position":[[322,4],[811,3]]},"573":{"position":[[496,2],[554,6],[909,2],[967,6]]},"586":{"position":[[364,6]]},"590":{"position":[[461,6]]},"594":{"position":[[760,6],[1339,6]]}}}],["ephemer",{"_index":441,"t":{"23":{"position":[[1298,9]]},"29":{"position":[[3743,9]]}}}],["ep|single)$/i",{"_index":1884,"t":{"198":{"position":[[2680,15]]}}}],["equival",{"_index":322,"t":{"15":{"position":[[5790,11]]},"147":{"position":[[95,10]]},"228":{"position":[[1025,10]]},"253":{"position":[[302,10]]},"544":{"position":[[1190,10]]},"548":{"position":[[94,10]]}}}],["error",{"_index":310,"t":{"15":{"position":[[5472,8],[5696,8]]},"19":{"position":[[1405,5]]},"38":{"position":[[148,5],[785,5],[982,8],[1138,5],[1380,8]]},"40":{"position":[[185,5]]},"67":{"position":[[1310,6],[2801,6]]},"81":{"position":[[1551,6],[3084,6]]},"85":{"position":[[1054,6],[2571,6]]},"91":{"position":[[1219,6],[2802,6]]},"99":{"position":[[1317,6],[2863,6]]},"103":{"position":[[992,6],[2483,6]]},"107":{"position":[[1110,6],[2695,6]]},"114":{"position":[[2242,6],[3798,6]]},"121":{"position":[[1605,6],[3096,6]]},"144":{"position":[[1124,6],[2677,6]]},"164":{"position":[[1145,6],[2696,6]]},"166":{"position":[[223,6],[3145,6]]},"168":{"position":[[1474,6],[2978,6]]},"194":{"position":[[588,6]]},"200":{"position":[[1361,6],[3182,6]]},"206":{"position":[[1118,6],[2593,6]]},"208":{"position":[[4257,6],[6205,6]]},"212":{"position":[[981,6],[2428,6]]},"218":{"position":[[1154,6],[2622,6]]},"232":{"position":[[1233,6],[2686,6]]},"236":{"position":[[1275,6],[3114,6]]},"238":{"position":[[1458,6],[3228,6]]},"253":{"position":[[441,7]]},"257":{"position":[[1306,6],[2764,6]]},"261":{"position":[[1380,6],[3185,6]]},"265":{"position":[[1159,6],[3018,6]]},"269":{"position":[[1034,6],[2781,6]]},"273":{"position":[[1103,6],[2601,6]]},"277":{"position":[[1116,6],[2569,6]]},"281":{"position":[[1082,6],[2552,6]]},"289":{"position":[[1349,6],[2834,6]]},"295":{"position":[[1278,6],[3093,6]]},"297":{"position":[[1084,6]]},"301":{"position":[[1587,6],[3122,6]]},"303":{"position":[[755,5]]},"305":{"position":[[1132,6],[2721,6]]},"317":{"position":[[1111,6],[2695,6]]},"321":{"position":[[1001,6],[2422,6]]},"329":{"position":[[1055,6],[2550,6]]},"331":{"position":[[1080,7]]},"333":{"position":[[1085,6],[2578,6]]},"341":{"position":[[2520,6],[4325,6]]},"343":{"position":[[1240,6],[5091,6]]},"345":{"position":[[1227,6],[2822,6]]},"361":{"position":[[378,5]]},"383":{"position":[[2657,6],[2809,5]]},"393":{"position":[[984,6],[2437,6]]},"452":{"position":[[10,6]]},"454":{"position":[[11,6],[74,6]]},"457":{"position":[[158,5],[193,5],[225,5],[239,6],[415,6]]},"482":{"position":[[1327,6],[1370,5]]},"621":{"position":[[1286,5]]},"646":{"position":[[2530,5],[2567,5],[2592,5]]}}}],["error('error",{"_index":3476,"t":{"651":{"position":[[1074,12]]}}}],["error(`'baseurl",{"_index":3430,"t":{"646":{"position":[[1105,16]]}}}],["error(`'token",{"_index":3428,"t":{"646":{"position":[[952,14]]}}}],["error(`could",{"_index":3434,"t":{"646":{"position":[[1234,12]]}}}],["error/network",{"_index":2653,"t":{"383":{"position":[[237,13]]}}}],["errors/warn",{"_index":2993,"t":{"488":{"position":[[194,16]]}}}],["essenti",{"_index":2221,"t":{"297":{"position":[[2029,9]]},"470":{"position":[[2148,9]]}}}],["estim",{"_index":1855,"t":{"198":{"position":[[10,11],[115,9],[289,9]]}}}],["etc",{"_index":363,"t":{"19":{"position":[[1351,6]]},"33":{"position":[[248,7]]},"55":{"position":[[5185,8]]},"69":{"position":[[1599,7],[1702,5]]},"75":{"position":[[537,7],[1607,7]]},"123":{"position":[[177,6]]},"134":{"position":[[738,6]]},"172":{"position":[[1457,6]]},"331":{"position":[[1158,7]]},"357":{"position":[[436,7]]},"359":{"position":[[667,7]]},"381":{"position":[[343,6]]},"385":{"position":[[257,6],[483,6]]},"395":{"position":[[544,7]]},"397":{"position":[[842,6]]},"403":{"position":[[469,6]]},"464":{"position":[[156,7]]},"470":{"position":[[2777,7]]},"476":{"position":[[393,7]]},"482":{"position":[[419,7],[454,7]]},"557":{"position":[[1361,6]]},"566":{"position":[[715,6],[815,6],[931,6],[1025,6]]},"579":{"position":[[166,6]]},"600":{"position":[[234,6]]},"635":{"position":[[623,6]]}}}],["etc/prometheus.yml",{"_index":683,"t":{"42":{"position":[[530,20]]}}}],["etimedout",{"_index":2846,"t":{"452":{"position":[[164,9]]}}}],["evalu",{"_index":1634,"t":{"172":{"position":[[45,10]]},"303":{"position":[[4982,8]]}}}],["even",{"_index":484,"t":{"27":{"position":[[555,4]]},"75":{"position":[[1902,4]]},"174":{"position":[[849,4]]},"544":{"position":[[318,4]]},"561":{"position":[[481,4],[720,4]]},"623":{"position":[[1329,4]]}}}],["event",{"_index":620,"t":{"38":{"position":[[70,7]]},"55":{"position":[[3103,5]]},"61":{"position":[[327,5]]},"383":{"position":[[212,5]]},"653":{"position":[[1309,6],[1620,6],[1655,6],[3738,5]]}}}],["eventemitt",{"_index":3372,"t":{"640":{"position":[[697,13]]}}}],["eventu",{"_index":569,"t":{"29":{"position":[[3694,10]]},"87":{"position":[[665,10]]},"194":{"position":[[519,10]]},"303":{"position":[[4184,11]]}}}],["everyth",{"_index":650,"t":{"40":{"position":[[140,10]]},"109":{"position":[[776,13],[906,10]]},"116":{"position":[[774,13],[904,10]]},"568":{"position":[[885,10],[979,10]]},"596":{"position":[[1877,10]]}}}],["everywher",{"_index":1769,"t":{"179":{"position":[[146,10]]},"596":{"position":[[66,10]]}}}],["ex",{"_index":205,"t":{"15":{"position":[[1606,2]]},"21":{"position":[[491,2]]},"29":{"position":[[2349,2],[2422,2],[4324,2],[4397,2]]},"65":{"position":[[1218,2]]},"67":{"position":[[166,2],[237,2]]},"75":{"position":[[1291,2]]},"79":{"position":[[1359,2]]},"81":{"position":[[166,2],[237,2]]},"83":{"position":[[359,2],[617,2]]},"85":{"position":[[164,2],[231,2]]},"91":{"position":[[165,2],[234,2]]},"97":{"position":[[225,3]]},"99":{"position":[[166,2],[237,2]]},"103":{"position":[[165,2],[234,2]]},"107":{"position":[[161,2],[222,2]]},"114":{"position":[[1218,2],[1289,2]]},"121":{"position":[[741,2],[810,2]]},"142":{"position":[[351,2]]},"144":{"position":[[164,2],[231,2]]},"164":{"position":[[165,2],[234,2]]},"168":{"position":[[256,2],[317,2]]},"200":{"position":[[169,2],[246,2]]},"206":{"position":[[163,2],[228,2]]},"208":{"position":[[2277,2],[2350,2]]},"212":{"position":[[166,2],[237,2]]},"218":{"position":[[165,2],[234,2]]},"232":{"position":[[162,2],[225,2]]},"236":{"position":[[172,2],[255,2]]},"238":{"position":[[526,2],[607,2]]},"257":{"position":[[162,2],[225,2]]},"261":{"position":[[173,2],[258,2]]},"265":{"position":[[168,2],[243,2]]},"269":{"position":[[172,2],[255,2]]},"273":{"position":[[161,2],[222,2]]},"277":{"position":[[164,2],[231,2]]},"281":{"position":[[162,2],[225,2]]},"289":{"position":[[165,2],[234,2]]},"295":{"position":[[330,2],[415,2]]},"297":{"position":[[1002,3]]},"301":{"position":[[289,2],[356,2]]},"305":{"position":[[166,2],[237,2]]},"317":{"position":[[167,2],[240,2]]},"321":{"position":[[162,2],[225,2]]},"323":{"position":[[164,2]]},"329":{"position":[[161,2],[222,2]]},"333":{"position":[[167,2],[240,2]]},"341":{"position":[[1621,2],[1704,2]]},"343":{"position":[[3125,3]]},"345":{"position":[[162,2],[225,2]]},"381":{"position":[[493,2]]},"391":{"position":[[533,2]]},"393":{"position":[[164,2],[231,2]]},"395":{"position":[[308,2],[606,2]]},"416":{"position":[[726,2]]},"431":{"position":[[159,2]]},"448":{"position":[[2058,2]]},"450":{"position":[[595,2]]},"520":{"position":[[227,3]]},"522":{"position":[[379,2]]},"524":{"position":[[227,3],[543,2]]},"538":{"position":[[451,2],[705,2]]},"566":{"position":[[1367,2],[1456,2]]},"568":{"position":[[847,2],[939,2]]},"621":{"position":[[117,2]]},"623":{"position":[[1377,3]]}}}],["exact",{"_index":1693,"t":{"172":{"position":[[2385,5],[3395,5]]},"196":{"position":[[969,5]]},"341":{"position":[[288,5]]}}}],["exactli",{"_index":1766,"t":{"177":{"position":[[236,7]]},"196":{"position":[[1217,8],[2027,8]]},"343":{"position":[[2334,7],[3062,7],[3271,7]]},"596":{"position":[[2020,7]]}}}],["exampl",{"_index":8,"t":{"2":{"position":[[112,8]]},"15":{"position":[[767,7],[1948,7],[2134,8],[2236,7],[2258,8],[2479,7],[2564,7],[2767,7],[3117,7],[4200,7],[4222,8],[4367,7],[4379,7],[4470,7],[4491,7],[6095,7],[6204,8]]},"19":{"position":[[138,8],[470,7]]},"21":{"position":[[483,7]]},"25":{"position":[[1149,7]]},"29":{"position":[[2779,7],[4698,7]]},"38":{"position":[[336,7],[801,7],[1154,7],[1534,7]]},"42":{"position":[[462,7]]},"55":{"position":[[1708,7],[1797,7]]},"59":{"position":[[307,7],[396,7]]},"65":{"position":[[684,8],[1306,8]]},"67":{"position":[[975,7],[1000,7],[1605,7],[1648,7],[1755,7],[1844,7],[2431,7],[2456,7],[2933,7],[2976,7],[3119,7],[3208,7]]},"75":{"position":[[768,7],[1854,7]]},"79":{"position":[[825,8],[1447,8]]},"81":{"position":[[1216,7],[1241,7],[1846,7],[1889,7],[1996,7],[2085,7],[2714,7],[2739,7],[3216,7],[3259,7],[3402,7],[3491,7]]},"83":{"position":[[958,9],[977,8],[1017,7]]},"85":{"position":[[721,7],[746,7],[1343,7],[1386,7],[1491,7],[1580,7],[2203,7],[2228,7],[2703,7],[2746,7],[2887,7],[2976,7]]},"89":{"position":[[238,7]]},"91":{"position":[[885,7],[910,7],[1511,7],[1554,7],[1660,7],[1749,7],[2433,7],[2458,7],[2934,7],[2977,7],[3119,7],[3208,7]]},"95":{"position":[[238,7]]},"99":{"position":[[982,7],[1007,7],[1612,7],[1655,7],[1762,7],[1851,7],[2493,7],[2518,7],[2995,7],[3038,7],[3181,7],[3270,7]]},"101":{"position":[[97,7]]},"103":{"position":[[658,7],[683,7],[1284,7],[1327,7],[1433,7],[1522,7],[2114,7],[2139,7],[2615,7],[2658,7],[2800,7],[2889,7]]},"107":{"position":[[770,7],[795,7],[1420,7],[1463,7],[1575,7],[1664,7],[2320,7],[2345,7],[2827,7],[2870,7],[3018,7],[3107,7]]},"109":{"position":[[942,7]]},"114":{"position":[[1907,7],[1932,7],[2537,7],[2580,7],[2687,7],[2776,7],[3428,7],[3453,7],[3930,7],[3973,7],[4116,7],[4205,7]]},"116":{"position":[[940,7]]},"121":{"position":[[1271,7],[1296,7],[1897,7],[1940,7],[2046,7],[2135,7],[2727,7],[2752,7],[3228,7],[3271,7],[3413,7],[3502,7]]},"123":{"position":[[114,8]]},"132":{"position":[[592,8]]},"140":{"position":[[356,9]]},"142":{"position":[[733,7]]},"144":{"position":[[787,7],[812,7],[1425,7],[1468,7],[1577,7],[1666,7],[2305,7],[2330,7],[2809,7],[2852,7],[2997,7],[3086,7]]},"147":{"position":[[83,8],[157,7],[249,8],[318,7]]},"160":{"position":[[271,7]]},"164":{"position":[[811,7],[836,7],[1437,7],[1480,7],[1586,7],[1675,7],[2327,7],[2352,7],[2828,7],[2871,7],[3013,7],[3102,7]]},"166":{"position":[[2265,7],[2797,7],[3426,7],[3456,7]]},"168":{"position":[[1136,7],[1161,7],[1778,7],[1821,7],[1931,7],[2020,7],[2605,7],[2630,7],[3110,7],[3153,7],[3299,7],[3388,7]]},"172":{"position":[[746,7],[846,7],[1413,7],[1464,7],[1666,7],[1947,8],[3771,7]]},"177":{"position":[[147,9]]},"186":{"position":[[318,7]]},"198":{"position":[[738,8],[2471,7],[2559,7]]},"200":{"position":[[1023,7],[1048,7],[1665,7],[1708,7],[1818,7],[1907,7],[2809,7],[2834,7],[3314,7],[3357,7],[3503,7],[3592,7]]},"204":{"position":[[612,8],[621,8]]},"206":{"position":[[786,7],[811,7],[1404,7],[1447,7],[1551,7],[1640,7],[2226,7],[2251,7],[2725,7],[2768,7],[2908,7],[2997,7]]},"208":{"position":[[1764,8],[3921,7],[3946,7],[4555,7],[4598,7],[4706,7],[4795,7],[5834,7],[5859,7],[6337,7],[6380,7],[6524,7],[6613,7]]},"210":{"position":[[1893,7]]},"212":{"position":[[646,7],[671,7],[1276,7],[1319,7],[1426,7],[1515,7],[2058,7],[2083,7],[2560,7],[2603,7],[2746,7],[2835,7]]},"216":{"position":[[620,8],[629,8]]},"218":{"position":[[820,7],[845,7],[1446,7],[1489,7],[1595,7],[1684,7],[2253,7],[2278,7],[2754,7],[2797,7],[2939,7],[3028,7]]},"230":{"position":[[363,8]]},"232":{"position":[[894,7],[919,7],[1540,7],[1583,7],[1694,7],[1783,7],[2312,7],[2337,7],[2818,7],[2861,7],[3008,7],[3097,7]]},"236":{"position":[[941,7],[966,7],[1823,7],[1866,7],[1972,7],[2061,7],[2745,7],[2770,7],[3246,7],[3289,7],[3431,7],[3520,7]]},"238":{"position":[[1125,7],[1150,7],[2000,7],[2043,7],[2148,7],[2237,7],[2860,7],[2885,7],[3360,7],[3403,7],[3544,7],[3633,7]]},"248":{"position":[[602,8]]},"255":{"position":[[363,8]]},"257":{"position":[[968,7],[993,7],[1610,7],[1653,7],[1763,7],[1852,7],[2391,7],[2416,7],[2896,7],[2939,7],[3085,7],[3174,7]]},"261":{"position":[[1045,7],[1070,7],[1934,7],[1977,7],[2084,7],[2173,7],[2815,7],[2840,7],[3317,7],[3360,7],[3503,7],[3592,7]]},"265":{"position":[[819,7],[844,7],[1743,7],[1786,7],[1898,7],[1987,7],[2643,7],[2668,7],[3150,7],[3193,7],[3341,7],[3430,7]]},"269":{"position":[[700,7],[725,7],[1582,7],[1625,7],[1731,7],[1820,7],[2412,7],[2437,7],[2913,7],[2956,7],[3098,7],[3187,7]]},"273":{"position":[[766,7],[791,7],[1404,7],[1447,7],[1556,7],[1645,7],[2229,7],[2254,7],[2733,7],[2776,7],[2921,7],[3010,7]]},"277":{"position":[[783,7],[808,7],[1405,7],[1448,7],[1553,7],[1642,7],[2201,7],[2226,7],[2701,7],[2744,7],[2885,7],[2974,7]]},"281":{"position":[[751,7],[776,7],[1365,7],[1408,7],[1511,7],[1600,7],[2186,7],[2211,7],[2684,7],[2727,7],[2866,7],[2955,7]]},"283":{"position":[[921,8],[930,8]]},"285":{"position":[[342,7]]},"287":{"position":[[345,7]]},"289":{"position":[[1015,7],[1040,7],[1641,7],[1684,7],[1790,7],[1879,7],[2465,7],[2490,7],[2966,7],[3009,7],[3151,7],[3240,7]]},"295":{"position":[[943,7],[968,7],[1832,7],[1875,7],[1982,7],[2071,7],[2723,7],[2748,7],[3225,7],[3268,7],[3411,7],[3500,7]]},"297":{"position":[[888,8]]},"301":{"position":[[1254,7],[1279,7],[1876,7],[1919,7],[2024,7],[2113,7],[2754,7],[2779,7],[3254,7],[3297,7],[3438,7],[3527,7]]},"303":{"position":[[2660,8]]},"305":{"position":[[797,7],[822,7],[1427,7],[1470,7],[1577,7],[1666,7],[2351,7],[2376,7],[2853,7],[2896,7],[3039,7],[3128,7]]},"307":{"position":[[686,8]]},"317":{"position":[[775,7],[800,7],[1409,7],[1452,7],[1560,7],[1649,7],[2324,7],[2349,7],[2827,7],[2870,7],[3014,7],[3103,7]]},"319":{"position":[[1535,7],[1543,7]]},"321":{"position":[[670,7],[695,7],[1284,7],[1327,7],[1430,7],[1519,7],[2056,7],[2081,7],[2554,7],[2597,7],[2736,7],[2825,7]]},"325":{"position":[[153,7]]},"329":{"position":[[715,7],[740,7],[1365,7],[1408,7],[1520,7],[1609,7],[2175,7],[2200,7],[2682,7],[2725,7],[2873,7],[2962,7]]},"331":{"position":[[166,7]]},"333":{"position":[[377,7],[749,7],[774,7],[1383,7],[1426,7],[1534,7],[1623,7],[2207,7],[2232,7],[2710,7],[2753,7],[2897,7],[2986,7]]},"341":{"position":[[772,8],[2186,7],[2211,7],[3068,7],[3111,7],[3217,7],[3306,7],[3956,7],[3981,7],[4457,7],[4500,7],[4642,7],[4731,7]]},"345":{"position":[[892,7],[917,7],[1522,7],[1565,7],[1672,7],[1761,7],[2452,7],[2477,7],[2954,7],[2997,7],[3140,7],[3229,7]]},"353":{"position":[[737,8]]},"355":{"position":[[130,8]]},"357":{"position":[[397,9],[444,7],[1124,7],[1959,7]]},"361":{"position":[[895,7],[1176,7]]},"363":{"position":[[1161,7],[1365,7]]},"365":{"position":[[472,7]]},"370":{"position":[[4,8]]},"383":{"position":[[1070,8],[1805,8],[3052,8]]},"393":{"position":[[647,7],[672,7],[1285,7],[1328,7],[1437,7],[1526,7],[2065,7],[2090,7],[2569,7],[2612,7],[2757,7],[2846,7]]},"395":{"position":[[650,7]]},"397":{"position":[[1396,7]]},"401":{"position":[[230,7]]},"403":{"position":[[405,7],[507,7],[581,7]]},"406":{"position":[[0,7]]},"408":{"position":[[0,7]]},"410":{"position":[[149,7]]},"412":{"position":[[215,7]]},"414":{"position":[[170,7],[562,7]]},"421":{"position":[[40,7]]},"423":{"position":[[60,7]]},"425":{"position":[[0,7]]},"427":{"position":[[0,7]]},"429":{"position":[[0,7]]},"431":{"position":[[656,7]]},"448":{"position":[[1630,8]]},"466":{"position":[[188,7],[337,7]]},"472":{"position":[[44,8]]},"478":{"position":[[64,7],[76,7]]},"482":{"position":[[686,9],[1753,9]]},"528":{"position":[[439,8]]},"532":{"position":[[1681,7]]},"536":{"position":[[819,7]]},"538":{"position":[[885,8],[1855,7]]},"542":{"position":[[372,8],[449,7]]},"551":{"position":[[745,7]]},"553":{"position":[[116,8]]},"555":{"position":[[358,7],[943,7]]},"557":{"position":[[1296,8],[1404,7],[1478,7]]},"561":{"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]]},"568":{"position":[[1401,7]]},"575":{"position":[[525,8]]},"579":{"position":[[374,7]]},"581":{"position":[[530,7]]},"584":{"position":[[0,7]]},"586":{"position":[[88,7]]},"588":{"position":[[277,7]]},"590":{"position":[[185,7]]},"592":{"position":[[406,7]]},"594":{"position":[[258,7]]},"600":{"position":[[170,8]]},"602":{"position":[[112,8]]},"629":{"position":[[218,8]]},"638":{"position":[[691,8],[812,8]]}}}],["example.com",{"_index":2043,"t":{"230":{"position":[[551,13]]},"255":{"position":[[556,13]]}}}],["except",{"_index":565,"t":{"29":{"position":[[3250,6],[5004,6]]},"353":{"position":[[695,7]]},"383":{"position":[[673,9],[2766,9],[2890,9]]},"476":{"position":[[2211,11]]},"561":{"position":[[2757,6]]},"577":{"position":[[197,6]]}}}],["exclud",{"_index":2222,"t":{"299":{"position":[[103,7]]},"566":{"position":[[1252,9],[1462,7]]}}}],["exclus",{"_index":261,"t":{"15":{"position":[[4092,9]]},"297":{"position":[[873,10]]}}}],["execstart=npm",{"_index":3028,"t":{"503":{"position":[[371,13]]}}}],["execut",{"_index":3162,"t":{"561":{"position":[[1083,8]]}}}],["exhaust",{"_index":1220,"t":{"109":{"position":[[1908,10]]},"166":{"position":[[494,10]]},"395":{"position":[[221,10]]},"577":{"position":[[320,13]]}}}],["exist",{"_index":23,"t":{"7":{"position":[[49,8],[274,8],[410,8],[579,8]]},"9":{"position":[[235,6]]},"19":{"position":[[1787,8]]},"46":{"position":[[28,8],[224,8]]},"48":{"position":[[109,8]]},"50":{"position":[[169,8]]},"55":{"position":[[25,9],[1751,8]]},"59":{"position":[[350,8]]},"65":{"position":[[2817,8]]},"79":{"position":[[2992,8]]},"83":{"position":[[288,9]]},"166":{"position":[[568,8]]},"172":{"position":[[100,8],[2845,8],[3048,9],[3131,8],[3622,8],[3978,8],[4036,8],[4566,9]]},"174":{"position":[[792,8]]},"177":{"position":[[272,8]]},"179":{"position":[[588,8]]},"303":{"position":[[1796,8]]},"343":{"position":[[1531,9]]},"353":{"position":[[1494,11],[1533,10]]},"359":{"position":[[1188,8]]},"425":{"position":[[87,11]]},"440":{"position":[[332,8]]},"457":{"position":[[100,6]]},"497":{"position":[[53,8]]},"532":{"position":[[127,8]]},"538":{"position":[[380,9]]},"544":{"position":[[375,8]]},"561":{"position":[[2500,8]]},"653":{"position":[[1474,8]]}}}],["exit",{"_index":1017,"t":{"69":{"position":[[1532,4]]},"457":{"position":[[172,6]]}}}],["expand",{"_index":992,"t":{"67":{"position":[[2401,6]]},"81":{"position":[[2684,6]]},"85":{"position":[[2173,6]]},"91":{"position":[[2403,6]]},"99":{"position":[[2463,6]]},"103":{"position":[[2084,6]]},"107":{"position":[[2290,6]]},"114":{"position":[[3398,6]]},"121":{"position":[[2697,6]]},"144":{"position":[[2275,6]]},"158":{"position":[[648,6]]},"164":{"position":[[2297,6]]},"168":{"position":[[2575,6]]},"194":{"position":[[322,6]]},"200":{"position":[[2779,6]]},"206":{"position":[[2196,6]]},"208":{"position":[[5804,6]]},"212":{"position":[[2028,6]]},"218":{"position":[[2223,6]]},"232":{"position":[[2282,6]]},"236":{"position":[[2715,6]]},"238":{"position":[[2830,6]]},"257":{"position":[[2361,6]]},"261":{"position":[[2785,6]]},"265":{"position":[[2613,6]]},"269":{"position":[[2382,6]]},"273":{"position":[[2199,6]]},"277":{"position":[[2171,6]]},"281":{"position":[[2156,6]]},"289":{"position":[[2435,6]]},"295":{"position":[[2693,6]]},"301":{"position":[[2724,6]]},"305":{"position":[[2321,6]]},"317":{"position":[[2294,6]]},"321":{"position":[[2026,6]]},"329":{"position":[[2145,6]]},"333":{"position":[[2177,6]]},"341":{"position":[[3926,6]]},"345":{"position":[[2422,6]]},"393":{"position":[[2035,6]]}}}],["expans",{"_index":2962,"t":{"482":{"position":[[658,10]]}}}],["expect",{"_index":2211,"t":{"297":{"position":[[1122,8]]},"470":{"position":[[3069,8]]},"561":{"position":[[6721,6]]},"573":{"position":[[333,6]]},"581":{"position":[[132,8]]}}}],["experi",{"_index":718,"t":{"46":{"position":[[561,10]]},"55":{"position":[[381,11],[767,10]]},"67":{"position":[[1199,10],[1620,10],[1811,10],[2691,10],[2948,10],[3175,10]]},"81":{"position":[[1440,10],[1861,10],[2052,10],[2974,10],[3231,10],[3458,10]]},"85":{"position":[[943,10],[1358,10],[1547,10],[2461,10],[2718,10],[2943,10]]},"91":{"position":[[1108,10],[1526,10],[1716,10],[2692,10],[2949,10],[3175,10]]},"99":{"position":[[1206,10],[1627,10],[1818,10],[2753,10],[3010,10],[3237,10]]},"103":{"position":[[881,10],[1299,10],[1489,10],[2373,10],[2630,10],[2856,10]]},"107":{"position":[[999,10],[1435,10],[1631,10],[2585,10],[2842,10],[3074,10]]},"109":{"position":[[661,10]]},"114":{"position":[[2131,10],[2552,10],[2743,10],[3688,10],[3945,10],[4172,10]]},"116":{"position":[[659,10]]},"121":{"position":[[1494,10],[1912,10],[2102,10],[2986,10],[3243,10],[3469,10]]},"144":{"position":[[1013,10],[1440,10],[1633,10],[2567,10],[2824,10],[3053,10]]},"160":{"position":[[127,10]]},"164":{"position":[[1034,10],[1452,10],[1642,10],[2586,10],[2843,10],[3069,10]]},"166":{"position":[[200,10],[283,10]]},"168":{"position":[[1363,10],[1793,10],[1987,10],[2868,10],[3125,10],[3355,10]]},"198":{"position":[[1577,10]]},"200":{"position":[[1250,10],[1680,10],[1874,10],[3072,10],[3329,10],[3559,10]]},"206":{"position":[[1007,10],[1419,10],[1607,10],[2483,10],[2740,10],[2964,10]]},"208":{"position":[[4146,10],[4570,10],[4762,10],[6095,10],[6352,10],[6580,10]]},"212":{"position":[[870,10],[1291,10],[1482,10],[2318,10],[2575,10],[2802,10]]},"218":{"position":[[1043,10],[1461,10],[1651,10],[2512,10],[2769,10],[2995,10]]},"232":{"position":[[1122,10],[1555,10],[1750,10],[2576,10],[2833,10],[3064,10]]},"236":{"position":[[1164,10],[1838,10],[2028,10],[3004,10],[3261,10],[3487,10]]},"238":{"position":[[1347,10],[2015,10],[2204,10],[3118,10],[3375,10],[3600,10]]},"257":{"position":[[1195,10],[1625,10],[1819,10],[2654,10],[2911,10],[3141,10]]},"261":{"position":[[1269,10],[1949,10],[2140,10],[3075,10],[3332,10],[3559,10]]},"265":{"position":[[1048,10],[1758,10],[1954,10],[2908,10],[3165,10],[3397,10]]},"269":{"position":[[923,10],[1597,10],[1787,10],[2671,10],[2928,10],[3154,10]]},"273":{"position":[[992,10],[1419,10],[1612,10],[2491,10],[2748,10],[2977,10]]},"277":{"position":[[1005,10],[1420,10],[1609,10],[2459,10],[2716,10],[2941,10]]},"281":{"position":[[971,10],[1380,10],[1567,10],[2442,10],[2699,10],[2922,10]]},"289":{"position":[[1238,10],[1656,10],[1846,10],[2724,10],[2981,10],[3207,10]]},"295":{"position":[[1167,10],[1847,10],[2038,10],[2983,10],[3240,10],[3467,10]]},"301":{"position":[[1476,10],[1891,10],[2080,10],[3012,10],[3269,10],[3494,10]]},"305":{"position":[[1021,10],[1442,10],[1633,10],[2611,10],[2868,10],[3095,10]]},"317":{"position":[[1000,10],[1424,10],[1616,10],[2585,10],[2842,10],[3070,10]]},"321":{"position":[[890,10],[1299,10],[1486,10],[2312,10],[2569,10],[2792,10]]},"329":{"position":[[944,10],[1380,10],[1576,10],[2440,10],[2697,10],[2929,10]]},"333":{"position":[[974,10],[1398,10],[1590,10],[2468,10],[2725,10],[2953,10]]},"341":{"position":[[2409,10],[3083,10],[3273,10],[4215,10],[4472,10],[4698,10]]},"343":{"position":[[1926,10]]},"345":{"position":[[1116,10],[1537,10],[1728,10],[2712,10],[2969,10],[3196,10]]},"393":{"position":[[873,10],[1300,10],[1493,10],[2327,10],[2584,10],[2813,10]]},"470":{"position":[[1239,10]]}}}],["experienc",{"_index":3006,"t":{"495":{"position":[[66,11]]}}}],["experiment",{"_index":886,"t":{"55":{"position":[[8985,12]]},"166":{"position":[[178,13]]}}}],["expir",{"_index":1805,"t":{"194":{"position":[[530,7]]},"196":{"position":[[2897,7]]}}}],["expiri",{"_index":1804,"t":{"194":{"position":[[488,6]]}}}],["explain",{"_index":2916,"t":{"470":{"position":[[3057,7]]},"492":{"position":[[643,10]]}}}],["explan",{"_index":773,"t":{"55":{"position":[[1410,11]]},"59":{"position":[[9,11]]},"343":{"position":[[383,12]]}}}],["explicit",{"_index":2029,"t":{"226":{"position":[[92,8]]},"577":{"position":[[115,8]]}}}],["explicitli",{"_index":105,"t":{"11":{"position":[[302,10]]},"21":{"position":[[341,10]]},"23":{"position":[[1231,10],[1366,10]]},"89":{"position":[[518,10]]},"95":{"position":[[512,10]]},"136":{"position":[[585,10]]},"140":{"position":[[333,10],[889,10],[1196,10],[1636,10]]},"166":{"position":[[2050,10]]},"172":{"position":[[2113,10]]},"204":{"position":[[362,10]]},"208":{"position":[[1293,10]]},"210":{"position":[[989,10]]},"216":{"position":[[366,10]]},"283":{"position":[[719,10]]},"307":{"position":[[582,10]]},"391":{"position":[[492,10]]},"476":{"position":[[1105,10]]},"566":{"position":[[1223,11],[1373,10]]}}}],["explor",{"_index":263,"t":{"15":{"position":[[4317,7]]}}}],["export",{"_index":189,"t":{"15":{"position":[[1032,6]]},"42":{"position":[[13,6]]},"638":{"position":[[458,6],[870,6],[968,6],[1455,6],[1535,6],[1741,6],[1799,6]]},"640":{"position":[[439,6]]},"642":{"position":[[375,6]]},"644":{"position":[[336,6]]},"646":{"position":[[357,6],[1617,6],[2255,6]]},"648":{"position":[[1684,6]]},"651":{"position":[[439,6]]},"653":{"position":[[882,6],[2801,6],[3473,6]]}}}],["expos",{"_index":491,"t":{"29":{"position":[[153,7]]},"55":{"position":[[5532,8],[5827,6],[6918,8],[7213,6],[9177,8],[9472,6],[9567,6]]},"65":{"position":[[827,6]]},"79":{"position":[[968,6]]},"128":{"position":[[685,6],[1036,6]]},"275":{"position":[[1343,6]]}}}],["express",{"_index":2353,"t":{"319":{"position":[[1190,12],[1367,10],[1470,12]]},"363":{"position":[[194,11],[906,10]]},"397":{"position":[[409,12]]},"412":{"position":[[39,12]]},"414":{"position":[[57,11]]},"416":{"position":[[21,10],[95,11],[187,10],[234,11],[410,11]]},"418":{"position":[[49,12]]}}}],["expressj",{"_index":2625,"t":{"373":{"position":[[219,10]]}}}],["extend",{"_index":3340,"t":{"638":{"position":[[496,7],[910,7],[1011,7]]},"640":{"position":[[477,7]]},"644":{"position":[[374,7]]},"646":{"position":[[395,7],[1655,7],[2293,7]]},"648":{"position":[[1722,7]]},"651":{"position":[[477,7]]},"653":{"position":[[920,7],[2836,7],[3514,7]]}}}],["extens",{"_index":2171,"t":{"283":{"position":[[291,9]]},"315":{"position":[[47,10],[206,9]]},"323":{"position":[[34,9],[255,9]]},"327":{"position":[[171,10],[314,10]]},"377":{"position":[[226,10]]},"448":{"position":[[92,9],[2457,9]]},"596":{"position":[[1733,9]]}}}],["extern",{"_index":408,"t":{"23":{"position":[[45,8],[660,8]]},"29":{"position":[[353,8]]},"55":{"position":[[4932,8]]},"65":{"position":[[278,8],[343,8],[370,8],[1182,8],[2648,8],[2844,8],[3331,8]]},"67":{"position":[[477,8]]},"79":{"position":[[369,8],[484,8],[511,8],[1323,8],[2823,8],[3019,8],[3539,8]]},"81":{"position":[[450,8]]},"208":{"position":[[1362,8],[1845,10]]},"476":{"position":[[2510,8]]}}}],["extra",{"_index":538,"t":{"29":{"position":[[1604,5]]},"319":{"position":[[246,5]]},"512":{"position":[[478,5]]}}}],["extract",{"_index":1662,"t":{"172":{"position":[[1192,7],[1402,10],[1936,10],[4965,11]]},"194":{"position":[[79,7]]},"196":{"position":[[290,7],[736,10],[1651,7],[2636,9]]},"198":{"position":[[1208,8]]},"319":{"position":[[1109,7],[1309,7],[1412,10],[1692,8],[1868,7]]},"355":{"position":[[288,7]]},"357":{"position":[[1366,8]]},"395":{"position":[[52,7],[552,8]]},"397":{"position":[[572,7],[726,7],[807,7],[1112,7],[1361,7],[1498,9]]},"410":{"position":[[34,7]]},"532":{"position":[[751,9]]},"534":{"position":[[484,9]]},"557":{"position":[[679,9]]},"561":{"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]]},"573":{"position":[[647,10],[1052,9]]},"590":{"position":[[80,10]]}}}],["extran",{"_index":1899,"t":{"200":{"position":[[726,10]]}}}],["eyj0exaioijkv1qilcjhbgcioijfuzi1niisim",{"_index":1842,"t":{"196":{"position":[[2463,44]]}}}],["eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjkawqioijkawq6cgxjong0njvwzmtyew5zadz",{"_index":1257,"t":{"114":{"position":[[3000,82],[4441,82]]},"295":{"position":[[2295,82],[3736,82]]}}}],["f",{"_index":1706,"t":{"172":{"position":[[3814,1],[3930,1],[4248,1],[4369,1]]}}}],["f12",{"_index":1513,"t":{"158":{"position":[[324,3]]},"194":{"position":[[224,3]]},"196":{"position":[[1109,4]]}}}],["f243331e",{"_index":3341,"t":{"638":{"position":[[700,8]]}}}],["face",{"_index":915,"t":{"65":{"position":[[797,6],[899,6]]},"79":{"position":[[938,6],[1040,6]]},"323":{"position":[[547,6]]}}}],["factor",{"_index":490,"t":{"29":{"position":[[111,8]]}}}],["factori",{"_index":2727,"t":{"395":{"position":[[825,9],[944,9]]},"561":{"position":[[4578,8],[4640,7],[4911,9],[5527,7]]},"575":{"position":[[728,9],[911,9]]}}}],["fail",{"_index":556,"t":{"29":{"position":[[2683,6],[3406,9],[4604,6],[5162,9]]},"40":{"position":[[289,7]]},"65":{"position":[[2834,6]]},"79":{"position":[[3009,6]]},"361":{"position":[[415,5],[769,5],[1037,6],[1345,5]]},"383":{"position":[[696,6],[2631,6]]},"448":{"position":[[2515,6]]},"561":{"position":[[7091,6]]},"590":{"position":[[813,5]]},"623":{"position":[[833,5],[866,6]]}}}],["failur",{"_index":622,"t":{"38":{"position":[[179,7]]},"55":{"position":[[3159,7]]},"61":{"position":[[383,7]]},"383":{"position":[[1627,8],[2749,7],[2787,7],[2969,8]]},"596":{"position":[[1099,7]]},"623":{"position":[[982,7]]}}}],["failure/etc",{"_index":2654,"t":{"383":{"position":[[251,14]]}}}],["fake",{"_index":2031,"t":{"226":{"position":[[192,4],[600,4]]},"232":{"position":[[508,4],[581,4]]},"287":{"position":[[207,4]]}}}],["fall",{"_index":1752,"t":{"174":{"position":[[339,4]]},"309":{"position":[[181,5]]},"575":{"position":[[2033,7]]}}}],["fallback",{"_index":960,"t":{"67":{"position":[[636,8]]},"81":{"position":[[609,8]]},"315":{"position":[[417,8]]},"590":{"position":[[52,8]]},"592":{"position":[[856,8]]}}}],["fals",{"_index":271,"t":{"15":{"position":[[4537,6],[4558,6],[4599,6],[4652,6]]},"67":{"position":[[685,5]]},"81":{"position":[[658,5]]},"136":{"position":[[783,5]]},"140":{"position":[[1098,5]]},"198":{"position":[[1588,5],[1742,5],[2302,6],[2825,5]]},"210":{"position":[[1196,5]]},"281":{"position":[[1869,5],[3240,5]]},"315":{"position":[[1088,5]]},"359":{"position":[[211,6]]},"383":{"position":[[2149,6],[2251,6],[2617,5],[2910,5]]},"399":{"position":[[162,6]]},"410":{"position":[[402,5]]},"555":{"position":[[532,6]]},"561":{"position":[[456,6]]},"579":{"position":[[542,6],[560,6],[576,6],[599,6]]},"588":{"position":[[696,6],[714,6],[730,6],[753,6]]},"640":{"position":[[921,6]]},"646":{"position":[[536,6]]}}}],["famili",{"_index":1538,"t":{"162":{"position":[[78,6],[1131,6]]},"164":{"position":[[1804,7],[3244,7]]},"301":{"position":[[2400,8],[3828,8]]},"596":{"position":[[997,8],[2268,6]]}}}],["fan",{"_index":3132,"t":{"544":{"position":[[1335,3]]},"548":{"position":[[239,3]]}}}],["fanci",{"_index":3323,"t":{"635":{"position":[[27,6]]}}}],["faq",{"_index":145,"t":{"13":{"position":[[14,3]]},"230":{"position":[[818,3]]},"255":{"position":[[823,3]]},"343":{"position":[[364,3]]},"495":{"position":[[10,3],[110,3]]},"542":{"position":[[596,3]]},"612":{"position":[[59,3]]}}}],["fashion",{"_index":2519,"t":{"347":{"position":[[85,7]]}}}],["faster",{"_index":412,"t":{"23":{"position":[[86,7]]},"476":{"position":[[2444,6]]},"544":{"position":[[1680,6]]}}}],["favorit",{"_index":3133,"t":{"544":{"position":[[1400,8]]},"548":{"position":[[304,8]]}}}],["feasibl",{"_index":3320,"t":{"631":{"position":[[605,8]]}}}],["feat",{"_index":1666,"t":{"172":{"position":[[1448,4],[1701,6]]},"395":{"position":[[534,5],[622,6],[765,6]]},"397":{"position":[[832,5]]},"410":{"position":[[100,6]]},"561":{"position":[[3051,6],[4518,6],[4723,6],[5468,6],[5688,6]]},"575":{"position":[[668,6]]}}}],["featur",{"_index":984,"t":{"67":{"position":[[1932,9],[3296,9]]},"81":{"position":[[2173,9],[3579,9]]},"85":{"position":[[1668,9],[3064,9]]},"91":{"position":[[1837,9],[3296,9]]},"99":{"position":[[1939,9],[3358,9]]},"103":{"position":[[1610,9],[2977,9]]},"107":{"position":[[1752,9],[3195,9]]},"114":{"position":[[2864,9],[4293,9]]},"121":{"position":[[2223,9],[3590,9]]},"136":{"position":[[10,7]]},"144":{"position":[[1754,9],[3174,9]]},"164":{"position":[[1763,9],[3190,9]]},"168":{"position":[[2108,9],[3476,9]]},"172":{"position":[[1518,10]]},"196":{"position":[[1789,8]]},"200":{"position":[[1995,9],[3680,9]]},"206":{"position":[[1728,9],[3085,9]]},"208":{"position":[[4883,9],[6701,9]]},"212":{"position":[[1603,9],[2923,9]]},"218":{"position":[[1772,9],[3116,9]]},"232":{"position":[[1871,9],[3185,9]]},"236":{"position":[[2149,9],[3608,9]]},"238":{"position":[[2325,9],[3721,9]]},"240":{"position":[[174,7]]},"257":{"position":[[1940,9],[3262,9]]},"261":{"position":[[2261,9],[3680,9]]},"265":{"position":[[2075,9],[3518,9]]},"269":{"position":[[1908,9],[3275,9]]},"273":{"position":[[1733,9],[3098,9]]},"277":{"position":[[1730,9],[3062,9]]},"281":{"position":[[1688,9],[3043,9]]},"289":{"position":[[1967,9],[3328,9]]},"295":{"position":[[2159,9],[3588,9]]},"301":{"position":[[2201,9],[3615,9]]},"305":{"position":[[1754,9],[3216,9]]},"317":{"position":[[1737,9],[3191,9]]},"321":{"position":[[1607,9],[2913,9]]},"329":{"position":[[1697,9],[3050,9]]},"333":{"position":[[1711,9],[3074,9]]},"341":{"position":[[3394,9],[4819,9]]},"345":{"position":[[1849,9],[3317,9]]},"393":{"position":[[1614,9],[2934,9]]},"499":{"position":[[253,7]]}}}],["fedora",{"_index":3015,"t":{"501":{"position":[[99,7]]}}}],["feed",{"_index":1768,"t":{"179":{"position":[[77,7]]}}}],["feedback",{"_index":2889,"t":{"470":{"position":[[1339,8]]}}}],["fenc",{"_index":2999,"t":{"492":{"position":[[521,6]]}}}],["fetch",{"_index":29,"t":{"7":{"position":[[155,7]]},"79":{"position":[[4288,8]]},"172":{"position":[[5178,8]]},"174":{"position":[[1134,7]]},"383":{"position":[[357,8]]},"594":{"position":[[23,5]]}}}],["fetch/xhr",{"_index":1831,"t":{"196":{"position":[[1293,9]]}}}],["fetchabl",{"_index":448,"t":{"25":{"position":[[163,9]]}}}],["few",{"_index":489,"t":{"29":{"position":[[107,3],[491,3]]},"36":{"position":[[353,3]]},"172":{"position":[[3029,3]]},"343":{"position":[[4193,3]]},"464":{"position":[[40,3]]},"476":{"position":[[2207,3]]},"492":{"position":[[45,3]]}}}],["ffff:127.0.0.1",{"_index":2820,"t":{"448":{"position":[[493,16],[704,16]]}}}],["ffff:192.168.0.100",{"_index":2833,"t":{"448":{"position":[[1028,20]]}}}],["field",{"_index":340,"t":{"19":{"position":[[316,6],[376,5]]},"196":{"position":[[2757,5]]},"220":{"position":[[438,6]]},"319":{"position":[[1298,7],[1391,5],[2123,6],[2185,5]]},"347":{"position":[[519,5]]},"399":{"position":[[97,6]]},"418":{"position":[[412,5],[491,5]]},"462":{"position":[[57,5]]},"464":{"position":[[51,6],[181,6],[360,6]]},"532":{"position":[[730,6]]},"534":{"position":[[463,6]]},"555":{"position":[[330,6]]},"557":{"position":[[797,6],[814,5]]},"561":{"position":[[2353,6],[2421,6],[2743,6],[2867,6],[3376,7],[6183,7]]},"568":{"position":[[1050,5],[1134,6],[2444,5]]},"575":{"position":[[196,6],[298,6],[1169,5],[1258,5],[1534,6],[2006,5]]},"594":{"position":[[329,6]]}}}],["field/env",{"_index":2288,"t":{"303":{"position":[[5346,9]]}}}],["file",{"_index":128,"t":{"11":{"position":[[883,4],[976,4]]},"15":{"position":[[107,5],[139,4],[292,4],[297,4],[433,5],[477,5],[754,5],[1167,5],[1463,4],[1527,5],[1892,5],[2336,4],[2399,5],[3132,4],[3172,4],[3324,4],[3713,4],[5785,4],[6275,4],[6287,6]]},"19":{"position":[[11,4],[109,6],[225,5],[347,6],[497,4]]},"23":{"position":[[873,4],[941,4]]},"33":{"position":[[334,4]]},"38":{"position":[[234,4]]},"42":{"position":[[513,4]]},"53":{"position":[[327,4]]},"55":{"position":[[6168,4],[6379,5],[8048,4],[8259,5],[9855,4]]},"65":{"position":[[1259,4],[3749,4]]},"67":{"position":[[4,4],[391,4],[792,4],[1015,4],[1040,4],[1663,4],[1688,4],[1770,4],[1920,4],[2471,4],[2991,4],[3134,4],[3284,4]]},"77":{"position":[[474,4]]},"79":{"position":[[1400,4],[3957,4]]},"81":{"position":[[4,4],[1033,4],[1256,4],[1281,4],[1904,4],[1929,4],[2011,4],[2161,4],[2754,4],[3274,4],[3417,4],[3567,4]]},"85":{"position":[[4,4],[540,4],[761,4],[784,4],[1401,4],[1424,4],[1506,4],[1656,4],[2243,4],[2761,4],[2902,4],[3052,4]]},"91":{"position":[[4,4],[703,4],[925,4],[949,4],[1569,4],[1593,4],[1675,4],[1825,4],[2473,4],[2992,4],[3134,4],[3284,4]]},"99":{"position":[[4,4],[799,4],[1022,4],[1047,4],[1670,4],[1695,4],[1777,4],[1927,4],[2533,4],[3053,4],[3196,4],[3346,4]]},"103":{"position":[[4,4],[476,4],[698,4],[722,4],[1342,4],[1366,4],[1448,4],[1598,4],[2154,4],[2673,4],[2815,4],[2965,4]]},"107":{"position":[[4,4],[582,4],[810,4],[840,4],[1478,4],[1508,4],[1590,4],[1740,4],[2360,4],[2885,4],[3033,4],[3183,4]]},"114":{"position":[[1056,4],[1724,4],[1947,4],[1972,4],[2595,4],[2620,4],[2702,4],[2852,4],[3468,4],[3988,4],[4131,4],[4281,4]]},"121":{"position":[[580,4],[1089,4],[1311,4],[1335,4],[1955,4],[1979,4],[2061,4],[2211,4],[2767,4],[3286,4],[3428,4],[3578,4]]},"134":{"position":[[1419,4]]},"136":{"position":[[655,4]]},"140":{"position":[[959,4]]},"144":{"position":[[4,4],[602,4],[827,4],[854,4],[1483,4],[1510,4],[1592,4],[1742,4],[2345,4],[2867,4],[3012,4],[3162,4]]},"150":{"position":[[459,4],[1528,4]]},"152":{"position":[[115,4],[537,4],[552,4]]},"154":{"position":[[592,4],[1694,4],[1797,5]]},"160":{"position":[[182,5]]},"162":{"position":[[562,4]]},"164":{"position":[[4,4],[629,4],[851,4],[875,4],[1495,4],[1519,4],[1601,4],[1751,4],[2367,4],[2886,4],[3028,4],[3178,4]]},"166":{"position":[[784,4],[2113,4],[2710,4]]},"168":{"position":[[4,4],[155,4],[950,4],[1176,4],[1204,4],[1836,4],[1864,4],[1946,4],[2096,4],[2645,4],[3168,4],[3314,4],[3464,4]]},"196":{"position":[[2391,4],[3312,4],[3735,4]]},"200":{"position":[[4,4],[837,4],[1063,4],[1091,4],[1723,4],[1751,4],[1833,4],[1983,4],[2849,4],[3372,4],[3518,4],[3668,4]]},"204":{"position":[[45,4],[653,4]]},"206":{"position":[[4,4],[606,4],[826,4],[848,4],[1462,4],[1484,4],[1566,4],[1716,4],[2266,4],[2783,4],[2923,4],[3073,4]]},"208":{"position":[[1592,6],[2114,4],[3737,4],[3961,4],[3987,4],[4613,4],[4639,4],[4721,4],[4871,4],[5874,4],[6395,4],[6539,4],[6689,4]]},"210":{"position":[[1059,4]]},"212":{"position":[[4,4],[463,4],[686,4],[711,4],[1334,4],[1359,4],[1441,4],[1591,4],[2098,4],[2618,4],[2761,4],[2911,4]]},"216":{"position":[[47,4],[661,4]]},"218":{"position":[[4,4],[638,4],[860,4],[884,4],[1504,4],[1528,4],[1610,4],[1760,4],[2293,4],[2812,4],[2954,4],[3104,4]]},"232":{"position":[[4,4],[707,4],[934,4],[963,4],[1598,4],[1627,4],[1709,4],[1859,4],[2352,4],[2876,4],[3023,4],[3173,4]]},"236":{"position":[[4,4],[759,4],[981,4],[1005,4],[1619,4],[1881,4],[1905,4],[1987,4],[2137,4],[2785,4],[3304,4],[3446,4],[3596,4]]},"238":{"position":[[359,4],[944,4],[1165,4],[1188,4],[1798,4],[2058,4],[2081,4],[2163,4],[2313,4],[2900,4],[3418,4],[3559,4],[3709,4]]},"257":{"position":[[4,4],[782,4],[1008,4],[1036,4],[1668,4],[1696,4],[1778,4],[1928,4],[2431,4],[2954,4],[3100,4],[3250,4]]},"261":{"position":[[4,4],[862,4],[1085,4],[1110,4],[1728,4],[1992,4],[2017,4],[2099,4],[2249,4],[2855,4],[3375,4],[3518,4],[3668,4]]},"265":{"position":[[4,4],[631,4],[859,4],[889,4],[1527,4],[1801,4],[1831,4],[1913,4],[2063,4],[2683,4],[3208,4],[3356,4],[3506,4]]},"269":{"position":[[4,4],[518,4],[740,4],[764,4],[1378,4],[1640,4],[1664,4],[1746,4],[1896,4],[2452,4],[2971,4],[3113,4],[3263,4]]},"273":{"position":[[4,4],[581,4],[806,4],[833,4],[1462,4],[1489,4],[1571,4],[1721,4],[2269,4],[2791,4],[2936,4],[3086,4]]},"277":{"position":[[4,4],[602,4],[823,4],[846,4],[1463,4],[1486,4],[1568,4],[1718,4],[2241,4],[2759,4],[2900,4],[3050,4]]},"281":{"position":[[4,4],[572,4],[791,4],[812,4],[1423,4],[1444,4],[1526,4],[1676,4],[2226,4],[2742,4],[2881,4],[3031,4]]},"283":{"position":[[402,4],[849,4],[962,4]]},"289":{"position":[[4,4],[833,4],[1055,4],[1079,4],[1699,4],[1723,4],[1805,4],[1955,4],[2505,4],[3024,4],[3166,4],[3316,4]]},"295":{"position":[[161,4],[760,4],[983,4],[1008,4],[1626,4],[1890,4],[1915,4],[1997,4],[2147,4],[2763,4],[3283,4],[3426,4],[3576,4]]},"297":{"position":[[1248,4],[1359,5]]},"301":{"position":[[129,4],[1073,4],[1294,4],[1317,4],[1934,4],[1957,4],[2039,4],[2189,4],[2794,4],[3312,4],[3453,4],[3603,4]]},"305":{"position":[[4,4],[614,4],[837,4],[862,4],[1485,4],[1510,4],[1592,4],[1742,4],[2391,4],[2911,4],[3054,4],[3204,4]]},"309":{"position":[[213,4]]},"311":{"position":[[427,4],[432,4],[484,4],[966,4]]},"313":{"position":[[677,4]]},"317":{"position":[[4,4],[591,4],[815,4],[841,4],[1467,4],[1493,4],[1575,4],[1725,4],[2364,4],[2885,4],[3029,4],[3179,4]]},"319":{"position":[[883,4],[1009,4],[1562,4]]},"321":{"position":[[4,4],[491,4],[710,4],[731,4],[1342,4],[1363,4],[1445,4],[1595,4],[2096,4],[2612,4],[2751,4],[2901,4]]},"325":{"position":[[134,4]]},"329":{"position":[[4,4],[527,4],[755,4],[785,4],[1423,4],[1453,4],[1535,4],[1685,4],[2215,4],[2740,4],[2888,4],[3038,4]]},"333":{"position":[[4,4],[565,4],[789,4],[815,4],[1441,4],[1467,4],[1549,4],[1699,4],[2247,4],[2768,4],[2912,4],[3062,4]]},"341":{"position":[[1453,4],[2004,4],[2226,4],[2250,4],[2864,4],[3126,4],[3150,4],[3232,4],[3382,4],[3996,4],[4515,4],[4657,4],[4807,4]]},"345":{"position":[[4,4],[709,4],[932,4],[957,4],[1580,4],[1605,4],[1687,4],[1837,4],[2492,4],[3012,4],[3155,4],[3305,4]]},"357":{"position":[[63,4],[762,4],[1473,4],[1661,4],[2277,4]]},"383":{"position":[[394,6],[894,6],[3247,4]]},"393":{"position":[[4,4],[462,4],[687,4],[714,4],[1343,4],[1370,4],[1452,4],[1602,4],[2105,4],[2627,4],[2772,4],[2922,4]]},"401":{"position":[[252,4]]},"406":{"position":[[318,4]]},"408":{"position":[[217,4]]},"410":{"position":[[250,4]]},"414":{"position":[[584,4]]},"457":{"position":[[95,4],[318,4]]},"470":{"position":[[2200,4],[2306,5],[2508,4]]},"472":{"position":[[39,4]]},"476":{"position":[[179,6],[663,5],[714,5],[1906,4],[2159,4]]},"482":{"position":[[553,4],[761,5],[849,5],[1767,4]]},"492":{"position":[[402,4]]},"503":{"position":[[21,4],[198,4]]},"505":{"position":[[9,4]]},"512":{"position":[[248,4],[385,5]]},"526":{"position":[[276,4]]},"532":{"position":[[1600,4]]},"536":{"position":[[738,4]]},"540":{"position":[[112,4]]},"542":{"position":[[259,5]]},"581":{"position":[[552,4]]},"584":{"position":[[188,4]]},"586":{"position":[[501,4]]},"588":{"position":[[523,4]]},"590":{"position":[[598,4]]},"594":{"position":[[270,4],[899,4]]},"610":{"position":[[173,4]]},"621":{"position":[[4,4]]},"623":{"position":[[536,4]]},"625":{"position":[[1138,4],[1385,4]]},"638":{"position":[[142,4]]},"653":{"position":[[1459,6]]}}}],["file'",{"_index":249,"t":{"15":{"position":[[3424,6]]}}}],["file/aio",{"_index":114,"t":{"11":{"position":[[449,8]]},"75":{"position":[[868,9],[1964,9]]},"97":{"position":[[155,8]]},"114":{"position":[[809,10]]},"132":{"position":[[88,8],[662,8]]},"142":{"position":[[97,8]]},"198":{"position":[[2268,8]]},"234":{"position":[[461,8]]},"238":{"position":[[287,8]]},"259":{"position":[[347,8]]},"267":{"position":[[171,8]]},"295":{"position":[[104,8]]},"315":{"position":[[1097,8]]},"339":{"position":[[105,8]]},"586":{"position":[[48,8]]},"623":{"position":[[1232,8]]}}}],["file/env",{"_index":260,"t":{"15":{"position":[[4045,8]]}}}],["filenam",{"_index":2350,"t":{"319":{"position":[[984,8],[1167,8],[1512,8],[1723,9],[1888,8]]}}}],["filenamepattern",{"_index":2357,"t":{"319":{"position":[[1667,19]]}}}],["filesystem",{"_index":1476,"t":{"154":{"position":[[57,10]]}}}],["fill",{"_index":2475,"t":{"343":{"position":[[1983,4]]},"532":{"position":[[84,4]]},"542":{"position":[[531,4]]},"544":{"position":[[161,4]]},"573":{"position":[[208,7]]}}}],["filter",{"_index":1336,"t":{"130":{"position":[[120,8]]},"158":{"position":[[456,7]]},"196":{"position":[[935,6],[1183,6],[1303,6],[1975,6]]},"341":{"position":[[59,6],[313,6]]},"488":{"position":[[146,8]]},"566":{"position":[[178,6],[1196,6],[1748,6],[2010,9]]},"568":{"position":[[24,9],[254,10],[270,7],[306,7],[555,8],[587,8]]},"577":{"position":[[20,7],[132,6],[354,9],[512,9]]},"623":{"position":[[771,9]]}}}],["final",{"_index":1169,"t":{"101":{"position":[[494,8]]},"172":{"position":[[3502,8]]},"204":{"position":[[673,5]]},"216":{"position":[[681,5]]},"283":{"position":[[982,5]]},"303":{"position":[[3437,5]]},"365":{"position":[[164,5],[305,5]]},"383":{"position":[[915,8]]},"538":{"position":[[2255,8]]},"557":{"position":[[984,8]]},"566":{"position":[[194,5]]},"568":{"position":[[1222,5],[2350,5],[2947,5],[3007,5]]},"638":{"position":[[1624,8]]},"646":{"position":[[2063,8]]},"648":{"position":[[2821,8]]}}}],["find",{"_index":216,"t":{"15":{"position":[[2152,4],[3109,4],[6087,4]]},"55":{"position":[[3761,4],[5277,7],[8940,8]]},"72":{"position":[[725,7]]},"105":{"position":[[350,4]]},"132":{"position":[[538,4]]},"142":{"position":[[228,4],[616,4]]},"147":{"position":[[17,4]]},"158":{"position":[[700,4]]},"172":{"position":[[4115,5]]},"190":{"position":[[1018,5]]},"194":{"position":[[393,4]]},"196":{"position":[[897,7],[1534,4]]},"263":{"position":[[450,4]]},"307":{"position":[[0,4]]},"309":{"position":[[254,4]]},"319":{"position":[[1966,4]]},"349":{"position":[[184,5]]},"361":{"position":[[1354,4]]},"403":{"position":[[394,4]]},"452":{"position":[[267,4]]},"457":{"position":[[400,4]]},"488":{"position":[[95,4]]},"530":{"position":[[2566,4]]},"544":{"position":[[1016,4]]},"546":{"position":[[413,4]]},"557":{"position":[[1285,4]]},"561":{"position":[[5215,5],[5549,5]]},"575":{"position":[[358,4]]},"590":{"position":[[822,4]]},"610":{"position":[[386,4]]},"623":{"position":[[346,4]]}}}],["fine",{"_index":575,"t":{"29":{"position":[[3840,4]]},"174":{"position":[[542,4]]},"381":{"position":[[400,4]]}}}],["finish",{"_index":978,"t":{"67":{"position":[[1517,6],[2845,6]]},"81":{"position":[[1758,6],[3128,6]]},"85":{"position":[[1255,6],[2615,6]]},"91":{"position":[[1423,6],[2846,6]]},"99":{"position":[[1524,6],[2907,6]]},"103":{"position":[[1196,6],[2527,6]]},"107":{"position":[[1332,6],[2739,6]]},"114":{"position":[[2449,6],[3842,6]]},"121":{"position":[[1809,6],[3140,6]]},"144":{"position":[[1337,6],[2721,6]]},"164":{"position":[[1349,6],[2740,6]]},"168":{"position":[[1690,6],[3022,6]]},"198":{"position":[[247,8]]},"200":{"position":[[1577,6],[3226,6]]},"206":{"position":[[1316,6],[2637,6]]},"208":{"position":[[4467,6],[6249,6]]},"212":{"position":[[1188,6],[2472,6]]},"218":{"position":[[1358,6],[2666,6]]},"232":{"position":[[1452,6],[2730,6]]},"236":{"position":[[1479,6],[3158,6]]},"238":{"position":[[1659,6],[3272,6]]},"257":{"position":[[1522,6],[2808,6]]},"261":{"position":[[1587,6],[3229,6]]},"265":{"position":[[1381,6],[3062,6]]},"269":{"position":[[1238,6],[2825,6]]},"273":{"position":[[1316,6],[2645,6]]},"277":{"position":[[1317,6],[2613,6]]},"281":{"position":[[1277,6],[2596,6]]},"289":{"position":[[1553,6],[2878,6]]},"295":{"position":[[1485,6],[3137,6]]},"301":{"position":[[1788,6],[3166,6]]},"303":{"position":[[3627,6]]},"305":{"position":[[1339,6],[2765,6]]},"317":{"position":[[1321,6],[2739,6]]},"321":{"position":[[1196,6],[2466,6]]},"329":{"position":[[1277,6],[2594,6]]},"333":{"position":[[1295,6],[2622,6]]},"341":{"position":[[2724,6],[4369,6]]},"343":{"position":[[4554,8]]},"345":{"position":[[1434,6],[2866,6]]},"361":{"position":[[304,8]]},"393":{"position":[[1197,6],[2481,6]]},"470":{"position":[[2925,6]]}}}],["firefox",{"_index":1510,"t":{"158":{"position":[[295,7]]},"196":{"position":[[1046,7]]},"208":{"position":[[5197,9],[7026,9]]},"323":{"position":[[330,7],[422,7]]},"329":{"position":[[1768,8],[3128,8]]}}}],["firefox/135.0",{"_index":1566,"t":{"164":{"position":[[529,13]]}}}],["firefox/139.0",{"_index":2825,"t":{"448":{"position":[[588,14],[799,14]]}}}],["firewal",{"_index":862,"t":{"55":{"position":[[5753,8],[7139,8],[9398,8]]},"448":{"position":[[2152,8],[2233,8]]}}}],["first",{"_index":474,"t":{"27":{"position":[[72,5]]},"65":{"position":[[2997,5]]},"75":{"position":[[1439,7]]},"79":{"position":[[3172,5]]},"188":{"position":[[286,5]]},"297":{"position":[[284,5],[1787,5]]},"309":{"position":[[126,5]]},"319":{"position":[[1487,5]]},"325":{"position":[[577,5]]},"343":{"position":[[1682,5],[1704,5],[2432,5]]},"349":{"position":[[0,6]]},"357":{"position":[[970,5]]},"383":{"position":[[151,5]]},"431":{"position":[[139,5]]},"442":{"position":[[161,6]]},"448":{"position":[[862,5],[1437,6]]},"454":{"position":[[192,6]]},"462":{"position":[[257,5]]},"512":{"position":[[72,5]]},"561":{"position":[[5158,5],[5560,5]]},"568":{"position":[[1688,5]]},"592":{"position":[[1122,5]]},"610":{"position":[[212,5]]},"640":{"position":[[0,5]]},"646":{"position":[[88,5]]}}}],["firstgotifyserv",{"_index":303,"t":{"15":{"position":[[5337,20]]},"38":{"position":[[426,20]]}}}],["fit",{"_index":2021,"t":{"222":{"position":[[2197,4]]},"242":{"position":[[2178,4]]}}}],["fix",{"_index":1112,"t":{"87":{"position":[[1071,3]]},"154":{"position":[[155,3],[470,5]]},"200":{"position":[[609,5]]},"309":{"position":[[277,5],[293,3]]},"347":{"position":[[816,3]]},"448":{"position":[[1291,3]]},"457":{"position":[[435,3]]},"466":{"position":[[316,3],[433,3]]},"495":{"position":[[128,5]]},"518":{"position":[[233,3]]}}}],["flatpak",{"_index":2780,"t":{"435":{"position":[[8,7],[24,7],[40,7]]},"440":{"position":[[97,7],[215,7],[424,7]]},"442":{"position":[[87,7],[117,7],[297,7],[475,7],[623,8],[692,7],[736,7],[781,7]]},"444":{"position":[[98,7]]},"484":{"position":[[90,7],[142,7]]}}}],["flatpak/build",{"_index":2813,"t":{"442":{"position":[[936,13]]}}}],["flatpak/flathub",{"_index":2990,"t":{"484":{"position":[[12,15]]}}}],["flatpak/nodej",{"_index":1594,"t":{"166":{"position":[[1431,14]]}}}],["flatpak/repo",{"_index":2810,"t":{"442":{"position":[[835,12]]}}}],["flatpak/setup.sh",{"_index":2788,"t":{"440":{"position":[[181,17]]}}}],["flatpak/st",{"_index":2812,"t":{"442":{"position":[[891,13]]}}}],["flexibl",{"_index":1629,"t":{"170":{"position":[[18,11]]}}}],["flight",{"_index":568,"t":{"29":{"position":[[3641,7]]}}}],["flow",{"_index":1130,"t":{"91":{"position":[[623,4]]},"99":{"position":[[611,4]]},"174":{"position":[[173,4]]},"226":{"position":[[304,5],[366,5]]},"236":{"position":[[679,4]]},"261":{"position":[[667,4]]},"303":{"position":[[1528,5],[1544,4],[1608,5]]},"343":{"position":[[4334,5],[4546,4],[5343,4]]},"361":{"position":[[624,4],[786,4],[882,4],[1163,4]]},"561":{"position":[[7114,4]]},"590":{"position":[[117,4]]}}}],["flush",{"_index":2859,"t":{"452":{"position":[[1083,8]]}}}],["fm",{"_index":1135,"t":{"93":{"position":[[194,2]]}}}],["fm.teal",{"_index":1261,"t":{"116":{"position":[[1236,10]]}}}],["fm.teal.alpha.feed.play",{"_index":2442,"t":{"341":{"position":[[690,23]]}}}],["folder",{"_index":2271,"t":{"303":{"position":[[3423,6]]},"309":{"position":[[227,6]]},"343":{"position":[[4732,7]]},"470":{"position":[[2526,6]]},"528":{"position":[[13,6]]}}}],["follow",{"_index":829,"t":{"55":{"position":[[3652,6],[3688,6],[5055,6]]},"69":{"position":[[1466,10]]},"72":{"position":[[793,6]]},"136":{"position":[[614,9]]},"140":{"position":[[918,9]]},"196":{"position":[[990,6]]},"210":{"position":[[1018,9]]},"230":{"position":[[92,6]]},"244":{"position":[[44,9]]},"255":{"position":[[92,6]]},"275":{"position":[[1683,9]]},"279":{"position":[[90,9]]},"293":{"position":[[0,6]]},"297":{"position":[[1177,9]]},"303":{"position":[[967,6],[1502,9],[2392,9]]},"337":{"position":[[0,6]]},"343":{"position":[[1297,6],[4318,6]]},"442":{"position":[[27,6]]},"454":{"position":[[1151,6]]},"470":{"position":[[1375,9]]},"530":{"position":[[136,6],[2417,6],[3437,9]]},"532":{"position":[[911,6]]},"536":{"position":[[49,6]]},"538":{"position":[[1414,9]]}}}],["foo",{"_index":243,"t":{"15":{"position":[[3043,6]]},"190":{"position":[[629,4],[760,3],[836,4],[1035,3]]},"395":{"position":[[311,3]]},"397":{"position":[[1445,5],[1564,5],[1625,5]]},"492":{"position":[[731,6]]}}}],["foo'",{"_index":240,"t":{"15":{"position":[[2955,6]]}}}],["foo.com",{"_index":2762,"t":{"416":{"position":[[817,10]]}}}],["foobar",{"_index":2749,"t":{"410":{"position":[[107,7]]}}}],["foojf",{"_index":241,"t":{"15":{"position":[[2980,8]]}}}],["footerm",{"_index":2764,"t":{"418":{"position":[[276,9],[338,10]]}}}],["footgun",{"_index":1632,"t":{"170":{"position":[[126,7]]}}}],["forc",{"_index":1015,"t":{"69":{"position":[[1430,5]]},"166":{"position":[[2475,7],[2509,6]]},"442":{"position":[[988,5]]},"466":{"position":[[401,5]]},"561":{"position":[[465,5]]}}}],["forcemediarecognitionon",{"_index":1609,"t":{"166":{"position":[[2677,25],[2988,26]]}}}],["forcesearch",{"_index":3160,"t":{"561":{"position":[[435,11],[750,14]]}}}],["forev",{"_index":579,"t":{"29":{"position":[[3929,8]]}}}],["fork",{"_index":455,"t":{"25":{"position":[[392,4]]}}}],["form",{"_index":466,"t":{"25":{"position":[[1002,5]]},"87":{"position":[[1349,4]]},"142":{"position":[[1087,4]]},"204":{"position":[[108,6]]},"216":{"position":[[110,6]]},"283":{"position":[[465,6]]}}}],["format",{"_index":1976,"t":{"210":{"position":[[99,6],[474,6]]},"230":{"position":[[159,7],[214,6]]},"255":{"position":[[159,7],[214,6]]},"385":{"position":[[165,6]]},"577":{"position":[[91,8]]},"592":{"position":[[73,11]]},"631":{"position":[[586,10]]}}}],["formatplayobj(obj",{"_index":3408,"t":{"644":{"position":[[607,18]]}}}],["formatplayobjectopt",{"_index":3404,"t":{"644":{"position":[[215,24],[640,23]]}}}],["forum",{"_index":1104,"t":{"87":{"position":[[447,7]]}}}],["forward",{"_index":1242,"t":{"114":{"position":[[599,8]]},"134":{"position":[[149,9],[548,8]]},"190":{"position":[[919,8],[1297,8]]},"431":{"position":[[256,7],[532,7]]},"448":{"position":[[2170,11],[2338,10]]},"596":{"position":[[2661,7]]},"598":{"position":[[261,7]]}}}],["found",{"_index":266,"t":{"15":{"position":[[4404,5]]},"19":{"position":[[1445,6]]},"31":{"position":[[80,5]]},"55":{"position":[[7783,5]]},"63":{"position":[[125,5]]},"136":{"position":[[473,5]]},"140":{"position":[[800,5]]},"142":{"position":[[489,5]]},"147":{"position":[[439,5]]},"150":{"position":[[654,5]]},"154":{"position":[[787,5]]},"196":{"position":[[3374,6]]},"204":{"position":[[440,5]]},"208":{"position":[[780,5]]},"210":{"position":[[900,5],[1711,5],[2107,5]]},"214":{"position":[[112,5]]},"216":{"position":[[446,5]]},"271":{"position":[[157,5]]},"283":{"position":[[815,5]]},"299":{"position":[[51,5]]},"307":{"position":[[1421,5]]},"347":{"position":[[767,5]]},"357":{"position":[[976,5],[1399,5]]},"397":{"position":[[849,5]]},"431":{"position":[[152,6]]},"476":{"position":[[1620,5]]},"478":{"position":[[627,5]]},"524":{"position":[[46,5]]},"528":{"position":[[291,5]]},"532":{"position":[[818,5]]},"534":{"position":[[551,5]]},"553":{"position":[[22,5]]},"559":{"position":[[20,5]]},"561":{"position":[[4768,5],[5164,5],[6217,6]]},"568":{"position":[[1631,5]]},"610":{"position":[[90,5]]},"642":{"position":[[94,6],[181,6]]}}}],["foxx",{"_index":229,"t":{"15":{"position":[[2598,5],[2801,5],[5204,5],[5913,5]]},"91":{"position":[[1878,5],[3350,5]]},"99":{"position":[[1981,5],[3412,5]]},"107":{"position":[[1799,5],[3249,5]]},"121":{"position":[[2286,5],[3666,5]]},"150":{"position":[[1597,5],[1961,5],[2061,9],[2362,5],[2628,5],[2976,5],[3076,9],[3375,5]]},"152":{"position":[[268,7],[1002,5],[1566,5],[2230,5],[2358,6],[2839,5]]},"154":{"position":[[2371,5],[3575,5]]},"198":{"position":[[2861,5]]},"236":{"position":[[2190,5],[3662,5]]},"261":{"position":[[2303,5],[3734,5]]},"265":{"position":[[2122,5],[3572,5]]},"305":{"position":[[1815,5],[3289,5]]},"341":{"position":[[3457,5],[4895,5]]},"345":{"position":[[1910,5],[3390,5]]}}}],["foxxjf",{"_index":233,"t":{"15":{"position":[[2622,9],[2825,9],[5956,9]]}}}],["foxxkoi",{"_index":1457,"t":{"150":{"position":[[2343,10],[3356,10]]},"152":{"position":[[1026,12],[1547,10],[2256,9],[2820,10]]}}}],["foxxmd",{"_index":237,"t":{"15":{"position":[[2682,9],[2885,9],[6016,9]]},"107":{"position":[[1952,9],[3402,9]]},"114":{"position":[[2931,7],[4372,7]]},"162":{"position":[[423,6]]},"208":{"position":[[5045,9],[5117,9],[6874,9],[6946,9]]},"265":{"position":[[2275,9],[3725,9]]},"295":{"position":[[2226,7],[3667,7]]},"303":{"position":[[4654,7]]},"307":{"position":[[1112,7],[1134,10],[1287,8]]},"331":{"position":[[1447,8]]}}}],["foxxmd,plex_local_user,someus",{"_index":2300,"t":{"307":{"position":[[1197,31]]}}}],["foxxmd/multi",{"_index":181,"t":{"15":{"position":[[828,12]]},"55":{"position":[[1859,12]]},"59":{"position":[[458,12]]},"150":{"position":[[532,12]]},"154":{"position":[[665,12]]},"166":{"position":[[1408,12]]},"331":{"position":[[276,12]]},"403":{"position":[[640,12]]},"476":{"position":[[2276,12],[2582,12]]},"478":{"position":[[505,12]]},"528":{"position":[[169,12]]},"557":{"position":[[1537,12]]}}}],["foxxplex",{"_index":1448,"t":{"150":{"position":[[1941,11],[2956,11]]},"152":{"position":[[982,11],[2210,11]]}}}],["foxxspotifi",{"_index":1442,"t":{"150":{"position":[[1574,14],[2605,14]]},"154":{"position":[[2348,14],[3552,14]]}}}],["fqn",{"_index":2373,"t":{"323":{"position":[[345,4]]}}}],["frank",{"_index":2736,"t":{"397":{"position":[[1481,6],[1580,5],[1673,5]]}}}],["fred",{"_index":1461,"t":{"152":{"position":[[276,5],[334,4],[448,4],[616,6],[712,7],[1355,6],[1828,6],[1926,7],[2636,6]]}}}],["fredapikey",{"_index":1474,"t":{"152":{"position":[[1416,13],[2697,13]]}}}],["fredjf",{"_index":1465,"t":{"152":{"position":[[598,9],[1810,9]]}}}],["fredlfm",{"_index":1466,"t":{"152":{"position":[[645,12],[1336,10],[1859,9],[2617,10]]}}}],["fredsecret",{"_index":1475,"t":{"152":{"position":[[1440,13],[2721,13]]}}}],["free",{"_index":726,"t":{"53":{"position":[[83,4]]},"77":{"position":[[128,4]]},"196":{"position":[[230,5],[647,6],[3117,6]]},"557":{"position":[[754,4]]},"561":{"position":[[5913,4],[6046,4],[6366,4],[6928,4]]}}}],["freetext",{"_index":3147,"t":{"555":{"position":[[1188,12]]},"557":{"position":[[771,10]]},"561":{"position":[[5923,10],[6986,13]]},"592":{"position":[[934,11]]}}}],["fresh",{"_index":1808,"t":{"194":{"position":[[660,5]]}}}],["friend",{"_index":2250,"t":{"303":{"position":[[921,9],[1287,7]]},"596":{"position":[[985,7],[2256,7]]}}}],["friendli",{"_index":3279,"t":{"600":{"position":[[277,8]]},"602":{"position":[[193,8]]}}}],["frontend",{"_index":1392,"t":{"142":{"position":[[862,11]]},"208":{"position":[[3517,8]]},"373":{"position":[[80,9],[245,9],[259,8]]}}}],["frontendurloverrid",{"_index":1944,"t":{"208":{"position":[[1599,19],[5398,22],[7227,22]]}}}],["frédéric",{"_index":1703,"t":{"172":{"position":[[3779,8],[3875,8],[4213,8],[4314,8]]}}}],["ft",{"_index":1665,"t":{"172":{"position":[[1444,3]]},"190":{"position":[[780,3],[1055,3]]},"395":{"position":[[529,4]]},"397":{"position":[[828,3],[1476,4]]}}}],["fulfil",{"_index":1407,"t":{"147":{"position":[[129,7]]}}}],["full",{"_index":1050,"t":{"75":{"position":[[1737,4]]},"114":{"position":[[52,4]]},"121":{"position":[[126,4]]},"166":{"position":[[527,4]]},"383":{"position":[[1087,4]]},"403":{"position":[[515,4]]},"538":{"position":[[836,4]]},"557":{"position":[[1412,4]]},"596":{"position":[[1359,4]]}}}],["fulli",{"_index":1252,"t":{"114":{"position":[[1593,5]]},"222":{"position":[[3284,6]]},"242":{"position":[[3238,6]]},"295":{"position":[[629,5]]}}}],["function",{"_index":98,"t":{"11":{"position":[[131,14]]},"44":{"position":[[32,13]]},"50":{"position":[[32,13]]},"69":{"position":[[32,13]]},"72":{"position":[[137,13]]},"77":{"position":[[191,13]]},"114":{"position":[[756,14],[973,13]]},"150":{"position":[[255,8]]},"154":{"position":[[428,8]]},"156":{"position":[[176,14]]},"192":{"position":[[240,9]]},"198":{"position":[[1046,12],[2375,13]]},"230":{"position":[[677,14]]},"255":{"position":[[682,14]]},"383":{"position":[[411,8]]},"416":{"position":[[940,8]]},"499":{"position":[[231,13]]},"520":{"position":[[67,10],[113,11]]},"530":{"position":[[1509,13]]},"594":{"position":[[243,14]]},"631":{"position":[[408,13]]},"638":{"position":[[1990,8]]},"644":{"position":[[28,8]]},"648":{"position":[[700,9]]},"653":{"position":[[1736,8],[1987,13],[2054,9],[2156,13]]}}}],["further",{"_index":2886,"t":{"470":{"position":[[1127,8]]}}}],["futur",{"_index":1109,"t":{"87":{"position":[[867,6]]},"114":{"position":[[1017,6]]},"343":{"position":[[1290,6]]}}}],["fuzz",{"_index":1745,"t":{"172":{"position":[[4981,7]]}}}],["fuzzi",{"_index":1695,"t":{"172":{"position":[[2990,5]]}}}],["fuzzydiscoveryignor",{"_index":1526,"t":{"160":{"position":[[222,23],[373,23]]}}}],["g",{"_index":2936,"t":{"476":{"position":[[2108,1]]}}}],["gambino",{"_index":1679,"t":{"172":{"position":[[1685,7],[1756,8]]}}}],["garbag",{"_index":2523,"t":{"347":{"position":[[410,7]]}}}],["garden",{"_index":1203,"t":{"109":{"position":[[699,7]]},"116":{"position":[[697,7]]}}}],["gateway",{"_index":996,"t":{"69":{"position":[[403,7]]}}}],["gateway/api",{"_index":720,"t":{"48":{"position":[[44,12]]}}}],["gather",{"_index":595,"t":{"31":{"position":[[337,9]]}}}],["gaug",{"_index":1029,"t":{"72":{"position":[[537,5]]}}}],["gaurante",{"_index":1748,"t":{"172":{"position":[[5073,10],[5226,9]]},"188":{"position":[[432,9]]},"311":{"position":[[180,9]]},"343":{"position":[[1599,9]]}}}],["gave",{"_index":1343,"t":{"132":{"position":[[638,4]]}}}],["gb",{"_index":3206,"t":{"566":{"position":[[1017,3]]}}}],["gecko/20100101",{"_index":1565,"t":{"164":{"position":[[514,14]]},"448":{"position":[[573,14],[784,14]]}}}],["gener",{"_index":157,"t":{"15":{"position":[[249,9]]},"21":{"position":[[32,8]]},"29":{"position":[[1783,8],[1950,9]]},"42":{"position":[[363,7]]},"91":{"position":[[343,9],[411,9]]},"101":{"position":[[474,9]]},"114":{"position":[[1396,9],[1490,9]]},"116":{"position":[[2040,9]]},"128":{"position":[[488,9]]},"132":{"position":[[483,9]]},"166":{"position":[[2022,9]]},"196":{"position":[[570,8],[2808,9],[2941,8],[3140,8]]},"208":{"position":[[1880,8]]},"222":{"position":[[1230,9],[1997,9]]},"236":{"position":[[378,9],[453,9]]},"238":{"position":[[226,7]]},"242":{"position":[[1207,9],[1980,9]]},"267":{"position":[[110,7]]},"295":{"position":[[43,7],[536,9]]},"327":{"position":[[243,7]]},"331":{"position":[[1126,7],[1494,7]]},"339":{"position":[[43,7]]},"343":{"position":[[2412,8]]},"359":{"position":[[815,12]]},"383":{"position":[[3061,8]]},"435":{"position":[[53,10]]},"440":{"position":[[53,10],[341,9]]},"442":{"position":[[56,8],[130,9],[143,8],[310,9],[347,9],[406,9],[437,8],[488,9],[533,9],[592,9]]},"452":{"position":[[543,9],[857,9]]},"499":{"position":[[91,9]]},"538":{"position":[[2235,9]]},"557":{"position":[[4,7]]},"561":{"position":[[6611,10]]},"573":{"position":[[0,10]]},"575":{"position":[[937,8]]},"577":{"position":[[411,10]]},"629":{"position":[[94,9]]},"635":{"position":[[355,9]]},"638":{"position":[[597,9]]}}}],["get",{"_index":1408,"t":{"147":{"position":[[181,7]]},"347":{"position":[[839,4]]},"454":{"position":[[1023,7]]},"651":{"position":[[1102,7]]}}}],["get(`${this.baseurl}/now",{"_index":3461,"t":{"648":{"position":[[1959,25]]}}}],["get(`${this.baseurl}/rec",{"_index":3442,"t":{"646":{"position":[[2389,30]]},"651":{"position":[[775,30]]}}}],["getbackloggedplay",{"_index":3472,"t":{"651":{"position":[[198,18],[654,18]]}}}],["getnowplay",{"_index":2321,"t":{"313":{"position":[[94,13]]}}}],["getrecentlyplay",{"_index":3449,"t":{"648":{"position":[[710,18],[1045,18]]},"653":{"position":[[1690,17],[2196,18]]}}}],["getrecentlyplayed(opt",{"_index":3457,"t":{"648":{"position":[[1768,26]]}}}],["ghcr.io/druidblack/yandex",{"_index":2405,"t":{"331":{"position":[[596,25]]}}}],["ghcr.io/foxxmd/multi",{"_index":2925,"t":{"474":{"position":[[195,20]]}}}],["gid",{"_index":2933,"t":{"476":{"position":[[2023,3],[2120,3]]}}}],["git",{"_index":336,"t":{"19":{"position":[[264,4]]},"375":{"position":[[255,3]]},"482":{"position":[[49,3],[102,3]]},"516":{"position":[[352,3],[400,3]]},"520":{"position":[[219,3],[231,3]]},"524":{"position":[[464,3]]}}}],["github",{"_index":696,"t":{"42":{"position":[[805,6]]},"101":{"position":[[176,6]]},"474":{"position":[[107,6]]},"492":{"position":[[630,7]]},"497":{"position":[[7,6]]},"510":{"position":[[181,6]]},"514":{"position":[[79,6]]},"518":{"position":[[324,6]]},"538":{"position":[[1934,6]]},"631":{"position":[[40,6],[617,6]]}}}],["give",{"_index":79,"t":{"9":{"position":[[168,5]]},"53":{"position":[[166,4]]},"67":{"position":[[1156,5],[2648,5]]},"72":{"position":[[891,4]]},"77":{"position":[[313,4]]},"81":{"position":[[1397,5],[2931,5]]},"85":{"position":[[900,5],[2418,5]]},"91":{"position":[[1065,5],[2649,5]]},"99":{"position":[[1163,5],[2710,5]]},"103":{"position":[[838,5],[2330,5]]},"107":{"position":[[956,5],[2542,5]]},"114":{"position":[[2088,5],[3645,5]]},"121":{"position":[[1451,5],[2943,5]]},"144":{"position":[[970,5],[2524,5]]},"164":{"position":[[991,5],[2543,5]]},"168":{"position":[[1320,5],[2825,5]]},"172":{"position":[[1072,5],[4762,5]]},"200":{"position":[[1207,5],[3029,5]]},"206":{"position":[[964,5],[2440,5]]},"208":{"position":[[4103,5],[6052,5]]},"212":{"position":[[827,5],[2275,5]]},"218":{"position":[[1000,5],[2469,5]]},"232":{"position":[[1079,5],[2533,5]]},"236":{"position":[[1121,5],[2961,5]]},"238":{"position":[[1304,5],[3075,5]]},"257":{"position":[[1152,5],[2611,5]]},"261":{"position":[[1226,5],[3032,5]]},"265":{"position":[[1005,5],[2865,5]]},"269":{"position":[[880,5],[2628,5]]},"273":{"position":[[949,5],[2448,5]]},"277":{"position":[[962,5],[2416,5]]},"281":{"position":[[928,5],[2399,5]]},"289":{"position":[[1195,5],[2681,5]]},"295":{"position":[[1124,5],[2940,5]]},"301":{"position":[[1433,5],[2969,5]]},"303":{"position":[[1337,4]]},"305":{"position":[[978,5],[2568,5]]},"317":{"position":[[957,5],[2542,5]]},"321":{"position":[[847,5],[2269,5]]},"329":{"position":[[901,5],[2397,5]]},"333":{"position":[[931,5],[2425,5]]},"341":{"position":[[2366,5],[4172,5]]},"343":{"position":[[1215,5]]},"345":{"position":[[1073,5],[2669,5]]},"393":{"position":[[830,5],[2284,5]]},"397":{"position":[[351,4]]},"488":{"position":[[168,4]]},"568":{"position":[[756,4]]},"596":{"position":[[1454,5]]}}}],["given",{"_index":344,"t":{"19":{"position":[[478,5]]},"132":{"position":[[475,5]]},"172":{"position":[[3382,5],[3656,5]]},"204":{"position":[[635,5]]},"216":{"position":[[643,5]]},"283":{"position":[[944,5]]},"303":{"position":[[1443,6]]},"383":{"position":[[3119,5],[3367,5]]},"568":{"position":[[450,5]]},"592":{"position":[[261,5]]}}}],["global",{"_index":107,"t":{"11":{"position":[[333,8]]},"15":{"position":[[3802,6]]},"67":{"position":[[147,8]]},"81":{"position":[[147,8]]},"85":{"position":[[145,8]]},"89":{"position":[[583,6]]},"91":{"position":[[146,8]]},"95":{"position":[[577,6]]},"99":{"position":[[147,8]]},"103":{"position":[[146,8]]},"107":{"position":[[142,8]]},"114":{"position":[[1199,8]]},"121":{"position":[[722,8]]},"134":{"position":[[1695,8]]},"144":{"position":[[145,8]]},"164":{"position":[[146,8]]},"168":{"position":[[237,8]]},"200":{"position":[[150,8]]},"206":{"position":[[144,8]]},"208":{"position":[[2258,8]]},"212":{"position":[[147,8]]},"218":{"position":[[146,8]]},"232":{"position":[[143,8]]},"236":{"position":[[153,8]]},"238":{"position":[[507,8]]},"257":{"position":[[143,8]]},"261":{"position":[[154,8]]},"265":{"position":[[149,8]]},"269":{"position":[[153,8]]},"273":{"position":[[142,8]]},"277":{"position":[[145,8]]},"281":{"position":[[143,8]]},"289":{"position":[[146,8]]},"295":{"position":[[311,8]]},"301":{"position":[[270,8]]},"305":{"position":[[147,8]]},"317":{"position":[[148,8]]},"321":{"position":[[143,8]]},"329":{"position":[[142,8]]},"333":{"position":[[148,8]]},"341":{"position":[[1602,8]]},"345":{"position":[[143,8]]},"357":{"position":[[14,8]]},"393":{"position":[[145,8]]},"619":{"position":[[464,8]]}}}],["gnu",{"_index":1134,"t":{"93":{"position":[[190,3]]}}}],["go",{"_index":727,"t":{"53":{"position":[[100,2]]},"77":{"position":[[247,2]]},"114":{"position":[[593,5]]},"154":{"position":[[498,5]]},"158":{"position":[[364,2],[620,2]]},"196":{"position":[[3235,2]]},"222":{"position":[[798,2]]},"242":{"position":[[781,2]]},"303":{"position":[[4141,2]]},"343":{"position":[[1854,2]]},"528":{"position":[[448,2]]},"638":{"position":[[450,2]]}}}],["goal",{"_index":1216,"t":{"109":{"position":[[1750,4]]},"520":{"position":[[45,4]]}}}],["goc",{"_index":2517,"t":{"345":{"position":[[2095,9],[3575,9]]}}}],["gocspx",{"_index":2483,"t":{"343":{"position":[[2708,7],[3937,7]]}}}],["gon",{"_index":1643,"t":{"172":{"position":[[544,4]]}}}],["good",{"_index":1740,"t":{"172":{"position":[[4791,4],[5047,4]]},"452":{"position":[[778,4]]},"568":{"position":[[234,4],[2706,4]]},"573":{"position":[[112,4],[177,4]]},"653":{"position":[[3821,4],[3868,4]]}}}],["goodmus",{"_index":1971,"t":{"208":{"position":[[5265,11],[7094,11]]}}}],["goodterm",{"_index":2758,"t":{"416":{"position":[[535,10],[573,10],[635,8]]}}}],["googl",{"_index":1305,"t":{"125":{"position":[[195,6]]},"166":{"position":[[155,6],[647,6],[690,6]]},"208":{"position":[[5228,7],[7057,7]]},"343":{"position":[[83,7],[156,6],[1778,6],[3167,6],[3779,6],[4149,6],[4819,6]]},"345":{"position":[[325,6],[412,6],[482,6]]},"464":{"position":[[4,6],[456,6]]},"596":{"position":[[180,6]]}}}],["gorillaz",{"_index":2908,"t":{"470":{"position":[[2068,8]]}}}],["gotifi",{"_index":304,"t":{"15":{"position":[[5366,9]]},"38":{"position":[[455,9],[560,9],[641,7],[831,9]]},"596":{"position":[[824,8]]}}}],["gotify://192.168.0.101:8070/mytoken",{"_index":642,"t":{"38":{"position":[[1660,40]]}}}],["gotifyconfig",{"_index":627,"t":{"38":{"position":[[680,12]]}}}],["grab",{"_index":1825,"t":{"196":{"position":[[960,4]]},"598":{"position":[[161,5]]}}}],["grace",{"_index":3265,"t":{"596":{"position":[[1071,8]]}}}],["grafana",{"_index":695,"t":{"42":{"position":[[787,7],[833,7]]}}}],["granular",{"_index":1692,"t":{"172":{"position":[[2226,11],[2478,11],[2614,11]]},"530":{"position":[[3114,8]]}}}],["great",{"_index":1790,"t":{"190":{"position":[[485,5]]}}}],["greater",{"_index":417,"t":{"23":{"position":[[231,7]]},"208":{"position":[[31,7]]}}}],["green",{"_index":2909,"t":{"470":{"position":[[2081,5]]}}}],["grep",{"_index":836,"t":{"55":{"position":[[4157,4],[4563,4]]}}}],["group",{"_index":2020,"t":{"222":{"position":[[1563,5],[2460,5],[2487,6],[2612,6],[2803,6],[2844,6]]},"242":{"position":[[1544,5],[2446,5],[2473,6],[2592,6],[2766,6],[2800,6]]},"299":{"position":[[25,6]]},"301":{"position":[[771,5],[914,5]]},"319":{"position":[[1352,6]]},"431":{"position":[[336,5]]},"566":{"position":[[730,5],[830,5]]}}}],["group/zon",{"_index":2207,"t":{"297":{"position":[[162,10]]}}}],["groupsallow",{"_index":2238,"t":{"301":{"position":[[2383,14],[3811,14]]}}}],["groupsblock",{"_index":2239,"t":{"301":{"position":[[2412,14],[3840,14]]}}}],["guarante",{"_index":1025,"t":{"72":{"position":[[433,9]]},"109":{"position":[[1648,9],[1675,9]]},"510":{"position":[[98,10]]},"522":{"position":[[489,10]]},"653":{"position":[[3919,9]]}}}],["gui",{"_index":1904,"t":{"202":{"position":[[124,4]]},"214":{"position":[[132,4]]}}}],["guid",{"_index":971,"t":{"67":{"position":[[1168,6],[2660,6]]},"81":{"position":[[1409,6],[2943,6]]},"85":{"position":[[912,6],[2430,6]]},"91":{"position":[[1077,6],[2661,6]]},"99":{"position":[[1175,6],[2722,6]]},"103":{"position":[[850,6],[2342,6]]},"107":{"position":[[968,6],[2554,6]]},"114":{"position":[[2100,6],[3657,6]]},"121":{"position":[[1463,6],[2955,6]]},"144":{"position":[[982,6],[2536,6]]},"147":{"position":[[463,6]]},"164":{"position":[[1003,6],[2555,6]]},"168":{"position":[[1332,6],[2837,6]]},"200":{"position":[[1219,6],[3041,6]]},"206":{"position":[[976,6],[2452,6]]},"208":{"position":[[4115,6],[6064,6]]},"212":{"position":[[839,6],[2287,6]]},"218":{"position":[[1012,6],[2481,6]]},"232":{"position":[[1091,6],[2545,6]]},"236":{"position":[[1133,6],[2973,6]]},"238":{"position":[[1316,6],[3087,6]]},"257":{"position":[[1164,6],[2623,6]]},"261":{"position":[[1238,6],[3044,6]]},"265":{"position":[[1017,6],[2877,6]]},"269":{"position":[[892,6],[2640,6]]},"273":{"position":[[961,6],[2460,6]]},"277":{"position":[[974,6],[2428,6]]},"281":{"position":[[940,6],[2411,6]]},"289":{"position":[[1207,6],[2693,6]]},"295":{"position":[[1136,6],[2952,6]]},"301":{"position":[[1445,6],[2981,6]]},"305":{"position":[[990,6],[2580,6]]},"309":{"position":[[550,5]]},"311":{"position":[[24,6]]},"317":{"position":[[969,6],[2554,6]]},"321":{"position":[[859,6],[2281,6]]},"329":{"position":[[913,6],[2409,6]]},"333":{"position":[[943,6],[2437,6]]},"341":{"position":[[2378,6],[4184,6]]},"345":{"position":[[1085,6],[2681,6]]},"393":{"position":[[842,6],[2296,6]]},"478":{"position":[[24,5],[42,6]]},"510":{"position":[[410,7]]},"526":{"position":[[5,5],[111,5]]},"596":{"position":[[1336,5]]},"604":{"position":[[20,5]]},"614":{"position":[[38,6]]},"633":{"position":[[42,5]]}}}],["guidanc",{"_index":62,"t":{"7":{"position":[[699,8]]},"114":{"position":[[650,8]]},"134":{"position":[[1351,9]]},"230":{"position":[[826,8]]},"255":{"position":[[831,8]]},"460":{"position":[[374,8]]},"516":{"position":[[92,8]]},"561":{"position":[[1389,8]]}}}],["guidelin",{"_index":2022,"t":{"222":{"position":[[2230,10]]},"242":{"position":[[2211,10]]}}}],["guy",{"_index":1546,"t":{"162":{"position":[[472,3]]},"395":{"position":[[327,4]]},"431":{"position":[[202,3],[485,3],[589,3],[652,3]]}}}],["gym",{"_index":2574,"t":{"363":{"position":[[516,5],[569,4],[694,5],[747,4],[1229,3],[1346,5],[1475,4],[1641,5]]},"421":{"position":[[112,4],[349,5]]}}}],["handl",{"_index":1230,"t":{"114":{"position":[[4,6],[76,7],[313,6],[416,6],[1609,6],[3083,9],[4524,9]]},"121":{"position":[[158,7],[191,7],[416,6],[562,6]]},"174":{"position":[[473,6]]},"295":{"position":[[645,6],[2378,9],[3819,9]]},"373":{"position":[[102,7]]},"460":{"position":[[77,6]]},"596":{"position":[[1107,8],[1157,8],[1509,7],[2060,8]]},"653":{"position":[[85,6],[161,7],[319,6],[1772,9]]}}}],["handle(someplay",{"_index":3490,"t":{"653":{"position":[[2861,16],[3539,16]]}}}],["happen",{"_index":824,"t":{"55":{"position":[[3109,8]]},"61":{"position":[[333,8]]},"69":{"position":[[1342,6]]},"190":{"position":[[1160,6]]},"196":{"position":[[453,6]]},"452":{"position":[[949,6]]},"470":{"position":[[3151,8]]}}}],["happili",{"_index":1784,"t":{"190":{"position":[[13,7]]}}}],["hard",{"_index":2877,"t":{"470":{"position":[[280,4]]}}}],["hardend",{"_index":2937,"t":{"476":{"position":[[2134,9]]}}}],["hash",{"_index":3062,"t":{"524":{"position":[[538,4]]}}}],["hasn't",{"_index":91,"t":{"9":{"position":[[359,6]]}}}],["have",{"_index":125,"t":{"11":{"position":[[716,6]]},"29":{"position":[[1503,6]]},"184":{"position":[[306,6]]},"303":{"position":[[4870,6]]},"470":{"position":[[468,6]]},"612":{"position":[[0,6]]},"653":{"position":[[1224,6],[2654,6]]}}}],["header",{"_index":1557,"t":{"164":{"position":[[366,6]]},"196":{"position":[[1517,7],[1557,7],[2264,7],[2418,7],[2603,6]]},"200":{"position":[[503,6]]},"257":{"position":[[565,6]]},"343":{"position":[[765,7]]},"345":{"position":[[587,7]]},"635":{"position":[[378,6]]}}}],["headless",{"_index":710,"t":{"46":{"position":[[193,8],[474,8],[547,8]]},"48":{"position":[[4,8],[312,8]]},"50":{"position":[[295,9]]},"55":{"position":[[753,8]]},"63":{"position":[[134,8]]},"69":{"position":[[164,9],[314,9]]},"283":{"position":[[12,8]]}}}],["health",{"_index":645,"t":{"40":{"position":[[31,6]]},"635":{"position":[[224,6]]},"646":{"position":[[1842,7]]}}}],["healthcheck",{"_index":3264,"t":{"596":{"position":[[851,11]]}}}],["heap",{"_index":2696,"t":{"389":{"position":[[85,4]]}}}],["help",{"_index":480,"t":{"27":{"position":[[359,4]]},"55":{"position":[[9092,7]]},"166":{"position":[[365,4],[3360,4]]},"331":{"position":[[1013,5],[1473,4]]},"347":{"position":[[861,4],[916,4]]},"454":{"position":[[964,4]]},"470":{"position":[[1284,4]]},"488":{"position":[[298,4],[433,4]]},"495":{"position":[[145,4]]},"581":{"position":[[184,4]]}}}],["here",{"_index":687,"t":{"42":{"position":[[647,4],[924,5]]},"87":{"position":[[1307,5]]},"150":{"position":[[660,4]]},"154":{"position":[[793,4]]},"166":{"position":[[1670,6]]},"186":{"position":[[307,4]]},"196":{"position":[[2549,6],[3683,5]]},"198":{"position":[[2460,4]]},"200":{"position":[[2292,6],[2340,6],[3986,6],[4034,6]]},"303":{"position":[[1169,4]]},"305":{"position":[[533,5]]},"331":{"position":[[389,4]]},"343":{"position":[[1761,7]]},"355":{"position":[[707,7]]},"476":{"position":[[1626,4]]},"478":{"position":[[633,4]]},"492":{"position":[[663,5],[669,4]]},"528":{"position":[[297,4],[451,5]]},"532":{"position":[[824,5]]},"534":{"position":[[557,5]]},"538":{"position":[[157,5]]},"561":{"position":[[1625,4]]},"631":{"position":[[227,5]]},"638":{"position":[[453,4]]},"642":{"position":[[605,4]]}}}],["heureist",{"_index":2887,"t":{"470":{"position":[[1306,10]]}}}],["heurist",{"_index":1687,"t":{"172":{"position":[[1823,10]]},"355":{"position":[[274,10]]},"395":{"position":[[31,10],[240,11]]}}}],["hidden",{"_index":1515,"t":{"158":{"position":[[430,7]]}}}],["hide",{"_index":1832,"t":{"196":{"position":[[1320,4]]},"200":{"position":[[655,5]]}}}],["high",{"_index":1365,"t":{"138":{"position":[[255,4]]},"544":{"position":[[98,4]]},"561":{"position":[[6640,4]]}}}],["higher",{"_index":2630,"t":{"375":{"position":[[38,6]]},"564":{"position":[[259,6]]},"568":{"position":[[2258,7]]},"577":{"position":[[253,6]]}}}],["highest",{"_index":1660,"t":{"172":{"position":[[1082,7]]}}}],["highli",{"_index":1859,"t":{"198":{"position":[[405,6]]},"343":{"position":[[819,6]]}}}],["highlight",{"_index":2580,"t":{"365":{"position":[[598,11]]},"532":{"position":[[1654,11],[1717,11]]},"536":{"position":[[792,11],[855,11]]}}}],["hint",{"_index":381,"t":{"21":{"position":[[146,6]]},"640":{"position":[[508,5]]}}}],["histor",{"_index":3,"t":{"2":{"position":[[43,10]]},"602":{"position":[[43,10]]}}}],["histori",{"_index":1302,"t":{"125":{"position":[[114,7],[179,7],[383,7],[414,7],[446,7],[489,7],[525,7],[573,7],[603,7],[778,7],[920,7],[957,7],[1098,7]]},"128":{"position":[[663,7],[1179,9],[1267,7]]},"134":{"position":[[15,8],[38,7],[126,7]]},"158":{"position":[[189,8]]},"160":{"position":[[111,8]]},"162":{"position":[[38,7],[946,7]]},"172":{"position":[[5187,8]]},"190":{"position":[[391,7]]},"192":{"position":[[48,7]]},"194":{"position":[[62,8]]},"198":{"position":[[549,7],[786,7],[1482,7]]},"200":{"position":[[643,7]]},"234":{"position":[[43,7]]},"238":{"position":[[48,7]]},"259":{"position":[[44,7]]},"263":{"position":[[55,7]]},"303":{"position":[[1682,7]]},"343":{"position":[[287,7]]},"470":{"position":[[19,7],[155,9],[1149,8],[1192,8],[1696,7]]},"648":{"position":[[121,8],[189,8]]},"653":{"position":[[368,7],[518,7]]}}}],["hit",{"_index":1519,"t":{"158":{"position":[[579,3]]},"343":{"position":[[4384,3]]}}}],["home",{"_index":1970,"t":{"208":{"position":[[5236,5],[7065,5]]},"253":{"position":[[476,4]]},"482":{"position":[[680,5]]},"503":{"position":[[57,4]]}}}],["home/foxx/.var/app/com.discordapp.discord/cache/scoped_dirnnxnin/singletonsocket",{"_index":841,"t":{"55":{"position":[[4227,81],[4633,81]]}}}],["home/kasm",{"_index":808,"t":{"55":{"position":[[2518,10]]},"59":{"position":[[1117,10]]}}}],["home/youruser/multi",{"_index":2808,"t":{"442":{"position":[[661,20],[905,20]]}}}],["homebrew",{"_index":876,"t":{"55":{"position":[[7365,8]]}}}],["hook",{"_index":2536,"t":{"351":{"position":[[197,4],[299,5]]},"353":{"position":[[726,6],[881,4],[1038,5],[1058,4],[1075,4]]},"355":{"position":[[5,4],[472,4],[530,5]]},"357":{"position":[[216,5],[305,5],[624,4],[703,4],[1953,5],[2139,4],[2218,4]]},"363":{"position":[[16,5]]},"403":{"position":[[233,4]]},"406":{"position":[[180,4],[259,4]]},"555":{"position":[[59,5],[937,5]]},"557":{"position":[[1124,4]]},"594":{"position":[[159,4]]}}}],["host",{"_index":603,"t":{"33":{"position":[[121,7]]},"36":{"position":[[360,6]]},"38":{"position":[[1615,7]]},"55":{"position":[[1323,4],[3866,5],[5435,4],[5451,4],[5476,4],[5979,5],[6198,4],[6730,4],[6821,4],[6837,4],[6862,4],[7412,5],[7536,5],[8078,4],[8606,4],[8705,4],[9885,4]]},"57":{"position":[[91,4]]},"65":{"position":[[506,4]]},"79":{"position":[[647,4]]},"99":{"position":[[676,4]]},"109":{"position":[[771,4]]},"116":{"position":[[769,4]]},"166":{"position":[[869,4],[1015,4]]},"230":{"position":[[778,4]]},"255":{"position":[[783,4]]},"261":{"position":[[739,4]]},"275":{"position":[[364,4],[567,4],[869,4]]},"297":{"position":[[1422,7]]},"301":{"position":[[2294,7],[3722,7]]},"303":{"position":[[4679,5]]},"319":{"position":[[802,4],[964,4]]},"393":{"position":[[330,4]]},"448":{"position":[[1602,4],[1980,4]]},"476":{"position":[[43,4],[84,4],[1265,4],[1771,4],[1885,4]]},"478":{"position":[[249,4]]},"526":{"position":[[171,4]]},"540":{"position":[[65,4]]},"596":{"position":[[2833,6]]},"635":{"position":[[43,6],[719,6]]},"638":{"position":[[766,4],[801,6]]}}}],["host'",{"_index":2132,"t":{"275":{"position":[[443,6],[1496,6]]}}}],["host/ip",{"_index":898,"t":{"55":{"position":[[9654,7]]}}}],["host:port",{"_index":872,"t":{"55":{"position":[[6181,9],[8061,9],[9868,9]]},"67":{"position":[[360,9]]},"83":{"position":[[923,10]]},"208":{"position":[[2663,9],[3434,9]]}}}],["hostabl",{"_index":746,"t":{"55":{"position":[[312,8]]}}}],["hostnam",{"_index":2173,"t":{"283":{"position":[[776,8],[874,8]]}}}],["hour",{"_index":550,"t":{"29":{"position":[[2438,5],[4413,5]]}}}],["http",{"_index":386,"t":{"21":{"position":[[259,4],[372,5]]},"65":{"position":[[1078,5],[1377,5],[1431,4],[1486,4],[1585,5],[1672,5],[1745,5],[1856,5],[2001,5],[2073,4],[2123,5],[2175,5],[2275,5],[2347,4],[2401,5],[2505,5]]},"79":{"position":[[1219,5],[1518,5],[1572,4],[1627,4],[1726,5],[1813,5],[1886,5],[1997,5],[2142,5],[2214,4],[2264,5],[2316,5],[2416,5],[2488,4],[2542,5],[2646,5]]},"202":{"position":[[192,4]]},"206":{"position":[[367,4]]},"218":{"position":[[381,4]]},"230":{"position":[[447,5],[580,11]]},"255":{"position":[[447,5],[585,11]]},"283":{"position":[[286,4],[867,6]]},"289":{"position":[[380,4]]},"303":{"position":[[2271,8],[2500,5],[3781,5],[3831,4],[3936,5],[4562,5]]},"319":{"position":[[39,6],[70,4],[305,4],[384,4],[503,4],[797,4],[836,4],[958,5],[973,4]]},"323":{"position":[[440,5]]},"530":{"position":[[739,5]]}}}],["http/http",{"_index":2040,"t":{"230":{"position":[[192,10]]},"255":{"position":[[192,10]]}}}],["http://127.0.0.1:5079/callback",{"_index":2278,"t":{"303":{"position":[[4027,30]]}}}],["http://127.0.0.1:5079/callback?code=xxxxxx",{"_index":2279,"t":{"303":{"position":[[4252,45]]}}}],["http://127.0.0.1:9078/callback",{"_index":2270,"t":{"303":{"position":[[3226,30]]}}}],["http://192.168.0.100:4110",{"_index":1068,"t":{"83":{"position":[[633,25],[682,25],[1042,25],[1068,25],[1285,25]]},"85":{"position":[[1862,27],[3272,27]]},"150":{"position":[[2489,27],[3502,27]]},"152":{"position":[[1693,27],[2966,27]]},"238":{"position":[[2519,27],[3929,27]]},"538":{"position":[[721,25],[775,25]]},"621":{"position":[[562,27],[877,27]]}}}],["http://192.168.0.100:4110/apis/listenbrainz",{"_index":1075,"t":{"83":{"position":[[1241,43]]}}}],["http://192.168.0.100:4110/apis/listenbrainz/1",{"_index":1072,"t":{"83":{"position":[[1094,45],[1311,45]]}}}],["http://192.168.0.100:42010/admin_apikey",{"_index":3101,"t":{"538":{"position":[[2158,41]]}}}],["http://192.168.0.100:6969",{"_index":3332,"t":{"635":{"position":[[729,25]]},"638":{"position":[[821,25]]}}}],["http://192.168.0.100:6969/api",{"_index":3333,"t":{"635":{"position":[[782,29]]}}}],["http://192.168.0.100:80/koito",{"_index":1076,"t":{"83":{"position":[[1357,29],[1387,29]]}}}],["http://192.168.0.100:80/koito/apis/listenbrainz/1",{"_index":1077,"t":{"83":{"position":[[1417,49]]}}}],["http://192.168.0.100:8070",{"_index":623,"t":{"38":{"position":[[472,28],[887,28]]}}}],["http://192.168.0.100:8080",{"_index":641,"t":{"38":{"position":[[1623,28]]}}}],["http://192.168.0.100:9078",{"_index":1120,"t":{"89":{"position":[[310,25]]},"95":{"position":[[310,25]]},"530":{"position":[[1176,25],[3954,25]]},"540":{"position":[[381,25]]}}}],["http://192.168.0.100:9078/lastfm/callback",{"_index":1122,"t":{"89":{"position":[[452,41]]},"530":{"position":[[3465,41]]},"532":{"position":[[1931,43]]},"536":{"position":[[1069,43]]},"538":{"position":[[1442,41]]}}}],["http://192.168.0.100:9078/librefm/callback",{"_index":1139,"t":{"95":{"position":[[445,42]]}}}],["http://192.168.0.100:9991",{"_index":633,"t":{"38":{"position":[[1236,28]]}}}],["http://192.168.0.101",{"_index":914,"t":{"65":{"position":[[750,21]]},"79":{"position":[[891,21]]},"391":{"position":[[556,20]]}}}],["http://192.168.0.101/my/subfold",{"_index":396,"t":{"21":{"position":[[758,33]]}}}],["http://192.168.0.101/yamahaextendedcontrol/v1",{"_index":2706,"t":{"391":{"position":[[577,45]]}}}],["http://192.168.0.101:3456/jsonprc",{"_index":1915,"t":{"204":{"position":[[864,33]]}}}],["http://192.168.0.101:3456/mcws/v1",{"_index":1999,"t":{"216":{"position":[[882,34]]}}}],["http://192.168.0.101:4000/my/subfolder/lastfm/callback",{"_index":403,"t":{"21":{"position":[[1025,54]]}}}],["http://192.168.0.101:80/lastfm/callback",{"_index":399,"t":{"21":{"position":[[888,39]]}}}],["http://192.168.0.101:8096",{"_index":2989,"t":{"482":{"position":[[2118,28]]}}}],["http://192.168.0.101:9078/callback?code=xxxxxx",{"_index":2282,"t":{"303":{"position":[[4412,50]]}}}],["http://192.168.0.101:9078/lastfm/callback",{"_index":393,"t":{"21":{"position":[[649,41]]}}}],["http://192.168.0.101:9078/my/subfolder/lastfm/callback",{"_index":397,"t":{"21":{"position":[[792,54]]}}}],["http://192.168.0.112/fun.png",{"_index":925,"t":{"65":{"position":[[1436,28]]},"79":{"position":[[1577,28]]}}}],["http://192.168.0.140:9078",{"_index":2842,"t":{"450":{"position":[[510,26]]}}}],["http://192.168.0.140:9078/api/webscrobbl",{"_index":2838,"t":{"448":{"position":[[2103,42]]}}}],["http://192.168.0.150:8096",{"_index":242,"t":{"15":{"position":[[3006,28]]}}}],["http://192.168.0.220:9078/lastfm/callback",{"_index":2843,"t":{"450":{"position":[[639,41]]}}}],["http://192.168.1.161:9980",{"_index":2431,"t":{"333":{"position":[[1825,28],[3199,28]]}}}],["http://foobar.com/cool.jpg",{"_index":924,"t":{"65":{"position":[[1383,26],[2025,26],[2299,26]]},"79":{"position":[[1524,26],[2166,26],[2440,26]]}}}],["http://jellyfin:8096",{"_index":1949,"t":{"208":{"position":[[1794,20]]}}}],["http://jriver.mydomain.com:52199/mcws/v1",{"_index":1998,"t":{"216":{"position":[[821,41]]}}}],["http://kodi.mydomain.com:8080/jsonrpc",{"_index":1913,"t":{"204":{"position":[[807,37]]}}}],["http://localhost",{"_index":2841,"t":{"450":{"position":[[398,21]]}}}],["http://localhost:4040/airson",{"_index":2341,"t":{"317":{"position":[[1852,33],[3317,33]]}}}],["http://localhost:42010",{"_index":300,"t":{"15":{"position":[[5256,25]]},"103":{"position":[[1750,25],[3130,25]]},"269":{"position":[[2048,25],[3428,25]]},"482":{"position":[[2241,25]]}}}],["http://localhost:52199/mcws/v1",{"_index":1996,"t":{"216":{"position":[[187,31],[769,31]]},"218":{"position":[[331,31]]}}}],["http://localhost:8070",{"_index":305,"t":{"15":{"position":[[5383,24]]}}}],["http://localhost:8080",{"_index":2347,"t":{"319":{"position":[[549,21]]}}}],["http://localhost:8080/jsonrpc",{"_index":1909,"t":{"204":{"position":[[185,29],[759,29]]},"206":{"position":[[321,29],[1834,32],[3206,32]]}}}],["http://localhost:8096",{"_index":235,"t":{"15":{"position":[[2649,24],[2852,24],[5983,24]]},"208":{"position":[[5012,24],[6841,24]]}}}],["http://localhost:9078",{"_index":382,"t":{"21":{"position":[[164,21]]},"343":{"position":[[3129,22]]},"610":{"position":[[99,21]]}}}],["http://localhost:9078/api/webscrobbl",{"_index":2372,"t":{"323":{"position":[[167,38]]},"325":{"position":[[518,38]]},"448":{"position":[[2061,38]]}}}],["http://localhost:9078/api/webscrobbler/usera",{"_index":2387,"t":{"325":{"position":[[387,44]]}}}],["http://localhost:9078/api/webscrobbler/userb",{"_index":2388,"t":{"325":{"position":[[469,44]]}}}],["http://localhost:9078/api/ytmusic/callback?name=myytm",{"_index":2485,"t":{"343":{"position":[[2955,53]]}}}],["http://localhost:9078/callback",{"_index":298,"t":{"15":{"position":[[5107,32]]},"150":{"position":[[1738,33],[2769,33]]},"154":{"position":[[2512,33],[3716,33]]},"305":{"position":[[439,30],[1987,33],[3461,33]]}}}],["http://localhost:9078/lastfm/callback",{"_index":348,"t":{"19":{"position":[[656,39],[1130,39]]},"91":{"position":[[478,37],[2079,39],[3551,39]]},"150":{"position":[[2265,39],[3286,39]]},"152":{"position":[[1283,39],[1469,39],[2546,39],[2750,39]]},"154":{"position":[[2939,39],[4142,39]]},"198":{"position":[[3062,39]]},"236":{"position":[[527,37],[2391,39],[3863,39]]},"450":{"position":[[598,37]]}}}],["http://localhost:9078/librefm/callback",{"_index":1149,"t":{"99":{"position":[[464,38],[2137,40],[3568,40]]},"261":{"position":[[513,38],[2459,40],[3890,40]]}}}],["http://localhost:9991",{"_index":314,"t":{"15":{"position":[[5551,24]]}}}],["http://my.custom.domain/api/ytmusic/callback?name=myytm",{"_index":2491,"t":{"343":{"position":[[3978,57]]}}}],["http://my.domain.loc",{"_index":394,"t":{"21":{"position":[[691,22]]}}}],["http://my.domain.local:9000/lastfm/callback",{"_index":401,"t":{"21":{"position":[[949,43]]}}}],["http://my.domain.local:9078/lastfm/callback",{"_index":395,"t":{"21":{"position":[[714,43]]}}}],["http://mydomain.com/reverseproxy/cast",{"_index":2707,"t":{"391":{"position":[[623,37],[661,37]]}}}],["http://mydomain.com:80/kodireverse/jsonrpc",{"_index":1917,"t":{"204":{"position":[[934,42]]}}}],["http://myicecast.com/radio",{"_index":1985,"t":{"210":{"position":[[1967,29]]},"212":{"position":[[1714,28],[3046,28]]}}}],["http://mymalojaserverip/admin_apikey",{"_index":1168,"t":{"101":{"position":[[400,38]]}}}],["http://mymsdomainorip:9078",{"_index":2041,"t":{"230":{"position":[[221,28]]},"255":{"position":[[221,28]]}}}],["http://mymultiscrobblerip:9078",{"_index":2074,"t":{"244":{"position":[[132,30]]},"253":{"position":[[316,30]]}}}],["http://mymultiscrobblerip:9078/1",{"_index":2075,"t":{"244":{"position":[[163,33]]},"251":{"position":[[70,33]]},"530":{"position":[[2152,33]]}}}],["http://mymultiscrobblerip:9078/1/submit",{"_index":2076,"t":{"244":{"position":[[279,39]]}}}],["http://mymultiscrobblerip:9078/api/listenbrainz/foobar",{"_index":2081,"t":{"248":{"position":[[712,54]]}}}],["http://mymultiscrobblerip:9078/api/listenbrainz/foobar/submit",{"_index":2082,"t":{"248":{"position":[[767,61]]}}}],["http://some_ip:7000/subfolder/api",{"_index":2662,"t":{"383":{"position":[[1101,33]]}}}],["http://yandex",{"_index":2426,"t":{"333":{"position":[[385,13]]}}}],["http://your_jellyin_url/web/index.html#!/apikeys.html",{"_index":1929,"t":{"208":{"position":[[163,55]]}}}],["http://yourmsdomain/2.0",{"_index":2028,"t":{"224":{"position":[[262,24]]},"226":{"position":[[566,24]]},"228":{"position":[[1055,24]]}}}],["http://yourmsdomain/api/lastfm/myslug",{"_index":2039,"t":{"228":{"position":[[965,37]]}}}],["http://yourmsdomain:9078/next",{"_index":3271,"t":{"596":{"position":[[1579,29]]}}}],["http://yourmultiscrobblerdomain/api/health",{"_index":646,"t":{"40":{"position":[[77,42]]}}}],["http://yourmultiscrobblerdomain/api/metr",{"_index":668,"t":{"42":{"position":[[49,43]]}}}],["https://192.168.0.101",{"_index":404,"t":{"21":{"position":[[1080,21]]}}}],["https://192.168.0.101:443/lastfm/callback",{"_index":405,"t":{"21":{"position":[[1102,41]]}}}],["https://192.168.my.host:6901",{"_index":823,"t":{"55":{"position":[[2972,28]]},"61":{"position":[[196,28]]}}}],["https://amp",{"_index":1828,"t":{"196":{"position":[[1226,11],[2036,11]]}}}],["https://anything.com/neat.jpg",{"_index":929,"t":{"65":{"position":[[1806,29],[2129,29]]},"79":{"position":[[1947,29],[2270,29]]}}}],["https://api.listenbrainz.org",{"_index":1181,"t":{"107":{"position":[[311,29],[1969,30],[3419,30]]},"265":{"position":[[346,29],[2292,30],[3742,30]]}}}],["https://archive.org/download/dir/myimage.jpg",{"_index":926,"t":{"65":{"position":[[1524,44]]},"79":{"position":[[1665,44]]}}}],["https://archive.org/my/dir/myimage.jpg",{"_index":931,"t":{"65":{"position":[[1946,38],[2220,38]]},"79":{"position":[[2087,38],[2361,38]]}}}],["https://azura.mydomain.com/api/st",{"_index":1391,"t":{"142":{"position":[[576,39]]}}}],["https://azura.mydomain.com/public/mi",{"_index":1390,"t":{"142":{"position":[[354,36]]}}}],["https://azura.mydomain.com/public/xxxxxx",{"_index":1396,"t":{"142":{"position":[[1375,40]]}}}],["https://bsky.app/settings/app",{"_index":1276,"t":{"118":{"position":[[209,29]]}}}],["https://cooldomain.com/art.png",{"_index":945,"t":{"65":{"position":[[3785,32]]},"79":{"position":[[3993,32]]}}}],["https://developer.spotify.com",{"_index":2260,"t":{"303":{"position":[[1756,29]]}}}],["https://echo.multi",{"_index":2285,"t":{"303":{"position":[[5083,18]]}}}],["https://en.wikipedia.org/wiki/list_of_tz_database_time_zon",{"_index":1419,"t":{"150":{"position":[[665,60]]},"154":{"position":[[798,60]]},"476":{"position":[[1631,60]]},"478":{"position":[[638,60]]},"528":{"position":[[302,60]]}}}],["https://example.com/cool.jpg",{"_index":928,"t":{"65":{"position":[[1696,28],[2078,28],[2352,28]]},"79":{"position":[[1837,28],[2219,28],[2493,28]]}}}],["https://github.com/clangen/musikcube/wiki/remot",{"_index":2126,"t":{"273":{"position":[[439,48]]}}}],["https://github.com/foxxmd/multi",{"_index":2634,"t":{"375":{"position":[[265,31]]},"482":{"position":[[142,31]]},"520":{"position":[[257,31]]}}}],["https://github.com/patrickkfkan/volumio",{"_index":2458,"t":{"343":{"position":[[602,39]]}}}],["https://jellyfin.fred.com",{"_index":1467,"t":{"152":{"position":[[675,28],[1889,28]]}}}],["https://jellyfin.mary.com",{"_index":1470,"t":{"152":{"position":[[855,28],[2091,28]]}}}],["https://jellyfin.mydomain.com",{"_index":1950,"t":{"208":{"position":[[1892,30]]}}}],["https://jellyfin.mydomain.com/art/1234.jpg",{"_index":1952,"t":{"208":{"position":[[2025,42]]}}}],["https://jellyfin.mydomain.com/neat.jpg",{"_index":933,"t":{"65":{"position":[[2450,38]]},"79":{"position":[[2591,38]]}}}],["https://koito.mydomain.com",{"_index":1073,"t":{"83":{"position":[[1140,26],[1167,26]]}}}],["https://koito.mydomain.com/apis/listenbrainz/1",{"_index":1074,"t":{"83":{"position":[[1194,46]]}}}],["https://last.fm",{"_index":2026,"t":{"224":{"position":[[133,15]]}}}],["https://libre.fm/2.0",{"_index":1151,"t":{"99":{"position":[[639,21]]},"261":{"position":[[702,21]]}}}],["https://mpd.readthedocs.io/en/stable/user.html#permiss",{"_index":2163,"t":{"281":{"position":[[424,58]]}}}],["https://music.apple.com",{"_index":1802,"t":{"194":{"position":[[368,24]]},"196":{"position":[[2566,25]]},"200":{"position":[[2357,26],[4051,26]]}}}],["https://musicbrainz.org",{"_index":3142,"t":{"551":{"position":[[720,24],[945,23]]}}}],["https://my.cool.libre.com/2.0",{"_index":1143,"t":{"97":{"position":[[229,30]]}}}],["https://my.mb.mirror.domain.com",{"_index":3143,"t":{"551":{"position":[[1037,33]]}}}],["https://myjellyfinexternal.tld",{"_index":1975,"t":{"208":{"position":[[5421,32],[7250,32]]}}}],["https://rocksky.app/access",{"_index":1250,"t":{"114":{"position":[[1505,26]]}}}],["https://scrobbler.mydomain.com",{"_index":2267,"t":{"303":{"position":[[2760,30]]}}}],["https://scrobbler.mydomain.com/callback",{"_index":2269,"t":{"303":{"position":[[2896,39]]}}}],["https://spotify.com/assets/cover.png?size=1000",{"_index":927,"t":{"65":{"position":[[1609,46]]},"79":{"position":[[1750,46]]}}}],["https://status.multi",{"_index":610,"t":{"36":{"position":[[110,20]]}}}],["https://www.google.com/devic",{"_index":2503,"t":{"343":{"position":[[5185,29]]}}}],["https://yourmsdomain",{"_index":2027,"t":{"224":{"position":[[152,20]]}}}],["https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copi",{"_index":2460,"t":{"343":{"position":[[682,67]]}}}],["hunter2",{"_index":794,"t":{"55":{"position":[[2272,7]]},"59":{"position":[[871,7]]}}}],["hwat",{"_index":1652,"t":{"172":{"position":[[876,4],[897,4]]}}}],["i686",{"_index":1563,"t":{"164":{"position":[[498,5]]}}}],["icecast",{"_index":1308,"t":{"125":{"position":[[244,7]]},"142":{"position":[[874,10]]},"210":{"position":[[24,7],[145,7],[443,7],[613,7],[1385,7],[1720,7],[1869,7],[2116,7]]},"212":{"position":[[340,7],[488,7],[696,7],[1037,7],[1118,7],[1344,7],[1970,7],[2163,7],[2683,7],[3086,9]]},"596":{"position":[[205,7]]}}}],["icecast.json",{"_index":1981,"t":{"210":{"position":[[1079,12]]}}}],["icecast_auto_monitor",{"_index":1993,"t":{"212":{"position":[[359,20]]}}}],["icecast_en",{"_index":1991,"t":{"212":{"position":[[258,14]]}}}],["icecast_id",{"_index":1989,"t":{"212":{"position":[[127,10],[212,10]]}}}],["icecast_nam",{"_index":1990,"t":{"212":{"position":[[183,12]]}}}],["icecast_url",{"_index":1992,"t":{"212":{"position":[[317,11]]}}}],["ici",{"_index":1986,"t":{"210":{"position":[[2008,7],[2222,3]]}}}],["icon",{"_index":942,"t":{"65":{"position":[[3596,4]]},"79":{"position":[[3804,4]]},"83":{"position":[[242,5],[330,4]]},"158":{"position":[[417,4]]},"315":{"position":[[352,6]]},"492":{"position":[[223,4]]},"538":{"position":[[334,5],[422,4]]}}}],["id",{"_index":232,"t":{"15":{"position":[[2616,5],[2819,5],[2974,5],[4961,5],[5219,5],[5950,5]]},"27":{"position":[[488,3]]},"53":{"position":[[202,2],[213,3],[247,2]]},"65":{"position":[[3136,2]]},"67":{"position":[[163,2],[300,2],[2001,5],[3377,5]]},"77":{"position":[[349,2],[360,3],[394,2]]},"79":{"position":[[168,2],[456,2],[2693,2],[3311,2],[3477,2],[4108,2]]},"81":{"position":[[163,2],[373,2],[2242,5],[3660,5]]},"85":{"position":[[161,2],[1726,5],[3136,5]]},"91":{"position":[[162,2],[589,2],[1897,5],[3369,5]]},"99":{"position":[[163,2],[577,2],[2002,5],[3433,5]]},"103":{"position":[[162,2],[1668,5],[3048,5]]},"107":{"position":[[158,2],[1817,5],[3267,5]]},"114":{"position":[[1215,2],[2898,5],[4339,5]]},"121":{"position":[[738,2],[2256,5],[3636,5]]},"142":{"position":[[745,5]]},"144":{"position":[[161,2],[1851,5],[3281,5]]},"150":{"position":[[1568,5],[1824,5],[1935,5],[2134,5],[2337,5],[2599,5],[2875,5],[2950,5],[3155,5],[3350,5]]},"152":{"position":[[592,5],[772,5],[976,5],[1144,5],[1330,5],[1541,5],[1804,5],[2006,5],[2204,5],[2407,5],[2611,5],[2814,5]]},"154":{"position":[[2342,5],[2598,5],[2808,5],[3546,5],[3822,5],[4011,5]]},"162":{"position":[[345,3],[388,3],[432,3],[478,3],[520,2]]},"164":{"position":[[162,2],[402,2],[1822,5],[3262,5]]},"168":{"position":[[253,2],[2164,5],[3541,5]]},"196":{"position":[[3359,2],[3371,2],[3505,5]]},"198":{"position":[[2726,5],[2880,5]]},"200":{"position":[[166,2],[2032,5],[2130,5],[3726,5],[3824,5]]},"206":{"position":[[160,2],[1785,5],[3157,5]]},"208":{"position":[[2274,2],[4960,5],[6789,5]]},"212":{"position":[[163,2],[1674,5],[3006,5]]},"218":{"position":[[162,2],[1833,5],[3190,5]]},"232":{"position":[[159,2],[1948,5],[3270,5]]},"236":{"position":[[169,2],[645,2],[2209,5],[3681,5]]},"238":{"position":[[523,2],[2383,5],[3793,5]]},"257":{"position":[[159,2],[2005,5],[3336,5]]},"261":{"position":[[170,2],[633,2],[2324,5],[3755,5]]},"265":{"position":[[165,2],[2140,5],[3590,5]]},"269":{"position":[[169,2],[1966,5],[3346,5]]},"273":{"position":[[158,2],[1825,5],[3200,5]]},"277":{"position":[[161,2],[1781,5],[3127,5]]},"281":{"position":[[159,2],[1734,5],[3105,5]]},"289":{"position":[[162,2],[2026,5],[3400,5]]},"295":{"position":[[327,2],[2193,5],[3634,5]]},"301":{"position":[[286,2],[2249,5],[3677,5]]},"303":{"position":[[5299,3]]},"305":{"position":[[163,2],[357,2],[1788,5],[3262,5]]},"311":{"position":[[66,2]]},"317":{"position":[[164,2],[1772,5],[3237,5]]},"321":{"position":[[159,2],[1653,5],[2975,5]]},"329":{"position":[[158,2],[1736,5],[3096,5]]},"333":{"position":[[164,2],[1746,5],[3120,5]]},"341":{"position":[[1618,2],[3427,5],[4865,5]]},"343":{"position":[[2184,3],[2495,2],[2914,3]]},"345":{"position":[[159,2],[454,2],[1883,5],[3363,5]]},"385":{"position":[[422,3],[456,2]]},"393":{"position":[[161,2],[1681,5],[3011,5]]},"450":{"position":[[18,2]]},"476":{"position":[[2084,2],[2104,2]]},"557":{"position":[[561,2],[619,3]]},"561":{"position":[[1946,3]]},"575":{"position":[[1219,3],[2049,2]]},"592":{"position":[[117,2],[841,2]]},"594":{"position":[[216,3]]},"619":{"position":[[168,2],[197,2],[310,2],[418,2],[458,2]]},"621":{"position":[[107,2],[319,2],[455,5],[603,2],[770,5],[921,2],[956,2],[1040,3],[1104,2],[1157,2],[1264,2]]}}}],["id/secret",{"_index":2259,"t":{"303":{"position":[[1736,10],[4889,9],[5235,9]]},"530":{"position":[[615,9]]}}}],["id3",{"_index":2351,"t":{"319":{"position":[[1048,3]]},"347":{"position":[[348,3]]}}}],["id3/metdata",{"_index":2302,"t":{"309":{"position":[[152,11]]}}}],["id=\"mbid://4e631558",{"_index":2308,"t":{"309":{"position":[[556,19]]}}}],["idea",{"_index":1409,"t":{"147":{"position":[[192,4]]},"568":{"position":[[2711,4]]}}}],["ideal",{"_index":581,"t":{"29":{"position":[[4066,7]]},"470":{"position":[[3295,8]]},"644":{"position":[[420,7]]}}}],["ident",{"_index":424,"t":{"23":{"position":[[503,9]]}}}],["identifi",{"_index":426,"t":{"23":{"position":[[543,10]]},"27":{"position":[[540,8]]},"121":{"position":[[12,10],[431,10],[914,8],[2341,13],[3721,13]]},"142":{"position":[[8,11],[32,10],[256,11],[456,11],[949,11]]},"190":{"position":[[301,11],[430,10],[1510,10]]},"192":{"position":[[269,11]]},"232":{"position":[[451,8]]},"257":{"position":[[444,8]]},"307":{"position":[[300,10]]},"311":{"position":[[87,10]]},"341":{"position":[[894,13],[1103,13],[1333,13],[1822,8],[3512,13],[4950,13]]},"355":{"position":[[579,8]]},"551":{"position":[[58,8]]},"557":{"position":[[184,8]]},"575":{"position":[[998,11]]},"619":{"position":[[223,8]]},"638":{"position":[[1110,8],[1653,10],[1685,11]]}}}],["idl",{"_index":1018,"t":{"69":{"position":[[1593,5]]},"75":{"position":[[433,5],[712,5],[749,4],[859,5],[1079,7]]},"343":{"position":[[5421,4]]}}}],["ie",{"_index":119,"t":{"11":{"position":[[603,2]]},"15":{"position":[[692,2]]},"40":{"position":[[407,2]]},"174":{"position":[[195,2],[811,2],[1117,2]]},"222":{"position":[[3315,2]]},"224":{"position":[[259,2]]},"242":{"position":[[3274,2]]},"343":{"position":[[3558,2]]},"347":{"position":[[418,2],[525,2]]},"361":{"position":[[699,2]]},"383":{"position":[[2319,2],[2664,2]]},"431":{"position":[[446,2],[546,2],[611,2]]},"474":{"position":[[62,3]]},"522":{"position":[[73,2]]},"526":{"position":[[541,3]]},"619":{"position":[[375,3]]},"648":{"position":[[2164,2]]},"653":{"position":[[485,2]]}}}],["if/when",{"_index":1326,"t":{"128":{"position":[[584,7]]},"365":{"position":[[43,7]]}}}],["ignor",{"_index":1868,"t":{"198":{"position":[[1117,8]]},"285":{"position":[[299,8]]},"341":{"position":[[398,8]]},"470":{"position":[[876,8]]},"526":{"position":[[575,6]]},"623":{"position":[[103,6],[1039,6]]},"625":{"position":[[278,6]]}}}],["ii",{"_index":2589,"t":{"365":{"position":[[811,2]]}}}],["imag",{"_index":180,"t":{"15":{"position":[[821,6]]},"25":{"position":[[633,6],[777,6]]},"55":{"position":[[339,6],[351,5],[829,5],[863,5],[1852,6],[2122,6],[7835,6]]},"59":{"position":[[451,6],[721,6]]},"65":{"position":[[66,5],[109,5],[196,5],[511,7],[946,5],[3651,5]]},"67":{"position":[[618,5]]},"77":{"position":[[86,6]]},"79":{"position":[[66,5],[109,5],[287,5],[652,7],[1087,5],[3859,5],[4155,6],[4232,5]]},"81":{"position":[[591,5]]},"150":{"position":[[525,6]]},"154":{"position":[[658,6]]},"208":{"position":[[3541,6]]},"303":{"position":[[3795,6]]},"331":{"position":[[269,6],[589,6]]},"403":{"position":[[633,6]]},"474":{"position":[[15,6],[90,6]]},"476":{"position":[[2269,6],[2575,6],[2677,6]]},"478":{"position":[[498,6],[1115,6]]},"522":{"position":[[7,5],[210,5],[434,6]]},"524":{"position":[[334,5]]},"528":{"position":[[162,6]]},"557":{"position":[[1530,6]]},"594":{"position":[[39,6]]},"596":{"position":[[1282,6],[1666,5]]}}}],["imagin",{"_index":1771,"t":{"179":{"position":[[486,8]]},"184":{"position":[[0,7]]}}}],["imit",{"_index":2073,"t":{"240":{"position":[[303,9]]}}}],["immedi",{"_index":1344,"t":{"134":{"position":[[137,11],[536,11]]},"353":{"position":[[43,11],[281,11]]},"442":{"position":[[1076,12]]},"454":{"position":[[1085,11]]},"524":{"position":[[199,11]]},"653":{"position":[[1014,11]]}}}],["implement",{"_index":406,"t":{"23":{"position":[[16,10]]},"55":{"position":[[9123,15]]},"69":{"position":[[383,10]]},"109":{"position":[[734,11]]},"116":{"position":[[732,11]]},"128":{"position":[[12,11]]},"134":{"position":[[414,14]]},"226":{"position":[[429,9]]},"313":{"position":[[49,10],[516,15]]},"383":{"position":[[1002,9],[1735,9],[2983,9]]},"464":{"position":[[244,15]]},"499":{"position":[[327,14]]},"633":{"position":[[149,11]]},"638":{"position":[[1977,10],[2054,10],[2081,10]]},"646":{"position":[[13,9],[97,9],[1431,9],[2080,9]]},"648":{"position":[[214,10],[569,11],[688,9],[3043,11]]},"651":{"position":[[188,9],[923,10]]},"653":{"position":[[1399,9],[1677,12],[1717,9],[1959,10],[2601,14]]}}}],["import",{"_index":974,"t":{"67":{"position":[[1344,9]]},"81":{"position":[[1585,9]]},"85":{"position":[[1088,9]]},"91":{"position":[[1253,9]]},"99":{"position":[[1351,9]]},"103":{"position":[[1026,9]]},"107":{"position":[[1144,9]]},"114":{"position":[[2276,9]]},"121":{"position":[[1639,9]]},"144":{"position":[[1158,9]]},"164":{"position":[[1179,9]]},"168":{"position":[[1508,9]]},"200":{"position":[[1395,9]]},"206":{"position":[[1152,9]]},"208":{"position":[[514,9],[4291,9]]},"212":{"position":[[1015,9]]},"218":{"position":[[1188,9]]},"232":{"position":[[1267,9]]},"236":{"position":[[1309,9]]},"238":{"position":[[1492,9]]},"257":{"position":[[1340,9]]},"261":{"position":[[1414,9]]},"265":{"position":[[1193,9]]},"269":{"position":[[1068,9]]},"273":{"position":[[1137,9]]},"277":{"position":[[1150,9]]},"281":{"position":[[1116,9]]},"289":{"position":[[1383,9]]},"295":{"position":[[1312,9]]},"301":{"position":[[1621,9]]},"305":{"position":[[1166,9]]},"309":{"position":[[132,9]]},"317":{"position":[[1145,9]]},"321":{"position":[[1035,9]]},"329":{"position":[[1089,9]]},"333":{"position":[[1119,9]]},"341":{"position":[[2554,9]]},"345":{"position":[[1261,9]]},"393":{"position":[[1018,9]]},"532":{"position":[[1740,10]]},"536":{"position":[[878,10]]},"623":{"position":[[124,9]]},"629":{"position":[[430,9]]},"638":{"position":[[227,6],[274,6],[1278,6],[1370,6]]},"640":{"position":[[164,6],[259,6],[305,6]]},"642":{"position":[[301,6]]},"644":{"position":[[179,6],[206,6],[285,6]]},"646":{"position":[[323,6],[1509,6],[1543,6],[2147,6],[2181,6]]},"648":{"position":[[1536,6],[1570,6]]},"651":{"position":[[332,6],[366,6]]},"653":{"position":[[824,6]]}}}],["importantli",{"_index":2731,"t":{"397":{"position":[[874,12]]},"635":{"position":[[165,11]]}}}],["imposs",{"_index":2873,"t":{"464":{"position":[[606,10]]}}}],["improv",{"_index":892,"t":{"55":{"position":[[9100,7]]},"188":{"position":[[255,7]]},"470":{"position":[[1289,7]]},"571":{"position":[[55,7]]}}}],["inaccess",{"_index":1943,"t":{"208":{"position":[[1436,12]]}}}],["inaccur",{"_index":3244,"t":{"575":{"position":[[1287,10]]}}}],["incentiv",{"_index":3124,"t":{"544":{"position":[[917,12]]},"546":{"position":[[314,12]]}}}],["includ",{"_index":328,"t":{"17":{"position":[[245,8]]},"29":{"position":[[992,7]]},"42":{"position":[[96,8]]},"67":{"position":[[2525,8],[3045,8]]},"81":{"position":[[2808,8],[3328,8]]},"83":{"position":[[871,7]]},"85":{"position":[[2297,8],[2815,8]]},"91":{"position":[[2527,8],[3046,8]]},"99":{"position":[[2587,8],[3107,8]]},"103":{"position":[[2208,8],[2727,8]]},"107":{"position":[[2414,8],[2939,8]]},"109":{"position":[[1156,8]]},"114":{"position":[[84,9],[334,7],[3522,8],[4042,8]]},"116":{"position":[[1154,8]]},"121":{"position":[[166,9],[480,7],[2821,8],[3340,8]]},"144":{"position":[[2399,8],[2921,8]]},"160":{"position":[[203,7]]},"164":{"position":[[2421,8],[2940,8]]},"166":{"position":[[307,7],[3091,7],[3316,7]]},"168":{"position":[[2699,8],[3222,8]]},"196":{"position":[[2738,7]]},"200":{"position":[[513,7],[2903,8],[3426,8]]},"206":{"position":[[2320,8],[2837,8]]},"208":{"position":[[5928,8],[6449,8]]},"210":{"position":[[196,7],[1805,7],[2072,7]]},"212":{"position":[[2152,8],[2672,8]]},"218":{"position":[[2347,8],[2866,8]]},"230":{"position":[[1120,7]]},"232":{"position":[[2406,8],[2930,8]]},"236":{"position":[[2839,8],[3358,8]]},"238":{"position":[[308,7],[2954,8],[3472,8]]},"253":{"position":[[545,7]]},"255":{"position":[[1131,7]]},"257":{"position":[[2485,8],[3008,8]]},"261":{"position":[[2909,8],[3429,8]]},"265":{"position":[[2737,8],[3262,8]]},"267":{"position":[[192,7]]},"269":{"position":[[2506,8],[3025,8]]},"273":{"position":[[2323,8],[2845,8]]},"277":{"position":[[2295,8],[2813,8]]},"281":{"position":[[2280,8],[2796,8]]},"289":{"position":[[2559,8],[3078,8]]},"295":{"position":[[125,7],[2817,8],[3337,8]]},"297":{"position":[[242,9],[425,9],[1574,9],[1962,7]]},"299":{"position":[[92,7]]},"301":{"position":[[2848,8],[3366,8]]},"305":{"position":[[2445,8],[2965,8]]},"317":{"position":[[2418,8],[2939,8]]},"319":{"position":[[2292,7]]},"321":{"position":[[2150,8],[2666,8]]},"329":{"position":[[2269,8],[2794,8]]},"333":{"position":[[2301,8],[2822,8]]},"339":{"position":[[126,7]]},"341":{"position":[[4050,8],[4569,8]]},"343":{"position":[[3652,7]]},"345":{"position":[[2546,8],[3066,8]]},"377":{"position":[[79,8]]},"393":{"position":[[2159,8],[2681,8]]},"401":{"position":[[405,7]]},"464":{"position":[[493,7]]},"470":{"position":[[2692,9],[3268,9]]},"488":{"position":[[241,7],[353,7]]},"492":{"position":[[294,8],[331,7]]},"495":{"position":[[119,8]]},"499":{"position":[[454,7]]},"501":{"position":[[81,9]]},"518":{"position":[[142,7]]},"557":{"position":[[154,7]]},"566":{"position":[[1235,8],[1701,8]]},"577":{"position":[[308,7]]},"581":{"position":[[311,7]]},"631":{"position":[[62,9]]}}}],["inclus",{"_index":33,"t":{"7":{"position":[[214,9]]}}}],["incognito/priv",{"_index":2461,"t":{"343":{"position":[[864,17]]},"454":{"position":[[1050,17]]}}}],["incom",{"_index":865,"t":{"55":{"position":[[5786,8],[7172,8],[9431,8]]},"653":{"position":[[107,8]]}}}],["inconsist",{"_index":2455,"t":{"343":{"position":[[311,12]]},"470":{"position":[[252,12],[383,13],[660,12],[855,12]]},"575":{"position":[[1451,12]]}}}],["incorrectli",{"_index":1608,"t":{"166":{"position":[[2610,11]]},"319":{"position":[[1983,11]]},"347":{"position":[[489,11]]},"466":{"position":[[51,11]]}}}],["increas",{"_index":2620,"t":{"368":{"position":[[333,8]]},"542":{"position":[[131,9]]}}}],["increment",{"_index":855,"t":{"55":{"position":[[5107,10]]}}}],["indefinit",{"_index":573,"t":{"29":{"position":[[3810,13]]}}}],["indentical/similar",{"_index":1759,"t":{"174":{"position":[[760,18]]}}}],["independ",{"_index":1654,"t":{"172":{"position":[[979,13]]},"174":{"position":[[954,11]]},"182":{"position":[[113,12]]},"452":{"position":[[697,13]]},"596":{"position":[[1781,11]]}}}],["index.j",{"_index":3338,"t":{"638":{"position":[[327,13]]}}}],["indi",{"_index":3128,"t":{"544":{"position":[[1039,6]]},"546":{"position":[[436,6]]}}}],["indic",{"_index":957,"t":{"67":{"position":[[463,10]]},"81":{"position":[[436,10]]},"136":{"position":[[325,8]]},"315":{"position":[[318,8]]},"452":{"position":[[17,10]]},"651":{"position":[[248,10]]},"653":{"position":[[598,8]]}}}],["individu",{"_index":97,"t":{"11":{"position":[[108,10],[957,12]]},"15":{"position":[[6264,10]]},"297":{"position":[[826,10]]},"363":{"position":[[311,10],[1376,10]]},"403":{"position":[[79,10],[343,10]]},"412":{"position":[[148,10],[350,10]]},"414":{"position":[[76,10]]},"544":{"position":[[1280,11],[1313,10]]},"548":{"position":[[184,11],[217,10]]},"557":{"position":[[110,10],[1234,10]]},"566":{"position":[[69,11]]},"581":{"position":[[499,10]]}}}],["indpend",{"_index":1194,"t":{"109":{"position":[[490,10],[624,10]]},"116":{"position":[[488,10],[622,10]]}}}],["info",{"_index":308,"t":{"15":{"position":[[5450,7],[5674,7]]},"38":{"position":[[771,4],[960,7],[1124,4],[1358,7]]},"156":{"position":[[225,4]]},"287":{"position":[[64,4]]},"309":{"position":[[479,4]]},"379":{"position":[[0,4]]},"383":{"position":[[997,4],[1730,4],[2978,4]]},"385":{"position":[[577,4]]},"442":{"position":[[1000,4]]},"448":{"position":[[380,4],[635,4]]},"524":{"position":[[263,4]]},"538":{"position":[[806,4]]},"646":{"position":[[1867,4],[1936,4]]},"648":{"position":[[1399,4]]},"651":{"position":[[903,4]]},"653":{"position":[[2415,4]]}}}],["inform",{"_index":4,"t":{"2":{"position":[[54,11]]},"27":{"position":[[344,11]]},"65":{"position":[[839,11],[3426,11]]},"79":{"position":[[980,11],[3634,11]]},"109":{"position":[[1827,11]]},"123":{"position":[[40,11]]},"158":{"position":[[65,12]]},"160":{"position":[[671,11]]},"166":{"position":[[319,11],[3239,11]]},"210":{"position":[[127,11],[348,11]]},"297":{"position":[[412,12]]},"303":{"position":[[5266,11]]},"309":{"position":[[375,12]]},"313":{"position":[[574,11]]},"319":{"position":[[1066,11],[1142,11],[1258,11],[1322,11],[1936,11],[2011,11]]},"385":{"position":[[78,11]]},"448":{"position":[[237,11],[1583,12],[2497,11]]},"464":{"position":[[334,11]]},"484":{"position":[[124,11]]},"510":{"position":[[336,11]]},"524":{"position":[[582,11]]},"538":{"position":[[1525,11]]},"542":{"position":[[553,11]]},"544":{"position":[[177,11]]},"566":{"position":[[1648,11]]},"598":{"position":[[172,11]]},"600":{"position":[[40,11]]},"602":{"position":[[54,11]]},"635":{"position":[[531,11],[947,11]]},"648":{"position":[[506,11],[1363,11]]},"651":{"position":[[122,11]]}}}],["ingest",{"_index":3487,"t":{"653":{"position":[[2628,6]]}}}],["ingress",{"_index":600,"t":{"33":{"position":[[40,7],[89,7],[194,7]]},"125":{"position":[[481,7],[565,7],[949,7]]},"128":{"position":[[175,7]]},"134":{"position":[[185,8],[198,7]]},"230":{"position":[[854,7]]},"255":{"position":[[859,7]]},"373":{"position":[[205,7]]},"383":{"position":[[1664,7]]},"448":{"position":[[18,7],[399,9],[424,9],[654,9],[679,9]]},"635":{"position":[[979,7]]},"653":{"position":[[1155,7]]}}}],["inherit",{"_index":2643,"t":{"379":{"position":[[290,10]]},"383":{"position":[[11,7]]},"638":{"position":[[1908,10]]},"648":{"position":[[624,8]]}}}],["init",{"_index":3060,"t":{"524":{"position":[[270,6]]}}}],["initi",{"_index":1384,"t":{"140":{"position":[[1621,8]]},"210":{"position":[[675,8]]},"357":{"position":[[360,9]]},"383":{"position":[[131,11],[2084,14]]},"516":{"position":[[326,7]]}}}],["ink",{"_index":1683,"t":{"172":{"position":[[1719,3],[1776,4]]}}}],["innaccuraci",{"_index":3243,"t":{"575":{"position":[[273,13]]}}}],["input",{"_index":507,"t":{"29":{"position":[[535,5],[741,5],[915,5],[1691,5],[2176,5],[2801,5],[3057,5],[3160,8],[3201,5],[3441,7]]},"174":{"position":[[819,6],[837,6]]},"391":{"position":[[70,7]]},"492":{"position":[[703,8]]}}}],["insecur",{"_index":715,"t":{"46":{"position":[[443,9]]},"55":{"position":[[5494,8],[6880,8],[9139,8]]},"275":{"position":[[1318,9]]},"303":{"position":[[2245,8]]}}}],["insensit",{"_index":358,"t":{"19":{"position":[[1231,11]]},"285":{"position":[[329,12]]},"287":{"position":[[332,12]]},"289":{"position":[[505,11],[615,11],[707,11]]},"299":{"position":[[146,12]]}}}],["insid",{"_index":2752,"t":{"414":{"position":[[69,6]]},"476":{"position":[[503,6]]},"623":{"position":[[541,6]]},"648":{"position":[[1038,6]]}}}],["insight",{"_index":3270,"t":{"596":{"position":[[1473,7]]}}}],["inspect",{"_index":2692,"t":{"389":{"position":[[13,7],[75,7]]}}}],["inspector",{"_index":1839,"t":{"196":{"position":[[1885,9],[1924,10],[2010,10]]}}}],["instal",{"_index":188,"t":{"15":{"position":[[1019,12],[1283,12],[1405,12],[3459,12],[3593,12]]},"19":{"position":[[800,13]]},"55":{"position":[[3360,12],[3402,9],[7326,9],[7345,7]]},"204":{"position":[[502,12]]},"216":{"position":[[510,12]]},"275":{"position":[[517,13]]},"323":{"position":[[6,10]]},"375":{"position":[[48,9],[155,9],[220,7],[416,7]]},"377":{"position":[[209,9],[391,7]]},"435":{"position":[[0,7],[16,7]]},"442":{"position":[[1014,7],[1066,9]]},"444":{"position":[[16,7]]},"476":{"position":[[1154,10]]},"480":{"position":[[6,12]]},"482":{"position":[[66,7],[259,7]]},"484":{"position":[[28,8]]},"503":{"position":[[406,9]]},"516":{"position":[[334,12]]},"530":{"position":[[2204,13],[2252,13]]},"542":{"position":[[50,7],[73,12]]},"596":{"position":[[1261,7]]},"606":{"position":[[8,12]]}}}],["instanc",{"_index":224,"t":{"15":{"position":[[2437,9]]},"25":{"position":[[978,8]]},"55":{"position":[[1055,8],[5137,8]]},"83":{"position":[[607,9]]},"93":{"position":[[197,8]]},"97":{"position":[[43,8],[77,8]]},"99":{"position":[[715,8]]},"105":{"position":[[320,8]]},"144":{"position":[[405,8]]},"150":{"position":[[185,8],[278,8]]},"154":{"position":[[358,8]]},"208":{"position":[[437,8],[1833,8]]},"253":{"position":[[359,8]]},"261":{"position":[[778,8]]},"263":{"position":[[419,9]]},"303":{"position":[[3693,9],[4378,8]]},"307":{"position":[[84,9]]},"412":{"position":[[159,9]]},"416":{"position":[[494,9]]},"448":{"position":[[1232,8]]},"470":{"position":[[984,9]]},"530":{"position":[[2650,9]]},"538":{"position":[[695,9]]},"635":{"position":[[692,8]]}}}],["instead",{"_index":366,"t":{"19":{"position":[[1452,8]]},"55":{"position":[[501,7]]},"65":{"position":[[3512,7]]},"72":{"position":[[1036,8]]},"79":{"position":[[3720,7]]},"93":{"position":[[309,8]]},"114":{"position":[[936,8]]},"162":{"position":[[1120,7]]},"184":{"position":[[231,7]]},"196":{"position":[[3128,8]]},"198":{"position":[[591,7]]},"204":{"position":[[589,8]]},"210":{"position":[[1517,7]]},"216":{"position":[[597,8]]},"220":{"position":[[745,8]]},"287":{"position":[[86,7],[526,7]]},"303":{"position":[[3054,7]]},"313":{"position":[[469,7]]},"331":{"position":[[1206,7]]},"353":{"position":[[1270,8]]},"431":{"position":[[521,7]]},"448":{"position":[[1903,7]]},"499":{"position":[[176,7]]},"530":{"position":[[3266,8]]},"561":{"position":[[2841,7],[4416,8]]},"568":{"position":[[544,7]]},"575":{"position":[[1983,8]]},"586":{"position":[[65,7]]},"646":{"position":[[1881,7]]},"653":{"position":[[1666,7]]}}}],["instruct",{"_index":755,"t":{"55":{"position":[[733,13],[1273,12]]},"57":{"position":[[41,12]]},"72":{"position":[[733,12],[927,12]]},"162":{"position":[[94,12]]},"166":{"position":[[977,12]]},"222":{"position":[[2540,12]]},"234":{"position":[[334,12]]},"242":{"position":[[2525,12]]},"259":{"position":[[219,12]]},"293":{"position":[[17,12]]},"303":{"position":[[2013,12],[4127,13],[4171,12]]},"331":{"position":[[979,12],[1112,13]]},"337":{"position":[[17,12]]},"343":{"position":[[584,12],[1313,12],[1743,12]]},"442":{"position":[[100,12]]},"454":{"position":[[1166,12]]},"530":{"position":[[170,12],[691,12],[783,12]]},"532":{"position":[[228,12]]},"540":{"position":[[80,12]]}}}],["integr",{"_index":703,"t":{"44":{"position":[[175,12]]},"46":{"position":[[8,11]]},"48":{"position":[[13,11],[256,11]]},"50":{"position":[[149,11]]},"53":{"position":[[51,12]]},"55":{"position":[[5,11]]},"63":{"position":[[175,12]]},"69":{"position":[[149,11]]},"160":{"position":[[12,12]]},"166":{"position":[[539,13]]},"283":{"position":[[318,11]]},"343":{"position":[[112,11]]},"462":{"position":[[214,11]]},"464":{"position":[[16,11]]}}}],["intel/amd",{"_index":2919,"t":{"474":{"position":[[40,11]]}}}],["intend",{"_index":3129,"t":{"544":{"position":[[1087,8],[1265,8]]},"548":{"position":[[169,8]]}}}],["intent",{"_index":3248,"t":{"575":{"position":[[1631,11]]}}}],["intention",{"_index":1536,"t":{"160":{"position":[[594,13]]}}}],["interact",{"_index":1009,"t":{"69":{"position":[[929,11]]},"222":{"position":[[151,8]]},"242":{"position":[[151,8]]},"383":{"position":[[1514,11],[2278,11],[2722,11]]},"385":{"position":[[676,10]]},"640":{"position":[[861,11]]}}}],["intercept",{"_index":2272,"t":{"303":{"position":[[3555,11]]}}}],["interest",{"_index":3126,"t":{"544":{"position":[[977,10]]},"546":{"position":[[374,10]]},"566":{"position":[[120,10]]}}}],["interfac",{"_index":1903,"t":{"202":{"position":[[76,9]]},"214":{"position":[[81,9]]},"275":{"position":[[20,9],[253,9]]},"319":{"position":[[46,9],[75,10],[210,9],[228,10],[252,9],[341,9],[359,10],[508,9],[594,9],[697,9],[2031,10]]},"379":{"position":[[205,10]]},"381":{"position":[[102,10],[156,9]]},"385":{"position":[[534,10]]},"448":{"position":[[2027,9]]},"450":{"position":[[186,9],[204,9],[488,9]]},"596":{"position":[[1017,9]]},"635":{"position":[[117,9]]},"638":{"position":[[28,9],[465,9],[877,9],[975,9],[1164,9],[1195,10],[1967,9]]},"644":{"position":[[441,9],[542,10]]}}}],["intermedi",{"_index":1870,"t":{"198":{"position":[[1221,12]]}}}],["intern",{"_index":652,"t":{"40":{"position":[[169,8]]},"208":{"position":[[1414,8],[1574,8]]},"303":{"position":[[2332,8]]},"530":{"position":[[1489,8]]},"544":{"position":[[1050,13]]},"546":{"position":[[447,13]]},"640":{"position":[[662,9],[747,9]]},"642":{"position":[[1408,9]]},"653":{"position":[[188,11]]}}}],["internalconfig",{"_index":3367,"t":{"640":{"position":[[314,15],[672,15]]}}}],["internet",{"_index":866,"t":{"55":{"position":[[5858,8],[7244,8],[9503,8]]},"65":{"position":[[788,8],[890,8],[3873,9]]},"79":{"position":[[929,8],[1031,8],[4081,9]]},"323":{"position":[[627,9]]}}}],["interpol",{"_index":330,"t":{"19":{"position":[[58,11],[1243,13],[1706,13]]}}}],["interv",{"_index":616,"t":{"36":{"position":[[266,8]]},"150":{"position":[[1772,11],[2803,11]]},"154":{"position":[[2546,11],[3750,11]]},"198":{"position":[[444,8]]},"200":{"position":[[2384,11],[4078,11]]},"305":{"position":[[2021,11],[3495,11]]},"333":{"position":[[1877,11],[3251,11]]}}}],["intervent",{"_index":3035,"t":{"510":{"position":[[76,13]]}}}],["introduc",{"_index":3284,"t":{"619":{"position":[[10,10]]},"623":{"position":[[394,10]]}}}],["intruct",{"_index":1157,"t":{"101":{"position":[[70,11]]},"538":{"position":[[1828,11]]}}}],["intuit",{"_index":2567,"t":{"361":{"position":[[663,11]]}}}],["invalid",{"_index":2220,"t":{"297":{"position":[[1874,7]]},"343":{"position":[[925,11],[1256,12]]},"454":{"position":[[159,11],[811,10],[1008,11]]}}}],["invari",{"_index":1648,"t":{"172":{"position":[[586,9]]}}}],["invis",{"_index":1039,"t":{"75":{"position":[[451,10],[758,9]]}}}],["invok",{"_index":1379,"t":{"140":{"position":[[1079,8],[1138,8]]},"210":{"position":[[1177,8],[1236,8]]},"383":{"position":[[291,7],[1051,6],[1546,7],[1786,6],[3033,6]]}}}],["involv",{"_index":2284,"t":{"303":{"position":[[4929,8]]}}}],["io.github.foxxmd.multiscrobbl",{"_index":2815,"t":{"444":{"position":[[113,31]]}}}],["io.github.foxxmd.multiscrobbler.yml",{"_index":2785,"t":{"437":{"position":[[68,35]]},"442":{"position":[[950,35]]}}}],["ip",{"_index":864,"t":{"55":{"position":[[5778,4],[7164,4],[9423,4],[9676,2]]},"83":{"position":[[1633,2]]},"301":{"position":[[20,2],[452,2]]},"303":{"position":[[2341,3]]},"307":{"position":[[362,2]]},"448":{"position":[[1827,2]]},"476":{"position":[[1255,2],[1292,2]]},"478":{"position":[[189,2]]},"526":{"position":[[197,2]]},"538":{"position":[[1281,2]]}}}],["ip/host",{"_index":819,"t":{"55":{"position":[[2808,7]]},"61":{"position":[[32,7]]}}}],["ipc",{"_index":785,"t":{"55":{"position":[[1996,3],[3766,3],[3879,4],[3933,3],[4088,4],[4385,3],[4447,3],[4494,4],[4791,3],[4853,3],[4888,4],[5093,3],[5236,3],[5247,3],[5290,3],[5549,3],[6136,3],[6569,3],[6609,3],[6628,3],[6935,3],[7693,3],[7910,3],[7929,3],[8015,3],[8445,3],[8485,3],[8504,3],[9194,3],[9795,3]]},"59":{"position":[[595,3]]}}}],["ipcloc",{"_index":987,"t":{"67":{"position":[[2075,15],[3451,15]]}}}],["ipv4/v6",{"_index":2154,"t":{"279":{"position":[[167,7]]}}}],["irrelev",{"_index":1833,"t":{"196":{"position":[[1325,10]]}}}],["isn't",{"_index":1214,"t":{"109":{"position":[[1557,5]]},"116":{"position":[[1551,5]]},"544":{"position":[[884,5]]},"546":{"position":[[281,5]]}}}],["iso2",{"_index":3205,"t":{"566":{"position":[[978,4]]}}}],["iso8601",{"_index":3413,"t":{"644":{"position":[[888,7]]}}}],["isol",{"_index":1778,"t":{"184":{"position":[[472,8]]},"188":{"position":[[222,8]]},"520":{"position":[[137,8]]}}}],["isrc",{"_index":1485,"t":{"154":{"position":[[1005,4],[2278,7],[3477,7]]},"532":{"position":[[700,4]]},"534":{"position":[[433,4]]},"557":{"position":[[623,4],[1703,4]]},"561":{"position":[[1645,8],[1787,4],[1829,4],[1834,6],[1875,4],[2032,4],[2052,8]]},"573":{"position":[[1107,8]]},"575":{"position":[[1010,5]]},"586":{"position":[[451,8]]},"592":{"position":[[53,4],[1114,4],[1150,8]]}}}],["isrc\",\"bas",{"_index":3256,"t":{"590":{"position":[[549,16]]},"594":{"position":[[848,16],[1427,16]]}}}],["isrc+bas",{"_index":3150,"t":{"557":{"position":[[499,10]]}}}],["issu",{"_index":146,"t":{"13":{"position":[[34,6]]},"27":{"position":[[377,7]]},"29":{"position":[[1907,5]]},"31":{"position":[[211,5]]},"40":{"position":[[546,6]]},"42":{"position":[[223,6]]},"46":{"position":[[144,6]]},"55":{"position":[[8955,6]]},"87":{"position":[[568,5],[997,6],[1112,5]]},"160":{"position":[[143,5]]},"166":{"position":[[270,5],[347,5],[381,6],[3198,7],[3379,6]]},"179":{"position":[[405,7],[562,8]]},"196":{"position":[[2718,6]]},"198":{"position":[[2032,6]]},"226":{"position":[[387,6]]},"230":{"position":[[873,7],[1106,6],[1149,6]]},"253":{"position":[[580,6]]},"255":{"position":[[878,7],[1117,6],[1160,6]]},"297":{"position":[[1045,6],[2063,6]]},"311":{"position":[[610,6],[898,6],[1375,6]]},"313":{"position":[[156,6]]},"315":{"position":[[985,6]]},"319":{"position":[[2250,5]]},"331":{"position":[[1027,5],[1181,5],[1248,6],[1343,5],[1505,6]]},"343":{"position":[[482,6]]},"448":{"position":[[1317,5],[1407,6]]},"452":{"position":[[38,5],[447,6],[799,5],[1004,5]]},"464":{"position":[[408,6],[633,6]]},"468":{"position":[[20,5]]},"470":{"position":[[1224,7],[1269,6],[1354,6],[2676,5],[3253,5],[3339,6]]},"482":{"position":[[1724,5]]},"488":{"position":[[228,5],[328,6]]},"490":{"position":[[51,6]]},"492":{"position":[[310,5],[355,5],[452,6],[657,5]]},"495":{"position":[[29,5],[46,5],[78,5],[176,7]]},"497":{"position":[[62,6],[120,5]]},"499":{"position":[[20,5],[198,5],[269,5],[368,5],[508,6],[568,5]]},"581":{"position":[[202,6],[279,5],[338,5]]},"612":{"position":[[7,6],[82,6]]}}}],["issue/com",{"_index":2998,"t":{"492":{"position":[[501,13]]}}}],["issue/error",{"_index":2994,"t":{"488":{"position":[[402,11]]}}}],["it'",{"_index":567,"t":{"29":{"position":[[3614,4]]},"109":{"position":[[262,5]]},"116":{"position":[[260,5]]},"132":{"position":[[657,4]]},"158":{"position":[[425,4]]},"172":{"position":[[5205,4]]},"190":{"position":[[470,4],[1273,4],[1393,4]]},"198":{"position":[[995,4]]},"303":{"position":[[4788,4]]},"353":{"position":[[769,4]]},"359":{"position":[[982,4]]},"490":{"position":[[201,4]]},"568":{"position":[[596,4],[1801,4],[2699,4]]},"575":{"position":[[326,4],[1708,4]]},"619":{"position":[[511,4]]}}}],["item",{"_index":2306,"t":{"309":{"position":[[409,4],[451,4]]},"368":{"position":[[380,6]]}}}],["iter",{"_index":536,"t":{"29":{"position":[[1539,9]]}}}],["iterat",{"_index":849,"t":{"55":{"position":[[4913,10]]}}}],["itself",{"_index":2549,"t":{"357":{"position":[[390,6]]}}}],["i’m",{"_index":2893,"t":{"470":{"position":[[1802,3]]}}}],["japanes",{"_index":3230,"t":{"568":{"position":[[1882,9]]}}}],["javascript",{"_index":2477,"t":{"343":{"position":[[2271,10]]}}}],["javascript'",{"_index":2763,"t":{"416":{"position":[[917,12]]}}}],["jelli",{"_index":3315,"t":{"629":{"position":[[424,5]]}}}],["jellyfin",{"_index":175,"t":{"15":{"position":[[695,8],[1633,8],[5938,11]]},"65":{"position":[[737,9],[2439,10],[2524,10],[3086,8]]},"79":{"position":[[878,9],[2580,10],[2665,10],[3261,8]]},"123":{"position":[[136,9]]},"125":{"position":[[277,8]]},"134":{"position":[[703,9]]},"152":{"position":[[368,8],[623,10],[803,10],[1792,11],[1835,10],[1994,11],[2037,10]]},"208":{"position":[[14,8],[84,8],[428,8],[482,8],[789,8],[1059,8],[1399,8],[1824,8],[2680,8],[3451,8],[3762,8],[3971,8],[4313,8],[4395,8],[4623,8],[5745,8],[5939,8],[6460,8],[7358,10]]},"403":{"position":[[563,8],[881,8],[978,8]]},"478":{"position":[[94,8]]},"482":{"position":[[1990,11]]},"526":{"position":[[317,9]]},"530":{"position":[[96,8],[147,8],[370,8],[504,8]]},"532":{"position":[[975,8]]},"536":{"position":[[113,8]]},"557":{"position":[[1460,8],[1927,8],[2018,8]]},"575":{"position":[[1122,9]]},"588":{"position":[[514,8]]},"590":{"position":[[589,8]]},"596":{"position":[[213,8]]},"600":{"position":[[192,9]]},"653":{"position":[[1207,9],[1603,9]]}}}],["jellyfin.json",{"_index":226,"t":{"15":{"position":[[2520,13],[2572,13],[2775,13]]},"132":{"position":[[183,13]]},"482":{"position":[[404,14]]},"588":{"position":[[536,13]]},"590":{"position":[[611,13]]}}}],["jellyfin/plex",{"_index":2669,"t":{"383":{"position":[[1678,13]]},"635":{"position":[[999,13]]}}}],["jellyfin_apikey",{"_index":1958,"t":{"208":{"position":[[2590,15]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56b",{"_index":184,"t":{"15":{"position":[[900,42]]},"403":{"position":[[744,42]]},"530":{"position":[[384,42]]},"557":{"position":[[1814,42]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":2949,"t":{"478":{"position":[[701,48]]},"482":{"position":[[1772,48]]}}}],["jellyfin_devices_allow",{"_index":1960,"t":{"208":{"position":[[2929,22]]}}}],["jellyfin_devices_block",{"_index":1961,"t":{"208":{"position":[[3051,22]]}}}],["jellyfin_en",{"_index":1955,"t":{"208":{"position":[[2371,15]]}}}],["jellyfin_frontend_url_overrid",{"_index":1945,"t":{"208":{"position":[[1628,30],[3396,30]]}}}],["jellyfin_frontend_url_override=https://jellyfin.mydomain.com",{"_index":1951,"t":{"208":{"position":[[1927,60]]}}}],["jellyfin_id",{"_index":1953,"t":{"208":{"position":[[2237,11],[2324,11]]}}}],["jellyfin_id=myjellyfinid",{"_index":3291,"t":{"621":{"position":[[287,24]]},"629":{"position":[[378,24]]}}}],["jellyfin_id=myjellyin",{"_index":186,"t":{"15":{"position":[[968,21]]},"530":{"position":[[515,21]]}}}],["jellyfin_libraries_allow",{"_index":1932,"t":{"208":{"position":[[855,24],[3175,24]]}}}],["jellyfin_libraries_block",{"_index":1962,"t":{"208":{"position":[[3284,24]]}}}],["jellyfin_mediatypes_allow",{"_index":1939,"t":{"208":{"position":[[1152,25],[3564,25]]}}}],["jellyfin_nam",{"_index":1954,"t":{"208":{"position":[[2294,13]]}}}],["jellyfin_name=foxx",{"_index":3314,"t":{"629":{"position":[[405,18]]}}}],["jellyfin_password",{"_index":1957,"t":{"208":{"position":[[2520,17]]}}}],["jellyfin_transforms=musicbrainz",{"_index":3088,"t":{"532":{"position":[[1126,31]]},"536":{"position":[[264,31]]},"557":{"position":[[1945,31]]}}}],["jellyfin_transforms=n",{"_index":2741,"t":{"403":{"position":[[812,26]]}}}],["jellyfin_url",{"_index":1948,"t":{"208":{"position":[[1778,12],[2643,12]]},"621":{"position":[[243,16]]},"629":{"position":[[354,16]]}}}],["jellyfin_url=192.168.0.101:8096",{"_index":2950,"t":{"478":{"position":[[752,31]]},"482":{"position":[[1821,31]]}}}],["jellyfin_url=192.168.0.110:8096",{"_index":183,"t":{"15":{"position":[[866,31]]},"403":{"position":[[710,31]]},"530":{"position":[[329,31]]},"557":{"position":[[1780,31]]}}}],["jellyfin_us",{"_index":1956,"t":{"208":{"position":[[2431,13]]}}}],["jellyfin_user=myus",{"_index":185,"t":{"15":{"position":[[945,20]]},"403":{"position":[[789,20]]},"478":{"position":[[786,20]]},"482":{"position":[[1853,20]]},"530":{"position":[[464,20]]},"557":{"position":[[1859,20]]}}}],["jellyfin_users_allow",{"_index":1930,"t":{"208":{"position":[[652,21],[2710,20]]}}}],["jellyfin_users_block",{"_index":1959,"t":{"208":{"position":[[2844,20]]}}}],["jellyin",{"_index":3290,"t":{"621":{"position":[[270,7]]}}}],["jett",{"_index":1674,"t":{"172":{"position":[[1534,4],[1630,5]]}}}],["jf",{"_index":230,"t":{"15":{"position":[[2604,2],[2807,2],[2962,2],[5919,2]]},"208":{"position":[[4932,2],[6761,2]]}}}],["joan",{"_index":1673,"t":{"172":{"position":[[1529,4],[1625,4]]}}}],["job",{"_index":684,"t":{"42":{"position":[[560,3],[638,4]]}}}],["job_nam",{"_index":688,"t":{"42":{"position":[[656,9]]}}}],["joe",{"_index":1541,"t":{"162":{"position":[[339,3]]}}}],["join",{"_index":3178,"t":{"561":{"position":[[4265,8]]}}}],["joiner",{"_index":1663,"t":{"172":{"position":[[1324,7],[1431,7]]},"395":{"position":[[514,6],[591,6]]},"410":{"position":[[73,7]]}}}],["journal",{"_index":3042,"t":{"512":{"position":[[402,8]]}}}],["journey",{"_index":2530,"t":{"349":{"position":[[100,7]]}}}],["jq0t1mbbkl",{"_index":1065,"t":{"83":{"position":[[400,10]]},"538":{"position":[[492,10]]}}}],["jriver",{"_index":1309,"t":{"125":{"position":[[310,6]]},"214":{"position":[[49,6],[125,6]]},"216":{"position":[[27,7],[388,6],[730,7]]},"218":{"position":[[374,6],[663,6],[870,6],[1210,6],[1290,6],[1514,6],[1817,6],[2166,6],[2358,6],[2877,6],[3174,6],[3307,8]]},"596":{"position":[[222,6]]}}}],["jriver.mydomain.com",{"_index":1997,"t":{"216":{"position":[[801,19]]}}}],["jriver_en",{"_index":2003,"t":{"218":{"position":[[255,13]]}}}],["jriver_id",{"_index":2001,"t":{"218":{"position":[[127,9],[210,9]]}}}],["jriver_nam",{"_index":2002,"t":{"218":{"position":[[182,11]]}}}],["jriver_password",{"_index":2006,"t":{"218":{"position":[[483,15]]}}}],["jriver_url",{"_index":2004,"t":{"218":{"position":[[313,10]]}}}],["jriver_us",{"_index":2005,"t":{"218":{"position":[[407,11]]}}}],["json",{"_index":151,"t":{"15":{"position":[[95,4],[127,4],[749,4],[1522,4],[2108,6],[2407,4]]},"19":{"position":[[104,4],[342,4],[914,4],[1293,5]]},"40":{"position":[[494,4]]},"42":{"position":[[909,4]]},"67":{"position":[[1131,4],[1232,4],[2623,4],[2724,4]]},"81":{"position":[[1372,4],[1473,4],[2906,4],[3007,4]]},"85":{"position":[[875,4],[976,4],[2393,4],[2494,4]]},"89":{"position":[[429,4]]},"91":{"position":[[1040,4],[1141,4],[2624,4],[2725,4]]},"95":{"position":[[422,4]]},"99":{"position":[[1138,4],[1239,4],[2685,4],[2786,4]]},"103":{"position":[[813,4],[914,4],[2305,4],[2406,4]]},"107":{"position":[[931,4],[1032,4],[2517,4],[2618,4]]},"109":{"position":[[273,5],[1130,4]]},"114":{"position":[[2063,4],[2164,4],[3620,4],[3721,4]]},"116":{"position":[[271,5],[1128,4]]},"121":{"position":[[1426,4],[1527,4],[2918,4],[3019,4]]},"142":{"position":[[506,4]]},"144":{"position":[[945,4],[1046,4],[2499,4],[2600,4]]},"164":{"position":[[966,4],[1067,4],[2518,4],[2619,4]]},"168":{"position":[[1295,4],[1396,4],[2800,4],[2901,4]]},"196":{"position":[[3745,5],[3836,4]]},"200":{"position":[[1182,4],[1283,4],[3004,4],[3105,4]]},"206":{"position":[[939,4],[1040,4],[2415,4],[2516,4]]},"208":{"position":[[4078,4],[4179,4],[6027,4],[6128,4]]},"212":{"position":[[802,4],[903,4],[2250,4],[2351,4]]},"218":{"position":[[975,4],[1076,4],[2444,4],[2545,4]]},"232":{"position":[[1054,4],[1155,4],[2508,4],[2609,4]]},"236":{"position":[[1096,4],[1197,4],[2936,4],[3037,4]]},"238":{"position":[[1279,4],[1380,4],[3050,4],[3151,4]]},"257":{"position":[[1127,4],[1228,4],[2586,4],[2687,4]]},"261":{"position":[[1201,4],[1302,4],[3007,4],[3108,4]]},"265":{"position":[[980,4],[1081,4],[2840,4],[2941,4]]},"269":{"position":[[855,4],[956,4],[2603,4],[2704,4]]},"273":{"position":[[924,4],[1025,4],[2423,4],[2524,4]]},"277":{"position":[[937,4],[1038,4],[2391,4],[2492,4]]},"281":{"position":[[903,4],[1004,4],[2374,4],[2475,4]]},"289":{"position":[[1170,4],[1271,4],[2656,4],[2757,4]]},"295":{"position":[[1099,4],[1200,4],[2915,4],[3016,4]]},"301":{"position":[[1408,4],[1509,4],[2944,4],[3045,4]]},"305":{"position":[[953,4],[1054,4],[2543,4],[2644,4]]},"317":{"position":[[932,4],[1033,4],[2517,4],[2618,4]]},"321":{"position":[[822,4],[923,4],[2244,4],[2345,4]]},"329":{"position":[[876,4],[977,4],[2372,4],[2473,4]]},"333":{"position":[[906,4],[1007,4],[2400,4],[2501,4]]},"341":{"position":[[2341,4],[2442,4],[4147,4],[4248,4]]},"345":{"position":[[1048,4],[1149,4],[2644,4],[2745,4]]},"393":{"position":[[805,4],[906,4],[2259,4],[2360,4]]},"457":{"position":[[291,4]]},"492":{"position":[[693,7]]},"596":{"position":[[1256,4]]},"646":{"position":[[2539,4]]}}}],["jsonlint",{"_index":2867,"t":{"457":{"position":[[388,8]]}}}],["jtrnwqwd__xmjf8st3jc",{"_index":1449,"t":{"150":{"position":[[1993,23],[3008,23]]},"152":{"position":[[1058,23],[2288,23]]}}}],["jwt",{"_index":1809,"t":{"196":{"position":[[74,6],[2632,3],[2818,4],[2950,4],[3149,4]]},"200":{"position":[[2282,3],[3976,3]]}}}],["kadhja",{"_index":1684,"t":{"172":{"position":[[1725,6],[1781,6]]}}}],["kasm",{"_index":743,"t":{"55":{"position":[[280,4],[2451,4],[2498,4],[2548,4]]},"59":{"position":[[1050,4],[1097,4],[1147,4]]}}}],["kasm_config",{"_index":814,"t":{"55":{"position":[[2698,12],[2717,11]]},"59":{"position":[[1297,12],[1316,11]]}}}],["kasm_config:/home/kasm",{"_index":798,"t":{"55":{"position":[[2349,22]]},"59":{"position":[[948,22]]}}}],["kasm_run",{"_index":813,"t":{"55":{"position":[[2673,9],[2689,8]]},"59":{"position":[[1272,9],[1288,8]]}}}],["kasm_run:/run",{"_index":786,"t":{"55":{"position":[[2036,13]]},"59":{"position":[[635,13]]}}}],["kasm_run:/run/user/1000",{"_index":797,"t":{"55":{"position":[[2323,23]]},"59":{"position":[[922,23]]}}}],["kasm_us",{"_index":821,"t":{"55":{"position":[[2925,9]]},"61":{"position":[[149,9]]}}}],["kasmcord",{"_index":787,"t":{"55":{"position":[[2087,9],[2113,8],[2880,8]]},"59":{"position":[[686,9],[712,8]]},"61":{"position":[[104,8]]}}}],["kasmweb/discord",{"_index":774,"t":{"55":{"position":[[1430,15]]},"59":{"position":[[29,15]]}}}],["kasmweb/discord:1.14.0",{"_index":789,"t":{"55":{"position":[[2129,22]]},"59":{"position":[[728,22]]}}}],["keep",{"_index":331,"t":{"19":{"position":[[150,4]]},"67":{"position":[[1222,5],[2714,5]]},"81":{"position":[[1463,5],[2997,5]]},"85":{"position":[[966,5],[2484,5]]},"87":{"position":[[1374,4]]},"91":{"position":[[1131,5],[2715,5]]},"99":{"position":[[1229,5],[2776,5]]},"103":{"position":[[904,5],[2396,5]]},"107":{"position":[[1022,5],[2608,5]]},"114":{"position":[[2154,5],[3711,5]]},"121":{"position":[[1517,5],[3009,5]]},"128":{"position":[[905,5]]},"144":{"position":[[1036,5],[2590,5]]},"164":{"position":[[1057,5],[2609,5]]},"168":{"position":[[1386,5],[2891,5]]},"198":{"position":[[427,4]]},"200":{"position":[[1273,5],[3095,5]]},"206":{"position":[[1030,5],[2506,5]]},"208":{"position":[[4169,5],[6118,5]]},"212":{"position":[[893,5],[2341,5]]},"218":{"position":[[1066,5],[2535,5]]},"232":{"position":[[1145,5],[2599,5]]},"236":{"position":[[1187,5],[3027,5]]},"238":{"position":[[1370,5],[3141,5]]},"257":{"position":[[1218,5],[2677,5]]},"261":{"position":[[1292,5],[3098,5]]},"265":{"position":[[1071,5],[2931,5]]},"269":{"position":[[946,5],[2694,5]]},"273":{"position":[[1015,5],[2514,5]]},"277":{"position":[[1028,5],[2482,5]]},"281":{"position":[[994,5],[2465,5]]},"289":{"position":[[1261,5],[2747,5]]},"295":{"position":[[1190,5],[3006,5]]},"301":{"position":[[1499,5],[3035,5]]},"305":{"position":[[1044,5],[2634,5]]},"317":{"position":[[1023,5],[2608,5]]},"321":{"position":[[913,5],[2335,5]]},"329":{"position":[[967,5],[2463,5]]},"333":{"position":[[997,5],[2491,5]]},"341":{"position":[[2432,5],[4238,5]]},"343":{"position":[[1567,4]]},"345":{"position":[[1139,5],[2735,5]]},"353":{"position":[[565,4]]},"393":{"position":[[896,5],[2350,5]]},"410":{"position":[[127,4]]},"454":{"position":[[721,4]]},"561":{"position":[[6629,4]]},"568":{"position":[[2719,4]]},"596":{"position":[[2351,4],[2735,4]]},"621":{"position":[[1172,4]]},"648":{"position":[[298,4]]},"653":{"position":[[2235,5]]}}}],["key",{"_index":356,"t":{"19":{"position":[[1217,4]]},"38":{"position":[[1724,7]]},"83":{"position":[[171,3],[255,4],[273,3],[311,3],[355,3]]},"87":{"position":[[1483,3]]},"91":{"position":[[339,3]]},"93":{"position":[[249,4]]},"101":{"position":[[388,4],[452,3],[484,3],[537,3]]},"103":{"position":[[379,3]]},"114":{"position":[[521,4],[820,6],[945,4],[1392,3]]},"144":{"position":[[435,3]]},"196":{"position":[[401,3],[549,3],[663,3],[3060,4],[3230,4],[3290,4],[3340,4],[3355,3],[3496,6],[3575,3],[3629,3]]},"200":{"position":[[2121,6],[2200,3],[2254,3],[3815,6],[3894,3],[3948,3]]},"208":{"position":[[53,3],[158,4],[251,3],[306,3],[376,3],[2617,3]]},"228":{"position":[[214,3]]},"232":{"position":[[590,3]]},"236":{"position":[[374,3]]},"269":{"position":[[421,3]]},"295":{"position":[[532,3]]},"319":{"position":[[907,4]]},"333":{"position":[[454,3],[472,3]]},"381":{"position":[[326,5]]},"403":{"position":[[324,5]]},"530":{"position":[[205,4],[433,3],[3551,3]]},"538":{"position":[[263,3],[347,4],[365,3],[403,3],[447,3],[2146,4],[2213,3],[2245,3]]},"557":{"position":[[1215,5]]},"621":{"position":[[75,3]]},"625":{"position":[[752,3]]},"627":{"position":[[47,4]]}}}],["key/secret",{"_index":1137,"t":{"93":{"position":[[341,10]]}}}],["keys/environment",{"_index":373,"t":{"19":{"position":[[1720,18]]}}}],["keyword",{"_index":921,"t":{"65":{"position":[[1170,8]]},"79":{"position":[[1311,8]]},"341":{"position":[[502,7]]}}}],["kfa",{"_index":2501,"t":{"343":{"position":[[5125,3]]}}}],["kind",{"_index":1328,"t":{"128":{"position":[[697,4]]},"323":{"position":[[762,4]]},"577":{"position":[[82,5]]}}}],["kitchensink",{"_index":218,"t":{"15":{"position":[[2224,11],[4188,11]]},"542":{"position":[[437,11]]}}}],["know",{"_index":1211,"t":{"109":{"position":[[1363,5]]},"114":{"position":[[303,4]]},"116":{"position":[[1357,5]]},"121":{"position":[[406,4]]},"166":{"position":[[1804,4]]},"172":{"position":[[2779,5]]},"198":{"position":[[1536,7]]},"561":{"position":[[6291,4]]},"575":{"position":[[1049,4]]},"579":{"position":[[62,4]]},"596":{"position":[[2012,7]]},"623":{"position":[[1030,5]]},"640":{"position":[[524,4]]},"653":{"position":[[2986,4]]}}}],["knower",{"_index":2892,"t":{"470":{"position":[[1793,6]]}}}],["known",{"_index":907,"t":{"65":{"position":[[402,5],[1013,5],[1595,5],[1682,5],[1761,5],[1872,5],[2011,5],[2285,5]]},"79":{"position":[[543,5],[1154,5],[1736,5],[1823,5],[1902,5],[2013,5],[2152,5],[2426,5]]},"109":{"position":[[1204,5]]},"116":{"position":[[1202,5]]},"172":{"position":[[2472,5],[2936,5]]},"313":{"position":[[150,5]]},"383":{"position":[[3185,5]]},"412":{"position":[[203,5]]},"495":{"position":[[40,5]]}}}],["kodi",{"_index":1310,"t":{"125":{"position":[[341,4]]},"202":{"position":[[49,4],[119,4]]},"204":{"position":[[27,5],[384,4],[722,5]]},"206":{"position":[[362,4],[631,4],[836,4],[1174,4],[1252,4],[1472,4],[1771,4],[2141,4],[2331,4],[2848,4],[3143,4],[3297,6]]},"596":{"position":[[229,4]]}}}],["kodi.mydomain.com",{"_index":1912,"t":{"204":{"position":[[789,17]]}}}],["kodi_en",{"_index":1920,"t":{"206":{"position":[[249,11]]}}}],["kodi_id",{"_index":1918,"t":{"206":{"position":[[127,7],[206,7]]}}}],["kodi_nam",{"_index":1919,"t":{"206":{"position":[[180,9]]}}}],["kodi_password",{"_index":1923,"t":{"206":{"position":[[460,13]]}}}],["kodi_url",{"_index":1921,"t":{"206":{"position":[[305,8]]}}}],["kodi_us",{"_index":1922,"t":{"206":{"position":[[393,9]]}}}],["koito",{"_index":17,"t":{"4":{"position":[[63,5]]},"15":{"position":[[707,6]]},"83":{"position":[[54,5],[77,5],[100,5],[185,5],[429,5],[486,5],[535,5],[708,5],[761,5],[802,5],[898,5],[1475,5],[1580,5],[1682,5]]},"85":{"position":[[338,5],[565,5],[771,5],[1110,5],[1189,5],[1411,5],[1708,6],[2117,5],[2308,5],[2826,5],[3118,6],[3311,7]]},"125":{"position":[[370,5]]},"128":{"position":[[1111,6]]},"150":{"position":[[417,5],[1313,5],[2368,7],[3341,8],[3381,7]]},"152":{"position":[[510,5],[1572,7],[2805,8],[2845,7]]},"177":{"position":[[294,5],[360,6]]},"179":{"position":[[420,5]]},"186":{"position":[[470,5]]},"190":{"position":[[936,5],[1097,5],[1322,5]]},"238":{"position":[[23,5],[147,5],[170,5],[193,5],[728,5],[969,5],[1175,5],[1514,5],[1593,5],[1780,5],[1918,5],[1978,5],[2068,5],[2365,6],[2774,5],[2965,5],[3483,5],[3775,6],[3968,7]]},"526":{"position":[[435,5]]},"538":{"position":[[163,5],[192,5],[277,5],[521,5],[574,5],[623,5],[1123,5],[1228,5],[1330,5]]},"579":{"position":[[310,7]]},"588":{"position":[[204,7]]},"596":{"position":[[234,5],[610,5]]},"602":{"position":[[125,6]]},"619":{"position":[[383,5]]},"621":{"position":[[207,5],[414,6],[712,6],[761,8]]},"629":{"position":[[123,6]]}}}],["koito.json",{"_index":228,"t":{"15":{"position":[[2546,10]]},"621":{"position":[[391,10]]}}}],["koito.mydomain.com",{"_index":1083,"t":{"83":{"position":[[1698,19]]},"538":{"position":[[1346,19]]}}}],["koito_allowed_host",{"_index":1079,"t":{"83":{"position":[[1538,19]]},"538":{"position":[[1186,19]]}}}],["koito_en",{"_index":1086,"t":{"85":{"position":[[252,12]]}}}],["koito_id",{"_index":1084,"t":{"85":{"position":[[127,8],[208,8]]}}}],["koito_id=foxxkoi",{"_index":1435,"t":{"150":{"position":[[1321,16]]}}}],["koito_id=mykoito",{"_index":3098,"t":{"538":{"position":[[1098,16]]}}}],["koito_id=mykoitoid",{"_index":3289,"t":{"621":{"position":[[222,18]]},"629":{"position":[[312,18]]}}}],["koito_nam",{"_index":1085,"t":{"85":{"position":[[181,10]]}}}],["koito_name=koito",{"_index":3313,"t":{"629":{"position":[[333,16]]}}}],["koito_token",{"_index":1087,"t":{"85":{"position":[[351,11]]}}}],["koito_token=029b081ba",{"_index":1436,"t":{"150":{"position":[[1340,21]]}}}],["koito_token=mytoken",{"_index":3095,"t":{"538":{"position":[[1038,19]]}}}],["koito_url",{"_index":1069,"t":{"83":{"position":[[662,9],[986,9]]},"85":{"position":[[309,9]]}}}],["koito_url=http://192.168.0.100:4110",{"_index":1438,"t":{"150":{"position":[[1411,35]]}}}],["koito_url=myurl",{"_index":3097,"t":{"538":{"position":[[1080,15]]}}}],["koito_us",{"_index":1066,"t":{"83":{"position":[[459,11]]},"85":{"position":[[410,10]]}}}],["koito_user=admin",{"_index":1437,"t":{"150":{"position":[[1392,16]]}}}],["koito_user=myus",{"_index":3096,"t":{"538":{"position":[[1060,17]]}}}],["kotio_token",{"_index":3288,"t":{"621":{"position":[[181,15]]},"629":{"position":[[288,15]]}}}],["krystian",{"_index":1714,"t":{"172":{"position":[[3893,8],[4332,8]]}}}],["label",{"_index":1830,"t":{"196":{"position":[[1272,6],[1345,6],[1372,6],[1454,6],[1618,6],[2082,6],[2109,6],[2176,6],[2325,6]]},"208":{"position":[[818,8],[976,8]]},"307":{"position":[[1454,8]]},"524":{"position":[[381,5]]}}}],["lack",{"_index":1026,"t":{"72":{"position":[[448,4]]}}}],["lan",{"_index":913,"t":{"65":{"position":[[733,3]]},"79":{"position":[[874,3]]}}}],["land",{"_index":615,"t":{"36":{"position":[[238,7]]}}}],["languag",{"_index":3116,"t":{"544":{"position":[[707,10]]},"546":{"position":[[104,10]]}}}],["laptop",{"_index":2398,"t":{"329":{"position":[[1777,8],[3137,8]]}}}],["larg",{"_index":761,"t":{"55":{"position":[[887,5]]},"544":{"position":[[1107,5]]},"548":{"position":[[11,5]]},"573":{"position":[[355,5]]}}}],["larger",{"_index":445,"t":{"25":{"position":[[78,6]]},"67":{"position":[[1797,6],[3161,6]]},"81":{"position":[[2038,6],[3444,6]]},"85":{"position":[[1533,6],[2929,6]]},"91":{"position":[[1702,6],[3161,6]]},"99":{"position":[[1804,6],[3223,6]]},"103":{"position":[[1475,6],[2842,6]]},"107":{"position":[[1617,6],[3060,6]]},"114":{"position":[[2729,6],[4158,6]]},"121":{"position":[[2088,6],[3455,6]]},"144":{"position":[[1619,6],[3039,6]]},"164":{"position":[[1628,6],[3055,6]]},"168":{"position":[[1973,6],[3341,6]]},"200":{"position":[[1860,6],[3545,6]]},"206":{"position":[[1593,6],[2950,6]]},"208":{"position":[[4748,6],[6566,6]]},"212":{"position":[[1468,6],[2788,6]]},"218":{"position":[[1637,6],[2981,6]]},"232":{"position":[[1736,6],[3050,6]]},"236":{"position":[[2014,6],[3473,6]]},"238":{"position":[[2190,6],[3586,6]]},"257":{"position":[[1805,6],[3127,6]]},"261":{"position":[[2126,6],[3545,6]]},"265":{"position":[[1940,6],[3383,6]]},"269":{"position":[[1773,6],[3140,6]]},"273":{"position":[[1598,6],[2963,6]]},"277":{"position":[[1595,6],[2927,6]]},"281":{"position":[[1553,6],[2908,6]]},"289":{"position":[[1832,6],[3193,6]]},"295":{"position":[[2024,6],[3453,6]]},"301":{"position":[[2066,6],[3480,6]]},"305":{"position":[[1619,6],[3081,6]]},"317":{"position":[[1602,6],[3056,6]]},"321":{"position":[[1472,6],[2778,6]]},"329":{"position":[[1562,6],[2915,6]]},"333":{"position":[[1576,6],[2939,6]]},"341":{"position":[[3259,6],[4684,6]]},"345":{"position":[[1714,6],[3182,6]]},"393":{"position":[[1479,6],[2799,6]]}}}],["largest",{"_index":3135,"t":{"544":{"position":[[1486,7]]},"548":{"position":[[390,7]]}}}],["last",{"_index":1761,"t":{"174":{"position":[[1146,4]]},"341":{"position":[[1191,9]]},"365":{"position":[[192,4]]},"470":{"position":[[1760,4]]},"573":{"position":[[1072,4]]}}}],["last.fm",{"_index":10,"t":{"2":{"position":[[133,8]]},"4":{"position":[[27,7]]},"15":{"position":[[1612,7]]},"19":{"position":[[176,7],[489,7]]},"36":{"position":[[339,7]]},"87":{"position":[[92,7],[181,8],[199,7],[243,7],[431,7],[518,7],[684,7],[728,7],[1210,7],[1237,7]]},"109":{"position":[[1588,7]]},"116":{"position":[[1582,7]]},"125":{"position":[[399,7],[462,7]]},"128":{"position":[[1122,7]]},"134":{"position":[[99,8]]},"150":{"position":[[399,7]]},"152":{"position":[[482,7]]},"154":{"position":[[558,7]]},"174":{"position":[[216,7],[256,7]]},"177":{"position":[[112,7],[447,8],[521,7]]},"179":{"position":[[232,7],[305,7],[502,7]]},"184":{"position":[[71,8],[189,7],[257,7],[360,7]]},"186":{"position":[[373,7],[412,7]]},"190":{"position":[[0,7],[417,7],[664,7],[720,7],[981,7],[1384,8]]},"220":{"position":[[97,7],[139,8],[157,7],[220,7],[246,7],[336,7],[357,7],[380,7]]},"222":{"position":[[430,7],[1354,7],[1390,7],[1693,7],[1733,7],[2135,7],[2287,7],[3307,7]]},"224":{"position":[[21,7],[84,7],[184,7],[246,7]]},"226":{"position":[[142,7]]},"228":{"position":[[261,7],[766,7],[859,7]]},"230":{"position":[[497,7],[1018,7]]},"234":{"position":[[26,7],[157,7],[246,8],[264,7],[379,7]]},"341":{"position":[[1019,8],[3630,9],[5068,9]]},"462":{"position":[[28,7],[86,7],[206,7]]},"526":{"position":[[351,7]]},"530":{"position":[[128,7],[3163,7],[3320,7],[3341,7],[3420,8],[4014,7]]},"532":{"position":[[1007,7]]},"536":{"position":[[145,7]]},"538":{"position":[[169,7],[1397,8]]},"575":{"position":[[516,8],[546,7],[1432,7],[1440,7],[1675,7],[1805,7]]},"592":{"position":[[0,7],[186,8]]},"596":{"position":[[240,7],[257,7],[616,7],[2610,7],[2858,7]]},"602":{"position":[[132,8]]},"610":{"position":[[267,7]]},"648":{"position":[[152,7]]},"653":{"position":[[296,8],[548,9]]}}}],["last.fm'",{"_index":1352,"t":{"134":{"position":[[1332,9]]}}}],["last.fm/libre.fm",{"_index":1096,"t":{"87":{"position":[[58,16]]},"89":{"position":[[412,16]]},"91":{"position":[[358,16],[426,16]]},"234":{"position":[[130,17]]},"236":{"position":[[393,16],[468,16]]}}}],["last.fm/listenbrainz",{"_index":3277,"t":{"596":{"position":[[2544,21]]}}}],["lastfm",{"_index":379,"t":{"21":{"position":[[112,6],[494,6],[591,6]]},"91":{"position":[[728,6],[935,6],[1275,6],[1355,6],[1579,6],[2346,6],[2538,6],[3057,6],[3602,8]]},"150":{"position":[[1162,6],[2162,8],[3145,9],[3183,8]]},"152":{"position":[[1176,8],[1362,8],[2397,9],[2439,8],[2601,9],[2643,8]]},"154":{"position":[[1464,6],[2836,8],[4001,9],[4039,8]]},"222":{"position":[[836,6],[1591,6]]},"226":{"position":[[31,6],[466,6]]},"228":{"position":[[36,6]]},"236":{"position":[[784,6],[991,6],[1331,6],[1411,6],[1600,6],[1739,6],[1800,6],[1891,6],[2658,6],[2850,6],[3369,6],[3914,8]]},"365":{"position":[[684,7]]},"526":{"position":[[412,7]]}}}],["lastfm.json",{"_index":227,"t":{"15":{"position":[[2534,11]]},"19":{"position":[[510,11],[946,11]]},"198":{"position":[[2837,11]]},"351":{"position":[[367,11]]},"353":{"position":[[1338,11]]},"418":{"position":[[62,11]]},"532":{"position":[[1588,11]]},"536":{"position":[[726,11]]},"592":{"position":[[622,11]]}}}],["lastfm_api_key",{"_index":1126,"t":{"91":{"position":[[313,14]]}}}],["lastfm_api_key=myapikey",{"_index":1432,"t":{"150":{"position":[[1189,23]]},"154":{"position":[[1491,23]]},"538":{"position":[[1682,23]]}}}],["lastfm_en",{"_index":1125,"t":{"91":{"position":[[255,13]]}}}],["lastfm_id",{"_index":1123,"t":{"91":{"position":[[127,9],[210,9]]}}}],["lastfm_id=mylfm",{"_index":1431,"t":{"150":{"position":[[1171,15]]},"154":{"position":[[1473,15]]}}}],["lastfm_id=mylfmcli",{"_index":3100,"t":{"538":{"position":[[1736,21]]}}}],["lastfm_nam",{"_index":1124,"t":{"91":{"position":[[182,11]]}}}],["lastfm_redirect_uri",{"_index":1121,"t":{"89":{"position":[[372,20]]},"91":{"position":[[451,19]]}}}],["lastfm_redirect_uri=https://multiscrobbler.example.com/lastfm/callback",{"_index":1434,"t":{"150":{"position":[[1240,70]]},"154":{"position":[[1542,70]]}}}],["lastfm_secret",{"_index":1127,"t":{"91":{"position":[[383,13]]}}}],["lastfm_secret=myapisecret",{"_index":3099,"t":{"538":{"position":[[1708,25]]}}}],["lastfm_secret=mysecret",{"_index":1433,"t":{"150":{"position":[[1215,22]]},"154":{"position":[[1517,22]]}}}],["lastfm_sess",{"_index":1129,"t":{"91":{"position":[[550,14]]}}}],["later",{"_index":2543,"t":{"353":{"position":[[672,5],[898,5]]},"530":{"position":[[1114,6],[3892,6]]},"621":{"position":[[1107,6]]}}}],["latest",{"_index":895,"t":{"55":{"position":[[9605,6]]},"482":{"position":[[42,6]]},"516":{"position":[[385,6]]},"520":{"position":[[212,6]]},"522":{"position":[[36,7],[51,6],[83,6],[123,7],[146,7],[173,6]]},"596":{"position":[[1627,6]]}}}],["latest_release_tag",{"_index":2958,"t":{"482":{"position":[[121,20]]}}}],["launch",{"_index":2639,"t":{"377":{"position":[[98,6]]}}}],["layer",{"_index":1198,"t":{"109":{"position":[[545,5],[721,5]]},"116":{"position":[[543,5],[719,5]]}}}],["lead",{"_index":3181,"t":{"561":{"position":[[6233,4]]}}}],["learn",{"_index":64,"t":{"7":{"position":[[716,5]]},"172":{"position":[[5316,5]]},"291":{"position":[[264,5]]},"335":{"position":[[343,5]]},"542":{"position":[[208,5],[381,5]]}}}],["leav",{"_index":367,"t":{"19":{"position":[[1469,5]]},"343":{"position":[[2251,5],[2387,5]]}}}],["left",{"_index":1062,"t":{"83":{"position":[[237,4]]},"194":{"position":[[344,4]]},"196":{"position":[[1205,5],[1993,4]]},"319":{"position":[[136,4]]},"524":{"position":[[161,4]]},"538":{"position":[[329,4]]}}}],["length",{"_index":1357,"t":{"134":{"position":[[1653,6]]},"138":{"position":[[62,6]]},"210":{"position":[[1415,7]]},"303":{"position":[[258,6]]},"315":{"position":[[743,6],[756,6]]},"359":{"position":[[570,7]]},"391":{"position":[[140,7]]}}}],["less",{"_index":580,"t":{"29":{"position":[[4030,4],[4074,5]]},"46":{"position":[[456,4]]},"166":{"position":[[489,4]]},"172":{"position":[[2425,5],[2458,4],[2576,5]]},"315":{"position":[[438,4]]},"575":{"position":[[1385,4]]},"648":{"position":[[1434,4]]}}}],["let",{"_index":969,"t":{"67":{"position":[[1113,4],[2605,4]]},"81":{"position":[[1354,4],[2888,4]]},"85":{"position":[[857,4],[2375,4]]},"91":{"position":[[1022,4],[2606,4]]},"99":{"position":[[1120,4],[2667,4]]},"103":{"position":[[795,4],[2287,4]]},"107":{"position":[[913,4],[2499,4]]},"114":{"position":[[2045,4],[3602,4]]},"121":{"position":[[1408,4],[2900,4]]},"144":{"position":[[927,4],[2481,4]]},"164":{"position":[[948,4],[2500,4]]},"168":{"position":[[1277,4],[2782,4]]},"200":{"position":[[1164,4],[2986,4]]},"206":{"position":[[921,4],[2397,4]]},"208":{"position":[[4060,4],[6009,4]]},"212":{"position":[[784,4],[2232,4]]},"218":{"position":[[957,4],[2426,4]]},"232":{"position":[[1036,4],[2490,4]]},"236":{"position":[[1078,4],[2918,4]]},"238":{"position":[[1261,4],[3032,4]]},"257":{"position":[[1109,4],[2568,4]]},"261":{"position":[[1183,4],[2989,4]]},"265":{"position":[[962,4],[2822,4]]},"269":{"position":[[837,4],[2585,4]]},"273":{"position":[[906,4],[2405,4]]},"277":{"position":[[919,4],[2373,4]]},"281":{"position":[[885,4],[2356,4]]},"289":{"position":[[1152,4],[2638,4]]},"295":{"position":[[1081,4],[2897,4]]},"301":{"position":[[1390,4],[2926,4]]},"305":{"position":[[935,4],[2525,4]]},"317":{"position":[[914,4],[2499,4]]},"321":{"position":[[804,4],[2226,4]]},"329":{"position":[[858,4],[2354,4]]},"333":{"position":[[888,4],[2382,4]]},"341":{"position":[[2323,4],[4129,4]]},"345":{"position":[[1030,4],[2626,4]]},"393":{"position":[[787,4],[2241,4]]}}}],["let'",{"_index":2528,"t":{"349":{"position":[[7,5]]}}}],["level",{"_index":59,"t":{"7":{"position":[[629,5]]},"19":{"position":[[1516,6]]},"33":{"position":[[351,5]]},"38":{"position":[[261,5]]},"172":{"position":[[2216,6]]},"297":{"position":[[1917,5]]},"357":{"position":[[79,5]]},"361":{"position":[[543,5]]},"488":{"position":[[158,6],[272,5]]},"573":{"position":[[227,5]]},"621":{"position":[[333,5],[617,5]]}}}],["levenshtein",{"_index":1655,"t":{"172":{"position":[[1008,11]]}}}],["leverag",{"_index":3167,"t":{"561":{"position":[[2487,8]]}}}],["lewi",{"_index":1670,"t":{"172":{"position":[[1488,6],[1594,6]]}}}],["lfm",{"_index":1132,"t":{"91":{"position":[[1884,3],[3356,3]]},"190":{"position":[[896,3]]},"198":{"position":[[2867,3]]},"222":{"position":[[241,3],[291,3],[2592,3]]},"232":{"position":[[539,3],[611,3],[1917,4],[3239,4]]},"236":{"position":[[2196,3],[3668,3]]}}}],["lfm/lz",{"_index":2929,"t":{"476":{"position":[[891,6]]}}}],["lfm_api_key",{"_index":2051,"t":{"232":{"position":[[560,11]]}}}],["lfm_enabl",{"_index":2048,"t":{"232":{"position":[[246,10]]},"627":{"position":[[125,10]]}}}],["lfm_id",{"_index":2046,"t":{"232":{"position":[[127,6],[204,6]]}}}],["lfm_name",{"_index":2047,"t":{"232":{"position":[[179,8]]}}}],["lfm_slug",{"_index":2049,"t":{"232":{"position":[[301,8]]}}}],["lfm_usernam",{"_index":2050,"t":{"232":{"position":[[486,12]]}}}],["lfmendpoint_en",{"_index":3310,"t":{"627":{"position":[[103,18]]}}}],["libr",{"_index":1155,"t":{"99":{"position":[[1987,5],[3418,5]]},"261":{"position":[[2309,5],[3740,5]]}}}],["librari",{"_index":939,"t":{"65":{"position":[[3173,8]]},"79":{"position":[[3348,8]]},"150":{"position":[[334,7]]},"208":{"position":[[798,9],[950,7],[3224,7],[3335,7]]},"214":{"position":[[209,10]]},"297":{"position":[[1548,7],[1947,7]]},"307":{"position":[[1346,9],[1435,9]]},"309":{"position":[[51,7]]},"311":{"position":[[268,7]]},"343":{"position":[[1476,7]]},"454":{"position":[[583,7]]},"470":{"position":[[2997,7]]},"530":{"position":[[3052,7]]}}}],["librariesallow",{"_index":1452,"t":{"150":{"position":[[2071,17],[3086,17]]},"208":{"position":[[837,14],[5245,17],[7074,17]]},"307":{"position":[[1473,14]]}}}],["librariesblock",{"_index":1972,"t":{"208":{"position":[[5280,17],[7109,17]]}}}],["library/appl",{"_index":2970,"t":{"482":{"position":[[1181,21]]}}}],["library/preferences/multi",{"_index":2969,"t":{"482":{"position":[[1135,27]]}}}],["libre.fm",{"_index":16,"t":{"4":{"position":[[37,8]]},"93":{"position":[[58,8],[84,8],[122,8],[295,8]]},"95":{"position":[[413,8]]},"97":{"position":[[34,8]]},"99":{"position":[[360,8],[419,8],[706,8]]},"125":{"position":[[430,8]]},"259":{"position":[[26,8],[131,9],[150,8],[264,8]]},"261":{"position":[[395,8],[461,8],[769,8]]},"596":{"position":[[248,8],[624,8]]}}}],["librefm",{"_index":1153,"t":{"99":{"position":[[824,7],[1032,7],[1373,7],[1454,7],[1680,7],[2405,7],[2598,7],[3118,7],[3620,9]]},"261":{"position":[[887,7],[1095,7],[1436,7],[1517,7],[1708,7],[1848,7],[1910,7],[2002,7],[2727,7],[2920,7],[3440,7],[3942,9]]}}}],["librefm_api_key",{"_index":1147,"t":{"99":{"position":[[317,15]]}}}],["librefm_en",{"_index":1146,"t":{"99":{"position":[[258,14]]}}}],["librefm_id",{"_index":1144,"t":{"99":{"position":[[127,10],[212,10]]}}}],["librefm_nam",{"_index":1145,"t":{"99":{"position":[[183,12]]}}}],["librefm_redirect_uri",{"_index":1138,"t":{"95":{"position":[[372,21]]},"99":{"position":[[436,20]]}}}],["librefm_secret",{"_index":1148,"t":{"99":{"position":[[377,14]]}}}],["librefm_sess",{"_index":1150,"t":{"99":{"position":[[537,15]]}}}],["librefm_urlbas",{"_index":1140,"t":{"97":{"position":[[96,15]]},"99":{"position":[[616,15]]}}}],["licens",{"_index":3123,"t":{"544":{"position":[[904,9]]},"546":{"position":[[301,9]]}}}],["lifecycl",{"_index":2520,"t":{"347":{"position":[[201,10]]},"349":{"position":[[23,9]]},"351":{"position":[[220,9]]},"353":{"position":[[627,9],[685,9]]}}}],["lifetim",{"_index":2621,"t":{"368":{"position":[[361,8]]}}}],["limit",{"_index":863,"t":{"55":{"position":[[5765,5],[7151,5],[9410,5]]},"63":{"position":[[16,11]]},"87":{"position":[[218,6]]},"132":{"position":[[3,5]]},"166":{"position":[[1073,11]]},"186":{"position":[[75,5],[241,5]]},"220":{"position":[[317,11]]},"343":{"position":[[893,5]]},"395":{"position":[[147,7]]},"454":{"position":[[969,5]]},"462":{"position":[[10,10]]},"551":{"position":[[14,9]]}}}],["line",{"_index":783,"t":{"55":{"position":[[1954,4],[2029,4],[9750,5]]},"59":{"position":[[553,4],[628,4]]},"67":{"position":[[1337,6],[2828,6]]},"81":{"position":[[1578,6],[3111,6]]},"85":{"position":[[1081,6],[2598,6]]},"91":{"position":[[1246,6],[2829,6]]},"99":{"position":[[1344,6],[2890,6]]},"103":{"position":[[1019,6],[2510,6]]},"107":{"position":[[1137,6],[2722,6]]},"114":{"position":[[2269,6],[3825,6]]},"121":{"position":[[1632,6],[3123,6]]},"144":{"position":[[1151,6],[2704,6]]},"164":{"position":[[1172,6],[2723,6]]},"168":{"position":[[1501,6],[3005,6]]},"196":{"position":[[3781,4],[3831,4]]},"200":{"position":[[1388,6],[3209,6]]},"206":{"position":[[1145,6],[2620,6]]},"208":{"position":[[4284,6],[6232,6]]},"212":{"position":[[1008,6],[2455,6]]},"218":{"position":[[1181,6],[2649,6]]},"232":{"position":[[1260,6],[2713,6]]},"236":{"position":[[1302,6],[3141,6]]},"238":{"position":[[1485,6],[3255,6]]},"257":{"position":[[1333,6],[2791,6]]},"261":{"position":[[1407,6],[3212,6]]},"265":{"position":[[1186,6],[3045,6]]},"269":{"position":[[1061,6],[2808,6]]},"273":{"position":[[1130,6],[2628,6]]},"277":{"position":[[1143,6],[2596,6]]},"281":{"position":[[1109,6],[2579,6]]},"289":{"position":[[1376,6],[2861,6]]},"295":{"position":[[1305,6],[3120,6]]},"301":{"position":[[1614,6],[3149,6]]},"305":{"position":[[1159,6],[2748,6]]},"317":{"position":[[1138,6],[2722,6]]},"319":{"position":[[763,4],[953,4]]},"321":{"position":[[1028,6],[2449,6]]},"329":{"position":[[1082,6],[2577,6]]},"333":{"position":[[1112,6],[2605,6]]},"341":{"position":[[2547,6],[4352,6]]},"345":{"position":[[1254,6],[2849,6]]},"393":{"position":[[1011,6],[2464,6]]},"466":{"position":[[164,5]]}}}],["link",{"_index":910,"t":{"65":{"position":[[527,5]]},"77":{"position":[[102,6]]},"79":{"position":[[668,5]]},"136":{"position":[[449,4]]},"140":{"position":[[776,4]]},"162":{"position":[[59,6],[186,6],[316,6],[1065,6],[1094,6],[1179,6]]},"164":{"position":[[422,6]]},"208":{"position":[[1717,5],[2073,7],[3552,5]]},"210":{"position":[[876,4]]},"303":{"position":[[1475,4]]},"343":{"position":[[5160,4],[5460,4]]},"359":{"position":[[660,6]]},"454":{"position":[[514,4]]},"492":{"position":[[62,6]]},"610":{"position":[[406,4]]}}}],["lint",{"_index":2640,"t":{"377":{"position":[[241,7]]}}}],["linux",{"_index":772,"t":{"55":{"position":[[1301,5],[4005,5],[4050,6],[5377,5]]},"57":{"position":[[69,5]]},"164":{"position":[[492,5]]},"166":{"position":[[990,5],[1139,5]]},"275":{"position":[[70,5],[106,5]]},"448":{"position":[[549,5],[760,5]]},"476":{"position":[[37,5],[1765,5]]},"478":{"position":[[304,5]]},"482":{"position":[[960,5]]},"501":{"position":[[67,5]]},"540":{"position":[[59,5]]},"596":{"position":[[359,6]]}}}],["liquidsoap",{"_index":1394,"t":{"142":{"position":[[896,13]]}}}],["list",{"_index":139,"t":{"11":{"position":[[1175,4],[1266,4]]},"15":{"position":[[3703,6]]},"65":{"position":[[1147,4]]},"67":{"position":[[352,4],[536,4]]},"79":{"position":[[1288,4]]},"81":{"position":[[509,4],[761,4],[868,4]]},"109":{"position":[[1258,4]]},"116":{"position":[[1252,4]]},"128":{"position":[[1326,5]]},"166":{"position":[[2238,4],[2740,4]]},"168":{"position":[[482,4],[603,4],[723,4],[841,4]]},"196":{"position":[[2171,4]]},"198":{"position":[[1490,4]]},"208":{"position":[[1185,4],[2805,5],[2924,4],[3046,4],[3170,4],[3279,4],[3391,4],[3641,4]]},"277":{"position":[[414,4],[522,4]]},"285":{"position":[[193,4]]},"287":{"position":[[231,5]]},"289":{"position":[[736,4]]},"297":{"position":[[721,4],[993,4]]},"301":{"position":[[603,4],[709,4],[850,4],[993,4]]},"307":{"position":[[593,4]]},"313":{"position":[[731,4]]},"341":{"position":[[33,5],[216,4]]},"383":{"position":[[312,7]]},"395":{"position":[[232,4]]},"397":{"position":[[66,4],[182,4],[211,4],[378,4],[473,4],[519,4],[1272,5],[1311,4]]},"470":{"position":[[165,4],[232,4],[598,4],[641,4],[750,4],[847,4],[1770,5]]},"492":{"position":[[126,5]]},"530":{"position":[[2899,4]]},"557":{"position":[[309,4]]},"561":{"position":[[382,4],[1618,6]]},"600":{"position":[[368,4]]},"635":{"position":[[440,5]]},"638":{"position":[[1181,4],[1671,4]]},"648":{"position":[[2515,4]]},"651":{"position":[[871,4]]},"653":{"position":[[2970,4],[4040,4]]}}}],["listen",{"_index":35,"t":{"7":{"position":[[238,9]]},"55":{"position":[[4192,9],[4331,9],[4598,9],[4737,9],[5948,9],[7505,9]]},"63":{"position":[[63,9]]},"69":{"position":[[1672,10]]},"75":{"position":[[493,9],[514,10],[1149,9],[1270,9],[1294,10],[1469,9],[1649,9],[1674,9],[1780,9],[1941,9]]},"81":{"position":[[876,9]]},"128":{"position":[[292,9],[634,9],[653,9],[715,9],[823,8],[1257,9]]},"134":{"position":[[5,9],[28,9],[586,9],[653,9],[934,8],[1079,9],[1173,10],[1201,8],[1266,8],[1544,8],[1610,8]]},"136":{"position":[[182,9]]},"138":{"position":[[124,9]]},"140":{"position":[[1368,8]]},"150":{"position":[[68,6]]},"158":{"position":[[179,9]]},"160":{"position":[[101,9]]},"162":{"position":[[28,9],[936,9]]},"172":{"position":[[2826,8],[2942,9],[3177,8],[3227,9]]},"192":{"position":[[38,9]]},"198":{"position":[[754,6],[827,6],[1308,7],[1373,10],[1656,6]]},"210":{"position":[[553,9],[1539,9]]},"244":{"position":[[319,7]]},"248":{"position":[[515,6],[546,7],[662,7],[829,7]]},"275":{"position":[[171,9],[238,6],[1520,9]]},"283":{"position":[[244,6]]},"331":{"position":[[26,9]]},"343":{"position":[[277,9]]},"347":{"position":[[618,6]]},"349":{"position":[[132,8],[499,6]]},"373":{"position":[[168,6]]},"385":{"position":[[63,6],[264,6]]},"391":{"position":[[190,9]]},"470":{"position":[[1001,6],[2728,9],[2836,9],[2874,9],[2934,8]]},"526":{"position":[[363,9]]},"530":{"position":[[76,9]]},"538":{"position":[[77,9]]},"561":{"position":[[6506,6],[6801,8]]},"596":{"position":[[42,9],[2113,6]]},"600":{"position":[[88,8]]},"648":{"position":[[332,9],[2702,8]]},"653":{"position":[[3405,6]]}}}],["listen:6644,reuseaddr,fork",{"_index":2141,"t":{"275":{"position":[[1610,26]]}}}],["listen:6655,reuseaddr,fork",{"_index":870,"t":{"55":{"position":[[6073,26],[7630,26],[7958,27]]}}}],["listenbrainz",{"_index":11,"t":{"2":{"position":[[142,15]]},"4":{"position":[[48,12]]},"29":{"position":[[769,13],[943,13]]},"36":{"position":[[286,12]]},"105":{"position":[[55,12],[85,12],[181,12],[211,12],[265,12]]},"107":{"position":[[353,12],[607,12],[820,12],[1166,12],[1252,12],[1488,12],[2227,12],[2425,12],[2950,12],[3461,14]]},"109":{"position":[[1599,13]]},"114":{"position":[[551,12]]},"116":{"position":[[1593,13]]},"125":{"position":[[505,12],[541,12]]},"128":{"position":[[1097,13]]},"134":{"position":[[82,12],[240,12]]},"150":{"position":[[233,12],[950,12]]},"154":{"position":[[406,12],[1304,12]]},"179":{"position":[[513,13]]},"220":{"position":[[688,12],[714,12]]},"240":{"position":[[97,12],[160,13],[216,12],[320,12],[367,13],[390,12],[458,12],[489,12]]},"242":{"position":[[416,12],[819,12],[1325,12],[1366,12],[1572,12],[1668,12],[1713,12],[2111,12],[2268,12],[3261,12]]},"244":{"position":[[253,12],[349,12]]},"246":{"position":[[5,12],[214,12]]},"248":{"position":[[36,12],[526,12]]},"253":{"position":[[111,12],[141,12]]},"255":{"position":[[497,12],[1023,12]]},"257":{"position":[[653,12]]},"263":{"position":[[23,12],[154,12],[184,12],[280,12],[310,12],[364,12]]},"265":{"position":[[388,12],[656,12],[869,12],[1215,12],[1301,12],[1502,12],[1647,12],[1714,12],[1811,12],[2550,12],[2748,12],[3273,12],[3784,14]]},"313":{"position":[[384,12],[438,12]]},"448":{"position":[[115,12]]},"530":{"position":[[1404,13],[1676,12],[1704,12],[1747,12],[2452,12],[2494,12]]},"575":{"position":[[1142,12]]},"579":{"position":[[326,13]]},"596":{"position":[[276,12],[289,12],[633,12],[2633,12]]},"602":{"position":[[141,15]]},"648":{"position":[[135,12]]},"653":{"position":[[282,13],[533,14]]}}}],["listenbrainz.baseurl",{"_index":2083,"t":{"251":{"position":[[16,20]]},"530":{"position":[[2098,20]]}}}],["listenbrainz/musicbrainz",{"_index":2855,"t":{"452":{"position":[[604,24]]}}}],["listeningactivityallow",{"_index":1051,"t":{"75":{"position":[[2141,25]]}}}],["liter",{"_index":2754,"t":{"416":{"position":[[69,8]]}}}],["live",{"_index":435,"t":{"23":{"position":[[1027,5]]},"25":{"position":[[129,4]]},"140":{"position":[[1321,4]]}}}],["live|remast",{"_index":2767,"t":{"421":{"position":[[180,15]]}}}],["livingroom",{"_index":2714,"t":{"393":{"position":[[1658,11],[2988,11]]}}}],["load",{"_index":967,"t":{"67":{"position":[[956,7],[2412,7]]},"81":{"position":[[1197,7],[2695,7]]},"85":{"position":[[702,7],[2184,7]]},"91":{"position":[[866,7],[2414,7]]},"99":{"position":[[963,7],[2474,7]]},"101":{"position":[[157,10]]},"103":{"position":[[639,7],[2095,7]]},"107":{"position":[[751,7],[2301,7]]},"114":{"position":[[1888,7],[3409,7]]},"121":{"position":[[1252,7],[2708,7]]},"144":{"position":[[768,7],[2286,7]]},"164":{"position":[[792,7],[2308,7]]},"168":{"position":[[1117,7],[2586,7]]},"200":{"position":[[1004,7],[2790,7]]},"206":{"position":[[767,7],[2207,7]]},"208":{"position":[[3536,4],[3902,7],[5815,7]]},"212":{"position":[[627,7],[2039,7]]},"218":{"position":[[801,7],[2234,7]]},"232":{"position":[[875,7],[2293,7]]},"236":{"position":[[922,7],[2726,7]]},"238":{"position":[[1106,7],[2841,7]]},"257":{"position":[[949,7],[2372,7]]},"261":{"position":[[1026,7],[2796,7]]},"265":{"position":[[800,7],[2624,7]]},"269":{"position":[[681,7],[2393,7]]},"273":{"position":[[747,7],[2210,7]]},"277":{"position":[[764,7],[2182,7]]},"281":{"position":[[732,7],[2167,7]]},"289":{"position":[[996,7],[2446,7]]},"295":{"position":[[924,7],[2704,7]]},"301":{"position":[[1235,7],[2735,7]]},"305":{"position":[[778,7],[2332,7]]},"317":{"position":[[756,7],[2305,7]]},"321":{"position":[[651,7],[2037,7]]},"329":{"position":[[696,7],[2156,7]]},"333":{"position":[[730,7],[2188,7]]},"341":{"position":[[2167,7],[3937,7]]},"345":{"position":[[873,7],[2433,7]]},"393":{"position":[[628,7],[2046,7]]},"538":{"position":[[1915,10]]},"551":{"position":[[547,4]]}}}],["local",{"_index":167,"t":{"15":{"position":[[490,5],[1277,5],[3453,5]]},"25":{"position":[[711,5]]},"55":{"position":[[3351,5],[3412,7]]},"63":{"position":[[43,5],[169,5]]},"275":{"position":[[463,5],[511,5],[780,5]]},"297":{"position":[[34,5]]},"303":{"position":[[2513,7],[3385,5]]},"307":{"position":[[244,5],[259,5],[356,5],[629,5],[799,5],[1005,5],[1304,5]]},"323":{"position":[[670,5]]},"333":{"position":[[352,5]]},"375":{"position":[[91,7]]},"476":{"position":[[2755,5]]},"478":{"position":[[1202,5]]},"516":{"position":[[242,5]]},"596":{"position":[[1304,7]]}}}],["local/nod",{"_index":187,"t":{"15":{"position":[[1008,10]]}}}],["local/share/multi",{"_index":2968,"t":{"482":{"position":[[1094,20]]}}}],["localappdata%\\multi",{"_index":2974,"t":{"482":{"position":[[1278,20]]}}}],["localhost",{"_index":1910,"t":{"204":{"position":[[567,9]]},"216":{"position":[[575,9]]},"283":{"position":[[885,9]]},"289":{"position":[[2077,12],[3451,12]]},"303":{"position":[[2318,9]]},"323":{"position":[[364,10]]},"448":{"position":[[1914,9]]},"450":{"position":[[563,9]]},"526":{"position":[[545,10],[654,10]]}}}],["localhost:6600",{"_index":2160,"t":{"281":{"position":[[316,14]]}}}],["localhost:8080",{"_index":2367,"t":{"321":{"position":[[316,14],[1704,17],[3026,17]]}}}],["localhost:9229",{"_index":2701,"t":{"389":{"position":[[210,14]]}}}],["locat",{"_index":194,"t":{"15":{"position":[[1173,7],[2014,7],[3343,7],[3431,8]]},"67":{"position":[[378,9]]},"109":{"position":[[1210,8]]},"116":{"position":[[1208,8]]},"142":{"position":[[674,6]]},"154":{"position":[[227,8]]},"303":{"position":[[3443,8]]},"391":{"position":[[434,7]]},"440":{"position":[[155,7]]},"478":{"position":[[166,7]]},"596":{"position":[[2840,9]]}}}],["lock",{"_index":1200,"t":{"109":{"position":[[676,6]]},"116":{"position":[[674,6]]}}}],["lock.json",{"_index":2802,"t":{"442":{"position":[[332,9],[518,9]]}}}],["log",{"_index":57,"t":{"7":{"position":[[601,6],[621,7]]},"19":{"position":[[1496,3]]},"21":{"position":[[138,7]]},"31":{"position":[[107,3],[242,4],[347,4]]},"158":{"position":[[204,7]]},"162":{"position":[[172,4]]},"166":{"position":[[3107,4],[3304,7],[3324,3]]},"172":{"position":[[4133,4]]},"194":{"position":[[171,3],[602,5]]},"196":{"position":[[1080,3],[1864,3]]},"230":{"position":[[889,8],[928,8],[1133,7]]},"253":{"position":[[501,4],[559,4]]},"255":{"position":[[894,8],[933,8],[1144,7]]},"297":{"position":[[1076,7],[1193,7],[1526,7],[1702,3],[1825,3],[1908,4],[1987,4]]},"303":{"position":[[990,6]]},"319":{"position":[[1837,4],[2280,7],[2317,4],[2354,7]]},"343":{"position":[[2852,3],[5034,6],[5356,3]]},"345":{"position":[[622,7]]},"365":{"position":[[7,3],[121,4],[126,6],[266,6],[454,6],[585,4]]},"381":{"position":[[507,7]]},"383":{"position":[[638,3]]},"448":{"position":[[233,3],[313,4],[882,4],[1164,4],[1428,8],[1458,7],[2419,5],[2474,4]]},"457":{"position":[[39,5]]},"464":{"position":[[439,7],[501,4],[559,6]]},"466":{"position":[[105,4]]},"468":{"position":[[43,7]]},"470":{"position":[[1688,3],[2205,8],[2234,4],[2283,3],[2296,4],[2498,4],[2521,4],[3225,4],[3278,4],[3319,5]]},"488":{"position":[[33,3],[80,4],[110,5],[134,4],[253,4],[361,4]]},"490":{"position":[[87,7],[173,4],[250,5]]},"499":{"position":[[466,4],[524,4]]},"524":{"position":[[222,4]]},"540":{"position":[[596,3]]},"581":{"position":[[148,7],[299,7],[323,4],[479,6],[659,6]]},"596":{"position":[[1066,4]]},"610":{"position":[[38,5]]},"623":{"position":[[781,4]]}}}],["logauthupdatechang",{"_index":2468,"t":{"343":{"position":[[1159,23],[2749,23],[4052,23]]}}}],["logdiff",{"_index":1902,"t":{"200":{"position":[[2415,10],[4109,10]]},"343":{"position":[[1189,10],[2779,10],[4082,10]]},"345":{"position":[[2121,10],[3601,10]]},"470":{"position":[[1491,7],[1592,10],[2427,10]]}}}],["logfilenamepattern",{"_index":2361,"t":{"319":{"position":[[1897,22]]}}}],["logfilterfailur",{"_index":275,"t":{"15":{"position":[[4606,19]]},"208":{"position":[[5490,19],[7319,19]]},"297":{"position":[[1462,19]]}}}],["logfitlerfailur",{"_index":2213,"t":{"297":{"position":[[1315,16]]}}}],["logic",{"_index":2624,"t":{"373":{"position":[[128,6]]}}}],["login",{"_index":817,"t":{"55":{"position":[[2759,5],[2911,5],[3001,5],[3034,5],[6051,6],[7608,6]]},"61":{"position":[[135,5],[225,5],[258,5]]},"72":{"position":[[649,5]]},"121":{"position":[[938,5]]},"158":{"position":[[59,5]]},"162":{"position":[[1080,6]]},"303":{"position":[[1747,5]]},"307":{"position":[[387,7]]},"317":{"position":[[354,5],[429,5]]},"341":{"position":[[1846,5]]},"343":{"position":[[1769,5]]},"501":{"position":[[185,6]]},"505":{"position":[[248,5]]}}}],["logo",{"_index":3056,"t":{"524":{"position":[[145,4]]}}}],["logpayload",{"_index":274,"t":{"15":{"position":[[4585,13]]},"166":{"position":[[3556,13]]},"208":{"position":[[5470,13],[7299,13]]},"297":{"position":[[1300,10],[1490,13]]}}}],["logplayerst",{"_index":277,"t":{"15":{"position":[[4634,17]]}}}],["logtofil",{"_index":2912,"t":{"470":{"position":[[2334,9],[2444,12]]}}}],["long",{"_index":434,"t":{"23":{"position":[[1022,4]]},"134":{"position":[[925,4]]},"196":{"position":[[1574,4],[2281,4]]},"228":{"position":[[319,4]]},"349":{"position":[[144,4]]},"648":{"position":[[1381,4],[1471,4],[2714,4]]}}}],["longer",{"_index":447,"t":{"25":{"position":[[114,6],[179,6]]},"208":{"position":[[1330,6]]},"303":{"position":[[2231,6],[2364,6]]},"315":{"position":[[704,6]]},"343":{"position":[[1386,6]]},"484":{"position":[[44,6]]},"625":{"position":[[1082,6]]}}}],["look",{"_index":337,"t":{"19":{"position":[[290,4]]},"121":{"position":[[451,4]]},"162":{"position":[[177,4],[245,4]]},"196":{"position":[[2211,4]]},"319":{"position":[[1738,4]]},"351":{"position":[[44,5]]},"403":{"position":[[438,4]]},"448":{"position":[[321,5]]},"530":{"position":[[67,4]]},"557":{"position":[[1330,4]]},"561":{"position":[[5144,5]]},"640":{"position":[[556,5]]},"651":{"position":[[886,5]]}}}],["lookup",{"_index":2440,"t":{"341":{"position":[[626,6]]},"452":{"position":[[393,6]]}}}],["loop",{"_index":1874,"t":{"198":{"position":[[1366,6]]}}}],["lose",{"_index":90,"t":{"9":{"position":[[338,4]]}}}],["lost",{"_index":2926,"t":{"476":{"position":[[211,4]]}}}],["lot",{"_index":1821,"t":{"196":{"position":[[854,3]]}}}],["low",{"_index":1861,"t":{"198":{"position":[[475,3]]},"297":{"position":[[1913,3]]}}}],["lower",{"_index":3215,"t":{"568":{"position":[[183,5]]}}}],["lowercas",{"_index":1639,"t":{"172":{"position":[[309,10]]}}}],["lowest",{"_index":1046,"t":{"75":{"position":[[1501,6]]},"488":{"position":[[265,6]]}}}],["ltj",{"_index":2590,"t":{"365":{"position":[[843,3]]}}}],["lua",{"_index":2346,"t":{"319":{"position":[[373,3],[380,3]]}}}],["lz",{"_index":1185,"t":{"107":{"position":[[1805,2],[3255,2]]},"150":{"position":[[1855,3],[2855,3]]},"154":{"position":[[2629,3],[3802,3]]},"257":{"position":[[502,2],[1985,3],[3316,3]]},"265":{"position":[[2128,2],[3578,2]]}}}],["lz_enabl",{"_index":1179,"t":{"107":{"position":[[243,9]]}}}],["lz_id",{"_index":1177,"t":{"107":{"position":[[127,5],[202,5]]}}}],["lz_name",{"_index":1178,"t":{"107":{"position":[[178,7]]}}}],["lz_token",{"_index":1182,"t":{"107":{"position":[[399,8]]}}}],["lz_url",{"_index":1180,"t":{"107":{"position":[[297,6]]}}}],["lz_user",{"_index":1183,"t":{"107":{"position":[[455,7]]}}}],["lze_en",{"_index":2091,"t":{"257":{"position":[[246,10]]},"627":{"position":[[92,10]]}}}],["lze_id",{"_index":2089,"t":{"257":{"position":[[127,6],[204,6]]}}}],["lze_id=mylznavidrom",{"_index":1424,"t":{"150":{"position":[[974,20]]},"154":{"position":[[1328,20]]}}}],["lze_id=navidromelz",{"_index":3074,"t":{"530":{"position":[[1971,18]]}}}],["lze_nam",{"_index":2090,"t":{"257":{"position":[[179,8]]}}}],["lze_slug",{"_index":2092,"t":{"257":{"position":[[301,8]]}}}],["lze_slug=foobar",{"_index":2079,"t":{"248":{"position":[[611,15]]}}}],["lze_token",{"_index":2077,"t":{"246":{"position":[[172,10]]},"257":{"position":[[479,9]]},"530":{"position":[[2547,9]]}}}],["lze_token=mycooltoken",{"_index":3073,"t":{"530":{"position":[[1947,21]]}}}],["lze_token=mytoken",{"_index":1425,"t":{"150":{"position":[[997,17]]},"154":{"position":[[1351,17]]}}}],["lze_transforms=musicbrainz",{"_index":1488,"t":{"154":{"position":[[1435,26]]},"532":{"position":[[1411,26]]},"536":{"position":[[549,26]]}}}],["lze_usernam",{"_index":2093,"t":{"257":{"position":[[629,12]]}}}],["lzendpoint_en",{"_index":3309,"t":{"627":{"position":[[71,17]]}}}],["ma7xbvzrerk3gqdkx4dkb3oq.6aagmj.rvfiivrzg4vxhhl3lyhzyhpwdg3ph_if9akz5",{"_index":1041,"t":{"75":{"position":[[931,73],[2027,73]]},"81":{"position":[[2286,73],[3704,73]]}}}],["machin",{"_index":713,"t":{"46":{"position":[[383,7]]},"55":{"position":[[216,7],[577,8],[3445,7],[5715,7],[7101,7],[7311,8],[9360,7],[9686,7]]},"166":{"position":[[874,7],[1020,7]]},"204":{"position":[[530,7]]},"216":{"position":[[538,7]]},"303":{"position":[[3144,7],[3525,7],[3734,7]]},"448":{"position":[[1788,7],[2189,7],[2389,8]]},"450":{"position":[[336,7]]},"476":{"position":[[1183,7],[1270,8]]},"478":{"position":[[254,7]]},"526":{"position":[[176,7],[494,7]]},"648":{"position":[[233,7],[558,7],[968,7],[2607,7]]},"653":{"position":[[52,7],[682,7],[1576,7]]}}}],["maco",{"_index":830,"t":{"55":{"position":[[4022,5],[4456,6],[5394,5],[7305,5]]},"482":{"position":[[966,5]]}}}],["made",{"_index":2547,"t":{"353":{"position":[[1301,4]]},"355":{"position":[[13,4]]},"383":{"position":[[2504,4]]},"566":{"position":[[1120,4]]}}}],["magic",{"_index":1597,"t":{"166":{"position":[[1794,9]]}}}],["main",{"_index":724,"t":{"50":{"position":[[239,4]]},"69":{"position":[[258,4]]},"162":{"position":[[151,4],[1009,4]]},"184":{"position":[[182,6],[490,4],[565,4]]},"319":{"position":[[223,4],[354,4]]},"331":{"position":[[1416,4]]},"339":{"position":[[62,4]]}}}],["mainstream",{"_index":3112,"t":{"544":{"position":[[587,10],[944,10]]},"546":{"position":[[341,10]]}}}],["major",{"_index":1586,"t":{"166":{"position":[[1133,5]]},"174":{"position":[[289,8]]},"210":{"position":[[168,8]]},"460":{"position":[[104,8]]},"510":{"position":[[4,8]]},"518":{"position":[[49,5],[150,5]]},"566":{"position":[[1759,8]]},"575":{"position":[[267,5]]},"631":{"position":[[4,8]]},"648":{"position":[[4,8]]}}}],["majorli",{"_index":2651,"t":{"381":{"position":[[468,7]]}}}],["make",{"_index":410,"t":{"23":{"position":[[68,4]]},"40":{"position":[[316,4]]},"55":{"position":[[1022,4],[5327,4]]},"87":{"position":[[633,6],[1086,4]]},"128":{"position":[[197,5]]},"142":{"position":[[1196,4]]},"158":{"position":[[116,4]]},"182":{"position":[[79,4]]},"196":{"position":[[846,5],[892,4],[3751,4]]},"204":{"position":[[398,4]]},"216":{"position":[[404,4]]},"220":{"position":[[534,5]]},"226":{"position":[[507,4]]},"228":{"position":[[1039,6]]},"230":{"position":[[1052,4]]},"255":{"position":[[1063,4]]},"275":{"position":[[976,4],[1543,4]]},"283":{"position":[[762,4]]},"307":{"position":[[25,4]]},"343":{"position":[[4370,4],[4418,4]]},"383":{"position":[[1814,4],[3165,4]]},"442":{"position":[[168,4]]},"448":{"position":[[2313,4]]},"470":{"position":[[271,5]]},"490":{"position":[[163,4]]},"512":{"position":[[304,4],[338,6],[460,4]]},"530":{"position":[[2049,6],[2391,6],[2591,4],[3530,4]]},"561":{"position":[[690,4],[822,6]]},"619":{"position":[[123,4]]},"623":{"position":[[1241,4]]},"629":{"position":[[469,4]]}}}],["maloja",{"_index":9,"t":{"2":{"position":[[125,7]]},"4":{"position":[[71,6]]},"15":{"position":[[5170,9],[5210,8]]},"101":{"position":[[8,6],[57,6],[511,6]]},"103":{"position":[[339,6],[387,6],[501,6],[708,6],[1048,6],[1128,6],[1352,6],[1651,7],[2027,6],[2219,6],[2738,6],[3031,7],[3191,8]]},"125":{"position":[[589,6]]},"267":{"position":[[28,6],[52,6],[76,6]]},"269":{"position":[[374,6],[429,6],[543,6],[750,6],[1090,6],[1170,6],[1359,6],[1498,6],[1559,6],[1650,6],[1949,7],[2325,6],[2517,6],[3036,6],[3329,7],[3489,8]]},"403":{"position":[[574,6],[939,6]]},"478":{"position":[[110,6]]},"482":{"position":[[2194,9]]},"526":{"position":[[420,7]]},"538":{"position":[[177,6],[1766,6],[1815,6]]},"557":{"position":[[1471,6],[1979,6]]},"596":{"position":[[313,6],[646,6]]}}}],["maloja'",{"_index":1158,"t":{"101":{"position":[[88,8]]},"538":{"position":[[1846,8]]}}}],["maloja_api_key",{"_index":1174,"t":{"103":{"position":[[353,14]]}}}],["maloja_api_key=1234",{"_index":2953,"t":{"478":{"position":[[883,19]]}}}],["maloja_api_key=myapikey",{"_index":2743,"t":{"403":{"position":[[989,23]]},"538":{"position":[[2445,23]]},"557":{"position":[[2069,23]]}}}],["maloja_en",{"_index":1172,"t":{"103":{"position":[[255,13]]}}}],["maloja_force_password=change_m",{"_index":1161,"t":{"101":{"position":[[213,31]]},"538":{"position":[[1971,31]]}}}],["maloja_id",{"_index":1170,"t":{"103":{"position":[[127,9],[210,9]]}}}],["maloja_id=mymaloja",{"_index":3102,"t":{"538":{"position":[[2471,18]]}}}],["maloja_nam",{"_index":1171,"t":{"103":{"position":[[182,11]]}}}],["maloja_url",{"_index":1173,"t":{"103":{"position":[[313,10]]}}}],["maloja_url=\"http://domain.tld",{"_index":2986,"t":{"482":{"position":[[1874,30]]}}}],["maloja_url=http://192.168.0.100:42010",{"_index":2742,"t":{"403":{"position":[[899,37]]},"538":{"position":[[2405,37]]},"557":{"position":[[2029,37]]}}}],["maloja_url=http://domain.tld:42010",{"_index":2952,"t":{"478":{"position":[[846,34]]}}}],["malojadata",{"_index":1162,"t":{"101":{"position":[[291,12]]},"538":{"position":[[2049,12]]}}}],["malojadata/dock",{"_index":1159,"t":{"101":{"position":[[125,19]]},"538":{"position":[[1883,19]]}}}],["manag",{"_index":2251,"t":{"303":{"position":[[1102,10]]},"375":{"position":[[144,6]]},"501":{"position":[[30,7]]},"507":{"position":[[85,9]]},"596":{"position":[[2206,6]]}}}],["mani",{"_index":492,"t":{"29":{"position":[[165,4],[965,4]]},"109":{"position":[[889,4]]},"116":{"position":[[887,4]]},"150":{"position":[[51,4]]},"160":{"position":[[87,4]]},"166":{"position":[[1177,4]]},"222":{"position":[[181,4],[206,4],[221,4],[253,4],[268,4],[2557,4],[2572,4]]},"242":{"position":[[181,4],[206,4],[221,4],[248,4],[263,4],[2542,4],[2557,4]]},"248":{"position":[[168,4]]},"283":{"position":[[67,4]]},"347":{"position":[[159,4]]},"470":{"position":[[2255,4]]},"532":{"position":[[332,4]]},"534":{"position":[[65,4]]},"544":{"position":[[764,4]]},"546":{"position":[[161,4]]},"561":{"position":[[1277,4],[6456,4]]},"596":{"position":[[138,4],[575,4],[2137,4]]},"635":{"position":[[131,4]]}}}],["manner",{"_index":1113,"t":{"87":{"position":[[1130,6]]}}}],["manual",{"_index":1378,"t":{"140":{"position":[[704,9],[1070,8],[1129,8],[1612,8]]},"166":{"position":[[758,8]]},"168":{"position":[[84,8]]},"196":{"position":[[2878,8],[3178,6]]},"210":{"position":[[804,9],[1168,8],[1227,8],[2045,8]]},"303":{"position":[[3618,8]]},"442":{"position":[[47,8]]},"510":{"position":[[69,6]]},"512":{"position":[[295,8]]}}}],["map",{"_index":629,"t":{"38":{"position":[[791,9],[1144,9]]},"476":{"position":[[786,3]]}}}],["march",{"_index":2245,"t":{"303":{"position":[[536,5]]}}}],["mari",{"_index":1462,"t":{"152":{"position":[[286,5],[343,4],[457,4],[796,6],[892,7],[1169,6],[2030,6],[2128,7],[2432,6]]},"162":{"position":[[381,4]]}}}],["mark",{"_index":1702,"t":{"172":{"position":[[3733,6]]},"561":{"position":[[7081,6]]}}}],["markdown",{"_index":3000,"t":{"492":{"position":[[540,8]]}}}],["maryapikey",{"_index":1472,"t":{"152":{"position":[[1230,13],[2493,13]]}}}],["maryjf",{"_index":1468,"t":{"152":{"position":[[778,9],[2012,9]]}}}],["marylfm",{"_index":1469,"t":{"152":{"position":[[825,12],[1150,10],[2061,9],[2413,10]]}}}],["marysecret",{"_index":1473,"t":{"152":{"position":[[1254,13],[2517,13]]}}}],["master",{"_index":3050,"t":{"520":{"position":[[12,6]]},"522":{"position":[[313,6]]},"524":{"position":[[546,6]]}}}],["match",{"_index":156,"t":{"15":{"position":[[218,5]]},"19":{"position":[[382,8],[1632,8]]},"65":{"position":[[3155,9]]},"79":{"position":[[3330,9]]},"109":{"position":[[1979,7],[2126,8]]},"172":{"position":[[1127,8],[1285,8],[1980,8],[3706,5],[3757,5],[4123,5],[4142,5],[4439,5],[4472,5],[4713,8]]},"174":{"position":[[779,5]]},"179":{"position":[[625,5]]},"188":{"position":[[319,5]]},"190":{"position":[[103,5]]},"196":{"position":[[2694,5]]},"198":{"position":[[2066,5]]},"204":{"position":[[424,7]]},"216":{"position":[[430,7]]},"228":{"position":[[332,5]]},"257":{"position":[[591,5]]},"283":{"position":[[801,5]]},"285":{"position":[[219,7]]},"289":{"position":[[690,7]]},"309":{"position":[[81,5],[172,5],[195,8],[261,5],[297,5],[423,7],[541,8]]},"311":{"position":[[230,7]]},"319":{"position":[[1378,8],[1502,7]]},"325":{"position":[[64,7],[560,7]]},"341":{"position":[[294,9]]},"347":{"position":[[96,8]]},"355":{"position":[[363,5]]},"361":{"position":[[1361,5]]},"363":{"position":[[243,5],[550,8],[632,8],[728,8],[810,8],[892,5],[969,5],[1457,7]]},"397":{"position":[[456,7]]},"416":{"position":[[59,7],[203,7],[227,6],[366,5],[484,5],[690,7]]},"421":{"position":[[94,7]]},"532":{"position":[[39,5],[690,7]]},"534":{"position":[[423,7]]},"544":{"position":[[22,7],[83,5],[140,5]]},"553":{"position":[[31,8]]},"557":{"position":[[831,5],[848,5]]},"559":{"position":[[146,8],[310,7],[356,5]]},"561":{"position":[[967,7],[1192,6],[1312,6],[1337,7],[6114,5],[6569,7],[6650,7],[6750,6]]},"564":{"position":[[5,5],[186,8],[234,7]]},"566":{"position":[[222,5],[493,6],[1203,7],[1776,7],[1806,8],[1997,5]]},"568":{"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]]},"573":{"position":[[130,8],[154,5],[295,5]]},"575":{"position":[[126,9],[367,8],[424,5],[1408,8],[1481,8],[1759,7]]},"577":{"position":[[156,5],[267,5],[395,8],[441,5],[537,7]]},"579":{"position":[[31,5],[218,7]]},"581":{"position":[[32,7],[75,5]]},"588":{"position":[[150,5],[229,5]]},"590":{"position":[[177,7],[829,5]]},"592":{"position":[[133,7],[1176,7]]},"596":{"position":[[2397,5]]}}}],["match/correct",{"_index":3247,"t":{"575":{"position":[[1591,13]]}}}],["match/record",{"_index":3238,"t":{"568":{"position":[[2983,16]]}}}],["matches/releas",{"_index":3214,"t":{"568":{"position":[[91,16]]}}}],["maximum",{"_index":1843,"t":{"196":{"position":[[2839,7]]}}}],["maxpollretri",{"_index":283,"t":{"15":{"position":[[4716,17]]}}}],["maxrequestretri",{"_index":285,"t":{"15":{"position":[[4737,20],[4807,20]]}}}],["mayb",{"_index":3255,"t":{"588":{"position":[[462,5]]},"592":{"position":[[593,5]]}}}],["mb_contact",{"_index":3148,"t":{"557":{"position":[[166,10]]}}}],["mb_contact=contact@mydomain.com",{"_index":1480,"t":{"154":{"position":[[894,31]]},"557":{"position":[[211,31],[1607,31]]},"594":{"position":[[374,31]]}}}],["mb_contact=mycoolname@emailprovider.com",{"_index":3086,"t":{"532":{"position":[[611,39]]},"534":{"position":[[344,39]]}}}],["mb_contact=myemail@myemailprovider.com",{"_index":2313,"t":{"311":{"position":[[619,38]]}}}],["mb_preset",{"_index":3149,"t":{"557":{"position":[[275,10]]}}}],["mb_presets=default,sensible,n",{"_index":1486,"t":{"154":{"position":[[1045,34]]},"532":{"position":[[771,34]]},"534":{"position":[[504,34]]},"557":{"position":[[1743,34]]}}}],["mb_presets=id,default",{"_index":2314,"t":{"311":{"position":[[660,21]]}}}],["mb_presets=id,native,sens",{"_index":3260,"t":{"594":{"position":[[408,29]]}}}],["mbid",{"_index":937,"t":{"65":{"position":[[2928,4],[3062,5],[3279,5]]},"79":{"position":[[3103,4],[3237,5],[3454,5]]},"190":{"position":[[288,4]]},"311":{"position":[[4,4]]},"359":{"position":[[644,7]]},"544":{"position":[[515,5]]},"555":{"position":[[786,5]]},"561":{"position":[[95,5],[594,5],[2069,4],[2142,4],[2190,5],[2288,4],[2509,6],[2669,5],[2817,5]]},"575":{"position":[[1702,5],[1788,4]]},"579":{"position":[[243,5]]},"588":{"position":[[811,5]]},"592":{"position":[[23,5]]},"594":{"position":[[109,5]]}}}],["mbidrecord",{"_index":2319,"t":{"311":{"position":[[1136,17],[1622,17]]},"557":{"position":[[630,13]]},"561":{"position":[[1654,16],[2074,15],[2308,17]]},"575":{"position":[[1016,13],[1883,13]]}}}],["mc_enabl",{"_index":2123,"t":{"273":{"position":[[243,9]]}}}],["mc_id",{"_index":2121,"t":{"273":{"position":[[127,5],[202,5]]}}}],["mc_name",{"_index":2122,"t":{"273":{"position":[[178,7]]}}}],["mc_password",{"_index":2125,"t":{"273":{"position":[[394,11]]}}}],["mc_url",{"_index":2124,"t":{"273":{"position":[[297,6]]}}}],["mcast_en",{"_index":2710,"t":{"393":{"position":[[252,12]]}}}],["mcast_id",{"_index":2708,"t":{"393":{"position":[[127,8],[208,8]]}}}],["mcast_nam",{"_index":2709,"t":{"393":{"position":[[181,10]]}}}],["mcast_url",{"_index":2711,"t":{"393":{"position":[[309,9]]}}}],["mdn",{"_index":1578,"t":{"166":{"position":[[843,5],[849,4],[934,4]]}}}],["mean",{"_index":164,"t":{"15":{"position":[[400,5]]},"42":{"position":[[282,5]]},"65":{"position":[[2626,5]]},"75":{"position":[[1523,5]]},"79":{"position":[[2801,5]]},"109":{"position":[[1500,7]]},"116":{"position":[[1494,7]]},"134":{"position":[[377,5]]},"152":{"position":[[104,5]]},"190":{"position":[[269,4],[543,5]]},"204":{"position":[[302,5]]},"216":{"position":[[306,5]]},"220":{"position":[[451,5]]},"283":{"position":[[659,5]]},"343":{"position":[[96,5]]},"397":{"position":[[1201,5]]},"448":{"position":[[38,5],[1299,5]]},"452":{"position":[[102,5],[174,5],[243,5],[334,5]]},"457":{"position":[[281,5]]},"561":{"position":[[6086,5]]},"575":{"position":[[225,5]]}}}],["meant",{"_index":577,"t":{"29":{"position":[[3883,5]]},"67":{"position":[[1785,5],[3149,5]]},"81":{"position":[[2026,5],[3432,5]]},"85":{"position":[[1521,5],[2917,5]]},"91":{"position":[[1690,5],[3149,5]]},"99":{"position":[[1792,5],[3211,5]]},"103":{"position":[[1463,5],[2830,5]]},"107":{"position":[[1605,5],[3048,5]]},"114":{"position":[[2717,5],[4146,5]]},"121":{"position":[[2076,5],[3443,5]]},"144":{"position":[[1607,5],[3027,5]]},"164":{"position":[[1616,5],[3043,5]]},"168":{"position":[[1961,5],[3329,5]]},"200":{"position":[[1848,5],[3533,5]]},"206":{"position":[[1581,5],[2938,5]]},"208":{"position":[[4736,5],[6554,5]]},"212":{"position":[[1456,5],[2776,5]]},"218":{"position":[[1625,5],[2969,5]]},"232":{"position":[[1724,5],[3038,5]]},"236":{"position":[[2002,5],[3461,5]]},"238":{"position":[[2178,5],[3574,5]]},"257":{"position":[[1793,5],[3115,5]]},"261":{"position":[[2114,5],[3533,5]]},"265":{"position":[[1928,5],[3371,5]]},"269":{"position":[[1761,5],[3128,5]]},"273":{"position":[[1586,5],[2951,5]]},"277":{"position":[[1583,5],[2915,5]]},"281":{"position":[[1541,5],[2896,5]]},"289":{"position":[[1820,5],[3181,5]]},"295":{"position":[[2012,5],[3441,5]]},"301":{"position":[[2054,5],[3468,5]]},"305":{"position":[[1607,5],[3069,5]]},"317":{"position":[[1590,5],[3044,5]]},"321":{"position":[[1460,5],[2766,5]]},"329":{"position":[[1550,5],[2903,5]]},"333":{"position":[[1564,5],[2927,5]]},"341":{"position":[[3247,5],[4672,5]]},"345":{"position":[[1702,5],[3170,5]]},"393":{"position":[[1467,5],[2787,5]]}}}],["measur",{"_index":501,"t":{"29":{"position":[[453,7]]}}}],["mechan",{"_index":3482,"t":{"653":{"position":[[1241,9]]}}}],["media",{"_index":1571,"t":{"166":{"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]]},"192":{"position":[[252,5]]},"194":{"position":[[415,5]]},"196":{"position":[[2532,5],[3666,5]]},"200":{"position":[[2323,5],[4017,5]]},"208":{"position":[[774,5],[1053,5],[1101,5],[3603,5]]},"214":{"position":[[157,5],[181,5]]},"216":{"position":[[479,5]]},"275":{"position":[[157,5],[297,5]]},"307":{"position":[[1415,5]]},"317":{"position":[[494,5]]},"466":{"position":[[77,5],[138,5],[216,5],[294,5],[363,5],[407,5]]},"635":{"position":[[60,5]]}}}],["mediausertoken",{"_index":1797,"t":{"194":{"position":[[4,14],[499,14]]},"196":{"position":[[2508,17],[3642,17]]},"200":{"position":[[2299,17],[3993,17]]}}}],["meet",{"_index":1334,"t":{"128":{"position":[[988,5]]}}}],["melendi",{"_index":1668,"t":{"172":{"position":[[1474,8],[1580,8]]}}}],["membership",{"_index":1848,"t":{"196":{"position":[[3413,10]]}}}],["memori",{"_index":413,"t":{"23":{"position":[[107,6]]},"42":{"position":[[400,6]]},"368":{"position":[[245,7],[409,6]]},"389":{"position":[[276,6]]},"476":{"position":[[2472,6]]},"542":{"position":[[165,6]]},"571":{"position":[[97,6]]}}}],["memorysourc",{"_index":3365,"t":{"640":{"position":[[266,12],[378,12],[485,12]]},"644":{"position":[[382,12]]},"646":{"position":[[403,12],[1663,12],[2301,12]]},"648":{"position":[[584,12],[949,12],[1025,12],[1730,12]]},"651":{"position":[[485,12]]},"653":{"position":[[928,12],[1584,12]]}}}],["memorysource.j",{"_index":3366,"t":{"640":{"position":[[284,20]]}}}],["mendhak/http",{"_index":2273,"t":{"303":{"position":[[3768,12],[3923,12],[4549,12]]}}}],["mention",{"_index":1773,"t":{"182":{"position":[[20,9]]},"204":{"position":[[477,9]]},"331":{"position":[[1294,7]]}}}],["menu",{"_index":2305,"t":{"309":{"position":[[337,5],[464,4]]},"319":{"position":[[102,4]]}}}],["messag",{"_index":628,"t":{"38":{"position":[[737,7],[1090,7]]},"40":{"position":[[512,8]]},"646":{"position":[[2607,7]]}}}],["met",{"_index":1351,"t":{"134":{"position":[[1030,4]]},"140":{"position":[[1523,4]]},"564":{"position":[[179,3]]}}}],["meta",{"_index":2559,"t":{"359":{"position":[[588,7],[639,4]]},"363":{"position":[[1067,4]]},"365":{"position":[[985,4]]},"555":{"position":[[753,7]]},"579":{"position":[[255,4],[606,7]]},"588":{"position":[[257,4],[760,7]]},"644":{"position":[[935,5]]}}}],["metadata",{"_index":428,"t":{"23":{"position":[[669,10]]},"27":{"position":[[321,8]]},"109":{"position":[[1859,8]]},"166":{"position":[[1652,8]]},"198":{"position":[[2072,9]]},"210":{"position":[[6,8],[204,8],[263,8],[1728,8],[1877,8],[2124,8]]},"220":{"position":[[580,8]]},"271":{"position":[[99,8],[343,8]]},"273":{"position":[[362,10]]},"311":{"position":[[217,9],[384,8]]},"319":{"position":[[2271,8],[2345,8]]},"385":{"position":[[271,8]]},"468":{"position":[[34,8]]},"544":{"position":[[534,9]]},"571":{"position":[[17,8]]},"588":{"position":[[797,8]]},"625":{"position":[[481,8],[509,8],[873,11],[1247,9]]}}}],["metdata",{"_index":1217,"t":{"109":{"position":[[1782,7]]}}}],["method",{"_index":163,"t":{"15":{"position":[[393,6]]},"55":{"position":[[3276,6],[3528,6],[3807,7],[3937,6],[5522,6],[5678,6],[6744,6],[6908,6],[7064,6],[7268,7],[8620,6],[8975,6],[9167,6],[9323,6],[10124,6]]},"128":{"position":[[100,7]]},"142":{"position":[[211,7]]},"156":{"position":[[36,7],[146,7]]},"158":{"position":[[240,7]]},"196":{"position":[[619,6]]},"275":{"position":[[1308,6]]},"303":{"position":[[2402,7],[3026,6]]},"311":{"position":[[408,7]]},"343":{"position":[[523,7],[4896,6]]},"440":{"position":[[140,6]]},"470":{"position":[[496,6]]},"530":{"position":[[745,6]]},"542":{"position":[[58,7]]},"557":{"position":[[583,7]]},"561":{"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]]},"575":{"position":[[99,7],[968,7],[1181,7],[1270,7],[1934,7],[2018,7],[2058,8]]},"638":{"position":[[2101,7]]}}}],["metric",{"_index":669,"t":{"42":{"position":[[105,7],[264,7],[341,7],[379,7],[876,7]]},"134":{"position":[[1114,7]]}}}],["metrics_path",{"_index":690,"t":{"42":{"position":[[703,13]]}}}],["migrat",{"_index":479,"t":{"27":{"position":[[245,9]]},"510":{"position":[[400,9]]},"512":{"position":[[128,10],[219,9]]},"516":{"position":[[178,9]]},"518":{"position":[[387,9]]},"623":{"position":[[297,9],[669,7],[807,10],[858,7],[1480,9]]},"629":{"position":[[514,9]]},"631":{"position":[[464,9]]}}}],["million",{"_index":3114,"t":{"544":{"position":[[640,8],[658,8],[678,8]]},"546":{"position":[[37,8],[55,8],[75,8]]}}}],["millisecond",{"_index":2325,"t":{"315":{"position":[[88,11]]}}}],["mind",{"_index":2541,"t":{"353":{"position":[[573,4]]},"596":{"position":[[2007,4]]}}}],["minim",{"_index":505,"t":{"29":{"position":[[513,7],[585,7]]},"355":{"position":[[547,9]]},"648":{"position":[[3033,9]]}}}],["minimum",{"_index":2647,"t":{"381":{"position":[[58,7]]},"564":{"position":[[152,7]]}}}],["minor",{"_index":1707,"t":{"172":{"position":[[3816,6],[3932,6],[4250,6],[4371,6]]},"510":{"position":[[458,5]]},"512":{"position":[[430,5]]},"514":{"position":[[0,5]]},"518":{"position":[[74,5],[420,5]]}}}],["minut",{"_index":77,"t":{"9":{"position":[[128,7]]},"29":{"position":[[2362,7],[2428,7],[2960,7],[3005,7],[3291,7],[3377,9],[4337,7],[4403,7],[4816,7],[4861,7],[5048,7],[5133,9]]},"36":{"position":[[258,7]]},"134":{"position":[[1281,7]]},"343":{"position":[[4197,7]]},"470":{"position":[[3308,7]]}}}],["mirror",{"_index":1780,"t":{"186":{"position":[[447,7]]},"530":{"position":[[3183,6]]},"573":{"position":[[311,6]]}}}],["misbehav",{"_index":2856,"t":{"452":{"position":[[736,12],[908,11]]}}}],["mishav",{"_index":2860,"t":{"452":{"position":[[1110,9]]}}}],["miss",{"_index":364,"t":{"19":{"position":[[1358,7],[1545,7]]},"55":{"position":[[1157,7]]},"172":{"position":[[5136,6]]},"204":{"position":[[242,7]]},"216":{"position":[[246,7]]},"283":{"position":[[599,7]]},"343":{"position":[[338,6]]},"532":{"position":[[92,7]]},"542":{"position":[[539,7]]},"544":{"position":[[169,7]]},"561":{"position":[[262,7],[624,7],[792,7]]},"594":{"position":[[196,7]]},"651":{"position":[[36,8]]}}}],["mistak",{"_index":2751,"t":{"412":{"position":[[337,8]]}}}],["misus",{"_index":1003,"t":{"69":{"position":[[655,6]]}}}],["mit",{"_index":3282,"t":{"616":{"position":[[0,3]]}}}],["mix",{"_index":155,"t":{"15":{"position":[[210,3]]},"174":{"position":[[883,5]]},"208":{"position":[[988,5]]},"303":{"position":[[195,7]]},"365":{"position":[[828,4]]}}}],["mixcloud",{"_index":2189,"t":{"287":{"position":[[388,11]]}}}],["mkdir",{"_index":3018,"t":{"503":{"position":[[70,5]]}}}],["mobil",{"_index":770,"t":{"55":{"position":[[1168,6]]},"67":{"position":[[1613,6],[2941,6]]},"81":{"position":[[1854,6],[3224,6]]},"85":{"position":[[1351,6],[2711,6]]},"91":{"position":[[1519,6],[2942,6]]},"99":{"position":[[1620,6],[3003,6]]},"103":{"position":[[1292,6],[2623,6]]},"107":{"position":[[1428,6],[2835,6]]},"114":{"position":[[2545,6],[3938,6]]},"121":{"position":[[1905,6],[3236,6]]},"144":{"position":[[1433,6],[2817,6]]},"164":{"position":[[1445,6],[2836,6]]},"168":{"position":[[1786,6],[3118,6]]},"200":{"position":[[1673,6],[3322,6]]},"206":{"position":[[1412,6],[2733,6]]},"208":{"position":[[4563,6],[6345,6]]},"212":{"position":[[1284,6],[2568,6]]},"218":{"position":[[1454,6],[2762,6]]},"226":{"position":[[280,6]]},"232":{"position":[[1548,6],[2826,6]]},"236":{"position":[[1831,6],[3254,6]]},"238":{"position":[[2008,6],[3368,6]]},"257":{"position":[[1618,6],[2904,6]]},"261":{"position":[[1942,6],[3325,6]]},"265":{"position":[[1751,6],[3158,6]]},"269":{"position":[[1590,6],[2921,6]]},"273":{"position":[[1412,6],[2741,6]]},"277":{"position":[[1413,6],[2709,6]]},"281":{"position":[[1373,6],[2692,6]]},"289":{"position":[[1649,6],[2974,6]]},"295":{"position":[[1840,6],[3233,6]]},"301":{"position":[[1884,6],[3262,6]]},"305":{"position":[[1435,6],[2861,6]]},"317":{"position":[[1417,6],[2835,6]]},"321":{"position":[[1292,6],[2562,6]]},"329":{"position":[[1373,6],[2690,6]]},"333":{"position":[[1391,6],[2718,6]]},"341":{"position":[[3076,6],[4465,6]]},"345":{"position":[[1530,6],[2962,6]]},"393":{"position":[[1293,6],[2577,6]]},"470":{"position":[[2751,7]]},"596":{"position":[[1750,6]]}}}],["mode",{"_index":590,"t":{"31":{"position":[[17,4],[285,4],[323,4],[418,4]]},"67":{"position":[[1108,4],[1151,4],[1256,5],[2600,4],[2643,4],[2748,5]]},"81":{"position":[[1349,4],[1392,4],[1497,5],[2883,4],[2926,4],[3031,5]]},"85":{"position":[[852,4],[895,4],[1000,5],[2370,4],[2413,4],[2518,5]]},"91":{"position":[[1017,4],[1060,4],[1165,5],[2601,4],[2644,4],[2749,5]]},"99":{"position":[[1115,4],[1158,4],[1263,5],[2662,4],[2705,4],[2810,5]]},"103":{"position":[[790,4],[833,4],[938,5],[2282,4],[2325,4],[2430,5]]},"107":{"position":[[908,4],[951,4],[1056,5],[2494,4],[2537,4],[2642,5]]},"114":{"position":[[2040,4],[2083,4],[2188,5],[3597,4],[3640,4],[3745,5]]},"121":{"position":[[1403,4],[1446,4],[1551,5],[2895,4],[2938,4],[3043,5]]},"144":{"position":[[922,4],[965,4],[1070,5],[2476,4],[2519,4],[2624,5]]},"154":{"position":[[1037,5]]},"164":{"position":[[943,4],[986,4],[1091,5],[2495,4],[2538,4],[2643,5]]},"166":{"position":[[3450,5]]},"168":{"position":[[1272,4],[1315,4],[1420,5],[2777,4],[2820,4],[2925,5]]},"200":{"position":[[1159,4],[1202,4],[1307,5],[2981,4],[3024,4],[3129,5]]},"206":{"position":[[916,4],[959,4],[1064,5],[2392,4],[2435,4],[2540,5]]},"208":{"position":[[4055,4],[4098,4],[4203,5],[6004,4],[6047,4],[6152,5]]},"212":{"position":[[779,4],[822,4],[927,5],[2227,4],[2270,4],[2375,5]]},"218":{"position":[[952,4],[995,4],[1100,5],[2421,4],[2464,4],[2569,5]]},"232":{"position":[[1031,4],[1074,4],[1179,5],[2485,4],[2528,4],[2633,5]]},"236":{"position":[[1073,4],[1116,4],[1221,5],[2913,4],[2956,4],[3061,5]]},"238":{"position":[[1256,4],[1299,4],[1404,5],[3027,4],[3070,4],[3175,5]]},"257":{"position":[[1104,4],[1147,4],[1252,5],[2563,4],[2606,4],[2711,5]]},"261":{"position":[[1178,4],[1221,4],[1326,5],[2984,4],[3027,4],[3132,5]]},"265":{"position":[[957,4],[1000,4],[1105,5],[2817,4],[2860,4],[2965,5]]},"269":{"position":[[832,4],[875,4],[980,5],[2580,4],[2623,4],[2728,5]]},"273":{"position":[[901,4],[944,4],[1049,5],[2400,4],[2443,4],[2548,5]]},"277":{"position":[[914,4],[957,4],[1062,5],[2368,4],[2411,4],[2516,5]]},"281":{"position":[[880,4],[923,4],[1028,5],[2351,4],[2394,4],[2499,5]]},"289":{"position":[[1147,4],[1190,4],[1295,5],[2633,4],[2676,4],[2781,5]]},"295":{"position":[[1076,4],[1119,4],[1224,5],[2892,4],[2935,4],[3040,5]]},"297":{"position":[[1266,4]]},"301":{"position":[[1385,4],[1428,4],[1533,5],[2921,4],[2964,4],[3069,5]]},"305":{"position":[[930,4],[973,4],[1078,5],[2520,4],[2563,4],[2668,5]]},"317":{"position":[[909,4],[952,4],[1057,5],[2494,4],[2537,4],[2642,5]]},"321":{"position":[[799,4],[842,4],[947,5],[2221,4],[2264,4],[2369,5]]},"329":{"position":[[853,4],[896,4],[1001,5],[2349,4],[2392,4],[2497,5]]},"333":{"position":[[883,4],[926,4],[1031,5],[2377,4],[2420,4],[2525,5]]},"341":{"position":[[2318,4],[2361,4],[2466,5],[4124,4],[4167,4],[4272,5]]},"345":{"position":[[1025,4],[1068,4],[1173,5],[2621,4],[2664,4],[2769,5]]},"393":{"position":[[782,4],[825,4],[930,5],[2236,4],[2279,4],[2384,5]]},"490":{"position":[[27,4],[64,4],[153,4]]},"499":{"position":[[585,4]]},"557":{"position":[[716,4],[1735,5]]},"561":{"position":[[3845,4],[4104,5],[4153,4],[4473,4],[5139,4],[5423,4]]},"573":{"position":[[677,4]]},"581":{"position":[[176,4]]},"642":{"position":[[927,5]]}}}],["modern",{"_index":3269,"t":{"596":{"position":[[1423,10]]}}}],["modif",{"_index":1791,"t":{"190":{"position":[[518,14]]},"275":{"position":[[750,13]]},"353":{"position":[[1283,13]]},"361":{"position":[[205,12]]},"401":{"position":[[210,12]]},"414":{"position":[[542,12]]},"421":{"position":[[27,12]]},"581":{"position":[[393,12],[510,12]]}}}],["modifi",{"_index":781,"t":{"55":{"position":[[1739,6]]},"59":{"position":[[338,6]]},"87":{"position":[[948,9]]},"114":{"position":[[887,6]]},"160":{"position":[[149,6]]},"177":{"position":[[460,6]]},"179":{"position":[[244,6]]},"190":{"position":[[112,6],[196,9],[274,9],[728,8]]},"275":{"position":[[1081,6]]},"303":{"position":[[298,8]]},"319":{"position":[[858,6]]},"351":{"position":[[234,6]]},"353":{"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]]},"355":{"position":[[100,9]]},"397":{"position":[[490,9]]},"410":{"position":[[418,6]]},"482":{"position":[[1494,6],[2373,8]]},"530":{"position":[[2266,6]]},"532":{"position":[[1577,6]]},"536":{"position":[[715,6]]},"588":{"position":[[44,8]]},"642":{"position":[[191,6]]}}}],["modify/replac",{"_index":2750,"t":{"412":{"position":[[72,14]]}}}],["modul",{"_index":2344,"t":{"319":{"position":[[56,6],[262,7]]}}}],["monitor",{"_index":95,"t":{"11":{"position":[[62,10]]},"36":{"position":[[18,10],[150,7]]},"40":{"position":[[16,10]]},"44":{"position":[[111,10]]},"50":{"position":[[111,10]]},"69":{"position":[[111,10],[504,10]]},"83":{"position":[[14,7]]},"87":{"position":[[15,7]]},"93":{"position":[[15,7]]},"105":{"position":[[15,7]]},"109":{"position":[[14,7]]},"116":{"position":[[14,7]]},"125":{"position":[[84,10]]},"128":{"position":[[284,7],[1244,8]]},"130":{"position":[[156,7]]},"134":{"position":[[1070,8]]},"136":{"position":[[196,7],[369,7],[462,10]]},"140":{"position":[[633,10],[683,10],[789,10],[862,10],[1054,7],[1113,7],[1249,10],[1480,7],[1563,10]]},"142":{"position":[[1128,7]]},"144":{"position":[[354,7]]},"162":{"position":[[20,7],[535,7],[864,10],[1200,9]]},"164":{"position":[[440,8]]},"166":{"position":[[102,7]]},"172":{"position":[[2728,10],[3459,9]]},"192":{"position":[[12,8]]},"210":{"position":[[598,10],[652,10],[733,10],[783,10],[889,10],[962,10],[1152,7],[1211,7],[1295,10],[1355,8]]},"220":{"position":[[177,7]]},"234":{"position":[[12,8]]},"238":{"position":[[12,8]]},"240":{"position":[[415,7]]},"259":{"position":[[12,8]]},"263":{"position":[[12,8]]},"279":{"position":[[257,7]]},"291":{"position":[[158,8]]},"297":{"position":[[47,7],[769,7],[929,10],[1896,7]]},"331":{"position":[[0,7]]},"335":{"position":[[237,8]]},"343":{"position":[[248,10],[5474,11]]},"391":{"position":[[0,7]]},"526":{"position":[[297,10]]},"530":{"position":[[55,8],[1299,10],[4086,10]]},"540":{"position":[[304,7]]},"596":{"position":[[22,8],[113,10],[771,7]]},"598":{"position":[[78,8]]},"640":{"position":[[978,9]]},"648":{"position":[[27,8],[382,10]]}}}],["monitoring/webhook",{"_index":252,"t":{"15":{"position":[[3736,20]]}}}],["monitorwhenl",{"_index":1381,"t":{"140":{"position":[[1348,16]]},"144":{"position":[[1937,18],[3367,18]]}}}],["monitorwhenlisten",{"_index":1383,"t":{"140":{"position":[[1407,21]]},"144":{"position":[[1962,23],[3392,23]]}}}],["monoloth",{"_index":2730,"t":{"397":{"position":[[426,10]]}}}],["mopidi",{"_index":1311,"t":{"125":{"position":[[619,6]]},"283":{"position":[[0,6],[197,6],[279,6],[375,6],[741,6],[828,6],[1031,7]]},"285":{"position":[[82,6],[434,6]]},"287":{"position":[[33,6]]},"289":{"position":[[373,6],[858,6],[1065,6],[1405,6],[1485,6],[1709,6],[2008,7],[2378,6],[2570,6],[3089,6],[3382,7],[3536,8]]},"596":{"position":[[320,6]]}}}],["mopidy.conf",{"_index":2174,"t":{"283":{"position":[[854,12]]}}}],["mopidy.mydomain.com",{"_index":2176,"t":{"283":{"position":[[1100,19]]}}}],["mopidy.mydomain.com:80/mopw",{"_index":2179,"t":{"283":{"position":[[1215,28]]}}}],["mopidy_album_denylist",{"_index":2197,"t":{"289":{"position":[[627,21]]}}}],["mopidy_en",{"_index":2192,"t":{"289":{"position":[[255,13]]}}}],["mopidy_id",{"_index":2190,"t":{"289":{"position":[[127,9],[210,9]]}}}],["mopidy_nam",{"_index":2191,"t":{"289":{"position":[[182,11]]}}}],["mopidy_uri_allowlist",{"_index":2196,"t":{"289":{"position":[[517,20]]}}}],["mopidy_uri_denylist",{"_index":2194,"t":{"289":{"position":[[406,19]]}}}],["mopidy_url",{"_index":2193,"t":{"289":{"position":[[313,10]]}}}],["more",{"_index":202,"t":{"15":{"position":[[1542,4],[1741,4],[1855,4],[4087,4]]},"25":{"position":[[91,5]]},"46":{"position":[[151,4]]},"48":{"position":[[228,4]]},"77":{"position":[[97,4]]},"114":{"position":[[751,4]]},"134":{"position":[[971,4],[1221,5],[1292,5],[1574,4],[1633,4]]},"147":{"position":[[393,4]]},"152":{"position":[[50,4]]},"158":{"position":[[407,4]]},"160":{"position":[[666,4]]},"172":{"position":[[5322,5]]},"190":{"position":[[141,4]]},"198":{"position":[[2398,4]]},"208":{"position":[[945,4],[1216,4]]},"220":{"position":[[619,4]]},"222":{"position":[[609,4],[1039,4],[1806,4],[3343,4]]},"228":{"position":[[22,4]]},"242":{"position":[[594,4],[1018,4],[1791,4],[3302,4]]},"248":{"position":[[22,4]]},"291":{"position":[[270,4]]},"309":{"position":[[370,4]]},"313":{"position":[[543,4],[569,4]]},"335":{"position":[[349,4]]},"343":{"position":[[407,4]]},"351":{"position":[[254,4]]},"355":{"position":[[31,4]]},"363":{"position":[[1005,4]]},"385":{"position":[[697,4]]},"397":{"position":[[1320,4]]},"431":{"position":[[385,4]]},"460":{"position":[[258,4]]},"464":{"position":[[329,4]]},"478":{"position":[[422,4]]},"482":{"position":[[1734,4]]},"484":{"position":[[119,4]]},"490":{"position":[[82,4]]},"499":{"position":[[519,4]]},"530":{"position":[[3109,4],[3225,4]]},"538":{"position":[[801,4]]},"542":{"position":[[4,4],[269,4]]},"544":{"position":[[577,4],[769,4],[1001,4],[1139,4],[1222,4],[1360,4]]},"546":{"position":[[166,4],[398,4]]},"548":{"position":[[43,4],[126,4],[264,4]]},"551":{"position":[[477,4]]},"557":{"position":[[344,4]]},"568":{"position":[[2208,4],[2374,4],[2760,4]]},"573":{"position":[[278,4]]},"575":{"position":[[386,4],[1253,4],[1282,4],[1343,4]]},"592":{"position":[[868,4]]},"596":{"position":[[1933,4]]},"598":{"position":[[37,4],[61,4]]},"621":{"position":[[199,7],[262,7]]},"631":{"position":[[571,4]]},"648":{"position":[[1426,4]]}}}],["mount",{"_index":438,"t":{"23":{"position":[[1102,5],[1138,7]]},"25":{"position":[[567,5]]},"55":{"position":[[1476,5],[1589,5],[1684,7]]},"59":{"position":[[75,5],[188,5],[283,7]]},"275":{"position":[[916,5]]},"373":{"position":[[135,6]]},"476":{"position":[[404,8]]}}}],["move",{"_index":826,"t":{"55":{"position":[[3240,4]]},"61":{"position":[[464,4]]},"301":{"position":[[2337,7],[3765,7]]},"442":{"position":[[342,4],[528,4]]},"470":{"position":[[1837,5],[1927,5],[2027,5],[2110,5]]}}}],["movi",{"_index":2875,"t":{"466":{"position":[[355,7]]}}}],["mozilla/5.0",{"_index":1561,"t":{"164":{"position":[[474,11]]},"448":{"position":[[531,11],[742,11]]}}}],["mpd",{"_index":1312,"t":{"125":{"position":[[650,3]]},"277":{"position":[[1852,5],[3198,5]]},"279":{"position":[[21,3],[117,3]]},"281":{"position":[[347,3],[597,3],[801,3],[1138,3],[1215,3],[1433,3],[2102,3],[2291,3],[2807,3],[3257,5]]},"596":{"position":[[327,3]]}}}],["mpd_enabl",{"_index":2158,"t":{"281":{"position":[[246,10]]}}}],["mpd_id",{"_index":2156,"t":{"281":{"position":[[127,6],[204,6]]}}}],["mpd_name",{"_index":2157,"t":{"281":{"position":[[179,8]]}}}],["mpd_password",{"_index":2162,"t":{"281":{"position":[[372,12]]}}}],["mpd_url",{"_index":2159,"t":{"281":{"position":[[301,7]]}}}],["mpri",{"_index":2130,"t":{"275":{"position":[[0,5],[211,6],[357,6],[376,5],[575,5],[877,6]]},"277":{"position":[[627,5],[833,5],[1172,5],[1251,5],[1473,5],[2115,5],[2306,5],[2824,5],[3245,7]]},"596":{"position":[[353,5]]}}}],["mpris_blacklist",{"_index":2147,"t":{"277":{"position":[[309,15]]}}}],["mpris_en",{"_index":2146,"t":{"277":{"position":[[252,12]]}}}],["mpris_id",{"_index":2144,"t":{"277":{"position":[[127,8],[208,8]]}}}],["mpris_nam",{"_index":2145,"t":{"277":{"position":[[181,10]]}}}],["mpris_whitelist",{"_index":2148,"t":{"277":{"position":[[419,15]]}}}],["ms",{"_index":21,"t":{"7":{"position":[[39,2],[152,2],[448,2]]},"15":{"position":[[144,2],[306,2],[406,2],[589,2],[646,2],[1139,2],[3282,2],[3948,2],[4015,3]]},"21":{"position":[[292,2]]},"23":{"position":[[951,2]]},"29":{"position":[[415,2],[3654,2],[4020,2]]},"36":{"position":[[357,2]]},"55":{"position":[[524,2],[1312,2],[1557,2],[3052,2],[3180,2],[3205,2],[3306,2],[3357,2],[3395,2],[3485,2],[3612,2],[3727,2],[3957,2],[5419,2],[5440,2],[5465,2],[6150,2],[6361,2],[6667,2],[6719,2],[6805,2],[6826,2],[6851,2],[8030,2],[8241,2],[8543,2],[8595,2],[8681,2],[8694,2],[9837,2],[10059,2],[10111,2]]},"57":{"position":[[80,2]]},"59":{"position":[[156,2]]},"61":{"position":[[276,2],[404,2],[429,2]]},"65":{"position":[[321,2],[332,2],[952,2],[2535,2],[2695,2],[2947,2],[2973,2],[3216,2]]},"69":{"position":[[328,2],[713,2],[738,2],[1065,2],[1289,2]]},"72":{"position":[[500,2]]},"75":{"position":[[0,2],[158,2],[330,2],[573,2],[666,2],[890,5],[1209,2],[1806,2],[1880,2],[1986,5]]},"79":{"position":[[412,2],[473,2],[1093,2],[2710,2],[2870,2],[3122,2],[3148,2],[3391,2]]},"81":{"position":[[901,2]]},"83":{"position":[[996,2]]},"128":{"position":[[187,2],[270,2],[329,2],[571,2]]},"134":{"position":[[533,2],[908,2]]},"136":{"position":[[337,2]]},"140":{"position":[[16,2],[82,2],[385,2],[1458,2]]},"160":{"position":[[456,2]]},"166":{"position":[[1570,2],[1917,2],[2499,2],[3262,2]]},"172":{"position":[[1807,2],[4112,2]]},"174":{"position":[[623,2],[1131,2]]},"177":{"position":[[60,2],[491,2]]},"179":{"position":[[275,2]]},"184":{"position":[[100,2],[584,2]]},"188":{"position":[[523,2]]},"190":{"position":[[916,2],[967,2],[1294,2]]},"192":{"position":[[202,4]]},"198":{"position":[[1159,2],[1519,2]]},"208":{"position":[[1392,2],[1871,2],[2005,2]]},"222":{"position":[[165,3],[566,2],[941,3],[1026,3]]},"224":{"position":[[173,2]]},"226":{"position":[[130,3]]},"228":{"position":[[105,3],[134,2],[237,2],[346,2],[515,2],[936,2]]},"230":{"position":[[695,2],[725,2]]},"242":{"position":[[165,3],[551,2],[926,3],[1005,3]]},"248":{"position":[[70,2],[283,2],[507,2],[627,2]]},"253":{"position":[[356,2]]},"255":{"position":[[700,2],[730,2]]},"271":{"position":[[222,2],[394,2],[447,2]]},"279":{"position":[[0,2]]},"297":{"position":[[90,2]]},"303":{"position":[[112,2],[436,2],[780,2],[873,2],[1414,2],[2510,2]]},"307":{"position":[[404,2]]},"311":{"position":[[347,2]]},"315":{"position":[[409,2]]},"319":{"position":[[0,2],[681,3],[1450,2],[1856,2]]},"323":{"position":[[708,2]]},"327":{"position":[[0,2]]},"331":{"position":[[1277,2],[1502,2]]},"343":{"position":[[1212,2],[2375,3],[2429,2],[2810,2],[3094,2],[3240,2],[3379,2],[4241,3],[4563,2],[4686,2],[5348,2]]},"365":{"position":[[0,2]]},"368":{"position":[[0,2],[425,3]]},"383":{"position":[[148,2],[1461,2],[1557,2],[1952,2],[2171,2]]},"385":{"position":[[46,2]]},"397":{"position":[[311,3]]},"437":{"position":[[40,2]]},"442":{"position":[[268,2]]},"444":{"position":[[77,2]]},"452":{"position":[[230,2],[254,2]]},"454":{"position":[[591,2],[1148,2],[1249,2]]},"464":{"position":[[480,3]]},"466":{"position":[[102,2]]},"468":{"position":[[58,2]]},"470":{"position":[[4,2],[1682,2],[2482,2]]},"476":{"position":[[855,2],[1165,2],[2124,2]]},"482":{"position":[[364,2],[608,2],[908,2]]},"484":{"position":[[82,2]]},"488":{"position":[[451,2]]},"524":{"position":[[400,2]]},"561":{"position":[[7,2],[26,2]]},"566":{"position":[[147,2]]},"594":{"position":[[937,5],[1484,5]]},"598":{"position":[[75,2],[158,2]]},"619":{"position":[[0,2],[208,2]]},"623":{"position":[[30,2],[323,2],[384,2],[570,2],[839,2],[1027,2]]},"629":{"position":[[7,2]]},"633":{"position":[[87,2]]},"635":{"position":[[841,2],[898,2],[1065,3]]},"638":{"position":[[87,2]]},"640":{"position":[[937,2]]},"642":{"position":[[5,2]]},"648":{"position":[[24,2],[211,2],[2854,2]]},"651":{"position":[[57,2],[558,2]]},"653":{"position":[[610,2],[1001,2],[1289,2],[1328,2]]}}}],["ms'",{"_index":778,"t":{"55":{"position":[[1623,4]]},"59":{"position":[[222,4]]},"75":{"position":[[1644,4]]},"303":{"position":[[350,4],[1483,4]]},"327":{"position":[[205,4]]},"343":{"position":[[426,4],[3311,4]]},"355":{"position":[[260,4]]},"452":{"position":[[377,4]]},"454":{"position":[[524,4]]},"470":{"position":[[1297,4]]}}}],["ms.db",{"_index":473,"t":{"27":{"position":[[45,7]]},"512":{"position":[[45,7],[355,5],[396,5]]}}}],["msdata",{"_index":3103,"t":{"540":{"position":[[221,8]]}}}],["msdata/config/lastfm.json",{"_index":3090,"t":{"532":{"position":[[1751,27]]},"536":{"position":[[889,27]]}}}],["msdata/dock",{"_index":2401,"t":{"331":{"position":[[214,15]]},"528":{"position":[[107,15]]},"530":{"position":[[299,15],[920,15],[1917,15],[2743,15],[3669,15]]},"532":{"position":[[515,15],[1096,15],[1239,15],[1381,15],[1519,15]]},"534":{"position":[[248,15]]},"536":{"position":[[234,15],[377,15],[519,15],[657,15]]},"538":{"position":[[1008,15],[1652,15],[2375,15]]}}}],["mtg8v6xa2nc",{"_index":2897,"t":{"470":{"position":[[1864,13]]}}}],["much",{"_index":485,"t":{"29":{"position":[[4,4],[124,4]]},"55":{"position":[[606,4]]},"315":{"position":[[699,4]]},"490":{"position":[[77,4]]},"544":{"position":[[819,4],[996,4],[1355,4]]},"546":{"position":[[216,4],[393,4]]},"548":{"position":[[259,4]]},"625":{"position":[[41,4]]}}}],["multi",{"_index":69,"t":{"9":{"position":[[3,5]]},"11":{"position":[[0,5],[223,5]]},"15":{"position":[[804,5]]},"19":{"position":[[38,5],[269,5],[919,5],[1371,5],[1814,5],[1919,5]]},"23":{"position":[[0,5],[1451,5]]},"25":{"position":[[339,5],[456,5],[511,5],[602,5],[746,5],[936,5],[1065,5]]},"27":{"position":[[0,5],[127,5]]},"29":{"position":[[1739,5],[2125,5],[3542,5],[3753,5],[4140,5]]},"38":{"position":[[693,5],[1046,5],[1449,5]]},"42":{"position":[[666,5]]},"44":{"position":[[127,5]]},"50":{"position":[[127,5]]},"53":{"position":[[258,5]]},"55":{"position":[[114,5],[653,5],[1364,5],[1760,5],[1835,5],[2816,5],[5254,5],[5349,5]]},"59":{"position":[[359,5],[434,5]]},"61":{"position":[[40,5]]},"65":{"position":[[0,5],[164,5],[3610,5]]},"69":{"position":[[127,5],[348,5],[956,5],[983,5],[1184,5],[1235,5]]},"77":{"position":[[405,5]]},"79":{"position":[[0,5],[255,5],[3818,5]]},"83":{"position":[[591,5],[821,5]]},"87":{"position":[[161,5],[467,5],[884,5]]},"89":{"position":[[64,5],[211,5],[267,5]]},"95":{"position":[[64,5],[211,5],[267,5]]},"105":{"position":[[159,5]]},"109":{"position":[[1018,5],[1058,5]]},"114":{"position":[[21,5],[353,5],[471,5],[1035,5]]},"116":{"position":[[1016,5],[1056,5],[2053,5]]},"118":{"position":[[5,5]]},"121":{"position":[[33,5],[499,5]]},"125":{"position":[[29,5]]},"128":{"position":[[27,5],[389,5],[442,5],[889,5],[1228,5]]},"132":{"position":[[509,5]]},"134":{"position":[[309,5],[748,5]]},"136":{"position":[[139,5],[246,5]]},"138":{"position":[[181,5]]},"140":{"position":[[1212,5]]},"142":{"position":[[43,5],[977,5]]},"147":{"position":[[54,5],[221,5]]},"150":{"position":[[25,5],[508,5],[571,5]]},"154":{"position":[[641,5],[704,5]]},"158":{"position":[[78,5]]},"162":{"position":[[0,5],[113,5],[839,5]]},"166":{"position":[[82,5],[890,5]]},"170":{"position":[[0,5]]},"172":{"position":[[0,5],[1164,5],[2755,5],[3485,5],[4768,5],[4887,5],[5258,5]]},"174":{"position":[[308,5],[453,5]]},"177":{"position":[[217,5],[326,5]]},"186":{"position":[[3,5]]},"190":{"position":[[703,5],[871,5]]},"192":{"position":[[186,5]]},"194":{"position":[[541,5]]},"196":{"position":[[25,5]]},"198":{"position":[[99,5],[919,5],[2094,5]]},"202":{"position":[[13,5]]},"204":{"position":[[250,5],[683,5]]},"208":{"position":[[61,5],[269,5],[547,5],[739,5],[1018,5]]},"210":{"position":[[287,5],[495,5],[1426,5],[2173,5]]},"214":{"position":[[13,5]]},"216":{"position":[[254,5],[691,5]]},"220":{"position":[[20,5],[461,5]]},"222":{"position":[[103,5],[399,5],[653,5],[1083,5],[1850,5],[2984,5]]},"224":{"position":[[56,5],[109,5]]},"226":{"position":[[246,5]]},"230":{"position":[[622,5]]},"234":{"position":[[226,5]]},"236":{"position":[[1691,5]]},"238":{"position":[[1870,5]]},"240":{"position":[[20,5],[238,5]]},"242":{"position":[[103,5],[385,5],[638,5],[1062,5],[1835,5],[2936,5]]},"244":{"position":[[115,5],[225,5]]},"255":{"position":[[627,5]]},"261":{"position":[[1800,5]]},"263":{"position":[[258,5]]},"265":{"position":[[1599,5]]},"269":{"position":[[1450,5]]},"275":{"position":[[218,5],[405,5],[479,5],[696,5],[831,5],[1702,5]]},"279":{"position":[[195,5]]},"283":{"position":[[145,5],[607,5],[992,5]]},"285":{"position":[[162,5],[398,5]]},"287":{"position":[[146,5],[237,5],[505,5]]},"295":{"position":[[1698,5]]},"297":{"position":[[0,5],[631,5],[1683,5],[1806,5]]},"301":{"position":[[76,5]]},"303":{"position":[[485,5],[2173,5],[2483,5],[2696,5],[2851,5],[2954,5],[3080,5],[3289,5],[3391,5],[3461,5],[3677,5],[3983,5],[4087,5],[4362,5],[4628,5],[5153,5],[5397,5]]},"307":{"position":[[121,5],[1380,5]]},"311":{"position":[[150,5],[453,5]]},"315":{"position":[[0,5],[629,5]]},"319":{"position":[[1078,5],[2046,5]]},"323":{"position":[[560,5]]},"331":{"position":[[252,5],[315,5],[1217,5],[1421,5]]},"341":{"position":[[2936,5]]},"343":{"position":[[4945,5]]},"347":{"position":[[0,5],[183,5],[896,5]]},"349":{"position":[[50,5]]},"353":{"position":[[811,5]]},"373":{"position":[[0,5]]},"375":{"position":[[316,5]]},"391":{"position":[[247,5],[329,5]]},"397":{"position":[[156,5]]},"399":{"position":[[415,5]]},"401":{"position":[[80,5]]},"403":{"position":[[616,5],[679,5]]},"414":{"position":[[437,5]]},"431":{"position":[[45,5]]},"448":{"position":[[49,5],[148,5],[179,5],[212,5],[1216,5],[1271,5],[1470,5],[1745,5],[1858,5],[2041,5],[2197,5]]},"450":{"position":[[166,5],[293,5]]},"454":{"position":[[21,5],[927,5],[1216,5]]},"460":{"position":[[0,5]]},"462":{"position":[[150,5],[275,5]]},"464":{"position":[[277,5]]},"470":{"position":[[40,5],[289,5],[414,5],[552,5]]},"476":{"position":[[276,5],[554,5],[975,5],[1374,5],[1543,5],[2252,5],[2558,5]]},"478":{"position":[[481,5],[544,5]]},"480":{"position":[[47,5]]},"482":{"position":[[191,5]]},"488":{"position":[[0,5]]},"495":{"position":[[89,5]]},"497":{"position":[[29,5]]},"499":{"position":[[122,5]]},"503":{"position":[[30,5],[216,5]]},"505":{"position":[[72,5],[119,5],[190,5]]},"507":{"position":[[51,5]]},"510":{"position":[[16,5]]},"512":{"position":[[0,5]]},"516":{"position":[[421,5]]},"518":{"position":[[0,5]]},"524":{"position":[[23,5],[129,5]]},"526":{"position":[[44,5],[281,5],[382,5],[453,5]]},"528":{"position":[[24,5],[145,5],[208,5]]},"530":{"position":[[39,5],[1136,5],[1262,5],[1652,5],[1779,5],[2027,5],[2972,5],[3301,5],[3914,5],[4049,5]]},"532":{"position":[[0,5]]},"538":{"position":[[43,5],[679,5],[983,5],[1627,5],[2350,5]]},"540":{"position":[[28,5],[264,5],[606,5]]},"542":{"position":[[237,5]]},"544":{"position":[[115,5],[1538,5]]},"551":{"position":[[514,5],[658,5]]},"557":{"position":[[1513,5],[1576,5]]},"561":{"position":[[924,5],[1749,5],[1908,5],[2152,5],[3181,5],[3389,5],[3688,5]]},"581":{"position":[[40,5]]},"596":{"position":[[1434,5],[1804,5],[2569,5]]},"621":{"position":[[143,5],[964,5]]},"629":{"position":[[250,5]]},"648":{"position":[[3078,5]]}}}],["multipl",{"_index":124,"t":{"11":{"position":[[699,8]]},"15":{"position":[[2743,8]]},"38":{"position":[[277,8]]},"87":{"position":[[403,8]]},"150":{"position":[[107,8]]},"154":{"position":[[9,8]]},"172":{"position":[[21,8],[243,8],[625,8]]},"174":{"position":[[518,8],[873,9]]},"198":{"position":[[624,8]]},"222":{"position":[[1475,8],[2372,8],[2794,8]]},"232":{"position":[[328,8]]},"242":{"position":[[1456,8],[2358,8],[2757,8]]},"248":{"position":[[213,8]]},"257":{"position":[[328,8]]},"313":{"position":[[163,8],[586,9]]},"319":{"position":[[1461,8]]},"325":{"position":[[22,8]]},"357":{"position":[[1015,8]]},"530":{"position":[[1542,8]]},"532":{"position":[[893,8]]},"536":{"position":[[31,8]]},"551":{"position":[[756,8]]},"561":{"position":[[981,8],[3727,8]]},"568":{"position":[[1656,8],[2014,8]]},"573":{"position":[[720,8]]},"575":{"position":[[476,8]]},"581":{"position":[[384,8]]},"596":{"position":[[949,8]]},"631":{"position":[[481,8]]}}}],["multiscrobbl",{"_index":699,"t":{"42":{"position":[[930,14]]}}}],["musibrainz",{"_index":1782,"t":{"188":{"position":[[347,10]]}}}],["music",{"_index":665,"t":{"40":{"position":[[698,6]]},"44":{"position":[[87,5]]},"50":{"position":[[87,5]]},"65":{"position":[[408,5],[1019,5],[3146,5]]},"69":{"position":[[87,5]]},"79":{"position":[[549,5],[1160,5],[3321,5]]},"109":{"position":[[97,5]]},"123":{"position":[[88,5],[160,6]]},"125":{"position":[[101,5],[654,6],[1049,5],[1085,5]]},"142":{"position":[[854,7]]},"154":{"position":[[29,5],[68,5]]},"166":{"position":[[134,5],[429,5],[2666,6]]},"192":{"position":[[32,5],[79,5],[169,5]]},"194":{"position":[[114,5]]},"196":{"position":[[108,5],[331,5],[832,5],[3220,5]]},"198":{"position":[[32,5],[543,5],[1881,5],[2766,7]]},"200":{"position":[[536,5],[2072,7],[3766,7]]},"208":{"position":[[830,6]]},"253":{"position":[[8,5],[37,5],[513,5]]},"275":{"position":[[53,5]]},"283":{"position":[[21,5],[56,5]]},"291":{"position":[[72,5]]},"307":{"position":[[1466,6]]},"309":{"position":[[21,5],[45,5],[92,5]]},"331":{"position":[[20,5],[138,6],[152,5],[201,5],[411,5],[446,5],[575,5],[622,5],[956,5],[1067,5],[1371,5],[1530,6]]},"333":{"position":[[399,5],[1780,7],[3154,7]]},"341":{"position":[[148,5],[445,5]]},"343":{"position":[[30,5],[188,5],[4978,5],[5384,5]]},"345":{"position":[[1919,7],[3399,7]]},"347":{"position":[[365,5]]},"391":{"position":[[39,5]]},"466":{"position":[[95,6]]},"470":{"position":[[1060,6],[2887,5]]},"544":{"position":[[384,5],[839,5],[955,5]]},"546":{"position":[[236,5],[352,5]]},"561":{"position":[[6412,5],[6496,5]]},"573":{"position":[[361,5],[745,5]]},"579":{"position":[[77,5]]},"596":{"position":[[36,5],[157,5],[331,6],[385,5],[532,5],[546,5],[2535,5]]},"600":{"position":[[58,5],[132,5],[155,5],[216,6]]},"602":{"position":[[77,5]]},"648":{"position":[[81,5],[115,5],[183,5],[273,5]]},"653":{"position":[[362,5],[512,5],[572,5]]}}}],["music'",{"_index":1897,"t":{"200":{"position":[[635,7]]}}}],["music.apple.com",{"_index":1798,"t":{"194":{"position":[[135,15]]},"196":{"position":[[1060,15],[1844,15]]}}}],["music.youtube.com",{"_index":2513,"t":{"345":{"position":[[598,17]]}}}],["musicbrainz",{"_index":254,"t":{"15":{"position":[[3886,11]]},"23":{"position":[[730,12]]},"25":{"position":[[264,11]]},"29":{"position":[[390,11]]},"36":{"position":[[303,11]]},"65":{"position":[[2900,11],[3230,11]]},"79":{"position":[[3075,11],[3405,11]]},"154":{"position":[[128,11],[479,11],[880,11],[1379,11],[1726,11],[1984,14],[2739,14],[3183,14],[3935,14]]},"188":{"position":[[123,11]]},"220":{"position":[[606,12]]},"297":{"position":[[189,11],[346,11]]},"309":{"position":[[103,11]]},"311":{"position":[[291,11],[357,11],[513,11],[564,11],[778,14],[852,11],[1091,14],[1255,14],[1329,11],[1576,14]]},"355":{"position":[[336,11],[388,11]]},"361":{"position":[[1072,14],[1261,11],[1333,11],[1387,14]]},"365":{"position":[[768,11]]},"368":{"position":[[73,11]]},"370":{"position":[[92,11]]},"532":{"position":[[24,11],[210,11],[251,11],[361,11],[405,11],[574,11],[657,11],[837,11],[862,11],[2034,13]]},"534":{"position":[[94,11],[138,11],[307,11],[390,11]]},"536":{"position":[[0,11],[1172,13]]},"542":{"position":[[490,11]]},"544":{"position":[[4,11],[54,11],[449,11],[564,12],[607,11],[1178,11],[1654,11]]},"546":{"position":[[4,11]]},"548":{"position":[[82,11]]},"551":{"position":[[24,11],[254,14],[365,11],[407,11],[609,11],[700,11],[823,14],[926,11]]},"553":{"position":[[45,11],[174,14]]},"555":{"position":[[185,14],[486,14],[774,11],[1071,14]]},"557":{"position":[[1890,11]]},"559":{"position":[[200,11],[249,11]]},"561":{"position":[[221,11],[851,11],[955,11],[2380,11],[3209,11],[4447,11],[4814,11],[5284,11],[5636,11],[5951,11],[6097,11]]},"564":{"position":[[23,11]]},"566":{"position":[[1032,11]]},"568":{"position":[[1228,11],[1361,11],[1640,11]]},"573":{"position":[[15,11]]},"575":{"position":[[136,11],[340,11],[758,11]]},"577":{"position":[[230,11]]},"579":{"position":[[19,11],[293,11],[502,14]]},"581":{"position":[[3,11],[218,11],[699,14]]},"584":{"position":[[74,14],[321,14]]},"586":{"position":[[162,14],[634,14]]},"588":{"position":[[138,11],[351,14],[656,14]]},"590":{"position":[[0,11],[165,11],[259,14],[729,11],[801,11],[855,14]]},"592":{"position":[[483,14],[759,14],[1076,14]]},"594":{"position":[[123,11],[204,11],[537,14],[1023,14],[1116,14],[1589,14]]},"596":{"position":[[750,11],[2427,11]]}}}],["musicbrainz'",{"_index":1223,"t":{"109":{"position":[[2014,13]]}}}],["musicbrainz/cov",{"_index":905,"t":{"65":{"position":[[292,17]]},"79":{"position":[[383,17]]}}}],["musiccast",{"_index":1318,"t":{"125":{"position":[[1008,9]]},"391":{"position":[[8,9],[99,9],[386,9],[414,9]]},"393":{"position":[[487,9],[697,9],[1040,9],[1123,9],[1353,9],[1975,9],[2170,9],[2692,9],[3089,11]]},"596":{"position":[[515,9]]}}}],["musickit",{"_index":1814,"t":{"196":{"position":[[392,8],[654,8],[3051,8],[3281,8]]}}}],["musicservicebasedomain",{"_index":2443,"t":{"341":{"position":[[724,22]]}}}],["musictrack",{"_index":1600,"t":{"166":{"position":[[1962,11]]}}}],["musicvideo",{"_index":1974,"t":{"208":{"position":[[5349,13],[7178,13]]}}}],["musikcub",{"_index":1314,"t":{"125":{"position":[[700,9]]},"271":{"position":[[16,9],[166,9]]},"273":{"position":[[342,9],[429,9],[606,9],[816,9],[1159,9],[1242,9],[1472,9],[1777,12],[2139,9],[2334,9],[2856,9],[3152,12]]},"596":{"position":[[375,9]]},"642":{"position":[[684,12],[1274,12]]}}}],["musl",{"_index":1584,"t":{"166":{"position":[[1112,4]]}}}],["mutli",{"_index":2354,"t":{"319":{"position":[[1203,5],[2148,5]]}}}],["mvp",{"_index":3486,"t":{"653":{"position":[[2084,3]]}}}],["mx",{"_index":3207,"t":{"566":{"position":[[1021,3]]}}}],["my\",\"optional\",\"tag",{"_index":644,"t":{"38":{"position":[[1841,24]]}}}],["my.domain.local:80",{"_index":398,"t":{"21":{"position":[[869,18]]}}}],["my.domain.local:9000",{"_index":400,"t":{"21":{"position":[[928,20]]}}}],["my.domain.tld/api",{"_index":2487,"t":{"343":{"position":[[3561,20]]}}}],["my/host/folder:/msdata",{"_index":2928,"t":{"476":{"position":[[671,26]]}}}],["my_api_key_placedhold",{"_index":3091,"t":{"532":{"position":[[1854,26]]},"536":{"position":[[992,26]]}}}],["my_apikey",{"_index":345,"t":{"19":{"position":[[597,16]]}}}],["my_apikey=a89cba1569901a0671d5a9875fed4be1",{"_index":351,"t":{"19":{"position":[[814,42]]}}}],["my_env",{"_index":342,"t":{"19":{"position":[[391,10],[463,6]]}}}],["my_password",{"_index":2129,"t":{"273":{"position":[[1898,13],[3273,13]]},"281":{"position":[[1819,13],[3190,13]]}}}],["my_secret",{"_index":347,"t":{"19":{"position":[[624,16]]}}}],["my_secret=ec42e09d5ae0ee0f0816ca151008412a",{"_index":352,"t":{"19":{"position":[[857,42]]}}}],["my_secret_placehold",{"_index":3092,"t":{"532":{"position":[[1891,24]]},"536":{"position":[[1029,24]]}}}],["my_token",{"_index":3328,"t":{"635":{"position":[[399,8]]}}}],["myapikey",{"_index":1454,"t":{"150":{"position":[[2216,11],[3237,11]]},"154":{"position":[[2890,11],[4093,11]]}}}],["myapplemus",{"_index":1885,"t":{"198":{"position":[[2732,15]]},"200":{"position":[[2038,15],[3732,15]]}}}],["myapprisefriendlynameforlog",{"_index":640,"t":{"38":{"position":[[1583,31]]}}}],["myazura",{"_index":1404,"t":{"144":{"position":[[1857,10],[3287,10]]}}}],["mybasicsourc",{"_index":3489,"t":{"653":{"position":[[2822,13]]}}}],["mybasicsourcesourc",{"_index":3495,"t":{"653":{"position":[[3494,19]]}}}],["mycast",{"_index":1603,"t":{"166":{"position":[[2301,9],[2833,9],[3492,9]]},"168":{"position":[[2170,9],[3547,9]]}}}],["mycdn",{"_index":932,"t":{"65":{"position":[[2428,7]]},"79":{"position":[[2569,7]]}}}],["mycdn\",\"jellyfin",{"_index":923,"t":{"65":{"position":[[1285,20]]},"79":{"position":[[1426,20]]}}}],["mycomponentid",{"_index":950,"t":{"67":{"position":[[169,13]]},"81":{"position":[[169,13]]},"85":{"position":[[167,13]]},"91":{"position":[[168,13]]},"99":{"position":[[169,13]]},"103":{"position":[[168,13]]},"107":{"position":[[164,13]]},"114":{"position":[[1221,13]]},"121":{"position":[[744,13]]},"144":{"position":[[167,13]]},"164":{"position":[[168,13]]},"168":{"position":[[259,13]]},"200":{"position":[[172,13]]},"206":{"position":[[166,13]]},"208":{"position":[[2280,13]]},"212":{"position":[[169,13]]},"218":{"position":[[168,13]]},"232":{"position":[[165,13]]},"236":{"position":[[175,13]]},"238":{"position":[[529,13]]},"257":{"position":[[165,13]]},"261":{"position":[[176,13]]},"265":{"position":[[171,13]]},"269":{"position":[[175,13]]},"273":{"position":[[164,13]]},"277":{"position":[[167,13]]},"281":{"position":[[165,13]]},"289":{"position":[[168,13]]},"295":{"position":[[333,13]]},"301":{"position":[[292,13]]},"305":{"position":[[169,13]]},"317":{"position":[[170,13]]},"321":{"position":[[165,13]]},"329":{"position":[[164,13]]},"333":{"position":[[170,13]]},"341":{"position":[[1624,13]]},"345":{"position":[[165,13]]},"393":{"position":[[167,13]]}}}],["myconfig",{"_index":290,"t":{"15":{"position":[[4918,13]]},"381":{"position":[[166,8]]},"482":{"position":[[2013,13],[2212,11]]}}}],["mydeez",{"_index":1529,"t":{"160":{"position":[[303,11]]},"162":{"position":[[306,9]]}}}],["mydeezerid",{"_index":1569,"t":{"164":{"position":[[1828,13],[3268,13]]}}}],["mydiscordloc",{"_index":985,"t":{"67":{"position":[[2007,17],[3383,17]]}}}],["mydiscordremot",{"_index":1060,"t":{"81":{"position":[[2248,18],[3666,18]]}}}],["mydomain.com",{"_index":1234,"t":{"114":{"position":[[246,12]]},"121":{"position":[[345,12]]}}}],["mydomain.com:80/jriverreverse/mcws/v1",{"_index":2000,"t":{"216":{"position":[[917,38],[956,38]]}}}],["mydomain.com:80/kodireverse/jsonrpc",{"_index":1916,"t":{"204":{"position":[[898,35]]}}}],["mydomainorip:9078",{"_index":2042,"t":{"230":{"position":[[271,20]]},"255":{"position":[[271,20]]}}}],["myemail@myemailprovider.com",{"_index":2316,"t":{"311":{"position":[[916,29],[1393,29]]}}}],["mygotifyfriendlynameforlog",{"_index":630,"t":{"38":{"position":[[849,30]]}}}],["mygotifytoken",{"_index":307,"t":{"15":{"position":[[5417,16]]}}}],["myicestation1",{"_index":1995,"t":{"212":{"position":[[1680,16],[3012,16]]}}}],["myici",{"_index":1984,"t":{"210":{"position":[[1925,8]]}}}],["myjellyfin",{"_index":1337,"t":{"132":{"position":[[207,13]]},"208":{"position":[[4966,13],[6795,13]]},"588":{"position":[[562,13]]},"590":{"position":[[637,13]]}}}],["myjellyfinsourc",{"_index":2988,"t":{"482":{"position":[[2035,19]]}}}],["mykodi",{"_index":1925,"t":{"206":{"position":[[1791,9],[3163,9]]}}}],["mykoitocli",{"_index":1089,"t":{"85":{"position":[[1732,16],[3142,16]]}}}],["mykoitoid",{"_index":3286,"t":{"619":{"position":[[421,9]]},"621":{"position":[[461,12],[776,12]]}}}],["mykoitosourc",{"_index":2071,"t":{"238":{"position":[[2389,16],[3799,16]]}}}],["mylastfm",{"_index":2538,"t":{"351":{"position":[[391,11]]},"353":{"position":[[1362,11]]},"418":{"position":[[86,11]]}}}],["mylastfmcli",{"_index":133,"t":{"11":{"position":[[1039,17]]},"19":{"position":[[534,17],[970,17]]},"91":{"position":[[1903,17],[3375,17]]},"198":{"position":[[2886,17]]}}}],["mylastfmsourc",{"_index":2063,"t":{"236":{"position":[[2215,17],[3687,17]]},"532":{"position":[[1791,17]]},"536":{"position":[[929,17]]}}}],["mylfm",{"_index":1453,"t":{"150":{"position":[[2140,8],[3161,8]]},"154":{"position":[[2814,8],[4017,8]]},"365":{"position":[[694,6]]},"592":{"position":[[646,8]]}}}],["mylfmapp",{"_index":2054,"t":{"232":{"position":[[1954,11],[3276,11]]}}}],["mylibrefmcli",{"_index":1156,"t":{"99":{"position":[[2008,18],[3439,18]]}}}],["mylibrefmsourc",{"_index":2103,"t":{"261":{"position":[[2330,18],[3761,18]]}}}],["mylznavidrom",{"_index":1445,"t":{"150":{"position":[[1830,16],[2881,16]]},"154":{"position":[[2604,16],[3828,16]]},"257":{"position":[[2011,16],[3342,16]]}}}],["mymaloja\",\"koitoa\",\"listenbrainzfoo",{"_index":1338,"t":{"132":{"position":[[232,39]]}}}],["mymalojacli",{"_index":1176,"t":{"103":{"position":[[1674,17],[3054,17]]}}}],["mymalojaid",{"_index":299,"t":{"15":{"position":[[5225,13]]}}}],["mymalojakey",{"_index":301,"t":{"15":{"position":[[5292,13]]},"103":{"position":[[1786,13],[3166,13]]},"269":{"position":[[2084,13],[3464,13]]},"482":{"position":[[2277,13]]}}}],["mymalojasourc",{"_index":2116,"t":{"269":{"position":[[1972,17],[3352,17]]}}}],["mymb",{"_index":1491,"t":{"154":{"position":[[2007,7],[2762,6],[3206,7],[3958,6]]},"311":{"position":[[801,7],[1114,6],[1278,7],[1599,7]]},"361":{"position":[[1095,6],[1410,6]]},"365":{"position":[[780,4]]},"551":{"position":[[277,7],[846,7]]},"553":{"position":[[197,7]]},"555":{"position":[[208,6],[509,6],[1094,7]]},"579":{"position":[[525,7]]},"581":{"position":[[722,7]]},"584":{"position":[[97,7],[344,6]]},"586":{"position":[[185,7],[657,6]]},"588":{"position":[[374,7],[679,7]]},"590":{"position":[[282,7],[878,6]]},"592":{"position":[[506,7],[782,7],[1099,7]]},"594":{"position":[[560,7],[1139,7]]}}}],["mymopidi",{"_index":2199,"t":{"289":{"position":[[2032,11],[3406,11]]}}}],["mympd",{"_index":2165,"t":{"281":{"position":[[1740,8],[3111,8]]}}}],["mymprisubuntu",{"_index":2150,"t":{"277":{"position":[[1787,16],[3133,16]]}}}],["mymultiscrobblerip:9078",{"_index":694,"t":{"42":{"position":[[759,27]]}}}],["mymultiscrobblertop",{"_index":316,"t":{"15":{"position":[[5585,24]]}}}],["mymusikcub",{"_index":2128,"t":{"273":{"position":[[1831,14],[3206,14]]}}}],["myn",{"_index":2569,"t":{"361":{"position":[[1133,10],[1493,10]]}}}],["mynativetransform",{"_index":2550,"t":{"357":{"position":[[536,22],[912,21],[2051,22],[2427,22]]},"406":{"position":[[92,22],[469,21]]},"408":{"position":[[92,22],[368,21]]}}}],["myntfyfriendlynameforlog",{"_index":313,"t":{"15":{"position":[[5515,28]]},"38":{"position":[[1200,28]]}}}],["myoptionalslug",{"_index":2399,"t":{"329":{"position":[[1804,17],[3164,17]]}}}],["mypassword",{"_index":1927,"t":{"206":{"position":[[1901,12],[3273,12]]}}}],["myplex",{"_index":2318,"t":{"311":{"position":[[1001,9],[1470,9]]}}}],["myriv",{"_index":2008,"t":{"218":{"position":[[1839,10],[3196,10]]}}}],["myrockskycli",{"_index":1256,"t":{"114":{"position":[[2904,18],[4345,18]]}}}],["myrockskysourc",{"_index":2205,"t":{"295":{"position":[[2199,18],[3640,18]]}}}],["mysecret",{"_index":1455,"t":{"150":{"position":[[2238,11],[3259,11]]},"154":{"position":[[2912,11],[4115,11]]}}}],["mysite.com",{"_index":2761,"t":{"416":{"position":[[758,14],[800,14],[854,13]]}}}],["myslug",{"_index":2038,"t":{"228":{"position":[[956,8]]},"232":{"position":[[1984,8],[3306,8]]}}}],["mysono",{"_index":2215,"t":{"297":{"position":[[1401,10]]},"301":{"position":[[2255,10],[3683,10]]}}}],["mysourc",{"_index":2667,"t":{"383":{"position":[[1377,8]]}}}],["myspotifi",{"_index":2296,"t":{"305":{"position":[[1794,12],[3268,12]]},"592":{"position":[[983,12]]}}}],["myspotify1\",\"myjellyfin2",{"_index":143,"t":{"11":{"position":[[1333,28]]}}}],["myspotifyid",{"_index":292,"t":{"15":{"position":[[4967,14]]}}}],["mysubson",{"_index":2340,"t":{"317":{"position":[[1778,13],[3243,13]]},"357":{"position":[[801,13],[1512,13],[2316,13]]},"401":{"position":[[291,13]]},"406":{"position":[[357,13]]},"408":{"position":[[256,13]]},"410":{"position":[[289,13]]},"414":{"position":[[623,13]]},"555":{"position":[[91,13],[392,13],[977,13]]},"579":{"position":[[408,13]]},"581":{"position":[[591,13]]},"584":{"position":[[227,13]]},"586":{"position":[[540,13]]}}}],["mytealcli",{"_index":1288,"t":{"121":{"position":[[2262,15],[3642,15]]}}}],["mytealsourc",{"_index":2446,"t":{"341":{"position":[[843,15],[1052,15],[1282,15],[3433,15],[4871,15]]}}}],["myth",{"_index":2579,"t":{"365":{"position":[[367,10]]}}}],["mytoken",{"_index":1446,"t":{"150":{"position":[[1894,9],[2917,9]]},"154":{"position":[[2668,9],[3864,9]]},"257":{"position":[[2063,9],[3394,9]]}}}],["myurl",{"_index":3093,"t":{"538":{"position":[[758,5]]}}}],["myuser",{"_index":1926,"t":{"206":{"position":[[1879,9],[3251,9]]},"482":{"position":[[2155,8]]},"538":{"position":[[551,7]]}}}],["myvlc",{"_index":2356,"t":{"319":{"position":[[1609,8],[2404,8]]},"321":{"position":[[1659,8],[2981,8]]},"357":{"position":[[1695,8]]}}}],["mywebscrobbl",{"_index":2397,"t":{"329":{"position":[[1742,17],[3102,17]]}}}],["myyamaha",{"_index":2715,"t":{"393":{"position":[[1687,11],[3017,11]]}}}],["myyandex",{"_index":2430,"t":{"333":{"position":[[1752,11],[3126,11]]}}}],["myytm",{"_index":2464,"t":{"343":{"position":[[1069,8],[2616,8],[3845,8]]},"470":{"position":[[1553,8],[1740,6],[2388,8]]}}}],["myytm.log",{"_index":2913,"t":{"470":{"position":[[2547,9]]}}}],["myytmus",{"_index":2515,"t":{"345":{"position":[[1889,12],[3369,12]]}}}],["n",{"_index":1853,"t":{"196":{"position":[[3798,2]]}}}],["n+1",{"_index":2883,"t":{"470":{"position":[[788,3]]}}}],["n/a",{"_index":1738,"t":{"172":{"position":[[4695,3]]}}}],["naiv",{"_index":3177,"t":{"561":{"position":[[4098,5],[4131,5],[5125,5],[5131,7],[5417,5],[5830,5],[5903,7]]}}}],["name",{"_index":12,"t":{"4":{"position":[[0,4]]},"11":{"position":[[829,5],[862,4],[1031,7],[1199,5]]},"15":{"position":[[2344,5],[2590,7],[2793,7],[2947,7],[3137,4],[4932,7],[4954,6],[5196,7],[5329,7],[5507,7],[5905,7],[6256,4]]},"19":{"position":[[457,5],[526,7],[962,7],[1532,5],[1576,5],[1678,4],[1748,5],[1800,5],[1865,4]]},"23":{"position":[[946,4]]},"25":{"position":[[549,5]]},"38":{"position":[[418,7],[522,7],[581,7],[841,7],[1192,7],[1575,7]]},"40":{"position":[[364,4]]},"53":{"position":[[176,4]]},"55":{"position":[[1534,5],[2683,5],[2711,5],[4872,5],[4982,5],[5049,5],[5219,4],[8756,5],[9552,5]]},"59":{"position":[[133,5],[1282,5],[1310,5]]},"67":{"position":[[232,4],[1966,7],[3342,7]]},"75":{"position":[[882,7],[1765,5],[1978,7]]},"77":{"position":[[323,4]]},"81":{"position":[[232,4],[895,5],[2207,7],[3625,7]]},"83":{"position":[[1654,4]]},"85":{"position":[[226,4],[1700,7],[3110,7]]},"91":{"position":[[229,4],[1870,7],[3342,7]]},"99":{"position":[[232,4],[1973,7],[3404,7]]},"103":{"position":[[229,4],[1643,7],[3023,7]]},"107":{"position":[[217,4],[1791,7],[3241,7]]},"114":{"position":[[1284,4],[2923,7],[4364,7]]},"121":{"position":[[805,4],[2278,7],[3658,7]]},"125":{"position":[[0,4]]},"132":{"position":[[126,4],[199,7],[493,5],[549,4],[620,4]]},"142":{"position":[[194,5],[659,5],[754,7]]},"144":{"position":[[226,4],[1827,7],[1930,6],[3257,7],[3360,6]]},"150":{"position":[[342,5],[649,4],[1589,7],[1847,7],[1953,7],[2149,7],[2354,7],[2620,7],[2847,7],[2968,7],[3170,7],[3367,7]]},"152":{"position":[[608,7],[788,7],[994,7],[1161,7],[1347,7],[1558,7],[1820,7],[2022,7],[2222,7],[2424,7],[2628,7],[2831,7]]},"154":{"position":[[782,4],[1999,7],[2363,7],[2621,7],[2754,7],[2823,7],[3198,7],[3567,7],[3794,7],[3950,7],[4026,7]]},"158":{"position":[[500,4],[729,5]]},"160":{"position":[[295,7]]},"162":{"position":[[333,5],[375,5],[417,5],[461,5],[702,7]]},"164":{"position":[[229,4],[1796,7],[3236,7]]},"166":{"position":[[2258,6],[2293,7],[2372,4],[2760,5],[2825,7],[3484,7]]},"168":{"position":[[312,4],[2145,7],[3522,7]]},"194":{"position":[[409,5]]},"196":{"position":[[1393,6],[2166,4]]},"198":{"position":[[1851,4],[1929,4],[1999,5],[2157,4],[2624,7],[2748,7],[2853,7],[3171,7]]},"200":{"position":[[241,4],[2054,7],[3748,7]]},"206":{"position":[[223,4],[1759,7],[3131,7]]},"208":{"position":[[264,4],[2345,4],[2998,4],[3122,4],[3232,4],[3343,4],[4918,7],[6747,7]]},"210":{"position":[[1917,7]]},"212":{"position":[[232,4],[1637,7],[2969,7]]},"218":{"position":[[229,4],[1805,7],[3162,7]]},"232":{"position":[[220,4],[1909,7],[3231,7]]},"236":{"position":[[250,4],[2182,7],[3654,7]]},"238":{"position":[[602,4],[2357,7],[3767,7]]},"257":{"position":[[220,4],[1977,7],[3308,7]]},"261":{"position":[[253,4],[2295,7],[3726,7]]},"265":{"position":[[238,4],[2114,7],[3564,7]]},"269":{"position":[[250,4],[1941,7],[3321,7]]},"273":{"position":[[217,4],[1806,7],[3181,7]]},"277":{"position":[[226,4],[1762,7],[3108,7]]},"281":{"position":[[220,4],[1749,7],[3120,7]]},"287":{"position":[[124,5],[218,4]]},"289":{"position":[[229,4],[2000,7],[3374,7]]},"295":{"position":[[410,4],[2218,7],[3659,7]]},"297":{"position":[[1393,7]]},"299":{"position":[[135,5]]},"301":{"position":[[351,4],[555,4],[661,4],[761,4],[904,4],[2266,7],[3694,7]]},"305":{"position":[[232,4],[1807,7],[3281,7]]},"309":{"position":[[218,4],[234,6]]},"311":{"position":[[793,7],[993,7],[1106,7],[1270,7],[1462,7],[1591,7]]},"317":{"position":[[235,4],[1792,7],[3257,7]]},"319":{"position":[[1338,5],[1601,7],[2111,4],[2191,4],[2396,7]]},"321":{"position":[[220,4],[1668,7],[2990,7]]},"323":{"position":[[218,5]]},"325":{"position":[[183,7],[267,7]]},"327":{"position":[[89,4]]},"329":{"position":[[217,4],[1760,7],[3120,7]]},"333":{"position":[[235,4],[1764,7],[3138,7]]},"341":{"position":[[259,4],[835,7],[1044,7],[1274,7],[1699,4],[3449,7],[4887,7]]},"343":{"position":[[1061,7],[2224,4],[2608,7],[3837,7]]},"345":{"position":[[220,4],[1902,7],[3382,7]]},"351":{"position":[[383,7]]},"353":{"position":[[1354,7]]},"357":{"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]]},"361":{"position":[[1087,7],[1125,7],[1402,7],[1485,7]]},"365":{"position":[[359,7]]},"381":{"position":[[177,5]]},"393":{"position":[[226,4],[1650,7],[2980,7]]},"395":{"position":[[389,5],[449,4]]},"401":{"position":[[197,4],[283,7],[413,5]]},"406":{"position":[[84,7],[349,7],[461,7]]},"408":{"position":[[84,7],[248,7],[360,7]]},"410":{"position":[[281,7]]},"412":{"position":[[368,5]]},"414":{"position":[[235,7],[529,4],[615,7]]},"418":{"position":[[78,7]]},"448":{"position":[[1607,4],[1848,4],[1985,4]]},"470":{"position":[[1545,7],[2380,7],[2533,5],[2579,6]]},"476":{"position":[[1615,4]]},"478":{"position":[[622,4]]},"482":{"position":[[2027,7],[2204,7]]},"512":{"position":[[379,5]]},"524":{"position":[[516,4]]},"528":{"position":[[286,4]]},"532":{"position":[[1783,7]]},"536":{"position":[[921,7]]},"538":{"position":[[1302,4]]},"551":{"position":[[269,7],[838,7]]},"553":{"position":[[189,7]]},"555":{"position":[[83,7],[200,7],[384,7],[501,7],[969,7],[1086,7]]},"561":{"position":[[3570,4]]},"566":{"position":[[1290,4]]},"568":{"position":[[1490,5],[1507,5],[1744,4],[2184,5],[2201,6]]},"573":{"position":[[265,6]]},"579":{"position":[[400,7],[517,7]]},"581":{"position":[[583,7],[714,7]]},"584":{"position":[[89,7],[219,7],[336,7]]},"586":{"position":[[177,7],[532,7],[649,7]]},"588":{"position":[[366,7],[554,7],[671,7]]},"590":{"position":[[274,7],[629,7],[870,7]]},"592":{"position":[[498,7],[638,7],[774,7],[975,7],[1091,7]]},"594":{"position":[[552,7],[929,7],[1131,7],[1476,7]]},"600":{"position":[[286,5],[383,5]]},"602":{"position":[[202,5]]},"621":{"position":[[406,7],[704,7],[1007,4],[1048,4],[1145,4]]},"623":{"position":[[193,5],[227,4],[564,5]]},"629":{"position":[[104,5],[186,4],[538,5]]},"640":{"position":[[733,5]]},"642":{"position":[[895,5]]}}}],["name=[nameofsourc",{"_index":2490,"t":{"343":{"position":[[3660,19]]}}}],["names/interpol",{"_index":355,"t":{"19":{"position":[[1197,19]]}}}],["name}.json",{"_index":2668,"t":{"383":{"position":[[1386,13]]}}}],["nan",{"_index":1645,"t":{"172":{"position":[[562,4]]}}}],["nana",{"_index":1646,"t":{"172":{"position":[[570,4]]}}}],["nash",{"_index":2745,"t":{"408":{"position":[[165,4]]}}}],["nativ",{"_index":742,"t":{"55":{"position":[[265,6],[536,6],[7336,8],[7389,6]]},"114":{"position":[[722,6]]},"154":{"position":[[1029,7],[2251,9],[3450,9]]},"172":{"position":[[2144,6]]},"355":{"position":[[242,6],[665,8]]},"357":{"position":[[518,9],[895,8],[982,8],[1198,9],[1318,9],[1606,8],[1784,8],[2033,9],[2410,8]]},"359":{"position":[[185,9]]},"361":{"position":[[1006,6],[1044,6],[1115,9],[1303,7],[1323,6],[1475,9]]},"363":{"position":[[1245,6],[1303,9],[1428,6],[1502,6],[1585,9]]},"370":{"position":[[79,6]]},"395":{"position":[[4,6],[670,6]]},"397":{"position":[[1073,6]]},"399":{"position":[[136,9]]},"401":{"position":[[47,6],[385,9],[431,6]]},"403":{"position":[[849,6]]},"406":{"position":[[74,9],[451,9]]},"408":{"position":[[74,9],[350,9]]},"410":{"position":[[383,9]]},"482":{"position":[[1473,6]]},"557":{"position":[[665,6],[709,6],[1727,7]]},"561":{"position":[[4032,8],[4088,6],[4110,6],[4137,6],[4144,8],[4198,6],[4372,6],[4466,6],[5040,6],[5114,8]]},"573":{"position":[[670,6],[1158,8]]},"586":{"position":[[427,8]]},"590":{"position":[[99,6],[137,6],[524,9],[771,7],[791,6],[943,8]]},"592":{"position":[[812,8]]},"594":{"position":[[823,9],[1402,9]]}}}],["navidrom",{"_index":1412,"t":{"150":{"position":[[175,9],[940,9],[1863,11],[2863,11]]},"154":{"position":[[182,10],[348,9],[1294,9],[1416,9],[2637,11],[3810,11]]},"242":{"position":[[352,10],[660,9],[1084,9],[1857,9],[2903,10]]},"257":{"position":[[1993,11],[3324,11]]},"313":{"position":[[139,10],[406,11]]},"526":{"position":[[327,10]]},"530":{"position":[[113,9],[1368,9],[1627,9],[2079,10],[2194,9],[2375,9],[2479,10]]},"532":{"position":[[992,9]]},"536":{"position":[[130,9]]},"596":{"position":[[472,10]]},"600":{"position":[[223,10]]}}}],["navidrome'",{"_index":3072,"t":{"530":{"position":[[1477,11]]}}}],["navig",{"_index":818,"t":{"55":{"position":[[2776,8]]},"61":{"position":[[0,8]]},"83":{"position":[[208,8]]},"89":{"position":[[195,8],[296,10]]},"95":{"position":[[195,8],[296,10]]},"101":{"position":[[325,8]]},"111":{"position":[[52,8],[129,8]]},"118":{"position":[[197,8]]},"142":{"position":[[538,8]]},"194":{"position":[[243,8]]},"196":{"position":[[1147,8],[1743,8],[1939,8]]},"208":{"position":[[108,8]]},"253":{"position":[[56,8]]},"303":{"position":[[1081,8],[1848,8],[2070,8],[4468,8]]},"319":{"position":[[535,10]]},"343":{"position":[[2117,8]]},"538":{"position":[[300,8],[2083,8]]},"596":{"position":[[1567,8]]}}}],["nd_listenbrainz_baseurl",{"_index":2084,"t":{"251":{"position":[[42,24]]},"530":{"position":[[2124,24]]}}}],["nd_listenbrainz_baseurl=http://192.168.0.100:9078/1",{"_index":3075,"t":{"530":{"position":[[2314,52]]}}}],["nearli",{"_index":2872,"t":{"464":{"position":[[599,6]]}}}],["necessari",{"_index":1931,"t":{"208":{"position":[[683,9]]},"222":{"position":[[527,10],[948,10]]},"242":{"position":[[518,10],[933,10]]},"303":{"position":[[2159,9]]},"343":{"position":[[1822,10]]},"361":{"position":[[807,9]]},"383":{"position":[[1719,10]]}}}],["necessarili",{"_index":3453,"t":{"648":{"position":[[1327,11]]}}}],["need",{"_index":209,"t":{"15":{"position":[[1727,4]]},"21":{"position":[[429,4]]},"33":{"position":[[14,4]]},"55":{"position":[[786,7],[3892,4],[4415,4],[4821,4],[5319,4]]},"65":{"position":[[3837,4]]},"69":{"position":[[1035,5],[1151,5],[1213,4],[1394,4]]},"79":{"position":[[4045,4]]},"87":{"position":[[1203,4]]},"93":{"position":[[148,4],[277,6]]},"105":{"position":[[244,4]]},"109":{"position":[[2168,4]]},"111":{"position":[[9,4]]},"140":{"position":[[269,4]]},"142":{"position":[[114,5],[1077,4]]},"172":{"position":[[4662,7]]},"174":{"position":[[414,4]]},"184":{"position":[[414,5]]},"196":{"position":[[356,7],[984,5],[3206,4]]},"202":{"position":[[251,4]]},"214":{"position":[[264,4]]},"222":{"position":[[143,4],[1531,4],[2428,4]]},"226":{"position":[[70,4],[421,4]]},"228":{"position":[[7,4]]},"242":{"position":[[143,4],[1512,4],[2414,4]]},"248":{"position":[[7,4]]},"263":{"position":[[343,4]]},"307":{"position":[[379,4]]},"331":{"position":[[897,4],[1008,4]]},"341":{"position":[[277,4]]},"343":{"position":[[531,5],[3299,4],[4178,4],[4639,4]]},"347":{"position":[[241,4]]},"353":{"position":[[836,4]]},"368":{"position":[[50,6]]},"383":{"position":[[960,6],[2327,5]]},"448":{"position":[[1805,4]]},"470":{"position":[[112,5]]},"532":{"position":[[287,5]]},"534":{"position":[[20,5]]},"561":{"position":[[1296,6]]},"581":{"position":[[355,6],[417,4]]},"596":{"position":[[1938,4]]},"600":{"position":[[301,6]]},"602":{"position":[[217,6]]},"610":{"position":[[234,4]]},"619":{"position":[[313,5]]},"633":{"position":[[138,4]]},"642":{"position":[[104,4]]},"648":{"position":[[680,4],[1339,4]]},"653":{"position":[[1391,4]]}}}],["netstat",{"_index":834,"t":{"55":{"position":[[4140,7],[4546,7]]}}}],["network",{"_index":740,"t":{"55":{"position":[[234,8],[5702,7],[7088,7],[9347,7]]},"67":{"position":[[370,7]]},"125":{"position":[[5,10]]},"128":{"position":[[203,7]]},"196":{"position":[[1163,7],[1955,7]]},"208":{"position":[[1449,7]]},"214":{"position":[[163,7],[187,7]]},"216":{"position":[[485,7]]},"275":{"position":[[1362,7],[1418,7]]},"323":{"position":[[676,7]]},"383":{"position":[[366,7],[901,9],[2779,7]]},"448":{"position":[[1331,8],[2296,7]]},"452":{"position":[[30,7],[820,8],[1018,8]]},"476":{"position":[[8,10],[746,7],[1143,7]]},"596":{"position":[[1080,7]]}}}],["network/usb/cd",{"_index":2704,"t":{"391":{"position":[[55,14]]}}}],["network/your",{"_index":2433,"t":{"335":{"position":[[168,12]]}}}],["never",{"_index":89,"t":{"9":{"position":[[332,5]]},"72":{"position":[[885,5]]},"136":{"position":[[792,5]]},"140":{"position":[[1107,5]]},"172":{"position":[[2079,5]]},"198":{"position":[[1495,5]]},"210":{"position":[[1205,5],[1349,5]]},"566":{"position":[[1695,5]]}}}],["new",{"_index":731,"t":{"53":{"position":[[144,4]]},"77":{"position":[[291,4]]},"83":{"position":[[269,3]]},"87":{"position":[[1108,3]]},"101":{"position":[[448,3]]},"111":{"position":[[206,3]]},"118":{"position":[[308,3]]},"128":{"position":[[1309,3]]},"134":{"position":[[108,6]]},"172":{"position":[[3594,5],[3862,3],[4098,3]]},"190":{"position":[[1000,3]]},"192":{"position":[[103,3]]},"208":{"position":[[247,3]]},"234":{"position":[[68,3]]},"259":{"position":[[69,3]]},"297":{"position":[[1746,3]]},"303":{"position":[[5205,3]]},"315":{"position":[[29,3],[158,3]]},"343":{"position":[[1333,3],[1842,3],[1952,3]]},"349":{"position":[[192,3],[232,3]]},"353":{"position":[[1468,5],[1563,3]]},"377":{"position":[[418,3]]},"448":{"position":[[473,3]]},"454":{"position":[[1193,3]]},"470":{"position":[[357,3],[705,3],[815,3],[2985,3]]},"499":{"position":[[227,3],[309,3],[350,3],[431,3]]},"503":{"position":[[9,3]]},"505":{"position":[[162,3]]},"518":{"position":[[156,3],[217,3]]},"522":{"position":[[206,3]]},"524":{"position":[[681,3]]},"528":{"position":[[9,3]]},"530":{"position":[[1743,3],[3002,3]]},"538":{"position":[[361,3],[2209,3]]},"555":{"position":[[1208,3]]},"596":{"position":[[1342,3],[1416,3]]},"598":{"position":[[124,3]]},"625":{"position":[[374,3],[741,3]]},"633":{"position":[[73,3]]},"635":{"position":[[34,3]]},"638":{"position":[[17,3],[138,3],[1160,3],[1897,3]]},"640":{"position":[[18,3]]},"642":{"position":[[1066,3],[1338,3]]},"646":{"position":[[581,3],[948,3],[1101,3],[1230,3],[2588,3]]},"648":{"position":[[2840,3]]},"651":{"position":[[1070,3]]},"653":{"position":[[726,3],[1039,4],[1841,3],[2688,3],[2911,5]]}}}],["newer",{"_index":3318,"t":{"631":{"position":[[355,5]]}}}],["newli",{"_index":2479,"t":{"343":{"position":[[2452,5]]},"648":{"position":[[763,7]]}}}],["newplay",{"_index":3469,"t":{"648":{"position":[[2760,8],[2775,8],[2971,9]]}}}],["newsourc",{"_index":3394,"t":{"642":{"position":[[1219,10],[1320,9]]}}}],["next",{"_index":1361,"t":{"136":{"position":[[454,4]]},"140":{"position":[[781,4]]},"210":{"position":[[881,4]]},"361":{"position":[[55,4],[706,4]]},"478":{"position":[[277,4]]},"524":{"position":[[120,4]]},"561":{"position":[[809,4]]},"621":{"position":[[377,4],[661,4]]},"623":{"position":[[895,4]]},"646":{"position":[[0,4]]},"653":{"position":[[1880,4]]}}}],["nginx/traefik/caddi",{"_index":2266,"t":{"303":{"position":[[2735,21]]}}}],["nice",{"_index":2526,"t":{"347":{"position":[[797,4]]}}}],["nightli",{"_index":857,"t":{"55":{"position":[[5176,8]]}}}],["nightmar",{"_index":2903,"t":{"470":{"position":[[1968,10]]}}}],["nmigtageambmgbyqgsm49ageg",{"_index":1852,"t":{"196":{"position":[[3583,29]]},"200":{"position":[[2208,29],[3902,29]]}}}],["node",{"_index":991,"t":{"67":{"position":[[2384,4]]},"81":{"position":[[2667,4]]},"85":{"position":[[2156,4]]},"91":{"position":[[2386,4]]},"99":{"position":[[2446,4]]},"103":{"position":[[2067,4]]},"107":{"position":[[2273,4]]},"114":{"position":[[3381,4]]},"121":{"position":[[2680,4]]},"144":{"position":[[2258,4]]},"164":{"position":[[2280,4]]},"168":{"position":[[2558,4]]},"200":{"position":[[2762,4]]},"206":{"position":[[2179,4]]},"208":{"position":[[5787,4]]},"212":{"position":[[2011,4]]},"218":{"position":[[2206,4]]},"232":{"position":[[2265,4]]},"236":{"position":[[2698,4]]},"238":{"position":[[2813,4]]},"257":{"position":[[2344,4]]},"261":{"position":[[2768,4]]},"265":{"position":[[2596,4]]},"269":{"position":[[2365,4]]},"273":{"position":[[2182,4]]},"277":{"position":[[2154,4]]},"281":{"position":[[2139,4]]},"289":{"position":[[2418,4]]},"295":{"position":[[2676,4]]},"301":{"position":[[2707,4]]},"305":{"position":[[2304,4]]},"309":{"position":[[498,4]]},"311":{"position":[[31,4]]},"317":{"position":[[2277,4]]},"321":{"position":[[2009,4]]},"329":{"position":[[2128,4]]},"333":{"position":[[2160,4]]},"341":{"position":[[3909,4]]},"345":{"position":[[2405,4]]},"375":{"position":[[21,4],[165,4],[365,4]]},"389":{"position":[[46,4]]},"393":{"position":[[2018,4]]},"435":{"position":[[48,4]]},"442":{"position":[[125,4],[305,4],[483,4]]},"482":{"position":[[242,4],[1547,4],[1621,6],[1905,4]]}}}],["node/npm",{"_index":2134,"t":{"275":{"position":[[545,9]]}}}],["node@^4.9.6",{"_index":2985,"t":{"482":{"position":[[1698,12]]}}}],["node_env=product",{"_index":2694,"t":{"389":{"position":[[26,19]]}}}],["node_modul",{"_index":2798,"t":{"442":{"position":[[178,12]]}}}],["node_modules/.bin/tsx",{"_index":2695,"t":{"389":{"position":[[51,21]]}}}],["nodej",{"_index":1596,"t":{"166":{"position":[[1513,6]]},"596":{"position":[[1317,6]]}}}],["nois",{"_index":1824,"t":{"196":{"position":[[950,5]]}}}],["noisi",{"_index":594,"t":{"31":{"position":[[267,5]]},"490":{"position":[[183,6]]}}}],["non",{"_index":519,"t":{"29":{"position":[[719,3],[893,3]]},"55":{"position":[[5481,4],[6867,4],[8710,4]]},"69":{"position":[[734,3]]},"72":{"position":[[389,3]]},"114":{"position":[[263,3]]},"121":{"position":[[362,3]]},"154":{"position":[[1710,3]]},"172":{"position":[[320,3]]},"283":{"position":[[85,3]]},"303":{"position":[[1147,4]]},"395":{"position":[[217,3]]},"464":{"position":[[349,3]]},"520":{"position":[[109,3]]},"524":{"position":[[410,3]]},"568":{"position":[[2053,3]]},"575":{"position":[[310,3]]},"653":{"position":[[1135,3]]}}}],["none",{"_index":369,"t":{"19":{"position":[[1641,4]]},"65":{"position":[[1315,4]]},"79":{"position":[[1456,4]]},"140":{"position":[[189,4]]},"204":{"position":[[748,5]]},"216":{"position":[[758,5]]},"283":{"position":[[1059,5]]},"359":{"position":[[927,4]]},"365":{"position":[[868,6]]},"448":{"position":[[845,8]]},"499":{"position":[[386,4]]}}}],["normal",{"_index":675,"t":{"42":{"position":[[324,8]]},"55":{"position":[[3018,9]]},"61":{"position":[[242,9]]},"65":{"position":[[2956,8]]},"79":{"position":[[3131,8]]},"109":{"position":[[796,8]]},"116":{"position":[[794,8]]},"172":{"position":[[217,13]]},"188":{"position":[[85,9],[371,9]]},"198":{"position":[[1856,14]]},"303":{"position":[[1266,8]]},"343":{"position":[[942,6]]},"414":{"position":[[243,13]]},"488":{"position":[[467,9]]},"575":{"position":[[160,10],[314,6]]},"646":{"position":[[487,6],[1341,11]]}}}],["normalization/simiarl",{"_index":1746,"t":{"172":{"position":[[4996,25]]}}}],["normalizealbum",{"_index":1882,"t":{"198":{"position":[[2284,17],[2807,17]]},"200":{"position":[[2468,17],[4162,17]]}}}],["normalizeprotocol",{"_index":3420,"t":{"646":{"position":[[543,18]]}}}],["normalizeurl(v",{"_index":3418,"t":{"646":{"position":[[496,17]]}}}],["note",{"_index":246,"t":{"15":{"position":[[3215,5]]},"55":{"position":[[8723,4]]},"63":{"position":[[0,4]]},"79":{"position":[[145,4]]},"83":{"position":[[416,4]]},"87":{"position":[[1466,4]]},"118":{"position":[[0,4]]},"132":{"position":[[294,4],[423,4]]},"136":{"position":[[0,4]]},"142":{"position":[[1284,4]]},"166":{"position":[[150,4],[388,4]]},"168":{"position":[[79,4]]},"172":{"position":[[1802,4]]},"196":{"position":[[2794,5],[3345,4]]},"198":{"position":[[1316,5]]},"210":{"position":[[73,4]]},"226":{"position":[[394,5]]},"283":{"position":[[260,4]]},"307":{"position":[[30,4]]},"327":{"position":[[182,4]]},"359":{"position":[[1032,4]]},"418":{"position":[[387,4]]},"510":{"position":[[196,5],[235,5]]},"514":{"position":[[94,5]]},"516":{"position":[[61,5],[133,6]]},"518":{"position":[[339,5]]},"526":{"position":[[441,4]]},"530":{"position":[[2596,4],[3535,4]]},"532":{"position":[[267,4]]},"534":{"position":[[0,4]]},"538":{"position":[[508,4]]},"559":{"position":[[0,4]]},"561":{"position":[[7002,4]]},"623":{"position":[[1079,4]]},"631":{"position":[[55,6],[126,5],[632,6]]},"653":{"position":[[3888,4]]}}}],["noth",{"_index":524,"t":{"29":{"position":[[1009,7]]},"179":{"position":[[614,7]]},"188":{"position":[[479,8]]},"190":{"position":[[367,7]]}}}],["notic",{"_index":2535,"t":{"351":{"position":[[7,6]]}}}],["notif",{"_index":619,"t":{"38":{"position":[[21,12],[745,12],[1098,12]]},"55":{"position":[[941,13],[1138,14]]},"275":{"position":[[123,12]]},"377":{"position":[[360,12]]},"542":{"position":[[401,12]]}}}],["notifi",{"_index":763,"t":{"55":{"position":[[917,6]]}}}],["now",{"_index":13,"t":{"4":{"position":[[5,3]]},"11":{"position":[[119,3],[146,3],[260,3],[283,3],[466,3],[936,3],[1238,3],[1305,3]]},"44":{"position":[[20,3]]},"50":{"position":[[20,3]]},"55":{"position":[[3091,3]]},"61":{"position":[[315,3]]},"69":{"position":[[20,3]]},"114":{"position":[[954,3]]},"138":{"position":[[272,3]]},"172":{"position":[[2665,4]]},"190":{"position":[[1336,3]]},"198":{"position":[[264,4]]},"248":{"position":[[696,3]]},"315":{"position":[[461,3]]},"319":{"position":[[657,3]]},"343":{"position":[[2383,3],[2799,4]]},"444":{"position":[[69,3]]},"505":{"position":[[286,3]]},"518":{"position":[[68,5]]},"540":{"position":[[283,3],[565,3]]},"596":{"position":[[596,4],[881,3],[1385,3]]},"619":{"position":[[174,3]]},"629":{"position":[[161,3]]},"638":{"position":[[1876,3],[2140,3]]},"644":{"position":[[0,3]]},"648":{"position":[[3063,3]]}}}],["now_playing=fals",{"_index":110,"t":{"11":{"position":[[372,17]]}}}],["now_playing=tru",{"_index":109,"t":{"11":{"position":[[352,16]]}}}],["nowplay",{"_index":136,"t":{"11":{"position":[[1136,15],[1317,15]]}}}],["npm",{"_index":192,"t":{"15":{"position":[[1125,3]]},"375":{"position":[[412,3],[424,3]]},"377":{"position":[[387,3]]},"442":{"position":[[320,3],[498,3]]},"482":{"position":[[255,3],[267,3],[291,3],[305,3],[2300,3]]}}}],["npm/node",{"_index":2960,"t":{"482":{"position":[[525,9]]}}}],["npm:@rollup/wasm",{"_index":2984,"t":{"482":{"position":[[1680,17]]}}}],["ntfi",{"_index":312,"t":{"15":{"position":[[5499,7]]},"38":{"position":[[614,7],[998,5],[1184,7]]},"596":{"position":[[833,5]]}}}],["ntfyconfig",{"_index":632,"t":{"38":{"position":[[1035,10]]}}}],["ntfyserveron",{"_index":626,"t":{"38":{"position":[[589,16]]}}}],["null",{"_index":2655,"t":{"383":{"position":[[491,4]]},"646":{"position":[[615,4],[857,4],[1004,4]]}}}],["number",{"_index":78,"t":{"9":{"position":[[142,6]]},"19":{"position":[[1323,8]]},"29":{"position":[[2331,6],[4306,6]]},"42":{"position":[[213,6]]},"204":{"position":[[417,6]]},"216":{"position":[[423,6]]},"283":{"position":[[794,6]]},"347":{"position":[[329,6]]},"368":{"position":[[30,6]]},"648":{"position":[[2131,6]]}}}],["numer",{"_index":3186,"t":{"564":{"position":[[46,7]]}}}],["nvm",{"_index":2632,"t":{"375":{"position":[[137,3],[332,3]]},"482":{"position":[[207,3]]}}}],["o",{"_index":2790,"t":{"440":{"position":[[263,1],[302,1]]},"470":{"position":[[2079,1]]}}}],["oauth",{"_index":2456,"t":{"343":{"position":[[557,5],[1369,5],[1549,5],[1893,5],[2170,6],[2893,5],[3174,5],[3786,5]]},"345":{"position":[[354,5],[441,5],[511,5]]},"454":{"position":[[409,6],[427,5]]}}}],["obj",{"_index":3406,"t":{"644":{"position":[[407,5],[750,4]]}}}],["object",{"_index":362,"t":{"19":{"position":[[1342,8]]},"142":{"position":[[725,7]]},"353":{"position":[[1153,6]]},"357":{"position":[[236,6],[321,6]]},"359":{"position":[[167,7],[874,6]]},"363":{"position":[[66,6],[117,6],[606,6],[784,6],[1117,7]]},"365":{"position":[[84,6]]},"381":{"position":[[197,6],[214,6]]},"416":{"position":[[336,6]]},"625":{"position":[[776,7],[1368,7],[1406,6]]},"651":{"position":[[939,6]]}}}],["object.values(cp).every(x",{"_index":3389,"t":{"642":{"position":[[809,27]]}}}],["obscur",{"_index":3127,"t":{"544":{"position":[[1030,8]]},"546":{"position":[[427,8]]}}}],["obtain",{"_index":1034,"t":{"72":{"position":[[750,9],[961,9],[1079,6]]},"194":{"position":[[637,6]]},"343":{"position":[[665,6]]}}}],["occur",{"_index":121,"t":{"11":{"position":[[631,5]]},"172":{"position":[[2916,8],[3013,6]]},"182":{"position":[[72,6]]},"365":{"position":[[56,6]]},"383":{"position":[[2815,8]]},"452":{"position":[[47,8],[458,5]]},"470":{"position":[[371,6],[914,5],[2682,9],[3259,8]]},"488":{"position":[[371,8],[414,6]]},"512":{"position":[[229,7]]},"623":{"position":[[1102,6]]},"651":{"position":[[1087,8]]}}}],["occurr",{"_index":2854,"t":{"452":{"position":[[589,10]]},"575":{"position":[[398,10]]}}}],["off",{"_index":1533,"t":{"160":{"position":[[450,5]]}}}],["offici",{"_index":749,"t":{"55":{"position":[[431,8],[5157,10]]},"69":{"position":[[832,8]]},"87":{"position":[[355,10]]},"93":{"position":[[113,8]]},"97":{"position":[[25,8]]},"105":{"position":[[311,8]]},"114":{"position":[[641,8]]},"154":{"position":[[2117,13],[3316,13]]},"190":{"position":[[146,10]]},"192":{"position":[[64,8]]},"196":{"position":[[93,8]]},"198":{"position":[[1990,8],[2148,8]]},"208":{"position":[[1193,8]]},"263":{"position":[[410,8]]},"454":{"position":[[768,8]]},"462":{"position":[[189,8]]},"553":{"position":[[305,13]]},"566":{"position":[[356,8],[683,9],[1410,10],[1443,12]]},"568":{"position":[[860,10],[926,12]]},"573":{"position":[[386,8],[447,13],[799,8],[860,13]]},"586":{"position":[[295,13]]},"590":{"position":[[392,13]]},"594":{"position":[[691,13],[1270,13]]}}}],["offlin",{"_index":771,"t":{"55":{"position":[[1217,8]]},"440":{"position":[[64,7]]},"530":{"position":[[1563,7]]}}}],["ogg",{"_index":1987,"t":{"210":{"position":[[2016,6],[2230,4]]}}}],["ogon",{"_index":1644,"t":{"172":{"position":[[557,4]]}}}],["ok",{"_index":649,"t":{"40":{"position":[[132,2]]},"174":{"position":[[900,3]]},"470":{"position":[[758,4]]},"653":{"position":[[2997,2]]}}}],["okay",{"_index":3194,"t":{"566":{"position":[[415,4]]}}}],["old",{"_index":1098,"t":{"87":{"position":[[229,3]]},"150":{"position":[[395,3],[2157,4],[3178,4]]},"154":{"position":[[2831,4],[4034,4]]},"343":{"position":[[1922,3]]},"524":{"position":[[797,3]]}}}],["older",{"_index":1099,"t":{"87":{"position":[[301,5]]},"198":{"position":[[274,5],[721,5]]}}}],["oldi",{"_index":1413,"t":{"150":{"position":[[348,6],[2089,11],[3104,10]]}}}],["omit",{"_index":1340,"t":{"132":{"position":[[341,7]]},"401":{"position":[[184,8]]},"414":{"position":[[516,8]]},"600":{"position":[[428,7]]}}}],["on",{"_index":152,"t":{"15":{"position":[[123,3],[278,3],[657,3],[681,3],[1552,3],[3306,3]]},"21":{"position":[[226,3]]},"33":{"position":[[330,3]]},"55":{"position":[[7257,3]]},"67":{"position":[[2181,3],[2488,3],[3008,3]]},"69":{"position":[[1455,3]]},"81":{"position":[[2464,3],[2771,3],[3291,3]]},"85":{"position":[[1955,3],[2260,3],[2778,3]]},"91":{"position":[[2184,3],[2490,3],[3009,3]]},"99":{"position":[[2243,3],[2550,3],[3070,3]]},"103":{"position":[[1865,3],[2171,3],[2690,3]]},"107":{"position":[[2065,3],[2377,3],[2902,3]]},"114":{"position":[[3178,3],[3485,3],[4005,3]]},"118":{"position":[[193,3]]},"121":{"position":[[2478,3],[2784,3],[3303,3]]},"134":{"position":[[1103,3]]},"142":{"position":[[1220,3]]},"144":{"position":[[2053,3],[2362,3],[2884,3]]},"152":{"position":[[60,3],[200,3]]},"158":{"position":[[229,3]]},"164":{"position":[[2078,3],[2384,3],[2903,3]]},"168":{"position":[[2352,3],[2662,3],[3185,3]]},"172":{"position":[[2364,3]]},"174":{"position":[[52,3],[67,3],[181,3]]},"188":{"position":[[9,3],[578,4]]},"190":{"position":[[353,4]]},"198":{"position":[[351,4]]},"200":{"position":[[2556,3],[2866,3],[3389,3]]},"206":{"position":[[1979,3],[2283,3],[2800,3]]},"208":{"position":[[1209,3],[5583,3],[5891,3],[6412,3]]},"212":{"position":[[1808,3],[2115,3],[2635,3]]},"218":{"position":[[2004,3],[2310,3],[2829,3]]},"220":{"position":[[517,3]]},"222":{"position":[[20,3],[169,3],[344,3],[426,3],[619,3],[832,3],[1049,3],[1386,3],[1536,3],[1816,3],[2283,3],[2433,3],[2929,3],[3028,3]]},"226":{"position":[[27,3],[334,3]]},"228":{"position":[[32,3]]},"230":{"position":[[414,3]]},"232":{"position":[[2058,3],[2369,3],[2893,3]]},"236":{"position":[[2496,3],[2802,3],[3321,3]]},"238":{"position":[[2612,3],[2917,3],[3435,3]]},"242":{"position":[[20,3],[169,3],[334,3],[412,3],[604,3],[815,3],[1028,3],[1362,3],[1517,3],[1801,3],[2264,3],[2419,3],[2885,3],[2980,3]]},"244":{"position":[[33,3]]},"246":{"position":[[310,4]]},"248":{"position":[[32,3]]},"253":{"position":[[533,4]]},"255":{"position":[[414,3]]},"257":{"position":[[2138,3],[2448,3],[2971,3]]},"261":{"position":[[2565,3],[2872,3],[3392,3]]},"265":{"position":[[2388,3],[2700,3],[3225,3]]},"269":{"position":[[2163,3],[2469,3],[2988,3]]},"273":{"position":[[1977,3],[2286,3],[2808,3]]},"277":{"position":[[1953,3],[2258,3],[2776,3]]},"281":{"position":[[1940,3],[2243,3],[2759,3]]},"289":{"position":[[2216,3],[2522,3],[3041,3]]},"295":{"position":[[2473,3],[2780,3],[3300,3]]},"301":{"position":[[43,3],[2506,3],[2811,3],[3329,3]]},"303":{"position":[[2381,3]]},"305":{"position":[[2101,3],[2408,3],[2928,3]]},"311":{"position":[[397,3]]},"313":{"position":[[196,3],[485,4]]},"317":{"position":[[2073,3],[2381,3],[2902,3]]},"319":{"position":[[1493,3]]},"321":{"position":[[1810,3],[2113,3],[2629,3]]},"329":{"position":[[1920,3],[2232,3],[2757,3]]},"333":{"position":[[1956,3],[2264,3],[2785,3]]},"341":{"position":[[309,3],[3707,3],[4013,3],[4532,3]]},"343":{"position":[[510,3],[2059,3]]},"345":{"position":[[2202,3],[2509,3],[3029,3]]},"353":{"position":[[999,3]]},"355":{"position":[[24,3]]},"393":{"position":[[1813,3],[2122,3],[2644,3]]},"395":{"position":[[464,3]]},"397":{"position":[[1158,3],[1330,3]]},"401":{"position":[[117,3]]},"414":{"position":[[483,3]]},"431":{"position":[[172,3],[216,3],[559,3],[624,4]]},"462":{"position":[[71,3]]},"476":{"position":[[1200,3]]},"530":{"position":[[3218,3]]},"551":{"position":[[487,3]]},"557":{"position":[[354,3],[434,3]]},"561":{"position":[[1160,3],[1188,3],[3665,3],[5221,3],[6784,3]]},"568":{"position":[[661,3],[2367,3],[2770,3]]},"575":{"position":[[624,3]]},"596":{"position":[[2153,3]]},"598":{"position":[[30,3],[54,3]]},"638":{"position":[[1069,3]]}}}],["onc",{"_index":1013,"t":{"69":{"position":[[1163,5]]},"166":{"position":[[1200,4]]},"196":{"position":[[2336,4]]},"343":{"position":[[4537,4]]},"532":{"position":[[309,4]]},"534":{"position":[[42,4]]}}}],["one/mi",{"_index":2775,"t":{"431":{"position":[[459,6]]}}}],["onfailur",{"_index":2565,"t":{"361":{"position":[[324,9],[1367,11],[1438,12]]},"561":{"position":[[7098,11]]},"590":{"position":[[835,11],[906,12]]}}}],["onlin",{"_index":723,"t":{"48":{"position":[[305,6]]},"63":{"position":[[96,6]]},"69":{"position":[[1584,8]]},"72":{"position":[[1060,6]]},"75":{"position":[[425,7],[545,6],[620,6],[704,7],[742,6],[849,6],[1068,10]]}}}],["online,idle,dnd",{"_index":1056,"t":{"81":{"position":[[727,15]]}}}],["onskip",{"_index":2566,"t":{"361":{"position":[[458,6]]},"363":{"position":[[474,9]]}}}],["onsuccess",{"_index":2564,"t":{"361":{"position":[[247,9],[1417,12]]},"590":{"position":[[885,12]]}}}],["op",{"_index":1708,"t":{"172":{"position":[[3823,3],[3939,3],[4257,3],[4378,3]]}}}],["opaqu",{"_index":1786,"t":{"190":{"position":[[90,9]]}}}],["open",{"_index":454,"t":{"25":{"position":[[380,4]]},"46":{"position":[[256,4]]},"55":{"position":[[5636,6],[7022,6],[9281,6]]},"69":{"position":[[1477,4]]},"75":{"position":[[380,4]]},"128":{"position":[[509,4]]},"158":{"position":[[331,4],[599,4]]},"166":{"position":[[262,4]]},"194":{"position":[[179,4]]},"196":{"position":[[1088,4],[1483,6],[1713,4],[1872,4]]},"226":{"position":[[379,4]]},"315":{"position":[[33,4]]},"319":{"position":[[86,4]]},"323":{"position":[[44,4]]},"331":{"position":[[1173,4],[1332,7]]},"377":{"position":[[298,4]]},"383":{"position":[[1880,4]]},"389":{"position":[[234,6]]},"448":{"position":[[2267,5],[2369,4]]},"492":{"position":[[69,7]]},"499":{"position":[[187,7]]},"507":{"position":[[0,4]]},"524":{"position":[[71,4]]},"596":{"position":[[1979,4]]}}}],["oper",{"_index":674,"t":{"42":{"position":[[314,9]]},"109":{"position":[[612,8]]},"116":{"position":[[610,8]]},"275":{"position":[[76,9],[335,9]]},"379":{"position":[[385,8],[490,8]]},"381":{"position":[[278,7]]},"383":{"position":[[988,8]]},"648":{"position":[[46,7],[160,7]]}}}],["opinion",{"_index":3110,"t":{"544":{"position":[[347,8]]},"573":{"position":[[283,11]]}}}],["oppos",{"_index":2816,"t":{"448":{"position":[[168,7]]},"568":{"position":[[1300,7]]},"635":{"position":[[965,7]]}}}],["option",{"_index":135,"t":{"11":{"position":[[1102,10]]},"15":{"position":[[3816,7],[5622,11],[5646,11]]},"17":{"position":[[43,7]]},"23":{"position":[[183,9]]},"31":{"position":[[51,8],[72,7]]},"38":{"position":[[709,10],[1062,10],[1306,11],[1330,11]]},"55":{"position":[[3251,8]]},"61":{"position":[[475,8]]},"91":{"position":[[516,8],[572,8]]},"99":{"position":[[340,8],[399,8],[503,8],[560,8],[661,10]]},"134":{"position":[[1399,7],[1474,10]]},"136":{"position":[[644,7],[712,10]]},"140":{"position":[[948,7],[1016,10]]},"154":{"position":[[2681,10],[3877,10]]},"160":{"position":[[215,6],[360,10],[421,6]]},"166":{"position":[[3543,10]]},"198":{"position":[[1763,7],[2277,6],[2794,10],[3105,10]]},"200":{"position":[[2402,10],[4096,10]]},"208":{"position":[[5457,10],[7286,10]]},"210":{"position":[[1048,7],[1114,10],[2099,7]]},"214":{"position":[[146,7]]},"216":{"position":[[493,8]]},"220":{"position":[[663,6]]},"236":{"position":[[565,8],[628,8]]},"240":{"position":[[198,6]]},"261":{"position":[[375,8],[441,8],[552,8],[616,8],[724,10]]},"281":{"position":[[1836,10],[3207,10]]},"297":{"position":[[1201,7],[1449,10]]},"299":{"position":[[4,8]]},"309":{"position":[[303,6]]},"311":{"position":[[1033,10],[1518,10]]},"313":{"position":[[643,8]]},"315":{"position":[[399,9]]},"319":{"position":[[782,8],[1654,10],[2449,10]]},"333":{"position":[[441,8]]},"343":{"position":[[1146,10],[2736,10],[4039,10]]},"345":{"position":[[2108,10],[3588,10]]},"351":{"position":[[464,10]]},"353":{"position":[[1381,10]]},"355":{"position":[[677,9]]},"357":{"position":[[837,10],[1548,10],[1726,10],[2352,10]]},"361":{"position":[[14,10],[924,10],[1205,10]]},"365":{"position":[[397,10]]},"375":{"position":[[342,9]]},"381":{"position":[[204,9],[350,7],[362,8]]},"385":{"position":[[283,8]]},"397":{"position":[[657,7]]},"401":{"position":[[327,10]]},"406":{"position":[[393,10]]},"408":{"position":[[292,10]]},"410":{"position":[[325,10]]},"414":{"position":[[659,10]]},"418":{"position":[[143,10]]},"470":{"position":[[1505,7],[1579,10],[2214,11],[2351,7],[2414,10]]},"476":{"position":[[329,11],[1019,11],[2354,11]]},"478":{"position":[[331,8],[427,7]]},"482":{"position":[[217,9]]},"530":{"position":[[1689,7],[2864,9]]},"532":{"position":[[200,9],[1978,10]]},"536":{"position":[[1116,10]]},"540":{"position":[[500,7]]},"542":{"position":[[25,7]]},"555":{"position":[[127,10],[428,10],[1013,10]]},"559":{"position":[[46,9]]},"561":{"position":[[1501,6],[3811,10],[4044,8]]},"573":{"position":[[64,8]]},"579":{"position":[[444,10]]},"581":{"position":[[627,10]]},"584":{"position":[[263,10]]},"586":{"position":[[576,10]]},"588":{"position":[[598,10]]},"590":{"position":[[673,10]]},"592":{"position":[[701,10],[1018,10]]},"594":{"position":[[965,10],[1531,10]]},"600":{"position":[[359,8]]},"610":{"position":[[75,7]]},"625":{"position":[[1060,6]]},"631":{"position":[[500,8]]},"642":{"position":[[247,7]]},"644":{"position":[[631,8]]},"651":{"position":[[681,9]]}}}],["order",{"_index":141,"t":{"11":{"position":[[1253,5]]},"53":{"position":[[33,5]]},"55":{"position":[[3947,5]]},"65":{"position":[[149,5],[228,5]]},"72":{"position":[[58,5]]},"79":{"position":[[240,5],[319,5]]},"142":{"position":[[1111,5]]},"166":{"position":[[116,5]]},"172":{"position":[[580,5],[684,7],[3376,5]]},"202":{"position":[[3,5]]},"208":{"position":[[1991,5]]},"214":{"position":[[3,5]]},"226":{"position":[[451,5]]},"271":{"position":[[3,5]]},"279":{"position":[[248,5]]},"301":{"position":[[66,5]]},"303":{"position":[[3171,5]]},"343":{"position":[[2067,5]]},"373":{"position":[[339,5]]},"383":{"position":[[306,5],[2401,5]]},"470":{"position":[[30,5]]},"476":{"position":[[817,5]]},"532":{"position":[[75,5]]},"561":{"position":[[1049,5],[1130,5],[1231,5],[1475,5],[1603,5]]},"568":{"position":[[732,5]]},"621":{"position":[[1163,5]]},"623":{"position":[[1453,5]]},"648":{"position":[[289,5]]}}}],["org.opencontainers.image.vers",{"_index":3061,"t":{"524":{"position":[[348,32]]}}}],["organ",{"_index":1478,"t":{"154":{"position":[[97,10]]},"561":{"position":[[6328,9],[6430,9]]},"579":{"position":[[102,9]]}}}],["origin",{"_index":506,"t":{"29":{"position":[[526,8]]},"172":{"position":[[2258,9],[4867,10]]},"179":{"position":[[187,8]]},"196":{"position":[[2411,6],[2556,9],[2596,6],[2750,6]]},"200":{"position":[[496,6],[2347,9],[4041,9]]},"341":{"position":[[186,11]]},"343":{"position":[[2282,7]]},"365":{"position":[[148,8],[289,8],[537,8],[757,8],[814,9],[907,9],[962,9]]},"470":{"position":[[1845,10],[1935,10],[2035,10],[2118,10]]},"544":{"position":[[1254,10]]},"548":{"position":[[158,10]]},"557":{"position":[[891,8]]},"568":{"position":[[1152,8],[1278,8],[1585,8],[2229,8],[2309,8]]},"592":{"position":[[159,8],[1206,8]]}}}],["os",{"_index":711,"t":{"46":{"position":[[304,2]]},"55":{"position":[[3605,3],[3678,2],[3795,2]]},"166":{"position":[[965,2]]},"482":{"position":[[931,2]]}}}],["os/contain",{"_index":161,"t":{"15":{"position":[[359,12]]}}}],["other",{"_index":940,"t":{"65":{"position":[[3190,7]]},"79":{"position":[[3365,7]]},"230":{"position":[[256,6]]},"255":{"position":[[256,6]]},"596":{"position":[[2228,6]]}}}],["otherwis",{"_index":1342,"t":{"132":{"position":[[601,10]]},"140":{"position":[[259,9]]},"208":{"position":[[1426,9]]},"361":{"position":[[405,9]]},"476":{"position":[[186,10]]},"644":{"position":[[505,9]]}}}],["out",{"_index":334,"t":{"19":{"position":[[199,3]]},"55":{"position":[[8887,3]]},"174":{"position":[[844,4]]},"190":{"position":[[1414,3]]},"196":{"position":[[942,3]]},"198":{"position":[[2132,3]]},"343":{"position":[[1988,3]]},"457":{"position":[[405,3]]},"542":{"position":[[429,3]]},"568":{"position":[[437,3]]},"577":{"position":[[139,3]]},"596":{"position":[[1536,3],[1619,3]]}}}],["outcom",{"_index":2562,"t":{"361":{"position":[[122,7]]},"623":{"position":[[990,7]]}}}],["output",{"_index":591,"t":{"31":{"position":[[111,6],[163,6]]},"166":{"position":[[3121,6],[3328,6]]},"230":{"position":[[956,7]]},"255":{"position":[[961,7]]},"319":{"position":[[2300,6]]},"365":{"position":[[141,6],[182,6],[282,6],[323,6],[484,6]]},"383":{"position":[[642,6]]},"448":{"position":[[1557,6]]},"464":{"position":[[516,6]]},"610":{"position":[[121,6]]}}}],["outsid",{"_index":1097,"t":{"87":{"position":[[134,7]]},"105":{"position":[[132,7]]},"190":{"position":[[691,8]]},"220":{"position":[[61,7]]},"234":{"position":[[199,7]]},"240":{"position":[[61,7]]},"263":{"position":[[231,7]]},"303":{"position":[[4103,8]]},"323":{"position":[[657,7]]}}}],["outta",{"_index":2905,"t":{"470":{"position":[[2012,5]]}}}],["over",{"_index":256,"t":{"15":{"position":[[3929,4]]},"55":{"position":[[227,4]]},"75":{"position":[[1639,4]]},"198":{"position":[[2411,4]]},"275":{"position":[[1355,4]]},"544":{"position":[[698,4]]},"546":{"position":[[95,4]]},"568":{"position":[[880,4],[974,4]]},"573":{"position":[[403,4],[816,4]]},"577":{"position":[[50,4],[349,4]]},"596":{"position":[[1718,4]]},"648":{"position":[[1238,4]]}}}],["overlap",{"_index":1770,"t":{"179":{"position":[[170,7]]}}}],["overload",{"_index":2852,"t":{"452":{"position":[[526,10]]}}}],["overrid",{"_index":390,"t":{"21":{"position":[[327,8]]},"31":{"position":[[27,8]]},"208":{"position":[[885,8]]},"307":{"position":[[536,10],[1517,8]]},"357":{"position":[[1825,10],[2453,9]]},"482":{"position":[[1501,9],[1589,12]]},"555":{"position":[[835,8],[1150,8]]},"592":{"position":[[291,9]]}}}],["overridden",{"_index":2556,"t":{"357":{"position":[[1907,10]]}}}],["overriden/ad",{"_index":3145,"t":{"555":{"position":[[895,15]]}}}],["overwrit",{"_index":2792,"t":{"440":{"position":[[318,9]]}}}],["own",{"_index":2247,"t":{"303":{"position":[[641,5]]},"476":{"position":[[1834,4]]}}}],["owner",{"_index":2258,"t":{"303":{"position":[[1631,5]]}}}],["owner'",{"_index":2256,"t":{"303":{"position":[[1363,7]]}}}],["p",{"_index":2276,"t":{"303":{"position":[[3901,1]]},"503":{"position":[[77,1]]}}}],["p8",{"_index":1846,"t":{"196":{"position":[[3308,3],[3549,5],[3731,3]]},"200":{"position":[[2174,5],[3868,5]]}}}],["packag",{"_index":1588,"t":{"166":{"position":[[1159,7]]},"442":{"position":[[324,7]]},"474":{"position":[[114,8]]}}}],["package.json",{"_index":2979,"t":{"482":{"position":[[1514,12]]}}}],["page",{"_index":63,"t":{"7":{"position":[[708,4]]},"36":{"position":[[9,4],[246,6]]},"50":{"position":[[257,4]]},"55":{"position":[[9644,5]]},"69":{"position":[[276,4]]},"105":{"position":[[345,4]]},"142":{"position":[[1102,5],[1190,5],[1259,5]]},"147":{"position":[[8,4]]},"196":{"position":[[1367,4],[2104,4]]},"263":{"position":[[445,4]]},"303":{"position":[[1113,4],[4231,4],[5278,5]]},"452":{"position":[[689,4]]},"460":{"position":[[383,4]]},"474":{"position":[[134,4],[190,4]]},"492":{"position":[[57,4],[89,4]]},"610":{"position":[[9,4],[348,6],[372,4]]},"631":{"position":[[718,4]]},"653":{"position":[[3192,5]]}}}],["paid",{"_index":1815,"t":{"196":{"position":[[415,4],[482,4],[667,5],[712,4],[2998,4]]}}}],["pan",{"_index":2748,"t":{"408":{"position":[[188,4]]}}}],["pandora",{"_index":2168,"t":{"283":{"position":[[114,8]]},"464":{"position":[[147,8]]}}}],["pane",{"_index":1518,"t":{"158":{"position":[[558,5]]}}}],["panel",{"_index":1164,"t":{"101":{"position":[[347,5]]},"196":{"position":[[1472,5]]},"538":{"position":[[2105,5]]}}}],["pano",{"_index":1763,"t":{"177":{"position":[[125,4],[428,4]]},"190":{"position":[[676,4],[891,4]]}}}],["panoscrobbl",{"_index":2016,"t":{"222":{"position":[[362,14],[691,14],[1121,14],[1888,14],[2947,14]]},"242":{"position":[[674,14],[1098,14],[1871,14]]}}}],["paper",{"_index":1000,"t":{"69":{"position":[[570,5]]}}}],["param",{"_index":658,"t":{"40":{"position":[[349,6]]}}}],["paramet",{"_index":3188,"t":{"564":{"position":[[104,11]]}}}],["pars",{"_index":153,"t":{"15":{"position":[[152,5],[314,5],[1147,5],[3290,5]]},"166":{"position":[[515,6]]},"172":{"position":[[2024,6]]},"210":{"position":[[0,5],[279,7],[323,5],[1772,7]]},"319":{"position":[[993,8],[2069,7]]},"383":{"position":[[849,5],[1079,5]]},"457":{"position":[[124,7],[271,6]]},"482":{"position":[[589,7]]},"646":{"position":[[235,5],[1251,5],[2553,5]]}}}],["parseconnectionurl(v",{"_index":3417,"t":{"646":{"position":[[447,23]]}}}],["parsedconfig",{"_index":3384,"t":{"642":{"position":[[472,14],[1158,13]]}}}],["part",{"_index":341,"t":{"19":{"position":[[359,4]]},"172":{"position":[[4198,6]]},"198":{"position":[[1978,4]]},"204":{"position":[[222,4],[320,4]]},"216":{"position":[[226,4],[324,4]]},"283":{"position":[[579,4],[677,4]]},"343":{"position":[[3465,5]]},"359":{"position":[[89,5]]},"363":{"position":[[299,5],[1026,5],[1112,4]]},"365":{"position":[[806,4]]},"379":{"position":[[187,6],[402,5]]},"412":{"position":[[87,5]]},"559":{"position":[[267,5]]},"561":{"position":[[6132,4]]},"596":{"position":[[2302,5]]}}}],["parti",{"_index":1219,"t":{"109":{"position":[[1804,5]]},"160":{"position":[[6,5]]},"331":{"position":[[88,5]]},"470":{"position":[[2763,5]]}}}],["partial",{"_index":3254,"t":{"588":{"position":[[221,7]]}}}],["particularli",{"_index":450,"t":{"25":{"position":[[213,12]]}}}],["pass",{"_index":822,"t":{"55":{"position":[[2937,4],[5242,4],[6385,4],[8265,4]]},"61":{"position":[[161,4]]},"87":{"position":[[781,6],[1186,7]]},"166":{"position":[[1231,4]]},"363":{"position":[[352,6],[383,4],[443,4]]},"482":{"position":[[506,6]]},"648":{"position":[[1067,4],[1347,4]]}}}],["password",{"_index":318,"t":{"15":{"position":[[5634,11]]},"38":{"position":[[1318,11]]},"55":{"position":[[2240,8]]},"59":{"position":[[839,8]]},"101":{"position":[[261,8]]},"118":{"position":[[239,9],[289,9],[316,8]]},"121":{"position":[[976,8]]},"202":{"position":[[228,8]]},"206":{"position":[[485,8],[1889,11],[3261,11]]},"208":{"position":[[504,9],[2545,8]]},"214":{"position":[[297,8]]},"218":{"position":[[546,8],[1915,11],[3272,11]]},"228":{"position":[[366,8]]},"271":{"position":[[121,8]]},"273":{"position":[[413,8],[1886,11],[3261,11]]},"281":{"position":[[392,8],[487,9],[1807,11],[3178,11]]},"313":{"position":[[261,8]]},"317":{"position":[[404,8],[1906,11],[3371,11]]},"319":{"position":[[392,8],[410,8],[640,9]]},"321":{"position":[[392,8],[1722,11],[3044,11]]},"341":{"position":[[1891,8]]},"357":{"position":[[426,9]]},"383":{"position":[[1303,8]]},"538":{"position":[[2019,8]]}}}],["past",{"_index":753,"t":{"55":{"position":[[691,6]]},"196":{"position":[[1211,5],[2021,5],[3702,7]]},"457":{"position":[[346,5]]},"492":{"position":[[368,5],[471,5]]}}}],["patch",{"_index":3036,"t":{"510":{"position":[[113,5]]},"516":{"position":[[30,5]]},"518":{"position":[[169,5]]}}}],["path",{"_index":845,"t":{"55":{"position":[[4407,4],[4813,4],[5305,4],[6394,4],[6449,4],[8274,4],[8329,4]]},"67":{"position":[[396,5]]},"83":{"position":[[737,4],[885,4]]},"99":{"position":[[685,4]]},"140":{"position":[[112,4],[241,4],[283,4],[313,4]]},"232":{"position":[[423,4]]},"244":{"position":[[369,4]]},"248":{"position":[[596,5]]},"257":{"position":[[416,4]]},"261":{"position":[[748,4]]},"391":{"position":[[400,5],[520,4]]},"440":{"position":[[378,4]]},"510":{"position":[[318,4]]},"514":{"position":[[112,5]]},"516":{"position":[[148,5]]},"631":{"position":[[190,5]]}}}],["path/to/flatpak/build/dir",{"_index":2791,"t":{"440":{"position":[[268,26]]}}}],["pattern",{"_index":338,"t":{"19":{"position":[[299,8]]},"29":{"position":[[2407,7],[4382,7]]},"55":{"position":[[5067,8]]},"172":{"position":[[1227,8],[1308,8],[1336,8]]},"198":{"position":[[1199,8]]},"347":{"position":[[752,7]]},"351":{"position":[[25,7]]},"412":{"position":[[185,9]]},"522":{"position":[[27,8]]},"561":{"position":[[4281,8]]},"596":{"position":[[711,9]]}}}],["paus",{"_index":1329,"t":{"128":{"position":[[760,8]]},"648":{"position":[[2106,11]]}}}],["payload",{"_index":663,"t":{"40":{"position":[[499,7]]},"166":{"position":[[3296,7]]},"464":{"position":[[431,7]]}}}],["pd",{"_index":1192,"t":{"109":{"position":[[316,3],[1485,3]]},"116":{"position":[[314,3],[1479,3]]},"121":{"position":[[374,3]]},"291":{"position":[[197,3]]},"293":{"position":[[89,3]]},"335":{"position":[[37,4],[197,3],[276,3]]},"337":{"position":[[89,3]]},"341":{"position":[[675,3]]}}}],["peac",{"_index":3274,"t":{"596":{"position":[[1998,5]]}}}],["people/mod",{"_index":1103,"t":{"87":{"position":[[412,11]]}}}],["per",{"_index":671,"t":{"42":{"position":[[144,3],[202,3],[230,3]]},"116":{"position":[[2070,3]]},"152":{"position":[[218,3]]},"222":{"position":[[1415,3],[2312,3]]},"228":{"position":[[109,3],[751,3]]},"242":{"position":[[1396,3],[2298,3]]},"555":{"position":[[821,3],[914,4]]},"592":{"position":[[277,3]]}}}],["percent",{"_index":281,"t":{"15":{"position":[[4699,10]]},"134":{"position":[[1184,7],[1579,10]]},"210":{"position":[[1490,7]]}}}],["perform",{"_index":1366,"t":{"138":{"position":[[260,11]]},"389":{"position":[[261,11]]},"476":{"position":[[2451,12]]},"532":{"position":[[299,9]]},"534":{"position":[[32,9]]},"542":{"position":[[141,11]]},"561":{"position":[[287,10]]},"571":{"position":[[73,12]]}}}],["period",{"_index":449,"t":{"25":{"position":[[186,7]]},"315":{"position":[[711,6]]},"470":{"position":[[1033,7]]}}}],["perman",{"_index":1818,"t":{"196":{"position":[[579,9]]},"353":{"position":[[544,11]]}}}],["permiss",{"_index":997,"t":{"69":{"position":[[463,11]]},"275":{"position":[[1041,11]]},"279":{"position":[[234,10]]},"343":{"position":[[1406,10],[4843,11]]},"476":{"position":[[1806,11],[1911,10]]},"540":{"position":[[117,12]]}}}],["permit",{"_index":707,"t":{"46":{"position":[[106,11]]}}}],["persist",{"_index":86,"t":{"9":{"position":[[296,7]]},"23":{"position":[[405,11],[990,11],[1080,9]]},"25":{"position":[[33,11]]},"38":{"position":[[1488,10],[1802,12]]},"109":{"position":[[1722,10],[2150,10]]},"319":{"position":[[459,7]]},"596":{"position":[[1181,12]]},"619":{"position":[[36,10]]},"623":{"position":[[420,10]]},"631":{"position":[[433,10]]}}}],["person",{"_index":170,"t":{"15":{"position":[[573,6]]},"109":{"position":[[291,8],[320,9]]},"116":{"position":[[289,8],[318,9]]},"154":{"position":[[44,9],[204,8]]},"192":{"position":[[286,8]]},"303":{"position":[[4719,8]]},"335":{"position":[[201,9]]},"532":{"position":[[557,8]]},"534":{"position":[[290,8]]},"596":{"position":[[2037,8]]},"635":{"position":[[683,8]]}}}],["persona",{"_index":3225,"t":{"568":{"position":[[1749,8]]}}}],["persona5",{"_index":3224,"t":{"568":{"position":[[1575,9],[2299,9]]}}}],["pgid",{"_index":2136,"t":{"275":{"position":[[995,4]]},"476":{"position":[[1998,5]]}}}],["pgid=1000",{"_index":2955,"t":{"478":{"position":[[917,9]]}}}],["phone",{"_index":2914,"t":{"470":{"position":[[2852,8]]}}}],["phone/comput",{"_index":1573,"t":{"166":{"position":[[62,14]]}}}],["photo",{"_index":1941,"t":{"208":{"position":[[1248,6]]}}}],["phrase",{"_index":1604,"t":{"166":{"position":[[2399,7],[2922,7]]},"395":{"position":[[521,7],[598,7]]},"423":{"position":[[12,6]]},"575":{"position":[[290,7]]}}}],["phu7",{"_index":1291,"t":{"121":{"position":[[2397,4],[3777,4]]},"341":{"position":[[950,4],[1159,4],[1389,4],[3568,4],[5006,4]]}}}],["physic",{"_index":827,"t":{"55":{"position":[[3333,8]]},"196":{"position":[[3772,8]]}}}],["pi",{"_index":2922,"t":{"474":{"position":[[76,3]]}}}],["picker",{"_index":2013,"t":{"222":{"position":[[9,6]]},"242":{"position":[[9,6]]}}}],["pickup",{"_index":3033,"t":{"505":{"position":[[179,6]]}}}],["pihol",{"_index":2857,"t":{"452":{"position":[[1040,7]]}}}],["pin",{"_index":3053,"t":{"522":{"position":[[327,6]]},"524":{"position":[[414,6]]},"596":{"position":[[1672,6]]}}}],["ping",{"_index":2672,"t":{"383":{"position":[[1924,4]]}}}],["pip/pipx",{"_index":2783,"t":{"435":{"position":[[86,8]]}}}],["pipe",{"_index":846,"t":{"55":{"position":[[4878,5],[4988,4],[5214,4],[8762,5],[9112,4],[9558,4],[9772,4]]}}}],["pipe\\app_named_pipe_foo",{"_index":853,"t":{"55":{"position":[[5007,27]]}}}],["pipe\\discord",{"_index":854,"t":{"55":{"position":[[5076,16],[9777,17]]}}}],["pipelin",{"_index":1631,"t":{"170":{"position":[[80,9]]}}}],["pipeproxi",{"_index":894,"t":{"55":{"position":[[9516,9],[9715,9],[9898,9]]}}}],["pipeproxy.ex",{"_index":896,"t":{"55":{"position":[[9612,13],[9756,13]]}}}],["pipetap",{"_index":851,"t":{"55":{"position":[[4956,8]]}}}],["place",{"_index":73,"t":{"9":{"position":[[70,6]]},"450":{"position":[[554,5]]},"524":{"position":[[63,7]]}}}],["plain",{"_index":654,"t":{"40":{"position":[[214,5]]},"416":{"position":[[41,5],[386,5]]},"561":{"position":[[2856,5]]}}}],["plan",{"_index":3296,"t":{"623":{"position":[[206,4]]}}}],["platform",{"_index":1188,"t":{"109":{"position":[[126,8],[1883,9]]},"123":{"position":[[104,9]]},"291":{"position":[[101,8]]},"303":{"position":[[593,8]]},"385":{"position":[[404,8]]},"464":{"position":[[114,8],[303,9]]},"470":{"position":[[2719,8],[2800,8]]},"474":{"position":[[6,8]]},"482":{"position":[[1395,8]]},"596":{"position":[[1772,8],[1961,8]]}}}],["platformid",{"_index":3466,"t":{"648":{"position":[[2333,11]]}}}],["plausibl",{"_index":1792,"t":{"190":{"position":[[589,9]]}}}],["play",{"_index":6,"t":{"2":{"position":[[92,6]]},"4":{"position":[[9,7]]},"7":{"position":[[9,4],[104,4],[146,5],[305,4],[464,4]]},"11":{"position":[[41,7],[123,7],[150,7],[264,7],[287,7],[470,7],[594,8],[940,7],[1242,7],[1309,7]]},"27":{"position":[[279,5],[390,4]]},"29":{"position":[[75,4],[205,6],[634,6],[641,4],[806,4],[1030,4],[1129,6],[1429,6],[1529,6],[1684,6],[1854,5],[1991,4],[2208,5],[2557,5],[2622,5],[2690,5],[2764,5],[2862,5],[2945,5],[3028,4],[3531,5],[3589,5],[3727,5],[4185,5],[4482,5],[4545,5],[4611,5],[4683,5],[4719,5],[4801,5],[4882,4]]},"42":{"position":[[138,5]]},"44":{"position":[[24,7]]},"50":{"position":[[24,7]]},"55":{"position":[[3095,7]]},"61":{"position":[[319,7]]},"65":{"position":[[3396,4]]},"69":{"position":[[24,7],[1690,11]]},"79":{"position":[[3604,4]]},"109":{"position":[[1100,5]]},"116":{"position":[[1098,5]]},"123":{"position":[[73,7]]},"128":{"position":[[608,6],[778,8],[850,7]]},"130":{"position":[[34,7],[91,7]]},"138":{"position":[[276,7]]},"152":{"position":[[249,5]]},"154":{"position":[[437,5]]},"166":{"position":[[144,5],[1727,7]]},"172":{"position":[[2670,8],[2719,4],[2817,4],[3271,6],[4648,4]]},"174":{"position":[[1154,5]]},"194":{"position":[[55,6]]},"198":{"position":[[91,7],[125,4],[256,7],[307,6],[518,4],[672,6],[1425,7],[1551,6]]},"200":{"position":[[671,6]]},"210":{"position":[[1498,7]]},"248":{"position":[[700,8]]},"275":{"position":[[283,6]]},"283":{"position":[[48,7],[181,6]]},"285":{"position":[[67,6]]},"297":{"position":[[81,8],[137,5],[176,8],[393,5],[568,6],[660,4],[946,6],[1855,4]]},"301":{"position":[[781,7],[924,7]]},"303":{"position":[[232,4],[307,4],[451,7]]},"315":{"position":[[465,7],[687,7],[931,7]]},"319":{"position":[[1020,6]]},"341":{"position":[[71,5],[172,4],[412,4]]},"349":{"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]]},"353":{"position":[[33,4],[98,4],[144,4],[193,4],[271,4],[336,4],[428,4],[1474,4],[1567,4]]},"355":{"position":[[114,4],[369,4],[486,4]]},"359":{"position":[[102,4],[251,4],[326,4],[429,4],[495,4],[556,4],[634,4],[1197,4]]},"361":{"position":[[520,4]]},"363":{"position":[[284,4],[525,4],[601,4],[703,4],[779,4],[876,4],[953,4],[1532,4]]},"365":{"position":[[157,4],[298,4],[546,5],[701,5]]},"385":{"position":[[246,6],[332,4],[391,4],[464,6]]},"391":{"position":[[45,6]]},"395":{"position":[[73,4],[574,4],[694,4]]},"399":{"position":[[202,4],[277,4],[372,4]]},"412":{"position":[[96,4]]},"423":{"position":[[55,4]]},"462":{"position":[[113,5]]},"466":{"position":[[21,7]]},"470":{"position":[[2899,7]]},"492":{"position":[[143,5],[268,5]]},"499":{"position":[[475,4]]},"540":{"position":[[569,7]]},"544":{"position":[[35,4],[197,4],[263,4]]},"555":{"position":[[572,4],[647,4],[742,4]]},"559":{"position":[[171,4]]},"561":{"position":[[6310,4]]},"566":{"position":[[241,4]]},"573":{"position":[[233,4]]},"577":{"position":[[471,4]]},"581":{"position":[[447,4]]},"596":{"position":[[601,8],[885,7],[1892,4],[1921,4],[2356,5]]},"598":{"position":[[139,6]]},"600":{"position":[[72,7]]},"602":{"position":[[92,6]]},"635":{"position":[[455,6],[501,7]]},"638":{"position":[[2144,7]]},"648":{"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]]},"651":{"position":[[166,6],[934,4],[1119,8]]},"653":{"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]]}}}],["play'",{"_index":34,"t":{"7":{"position":[[231,6],[386,6]]}}}],["play/scrobbl",{"_index":542,"t":{"29":{"position":[[1794,14]]},"172":{"position":[[3600,13]]},"353":{"position":[[1544,14]]}}}],["playback",{"_index":2324,"t":{"315":{"position":[[58,8],[231,8],[377,8],[521,8],[609,8],[881,8],[949,8]]}}}],["playdat",{"_index":3414,"t":{"644":{"position":[[906,9]]}}}],["playedat",{"_index":3412,"t":{"644":{"position":[[736,9],[873,8]]}}}],["player",{"_index":53,"t":{"7":{"position":[[525,6]]},"11":{"position":[[572,6],[669,6],[730,7]]},"123":{"position":[[94,6]]},"125":{"position":[[661,6]]},"128":{"position":[[747,6],[787,6]]},"134":{"position":[[808,6]]},"166":{"position":[[3265,6]]},"196":{"position":[[341,6],[770,6]]},"275":{"position":[[59,7],[303,6]]},"277":{"position":[[357,7],[465,7]]},"303":{"position":[[36,6]]},"315":{"position":[[109,6],[306,6],[505,7],[658,7]]},"530":{"position":[[31,7]]},"596":{"position":[[338,6]]},"600":{"position":[[120,7],[138,7]]},"635":{"position":[[66,6],[85,7],[98,6],[566,6],[593,6],[635,6],[709,6],[924,6]]},"638":{"position":[[47,6],[622,6],[650,6],[791,6],[2120,6]]},"640":{"position":[[775,6]]},"646":{"position":[[1984,6],[2511,6]]},"648":{"position":[[87,6],[279,6],[1085,6],[1194,6],[1356,6],[2200,6],[2277,6],[2437,6],[2456,6],[2580,6],[2642,6]]},"653":{"position":[[578,7]]}}}],["player'",{"_index":3401,"t":{"644":{"position":[[92,8],[587,8]]}}}],["playerdata",{"_index":3465,"t":{"648":{"position":[[2301,11]]}}}],["playerst",{"_index":3462,"t":{"648":{"position":[[2064,12]]}}}],["playerstatedata",{"_index":3455,"t":{"648":{"position":[[1591,16],[2313,15]]}}}],["playground",{"_index":262,"t":{"15":{"position":[[4303,10]]}}}],["playlist/queu",{"_index":2242,"t":{"303":{"position":[[92,14]]}}}],["playobject",{"_index":2685,"t":{"385":{"position":[[4,10],[523,10],[648,10],[736,10]]},"638":{"position":[[2043,10]]},"644":{"position":[[127,11],[294,10],[671,10]]},"648":{"position":[[742,11],[2496,10]]},"651":{"position":[[375,11]]},"653":{"position":[[2878,11],[3055,12],[3556,11],[3588,12]]}}}],["plays.push(playerdata",{"_index":3468,"t":{"648":{"position":[[2520,23]]}}}],["plays/scobbl",{"_index":3292,"t":{"621":{"position":[[1177,14]]}}}],["plays/scrobbl",{"_index":572,"t":{"29":{"position":[[3794,15]]},"619":{"position":[[47,16]]},"623":{"position":[[431,16]]}}}],["playtransform",{"_index":1501,"t":{"154":{"position":[[2694,16],[3890,16]]},"198":{"position":[[3118,16]]},"311":{"position":[[1046,16],[1531,16]]},"351":{"position":[[477,16]]},"353":{"position":[[1394,16]]},"357":{"position":[[850,16],[1561,16],[1739,16],[2365,16]]},"361":{"position":[[937,16],[1218,16]]},"363":{"position":[[1258,16],[1542,16]]},"365":{"position":[[70,13],[410,16]]},"401":{"position":[[340,16]]},"406":{"position":[[406,16]]},"408":{"position":[[305,16]]},"410":{"position":[[338,16]]},"414":{"position":[[672,16]]},"418":{"position":[[156,16]]},"532":{"position":[[1991,16]]},"536":{"position":[[1129,16]]},"555":{"position":[[140,16],[441,16],[1026,16]]},"579":{"position":[[457,16]]},"581":{"position":[[640,16]]},"584":{"position":[[276,16]]},"586":{"position":[[589,16]]},"588":{"position":[[611,16]]},"590":{"position":[[686,16]]},"592":{"position":[[714,16],[1031,16]]},"594":{"position":[[978,16],[1544,16]]}}}],["pleas",{"_index":885,"t":{"55":{"position":[[8921,6],[9076,6]]},"67":{"position":[[1862,6],[3226,6]]},"81":{"position":[[2103,6],[3509,6]]},"85":{"position":[[1598,6],[2994,6]]},"87":{"position":[[1079,6]]},"91":{"position":[[1767,6],[3226,6]]},"99":{"position":[[1869,6],[3288,6]]},"103":{"position":[[1540,6],[2907,6]]},"107":{"position":[[1682,6],[3125,6]]},"114":{"position":[[2794,6],[4223,6]]},"121":{"position":[[2153,6],[3520,6]]},"144":{"position":[[1684,6],[3104,6]]},"164":{"position":[[1693,6],[3120,6]]},"166":{"position":[[255,6],[3084,6],[3281,6]]},"168":{"position":[[2038,6],[3406,6]]},"200":{"position":[[1925,6],[3610,6]]},"206":{"position":[[1658,6],[3015,6]]},"208":{"position":[[4813,6],[6631,6]]},"212":{"position":[[1533,6],[2853,6]]},"218":{"position":[[1702,6],[3046,6]]},"226":{"position":[[372,6]]},"230":{"position":[[1113,6]]},"232":{"position":[[1801,6],[3115,6]]},"236":{"position":[[2079,6],[3538,6]]},"238":{"position":[[2255,6],[3651,6]]},"253":{"position":[[538,6]]},"255":{"position":[[1124,6]]},"257":{"position":[[1870,6],[3192,6]]},"261":{"position":[[2191,6],[3610,6]]},"265":{"position":[[2005,6],[3448,6]]},"269":{"position":[[1838,6],[3205,6]]},"273":{"position":[[1663,6],[3028,6]]},"277":{"position":[[1660,6],[2992,6]]},"281":{"position":[[1618,6],[2973,6]]},"289":{"position":[[1897,6],[3258,6]]},"295":{"position":[[2089,6],[3518,6]]},"297":{"position":[[1131,6],[1955,6]]},"301":{"position":[[2131,6],[3545,6]]},"303":{"position":[[4685,6]]},"305":{"position":[[1684,6],[3146,6]]},"317":{"position":[[1667,6],[3121,6]]},"319":{"position":[[2256,6]]},"321":{"position":[[1537,6],[2843,6]]},"329":{"position":[[1627,6],[2980,6]]},"331":{"position":[[1166,6],[1287,6]]},"333":{"position":[[1641,6],[3004,6]]},"341":{"position":[[3324,6],[4749,6]]},"345":{"position":[[1779,6],[3247,6]]},"393":{"position":[[1544,6],[2864,6]]},"452":{"position":[[647,6]]},"470":{"position":[[1361,6]]},"488":{"position":[[234,6]]},"499":{"position":[[26,6],[138,6],[447,6]]},"581":{"position":[[285,6]]}}}],["plex",{"_index":938,"t":{"65":{"position":[[3099,5]]},"79":{"position":[[3274,5]]},"123":{"position":[[146,5]]},"125":{"position":[[734,4]]},"134":{"position":[[713,5]]},"150":{"position":[[273,4],[1017,4],[1967,6],[2942,7],[2982,6]]},"152":{"position":[[396,4],[1008,6],[2196,7],[2236,6]]},"297":{"position":[[912,4]]},"307":{"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]]},"309":{"position":[[3,5],[16,4],[64,4],[142,4],[347,4]]},"311":{"position":[[263,4],[379,4],[1488,7]]},"526":{"position":[[338,5]]},"530":{"position":[[123,4],[2576,4],[2645,4],[3086,4]]},"532":{"position":[[1002,4]]},"536":{"position":[[140,4]]},"575":{"position":[[1132,5]]},"596":{"position":[[401,4]]},"600":{"position":[[202,5]]},"653":{"position":[[266,5],[1177,5]]}}}],["plex.json",{"_index":2317,"t":{"311":{"position":[[979,9]]}}}],["plex_devices_block=sono",{"_index":2210,"t":{"297":{"position":[[1006,24]]}}}],["plex_id=foxxplex",{"_index":1426,"t":{"150":{"position":[[1024,16]]}}}],["plex_id=myplex",{"_index":3078,"t":{"530":{"position":[[2847,14]]}}}],["plex_libraries_allow",{"_index":2301,"t":{"307":{"position":[[1491,20]]}}}],["plex_libraries_allow=oldi",{"_index":1430,"t":{"150":{"position":[[1132,27]]}}}],["plex_local_us",{"_index":2297,"t":{"307":{"position":[[270,17],[1145,18]]}}}],["plex_token=6c0ihz8j7__f5r18oa0zm8",{"_index":3077,"t":{"530":{"position":[[2811,33]]}}}],["plex_token=jtrnwqwd__xmjf8st3jc",{"_index":1428,"t":{"150":{"position":[[1074,31]]}}}],["plex_transforms=musicbrainz",{"_index":2315,"t":{"311":{"position":[[684,27]]},"532":{"position":[[1549,27]]},"536":{"position":[[687,27]]}}}],["plex_url=192.168.0.233:32400",{"_index":1427,"t":{"150":{"position":[[1043,28]]}}}],["plex_url=http://192.168.0.101:32400",{"_index":3076,"t":{"530":{"position":[[2773,35]]}}}],["plex_users_allow",{"_index":2298,"t":{"307":{"position":[[453,16],[723,16],[885,17],[1179,17]]}}}],["plex_users_allow=foxx",{"_index":1429,"t":{"150":{"position":[[1108,21]]}}}],["plex_users_allow=myplexusernam",{"_index":3079,"t":{"530":{"position":[[2932,31]]}}}],["plexmediaserver/1.24.5.5173",{"_index":2834,"t":{"448":{"position":[[1054,27]]}}}],["plkex",{"_index":2836,"t":{"448":{"position":[[1111,6]]}}}],["plugin",{"_index":2086,"t":{"253":{"position":[[80,7],[100,6]]}}}],["plyr",{"_index":2447,"t":{"341":{"position":[[983,9],[1422,8],[3603,6],[5041,6]]}}}],["plyr.fm",{"_index":2444,"t":{"341":{"position":[[810,8],[1228,7]]}}}],["pm195xpv98cdpk0qw47fiior8akatax5dblbf",{"_index":1064,"t":{"83":{"position":[[362,37]]},"538":{"position":[[454,37]]}}}],["point",{"_index":780,"t":{"55":{"position":[[1671,5]]},"59":{"position":[[270,5]]},"67":{"position":[[1175,5],[2667,5]]},"81":{"position":[[1416,5],[2950,5]]},"85":{"position":[[919,5],[2437,5]]},"91":{"position":[[1084,5],[2668,5]]},"99":{"position":[[1182,5],[2729,5]]},"103":{"position":[[857,5],[2349,5]]},"107":{"position":[[975,5],[2561,5]]},"114":{"position":[[2107,5],[3664,5]]},"121":{"position":[[1470,5],[2962,5]]},"134":{"position":[[457,5]]},"144":{"position":[[989,5],[2543,5]]},"147":{"position":[[272,5]]},"164":{"position":[[1010,5],[2562,5]]},"168":{"position":[[1339,5],[2844,5]]},"200":{"position":[[1226,5],[3048,5]]},"206":{"position":[[983,5],[2459,5]]},"208":{"position":[[4122,5],[6071,5]]},"212":{"position":[[846,5],[2294,5]]},"218":{"position":[[1019,5],[2488,5]]},"222":{"position":[[3196,6]]},"232":{"position":[[1098,5],[2552,5]]},"236":{"position":[[1140,5],[2980,5]]},"238":{"position":[[1323,5],[3094,5]]},"242":{"position":[[3150,6]]},"257":{"position":[[1171,5],[2630,5]]},"261":{"position":[[1245,5],[3051,5]]},"265":{"position":[[1024,5],[2884,5]]},"269":{"position":[[899,5],[2647,5]]},"273":{"position":[[968,5],[2467,5]]},"277":{"position":[[981,5],[2435,5]]},"281":{"position":[[947,5],[2418,5]]},"289":{"position":[[1214,5],[2700,5]]},"295":{"position":[[1143,5],[2959,5]]},"301":{"position":[[1452,5],[2988,5]]},"305":{"position":[[997,5],[2587,5]]},"317":{"position":[[976,5],[2561,5]]},"321":{"position":[[866,5],[2288,5]]},"329":{"position":[[920,5],[2416,5]]},"333":{"position":[[950,5],[2444,5]]},"341":{"position":[[2385,5],[4191,5]]},"343":{"position":[[1277,5]]},"345":{"position":[[1092,5],[2688,5]]},"351":{"position":[[131,7]]},"393":{"position":[[849,5],[2303,5]]}}}],["polici",{"_index":529,"t":{"29":{"position":[[1094,6],[1255,6],[1357,6],[2151,7],[2250,7],[3480,6],[4005,6],[4106,6],[4166,7],[4225,7]]},"72":{"position":[[1016,8]]}}}],["policies/term",{"_index":1020,"t":{"72":{"position":[[234,14]]}}}],["poll",{"_index":621,"t":{"38":{"position":[[85,7],[108,7],[129,7]]},"40":{"position":[[680,4],[752,7]]},"190":{"position":[[970,5]]},"198":{"position":[[436,7],[935,6],[977,5]]},"343":{"position":[[4601,7]]},"635":{"position":[[877,7]]},"640":{"position":[[418,7]]},"648":{"position":[[645,7]]},"653":{"position":[[31,7],[407,7],[1139,7],[1233,7],[2148,7]]}}}],["pollingopt",{"_index":3335,"t":{"638":{"position":[[236,14],[522,14]]}}}],["polo",{"_index":2747,"t":{"408":{"position":[[180,5]]}}}],["pong",{"_index":2673,"t":{"383":{"position":[[1929,4]]}}}],["poor",{"_index":2851,"t":{"452":{"position":[[480,4]]}}}],["pop!_o",{"_index":3016,"t":{"501":{"position":[[107,8]]}}}],["popul",{"_index":3259,"t":{"594":{"position":[[224,9]]}}}],["popular",{"_index":3012,"t":{"501":{"position":[[59,7]]}}}],["popup",{"_index":2480,"t":{"343":{"position":[[2473,5]]}}}],["port",{"_index":388,"t":{"21":{"position":[[311,4],[360,4]]},"55":{"position":[[2152,6],[2165,4],[2864,4],[5647,5],[5815,4],[5839,4],[5962,4],[7033,5],[7201,4],[7225,4],[7519,4],[7855,6],[9292,5],[9460,4],[9484,4],[9586,5]]},"59":{"position":[[751,6],[764,4]]},"61":{"position":[[88,4]]},"128":{"position":[[514,4]]},"150":{"position":[[1477,6]]},"154":{"position":[[1643,6]]},"166":{"position":[[950,4]]},"204":{"position":[[412,4],[449,4]]},"216":{"position":[[418,4]]},"271":{"position":[[268,4],[374,4]]},"275":{"position":[[1391,4],[1534,5],[1589,4]]},"279":{"position":[[183,4]]},"283":{"position":[[789,4],[895,4]]},"307":{"position":[[50,4]]},"319":{"position":[[711,5],[841,4],[978,5]]},"331":{"position":[[523,6],[843,6]]},"403":{"position":[[1043,6]]},"448":{"position":[[2165,4],[2254,4],[2354,4]]},"476":{"position":[[792,4],[932,4],[998,6]]},"478":{"position":[[139,4],[1061,6]]},"482":{"position":[[2350,4],[2392,4]]},"526":{"position":[[156,4]]},"528":{"position":[[487,6]]},"530":{"position":[[2616,4]]},"557":{"position":[[2123,6]]},"635":{"position":[[668,4]]},"638":{"position":[[775,4]]}}}],["portal",{"_index":729,"t":{"53":{"position":[[128,6]]},"77":{"position":[[275,6]]},"196":{"position":[[3261,6]]}}}],["ports/prefix",{"_index":3416,"t":{"646":{"position":[[269,13]]}}}],["posit",{"_index":1330,"t":{"128":{"position":[[794,8]]},"138":{"position":[[72,9]]},"198":{"position":[[1594,9]]},"315":{"position":[[116,8]]},"635":{"position":[[600,8]]},"648":{"position":[[2118,9],[2170,8],[2414,8]]}}}],["possibl",{"_index":68,"t":{"7":{"position":[[799,8]]},"15":{"position":[[1877,8]]},"55":{"position":[[8740,8]]},"67":{"position":[[846,8],[2222,8]]},"81":{"position":[[1087,8],[2505,8]]},"85":{"position":[[592,8],[1996,8]]},"91":{"position":[[756,8],[2225,8]]},"99":{"position":[[853,8],[2284,8]]},"103":{"position":[[529,8],[1906,8]]},"107":{"position":[[641,8],[2106,8]]},"114":{"position":[[1778,8],[3219,8]]},"121":{"position":[[1142,8],[2519,8]]},"144":{"position":[[658,8],[2094,8]]},"152":{"position":[[15,8],[151,8]]},"164":{"position":[[682,8],[2119,8]]},"168":{"position":[[1007,8],[2393,8]]},"172":{"position":[[736,9],[5214,8],[5249,8]]},"188":{"position":[[43,8]]},"200":{"position":[[894,8],[2597,8]]},"206":{"position":[[657,8],[2020,8]]},"208":{"position":[[3792,8],[5624,8]]},"212":{"position":[[517,8],[1849,8]]},"218":{"position":[[691,8],[2045,8]]},"228":{"position":[[671,9]]},"230":{"position":[[394,9]]},"232":{"position":[[765,8],[2099,8]]},"236":{"position":[[812,8],[2537,8]]},"238":{"position":[[996,8],[2653,8]]},"248":{"position":[[429,9]]},"255":{"position":[[394,9]]},"257":{"position":[[839,8],[2179,8]]},"261":{"position":[[916,8],[2606,8]]},"265":{"position":[[690,8],[2429,8]]},"269":{"position":[[571,8],[2204,8]]},"273":{"position":[[637,8],[2018,8]]},"275":{"position":[[629,9]]},"277":{"position":[[654,8],[1994,8]]},"281":{"position":[[622,8],[1981,8]]},"289":{"position":[[886,8],[2257,8]]},"295":{"position":[[814,8],[2514,8]]},"301":{"position":[[1125,8],[2547,8]]},"303":{"position":[[4797,8]]},"305":{"position":[[668,8],[2142,8]]},"317":{"position":[[646,8],[2114,8]]},"321":{"position":[[541,8],[1851,8]]},"329":{"position":[[586,8],[1961,8]]},"333":{"position":[[620,8],[1997,8]]},"341":{"position":[[2057,8],[3748,8]]},"343":{"position":[[1940,8]]},"345":{"position":[[763,8],[2243,8]]},"383":{"position":[[2866,9]]},"393":{"position":[[518,8],[1854,8]]},"395":{"position":[[753,11],[887,13]]},"488":{"position":[[278,8]]},"490":{"position":[[3,9]]},"499":{"position":[[544,9]]},"561":{"position":[[3039,11],[4506,11],[4854,13],[5456,11],[5676,11]]},"568":{"position":[[289,11]]},"575":{"position":[[331,8],[656,11],[854,13]]},"596":{"position":[[2499,9]]}}}],["post",{"_index":2832,"t":{"448":{"position":[[1010,4]]}}}],["postcompar",{"_index":2539,"t":{"351":{"position":[[547,14]]},"353":{"position":[[172,11],[407,11],[1122,12]]}}}],["potenti",{"_index":257,"t":{"15":{"position":[[3938,9]]},"23":{"position":[[1283,11]]},"46":{"position":[[431,11]]},"172":{"position":[[3091,12]]},"177":{"position":[[180,12]]},"184":{"position":[[294,11]]},"188":{"position":[[243,11]]},"357":{"position":[[192,13]]},"454":{"position":[[1255,11]]},"561":{"position":[[886,9]]}}}],["pr",{"_index":3034,"t":{"507":{"position":[[7,2]]},"522":{"position":[[466,3]]}}}],["practic",{"_index":2720,"t":{"395":{"position":[[640,9]]},"559":{"position":[[127,9]]},"653":{"position":[[3826,8]]}}}],["pre",{"_index":432,"t":{"23":{"position":[[929,3]]},"363":{"position":[[253,3]]},"397":{"position":[[1180,4]]}}}],["preced",{"_index":1022,"t":{"72":{"position":[[323,9]]},"75":{"position":[[1628,10]]},"561":{"position":[[5242,9]]}}}],["precompar",{"_index":1502,"t":{"154":{"position":[[2713,13],[3909,13]]},"198":{"position":[[3137,13]]},"311":{"position":[[1065,13],[1550,13]]},"351":{"position":[[496,13]]},"353":{"position":[[13,10],[251,10],[870,10],[1027,10],[1107,10]]},"357":{"position":[[869,13],[1580,13],[1758,13],[2384,13]]},"361":{"position":[[956,13],[1237,13]]},"363":{"position":[[1277,13],[1561,13]]},"365":{"position":[[429,13],[718,12]]},"401":{"position":[[359,13]]},"406":{"position":[[425,13]]},"408":{"position":[[324,13]]},"410":{"position":[[357,13]]},"414":{"position":[[691,13]]},"418":{"position":[[175,13]]},"532":{"position":[[2010,13]]},"536":{"position":[[1148,13]]},"555":{"position":[[159,13],[460,13],[1045,13]]},"579":{"position":[[476,13]]},"581":{"position":[[673,13]]},"584":{"position":[[295,13]]},"586":{"position":[[608,13]]},"588":{"position":[[630,13]]},"590":{"position":[[705,13]]},"592":{"position":[[733,13],[1050,13]]},"594":{"position":[[148,10],[997,13],[1563,13]]}}}],["prefer",{"_index":1819,"t":{"196":{"position":[[609,9]]},"319":{"position":[[110,11]]},"544":{"position":[[557,6]]},"566":{"position":[[295,6],[520,6]]},"568":{"position":[[853,6],[945,6]]},"573":{"position":[[464,6],[564,6],[877,6],[977,6]]},"575":{"position":[[1992,6]]},"577":{"position":[[38,6],[334,6]]},"653":{"position":[[309,6]]}}}],["preferences/set",{"_index":2370,"t":{"323":{"position":[[53,20]]}}}],["prefix",{"_index":1152,"t":{"99":{"position":[[690,6]]},"196":{"position":[[1611,6],[2318,6]]},"261":{"position":[[753,6]]},"403":{"position":[[283,6]]},"557":{"position":[[1174,6]]},"627":{"position":[[29,8]]}}}],["premium",{"_index":1505,"t":{"156":{"position":[[271,7]]},"303":{"position":[[502,7],[660,7],[709,7],[826,7],[958,8],[1015,7],[1152,8]]}}}],["presenc",{"_index":702,"t":{"44":{"position":[[71,8]]},"46":{"position":[[91,9]]},"48":{"position":[[79,9]]},"50":{"position":[[71,8],[215,9]]},"55":{"position":[[104,9]]},"69":{"position":[[71,8],[689,9],[775,9],[841,8],[1116,8],[1308,9],[1635,8]]},"75":{"position":[[91,9],[201,9],[350,8],[597,8],[787,8],[1230,8],[1893,8]]},"77":{"position":[[215,9]]},"81":{"position":[[798,9],[928,8]]}}}],["present",{"_index":160,"t":{"15":{"position":[[344,7]]},"210":{"position":[[110,10]]},"309":{"position":[[516,7]]},"311":{"position":[[137,7]]},"377":{"position":[[376,10]]},"395":{"position":[[419,7],[481,7]]},"397":{"position":[[706,7],[787,7],[905,7],[992,8]]},"399":{"position":[[402,7]]},"561":{"position":[[510,7],[742,7]]},"623":{"position":[[1298,7]]}}}],["preserv",{"_index":908,"t":{"65":{"position":[[459,8]]},"79":{"position":[[600,8]]},"190":{"position":[[1460,10]]},"492":{"position":[[552,8]]}}}],["preset",{"_index":3087,"t":{"532":{"position":[[806,7]]},"534":{"position":[[539,7]]},"557":{"position":[[81,7],[317,7],[358,6],[445,7],[528,7]]}}}],["presid",{"_index":2894,"t":{"470":{"position":[[1810,9]]}}}],["press",{"_index":1512,"t":{"158":{"position":[[318,5],[392,5]]}}}],["pretend",{"_index":2863,"t":{"454":{"position":[[676,7]]}}}],["pretransform",{"_index":1487,"t":{"154":{"position":[[1400,12]]},"403":{"position":[[220,12],[865,12]]},"557":{"position":[[1111,12],[1911,12]]}}}],["pretti",{"_index":1756,"t":{"174":{"position":[[672,6]]}}}],["prevent",{"_index":1535,"t":{"160":{"position":[[586,7]]},"172":{"position":[[1837,7]]},"184":{"position":[[514,7]]},"285":{"position":[[390,7]]},"287":{"position":[[138,7]]},"297":{"position":[[900,7]]},"315":{"position":[[782,8]]},"347":{"position":[[866,7]]},"653":{"position":[[2485,8],[4048,7]]}}}],["preview",{"_index":1266,"t":{"116":{"position":[[1859,7]]},"596":{"position":[[1349,7],[1403,8],[1559,7],[1634,7]]}}}],["previou",{"_index":1858,"t":{"198":{"position":[[342,8]]},"355":{"position":[[505,8]]},"365":{"position":[[518,8]]},"524":{"position":[[741,8]]},"530":{"position":[[448,8]]}}}],["previous",{"_index":3450,"t":{"648":{"position":[[810,10],[2889,10]]}}}],["price",{"_index":3222,"t":{"568":{"position":[[1524,8]]}}}],["primari",{"_index":3141,"t":{"551":{"position":[[692,7]]},"566":{"position":[[736,7]]},"575":{"position":[[1919,7]]}}}],["primarili",{"_index":3446,"t":{"648":{"position":[[36,9]]}}}],["print",{"_index":2935,"t":{"476":{"position":[[2093,6],[2113,6]]},"524":{"position":[[211,7]]}}}],["prior",{"_index":3297,"t":{"623":{"position":[[472,5]]},"629":{"position":[[21,5]]}}}],["priorit",{"_index":3125,"t":{"544":{"position":[[933,10]]},"546":{"position":[[330,10]]},"557":{"position":[[596,9]]},"568":{"position":[[1952,10]]},"575":{"position":[[957,10]]}}}],["prioriti",{"_index":142,"t":{"11":{"position":[[1282,8]]},"15":{"position":[[5434,13],[5658,13]]},"38":{"position":[[758,8],[944,13],[1111,8],[1342,13]]},"75":{"position":[[1394,8],[1508,9]]},"568":{"position":[[777,8]]}}}],["privaci",{"_index":909,"t":{"65":{"position":[[473,7]]},"79":{"position":[[614,7]]},"109":{"position":[[1625,8]]},"116":{"position":[[1619,8]]},"118":{"position":[[261,7]]}}}],["privat",{"_index":1402,"t":{"144":{"position":[[465,7]]},"162":{"position":[[361,9],[403,9],[448,9],[494,9],[1167,7],[1232,7]]},"196":{"position":[[541,7],[3332,7],[3567,7],[3621,7]]},"200":{"position":[[2192,7],[2246,7],[3886,7],[3940,7]]}}}],["probabl",{"_index":1235,"t":{"114":{"position":[[286,8]]},"121":{"position":[[389,8]]}}}],["problem",{"_index":535,"t":{"29":{"position":[[1510,8]]},"166":{"position":[[294,8]]},"454":{"position":[[1279,8]]},"476":{"position":[[1922,9]]},"542":{"position":[[624,8]]}}}],["proce",{"_index":2797,"t":{"440":{"position":[[491,7]]}}}],["process",{"_index":677,"t":{"42":{"position":[[371,7]]},"109":{"position":[[814,7]]},"116":{"position":[[812,7]]},"174":{"position":[[720,7]]},"303":{"position":[[1258,7],[1399,7],[1918,7],[3638,7],[5508,7]]},"351":{"position":[[169,10]]},"353":{"position":[[798,9],[904,9]]},"361":{"position":[[313,10],[390,11],[508,7]]},"363":{"position":[[406,10]]},"389":{"position":[[193,8],[306,8]]},"544":{"position":[[1687,11]]},"623":{"position":[[760,7],[825,7],[1005,7],[1089,7]]},"648":{"position":[[2572,7]]}}}],["process.env.cool_token",{"_index":3388,"t":{"642":{"position":[[781,22]]}}}],["process.env.cool_url",{"_index":3387,"t":{"642":{"position":[[752,21]]}}}],["processrecentplay",{"_index":3451,"t":{"648":{"position":[[1001,18],[1134,21],[1272,18]]},"653":{"position":[[1815,19]]}}}],["produc",{"_index":2592,"t":{"365":{"position":[[885,8],[940,8]]}}}],["product",{"_index":1262,"t":{"116":{"position":[[1718,10]]}}}],["production.up.railway.app",{"_index":1264,"t":{"116":{"position":[[1802,25]]}}}],["prof",{"_index":2697,"t":{"389":{"position":[[90,4]]}}}],["profil",{"_index":1045,"t":{"75":{"position":[[1456,8],[1742,8]]},"105":{"position":[[337,7]]},"116":{"position":[[62,7]]},"263":{"position":[[437,7]]},"389":{"position":[[286,7]]},"596":{"position":[[2689,7]]}}}],["program",{"_index":712,"t":{"46":{"position":[[367,7]]},"196":{"position":[[503,7],[3019,7]]}}}],["programmat",{"_index":1001,"t":{"69":{"position":[[608,16]]}}}],["progress/result",{"_index":3299,"t":{"623":{"position":[[734,16]]}}}],["project",{"_index":214,"t":{"15":{"position":[[2055,8]]},"343":{"position":[[1846,7]]},"345":{"position":[[346,7],[433,7],[503,7]]},"385":{"position":[[772,7]]},"440":{"position":[[170,7]]},"442":{"position":[[224,7],[271,7]]},"653":{"position":[[1498,7]]}}}],["project_dir",{"_index":2801,"t":{"442":{"position":[[285,11],[463,11]]}}}],["project_dir/flatpak",{"_index":2804,"t":{"442":{"position":[[375,19],[561,19],[761,19]]}}}],["prometheu",{"_index":667,"t":{"42":{"position":[[2,10],[488,10],[865,10]]}}}],["prometheus_full=tru",{"_index":680,"t":{"42":{"position":[[441,20]]}}}],["promise<playobject",{"_index":3459,"t":{"648":{"position":[[1824,21]]},"651":{"position":[[715,21]]}}}],["promise<tru",{"_index":3424,"t":{"646":{"position":[[766,12],[1722,12]]}}}],["promot",{"_index":3199,"t":{"566":{"position":[[693,12]]}}}],["prone",{"_index":888,"t":{"55":{"position":[[9019,5]]}}}],["proper",{"_index":2735,"t":{"397":{"position":[[1265,6]]},"540":{"position":[[105,6]]}}}],["properli",{"_index":2331,"t":{"315":{"position":[[911,8]]},"343":{"position":[[463,8]]},"635":{"position":[[298,8]]},"648":{"position":[[668,8]]}}}],["propert",{"_index":2570,"t":{"363":{"position":[[133,9]]}}}],["properti",{"_index":127,"t":{"11":{"position":[[867,8]]},"15":{"position":[[5758,8],[5866,9]]},"29":{"position":[[2298,10],[2486,10],[4273,10]]},"33":{"position":[[357,8]]},"38":{"position":[[267,9]]},"67":{"position":[[855,11],[2231,11]]},"81":{"position":[[1096,11],[2514,11]]},"85":{"position":[[601,11],[2005,11]]},"91":{"position":[[765,11],[2234,11]]},"97":{"position":[[123,8]]},"99":{"position":[[862,11],[2293,11]]},"103":{"position":[[538,11],[1915,11]]},"107":{"position":[[650,11],[2115,11]]},"114":{"position":[[1787,11],[3228,11]]},"121":{"position":[[1151,11],[2528,11]]},"132":{"position":[[65,8],[131,8],[625,8]]},"142":{"position":[[708,8]]},"144":{"position":[[667,11],[2103,11]]},"154":{"position":[[1865,9],[3064,9]]},"162":{"position":[[669,8]]},"164":{"position":[[691,11],[2128,11]]},"166":{"position":[[1661,8]]},"168":{"position":[[1016,11],[2402,11]]},"200":{"position":[[903,11],[2606,11]]},"206":{"position":[[666,11],[2029,11]]},"208":{"position":[[3801,11],[5633,11]]},"212":{"position":[[526,11],[1858,11]]},"218":{"position":[[700,11],[2054,11]]},"232":{"position":[[774,11],[2108,11]]},"236":{"position":[[821,11],[1681,9],[2546,11]]},"238":{"position":[[1005,11],[1860,9],[2662,11]]},"257":{"position":[[848,11],[2188,11]]},"261":{"position":[[925,11],[1790,9],[2615,11]]},"265":{"position":[[699,11],[1589,9],[2438,11]]},"269":{"position":[[580,11],[1440,9],[2213,11]]},"273":{"position":[[646,11],[2027,11]]},"277":{"position":[[663,11],[2003,11]]},"281":{"position":[[631,11],[1990,11]]},"289":{"position":[[895,11],[2266,11]]},"295":{"position":[[823,11],[1688,9],[2523,11]]},"299":{"position":[[40,10]]},"301":{"position":[[1134,11],[2556,11]]},"305":{"position":[[677,11],[2151,11]]},"313":{"position":[[663,8]]},"317":{"position":[[655,11],[2123,11]]},"321":{"position":[[550,11],[1860,11]]},"329":{"position":[[595,11],[1970,11]]},"333":{"position":[[629,11],[2006,11]]},"341":{"position":[[747,8],[2066,11],[2926,9],[3757,11]]},"345":{"position":[[772,11],[2252,11]]},"357":{"position":[[2463,8]]},"359":{"position":[[702,8],[841,8],[939,10]]},"361":{"position":[[174,10]]},"363":{"position":[[158,8],[223,8]]},"383":{"position":[[1287,10],[2021,11],[2054,10],[3154,10]]},"393":{"position":[[527,11],[1863,11]]},"397":{"position":[[10,10],[531,10]]},"416":{"position":[[903,8]]},"553":{"position":[[11,10]]},"555":{"position":[[919,9],[1212,9]]},"559":{"position":[[9,10]]},"566":{"position":[[1281,8]]},"568":{"position":[[676,8],[786,9],[1181,10],[2395,10]]},"623":{"position":[[1267,8]]},"625":{"position":[[1345,8]]},"638":{"position":[[570,11]]},"646":{"position":[[170,10]]}}}],["properties/behavior",{"_index":2645,"t":{"379":{"position":[[441,19]]}}}],["protect",{"_index":2870,"t":{"460":{"position":[[208,9]]},"646":{"position":[[731,9],[1685,9]]},"648":{"position":[[1752,9]]},"651":{"position":[[644,9]]}}}],["protocol",{"_index":385,"t":{"21":{"position":[[247,8],[270,8]]},"109":{"position":[[151,8],[386,9],[403,8],[596,8],[1046,11]]},"116":{"position":[[384,9],[401,8],[594,8],[1044,11]]},"291":{"position":[[126,8]]}}}],["protocol://libre.tld/path/prefix",{"_index":1142,"t":{"97":{"position":[[192,32]]}}}],["protocol]://[hostname]:[port]/[path",{"_index":1908,"t":{"204":{"position":[[136,37]]},"216":{"position":[[138,37]]},"283":{"position":[[493,37]]}}}],["provid",{"_index":219,"t":{"15":{"position":[[2249,8],[3873,8],[4213,8]]},"23":{"position":[[971,8],[1322,7],[1548,11]]},"29":{"position":[[1231,8],[2115,9],[4130,9]]},"55":{"position":[[296,8],[357,8]]},"65":{"position":[[3123,7]]},"72":{"position":[[9,7],[948,8]]},"79":{"position":[[3298,7]]},"109":{"position":[[1002,10]]},"116":{"position":[[1000,10]]},"118":{"position":[[106,8]]},"140":{"position":[[197,9],[344,7]]},"147":{"position":[[75,7],[305,9]]},"166":{"position":[[440,8]]},"190":{"position":[[1491,9]]},"196":{"position":[[168,7],[531,7]]},"198":{"position":[[51,7]]},"202":{"position":[[259,7]]},"208":{"position":[[1340,8]]},"214":{"position":[[272,7]]},"246":{"position":[[64,8]]},"271":{"position":[[382,8],[435,8]]},"313":{"position":[[561,7]]},"331":{"position":[[992,8]]},"343":{"position":[[3336,7],[5272,8]]},"391":{"position":[[317,8],[503,7]]},"397":{"position":[[645,8],[1257,7]]},"412":{"position":[[52,8]]},"440":{"position":[[29,8]]},"470":{"position":[[1320,9],[1388,7],[2586,7],[2614,7],[3213,7]]},"488":{"position":[[303,7]]},"530":{"position":[[1532,9]]},"532":{"position":[[387,7]]},"534":{"position":[[120,7]]},"592":{"position":[[41,8]]},"610":{"position":[[136,8]]},"625":{"position":[[889,11],[1119,8],[1485,11]]},"633":{"position":[[19,7]]},"646":{"position":[[191,8]]},"651":{"position":[[107,8]]}}}],["proxi",{"_index":893,"t":{"55":{"position":[[9117,5]]},"128":{"position":[[530,6]]},"140":{"position":[[228,5]]},"230":{"position":[[655,5]]},"255":{"position":[[660,5]]},"303":{"position":[[2729,5]]},"323":{"position":[[746,5]]},"391":{"position":[[474,6]]}}}],["psuedo",{"_index":3146,"t":{"555":{"position":[[1127,8]]},"561":{"position":[[6530,6]]},"568":{"position":[[1963,6]]}}}],["public",{"_index":609,"t":{"36":{"position":[[49,6]]},"55":{"position":[[5851,6],[7237,6],[9496,6]]},"65":{"position":[[122,10],[2613,6],[3866,6]]},"79":{"position":[[122,10],[2788,6],[4074,6]]},"109":{"position":[[987,6],[1458,6],[1492,7],[1532,6]]},"116":{"position":[[985,6],[1452,6],[1486,7],[1526,6]]},"142":{"position":[[1095,6],[1183,6],[1252,6],[1272,6],[1427,7]]},"323":{"position":[[540,6]]}}}],["publicli",{"_index":2377,"t":{"323":{"position":[[598,8]]}}}],["publish",{"_index":3054,"t":{"522":{"position":[[350,9],[441,9]]}}}],["puid",{"_index":2135,"t":{"275":{"position":[[986,4]]},"476":{"position":[[1989,4]]}}}],["puid=1000",{"_index":2954,"t":{"478":{"position":[[905,9]]}}}],["pull",{"_index":1212,"t":{"109":{"position":[[1398,6]]},"116":{"position":[[1392,6]]},"516":{"position":[[263,4],[373,7],[404,4]]},"520":{"position":[[149,4]]},"522":{"position":[[196,7],[404,4]]},"524":{"position":[[447,4],[621,6]]}}}],["punctuat",{"_index":1688,"t":{"172":{"position":[[1865,11]]}}}],["punish",{"_index":1023,"t":{"72":{"position":[[345,9]]}}}],["punk",{"_index":2725,"t":{"395":{"position":[[815,4],[933,5]]},"561":{"position":[[4568,4],[4630,4],[4900,5],[5517,4]]},"575":{"position":[[718,4],[900,5]]}}}],["pure",{"_index":1873,"t":{"198":{"position":[[1360,5]]}}}],["push",{"_index":618,"t":{"38":{"position":[[14,4]]},"648":{"position":[[2481,4]]}}}],["python",{"_index":2425,"t":{"333":{"position":[[358,6]]},"435":{"position":[[73,6]]}}}],["qualifi",{"_index":1253,"t":{"114":{"position":[[1599,9]]},"295":{"position":[[635,9]]}}}],["qualiti",{"_index":1979,"t":{"210":{"position":[[383,7]]}}}],["queri",{"_index":498,"t":{"29":{"position":[[402,8]]},"40":{"position":[[343,5]]},"190":{"position":[[1089,7]]},"317":{"position":[[510,5]]},"343":{"position":[[3687,5]]},"559":{"position":[[293,7]]},"561":{"position":[[836,7]]}}}],["querystrings/data",{"_index":2283,"t":{"303":{"position":[[4740,17]]}}}],["question",{"_index":3008,"t":{"499":{"position":[[62,9]]}}}],["queu",{"_index":3266,"t":{"596":{"position":[[1116,7]]}}}],["queue",{"_index":74,"t":{"9":{"position":[[97,5]]},"87":{"position":[[487,5]]},"179":{"position":[[449,5]]},"303":{"position":[[211,5]]},"470":{"position":[[3048,8]]},"619":{"position":[[64,7]]},"623":{"position":[[448,7]]}}}],["queued/fail",{"_index":3295,"t":{"623":{"position":[[51,13],[489,13]]}}}],["queued/scrobbled/deadlett",{"_index":672,"t":{"42":{"position":[[164,27]]}}}],["quick",{"_index":2943,"t":{"478":{"position":[[12,5]]},"544":{"position":[[1570,5]]},"596":{"position":[[1324,5]]},"604":{"position":[[8,5]]}}}],["quicker",{"_index":421,"t":{"23":{"position":[[380,7]]}}}],["quickstart",{"_index":1411,"t":{"147":{"position":[[452,10]]},"403":{"position":[[594,11]]},"557":{"position":[[1491,11]]},"596":{"position":[[2877,10]]}}}],["quirk",{"_index":1896,"t":{"200":{"position":[[617,5]]}}}],["r",{"_index":806,"t":{"55":{"position":[[2449,1],[2496,1]]},"59":{"position":[[1048,1],[1095,1]]}}}],["race",{"_index":1764,"t":{"177":{"position":[[164,4]]}}}],["rang",{"_index":32,"t":{"7":{"position":[[208,5]]},"172":{"position":[[2794,5],[4678,5]]},"544":{"position":[[830,5]]},"546":{"position":[[227,5]]}}}],["rank",{"_index":3218,"t":{"568":{"position":[[705,4],[2251,6],[2953,7],[3088,6],[3124,6]]}}}],["rariti",{"_index":2593,"t":{"365":{"position":[[898,8],[953,8]]}}}],["raspberri",{"_index":2921,"t":{"474":{"position":[[66,9]]}}}],["rate",{"_index":3136,"t":{"551":{"position":[[9,4]]}}}],["raw",{"_index":1273,"t":{"116":{"position":[[2009,3]]},"142":{"position":[[502,3]]},"166":{"position":[[3117,3]]},"297":{"position":[[1710,3]]},"319":{"position":[[1163,3]]},"341":{"position":[[658,3]]},"464":{"position":[[550,3]]}}}],["re",{"_index":815,"t":{"55":{"position":[[2734,2]]},"59":{"position":[[1333,2]]},"83":{"position":[[26,2]]},"87":{"position":[[27,2]]},"93":{"position":[[27,2]]},"105":{"position":[[27,2]]},"109":{"position":[[26,2]]},"116":{"position":[[26,2]]},"142":{"position":[[828,3]]},"172":{"position":[[653,2]]},"188":{"position":[[510,2]]},"198":{"position":[[669,2],[1305,2],[1653,2]]},"220":{"position":[[189,2]]},"234":{"position":[[55,2]]},"238":{"position":[[65,2]]},"240":{"position":[[427,2]]},"259":{"position":[[56,2]]},"263":{"position":[[72,2]]},"291":{"position":[[210,2]]},"335":{"position":[[289,2]]},"343":{"position":[[4647,2]]},"383":{"position":[[2846,2]]},"454":{"position":[[1132,2]]},"470":{"position":[[1162,3]]}}}],["re)authent",{"_index":2289,"t":{"303":{"position":[[5453,16]]},"343":{"position":[[4270,16]]},"454":{"position":[[497,16]]},"530":{"position":[[1212,16],[3990,16]]}}}],["re)start",{"_index":1014,"t":{"69":{"position":[[1254,12]]},"530":{"position":[[2017,9]]}}}],["reach",{"_index":2045,"t":{"230":{"position":[[988,5]]},"255":{"position":[[993,5]]},"343":{"position":[[3084,5]]},"450":{"position":[[474,5]]}}}],["reachabl",{"_index":608,"t":{"36":{"position":[[33,12]]},"230":{"position":[[701,11]]},"255":{"position":[[706,11]]},"448":{"position":[[1877,9]]}}}],["read",{"_index":981,"t":{"67":{"position":[[1834,4],[3198,4]]},"69":{"position":[[479,5]]},"81":{"position":[[2075,4],[3481,4]]},"85":{"position":[[1570,4],[2966,4]]},"91":{"position":[[1739,4],[3198,4]]},"99":{"position":[[1841,4],[3260,4]]},"103":{"position":[[1512,4],[2879,4]]},"107":{"position":[[1654,4],[3097,4]]},"109":{"position":[[1376,4],[1539,5]]},"114":{"position":[[2766,4],[4195,4]]},"116":{"position":[[1370,4],[1533,5]]},"121":{"position":[[2125,4],[3492,4]]},"144":{"position":[[1656,4],[3076,4]]},"164":{"position":[[1665,4],[3092,4]]},"168":{"position":[[2010,4],[3378,4]]},"200":{"position":[[1897,4],[3582,4]]},"206":{"position":[[1630,4],[2987,4]]},"208":{"position":[[4785,4],[6603,4]]},"212":{"position":[[1505,4],[2825,4]]},"218":{"position":[[1674,4],[3018,4]]},"232":{"position":[[1773,4],[3087,4]]},"236":{"position":[[2051,4],[3510,4]]},"238":{"position":[[2227,4],[3623,4]]},"257":{"position":[[1842,4],[3164,4]]},"261":{"position":[[2163,4],[3582,4]]},"265":{"position":[[1977,4],[3420,4]]},"269":{"position":[[1810,4],[3177,4]]},"273":{"position":[[1635,4],[3000,4]]},"277":{"position":[[1632,4],[2964,4]]},"279":{"position":[[229,4]]},"281":{"position":[[1590,4],[2945,4]]},"289":{"position":[[1869,4],[3230,4]]},"295":{"position":[[2061,4],[3490,4]]},"301":{"position":[[2103,4],[3517,4]]},"305":{"position":[[1656,4],[3118,4]]},"317":{"position":[[1639,4],[3093,4]]},"321":{"position":[[1509,4],[2815,4]]},"329":{"position":[[1599,4],[2952,4]]},"333":{"position":[[1613,4],[2976,4]]},"341":{"position":[[3296,4],[4721,4]]},"345":{"position":[[1751,4],[3219,4]]},"383":{"position":[[386,7],[1317,4],[3230,4]]},"393":{"position":[[1516,4],[2836,4]]},"476":{"position":[[48,4],[2174,4]]},"635":{"position":[[857,4]]},"642":{"position":[[18,5]]},"646":{"position":[[1889,4]]}}}],["read_onli",{"_index":2938,"t":{"476":{"position":[[2189,10],[2305,10]]}}}],["readi",{"_index":2087,"t":{"253":{"position":[[403,5]]},"319":{"position":[[661,5]]}}}],["real",{"_index":976,"t":{"67":{"position":[[1482,4]]},"75":{"position":[[34,6],[246,6],[390,4],[822,6]]},"81":{"position":[[1723,4]]},"85":{"position":[[1222,4]]},"91":{"position":[[1389,4]]},"99":{"position":[[1489,4]]},"103":{"position":[[1162,4]]},"107":{"position":[[1292,4]]},"114":{"position":[[2414,4]]},"121":{"position":[[1775,4]]},"128":{"position":[[705,4],[924,4]]},"144":{"position":[[1300,4]]},"154":{"position":[[930,4]]},"164":{"position":[[1315,4]]},"168":{"position":[[1652,4]]},"172":{"position":[[2742,4],[3472,4]]},"200":{"position":[[1539,4]]},"206":{"position":[[1284,4]]},"208":{"position":[[4431,4]]},"212":{"position":[[1153,4]]},"218":{"position":[[1324,4]]},"230":{"position":[[539,4]]},"232":{"position":[[1413,4]]},"236":{"position":[[1445,4]]},"238":{"position":[[1626,4]]},"240":{"position":[[315,4]]},"255":{"position":[[544,4]]},"257":{"position":[[1484,4]]},"261":{"position":[[1552,4]]},"265":{"position":[[1341,4]]},"269":{"position":[[1204,4]]},"273":{"position":[[1279,4]]},"277":{"position":[[1284,4]]},"281":{"position":[[1246,4]]},"289":{"position":[[1519,4]]},"295":{"position":[[1450,4]]},"301":{"position":[[1755,4]]},"305":{"position":[[1304,4]]},"311":{"position":[[548,4],[836,4],[1313,4]]},"317":{"position":[[1285,4]]},"321":{"position":[[1165,4]]},"329":{"position":[[1237,4]]},"331":{"position":[[48,4]]},"333":{"position":[[1259,4]]},"341":{"position":[[2690,4]]},"345":{"position":[[1399,4]]},"393":{"position":[[1160,4]]},"488":{"position":[[23,4]]},"540":{"position":[[586,4]]},"644":{"position":[[433,4]]}}}],["realiz",{"_index":3251,"t":{"577":{"position":[[170,9]]}}}],["realtim",{"_index":52,"t":{"7":{"position":[[516,8]]}}}],["reason",{"_index":251,"t":{"15":{"position":[[3695,7]]},"29":{"position":[[1285,10],[3985,10]]},"72":{"position":[[404,7]]},"297":{"position":[[1833,6]]},"347":{"position":[[339,8]]},"383":{"position":[[711,6]]},"561":{"position":[[6737,7]]},"653":{"position":[[3873,6]]}}}],["reasons/stat",{"_index":1777,"t":{"184":{"position":[[216,14]]}}}],["reauthent",{"_index":2684,"t":{"383":{"position":[[3313,14]]},"454":{"position":[[370,14]]}}}],["rebound",{"_index":1869,"t":{"198":{"position":[[1190,8]]}}}],["recap",{"_index":2529,"t":{"349":{"position":[[13,5]]}}}],["receiv",{"_index":1606,"t":{"166":{"position":[[2457,10],[3044,10]]},"179":{"position":[[122,8]]},"349":{"position":[[558,8]]},"353":{"position":[[60,8],[298,8],[919,7]]},"355":{"position":[[477,8]]},"385":{"position":[[562,8]]},"403":{"position":[[946,8]]},"448":{"position":[[449,8],[814,8],[1001,8]]},"464":{"position":[[73,8]]},"557":{"position":[[1986,8]]},"653":{"position":[[215,8],[1627,8],[1787,8]]}}}],["recent",{"_index":1016,"t":{"69":{"position":[[1513,8]]},"194":{"position":[[46,8]]},"198":{"position":[[215,6]]},"610":{"position":[[31,6]]},"635":{"position":[[446,8]]},"651":{"position":[[1110,8]]},"653":{"position":[[762,8],[4019,9]]}}}],["recentlyplayedopt",{"_index":3458,"t":{"648":{"position":[[1795,21]]},"651":{"position":[[691,23]]}}}],["reciev",{"_index":1755,"t":{"174":{"position":[[480,9]]},"177":{"position":[[494,8]]},"179":{"position":[[278,8]]},"297":{"position":[[1719,8]]},"303":{"position":[[741,7],[3874,9]]},"393":{"position":[[1670,10],[3000,10]]}}}],["recogn",{"_index":2827,"t":{"448":{"position":[[942,10]]},"462":{"position":[[103,9]]}}}],["recommend",{"_index":453,"t":{"25":{"position":[[295,11]]},"77":{"position":[[151,11]]},"166":{"position":[[590,11]]},"198":{"position":[[412,11]]},"208":{"position":[[353,11]]},"220":{"position":[[263,11]]},"313":{"position":[[313,11]]},"323":{"position":[[811,13]]},"343":{"position":[[826,11]]},"440":{"position":[[130,9]]},"490":{"position":[[206,11]]},"510":{"position":[[154,11]]},"561":{"position":[[4117,13]]},"619":{"position":[[437,11]]}}}],["reconstruct",{"_index":543,"t":{"29":{"position":[[1829,11]]}}}],["record",{"_index":1349,"t":{"134":{"position":[[914,6]]},"341":{"position":[[765,6]]},"452":{"position":[[278,6],[404,6],[896,8]]},"561":{"position":[[2130,11],[2278,9],[6142,9],[6173,9]]},"566":{"position":[[59,9],[200,9],[1560,9],[1670,9],[1817,9]]},"568":{"position":[[1621,9],[3024,11],[3172,10]]},"575":{"position":[[770,9]]}}}],["recov",{"_index":2679,"t":{"383":{"position":[[2938,7]]}}}],["recoveri",{"_index":1862,"t":{"198":{"position":[[523,9],[1689,8]]}}}],["recoverunchangedtophistori",{"_index":1876,"t":{"198":{"position":[[1712,29]]},"200":{"position":[[2432,29],[4126,29]]}}}],["recreat",{"_index":3064,"t":{"524":{"position":[[645,9]]}}}],["redi",{"_index":456,"t":{"25":{"position":[[400,6]]}}}],["redirect",{"_index":377,"t":{"21":{"position":[[49,8],[445,8],[501,8],[622,8],[856,8]]},"89":{"position":[[4,8],[39,8],[498,8]]},"93":{"position":[[437,9]]},"95":{"position":[[4,8],[39,8],[492,8]]},"303":{"position":[[1948,8],[2000,8],[2028,8],[2429,8],[2642,8],[2812,8],[3272,8],[3966,8],[4118,8],[4209,8],[5136,8],[5315,8]]},"305":{"position":[[478,8]]},"343":{"position":[[2307,8],[2941,8],[3033,8],[3210,8],[3362,8],[3442,8],[3750,8],[4132,8]]},"345":{"position":[[378,8]]},"476":{"position":[[1072,9]]},"530":{"position":[[641,8],[761,8]]}}}],["redirecturi",{"_index":297,"t":{"15":{"position":[[5092,14]]},"19":{"position":[[641,14],[1115,14]]},"21":{"position":[[562,11]]},"89":{"position":[[396,11]]},"91":{"position":[[2064,14],[3536,14]]},"95":{"position":[[397,11]]},"99":{"position":[[2122,14],[3553,14]]},"150":{"position":[[1723,14],[2250,14],[2754,14],[3271,14]]},"152":{"position":[[1268,14],[1454,14],[2531,14],[2735,14]]},"154":{"position":[[2497,14],[2924,14],[3701,14],[4127,14]]},"198":{"position":[[3047,14]]},"236":{"position":[[2376,14],[3848,14]]},"261":{"position":[[2444,14],[3875,14]]},"305":{"position":[[1972,14],[3446,14]]},"343":{"position":[[3963,14]]},"532":{"position":[[1916,14]]},"536":{"position":[[1054,14]]}}}],["redis://192.168.0.120:6379",{"_index":469,"t":{"25":{"position":[[1192,28]]}}}],["redis://host_ip:host_port",{"_index":467,"t":{"25":{"position":[[1008,25]]}}}],["redis://valkey:6379",{"_index":464,"t":{"25":{"position":[[832,19]]},"625":{"position":[[849,21],[927,21],[1452,22],[1523,21]]}}}],["redo",{"_index":1244,"t":{"114":{"position":[[860,4]]}}}],["reduc",{"_index":407,"t":{"23":{"position":[[38,6]]},"29":{"position":[[1460,6]]},"138":{"position":[[113,6]]},"368":{"position":[[19,6],[402,6]]},"391":{"position":[[179,6]]},"476":{"position":[[2464,7]]},"542":{"position":[[157,7]]},"571":{"position":[[37,6],[90,6]]}}}],["refer",{"_index":324,"t":{"15":{"position":[[6133,9]]},"17":{"position":[[98,9],[156,9]]},"38":{"position":[[649,5],[1004,5],[1404,5]]},"72":{"position":[[483,5]]},"379":{"position":[[28,9],[128,8]]},"385":{"position":[[702,5]]},"403":{"position":[[330,5]]},"460":{"position":[[342,5]]},"466":{"position":[[271,5],[392,5]]},"530":{"position":[[655,5],[3030,5]]},"557":{"position":[[1221,5]]},"559":{"position":[[109,5]]},"653":{"position":[[1509,10]]}}}],["referenc",{"_index":537,"t":{"29":{"position":[[1583,11]]}}}],["refin",{"_index":3156,"t":{"559":{"position":[[301,8]]}}}],["refresh",{"_index":1845,"t":{"196":{"position":[[3191,10]]},"343":{"position":[[5432,11]]},"454":{"position":[[456,7]]}}}],["regardless",{"_index":1607,"t":{"166":{"position":[[2551,10],[2954,10]]},"172":{"position":[[4837,10]]},"283":{"position":[[220,10]]},"297":{"position":[[1612,11]]},"510":{"position":[[136,11]]},"532":{"position":[[314,10]]},"534":{"position":[[47,10]]},"544":{"position":[[274,10]]},"561":{"position":[[6191,10]]},"575":{"position":[[1612,10]]},"596":{"position":[[1897,10],[2089,10]]},"653":{"position":[[744,10]]}}}],["regex",{"_index":2766,"t":{"421":{"position":[[129,5],[196,5]]},"431":{"position":[[281,5]]}}}],["regist",{"_index":1115,"t":{"87":{"position":[[1279,8]]},"530":{"position":[[3389,8]]},"538":{"position":[[1366,8]]}}}],["registr",{"_index":2055,"t":{"234":{"position":[[321,12]]},"259":{"position":[[206,12]]}}}],["regular",{"_index":1232,"t":{"114":{"position":[[103,7]]},"121":{"position":[[203,7]]},"210":{"position":[[1793,7]]},"319":{"position":[[1182,7]]},"363":{"position":[[186,7],[898,7]]},"397":{"position":[[401,7]]},"416":{"position":[[179,7],[402,7]]},"648":{"position":[[2488,7]]}}}],["rel",{"_index":2961,"t":{"482":{"position":[[624,8],[810,8]]}}}],["relat",{"_index":1744,"t":{"172":{"position":[[4930,7]]},"299":{"position":[[32,7]]},"331":{"position":[[1049,7],[1512,7]]},"385":{"position":[[308,7]]},"452":{"position":[[629,7]]},"514":{"position":[[41,7]]},"528":{"position":[[40,7]]},"568":{"position":[[1717,7]]}}}],["relay",{"_index":714,"t":{"46":{"position":[[394,5]]},"55":{"position":[[5616,7],[5896,5],[7002,7],[7453,5],[9261,7]]},"116":{"position":[[1796,5]]},"275":{"position":[[1467,5]]}}}],["releas",{"_index":897,"t":{"55":{"position":[[9635,8]]},"65":{"position":[[2912,7],[3054,7]]},"79":{"position":[[3087,7],[3229,7]]},"154":{"position":[[966,7]]},"510":{"position":[[188,7],[227,7]]},"514":{"position":[[86,7]]},"516":{"position":[[53,7],[125,7]]},"518":{"position":[[331,7]]},"520":{"position":[[196,7]]},"522":{"position":[[65,7],[90,8],[180,8],[370,8]]},"555":{"position":[[1136,10]]},"557":{"position":[[975,8],[1664,7]]},"561":{"position":[[6161,8],[6537,9],[6601,9],[6658,8],[6761,7]]},"566":{"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]]},"568":{"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]]},"573":{"position":[[395,7],[581,7],[808,7],[994,7]]},"577":{"position":[[61,8],[208,7]]},"594":{"position":[[101,7]]},"596":{"position":[[1551,7]]},"631":{"position":[[47,7],[118,7],[624,7]]}}}],["release/album/ep",{"_index":3198,"t":{"566":{"position":[[666,16]]}}}],["releaseallowempti",{"_index":3144,"t":{"553":{"position":[[319,20]]},"566":{"position":[[1881,17],[1953,20]]}}}],["releasecountri",{"_index":3204,"t":{"566":{"position":[[954,16]]}}}],["releasecountryprior",{"_index":1498,"t":{"154":{"position":[[2195,25],[3394,25]]},"573":{"position":[[589,25],[1002,25]]},"586":{"position":[[371,25]]},"590":{"position":[[468,25]]},"594":{"position":[[767,25],[1346,25]]}}}],["releasegroup",{"_index":2610,"t":{"365":{"position":[[1167,13]]}}}],["releasegroupprimarytyp",{"_index":3200,"t":{"566":{"position":[[749,25]]}}}],["releasegroupprimarytypeprior",{"_index":1495,"t":{"154":{"position":[[2131,34],[3330,34]]},"568":{"position":[[995,34]]},"573":{"position":[[499,34],[912,34]]},"586":{"position":[[309,34]]},"590":{"position":[[406,34]]},"594":{"position":[[705,34],[1284,34]]}}}],["releasegroupsecondarytyp",{"_index":3201,"t":{"566":{"position":[[851,27]]}}}],["releasegroupsecondarytypedeni",{"_index":3213,"t":{"566":{"position":[[1483,32]]}}}],["releasestatu",{"_index":3197,"t":{"566":{"position":[[640,15]]}}}],["releasestatusallow",{"_index":3212,"t":{"566":{"position":[[1421,21]]}}}],["releasestatusprior",{"_index":1494,"t":{"154":{"position":[[2092,24],[3291,24]]},"553":{"position":[[280,24]]},"555":{"position":[[1102,24]]},"568":{"position":[[901,24],[1927,21]]},"573":{"position":[[422,24],[835,24]]},"586":{"position":[[270,24]]},"590":{"position":[[367,24]]},"594":{"position":[[666,24],[1245,24]]}}}],["relev",{"_index":1345,"t":{"134":{"position":[[162,8],[563,8]]},"492":{"position":[[251,8]]},"499":{"position":[[491,8]]}}}],["reli",{"_index":1575,"t":{"166":{"position":[[405,6],[672,7]]},"454":{"position":[[599,6]]},"464":{"position":[[28,6]]},"592":{"position":[[109,4]]}}}],["reload",{"_index":1834,"t":{"196":{"position":[[1356,6],[2093,6]]},"323":{"position":[[244,6]]},"505":{"position":[[41,6]]}}}],["remain",{"_index":1854,"t":{"196":{"position":[[3807,7]]},"568":{"position":[[38,9]]},"625":{"position":[[526,7],[992,7]]}}}],["remast",{"_index":2576,"t":{"363":{"position":[[854,18]]}}}],["rememb",{"_index":946,"t":{"65":{"position":[[3818,9]]},"79":{"position":[[4026,9]]},"343":{"position":[[3700,8]]},"638":{"position":[[542,8]]}}}],["remix",{"_index":3203,"t":{"566":{"position":[[924,6]]}}}],["remot",{"_index":1905,"t":{"202":{"position":[[173,6]]},"206":{"position":[[431,6],[502,6]]},"275":{"position":[[608,6],[647,6],[1275,6]]},"448":{"position":[[477,6]]}}}],["remov",{"_index":1245,"t":{"114":{"position":[[1004,7]]},"154":{"position":[[1907,7],[3106,7]]},"156":{"position":[[133,6]]},"172":{"position":[[268,8]]},"198":{"position":[[709,7]]},"200":{"position":[[718,7]]},"289":{"position":[[667,6]]},"412":{"position":[[234,8],[275,8]]},"414":{"position":[[739,7]]},"416":{"position":[[83,7],[215,7]]},"418":{"position":[[223,7],[268,7],[500,8]]},"421":{"position":[[202,6]]},"423":{"position":[[0,7]]},"470":{"position":[[1086,8]]},"526":{"position":[[564,6]]},"561":{"position":[[4715,7]]},"566":{"position":[[1988,6]]},"568":{"position":[[154,8]]},"625":{"position":[[82,8],[316,8],[346,7],[388,6],[439,6],[644,6],[709,6],[1265,6],[1323,6],[1420,8]]}}}],["removetrailingslash",{"_index":3419,"t":{"646":{"position":[[514,21]]}}}],["renam",{"_index":215,"t":{"15":{"position":[[2091,8]]},"442":{"position":[[399,6],[585,6]]},"625":{"position":[[666,6]]},"627":{"position":[[62,8]]}}}],["render",{"_index":1213,"t":{"109":{"position":[[1428,6]]},"116":{"position":[[1422,6]]},"208":{"position":[[1707,9]]},"373":{"position":[[348,6]]}}}],["repeat",{"_index":49,"t":{"7":{"position":[[474,6]]},"160":{"position":[[484,8],[608,8]]},"194":{"position":[[615,6]]},"198":{"position":[[1410,6]]},"315":{"position":[[791,8]]},"347":{"position":[[400,9],[742,9]]}}}],["replac",{"_index":343,"t":{"19":{"position":[[405,8]]},"114":{"position":[[623,8]]},"196":{"position":[[3764,7]]},"208":{"position":[[1561,7],[1662,7]]},"224":{"position":[[72,7]]},"303":{"position":[[4310,7]]},"347":{"position":[[109,9]]},"355":{"position":[[201,7]]},"359":{"position":[[1174,9]]},"397":{"position":[[287,8]]},"412":{"position":[[31,7]]},"414":{"position":[[49,7]]},"416":{"position":[[13,7],[434,7],[524,10],[549,7],[747,10],[776,7],[895,7],[930,9]]},"418":{"position":[[41,7],[301,8],[349,10]]},"421":{"position":[[61,7],[142,7],[301,10]]},"427":{"position":[[65,10]]},"429":{"position":[[68,10]]},"431":{"position":[[93,7],[106,7],[294,7],[742,10]]},"442":{"position":[[653,7]]},"482":{"position":[[1565,11]]},"526":{"position":[[618,7]]},"538":{"position":[[750,7]]},"625":{"position":[[358,8]]}}}],["replay",{"_index":544,"t":{"29":{"position":[[1845,6]]}}}],["replic",{"_index":2995,"t":{"490":{"position":[[36,9]]},"499":{"position":[[554,9]]}}}],["repo",{"_index":267,"t":{"15":{"position":[[4417,4]]}}}],["repo=/home/youruser/multi",{"_index":2809,"t":{"442":{"position":[[799,25]]}}}],["report",{"_index":51,"t":{"7":{"position":[[509,6]]},"11":{"position":[[20,6],[272,10],[494,8],[618,9],[779,9],[1231,6],[1295,9]]},"29":{"position":[[1894,9]]},"31":{"position":[[217,10]]},"55":{"position":[[3136,7],[8928,6]]},"61":{"position":[[360,7]]},"130":{"position":[[13,6]]},"138":{"position":[[49,6]]},"160":{"position":[[65,6]]},"166":{"position":[[1597,6],[1681,8],[1758,6],[1855,6],[1950,8],[2622,7],[2979,8]]},"172":{"position":[[2658,6]]},"210":{"position":[[1402,6]]},"230":{"position":[[1094,6]]},"253":{"position":[[571,8]]},"255":{"position":[[1105,6]]},"297":{"position":[[272,7],[516,9],[1038,6],[1151,6],[2012,7]]},"303":{"position":[[286,6],[439,7]]},"313":{"position":[[184,8]]},"315":{"position":[[67,7],[135,10],[252,6],[386,9],[530,9],[618,10],[671,6],[766,10],[920,7]]},"319":{"position":[[1270,8],[1948,10],[1995,9],[2137,10],[2237,9]]},"343":{"position":[[472,6],[1447,8]]},"391":{"position":[[127,6]]},"395":{"position":[[140,6],[180,7]]},"466":{"position":[[63,9],[147,8]]},"468":{"position":[[7,9]]},"470":{"position":[[1201,9],[1412,7]]},"499":{"position":[[7,9],[439,7]]},"648":{"position":[[423,8]]}}}],["repositori",{"_index":499,"t":{"29":{"position":[[418,10]]},"65":{"position":[[3626,11]]},"79":{"position":[[3834,11]]},"109":{"position":[[300,10],[1114,10],[1414,10]]},"116":{"position":[[298,10],[1112,10],[1408,10]]},"293":{"position":[[93,10]]},"331":{"position":[[1195,10]]},"335":{"position":[[181,10]]},"337":{"position":[[93,10]]},"375":{"position":[[190,10]]},"377":{"position":[[5,10],[307,10]]},"474":{"position":[[123,10],[179,10]]},"482":{"position":[[11,10]]},"497":{"position":[[14,10]]},"516":{"position":[[302,10]]}}}],["repres",{"_index":3187,"t":{"564":{"position":[[60,12]]},"566":{"position":[[1072,9]]},"644":{"position":[[556,9]]}}}],["request",{"_index":422,"t":{"23":{"position":[[388,8]]},"29":{"position":[[1000,8]]},"128":{"position":[[211,8]]},"158":{"position":[[132,8]]},"196":{"position":[[872,9],[1336,8],[1418,7],[1509,7],[2138,7],[2226,7],[2683,7]]},"200":{"position":[[546,8]]},"230":{"position":[[1068,8]]},"248":{"position":[[554,8],[642,8]]},"255":{"position":[[1079,8]]},"257":{"position":[[516,7]]},"303":{"position":[[3863,7],[4766,8]]},"345":{"position":[[579,7]]},"383":{"position":[[374,8],[1821,7],[2496,7],[3172,7]]},"448":{"position":[[458,7],[1015,7],[2522,9]]},"452":{"position":[[222,7],[382,7],[637,9]]},"454":{"position":[[110,7]]},"499":{"position":[[219,7],[261,7],[299,7]]},"520":{"position":[[154,8]]},"522":{"position":[[409,8]]},"524":{"position":[[452,8]]},"635":{"position":[[907,8]]},"646":{"position":[[1516,7],[2154,7],[2381,7]]},"648":{"position":[[1543,7],[1951,7]]},"651":{"position":[[339,7],[767,7]]}}}],["request.get(`${this.baseurl}/health",{"_index":3440,"t":{"646":{"position":[[1784,38]]}}}],["request/respons",{"_index":497,"t":{"29":{"position":[[362,16],[2029,17]]}}}],["requir",{"_index":165,"t":{"15":{"position":[[418,7],[5741,7],[5839,7],[6110,8]]},"27":{"position":[[169,8]]},"29":{"position":[[1574,8]]},"40":{"position":[[582,7]]},"46":{"position":[[283,8],[345,7]]},"48":{"position":[[98,7],[206,8]]},"55":{"position":[[3373,8],[6654,9],[8530,9],[10046,9]]},"65":{"position":[[910,8]]},"67":{"position":[[731,8]]},"69":{"position":[[451,8],[920,8]]},"72":{"position":[[151,8]]},"79":{"position":[[1051,8]]},"81":{"position":[[972,8]]},"83":{"position":[[788,9]]},"85":{"position":[[479,8]]},"91":{"position":[[642,8]]},"99":{"position":[[738,8]]},"103":{"position":[[415,8]]},"107":{"position":[[521,8]]},"114":{"position":[[1663,8]]},"121":{"position":[[1028,8]]},"128":{"position":[[429,7]]},"136":{"position":[[280,7]]},"140":{"position":[[117,8]]},"144":{"position":[[541,8]]},"154":{"position":[[861,8]]},"164":{"position":[[568,8]]},"166":{"position":[[1470,9],[1544,9]]},"168":{"position":[[889,8]]},"192":{"position":[[207,8]]},"194":{"position":[[22,8]]},"196":{"position":[[41,8],[405,9],[2610,8],[2670,8],[2929,8]]},"200":{"position":[[776,8]]},"206":{"position":[[545,8]]},"208":{"position":[[3676,8]]},"212":{"position":[[402,8]]},"218":{"position":[[577,8]]},"226":{"position":[[157,8],[325,8]]},"230":{"position":[[184,7],[439,7],[513,7]]},"232":{"position":[[646,8]]},"236":{"position":[[698,8],[1572,8],[1766,11]]},"238":{"position":[[883,8],[1752,8],[1944,11]]},"246":{"position":[[26,7],[269,7]]},"255":{"position":[[184,7],[439,7],[518,7]]},"257":{"position":[[721,8]]},"261":{"position":[[801,8],[1680,8],[1876,11]]},"265":{"position":[[570,8],[1474,8],[1680,11]]},"269":{"position":[[457,8],[1331,8],[1525,11]]},"273":{"position":[[520,8]]},"275":{"position":[[396,8],[598,9],[768,11]]},"277":{"position":[[541,8]]},"279":{"position":[[211,8]]},"281":{"position":[[511,8]]},"289":{"position":[[772,8]]},"295":{"position":[[699,8],[1578,8],[1774,11]]},"301":{"position":[[1012,8]]},"303":{"position":[[518,8],[888,7],[1453,8]]},"305":{"position":[[494,8],[553,8]]},"317":{"position":[[530,8]]},"321":{"position":[[430,8]]},"323":{"position":[[430,9]]},"325":{"position":[[117,8]]},"329":{"position":[[466,8]]},"331":{"position":[[71,8]]},"333":{"position":[[504,8]]},"341":{"position":[[1943,8],[2817,8],[3011,11]]},"345":{"position":[[648,8]]},"357":{"position":[[348,8]]},"375":{"position":[[12,8]]},"381":{"position":[[250,8],[449,8]]},"383":{"position":[[516,8],[1278,8],[1977,8],[2293,8],[2374,8],[2446,8],[2708,8]]},"385":{"position":[[99,8]]},"393":{"position":[[401,8]]},"410":{"position":[[194,8]]},"435":{"position":[[64,8]]},"510":{"position":[[370,8]]},"512":{"position":[[143,8]]},"518":{"position":[[403,8]]},"551":{"position":[[36,8]]},"561":{"position":[[185,8],[326,8],[493,8],[775,8]]},"619":{"position":[[520,8]]},"621":{"position":[[1244,8]]},"625":{"position":[[53,8]]},"631":{"position":[[251,8],[287,8],[563,7]]},"635":{"position":[[340,7]]},"638":{"position":[[355,8],[2065,8],[2092,8]]},"640":{"position":[[782,8],[848,7]]},"642":{"position":[[1048,10]]},"646":{"position":[[34,8]]}}}],["requiresauth",{"_index":2675,"t":{"383":{"position":[[2125,12]]}}}],["requiresauthinteract",{"_index":2677,"t":{"383":{"position":[[2216,23]]}}}],["reserv",{"_index":3317,"t":{"631":{"position":[[237,8]]}}}],["reset",{"_index":2881,"t":{"470":{"position":[[568,6]]}}}],["resolut",{"_index":1583,"t":{"166":{"position":[[1094,10]]}}}],["resolv",{"_index":1114,"t":{"87":{"position":[[1155,8]]},"383":{"position":[[2737,7]]},"454":{"position":[[1267,7]]},"464":{"position":[[620,7]]},"482":{"position":[[616,7]]}}}],["resourc",{"_index":1947,"t":{"208":{"position":[[1753,10]]}}}],["resp",{"_index":3439,"t":{"646":{"position":[[1771,4],[2368,4]]},"648":{"position":[[1938,4],[2244,5]]},"651":{"position":[[754,4],[987,5]]}}}],["resp.body.vers",{"_index":3441,"t":{"646":{"position":[[2000,22]]}}}],["respect",{"_index":990,"t":{"67":{"position":[[2365,10]]},"69":{"position":[[433,7]]},"81":{"position":[[2648,10]]},"85":{"position":[[2137,10]]},"91":{"position":[[2367,10]]},"99":{"position":[[2427,10]]},"103":{"position":[[2048,10]]},"107":{"position":[[2254,10]]},"114":{"position":[[3362,10]]},"121":{"position":[[2661,10]]},"144":{"position":[[2239,10]]},"164":{"position":[[2261,10]]},"168":{"position":[[2539,10]]},"200":{"position":[[2743,10]]},"206":{"position":[[2160,10]]},"208":{"position":[[1688,13],[5768,10]]},"212":{"position":[[1992,10]]},"218":{"position":[[2187,10]]},"232":{"position":[[2246,10]]},"236":{"position":[[2679,10]]},"238":{"position":[[2794,10]]},"257":{"position":[[2325,10]]},"261":{"position":[[2749,10]]},"265":{"position":[[2577,10]]},"269":{"position":[[2346,10]]},"273":{"position":[[2163,10]]},"277":{"position":[[2135,10]]},"281":{"position":[[2120,10]]},"289":{"position":[[2399,10]]},"295":{"position":[[2657,10]]},"301":{"position":[[2688,10]]},"303":{"position":[[5335,10]]},"305":{"position":[[2285,10]]},"317":{"position":[[2258,10]]},"321":{"position":[[1990,10]]},"329":{"position":[[2109,10]]},"333":{"position":[[2141,10]]},"341":{"position":[[3890,10]]},"345":{"position":[[2386,10]]},"381":{"position":[[82,12]]},"393":{"position":[[1999,10]]}}}],["respond",{"_index":2847,"t":{"452":{"position":[[209,7],[366,7]]}}}],["respons",{"_index":662,"t":{"40":{"position":[[475,8]]},"87":{"position":[[617,11]]},"128":{"position":[[251,8]]},"142":{"position":[[511,8]]},"164":{"position":[[357,8]]},"190":{"position":[[403,8]]},"646":{"position":[[1894,8]]}}}],["rest",{"_index":2253,"t":{"303":{"position":[[1217,4]]}}}],["restart",{"_index":88,"t":{"9":{"position":[[312,7]]},"23":{"position":[[424,9],[1009,8]]},"25":{"position":[[67,8]]},"55":{"position":[[3172,7]]},"61":{"position":[[396,7]]},"150":{"position":[[1498,8]]},"154":{"position":[[1664,8]]},"162":{"position":[[831,7]]},"319":{"position":[[480,7]]},"331":{"position":[[544,8],[864,8]]},"343":{"position":[[4233,7],[4675,10]]},"383":{"position":[[180,10],[1611,7]]},"403":{"position":[[1064,8]]},"454":{"position":[[1241,7]]},"478":{"position":[[1080,8]]},"516":{"position":[[413,7]]},"528":{"position":[[508,8]]},"530":{"position":[[2367,7],[2964,7]]},"557":{"position":[[2144,8]]}}}],["restart=no",{"_index":3029,"t":{"503":{"position":[[395,10]]}}}],["restrict",{"_index":659,"t":{"40":{"position":[[372,8]]},"46":{"position":[[156,10]]},"162":{"position":[[889,12]]},"275":{"position":[[1399,10]]},"313":{"position":[[706,8]]},"343":{"position":[[4826,11]]},"530":{"position":[[2874,8]]},"544":{"position":[[890,10]]},"546":{"position":[[287,10]]}}}],["result",{"_index":353,"t":{"19":{"position":[[904,9]]},"23":{"position":[[438,7],[623,7]]},"29":{"position":[[1996,9]]},"172":{"position":[[2052,9],[3311,7]]},"174":{"position":[[747,6]]},"177":{"position":[[367,9]]},"359":{"position":[[51,9],[1130,6]]},"361":{"position":[[451,6]]},"363":{"position":[[1492,6]]},"368":{"position":[[137,8]]},"383":{"position":[[624,6]]},"460":{"position":[[443,6]]},"544":{"position":[[1494,7]]},"548":{"position":[[398,7]]},"559":{"position":[[188,6],[318,7]]},"561":{"position":[[4790,9],[5612,9],[6241,7],[7055,7]]},"568":{"position":[[2266,9]]},"573":{"position":[[117,7]]},"575":{"position":[[1399,8]]},"581":{"position":[[88,9]]}}}],["retart",{"_index":1106,"t":{"87":{"position":[[718,9]]}}}],["retent",{"_index":528,"t":{"29":{"position":[[1084,9],[1347,9],[3106,12],[3327,12],[3470,9],[4935,12],[5084,12]]}}}],["retention_compact_aft",{"_index":553,"t":{"29":{"position":[[2508,23]]}}}],["retention_compact_after=3",{"_index":560,"t":{"29":{"position":[[2881,25]]}}}],["retention_compact_completed_aft",{"_index":554,"t":{"29":{"position":[[2563,33]]}}}],["retention_compact_completed_after=30",{"_index":561,"t":{"29":{"position":[[2968,36]]}}}],["retention_compact_duped_aft",{"_index":557,"t":{"29":{"position":[[2705,29]]}}}],["retention_compact_failed_aft",{"_index":555,"t":{"29":{"position":[[2637,30]]}}}],["retention_delete_aft",{"_index":582,"t":{"29":{"position":[[4434,22]]}}}],["retention_delete_after=3",{"_index":586,"t":{"29":{"position":[[4738,24]]}}}],["retention_delete_completed_aft",{"_index":583,"t":{"29":{"position":[[4488,32]]}}}],["retention_delete_duped_aft",{"_index":585,"t":{"29":{"position":[[4626,28]]}}}],["retention_delete_failed_aft",{"_index":584,"t":{"29":{"position":[[4560,29]]}}}],["retentiond_delete_completed_after=30",{"_index":587,"t":{"29":{"position":[[4824,36]]}}}],["retri",{"_index":75,"t":{"9":{"position":[[112,7],[207,8],[253,7]]},"38":{"position":[[116,5]]},"87":{"position":[[696,8]]},"596":{"position":[[1144,6]]}}}],["retries/restart",{"_index":1111,"t":{"87":{"position":[[1047,16]]}}}],["retriev",{"_index":541,"t":{"29":{"position":[[1726,9]]},"65":{"position":[[2600,9]]},"79":{"position":[[2775,9]]},"158":{"position":[[170,8],[257,8]]},"164":{"position":[[335,9]]},"345":{"position":[[560,9]]},"454":{"position":[[1182,8]]}}}],["retrymultipli",{"_index":286,"t":{"15":{"position":[[4761,18],[4831,18]]}}}],["return",{"_index":647,"t":{"40":{"position":[[120,7],[328,6],[484,7],[622,6]]},"91":{"position":[[592,8]]},"99":{"position":[[580,8]]},"128":{"position":[[241,7]]},"142":{"position":[[641,8]]},"162":{"position":[[917,6]]},"198":{"position":[[859,7]]},"236":{"position":[[648,8]]},"261":{"position":[[636,8]]},"315":{"position":[[857,9]]},"383":{"position":[[459,6],[484,6],[525,6],[560,6],[2586,7],[2903,6],[3274,7]]},"464":{"position":[[322,6]]},"561":{"position":[[1171,7],[1349,9],[7044,6]]},"564":{"position":[[11,8]]},"575":{"position":[[563,7],[1212,6],[1378,6]]},"581":{"position":[[22,9]]},"635":{"position":[[260,7],[523,7]]},"644":{"position":[[73,8],[109,6],[755,6]]},"646":{"position":[[717,6],[1381,6],[1823,6],[1850,8],[1907,6],[1971,6],[2473,6],[2518,8]]},"648":{"position":[[521,8],[734,7],[1098,8],[2449,6],[2750,6],[2833,6],[2964,6]]},"651":{"position":[[908,8],[993,6]]},"653":{"position":[[429,8],[702,6],[2182,8],[2943,8]]}}}],["reveal",{"_index":2996,"t":{"490":{"position":[[104,6]]},"492":{"position":[[116,7]]}}}],["revers",{"_index":1325,"t":{"128":{"position":[[522,7]]},"140":{"position":[[220,7]]},"230":{"position":[[647,7]]},"255":{"position":[[652,7]]},"303":{"position":[[2721,7]]},"323":{"position":[[738,7]]},"391":{"position":[[466,7]]}}}],["review",{"_index":3107,"t":{"542":{"position":[[178,6]]},"633":{"position":[[229,6]]}}}],["rewrit",{"_index":3268,"t":{"596":{"position":[[1364,7]]}}}],["rich",{"_index":701,"t":{"44":{"position":[[66,4]]},"46":{"position":[[86,4]]},"48":{"position":[[74,4]]},"50":{"position":[[66,4],[210,4]]},"55":{"position":[[99,4]]},"69":{"position":[[66,4],[684,4]]},"75":{"position":[[1225,4]]},"77":{"position":[[210,4]]},"109":{"position":[[1868,4]]},"596":{"position":[[2491,4]]}}}],["right",{"_index":1063,"t":{"83":{"position":[[342,5]]},"101":{"position":[[367,5]]},"158":{"position":[[774,5]]},"190":{"position":[[500,5]]},"196":{"position":[[909,5]]},"538":{"position":[[434,5],[2125,5]]},"544":{"position":[[1383,6]]},"548":{"position":[[287,6]]},"561":{"position":[[6690,5]]},"653":{"position":[[71,5]]}}}],["righteou",{"_index":1671,"t":{"172":{"position":[[1499,9],[1605,9]]}}}],["risk",{"_index":1021,"t":{"72":{"position":[[305,5],[556,4]]},"156":{"position":[[219,5]]},"303":{"position":[[4924,4],[4995,4]]},"575":{"position":[[1961,5]]}}}],["rm",{"_index":2275,"t":{"303":{"position":[[3897,2]]}}}],["roam",{"_index":2237,"t":{"301":{"position":[[2373,6],[3801,6]]}}}],["robin",{"_index":1676,"t":{"172":{"position":[[1558,5],[1653,5]]},"551":{"position":[[541,5]]}}}],["robust",{"_index":2868,"t":{"460":{"position":[[22,6]]}}}],["rock",{"_index":2726,"t":{"395":{"position":[[820,4],[939,4]]},"561":{"position":[[4573,4],[4635,4],[4906,4],[5522,4]]},"575":{"position":[[723,4],[906,4]]}}}],["rockski",{"_index":18,"t":{"4":{"position":[[80,7]]},"109":{"position":[[52,7],[69,7],[86,7],[1326,8],[1658,7]]},"111":{"position":[[43,8],[166,7]]},"114":{"position":[[584,8],[729,7],[1431,7],[1542,7],[1749,7],[1957,7],[2298,7],[2379,7],[2605,7],[2939,7],[3340,7],[3533,7],[4053,7],[4380,7],[4565,9]]},"125":{"position":[[763,7]]},"291":{"position":[[26,8],[44,7],[61,7],[171,7],[285,7],[315,7]]},"293":{"position":[[37,7]]},"295":{"position":[[8,7],[571,7],[785,7],[993,7],[1334,7],[1415,7],[1606,7],[1746,7],[1808,7],[1900,7],[2234,7],[2635,7],[2828,7],[3348,7],[3675,7],[3860,9]]},"579":{"position":[[340,8]]},"588":{"position":[[191,8]]},"596":{"position":[[406,7],[653,7]]}}}],["rocksky'",{"_index":1207,"t":{"109":{"position":[[1165,9],[1223,9],[1733,9]]},"114":{"position":[[491,9]]}}}],["rocksky.app",{"_index":1226,"t":{"111":{"position":[[64,11]]}}}],["rocksky_en",{"_index":1248,"t":{"114":{"position":[[1310,14]]}}}],["rocksky_handl",{"_index":1251,"t":{"114":{"position":[[1567,14]]}}}],["rocksky_id",{"_index":1246,"t":{"114":{"position":[[1179,10],[1264,10]]}}}],["rocksky_key",{"_index":1243,"t":{"114":{"position":[[837,11],[1369,11]]}}}],["rocksky_nam",{"_index":1247,"t":{"114":{"position":[[1235,12]]}}}],["rocksky_token",{"_index":1249,"t":{"114":{"position":[[1456,13]]}}}],["rollup",{"_index":2976,"t":{"482":{"position":[[1314,6],[1480,6],[1581,7],[1670,9]]}}}],["rollup/wasm",{"_index":2980,"t":{"482":{"position":[[1534,12]]}}}],["romanian",{"_index":2899,"t":{"470":{"position":[[1889,8]]}}}],["root",{"_index":2800,"t":{"442":{"position":[[279,5]]}}}],["roughli",{"_index":1697,"t":{"172":{"position":[[3348,7]]}}}],["round",{"_index":3139,"t":{"551":{"position":[[535,5]]}}}],["rout",{"_index":2078,"t":{"248":{"position":[[590,5]]},"448":{"position":[[1104,6]]}}}],["router",{"_index":2839,"t":{"448":{"position":[[2328,6]]}}}],["row",{"_index":1522,"t":{"158":{"position":[[709,3]]},"198":{"position":[[644,4]]},"470":{"position":[[2961,4]]}}}],["rule",{"_index":423,"t":{"23":{"position":[[459,5],[591,5]]},"359":{"position":[[1054,5],[1102,5]]},"361":{"position":[[240,6]]},"363":{"position":[[26,5],[147,5],[1387,4]]},"399":{"position":[[5,4],[390,4]]},"403":{"position":[[247,5]]},"414":{"position":[[87,6],[124,5]]},"418":{"position":[[5,4]]},"421":{"position":[[165,4]]},"555":{"position":[[238,4]]},"557":{"position":[[1138,5]]},"579":{"position":[[4,5]]},"588":{"position":[[235,5]]}}}],["run",{"_index":162,"t":{"15":{"position":[[383,4],[1056,10],[1129,3]]},"21":{"position":[[390,7]]},"27":{"position":[[78,3]]},"36":{"position":[[158,4]]},"55":{"position":[[35,7],[627,4],[2844,7],[3320,7],[4106,8],[4115,3],[4512,8],[4521,3],[6203,7],[8083,7],[9694,7],[9711,3],[9890,7]]},"61":{"position":[[68,7]]},"69":{"position":[[235,8]]},"72":{"position":[[776,3],[849,3]]},"93":{"position":[[177,3]]},"105":{"position":[[252,3]]},"166":{"position":[[882,7],[1051,7],[1214,7],[1304,3],[3349,7]]},"230":{"position":[[801,8]]},"255":{"position":[[806,8]]},"263":{"position":[[351,3]]},"275":{"position":[[102,3],[498,7],[715,7],[825,3]]},"303":{"position":[[2506,3],[2688,7],[3076,3],[3485,4],[3817,4],[3891,3],[4541,3]]},"361":{"position":[[147,7],[695,3],[734,4],[1016,3],[1060,3],[1299,3],[1319,3]]},"363":{"position":[[103,4],[1241,3],[1424,3]]},"375":{"position":[[83,7],[383,7],[428,3]]},"377":{"position":[[253,7],[407,3]]},"389":{"position":[[0,3],[185,7],[298,7]]},"421":{"position":[[125,3],[176,3]]},"440":{"position":[[199,3]]},"444":{"position":[[73,3],[106,3]]},"448":{"position":[[1689,7],[2216,7]]},"450":{"position":[[316,7]]},"452":{"position":[[1034,3]]},"464":{"position":[[476,3],[533,4]]},"476":{"position":[[1725,7],[2048,3]]},"480":{"position":[[66,3]]},"482":{"position":[[271,3],[295,3],[309,3],[2304,3]]},"501":{"position":[[177,4]]},"503":{"position":[[385,3]]},"505":{"position":[[19,4],[241,3]]},"512":{"position":[[78,3]]},"524":{"position":[[306,7],[392,7],[758,7],[785,7]]},"526":{"position":[[31,7]]},"540":{"position":[[15,7],[287,8]]},"561":{"position":[[1119,3],[1242,3],[4425,7]]},"590":{"position":[[133,3],[767,3],[787,3]]},"623":{"position":[[311,3]]},"629":{"position":[[494,3]]},"635":{"position":[[290,7]]},"646":{"position":[[67,8]]}}}],["run/debug",{"_index":2638,"t":{"377":{"position":[[88,9]]}}}],["run/start",{"_index":2657,"t":{"383":{"position":[[759,9]]}}}],["run/user/1000",{"_index":796,"t":{"55":{"position":[[2297,14],[2424,14],[2471,14]]},"59":{"position":[[896,14],[1023,14],[1070,14]]}}}],["run/user/1000/discord",{"_index":844,"t":{"55":{"position":[[4362,22],[4424,22],[4768,22],[4830,22],[6586,22],[7887,22],[8462,22]]}}}],["run/user/uid/bus:/run/user/uid/bus:ro",{"_index":2138,"t":{"275":{"position":[[1236,38]]}}}],["run:exec",{"_index":2940,"t":{"476":{"position":[[2330,9]]}}}],["runtim",{"_index":3280,"t":{"610":{"position":[[53,7]]}}}],["rust",{"_index":890,"t":{"55":{"position":[[9061,4]]}}}],["rv:135.0",{"_index":1564,"t":{"164":{"position":[[504,9]]}}}],["rv:139.0",{"_index":2824,"t":{"448":{"position":[[563,9],[774,9]]}}}],["rvowkj1xtivmxglr",{"_index":634,"t":{"38":{"position":[[1274,19]]}}}],["rxbcaiyysxm",{"_index":2902,"t":{"470":{"position":[[1954,13]]}}}],["ryan",{"_index":1669,"t":{"172":{"position":[[1483,4],[1589,4]]}}}],["s",{"_index":1720,"t":{"172":{"position":[[4292,3],[4413,3]]},"421":{"position":[[259,7],[362,8]]},"425":{"position":[[65,16],[128,16]]}}}],["s)et",{"_index":2117,"t":{"271":{"position":[[179,10]]}}}],["s*(?<artist",{"_index":2359,"t":{"319":{"position":[[1782,21]]}}}],["safari",{"_index":1838,"t":{"196":{"position":[[1629,6],[1672,7],[1718,6]]}}}],["safari/firefox",{"_index":1801,"t":{"194":{"position":[[304,17]]}}}],["safe",{"_index":3048,"t":{"518":{"position":[[286,6]]}}}],["safeti",{"_index":2492,"t":{"343":{"position":[[4410,7]]},"512":{"position":[[484,7]]}}}],["salt",{"_index":2665,"t":{"383":{"position":[[1312,4]]}}}],["same",{"_index":116,"t":{"11":{"position":[[510,4]]},"15":{"position":[[1563,4],[2129,4],[2755,4],[3233,4],[6225,4]]},"23":{"position":[[569,4]]},"55":{"position":[[211,4],[639,4],[1255,4],[1318,4],[3440,4],[3861,4],[5446,4],[5471,4],[5974,4],[6725,4],[6832,4],[6857,4],[7531,4],[8601,4],[8700,4]]},"57":{"position":[[23,4],[86,4]]},"65":{"position":[[216,4]]},"75":{"position":[[1840,4]]},"79":{"position":[[307,4]]},"81":{"position":[[944,4]]},"87":{"position":[[1401,4]]},"89":{"position":[[162,4]]},"95":{"position":[[162,4]]},"147":{"position":[[333,4]]},"152":{"position":[[71,4]]},"160":{"position":[[76,4]]},"172":{"position":[[405,4],[432,4],[456,4],[483,4],[507,4],[534,4],[4630,9]]},"174":{"position":[[99,4],[494,4],[578,4],[698,4],[814,4],[832,4]]},"177":{"position":[[248,4]]},"184":{"position":[[252,4]]},"190":{"position":[[1181,4]]},"198":{"position":[[614,4]]},"204":{"position":[[525,4]]},"210":{"position":[[1848,4],[2084,4]]},"216":{"position":[[533,4]]},"220":{"position":[[307,4]]},"222":{"position":[[196,4],[546,4],[750,4],[808,4],[967,4],[1506,4],[1659,4],[1773,4],[2403,4]]},"224":{"position":[[211,4]]},"228":{"position":[[189,4]]},"230":{"position":[[773,4]]},"234":{"position":[[316,4]]},"242":{"position":[[196,4],[537,4],[733,4],[791,4],[952,4],[1487,4],[1640,4],[1758,4],[2389,4]]},"246":{"position":[[146,4]]},"248":{"position":[[140,5]]},"255":{"position":[[778,4]]},"259":{"position":[[201,4]]},"271":{"position":[[280,4]]},"275":{"position":[[562,4],[864,4]]},"303":{"position":[[3139,4],[3520,4],[3729,4]]},"319":{"position":[[921,4]]},"343":{"position":[[1308,4],[2346,4],[3283,4],[3499,5]]},"353":{"position":[[778,4]]},"357":{"position":[[1038,4]]},"359":{"position":[[1071,4]]},"361":{"position":[[645,4]]},"448":{"position":[[1730,4],[1783,4],[1975,4]]},"450":{"position":[[125,4],[331,4]]},"462":{"position":[[176,4]]},"464":{"position":[[192,4]]},"488":{"position":[[75,4]]},"512":{"position":[[271,4]]},"526":{"position":[[235,4],[489,4]]},"540":{"position":[[139,4]]},"557":{"position":[[510,5]]},"561":{"position":[[2700,4]]},"568":{"position":[[1814,4]]},"621":{"position":[[1212,4]]},"625":{"position":[[538,4],[1004,4],[1232,4]]},"631":{"position":[[732,4]]}}}],["sampl",{"_index":2947,"t":{"478":{"position":[[405,6]]}}}],["satisfi",{"_index":2557,"t":{"359":{"position":[[352,9]]},"399":{"position":[[303,9]]},"555":{"position":[[673,9]]}}}],["savag",{"_index":1682,"t":{"172":{"position":[[1711,7],[1768,7]]}}}],["save",{"_index":446,"t":{"25":{"position":[[105,6]]},"118":{"position":[[329,4]]},"253":{"position":[[368,4]]},"303":{"position":[[5195,4]]},"319":{"position":[[437,4]]},"343":{"position":[[2076,5],[2479,4],[4695,5]]},"492":{"position":[[411,4]]},"505":{"position":[[0,4]]},"526":{"position":[[222,5]]}}}],["scagg",{"_index":2772,"t":{"427":{"position":[[81,7]]}}}],["scale",{"_index":574,"t":{"29":{"position":[[3834,5]]}}}],["scan",{"_index":3032,"t":{"505":{"position":[[153,4]]}}}],["scenario",{"_index":349,"t":{"19":{"position":[[745,8]]},"25":{"position":[[317,10]]},"29":{"position":[[502,10]]},"46":{"position":[[270,9]]},"65":{"position":[[614,9]]},"79":{"position":[[755,9]]},"147":{"position":[[422,9]]},"174":{"position":[[859,8],[1064,8]]},"177":{"position":[[8,8]]},"179":{"position":[[8,9]]},"184":{"position":[[19,8]]},"188":{"position":[[160,8]]},"190":{"position":[[599,9]]},"222":{"position":[[0,8],[31,9],[2178,8],[3040,8],[3120,9]]},"228":{"position":[[470,8],[580,8]]},"242":{"position":[[0,8],[31,9],[2159,8],[2992,8],[3074,9]]},"244":{"position":[[8,9]]},"248":{"position":[[238,8],[348,8]]},"275":{"position":[[892,8]]},"303":{"position":[[3205,8]]},"347":{"position":[[725,8]]},"361":{"position":[[864,9]]},"410":{"position":[[7,8]]},"412":{"position":[[223,10]]},"431":{"position":[[397,10]]},"460":{"position":[[246,8]]},"478":{"position":[[84,9]]},"542":{"position":[[300,9]]},"568":{"position":[[1409,8]]},"653":{"position":[[15,9]]}}}],["scene",{"_index":1820,"t":{"196":{"position":[[814,7]]}}}],["schema",{"_index":265,"t":{"15":{"position":[[4343,6]]},"38":{"position":[[669,6],[1024,6],[1424,6]]}}}],["schulz",{"_index":1677,"t":{"172":{"position":[[1564,7],[1659,6]]}}}],["schvitz",{"_index":2901,"t":{"470":{"position":[[1916,7]]}}}],["scopes/permissions/gr",{"_index":2493,"t":{"343":{"position":[[4442,25]]}}}],["score",{"_index":37,"t":{"7":{"position":[[267,6],[547,7]]},"172":{"position":[[1090,5],[3334,5],[3401,5],[3673,6],[3687,5],[3763,7],[4163,5],[4699,5],[4754,7],[4949,8]]},"544":{"position":[[89,5]]},"557":{"position":[[820,7]]},"561":{"position":[[6634,5]]},"564":{"position":[[54,5],[120,5],[160,5],[219,8],[247,5]]},"568":{"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]]},"573":{"position":[[147,6]]},"577":{"position":[[260,6]]}}}],["scrape",{"_index":2862,"t":{"454":{"position":[[609,8]]},"470":{"position":[[170,7],[517,11]]}}}],["scrape_config",{"_index":686,"t":{"42":{"position":[[604,15]]}}}],["scrape_configssect",{"_index":685,"t":{"42":{"position":[[571,21]]}}}],["scrape_interv",{"_index":689,"t":{"42":{"position":[[682,16]]}}}],["screen",{"_index":980,"t":{"67":{"position":[[1804,6],[3168,6]]},"81":{"position":[[2045,6],[3451,6]]},"85":{"position":[[1540,6],[2936,6]]},"91":{"position":[[1709,6],[3168,6]]},"99":{"position":[[1811,6],[3230,6]]},"103":{"position":[[1482,6],[2849,6]]},"107":{"position":[[1624,6],[3067,6]]},"114":{"position":[[2736,6],[4165,6]]},"121":{"position":[[2095,6],[3462,6]]},"144":{"position":[[1626,6],[3046,6]]},"164":{"position":[[1635,6],[3062,6]]},"168":{"position":[[1980,6],[3348,6]]},"200":{"position":[[1867,6],[3552,6]]},"206":{"position":[[1600,6],[2957,6]]},"208":{"position":[[4755,6],[6573,6]]},"212":{"position":[[1475,6],[2795,6]]},"218":{"position":[[1644,6],[2988,6]]},"232":{"position":[[1743,6],[3057,6]]},"236":{"position":[[2021,6],[3480,6]]},"238":{"position":[[2197,6],[3593,6]]},"253":{"position":[[178,7]]},"257":{"position":[[1812,6],[3134,6]]},"261":{"position":[[2133,6],[3552,6]]},"265":{"position":[[1947,6],[3390,6]]},"269":{"position":[[1780,6],[3147,6]]},"273":{"position":[[1605,6],[2970,6]]},"277":{"position":[[1602,6],[2934,6]]},"281":{"position":[[1560,6],[2915,6]]},"289":{"position":[[1839,6],[3200,6]]},"295":{"position":[[2031,6],[3460,6]]},"301":{"position":[[2073,6],[3487,6]]},"305":{"position":[[1626,6],[3088,6]]},"317":{"position":[[1609,6],[3063,6]]},"321":{"position":[[1479,6],[2785,6]]},"329":{"position":[[1569,6],[2922,6]]},"333":{"position":[[1583,6],[2946,6]]},"341":{"position":[[3266,6],[4691,6]]},"343":{"position":[[1907,6],[4347,6]]},"345":{"position":[[1721,6],[3189,6]]},"393":{"position":[[1486,6],[2806,6]]}}}],["screenshot",{"_index":2118,"t":{"271":{"position":[[314,10]]}}}],["script",{"_index":2787,"t":{"440":{"position":[[19,6]]}}}],["scrobbabl",{"_index":1327,"t":{"128":{"position":[[622,11]]},"134":{"position":[[1148,10],[1530,10],[1596,10]]}}}],["scrobbel",{"_index":2992,"t":{"488":{"position":[[6,10]]}}}],["scrobber",{"_index":1239,"t":{"114":{"position":[[477,8]]}}}],["scrobbl",{"_index":7,"t":{"2":{"position":[[99,12]]},"7":{"position":[[17,9],[58,9],[126,10],[172,9],[283,9],[588,8],[662,9],[690,8]]},"9":{"position":[[41,8],[81,8],[220,8],[286,9],[345,8]]},"11":{"position":[[81,8],[549,8],[747,8]]},"15":{"position":[[595,10],[661,8],[1694,8]]},"17":{"position":[[108,8],[166,8]]},"23":{"position":[[287,8],[489,8],[705,10],[795,8]]},"29":{"position":[[193,8],[260,8],[3676,8],[3862,9],[3919,9],[4045,9]]},"38":{"position":[[154,8],[170,8]]},"42":{"position":[[192,9]]},"65":{"position":[[2740,8],[2875,8],[3039,8]]},"79":{"position":[[2915,8],[3050,8],[3214,8]]},"83":{"position":[[29,8],[1025,8]]},"85":{"position":[[397,8],[452,8]]},"87":{"position":[[30,8],[119,9],[233,9],[267,9],[493,9],[590,9],[651,9],[930,8],[1018,9]]},"93":{"position":[[30,8]]},"105":{"position":[[30,8],[117,9]]},"107":{"position":[[442,8],[494,8]]},"109":{"position":[[29,8],[1074,11],[1302,8],[1513,9],[1637,10],[1696,8],[1767,9],[1919,8],[1992,8],[2065,8],[2101,8],[2178,9],[2224,8],[2250,8]]},"116":{"position":[[29,8],[147,9],[1072,11],[1296,8],[1507,9],[1764,8],[1972,9],[2074,9]]},"125":{"position":[[16,8],[47,8]]},"128":{"position":[[314,10],[961,9],[1002,8],[1085,11],[1138,8],[1192,9],[1284,9]]},"132":{"position":[[37,8],[170,8],[387,8]]},"134":{"position":[[361,10],[521,11],[885,10],[1000,8],[1035,8],[1342,8]]},"136":{"position":[[567,10],[750,8],[798,8]]},"138":{"position":[[0,10],[153,8],[197,9]]},"150":{"position":[[90,8],[138,8],[246,8],[304,8],[367,8]]},"152":{"position":[[240,8],[317,8],[433,8]]},"154":{"position":[[163,9],[248,8],[311,8],[419,8],[512,8],[541,8]]},"160":{"position":[[635,10]]},"166":{"position":[[125,8],[706,11],[1573,10]]},"168":{"position":[[427,8],[549,8],[669,8],[787,8]]},"170":{"position":[[94,10],[150,10]]},"172":{"position":[[82,9],[160,8],[1995,8],[2062,8],[2180,9],[2295,9],[2333,9],[2854,8],[3058,8],[3140,8],[3436,8],[3866,8],[3987,8],[4045,9],[4102,9],[4304,9],[4826,10],[5143,9]]},"174":{"position":[[158,9],[626,9],[801,9],[916,9],[1078,9]]},"177":{"position":[[98,10],[197,9],[281,9],[342,9],[390,10],[413,8],[471,8],[507,8]]},"179":{"position":[[85,9],[131,9],[217,8],[255,8],[291,8],[475,10],[597,8]]},"184":{"position":[[59,8],[157,9],[441,9]]},"186":{"position":[[44,8],[81,8],[168,8],[203,9],[268,8],[349,8],[432,9]]},"188":{"position":[[99,8],[325,9]]},"190":{"position":[[39,8],[124,8],[247,9],[382,8],[613,8],[820,8],[1004,9],[1122,9],[1147,8],[1310,8]]},"192":{"position":[[93,9]]},"198":{"position":[[378,8],[1277,9],[1618,9],[2054,8],[2542,8]]},"208":{"position":[[573,8],[708,8],[765,8],[1044,8],[1119,9],[2506,9],[2751,8],[2820,8],[2879,8],[2964,8],[3088,8],[3212,8],[3323,8],[3652,9]]},"210":{"position":[[61,11],[684,10],[718,9],[1364,10],[1472,8],[1568,8]]},"220":{"position":[[46,9],[127,8],[192,8],[540,10],[673,8]]},"222":{"position":[[87,12],[387,8],[641,8],[733,8],[781,9],[1071,8],[1166,8],[1196,8],[1838,8],[1933,8],[1963,8],[2972,8]]},"228":{"position":[[154,9]]},"230":{"position":[[476,8],[1059,8]]},"232":{"position":[[460,9]]},"234":{"position":[[34,8],[58,9],[118,8],[184,9]]},"238":{"position":[[39,8],[68,9],[133,8],[794,8],[856,8]]},"240":{"position":[[46,9],[147,9],[265,9],[355,8],[430,8]]},"242":{"position":[[87,12],[373,8],[626,8],[716,8],[764,9],[1050,8],[1143,8],[1173,8],[1823,8],[1916,8],[1946,8],[2924,8]]},"244":{"position":[[103,8],[205,8],[266,9],[378,11]]},"248":{"position":[[91,9],[670,9]]},"253":{"position":[[412,8]]},"255":{"position":[[476,8],[1070,8]]},"257":{"position":[[453,9]]},"259":{"position":[[35,8],[59,9],[119,8]]},"263":{"position":[[46,8],[75,9],[140,8],[216,9]]},"265":{"position":[[484,8],[543,8]]},"267":{"position":[[14,8]]},"275":{"position":[[267,8]]},"277":{"position":[[339,8],[447,8]]},"283":{"position":[[165,8]]},"285":{"position":[[38,10],[419,10]]},"287":{"position":[[264,8],[422,9],[534,8]]},"289":{"position":[[440,8],[550,8],[746,11]]},"291":{"position":[[14,8],[179,9],[213,9],[293,9]]},"293":{"position":[[108,8]]},"297":{"position":[[102,10],[212,10],[358,8],[453,10],[1098,8]]},"301":{"position":[[536,8],[642,8],[745,8],[888,8]]},"303":{"position":[[366,8]]},"307":{"position":[[156,8],[410,8],[676,9],[818,9],[948,9],[1028,9],[1323,9],[1406,8]]},"311":{"position":[[195,9],[324,9]]},"313":{"position":[[370,10],[507,8],[715,10]]},"315":{"position":[[800,9]]},"327":{"position":[[29,9],[46,9]]},"329":{"position":[[323,10],[403,10]]},"335":{"position":[[14,8],[126,9],[258,9],[292,9],[372,9]]},"337":{"position":[[108,8]]},"341":{"position":[[81,9],[575,9],[795,9],[1004,9],[1213,9]]},"343":{"position":[[216,8],[345,10]]},"347":{"position":[[55,8],[302,8],[708,9],[884,11]]},"349":{"position":[[38,8],[457,9],[482,8],[635,9],[746,9],[783,8],[817,8]]},"351":{"position":[[211,8]]},"353":{"position":[[221,8],[397,9],[445,10],[508,9],[530,9],[978,8]]},"385":{"position":[[112,11]]},"391":{"position":[[78,10],[219,8],[263,9]]},"395":{"position":[[710,8]]},"397":{"position":[[1135,8]]},"403":{"position":[[964,8]]},"460":{"position":[[39,8],[365,8],[463,10]]},"462":{"position":[[243,9]]},"470":{"position":[[99,9],[361,9],[709,9],[895,9],[1215,8],[1250,8],[3103,9],[3164,9]]},"492":{"position":[[183,9]]},"526":{"position":[[398,10]]},"530":{"position":[[1387,10],[1498,10],[1571,10],[1640,8],[2465,10],[2883,10],[3149,10],[3195,10],[3287,8]]},"532":{"position":[[155,9]]},"538":{"position":[[32,10],[64,8]]},"540":{"position":[[343,8]]},"542":{"position":[[463,8],[574,9]]},"544":{"position":[[524,9]]},"555":{"position":[[795,8]]},"557":{"position":[[900,8],[2004,8]]},"559":{"position":[[281,8]]},"561":{"position":[[63,8],[1849,8],[2098,8],[2438,9],[2776,8],[3309,8],[3637,8],[4331,8],[5984,8]]},"568":{"position":[[1161,9],[1287,9],[1422,8],[2238,8]]},"575":{"position":[[33,8],[244,8],[430,8],[554,8],[1303,8],[1417,9],[1495,10],[1661,10],[1725,8],[1820,8]]},"581":{"position":[[107,8],[238,8]]},"588":{"position":[[24,8],[122,8],[161,8],[788,8]]},"592":{"position":[[168,8]]},"594":{"position":[[76,8]]},"596":{"position":[[81,9],[561,10],[685,8],[897,8],[964,11],[1124,9],[1495,9],[1868,8],[2123,8],[2213,10],[2238,8],[2408,9],[2458,9],[2523,8],[2669,9],[2753,8]]},"598":{"position":[[202,10]]},"600":{"position":[[412,8],[452,9]]},"602":{"position":[[99,12]]},"623":{"position":[[73,8],[145,9],[373,10],[503,9],[677,9],[798,8],[873,10],[931,9],[1470,9]]},"625":{"position":[[299,8],[325,8]]},"629":{"position":[[459,9],[505,8]]},"635":{"position":[[938,8]]},"648":{"position":[[355,10],[914,9],[1486,9],[2732,9],[2954,9]]},"651":{"position":[[27,8]]},"653":{"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]]}}}],["scrobblabl",{"_index":1107,"t":{"87":{"position":[[813,11]]},"349":{"position":[[162,12]]}}}],["scrobble'",{"_index":46,"t":{"7":{"position":[[419,10]]},"544":{"position":[[252,10]]},"559":{"position":[[160,10]]}}}],["scrobble.cach",{"_index":3298,"t":{"623":{"position":[[573,15]]}}}],["scrobble/play",{"_index":2542,"t":{"353":{"position":[[593,13]]}}}],["scrobblecli",{"_index":3493,"t":{"653":{"position":[[3309,15]]}}}],["scrobbler",{"_index":70,"t":{"9":{"position":[[9,9]]},"11":{"position":[[6,9],[229,9]]},"15":{"position":[[810,10],[841,9]]},"19":{"position":[[44,9],[275,9],[925,9],[1377,9],[1820,10],[1925,10]]},"23":{"position":[[6,9],[1457,10]]},"25":{"position":[[345,9],[462,9],[517,9],[608,10],[752,10],[942,9],[1071,10]]},"27":{"position":[[6,9],[133,9]]},"29":{"position":[[1745,10],[2131,9],[3548,9],[3759,9],[3950,9],[4146,9]]},"38":{"position":[[699,9],[1052,9],[1455,9]]},"42":{"position":[[672,9]]},"44":{"position":[[5,9],[133,10]]},"50":{"position":[[5,9],[133,10]]},"53":{"position":[[264,9]]},"55":{"position":[[120,9],[659,9],[1370,9],[1766,9],[1841,10],[5260,10],[5355,10]]},"59":{"position":[[365,9],[440,10]]},"65":{"position":[[6,9],[170,9],[3616,9]]},"69":{"position":[[5,9],[133,10],[354,9],[962,9],[989,9],[1190,10],[1241,9]]},"72":{"position":[[277,9]]},"77":{"position":[[411,9]]},"79":{"position":[[6,9],[261,9],[3824,9]]},"83":{"position":[[597,9],[827,9]]},"87":{"position":[[167,9],[473,9],[890,9]]},"89":{"position":[[70,9],[217,9],[273,9]]},"95":{"position":[[70,9],[217,9],[273,9]]},"105":{"position":[[165,9]]},"109":{"position":[[1024,9],[1064,9]]},"114":{"position":[[27,9],[359,9],[1041,10]]},"116":{"position":[[1022,9],[1062,9],[2059,10]]},"118":{"position":[[11,9]]},"121":{"position":[[39,9],[505,9]]},"128":{"position":[[33,9],[395,10],[448,9],[895,9],[1234,9]]},"132":{"position":[[515,9]]},"134":{"position":[[315,9],[754,9]]},"136":{"position":[[145,9],[252,9]]},"138":{"position":[[187,9]]},"140":{"position":[[1218,9]]},"142":{"position":[[49,9],[983,9]]},"147":{"position":[[60,9],[227,9]]},"150":{"position":[[31,10],[514,10],[545,9],[577,9]]},"154":{"position":[[647,10],[678,9],[710,9]]},"158":{"position":[[84,9]]},"162":{"position":[[6,9],[119,9],[845,9]]},"166":{"position":[[88,9],[896,9],[1421,9]]},"172":{"position":[[6,9],[1170,9],[2761,9],[3491,10],[4774,9],[5264,9]]},"174":{"position":[[314,9],[459,9]]},"177":{"position":[[130,10],[223,9],[332,9],[433,10]]},"186":{"position":[[9,10]]},"190":{"position":[[681,9],[709,10],[877,9],[1429,9]]},"192":{"position":[[192,9]]},"194":{"position":[[547,9]]},"196":{"position":[[31,9]]},"198":{"position":[[105,9],[925,9],[1101,10],[2100,9]]},"202":{"position":[[19,9]]},"204":{"position":[[256,9],[689,9]]},"208":{"position":[[67,9],[275,9],[553,9],[745,9],[1024,9]]},"210":{"position":[[293,9],[501,9],[1432,9],[2179,9]]},"214":{"position":[[19,9]]},"216":{"position":[[260,9],[697,9]]},"220":{"position":[[26,9]]},"222":{"position":[[109,9],[405,10],[659,10],[1089,10],[1856,10],[2990,10]]},"224":{"position":[[62,9],[115,9]]},"226":{"position":[[252,9]]},"230":{"position":[[628,9]]},"234":{"position":[[232,9]]},"236":{"position":[[1697,9]]},"238":{"position":[[1876,9]]},"240":{"position":[[26,9],[244,9]]},"242":{"position":[[109,9],[391,10],[644,10],[1068,10],[1841,10],[2942,10]]},"244":{"position":[[121,10],[231,9]]},"253":{"position":[[124,9],[154,9]]},"255":{"position":[[633,9]]},"261":{"position":[[1806,9]]},"263":{"position":[[264,9]]},"265":{"position":[[1605,9]]},"269":{"position":[[1456,9]]},"275":{"position":[[224,9],[411,9],[485,9],[702,9],[837,9]]},"279":{"position":[[201,9]]},"283":{"position":[[151,9],[613,9],[998,9]]},"285":{"position":[[168,9],[404,9]]},"287":{"position":[[152,9],[243,9],[511,9]]},"295":{"position":[[1704,9]]},"297":{"position":[[6,9],[637,9],[1689,9],[1812,9]]},"301":{"position":[[82,9]]},"303":{"position":[[491,10],[2179,9],[2489,10],[2702,9],[2857,9],[2960,9],[3086,10],[3295,9],[3467,9],[3683,9],[3989,9],[4093,9],[4368,9],[4634,9],[5159,9],[5403,10]]},"307":{"position":[[127,9],[1386,9]]},"311":{"position":[[156,9],[459,9]]},"315":{"position":[[6,9],[635,9]]},"319":{"position":[[1084,9],[1209,9],[2052,9],[2154,9]]},"323":{"position":[[566,9]]},"331":{"position":[[258,10],[289,9],[321,9],[1427,9]]},"341":{"position":[[2942,9]]},"343":{"position":[[4951,9]]},"347":{"position":[[6,9],[902,9]]},"349":{"position":[[56,10]]},"353":{"position":[[817,9]]},"373":{"position":[[6,9]]},"375":{"position":[[322,9]]},"391":{"position":[[253,9],[335,9]]},"399":{"position":[[421,9]]},"401":{"position":[[86,9]]},"403":{"position":[[622,10],[653,9],[685,9]]},"414":{"position":[[443,9]]},"442":{"position":[[682,9],[825,9],[881,9],[926,9]]},"448":{"position":[[55,9],[154,10],[185,9],[218,9],[1222,9],[1277,9],[1476,9],[1751,10],[1864,9],[2047,10],[2203,9]]},"450":{"position":[[172,9],[299,9]]},"454":{"position":[[27,9],[933,9],[1222,9]]},"460":{"position":[[6,9]]},"462":{"position":[[156,9]]},"464":{"position":[[283,10]]},"470":{"position":[[46,9],[295,9],[420,9],[558,9]]},"476":{"position":[[282,10],[560,10],[981,10],[1380,10],[1549,10],[2258,10],[2289,9],[2564,10],[2595,9]]},"478":{"position":[[487,10],[518,9],[550,9]]},"480":{"position":[[53,9]]},"482":{"position":[[197,9],[1013,9],[1042,9],[1081,9],[1115,9],[1163,9],[1217,9]]},"495":{"position":[[95,10]]},"497":{"position":[[35,10]]},"499":{"position":[[128,9]]},"503":{"position":[[36,9],[266,9]]},"505":{"position":[[196,9]]},"507":{"position":[[57,9]]},"510":{"position":[[22,9]]},"512":{"position":[[6,9]]},"516":{"position":[[427,10]]},"518":{"position":[[6,9]]},"524":{"position":[[29,9],[135,9]]},"526":{"position":[[50,9],[287,9],[388,9],[459,9]]},"528":{"position":[[30,9],[151,10],[182,9],[214,9]]},"530":{"position":[[45,9],[1142,10],[1268,9],[1658,9],[1785,9],[2033,9],[2978,9],[3307,9],[3920,10],[4055,9]]},"532":{"position":[[6,9]]},"538":{"position":[[49,9],[685,9],[989,9],[1633,9],[2356,9]]},"540":{"position":[[34,9],[270,9]]},"542":{"position":[[243,9]]},"544":{"position":[[121,9],[1544,9]]},"551":{"position":[[520,9],[664,9]]},"557":{"position":[[1519,10],[1550,9],[1582,9]]},"561":{"position":[[930,9],[1755,9],[1914,9],[2158,9],[3187,9],[3395,9],[3694,9]]},"581":{"position":[[46,9]]},"596":{"position":[[1440,9],[1761,10],[1810,9],[2575,9]]},"621":{"position":[[149,10],[970,9]]},"629":{"position":[[256,10]]},"648":{"position":[[3084,10]]}}}],["scrobbler'",{"_index":1628,"t":{"170":{"position":[[6,11]]},"172":{"position":[[4893,11]]},"275":{"position":[[1708,11]]},"303":{"position":[[3397,11]]},"331":{"position":[[1223,12]]},"347":{"position":[[189,11]]},"397":{"position":[[162,11]]},"540":{"position":[[612,11]]}}}],["scrobbler.app",{"_index":611,"t":{"36":{"position":[[131,13]]},"303":{"position":[[2547,13]]}}}],["scrobbler.app/callback",{"_index":2286,"t":{"303":{"position":[[5102,22]]}}}],["scrobbler.git",{"_index":2635,"t":{"375":{"position":[[297,13]]},"482":{"position":[[174,13]]},"520":{"position":[[289,13]]}}}],["scrobbler.mydomain.com/callback",{"_index":3070,"t":{"530":{"position":[[1059,31]]}}}],["scrobbler.servic",{"_index":3022,"t":{"503":{"position":[[137,17],[222,18]]},"505":{"position":[[78,17],[125,17]]}}}],["scrobbler/directori",{"_index":3027,"t":{"503":{"position":[[351,19]]}}}],["scrobbler/discord",{"_index":820,"t":{"55":{"position":[[2822,17]]},"61":{"position":[[46,17]]}}}],["scrobbler:latest",{"_index":782,"t":{"55":{"position":[[1872,16]]},"59":{"position":[[471,16]]},"474":{"position":[[162,16],[216,16]]}}}],["scrobbler\\config",{"_index":2973,"t":{"482":{"position":[[1253,16]]}}}],["scrobbler\\data",{"_index":2975,"t":{"482":{"position":[[1299,14]]}}}],["scrobblesourc",{"_index":3381,"t":{"642":{"position":[[396,15]]}}}],["scrobblesources.t",{"_index":3377,"t":{"642":{"position":[[198,18]]}}}],["scrobblethreshold",{"_index":278,"t":{"15":{"position":[[4659,21]]},"134":{"position":[[1487,21]]}}}],["scroll",{"_index":1836,"t":{"196":{"position":[[1490,6]]}}}],["search",{"_index":375,"t":{"19":{"position":[[1844,6]]},"72":{"position":[[1053,6]]},"154":{"position":[[943,8]]},"355":{"position":[[190,6]]},"412":{"position":[[20,6]]},"414":{"position":[[38,6]]},"416":{"position":[[2,6],[453,9],[659,9]]},"418":{"position":[[30,6],[328,9]]},"421":{"position":[[54,6],[135,6],[249,9]]},"427":{"position":[[41,9]]},"429":{"position":[[39,9]]},"431":{"position":[[82,6],[697,9]]},"497":{"position":[[46,6]]},"532":{"position":[[669,8]]},"534":{"position":[[402,8]]},"557":{"position":[[606,9],[764,6],[1641,8]]},"559":{"position":[[239,9]]},"561":{"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]]},"564":{"position":[[97,6]]},"573":{"position":[[1039,6],[1077,6]]},"575":{"position":[[92,6],[981,6],[1365,8],[1927,6]]},"590":{"position":[[61,6]]},"592":{"position":[[120,8],[220,8],[373,6],[844,8],[890,8],[1128,6]]},"596":{"position":[[704,6]]}}}],["searchartistmethod",{"_index":1500,"t":{"154":{"position":[[2229,21],[3428,21]]},"561":{"position":[[3855,19],[4010,21],[4055,18],[5092,21],[5881,21]]},"573":{"position":[[1136,21]]},"586":{"position":[[405,21]]},"590":{"position":[[502,21]]},"592":{"position":[[790,21]]},"594":{"position":[[801,21],[1380,21]]}}}],["searchord",{"_index":1484,"t":{"154":{"position":[[991,11],[2261,14],[3460,14]]},"311":{"position":[[1121,14],[1607,14]]},"555":{"position":[[1173,14]]},"557":{"position":[[487,11],[548,12],[571,11],[724,11],[785,11],[1689,11]]},"561":{"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]]},"573":{"position":[[1092,14]]},"586":{"position":[[436,14]]},"590":{"position":[[534,14]]},"592":{"position":[[899,14],[1135,14]]},"594":{"position":[[833,14],[1412,14]]}}}],["searchwhenmiss",{"_index":3159,"t":{"561":{"position":[[342,17]]}}}],["searchwithmiss",{"_index":3161,"t":{"561":{"position":[[632,20]]}}}],["second",{"_index":546,"t":{"29":{"position":[[2341,7],[4316,7]]},"134":{"position":[[1563,7]]},"172":{"position":[[2414,7],[2565,7],[2632,7],[2696,8],[3033,7]]},"198":{"position":[[323,7],[498,9]]},"644":{"position":[[843,7]]},"646":{"position":[[1416,6]]},"648":{"position":[[2141,7]]}}}],["secondari",{"_index":416,"t":{"23":{"position":[[193,9],[1189,9],[1403,9]]},"25":{"position":[[8,9],[412,9]]},"77":{"position":[[69,9]]},"368":{"position":[[312,9]]},"476":{"position":[[2405,9]]},"542":{"position":[[97,9]]},"566":{"position":[[836,9]]}}}],["secondgotifyserv",{"_index":625,"t":{"38":{"position":[[530,21]]}}}],["secret",{"_index":346,"t":{"19":{"position":[[614,9],[1069,9],[1623,8]]},"87":{"position":[[1491,6]]},"91":{"position":[[404,6],[2018,9],[3490,9]]},"93":{"position":[[257,6]]},"99":{"position":[[349,6],[408,6],[2100,9],[3531,9]]},"150":{"position":[[2228,9],[3249,9]]},"152":{"position":[[1244,9],[1430,9],[2507,9],[2711,9]]},"154":{"position":[[2902,9],[4105,9]]},"198":{"position":[[3001,9]]},"236":{"position":[[446,6],[2330,9],[3802,9]]},"261":{"position":[[384,6],[450,6],[2422,9],[3853,9]]},"303":{"position":[[5303,7]]},"305":{"position":[[404,6]]},"343":{"position":[[2509,7],[2929,7]]},"345":{"position":[[524,6]]},"450":{"position":[[24,7]]},"530":{"position":[[3559,6]]},"532":{"position":[[1881,9]]},"536":{"position":[[1019,9]]}}}],["section",{"_index":217,"t":{"15":{"position":[[2178,7],[6196,7]]},"17":{"position":[[270,7]]},"55":{"position":[[3699,8]]},"72":{"position":[[520,7]]},"87":{"position":[[1452,8]]},"97":{"position":[[144,7]]},"114":{"position":[[672,7],[875,7]]},"162":{"position":[[613,8],[690,7]]},"172":{"position":[[5304,8]]},"196":{"position":[[1525,8],[2234,7]]},"204":{"position":[[469,7]]},"216":{"position":[[464,7]]},"222":{"position":[[3160,7]]},"242":{"position":[[3114,7]]},"275":{"position":[[666,7]]},"303":{"position":[[5377,7]]},"311":{"position":[[501,7]]},"319":{"position":[[270,7]]},"343":{"position":[[3187,7],[3764,7]]},"370":{"position":[[13,8]]},"403":{"position":[[382,8]]},"437":{"position":[[57,7]]},"466":{"position":[[305,7],[422,7]]},"510":{"position":[[429,7]]},"530":{"position":[[252,7],[873,7],[1870,7],[2696,7],[3374,7],[3622,7]]},"532":{"position":[[468,7],[1049,7],[1192,7],[1334,7],[1472,7],[1666,7],[1729,7]]},"534":{"position":[[201,7]]},"536":{"position":[[187,7],[330,7],[472,7],[610,7],[804,7],[867,7]]},"538":{"position":[[933,7],[1577,7],[2300,7]]},"553":{"position":[[57,7]]},"557":{"position":[[1273,8]]},"559":{"position":[[34,7],[137,8]]},"623":{"position":[[115,8]]},"625":{"position":[[290,8]]},"651":{"position":[[957,7]]},"653":{"position":[[1885,7]]}}}],["secur",{"_index":601,"t":{"33":{"position":[[65,8]]},"46":{"position":[[461,7]]},"55":{"position":[[5560,7],[6946,7],[9205,7]]},"118":{"position":[[273,8]]},"275":{"position":[[808,6]]}}}],["see",{"_index":26,"t":{"7":{"position":[[93,3],[672,3]]},"15":{"position":[[1299,3],[1371,3],[3475,3],[3559,3]]},"17":{"position":[[0,3]]},"55":{"position":[[4394,3],[4800,3]]},"83":{"position":[[934,3]]},"118":{"position":[[78,3]]},"128":{"position":[[1302,4]]},"136":{"position":[[101,3]]},"160":{"position":[[646,3]]},"166":{"position":[[1647,4]]},"172":{"position":[[5290,3]]},"190":{"position":[[1106,3],[1135,4]]},"230":{"position":[[327,3],[407,3],[810,3],[946,3]]},"238":{"position":[[185,3]]},"255":{"position":[[327,3],[407,3],[815,3],[951,3]]},"267":{"position":[[68,3]]},"275":{"position":[[639,3]]},"285":{"position":[[201,3]]},"295":{"position":[[0,3]]},"297":{"position":[[847,3]]},"309":{"position":[[343,3]]},"339":{"position":[[0,3]]},"343":{"position":[[356,3],[403,3]]},"353":{"position":[[137,3],[375,3]]},"359":{"position":[[792,3]]},"370":{"position":[[0,3]]},"383":{"position":[[3255,3]]},"448":{"position":[[1136,3],[2439,3]]},"454":{"position":[[7,3]]},"457":{"position":[[7,3]]},"468":{"position":[[80,3]]},"472":{"position":[[70,3]]},"478":{"position":[[4,3],[382,3]]},"480":{"position":[[19,3]]},"482":{"position":[[1715,3]]},"484":{"position":[[115,3]]},"495":{"position":[[17,3]]},"497":{"position":[[88,3]]},"530":{"position":[[3333,3]]},"540":{"position":[[70,3],[410,3]]},"542":{"position":[[0,3],[310,3]]},"561":{"position":[[1359,3]]},"573":{"position":[[108,3]]},"581":{"position":[[425,3]]},"596":{"position":[[1651,3]]},"604":{"position":[[0,3]]},"606":{"position":[[0,3]]},"608":{"position":[[0,3]]},"623":{"position":[[730,3]]},"648":{"position":[[2867,3]]},"653":{"position":[[1466,3],[1872,3],[2352,3]]}}}],["seem",{"_index":2471,"t":{"343":{"position":[[1393,4]]}}}],["seen",{"_index":2219,"t":{"297":{"position":[[1774,4]]},"349":{"position":[[279,5],[409,4],[660,5],[833,4]]},"353":{"position":[[503,4]]},"470":{"position":[[1765,4]]},"648":{"position":[[2900,4]]},"653":{"position":[[480,4],[738,5],[778,5],[2072,4],[2925,4]]}}}],["select",{"_index":989,"t":{"67":{"position":[[2332,6]]},"81":{"position":[[2615,6]]},"85":{"position":[[2106,6]]},"91":{"position":[[2335,6]]},"99":{"position":[[2394,6]]},"103":{"position":[[2016,6]]},"107":{"position":[[2216,6]]},"114":{"position":[[3329,6]]},"121":{"position":[[2629,6]]},"144":{"position":[[2204,6]]},"158":{"position":[[682,6]]},"164":{"position":[[2229,6]]},"168":{"position":[[2503,6]]},"194":{"position":[[361,6]]},"200":{"position":[[2707,6]]},"206":{"position":[[2130,6]]},"208":{"position":[[5734,6]]},"212":{"position":[[1959,6]]},"218":{"position":[[2155,6]]},"232":{"position":[[2209,6]]},"236":{"position":[[2647,6]]},"238":{"position":[[2763,6]]},"257":{"position":[[2289,6]]},"261":{"position":[[2716,6]]},"265":{"position":[[2539,6]]},"269":{"position":[[2314,6]]},"273":{"position":[[2128,6]]},"277":{"position":[[2104,6]]},"281":{"position":[[2091,6]]},"289":{"position":[[2367,6]]},"295":{"position":[[2624,6]]},"301":{"position":[[2657,6]]},"305":{"position":[[2252,6]]},"317":{"position":[[2224,6]]},"319":{"position":[[203,6],[334,6]]},"321":{"position":[[1961,6]]},"329":{"position":[[2071,6]]},"333":{"position":[[2107,6]]},"341":{"position":[[3858,6]]},"343":{"position":[[4431,6],[4486,6],[4526,6]]},"345":{"position":[[2353,6]]},"393":{"position":[[1964,6]]},"532":{"position":[[682,7]]},"534":{"position":[[415,7]]},"557":{"position":[[68,9]]},"559":{"position":[[329,6]]},"566":{"position":[[210,8]]},"579":{"position":[[42,12]]}}}],["self",{"_index":745,"t":{"55":{"position":[[307,4]]},"109":{"position":[[766,4]]},"116":{"position":[[764,4]]},"303":{"position":[[4674,4]]},"355":{"position":[[57,4]]},"596":{"position":[[2828,4]]},"635":{"position":[[38,4]]}}}],["semver",{"_index":3044,"t":{"518":{"position":[[32,6]]},"522":{"position":[[334,6]]}}}],["send",{"_index":493,"t":{"29":{"position":[[252,5],[578,4]]},"109":{"position":[[1709,4]]},"128":{"position":[[376,4]]},"134":{"position":[[293,7],[506,5]]},"347":{"position":[[289,7]]},"353":{"position":[[210,7]]},"454":{"position":[[91,4]]},"575":{"position":[[1691,7]]},"598":{"position":[[193,5]]},"635":{"position":[[901,5],[1052,4]]}}}],["sensibl",{"_index":1482,"t":{"154":{"position":[[957,8],[1831,8],[3030,8]]},"557":{"position":[[909,8],[932,8],[1655,8]]},"559":{"position":[[75,8]]},"586":{"position":[[26,8]]},"588":{"position":[[483,8]]},"590":{"position":[[34,8]]},"592":{"position":[[322,9],[603,9]]},"594":{"position":[[648,8],[1227,8]]}}}],["sensit",{"_index":332,"t":{"19":{"position":[[155,9]]},"72":{"position":[[599,9]]}}}],["sent",{"_index":570,"t":{"29":{"position":[[3705,4]]},"87":{"position":[[676,4],[1038,4]]},"190":{"position":[[235,4]]},"303":{"position":[[4758,4],[4829,4]]},"333":{"position":[[458,4]]},"579":{"position":[[173,4]]},"653":{"position":[[3006,4]]}}}],["separ",{"_index":956,"t":{"67":{"position":[[342,9],[526,9]]},"81":{"position":[[499,9],[751,9]]},"109":{"position":[[746,10]]},"116":{"position":[[744,10]]},"172":{"position":[[1922,9]]},"220":{"position":[[405,10]]},"303":{"position":[[1514,8]]},"313":{"position":[[220,9]]},"470":{"position":[[1041,9]]},"476":{"position":[[347,8]]},"559":{"position":[[378,8]]},"575":{"position":[[796,9]]},"596":{"position":[[2362,9]]}}}],["seper",{"_index":1059,"t":{"81":{"position":[[858,9]]}}}],["sept",{"_index":2469,"t":{"343":{"position":[[1360,4]]}}}],["serv",{"_index":2626,"t":{"373":{"position":[[234,6]]},"478":{"position":[[124,7]]},"482":{"position":[[2340,6]]},"526":{"position":[[146,6]]}}}],["server",{"_index":231,"t":{"15":{"position":[[2607,8],[2810,8],[2965,8],[5922,8]]},"29":{"position":[[3960,7]]},"33":{"position":[[150,6]]},"38":{"position":[[53,7]]},"40":{"position":[[178,6]]},"83":{"position":[[106,6],[191,6]]},"85":{"position":[[344,6]]},"101":{"position":[[15,6],[518,6]]},"103":{"position":[[346,6],[394,6]]},"105":{"position":[[194,7],[278,6]]},"107":{"position":[[366,7]]},"109":{"position":[[335,8]]},"116":{"position":[[333,8]]},"138":{"position":[[232,6]]},"150":{"position":[[423,6]]},"152":{"position":[[377,7],[401,6],[516,6]]},"190":{"position":[[169,6]]},"206":{"position":[[372,6],[1776,8],[3148,8]]},"208":{"position":[[2689,6],[3460,6],[4935,8],[6764,8]]},"214":{"position":[[74,6]]},"218":{"position":[[386,6],[1824,8],[3181,8]]},"220":{"position":[[105,7]]},"238":{"position":[[153,7],[734,6]]},"240":{"position":[[110,7],[333,7]]},"244":{"position":[[362,6]]},"263":{"position":[[167,7],[293,7],[377,6]]},"265":{"position":[[401,7]]},"267":{"position":[[35,7]]},"269":{"position":[[381,6],[436,6]]},"271":{"position":[[74,6],[108,6],[193,6],[301,6],[352,6]]},"273":{"position":[[373,6]]},"281":{"position":[[351,6],[409,7]]},"283":{"position":[[27,6],[382,7]]},"289":{"position":[[385,6]]},"303":{"position":[[3836,6]]},"315":{"position":[[182,6],[835,7],[904,6]]},"317":{"position":[[367,6],[442,6],[500,6],[1810,8],[3275,8]]},"321":{"position":[[351,6],[409,6]]},"335":{"position":[[216,8]]},"373":{"position":[[146,6]]},"383":{"position":[[1846,6]]},"448":{"position":[[259,6],[892,6],[994,6],[1735,6]]},"452":{"position":[[351,6],[924,8]]},"538":{"position":[[198,6],[283,6],[1773,6]]},"551":{"position":[[377,7],[491,6],[621,6],[712,7],[765,8],[938,6],[986,6]]},"596":{"position":[[1010,6]]}}}],["server/channel/dm",{"_index":767,"t":{"55":{"position":[[1083,18]]}}}],["server/cli",{"_index":2329,"t":{"315":{"position":[[553,13]]}}}],["servers/mirror",{"_index":3138,"t":{"551":{"position":[[419,15]]}}}],["servic",{"_index":179,"t":{"15":{"position":[[794,9]]},"21":{"position":[[86,8]]},"23":{"position":[[680,8],[1441,9]]},"25":{"position":[[592,9],[736,9],[1055,9]]},"29":{"position":[[145,7]]},"36":{"position":[[56,8],[219,9],[375,8]]},"55":{"position":[[1353,7],[1446,7],[1825,9],[2073,7],[2889,8],[6018,7],[7575,7],[7818,9]]},"59":{"position":[[45,7],[424,9],[672,7]]},"61":{"position":[[113,8]]},"65":{"position":[[414,8],[1601,7],[1688,7],[1767,7],[1878,7],[2017,7],[2291,7]]},"72":{"position":[[252,8]]},"79":{"position":[[555,8],[1742,7],[1829,7],[1908,7],[2019,7],[2158,7],[2432,7]]},"87":{"position":[[526,7]]},"128":{"position":[[227,7],[479,8],[1147,8]]},"150":{"position":[[116,9],[498,9]]},"154":{"position":[[631,9]]},"190":{"position":[[1439,8]]},"202":{"position":[[141,8]]},"220":{"position":[[560,9]]},"222":{"position":[[173,7],[186,9],[211,9],[258,9],[303,7],[348,8],[499,7],[587,8],[623,7],[719,8],[904,7],[997,8],[1053,7],[1150,8],[1302,8],[1419,7],[1484,8],[1572,9],[1720,8],[1820,7],[1917,8],[2079,8],[2263,9],[2316,7],[2381,8],[2469,9],[2497,8],[2562,9],[2622,8],[2729,8],[2933,8],[3032,7],[3254,7]]},"230":{"position":[[18,7],[172,7],[316,7],[430,8],[458,8],[752,8],[790,7],[881,7],[905,7]]},"242":{"position":[[173,7],[186,9],[211,9],[253,9],[293,7],[338,8],[490,7],[572,8],[608,7],[702,8],[893,7],[976,8],[1032,7],[1127,8],[1279,8],[1400,7],[1465,8],[1553,9],[1700,8],[1805,7],[1900,8],[2062,8],[2244,9],[2302,7],[2367,8],[2455,9],[2483,8],[2547,9],[2602,8],[2695,8],[2889,8],[2984,7],[3208,7]]},"244":{"position":[[92,7]]},"246":{"position":[[252,7]]},"255":{"position":[[18,7],[172,7],[316,7],[430,8],[458,8],[757,8],[795,7],[886,7],[910,7]]},"297":{"position":[[232,9]]},"303":{"position":[[4954,7]]},"313":{"position":[[353,7],[490,7]]},"331":{"position":[[242,9]]},"335":{"position":[[114,7]]},"341":{"position":[[154,7],[251,7],[451,7],[542,8],[1248,9]]},"343":{"position":[[1435,8],[1869,9]]},"347":{"position":[[475,7]]},"349":{"position":[[792,7]]},"353":{"position":[[473,7]]},"383":{"position":[[1489,7],[2429,7],[2516,7]]},"385":{"position":[[605,7]]},"403":{"position":[[606,9]]},"448":{"position":[[296,9],[2411,7]]},"450":{"position":[[103,8]]},"452":{"position":[[121,7],[193,7],[316,7],[515,7],[673,8],[725,7],[756,7]]},"454":{"position":[[795,7]]},"476":{"position":[[266,9],[544,9],[965,9],[1364,9],[1533,9],[2242,9],[2379,7],[2519,9],[2548,9]]},"478":{"position":[[471,9]]},"501":{"position":[[22,7],[164,7]]},"503":{"position":[[13,7],[297,9]]},"505":{"position":[[166,8],[211,7],[230,7],[278,7]]},"507":{"position":[[77,7]]},"528":{"position":[[135,9]]},"538":{"position":[[12,8]]},"544":{"position":[[866,8],[1113,8]]},"546":{"position":[[263,8]]},"548":{"position":[[17,8]]},"557":{"position":[[1503,9]]},"573":{"position":[[367,9]]},"596":{"position":[[1847,7]]},"600":{"position":[[161,8]]},"621":{"position":[[133,9]]},"629":{"position":[[240,9]]},"633":{"position":[[174,7]]},"635":{"position":[[279,7],[1041,7]]},"648":{"position":[[446,8],[539,8],[1123,7],[1310,7]]},"651":{"position":[[83,7]]},"653":{"position":[[153,7],[499,7],[1076,7],[1272,7],[1355,8],[3325,7],[3716,7]]}}}],["service'",{"_index":2671,"t":{"383":{"position":[[1836,9]]},"452":{"position":[[972,9]]}}}],["service(",{"_index":2014,"t":{"222":{"position":[[68,10]]},"242":{"position":[[68,10]]},"460":{"position":[[285,10]]}}}],["service.md",{"_index":2957,"t":{"480":{"position":[[23,10]]}}}],["service/account",{"_index":1750,"t":{"174":{"position":[[104,15]]}}}],["service/appl",{"_index":1323,"t":{"128":{"position":[[147,20],[353,19]]}}}],["service/cov",{"_index":917,"t":{"65":{"position":[[1025,13]]},"79":{"position":[[1166,13]]}}}],["service/play",{"_index":2072,"t":{"240":{"position":[[126,14],[285,14]]}}}],["service/volum",{"_index":2956,"t":{"478":{"position":[[957,14]]}}}],["serviceallow",{"_index":2434,"t":{"341":{"position":[[0,12],[346,12],[967,15],[1406,15],[3585,15],[5023,15]]}}}],["servicedeni",{"_index":2435,"t":{"341":{"position":[[17,11],[378,11],[1176,14],[3613,14],[5051,14]]}}}],["services/mus",{"_index":3065,"t":{"530":{"position":[[16,14]]}}}],["session",{"_index":998,"t":{"69":{"position":[[531,8],[741,8],[1020,7],[1323,7]]},"75":{"position":[[49,8],[829,8]]},"81":{"position":[[322,8]]},"91":{"position":[[581,7]]},"99":{"position":[[569,7]]},"236":{"position":[[637,7]]},"261":{"position":[[625,7]]},"275":{"position":[[931,7]]},"343":{"position":[[882,7],[914,7],[1247,8]]},"454":{"position":[[855,7],[994,7],[1068,7]]}}}],["sessions/tokens/etc",{"_index":420,"t":{"23":{"position":[[342,22]]}}}],["set",{"_index":113,"t":{"11":{"position":[[441,3],[876,3]]},"15":{"position":[[3765,8],[4023,8],[4102,9],[4144,8]]},"19":{"position":[[754,3]]},"21":{"position":[[186,3],[352,3]]},"23":{"position":[[574,3]]},"27":{"position":[[484,3]]},"29":{"position":[[3979,3]]},"31":{"position":[[103,3],[408,3],[519,3]]},"38":{"position":[[729,7],[1082,7]]},"44":{"position":[[49,3]]},"46":{"position":[[82,3]]},"48":{"position":[[70,3]]},"50":{"position":[[49,3],[201,3]]},"55":{"position":[[95,3],[2234,3],[2869,3],[2954,3]]},"59":{"position":[[833,3]]},"61":{"position":[[93,3],[178,3]]},"65":{"position":[[1519,4],[1802,3],[1913,3],[1917,7],[2181,7]]},"69":{"position":[[49,3],[1607,3]]},"75":{"position":[[643,7],[1221,3]]},"79":{"position":[[1660,4],[1943,3],[2054,3],[2058,7],[2322,7]]},"83":{"position":[[220,8],[675,3],[1558,3],[1622,3]]},"87":{"position":[[1416,3]]},"89":{"position":[[599,8]]},"95":{"position":[[593,8]]},"101":{"position":[[248,3]]},"111":{"position":[[174,8]]},"118":{"position":[[249,8]]},"136":{"position":[[596,3],[728,3],[776,3]]},"138":{"position":[[328,8]]},"140":{"position":[[900,3],[1032,3],[1091,3],[1207,4],[1233,3],[1297,8],[1647,3]]},"142":{"position":[[1171,8]]},"162":{"position":[[553,4],[574,3]]},"166":{"position":[[2072,7],[2673,3]]},"196":{"position":[[1725,8]]},"198":{"position":[[1777,7]]},"202":{"position":[[129,8],[237,4]]},"204":{"position":[[33,3],[389,8],[754,4]]},"206":{"position":[[423,3],[494,3]]},"208":{"position":[[1129,3],[1276,7]]},"210":{"position":[[1000,3],[1130,3],[1189,3],[1338,4],[1525,3],[2054,3]]},"216":{"position":[[35,3],[395,8],[764,4]]},"218":{"position":[[479,3],[559,3]]},"222":{"position":[[3278,3],[3339,3]]},"224":{"position":[[5,7]]},"226":{"position":[[16,7]]},"228":{"position":[[245,7],[882,7]]},"236":{"position":[[1640,3]]},"238":{"position":[[1819,3]]},"240":{"position":[[208,3]]},"242":{"position":[[502,3],[3232,3],[3298,3]]},"246":{"position":[[306,3]]},"251":{"position":[[8,3]]},"253":{"position":[[68,8],[246,8]]},"261":{"position":[[1749,3]]},"265":{"position":[[1548,3]]},"269":{"position":[[1399,3]]},"271":{"position":[[115,3],[144,8]]},"273":{"position":[[422,3]]},"279":{"position":[[100,8]]},"281":{"position":[[420,3]]},"283":{"position":[[390,3],[1065,4]]},"295":{"position":[[1647,3]]},"303":{"position":[[1972,3],[1991,8],[2796,3],[3950,3]]},"307":{"position":[[559,8]]},"309":{"position":[[36,3]]},"315":{"position":[[1041,7]]},"319":{"position":[[153,8],[404,3],[685,7],[730,3]]},"325":{"position":[[372,3],[454,3]]},"341":{"position":[[2885,3]]},"343":{"position":[[1648,7],[3307,3],[3392,7]]},"357":{"position":[[1098,4],[1881,3]]},"375":{"position":[[352,4]]},"377":{"position":[[35,8]]},"381":{"position":[[371,8]]},"383":{"position":[[2044,3],[2156,3],[2258,3]]},"437":{"position":[[0,3]]},"440":{"position":[[518,8]]},"448":{"position":[[1489,7]]},"454":{"position":[[1197,3]]},"470":{"position":[[1615,3]]},"476":{"position":[[441,7],[1231,3],[1442,3],[2147,7]]},"482":{"position":[[230,3],[538,3],[728,4],[795,4],[869,3]]},"507":{"position":[[40,7]]},"530":{"position":[[187,7],[629,3],[2090,3]]},"538":{"position":[[312,8],[1206,3],[1270,3],[2006,3]]},"540":{"position":[[97,7],[367,3]]},"542":{"position":[[394,3]]},"544":{"position":[[1623,3]]},"551":{"position":[[135,3]]},"555":{"position":[[861,3]]},"561":{"position":[[1446,3],[4081,3]]},"564":{"position":[[116,3],[146,3]]},"566":{"position":[[1877,3]]},"568":{"position":[[1792,4]]},"598":{"position":[[4,3]]},"638":{"position":[[660,8]]},"651":{"position":[[221,3],[225,7]]},"653":{"position":[[641,7]]}}}],["set('author",{"_index":3443,"t":{"646":{"position":[[2420,21]]},"648":{"position":[[1995,21]]},"651":{"position":[[806,21]]}}}],["setup",{"_index":173,"t":{"15":{"position":[[636,5],[1735,5],[3730,5]]},"46":{"position":[[325,5]]},"55":{"position":[[597,5],[1226,5],[1232,5],[3260,6],[6010,5],[7285,5],[7567,5]]},"57":{"position":[[0,5]]},"61":{"position":[[484,6]]},"83":{"position":[[92,5]]},"101":{"position":[[0,5],[64,5]]},"114":{"position":[[666,5],[869,5]]},"154":{"position":[[870,5],[1758,5]]},"230":{"position":[[616,5]]},"238":{"position":[[234,6]]},"246":{"position":[[80,6]]},"255":{"position":[[621,5]]},"267":{"position":[[118,6]]},"271":{"position":[[81,6],[200,5],[308,5]]},"275":{"position":[[369,6],[589,5],[615,5]]},"293":{"position":[[11,5]]},"295":{"position":[[51,6]]},"315":{"position":[[1001,6]]},"331":{"position":[[1141,5]]},"337":{"position":[[11,5]]},"339":{"position":[[51,6]]},"343":{"position":[[5337,5]]},"460":{"position":[[147,5]]},"476":{"position":[[770,6]]},"501":{"position":[[139,5]]},"530":{"position":[[1621,5],[3123,6],[3360,5]]},"532":{"position":[[222,5],[1624,5]]},"536":{"position":[[762,5]]},"538":{"position":[[184,5],[1758,5],[1822,5]]},"542":{"position":[[91,5],[457,5]]},"544":{"position":[[1585,6]]},"571":{"position":[[11,5]]},"596":{"position":[[2287,5],[2762,5]]},"640":{"position":[[57,5]]}}}],["setup.sh",{"_index":2789,"t":{"440":{"position":[[251,10]]},"442":{"position":[[18,8]]},"444":{"position":[[51,9]]}}}],["sevenhtml",{"_index":1988,"t":{"210":{"position":[[2023,12]]}}}],["sever",{"_index":1036,"t":{"75":{"position":[[8,7]]},"206":{"position":[[454,5],[525,5]]},"343":{"position":[[1498,7]]},"357":{"position":[[1090,7]]},"524":{"position":[[55,7]]},"566":{"position":[[10,7]]}}}],["sh",{"_index":801,"t":{"55":{"position":[[2407,2]]},"59":{"position":[[1006,2]]}}}],["shape",{"_index":962,"t":{"67":{"position":[[873,6],[2249,6]]},"81":{"position":[[1114,6],[2532,6]]},"85":{"position":[[619,6],[2023,6]]},"91":{"position":[[783,6],[2252,6]]},"99":{"position":[[880,6],[2311,6]]},"103":{"position":[[556,6],[1933,6]]},"107":{"position":[[668,6],[2133,6]]},"114":{"position":[[1805,6],[3246,6]]},"121":{"position":[[1169,6],[2546,6]]},"144":{"position":[[685,6],[2121,6]]},"164":{"position":[[709,6],[2146,6]]},"168":{"position":[[1034,6],[2420,6]]},"198":{"position":[[1509,6]]},"200":{"position":[[921,6],[2624,6]]},"206":{"position":[[684,6],[2047,6]]},"208":{"position":[[3819,6],[5651,6]]},"212":{"position":[[544,6],[1876,6]]},"218":{"position":[[718,6],[2072,6]]},"232":{"position":[[792,6],[2126,6]]},"236":{"position":[[839,6],[2564,6]]},"238":{"position":[[1023,6],[2680,6]]},"257":{"position":[[866,6],[2206,6]]},"261":{"position":[[943,6],[2633,6]]},"265":{"position":[[717,6],[2456,6]]},"269":{"position":[[598,6],[2231,6]]},"273":{"position":[[664,6],[2045,6]]},"277":{"position":[[681,6],[2021,6]]},"281":{"position":[[649,6],[2008,6]]},"289":{"position":[[913,6],[2284,6]]},"295":{"position":[[841,6],[2541,6]]},"301":{"position":[[1152,6],[2574,6]]},"305":{"position":[[695,6],[2169,6]]},"317":{"position":[[673,6],[2141,6]]},"321":{"position":[[568,6],[1878,6]]},"329":{"position":[[613,6],[1988,6]]},"333":{"position":[[647,6],[2024,6]]},"341":{"position":[[2084,6],[3775,6]]},"345":{"position":[[790,6],[2270,6]]},"381":{"position":[[66,6]]},"383":{"position":[[928,5]]},"393":{"position":[[545,6],[1881,6]]}}}],["share",{"_index":1195,"t":{"109":{"position":[[506,5]]},"116":{"position":[[504,5]]},"150":{"position":[[266,6]]},"214":{"position":[[198,5]]},"379":{"position":[[81,6],[423,5]]}}}],["shm_size",{"_index":791,"t":{"55":{"position":[[2204,9]]},"59":{"position":[[803,9]]}}}],["short",{"_index":2618,"t":{"368":{"position":[[217,5]]},"524":{"position":[[525,5]]}}}],["shortcod",{"_index":1388,"t":{"142":{"position":[[142,9],[277,9],[472,9],[698,9],[781,12]]}}}],["shortcut",{"_index":592,"t":{"31":{"position":[[141,8]]}}}],["shorter",{"_index":1983,"t":{"210":{"position":[[1531,7]]},"303":{"position":[[224,7]]}}}],["show",{"_index":972,"t":{"67":{"position":[[1317,4],[2808,4]]},"79":{"position":[[4142,4]]},"81":{"position":[[1558,4],[3091,4]]},"85":{"position":[[1061,4],[2578,4]]},"91":{"position":[[1226,4],[2809,4]]},"99":{"position":[[1324,4],[2870,4]]},"103":{"position":[[999,4],[2490,4]]},"107":{"position":[[1117,4],[2702,4]]},"114":{"position":[[2249,4],[3805,4]]},"121":{"position":[[1612,4],[3103,4]]},"144":{"position":[[1131,4],[2684,4]]},"164":{"position":[[1152,4],[2703,4]]},"168":{"position":[[1481,4],[2985,4]]},"196":{"position":[[1783,5],[1915,4]]},"198":{"position":[[602,7]]},"200":{"position":[[1368,4],[3189,4]]},"206":{"position":[[1125,4],[2600,4]]},"208":{"position":[[4264,4],[6212,4]]},"212":{"position":[[988,4],[2435,4]]},"218":{"position":[[1161,4],[2629,4]]},"232":{"position":[[1240,4],[2693,4]]},"236":{"position":[[1282,4],[3121,4]]},"238":{"position":[[1465,4],[3235,4]]},"253":{"position":[[232,4]]},"257":{"position":[[1313,4],[2771,4]]},"261":{"position":[[1387,4],[3192,4]]},"265":{"position":[[1166,4],[3025,4]]},"269":{"position":[[1041,4],[2788,4]]},"273":{"position":[[1110,4],[2608,4]]},"275":{"position":[[146,5]]},"277":{"position":[[1123,4],[2576,4]]},"281":{"position":[[1089,4],[2559,4]]},"289":{"position":[[1356,4],[2841,4]]},"295":{"position":[[1285,4],[3100,4]]},"301":{"position":[[1594,4],[3129,4]]},"305":{"position":[[1139,4],[2728,4]]},"317":{"position":[[1118,4],[2702,4]]},"319":{"position":[[148,4]]},"321":{"position":[[1008,4],[2429,4]]},"329":{"position":[[1062,4],[2557,4]]},"333":{"position":[[1092,4],[2585,4]]},"341":{"position":[[2527,4],[4332,4]]},"345":{"position":[[1234,4],[2829,4]]},"365":{"position":[[491,5]]},"393":{"position":[[991,4],[2444,4]]},"540":{"position":[[461,4],[600,5]]},"623":{"position":[[43,5]]}}}],["shown",{"_index":733,"t":{"53":{"position":[[217,5]]},"65":{"position":[[246,5],[3450,5]]},"67":{"position":[[1079,5],[1727,5],[1855,6],[2571,5],[3091,5],[3219,6]]},"75":{"position":[[1433,5]]},"77":{"position":[[364,5]]},"79":{"position":[[337,5],[3658,5]]},"81":{"position":[[1320,5],[1968,5],[2096,6],[2854,5],[3374,5],[3502,6]]},"85":{"position":[[823,5],[1463,5],[1591,6],[2341,5],[2859,5],[2987,6]]},"91":{"position":[[988,5],[1632,5],[1760,6],[2572,5],[3091,5],[3219,6]]},"99":{"position":[[1086,5],[1734,5],[1862,6],[2633,5],[3153,5],[3281,6]]},"103":{"position":[[761,5],[1405,5],[1533,6],[2253,5],[2772,5],[2900,6]]},"107":{"position":[[879,5],[1547,5],[1675,6],[2465,5],[2990,5],[3118,6]]},"114":{"position":[[2011,5],[2659,5],[2787,6],[3568,5],[4088,5],[4216,6]]},"118":{"position":[[363,5]]},"121":{"position":[[1374,5],[2018,5],[2146,6],[2866,5],[3385,5],[3513,6]]},"144":{"position":[[893,5],[1549,5],[1677,6],[2447,5],[2969,5],[3097,6]]},"158":{"position":[[532,5]]},"164":{"position":[[914,5],[1558,5],[1686,6],[2466,5],[2985,5],[3113,6]]},"168":{"position":[[1243,5],[1903,5],[2031,6],[2748,5],[3271,5],[3399,6]]},"196":{"position":[[2781,5]]},"200":{"position":[[1130,5],[1790,5],[1918,6],[2952,5],[3475,5],[3603,6]]},"206":{"position":[[887,5],[1523,5],[1651,6],[2363,5],[2880,5],[3008,6]]},"208":{"position":[[4026,5],[4678,5],[4806,6],[5975,5],[6496,5],[6624,6]]},"210":{"position":[[1860,5]]},"212":{"position":[[750,5],[1398,5],[1526,6],[2198,5],[2718,5],[2846,6]]},"218":{"position":[[923,5],[1567,5],[1695,6],[2392,5],[2911,5],[3039,6]]},"232":{"position":[[1002,5],[1666,5],[1794,6],[2456,5],[2980,5],[3108,6]]},"234":{"position":[[370,5]]},"236":{"position":[[1044,5],[1944,5],[2072,6],[2884,5],[3403,5],[3531,6]]},"238":{"position":[[1227,5],[2120,5],[2248,6],[2998,5],[3516,5],[3644,6]]},"257":{"position":[[1075,5],[1735,5],[1863,6],[2534,5],[3057,5],[3185,6]]},"259":{"position":[[255,5]]},"261":{"position":[[1149,5],[2056,5],[2184,6],[2955,5],[3475,5],[3603,6]]},"265":{"position":[[928,5],[1870,5],[1998,6],[2788,5],[3313,5],[3441,6]]},"269":{"position":[[803,5],[1703,5],[1831,6],[2551,5],[3070,5],[3198,6]]},"271":{"position":[[288,5]]},"273":{"position":[[872,5],[1528,5],[1656,6],[2371,5],[2893,5],[3021,6]]},"277":{"position":[[885,5],[1525,5],[1653,6],[2339,5],[2857,5],[2985,6]]},"281":{"position":[[851,5],[1483,5],[1611,6],[2322,5],[2838,5],[2966,6]]},"289":{"position":[[1118,5],[1762,5],[1890,6],[2604,5],[3123,5],[3251,6]]},"295":{"position":[[1047,5],[1954,5],[2082,6],[2863,5],[3383,5],[3511,6]]},"301":{"position":[[1356,5],[1996,5],[2124,6],[2892,5],[3410,5],[3538,6]]},"305":{"position":[[527,5],[901,5],[1549,5],[1677,6],[2491,5],[3011,5],[3139,6]]},"317":{"position":[[880,5],[1532,5],[1660,6],[2465,5],[2986,5],[3114,6]]},"319":{"position":[[313,5]]},"321":{"position":[[770,5],[1402,5],[1530,6],[2192,5],[2708,5],[2836,6]]},"329":{"position":[[824,5],[1492,5],[1620,6],[2320,5],[2845,5],[2973,6]]},"333":{"position":[[854,5],[1506,5],[1634,6],[2348,5],[2869,5],[2997,6]]},"341":{"position":[[2289,5],[3189,5],[3317,6],[4095,5],[4614,5],[4742,6]]},"345":{"position":[[996,5],[1644,5],[1772,6],[2592,5],[3112,5],[3240,6]]},"393":{"position":[[753,5],[1409,5],[1537,6],[2207,5],[2729,5],[2857,6]]},"401":{"position":[[140,5]]},"403":{"position":[[26,5]]},"488":{"position":[[37,5]]},"524":{"position":[[496,5]]},"557":{"position":[[26,5]]},"586":{"position":[[17,5]]},"621":{"position":[[1056,5]]},"631":{"position":[[693,5],[753,5]]}}}],["side",{"_index":1787,"t":{"190":{"position":[[176,5]]},"196":{"position":[[1998,4]]},"470":{"position":[[453,4]]}}}],["side(",{"_index":2546,"t":{"353":{"position":[[1183,7]]}}}],["sidebar",{"_index":1521,"t":{"158":{"position":[[670,7]]},"194":{"position":[[349,7]]},"196":{"position":[[2202,8]]},"370":{"position":[[58,9]]}}}],["sign",{"_index":1227,"t":{"111":{"position":[[80,4]]},"343":{"position":[[5098,4]]}}}],["signal",{"_index":1012,"t":{"69":{"position":[[1084,7],[1281,7]]},"75":{"position":[[16,7]]},"648":{"position":[[2915,10]]}}}],["silo",{"_index":3276,"t":{"596":{"position":[[2315,4]]}}}],["similar",{"_index":40,"t":{"7":{"position":[[320,10]]},"172":{"position":[[60,10],[601,10],[717,7],[1100,10],[2868,7]]},"303":{"position":[[4401,7]]},"470":{"position":[[1712,7]]},"557":{"position":[[877,10]]},"568":{"position":[[1120,7],[1736,7],[2213,7],[2844,10]]},"592":{"position":[[1192,10]]}}}],["similarli",{"_index":3041,"t":{"512":{"position":[[369,9]]}}}],["similiar",{"_index":3234,"t":{"568":{"position":[[2509,11],[2572,11],[2636,11]]}}}],["simpl",{"_index":172,"t":{"15":{"position":[[629,6]]},"53":{"position":[[92,7]]},"77":{"position":[[137,7]]},"109":{"position":[[807,6]]},"116":{"position":[[805,6]]},"174":{"position":[[301,6]]},"303":{"position":[[3824,6]]},"319":{"position":[[167,6]]},"377":{"position":[[291,6]]},"460":{"position":[[140,6]]}}}],["simpler",{"_index":752,"t":{"55":{"position":[[611,7]]}}}],["simpli",{"_index":1807,"t":{"194":{"position":[[608,6]]},"198":{"position":[[652,6]]},"275":{"position":[[909,6]]},"653":{"position":[[591,6]]}}}],["simplifi",{"_index":3300,"t":{"625":{"position":[[25,10],[497,11],[567,11],[967,11],[1033,11]]},"653":{"position":[[2550,10]]}}}],["simultan",{"_index":2206,"t":{"297":{"position":[[113,13]]}}}],["singl",{"_index":1496,"t":{"154":{"position":[[2177,9],[3376,9]]},"172":{"position":[[1239,6]]},"196":{"position":[[3824,6]]},"198":{"position":[[1909,6],[1946,8]]},"210":{"position":[[224,6]]},"355":{"position":[[311,6]]},"395":{"position":[[201,6]]},"566":{"position":[[310,8],[803,7]]},"568":{"position":[[965,8],[1040,9]]},"573":{"position":[[483,7],[544,9],[896,7],[957,9]]},"586":{"position":[[354,9]]},"590":{"position":[[451,9]]},"594":{"position":[[750,9],[1329,9]]},"596":{"position":[[939,6]]},"642":{"position":[[933,9]]}}}],["single_user_platform_id",{"_index":3456,"t":{"648":{"position":[[1608,23],[2345,24]]}}}],["site",{"_index":982,"t":{"67":{"position":[[1878,4],[3242,4]]},"81":{"position":[[2119,4],[3525,4]]},"85":{"position":[[1614,4],[3010,4]]},"91":{"position":[[1783,4],[3242,4]]},"99":{"position":[[1885,4],[3304,4]]},"103":{"position":[[1556,4],[2923,4]]},"107":{"position":[[1698,4],[3141,4]]},"114":{"position":[[2810,4],[4239,4]]},"121":{"position":[[2169,4],[3536,4]]},"144":{"position":[[1700,4],[3120,4]]},"164":{"position":[[1709,4],[3136,4]]},"168":{"position":[[2054,4],[3422,4]]},"200":{"position":[[1941,4],[3626,4]]},"206":{"position":[[1674,4],[3031,4]]},"208":{"position":[[4829,4],[6647,4]]},"212":{"position":[[1549,4],[2869,4]]},"218":{"position":[[1718,4],[3062,4]]},"232":{"position":[[1817,4],[3131,4]]},"236":{"position":[[2095,4],[3554,4]]},"238":{"position":[[2271,4],[3667,4]]},"257":{"position":[[1886,4],[3208,4]]},"261":{"position":[[2207,4],[3626,4]]},"265":{"position":[[2021,4],[3464,4]]},"269":{"position":[[1854,4],[3221,4]]},"273":{"position":[[1679,4],[3044,4]]},"277":{"position":[[1676,4],[3008,4]]},"281":{"position":[[1634,4],[2989,4]]},"289":{"position":[[1913,4],[3274,4]]},"295":{"position":[[2105,4],[3534,4]]},"301":{"position":[[2147,4],[3561,4]]},"303":{"position":[[4783,4],[5014,4]]},"305":{"position":[[1700,4],[3162,4]]},"317":{"position":[[1683,4],[3137,4]]},"321":{"position":[[1553,4],[2859,4]]},"329":{"position":[[1643,4],[2996,4]]},"333":{"position":[[1657,4],[3020,4]]},"341":{"position":[[3340,4],[4765,4]]},"345":{"position":[[1795,4],[3263,4]]},"393":{"position":[[1560,4],[2880,4]]},"454":{"position":[[626,4]]},"457":{"position":[[378,4]]}}}],["situat",{"_index":1810,"t":{"196":{"position":[[205,10]]}}}],["size",{"_index":503,"t":{"29":{"position":[[481,4],[655,4],[820,4],[1044,4]]},"368":{"position":[[203,4],[352,4]]}}}],["skagg",{"_index":2771,"t":{"427":{"position":[[56,8]]}}}],["skip",{"_index":754,"t":{"55":{"position":[[698,4]]},"361":{"position":[[578,4]]},"363":{"position":[[466,7]]},"421":{"position":[[155,4]]},"544":{"position":[[1592,4]]},"561":{"position":[[242,8]]},"631":{"position":[[661,8]]},"653":{"position":[[3789,4]]}}}],["slash",{"_index":2773,"t":{"431":{"position":[[264,5],[440,5],[540,5]]}}}],["slice.wisp.plac",{"_index":1265,"t":{"116":{"position":[[1836,16]]}}}],["slick",{"_index":3324,"t":{"635":{"position":[[111,5]]}}}],["slight",{"_index":2871,"t":{"464":{"position":[[211,6]]}}}],["slightli",{"_index":2545,"t":{"353":{"position":[[1083,8]]}}}],["slug",{"_index":2024,"t":{"222":{"position":[[2913,6],[3243,5]]},"228":{"position":[[502,4],[700,6],[848,6],[892,4],[950,5]]},"230":{"position":[[142,5]]},"232":{"position":[[1976,7],[3298,7]]},"242":{"position":[[2869,6],[3197,5]]},"248":{"position":[[270,4],[458,6],[472,4],[573,4]]},"255":{"position":[[142,5]]},"325":{"position":[[80,4],[244,7],[328,7],[616,4]]},"329":{"position":[[1796,7],[3156,7]]},"448":{"position":[[840,4]]}}}],["small",{"_index":2617,"t":{"368":{"position":[[191,5]]}}}],["smart",{"_index":1686,"t":{"172":{"position":[[1815,7]]},"596":{"position":[[1151,5]]}}}],["smarttub",{"_index":1605,"t":{"166":{"position":[[2428,13],[3015,13]]}}}],["sn6yasw8g4",{"_index":1851,"t":{"196":{"position":[[3535,13]]},"200":{"position":[[2160,13],[3854,13]]}}}],["snapshot",{"_index":3272,"t":{"596":{"position":[[1642,8]]}}}],["socat",{"_index":867,"t":{"55":{"position":[[5871,5],[6060,5],[7291,5],[7320,5],[7353,5],[7428,5],[7617,5],[7699,5],[7723,5],[7828,6]]},"275":{"position":[[1442,5],[1600,5]]}}}],["social",{"_index":1191,"t":{"109":{"position":[[250,6]]},"116":{"position":[[109,6],[248,6]]},"184":{"position":[[209,6]]},"335":{"position":[[81,6]]}}}],["socket",{"_index":777,"t":{"55":{"position":[[1522,6],[1582,6],[1604,6],[4077,6],[4483,6],[5936,6],[6417,6],[7493,6],[7776,6],[8297,6]]},"59":{"position":[[121,6],[181,6],[203,6]]},"67":{"position":[[410,6]]},"166":{"position":[[1263,6]]},"275":{"position":[[659,6],[791,7],[949,6],[1067,7],[1287,7],[1508,6]]}}}],["softwar",{"_index":850,"t":{"55":{"position":[[4941,9]]}}}],["sole",{"_index":1577,"t":{"166":{"position":[[680,6]]},"210":{"position":[[419,6]]}}}],["solut",{"_index":1781,"t":{"188":{"position":[[26,9],[550,9]]},"452":{"position":[[1070,8]]},"542":{"position":[[604,9]]}}}],["solv",{"_index":3007,"t":{"497":{"position":[[153,7]]}}}],["some_ip",{"_index":2664,"t":{"383":{"position":[[1193,9]]}}}],["someguy",{"_index":2719,"t":{"395":{"position":[[629,8]]}}}],["someon",{"_index":1035,"t":{"72":{"position":[[910,7]]}}}],["someotherus",{"_index":1965,"t":{"208":{"position":[[5127,15],[6956,15]]}}}],["someth",{"_index":1539,"t":{"162":{"position":[[250,9]]},"343":{"position":[[2856,9]]},"448":{"position":[[327,9],[1261,9]]},"454":{"position":[[917,9]]},"457":{"position":[[11,9]]},"470":{"position":[[404,9]]},"588":{"position":[[468,9]]}}}],["sometim",{"_index":768,"t":{"55":{"position":[[1102,10]]},"470":{"position":[[1076,9]]},"566":{"position":[[1548,9]]}}}],["someus",{"_index":2299,"t":{"307":{"position":[[869,12],[903,8],[931,8],[1164,11],[1243,9]]}}}],["somewher",{"_index":1277,"t":{"118":{"position":[[337,10]]},"375":{"position":[[201,9]]},"482":{"position":[[22,9]]}}}],["song",{"_index":5,"t":{"2":{"position":[[77,5]]},"128":{"position":[[594,4]]},"134":{"position":[[1140,4]]},"198":{"position":[[619,4],[764,4],[773,4],[797,5],[806,4],[837,4],[867,5],[876,4],[884,5],[965,4],[1263,5],[1287,4],[1387,4]]},"311":{"position":[[100,4]]},"315":{"position":[[939,4]]},"349":{"position":[[119,5]]},"395":{"position":[[351,4],[617,4]]},"470":{"position":[[85,4],[1907,4],[2950,5],[2989,4],[3036,4],[3113,5],[3174,5]]},"648":{"position":[[319,4]]}}}],["sono",{"_index":1315,"t":{"125":{"position":[[794,5]]},"160":{"position":[[37,7]]},"297":{"position":[[28,5],[65,5],[261,5],[470,5],[583,6],[673,5],[701,5],[777,5],[961,6],[972,5],[1060,5],[1542,5],[1733,5],[1865,5],[1941,5]]},"299":{"position":[[111,5]]},"301":{"position":[[111,5],[480,5],[1098,5],[1304,5],[1643,5],[1722,5],[1944,5],[2668,5],[2859,5],[3377,5],[3880,7]]},"596":{"position":[[414,5]]}}}],["sonos.json",{"_index":2214,"t":{"297":{"position":[[1340,11]]}}}],["sonos/accessori",{"_index":2224,"t":{"301":{"position":[[47,15]]}}}],["sonos_devices_allow",{"_index":2230,"t":{"301":{"position":[[504,19]]}}}],["sonos_devices_block",{"_index":2231,"t":{"301":{"position":[[608,19]]}}}],["sonos_en",{"_index":2227,"t":{"301":{"position":[[377,12]]}}}],["sonos_groups_allow",{"_index":2232,"t":{"301":{"position":[[714,18]]}}}],["sonos_groups_block",{"_index":2233,"t":{"301":{"position":[[855,18]]}}}],["sonos_host",{"_index":2228,"t":{"301":{"position":[[434,10]]}}}],["sonos_id",{"_index":2225,"t":{"301":{"position":[[252,8],[333,8]]}}}],["sonos_nam",{"_index":2226,"t":{"301":{"position":[[306,10]]}}}],["soon",{"_index":1793,"t":{"190":{"position":[[955,4]]}}}],["sort",{"_index":1483,"t":{"154":{"position":[[974,7]]},"557":{"position":[[837,7],[967,7],[1672,7]]},"568":{"position":[[83,7],[176,6],[217,7],[397,7],[524,7],[1196,7],[3013,7]]},"577":{"position":[[341,7],[364,7]]}}}],["sorted/rank",{"_index":3220,"t":{"568":{"position":[[1093,13]]}}}],["sot",{"_index":1296,"t":{"125":{"position":[[25,3]]}}}],["souc",{"_index":1699,"t":{"172":{"position":[[3423,5]]}}}],["sound",{"_index":2906,"t":{"470":{"position":[[2018,5]]},"568":{"position":[[1552,5]]}}}],["soundcloud",{"_index":2184,"t":{"285":{"position":[[368,14]]},"287":{"position":[[20,12],[98,12],[373,14],[444,11]]},"289":{"position":[[656,10]]}}}],["soundcloud:song:mysong",{"_index":2185,"t":{"285":{"position":[[474,22]]}}}],["soundtrack",{"_index":3202,"t":{"566":{"position":[[912,11]]},"568":{"position":[[1594,11],[2318,11]]}}}],["soup",{"_index":2724,"t":{"395":{"position":[[808,4],[926,6]]},"561":{"position":[[3094,6],[4561,4],[4625,4],[4893,6],[5511,5],[5606,5],[5731,6]]},"575":{"position":[[711,4],[893,6]]}}}],["sourc",{"_index":50,"t":{"7":{"position":[[496,7]]},"11":{"position":[[525,6],[708,7],[808,6],[895,6],[988,6],[1183,6]]},"15":{"position":[[0,7],[685,6],[1683,7],[4857,10],[5890,10]]},"17":{"position":[[64,6],[117,7],[134,7]]},"19":{"position":[[1604,9]]},"25":{"position":[[385,6]]},"29":{"position":[[138,6],[183,6],[245,6],[570,7],[704,7],[1763,7]]},"31":{"position":[[489,10]]},"33":{"position":[[48,8],[208,7]]},"38":{"position":[[78,6],[101,6],[122,6],[358,10]]},"40":{"position":[[667,7]]},"42":{"position":[[148,6]]},"55":{"position":[[5771,6],[7157,6],[9416,6]]},"65":{"position":[[695,6],[774,6],[876,6],[3073,7]]},"67":{"position":[[1429,6]]},"79":{"position":[[836,6],[915,6],[1017,6],[3248,7]]},"81":{"position":[[1670,6]]},"83":{"position":[[83,8]]},"85":{"position":[[1171,6]]},"87":{"position":[[100,8]]},"91":{"position":[[1337,6]]},"93":{"position":[[93,8],[216,6]]},"99":{"position":[[1436,6]]},"103":{"position":[[1110,6]]},"105":{"position":[[98,8]]},"107":{"position":[[1234,6]]},"109":{"position":[[77,8],[1933,6]]},"114":{"position":[[2361,6]]},"116":{"position":[[87,8]]},"121":{"position":[[1723,6]]},"123":{"position":[[2,6],[19,6]]},"128":{"position":[[4,7],[122,6],[190,6],[332,6],[421,7],[545,6],[677,7],[881,7],[1028,7],[1220,7]]},"130":{"position":[[5,7],[105,7]]},"132":{"position":[[25,6],[377,6]]},"134":{"position":[[46,6],[68,8],[226,8],[472,6],[610,7],[679,6],[1058,6],[1712,7]]},"136":{"position":[[55,8],[131,7],[232,7],[533,8]]},"140":{"position":[[658,6]]},"144":{"position":[[642,6],[847,6],[1173,6],[1245,6],[1503,6],[2250,7],[2420,6],[2942,6],[3205,10]]},"150":{"position":[[56,7],[2565,10]]},"152":{"position":[[1769,10]]},"154":{"position":[[18,7],[453,6],[1426,6],[3512,10]]},"156":{"position":[[13,6],[200,6],[235,6]]},"160":{"position":[[168,6]]},"162":{"position":[[229,7],[286,9]]},"164":{"position":[[666,6],[868,6],[1194,6],[1263,6],[1512,6],[2272,7],[2439,6],[2958,6],[3221,10]]},"166":{"position":[[247,7],[398,6],[532,6],[577,6],[3342,6]]},"168":{"position":[[991,6],[1197,6],[1523,6],[1596,6],[1857,6],[2550,7],[2721,6],[3244,6],[3507,10]]},"172":{"position":[[2497,6],[2528,7],[2591,7],[3108,6],[4205,7],[5157,7]]},"174":{"position":[[56,6],[264,6],[511,6],[609,7],[889,7],[943,6],[1034,8],[1110,6]]},"177":{"position":[[76,6]]},"179":{"position":[[51,6],[67,6]]},"182":{"position":[[101,7],[159,6]]},"186":{"position":[[36,7],[253,7],[336,7],[420,6]]},"190":{"position":[[909,6],[989,6]]},"192":{"position":[[5,6]]},"200":{"position":[[878,6],[1084,6],[1410,6],[1483,6],[1744,6],[2754,7],[2925,6],[3448,6],[3711,10]]},"206":{"position":[[641,6],[841,6],[1167,6],[1234,6],[1477,6],[2171,7],[2336,6],[2853,6],[3116,10]]},"208":{"position":[[3776,6],[3980,6],[4306,6],[4377,6],[4632,6],[5779,7],[5948,6],[6469,6],[6732,10]]},"210":{"position":[[621,7],[758,6],[1597,8],[1674,7],[1815,7],[1997,10],[2064,7],[2146,7]]},"212":{"position":[[501,6],[704,6],[1030,6],[1100,6],[1352,6],[2003,7],[2171,6],[2691,6],[2954,10]]},"218":{"position":[[675,6],[877,6],[1203,6],[1272,6],[1521,6],[2198,7],[2365,6],[2884,6],[3147,10]]},"220":{"position":[[5,6],[254,8],[292,6],[344,8],[738,6]]},"222":{"position":[[130,7],[447,7],[852,7],[1407,7],[1540,6],[1607,7],[1750,7],[2304,7],[2437,6],[2694,6],[2783,7]]},"226":{"position":[[47,6],[482,7]]},"228":{"position":[[52,6],[113,7],[173,7],[524,6],[755,6],[810,7]]},"232":{"position":[[337,7],[479,6],[552,7],[624,7],[749,6],[956,6],[1282,6],[1356,6],[1620,6],[2257,7],[2429,6],[2953,6],[3216,10]]},"234":{"position":[[5,6],[301,6],[437,8]]},"236":{"position":[[796,6],[998,6],[1324,6],[1393,6],[1607,6],[1659,8],[1898,6],[2200,8],[2264,9],[2690,7],[2857,6],[3376,6],[3639,10],[3672,8],[3736,9]]},"238":{"position":[[5,6],[265,6],[331,8],[980,6],[1181,6],[1507,6],[1575,6],[1786,6],[1838,8],[2074,6],[2372,6],[2421,9],[2805,7],[2971,6],[3489,6],[3752,10],[3782,6],[3831,9]]},"240":{"position":[[5,6],[502,8]]},"242":{"position":[[130,7],[438,7],[841,7],[1388,7],[1521,6],[1594,7],[1735,7],[2290,7],[2423,6],[2667,6],[2746,7]]},"246":{"position":[[236,7],[349,6]]},"248":{"position":[[58,6],[292,6]]},"257":{"position":[[337,7],[472,6],[622,6],[700,6],[823,6],[1029,6],[1355,6],[1428,6],[1689,6],[2336,7],[2507,6],[3030,6],[3293,10]]},"259":{"position":[[5,6],[186,6],[323,8]]},"261":{"position":[[900,6],[1103,6],[1429,6],[1499,6],[1716,6],[1768,8],[2010,6],[2315,8],[2380,9],[2760,7],[2928,6],[3448,6],[3711,10],[3746,8],[3811,9]]},"263":{"position":[[5,6]]},"265":{"position":[[674,6],[882,6],[1208,6],[1283,6],[1515,6],[1567,8],[1824,6],[2131,8],[2193,9],[2588,7],[2761,6],[3286,6],[3549,10],[3581,8],[3643,9]]},"267":{"position":[[149,6],[215,8]]},"269":{"position":[[555,6],[757,6],[1083,6],[1152,6],[1366,6],[1418,8],[1657,6],[1957,8],[2021,9],[2357,7],[2524,6],[3043,6],[3306,10],[3337,8],[3401,9]]},"273":{"position":[[621,6],[826,6],[1152,6],[1224,6],[1482,6],[2174,7],[2344,6],[2866,6],[3129,10]]},"277":{"position":[[638,6],[839,6],[1165,6],[1233,6],[1479,6],[2146,7],[2312,6],[2830,6],[3093,10]]},"281":{"position":[[606,6],[805,6],[1131,6],[1197,6],[1437,6],[2131,7],[2295,6],[2811,6],[3074,10]]},"283":{"position":[[98,7],[212,7]]},"285":{"position":[[59,7]]},"287":{"position":[[12,7]]},"289":{"position":[[870,6],[1072,6],[1398,6],[1467,6],[1716,6],[2410,7],[2577,6],[3096,6],[3359,10]]},"291":{"position":[[151,6]]},"295":{"position":[[82,6],[148,8],[798,6],[1001,6],[1327,6],[1397,6],[1614,6],[1666,8],[1908,6],[2242,8],[2266,9],[2668,7],[2836,6],[3356,6],[3619,10],[3683,8],[3707,9]]},"297":{"position":[[499,7],[536,7],[608,7],[735,6],[837,6],[917,6],[1066,6]]},"301":{"position":[[1109,6],[1310,6],[1636,6],[1704,6],[1950,6],[2699,7],[2865,6],[3383,6],[3646,10]]},"303":{"position":[[3122,7]]},"305":{"position":[[652,6],[855,6],[1181,6],[1251,6],[1503,6],[2296,7],[2464,6],[2984,6],[3247,10]]},"311":{"position":[[1440,10]]},"313":{"position":[[5,6],[337,7],[462,6]]},"315":{"position":[[288,6]]},"317":{"position":[[630,6],[834,6],[1160,6],[1231,6],[1486,6],[2269,7],[2438,6],[2959,6],[3222,10]]},"321":{"position":[[525,6],[724,6],[1050,6],[1116,6],[1356,6],[2001,7],[2165,6],[2681,6],[2944,10]]},"325":{"position":[[44,7],[365,6],[447,6],[583,6]]},"329":{"position":[[570,6],[778,6],[1104,6],[1179,6],[1446,6],[2120,7],[2293,6],[2818,6],[3081,10]]},"331":{"position":[[64,6],[1280,6]]},"333":{"position":[[604,6],[808,6],[1134,6],[1205,6],[1460,6],[2152,7],[2321,6],[2842,6],[3105,10]]},"335":{"position":[[230,6]]},"339":{"position":[[83,6],[149,8]]},"341":{"position":[[874,9],[1083,9],[1313,9],[2041,6],[2243,6],[2569,6],[2638,6],[2852,6],[2904,8],[3143,6],[3468,8],[3492,9],[3901,7],[4068,6],[4587,6],[4850,10],[4906,8],[4930,9]]},"343":{"position":[[1667,6],[4302,6]]},"345":{"position":[[747,6],[950,6],[1276,6],[1346,6],[1598,6],[2397,7],[2565,6],[3085,6],[3348,10]]},"347":{"position":[[272,6],[665,6]]},"349":{"position":[[67,7],[177,6],[211,6],[358,6],[532,8],[581,6]]},"351":{"position":[[151,6],[348,6],[434,9]]},"353":{"position":[[4,8],[1011,7]]},"365":{"position":[[674,9]]},"373":{"position":[[198,6]]},"379":{"position":[[52,7]]},"383":{"position":[[886,7]]},"385":{"position":[[495,7]]},"387":{"position":[[0,6]]},"393":{"position":[[502,6],[707,6],[1033,6],[1105,6],[1363,6],[2010,7],[2180,6],[2702,6],[2965,10]]},"395":{"position":[[127,7]]},"397":{"position":[[1217,7]]},"403":{"position":[[426,6],[890,6]]},"418":{"position":[[113,9]]},"437":{"position":[[50,6]]},"440":{"position":[[72,7],[351,7]]},"442":{"position":[[65,7],[152,8],[454,8]]},"448":{"position":[[6,7],[1178,6],[1947,8],[2404,6]]},"460":{"position":[[324,6]]},"464":{"position":[[468,7]]},"470":{"position":[[120,6],[607,7],[768,6],[2266,8],[2572,6]]},"476":{"position":[[868,7],[1044,6]]},"478":{"position":[[103,6]]},"482":{"position":[[1967,10]]},"484":{"position":[[107,7]]},"492":{"position":[[170,9]]},"524":{"position":[[421,6]]},"530":{"position":[[0,7],[1462,6],[1601,6],[1726,7],[1769,6],[3006,7],[3091,6],[3254,7],[4022,8]]},"532":{"position":[[64,7],[337,7],[855,6],[902,8],[967,7],[1630,7],[1824,9]]},"534":{"position":[[70,7]]},"536":{"position":[[40,8],[105,7],[768,7],[962,9]]},"538":{"position":[[105,7]]},"540":{"position":[[316,7]]},"542":{"position":[[328,7]]},"544":{"position":[[292,6],[475,8]]},"555":{"position":[[20,6]]},"557":{"position":[[1318,6],[1936,6]]},"561":{"position":[[1435,7]]},"573":{"position":[[697,7]]},"575":{"position":[[65,6],[449,7],[1059,7],[1155,9],[1197,7]]},"592":{"position":[[398,7],[670,8]]},"594":{"position":[[1461,10]]},"596":{"position":[[143,7],[789,7],[1984,6],[2142,7],[2320,7],[2623,6],[2651,6],[2888,7]]},"598":{"position":[[42,7],[110,8],[151,6],[237,6]]},"600":{"position":[[2,6],[19,6],[241,6],[348,7],[398,6],[440,6]]},"619":{"position":[[349,6]]},"621":{"position":[[421,8],[445,9],[689,10],[719,8],[743,9]]},"633":{"position":[[77,6],[131,6]]},"635":{"position":[[885,6],[987,6]]},"638":{"position":[[1124,6],[1210,8],[1641,6],[1901,6]]},"640":{"position":[[22,6],[431,7],[950,6]]},"642":{"position":[[57,6],[912,7],[1090,6]]},"644":{"position":[[943,7]]},"648":{"position":[[16,7],[59,6],[173,6],[653,6],[1116,6],[1187,6],[1303,6]]},"651":{"position":[[13,6],[181,6]]},"653":{"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]]}}}],["source'",{"_index":117,"t":{"11":{"position":[[563,8]]},"132":{"position":[[79,8]]},"134":{"position":[[1410,8]]},"136":{"position":[[75,8],[487,8],[635,8]]},"140":{"position":[[814,8],[939,8]]},"210":{"position":[[914,8],[1039,8]]},"347":{"position":[[466,8]]},"353":{"position":[[861,8]]},"561":{"position":[[6301,8]]},"648":{"position":[[437,8]]},"651":{"position":[[74,8]]},"653":{"position":[[2528,8],[3419,8]]}}}],["source/cli",{"_index":203,"t":{"15":{"position":[[1576,13],[1775,13],[1794,14],[1979,13],[2194,13],[3200,14],[5715,13]]},"17":{"position":[[231,13]]},"27":{"position":[[501,13]]},"42":{"position":[[234,13],[293,13]]},"152":{"position":[[84,14],[204,13]]},"174":{"position":[[4,13],[124,13]]},"186":{"position":[[148,14]]},"188":{"position":[[194,14]]},"365":{"position":[[96,13]]},"373":{"position":[[114,13]]},"379":{"position":[[106,13],[408,14]]},"385":{"position":[[360,13]]},"403":{"position":[[143,13],[354,13]]},"452":{"position":[[76,14]]},"492":{"position":[[25,13],[102,13]]},"499":{"position":[[313,13],[354,13]]},"542":{"position":[[286,13]]},"557":{"position":[[1034,13],[1245,13]]},"619":{"position":[[105,14],[154,13],[236,13],[274,13]]},"621":{"position":[[22,13],[348,13],[632,13],[1019,13],[1131,13]]}}}],["source/client'",{"_index":325,"t":{"15":{"position":[[6166,15]]},"403":{"position":[[304,15]]},"557":{"position":[[1195,15]]}}}],["source/config",{"_index":483,"t":{"27":{"position":[[416,13]]}}}],["source_koito_en",{"_index":2067,"t":{"238":{"position":[[628,19]]}}}],["source_koito_id",{"_index":2065,"t":{"238":{"position":[[482,15],[577,15]]}}}],["source_koito_nam",{"_index":2066,"t":{"238":{"position":[[543,17]]}}}],["source_koito_token",{"_index":2069,"t":{"238":{"position":[[741,18]]}}}],["source_koito_url",{"_index":2068,"t":{"238":{"position":[[692,16]]}}}],["source_koito_us",{"_index":2070,"t":{"238":{"position":[[807,17]]}}}],["source_lastfm_api_key",{"_index":2059,"t":{"236":{"position":[[341,21]]}}}],["source_lastfm_api_key=my_api_key_placedhold",{"_index":3081,"t":{"530":{"position":[[3699,45]]}}}],["source_lastfm_en",{"_index":2058,"t":{"236":{"position":[[276,20]]}}}],["source_lastfm_id",{"_index":2056,"t":{"236":{"position":[[127,16],[224,16]]}}}],["source_lastfm_id=mylfmsourc",{"_index":3084,"t":{"530":{"position":[[3863,28]]}}}],["source_lastfm_nam",{"_index":2057,"t":{"236":{"position":[[189,18]]}}}],["source_lastfm_redirect_uri",{"_index":2061,"t":{"236":{"position":[[493,26]]}}}],["source_lastfm_redirect_uri=http://192.168.0.100:9078/lastfm/callback",{"_index":3083,"t":{"530":{"position":[[3792,68]]}}}],["source_lastfm_secret",{"_index":2060,"t":{"236":{"position":[[418,20]]}}}],["source_lastfm_secret=my_secret_placehold",{"_index":3082,"t":{"530":{"position":[[3747,42]]}}}],["source_lastfm_sess",{"_index":2062,"t":{"236":{"position":[[599,21]]}}}],["source_librefm_api_key",{"_index":2098,"t":{"261":{"position":[[345,22]]}}}],["source_librefm_en",{"_index":2097,"t":{"261":{"position":[[279,21]]}}}],["source_librefm_id",{"_index":2095,"t":{"261":{"position":[[127,17],[226,17]]}}}],["source_librefm_nam",{"_index":2096,"t":{"261":{"position":[[190,19]]}}}],["source_librefm_redirect_uri",{"_index":2100,"t":{"261":{"position":[[478,27]]}}}],["source_librefm_secret",{"_index":2099,"t":{"261":{"position":[[412,21]]}}}],["source_librefm_sess",{"_index":2101,"t":{"261":{"position":[[586,22]]}}}],["source_librefm_urlbas",{"_index":2102,"t":{"261":{"position":[[672,22]]}}}],["source_lz_en",{"_index":2106,"t":{"265":{"position":[[264,16]]}}}],["source_lz_id",{"_index":2104,"t":{"265":{"position":[[127,12],[216,12]]}}}],["source_lz_nam",{"_index":2105,"t":{"265":{"position":[[185,14]]}}}],["source_lz_token",{"_index":2108,"t":{"265":{"position":[[434,15]]}}}],["source_lz_url",{"_index":2107,"t":{"265":{"position":[[325,13]]}}}],["source_lz_us",{"_index":2109,"t":{"265":{"position":[[497,14]]}}}],["source_maloja_api_key",{"_index":2115,"t":{"269":{"position":[[388,21]]}}}],["source_maloja_en",{"_index":2113,"t":{"269":{"position":[[276,20]]}}}],["source_maloja_id",{"_index":2111,"t":{"269":{"position":[[127,16],[224,16]]}}}],["source_maloja_nam",{"_index":2112,"t":{"269":{"position":[[189,18]]}}}],["source_maloja_url",{"_index":2114,"t":{"269":{"position":[[341,17]]}}}],["source_rocksky_en",{"_index":2202,"t":{"295":{"position":[[436,21]]}}}],["source_rocksky_handl",{"_index":2204,"t":{"295":{"position":[[596,21]]}}}],["source_rocksky_id",{"_index":2200,"t":{"295":{"position":[[284,17],[383,17]]}}}],["source_rocksky_key",{"_index":2203,"t":{"295":{"position":[[502,18]]}}}],["source_rocksky_nam",{"_index":2201,"t":{"295":{"position":[[347,19]]}}}],["source_scrobble_duration=40",{"_index":1358,"t":{"134":{"position":[[1732,27]]}}}],["source_scrobble_percent=20",{"_index":1359,"t":{"134":{"position":[[1760,26]]}}}],["source_sot",{"_index":3478,"t":{"653":{"position":[[833,10]]}}}],["source_sot.histori",{"_index":3481,"t":{"653":{"position":[[1111,19]]}}}],["source_tealfm_app_pw",{"_index":2452,"t":{"341":{"position":[[1855,20]]}}}],["source_tealfm_en",{"_index":2450,"t":{"341":{"position":[[1725,20]]}}}],["source_tealfm_id",{"_index":2448,"t":{"341":{"position":[[1576,16],[1673,16]]}}}],["source_tealfm_identifi",{"_index":2451,"t":{"341":{"position":[[1790,24]]}}}],["source_tealfm_nam",{"_index":2449,"t":{"341":{"position":[[1638,18]]}}}],["sourceaioconfig",{"_index":3356,"t":{"638":{"position":[[1547,15]]}}}],["sourceconfig",{"_index":3354,"t":{"638":{"position":[[1467,12]]}}}],["sourcedata",{"_index":3454,"t":{"648":{"position":[[1579,11],[1861,12]]}}}],["sourcedefault",{"_index":273,"t":{"15":{"position":[[4565,17]]},"642":{"position":[[1182,14]]}}}],["sources.0.json",{"_index":2805,"t":{"442":{"position":[[416,14]]}}}],["sources.1.json",{"_index":2807,"t":{"442":{"position":[[602,14]]}}}],["sources.json",{"_index":2803,"t":{"442":{"position":[[357,12],[543,12]]}}}],["sources/cli",{"_index":220,"t":{"15":{"position":[[2280,15],[3782,16],[4161,15],[4244,15],[5802,15]]},"27":{"position":[[294,15]]},"29":{"position":[[869,16]]},"36":{"position":[[78,15]]},"40":{"position":[[41,15]]},"186":{"position":[[290,16]]},"331":{"position":[[373,15]]},"403":{"position":[[90,16]]},"540":{"position":[[445,15]]},"557":{"position":[[121,16]]},"614":{"position":[[49,15]]},"619":{"position":[[490,16]]}}}],["sourcetyp",{"_index":3359,"t":{"638":{"position":[[1753,10],[1812,12],[1825,12]]},"642":{"position":[[621,10],[635,12],[657,12]]}}}],["space",{"_index":534,"t":{"29":{"position":[[1480,5]]},"431":{"position":[[249,6],[425,6]]},"470":{"position":[[2006,5]]}}}],["speaker",{"_index":2229,"t":{"301":{"position":[[486,7]]}}}],["spec",{"_index":995,"t":{"69":{"position":[[397,5]]}}}],["special",{"_index":2310,"t":{"311":{"position":[[50,7]]},"341":{"position":[[494,7]]},"416":{"position":[[968,7]]},"566":{"position":[[1053,7]]}}}],["specif",{"_index":150,"t":{"15":{"position":[[86,8],[1674,8],[1706,8]]},"29":{"position":[[2914,12],[4770,13]]},"46":{"position":[[307,8]]},"55":{"position":[[568,8],[3739,8],[3798,8]]},"69":{"position":[[200,8]]},"87":{"position":[[581,8],[1009,8]]},"130":{"position":[[177,8]]},"144":{"position":[[334,8]]},"150":{"position":[[325,8]]},"162":{"position":[[1044,12]]},"166":{"position":[[968,8],[2205,8]]},"198":{"position":[[2533,8]]},"208":{"position":[[2764,8]]},"228":{"position":[[544,8]]},"248":{"position":[[312,8]]},"279":{"position":[[158,8]]},"303":{"position":[[1579,8]]},"307":{"position":[[840,8],[1045,8]]},"311":{"position":[[74,12],[110,8]]},"313":{"position":[[498,8]]},"319":{"position":[[773,8]]},"329":{"position":[[339,8],[419,8]]},"331":{"position":[[1036,12],[1255,12]]},"355":{"position":[[631,8],[693,8]]},"361":{"position":[[569,8]]},"370":{"position":[[25,8]]},"385":{"position":[[323,8],[340,9],[413,8]]},"464":{"position":[[294,8]]},"516":{"position":[[202,8]]},"561":{"position":[[125,8]]},"566":{"position":[[1125,12]]},"596":{"position":[[2331,8]]},"631":{"position":[[200,8]]}}}],["specifi",{"_index":195,"t":{"15":{"position":[[1198,9],[3368,9]]},"21":{"position":[[282,9],[437,7],[577,9]]},"89":{"position":[[529,9]]},"95":{"position":[[523,9]]},"97":{"position":[[57,7]]},"132":{"position":[[114,7]]},"150":{"position":[[615,7]]},"154":{"position":[[748,7]]},"208":{"position":[[1304,7],[1544,7]]},"230":{"position":[[339,7]]},"255":{"position":[[339,7]]},"285":{"position":[[97,7]]},"303":{"position":[[2413,7]]},"359":{"position":[[15,7],[115,10],[954,9],[1037,10]]},"361":{"position":[[775,10]]},"399":{"position":[[38,10]]},"416":{"position":[[348,9]]},"454":{"position":[[100,9]]},"476":{"position":[[1581,7],[1787,7],[1945,9]]},"478":{"position":[[588,7]]},"482":{"position":[[469,9]]},"528":{"position":[[252,7]]},"555":{"position":[[40,10],[271,10]]},"561":{"position":[[3822,7]]},"588":{"position":[[244,7]]},"592":{"position":[[355,7]]},"610":{"position":[[181,9]]},"625":{"position":[[1111,7]]},"640":{"position":[[104,7]]}}}],["speed",{"_index":430,"t":{"23":{"position":[[786,5]]},"368":{"position":[[92,5]]}}}],["spell",{"_index":2525,"t":{"347":{"position":[[637,7]]},"412":{"position":[[328,8]]}}}],["split",{"_index":2716,"t":{"395":{"position":[[252,6],[365,5],[436,5],[489,6]]}}}],["spot",{"_index":1866,"t":{"198":{"position":[[700,4]]}}}],["spotifi",{"_index":289,"t":{"15":{"position":[[4880,10],[4946,7]]},"19":{"position":[[1614,8]]},"21":{"position":[[100,7]]},"29":{"position":[[758,7],[932,7]]},"40":{"position":[[685,9]]},"75":{"position":[[528,8],[1308,9],[1910,7],[2167,11]]},"123":{"position":[[127,8]]},"125":{"position":[[824,7]]},"134":{"position":[[719,8]]},"150":{"position":[[157,7],[728,7],[1603,9],[2588,10],[2634,9]]},"154":{"position":[[330,7],[1082,7],[2377,9],[3535,10],[3581,9]]},"172":{"position":[[3263,7]]},"177":{"position":[[35,7],[68,7]]},"277":{"position":[[1876,9],[3222,9]]},"297":{"position":[[252,8]]},"303":{"position":[[0,7],[28,7],[67,7],[269,7],[380,7],[472,7],[575,7],[652,7],[788,8],[818,7],[860,7],[950,7],[1007,7],[1306,7],[1674,7],[1708,7],[1805,7],[1865,7],[2057,7],[2198,7],[2220,7],[2455,7],[2804,7],[2834,7],[3114,7],[3264,7],[3589,7],[3958,7],[4074,7],[4196,7],[4837,7],[5128,7],[5477,7]]},"305":{"position":[[342,7],[389,7],[470,7],[639,7],[847,7],[1188,7],[1269,7],[1495,7],[1821,9],[2263,7],[2456,7],[2976,7],[3295,9],[3521,9]]},"359":{"position":[[652,7]]},"462":{"position":[[198,7]]},"464":{"position":[[137,9]]},"482":{"position":[[1604,8]]},"526":{"position":[[308,8]]},"530":{"position":[[105,7],[552,7],[587,7],[668,7],[1236,7]]},"532":{"position":[[984,7]]},"536":{"position":[[122,7]]},"544":{"position":[[1122,9]]},"548":{"position":[[26,9]]},"561":{"position":[[1894,8]]},"568":{"position":[[1447,8]]},"575":{"position":[[1113,8]]},"592":{"position":[[33,7],[89,8]]},"596":{"position":[[420,7]]},"600":{"position":[[183,8]]},"610":{"position":[[252,7]]},"638":{"position":[[1766,9],[1842,10]]}}}],["spotify'",{"_index":1224,"t":{"109":{"position":[[2035,9]]}}}],["spotify.json",{"_index":1353,"t":{"134":{"position":[[1439,12]]},"592":{"position":[[958,12]]}}}],["spotify/jellyfin/etc",{"_index":2734,"t":{"397":{"position":[[1230,21]]}}}],["spotify/lastfm/listenbrainz",{"_index":1762,"t":{"174":{"position":[[1165,28]]}}}],["spotify_client_id",{"_index":2293,"t":{"305":{"position":[[317,17]]}}}],["spotify_client_id=h2uvgv8okrflv2ouoc1latk7xe5egdg",{"_index":1421,"t":{"150":{"position":[[763,50]]},"154":{"position":[[1117,50]]}}}],["spotify_client_id=yourclientid",{"_index":3067,"t":{"530":{"position":[[950,30]]}}}],["spotify_client_id=yourid",{"_index":190,"t":{"15":{"position":[[1067,24]]}}}],["spotify_client_secret",{"_index":2294,"t":{"305":{"position":[[360,21]]}}}],["spotify_client_secret=hvofe5ce2hdblne6vafbex6drvcddo43",{"_index":1422,"t":{"150":{"position":[[816,54]]},"154":{"position":[[1170,54]]}}}],["spotify_client_secret=yourclientsecret",{"_index":3068,"t":{"530":{"position":[[983,38]]}}}],["spotify_client_secret=yoursecret",{"_index":191,"t":{"15":{"position":[[1092,32]]}}}],["spotify_en",{"_index":2292,"t":{"305":{"position":[[258,14]]}}}],["spotify_id",{"_index":2290,"t":{"305":{"position":[[127,10],[212,10]]}}}],["spotify_id=foxxspotifi",{"_index":1420,"t":{"150":{"position":[[738,22]]},"154":{"position":[[1092,22]]}}}],["spotify_id=myspotifi",{"_index":3071,"t":{"530":{"position":[[1093,20]]}}}],["spotify_nam",{"_index":2291,"t":{"305":{"position":[[183,12]]}}}],["spotify_redirect_uri",{"_index":2268,"t":{"303":{"position":[[2867,20],[3305,20],[3999,20],[5169,20]]},"305":{"position":[[411,20]]}}}],["spotify_redirect_uri=https://multi",{"_index":3069,"t":{"530":{"position":[[1024,34]]}}}],["spotify_redirect_uri=https://multiscrobbler.example.com/callback",{"_index":1423,"t":{"150":{"position":[[873,64]]},"154":{"position":[[1227,64]]}}}],["spotify_secret",{"_index":371,"t":{"19":{"position":[[1659,14]]}}}],["spotify_transforms=musicbrainz",{"_index":3089,"t":{"532":{"position":[[1269,30]]},"536":{"position":[[407,30]]}}}],["spotifysourceaioconfig",{"_index":3357,"t":{"638":{"position":[[1565,22]]}}}],["spotifysourceconfig",{"_index":3355,"t":{"638":{"position":[[1482,19]]}}}],["sqlite",{"_index":471,"t":{"27":{"position":[[29,6]]},"512":{"position":[[29,6]]}}}],["squeez",{"_index":1871,"t":{"198":{"position":[[1251,8]]}}}],["squiggli",{"_index":973,"t":{"67":{"position":[[1328,8],[2819,8]]},"81":{"position":[[1569,8],[3102,8]]},"85":{"position":[[1072,8],[2589,8]]},"91":{"position":[[1237,8],[2820,8]]},"99":{"position":[[1335,8],[2881,8]]},"103":{"position":[[1010,8],[2501,8]]},"107":{"position":[[1128,8],[2713,8]]},"114":{"position":[[2260,8],[3816,8]]},"121":{"position":[[1623,8],[3114,8]]},"144":{"position":[[1142,8],[2695,8]]},"164":{"position":[[1163,8],[2714,8]]},"168":{"position":[[1492,8],[2996,8]]},"200":{"position":[[1379,8],[3200,8]]},"206":{"position":[[1136,8],[2611,8]]},"208":{"position":[[4275,8],[6223,8]]},"212":{"position":[[999,8],[2446,8]]},"218":{"position":[[1172,8],[2640,8]]},"232":{"position":[[1251,8],[2704,8]]},"236":{"position":[[1293,8],[3132,8]]},"238":{"position":[[1476,8],[3246,8]]},"257":{"position":[[1324,8],[2782,8]]},"261":{"position":[[1398,8],[3203,8]]},"265":{"position":[[1177,8],[3036,8]]},"269":{"position":[[1052,8],[2799,8]]},"273":{"position":[[1121,8],[2619,8]]},"277":{"position":[[1134,8],[2587,8]]},"281":{"position":[[1100,8],[2570,8]]},"289":{"position":[[1367,8],[2852,8]]},"295":{"position":[[1296,8],[3111,8]]},"301":{"position":[[1605,8],[3140,8]]},"305":{"position":[[1150,8],[2739,8]]},"317":{"position":[[1129,8],[2713,8]]},"321":{"position":[[1019,8],[2440,8]]},"329":{"position":[[1073,8],[2568,8]]},"333":{"position":[[1103,8],[2596,8]]},"341":{"position":[[2538,8],[4343,8]]},"345":{"position":[[1245,8],[2840,8]]},"393":{"position":[[1002,8],[2455,8]]}}}],["src/backend/common/infrastructure/atomic.t",{"_index":3358,"t":{"638":{"position":[[1697,43]]}}}],["src/backend/common/infrastructure/config/source/coolplayer.t",{"_index":3334,"t":{"638":{"position":[[164,62]]}}}],["src/backend/common/infrastructure/config/source/sources.t",{"_index":3349,"t":{"638":{"position":[[1219,58]]}}}],["src/backend/index.t",{"_index":2698,"t":{"389":{"position":[[95,20]]}}}],["src/backend/sources/coolplayersource.t",{"_index":3402,"t":{"644":{"position":[[139,39]]},"646":{"position":[[283,39],[1469,39],[2107,39]]},"648":{"position":[[1496,39]]},"651":{"position":[[292,39]]},"653":{"position":[[784,39]]}}}],["src/backend/sources/mybasicsource.t",{"_index":3488,"t":{"653":{"position":[[2764,36],[3436,36]]}}}],["src/backend/sources/scrobblesources.t",{"_index":3378,"t":{"642":{"position":[[255,38]]}}}],["src/backend/sources/spotifysource.t",{"_index":3363,"t":{"640":{"position":[[127,36]]}}}],["src/index.j",{"_index":2987,"t":{"482":{"position":[[1910,12]]}}}],["src/service/api.t",{"_index":3483,"t":{"653":{"position":[[1422,18]]}}}],["ssl",{"_index":2044,"t":{"230":{"position":[[576,3]]},"255":{"position":[[581,3]]},"303":{"position":[[2592,3]]}}}],["stabl",{"_index":3051,"t":{"520":{"position":[[33,7],[189,6]]},"522":{"position":[[58,6],[506,6]]},"596":{"position":[[1544,6]]}}}],["stack",{"_index":458,"t":{"25":{"position":[[542,6]]},"55":{"position":[[644,5],[1395,5],[1470,5],[2749,6]]},"59":{"position":[[69,5],[1348,6]]},"275":{"position":[[1101,5]]},"476":{"position":[[2395,5]]}}}],["stage",{"_index":941,"t":{"65":{"position":[[3242,5]]},"79":{"position":[[3417,5]]},"154":{"position":[[1391,5]]},"188":{"position":[[145,6],[310,5]]},"198":{"position":[[2336,5],[2453,6],[2498,5]]},"311":{"position":[[303,5]]},"355":{"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]]},"357":{"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]]},"359":{"position":[[5,5],[161,5],[737,6],[767,5],[971,5],[1095,6]]},"361":{"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]]},"363":{"position":[[0,6],[44,6],[457,5],[1172,5],[1252,5],[1435,5],[1509,5]]},"365":{"position":[[21,5],[197,5],[338,5],[527,5],[568,6]]},"368":{"position":[[61,6],[284,6]]},"370":{"position":[[34,5],[73,5],[86,5],[104,5]]},"383":{"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]]},"395":{"position":[[11,5],[102,5],[677,5]]},"397":{"position":[[25,5]]},"401":{"position":[[54,5],[223,6],[438,5]]},"403":{"position":[[180,5],[207,5],[856,5]]},"406":{"position":[[161,5],[240,5]]},"410":{"position":[[171,5],[229,6]]},"412":{"position":[[9,5],[112,5],[383,5]]},"414":{"position":[[4,5],[154,5],[352,6],[411,5],[555,6]]},"544":{"position":[[16,5],[213,5],[461,5]]},"551":{"position":[[165,5]]},"553":{"position":[[83,5]]},"555":{"position":[[9,5],[232,5],[868,5]]},"557":{"position":[[256,5],[1071,5],[1098,5],[1902,5]]},"561":{"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]]},"568":{"position":[[2414,5]]},"571":{"position":[[126,6]]},"573":{"position":[[27,5]]},"581":{"position":[[406,6],[465,6],[523,6]]},"590":{"position":[[12,5],[106,5]]},"592":{"position":[[332,5],[414,5]]},"594":{"position":[[135,5]]},"638":{"position":[[402,6],[2074,6]]},"646":{"position":[[27,6],[122,6],[1462,6],[2100,6]]}}}],["stage/rul",{"_index":2572,"t":{"363":{"position":[[392,10]]}}}],["stale",{"_index":2328,"t":{"315":{"position":[[499,5]]},"452":{"position":[[889,6]]}}}],["stale/disappear",{"_index":1348,"t":{"134":{"position":[[823,16]]}}}],["stand",{"_index":2738,"t":{"403":{"position":[[268,6]]},"557":{"position":[[1159,6]]}}}],["standalon",{"_index":2627,"t":{"373":{"position":[[273,10]]}}}],["standard",{"_index":1193,"t":{"109":{"position":[[360,12]]},"116":{"position":[[358,12]]},"154":{"position":[[285,13]]},"196":{"position":[[784,8]]},"198":{"position":[[1092,8]]},"204":{"position":[[344,8]]},"210":{"position":[[90,8]]},"216":{"position":[[348,8]]},"222":{"position":[[322,8],[463,8],[868,8],[1778,8],[2866,8],[3058,8]]},"230":{"position":[[52,8]]},"232":{"position":[[383,8]]},"242":{"position":[[312,8],[454,8],[857,8],[1763,8],[2822,8],[3011,8]]},"244":{"position":[[340,8]]},"248":{"position":[[146,8]]},"255":{"position":[[52,8]]},"257":{"position":[[376,8]]},"275":{"position":[[11,8]]},"283":{"position":[[72,8],[89,8],[701,8]]},"355":{"position":[[416,11]]},"385":{"position":[[22,8],[156,8]]},"482":{"position":[[934,12]]},"544":{"position":[[233,13]]},"596":{"position":[[2372,11]]},"627":{"position":[[16,8]]},"644":{"position":[[118,8]]},"648":{"position":[[2268,8]]}}}],["start",{"_index":193,"t":{"15":{"position":[[1133,5]]},"38":{"position":[[93,7]]},"55":{"position":[[6029,5],[7586,5]]},"65":{"position":[[1066,6]]},"69":{"position":[[947,8],[1002,7],[1175,8]]},"75":{"position":[[1541,5]]},"79":{"position":[[1207,6]]},"101":{"position":[[270,5]]},"109":{"position":[[852,5]]},"116":{"position":[[850,5]]},"121":{"position":[[80,8]]},"147":{"position":[[263,8]]},"162":{"position":[[107,5],[858,5]]},"168":{"position":[[492,5],[613,5],[733,5],[851,5]]},"172":{"position":[[3219,7]]},"194":{"position":[[465,6]]},"196":{"position":[[1426,8]]},"277":{"position":[[370,5],[478,5]]},"285":{"position":[[231,5],[452,5]]},"289":{"position":[[466,6],[576,6]]},"303":{"position":[[527,8],[1897,5],[2259,6],[5056,8],[5391,5],[5493,5]]},"319":{"position":[[737,8]]},"343":{"position":[[2804,5],[3513,5],[4595,5],[4939,5],[5454,5]]},"375":{"position":[[432,5]]},"383":{"position":[[157,6]]},"416":{"position":[[714,6]]},"470":{"position":[[2916,5]]},"478":{"position":[[18,5]]},"482":{"position":[[313,5],[2308,5]]},"499":{"position":[[154,8]]},"503":{"position":[[389,5]]},"505":{"position":[[113,5],[268,5]]},"530":{"position":[[1127,8],[3905,8]]},"538":{"position":[[2028,5]]},"540":{"position":[[200,5]]},"596":{"position":[[1330,5],[2903,8]]},"604":{"position":[[14,5]]},"623":{"position":[[911,7],[1358,5],[1432,5]]},"625":{"position":[[410,8]]},"642":{"position":[[8,6]]},"651":{"position":[[60,6]]}}}],["startup",{"_index":1760,"t":{"174":{"position":[[1123,7]]},"343":{"position":[[2836,7]]},"379":{"position":[[315,9]]},"383":{"position":[[1560,7]]},"524":{"position":[[176,7]]},"610":{"position":[[218,7]]},"623":{"position":[[1070,8]]},"651":{"position":[[603,7]]}}}],["stat",{"_index":1271,"t":{"116":{"position":[[1950,5]]},"210":{"position":[[1737,6],[1886,6],[2133,6]]},"596":{"position":[[1031,6]]}}}],["state",{"_index":1005,"t":{"69":{"position":[[725,5]]},"128":{"position":[[754,5],[934,5]]},"172":{"position":[[2377,7]]},"315":{"position":[[129,5]]},"442":{"position":[[850,5]]},"635":{"position":[[553,5]]},"638":{"position":[[2127,5]]},"648":{"position":[[227,5],[552,5],[962,5],[1092,5],[1201,5],[1921,5],[2284,5],[2463,5],[2587,5],[2601,5],[2649,5]]},"653":{"position":[[46,5],[676,5],[1570,5]]}}}],["stateless",{"_index":637,"t":{"38":{"position":[[1474,9],[1704,9]]}}}],["statement",{"_index":3385,"t":{"642":{"position":[[595,9]]}}}],["static",{"_index":3400,"t":{"644":{"position":[[21,6],[600,6]]},"646":{"position":[[440,6]]}}}],["static_config",{"_index":692,"t":{"42":{"position":[[732,15]]}}}],["station",{"_index":1385,"t":{"142":{"position":[[0,7],[24,7],[86,7],[169,8],[248,7],[343,7],[396,7],[433,7],[448,7],[529,8],[626,7],[771,9],[803,9],[926,7],[941,7],[961,7],[1057,7],[1163,7],[1361,7]]},"144":{"position":[[343,7],[1841,9],[1907,10],[1922,7],[3271,9],[3337,10],[3352,7]]},"210":{"position":[[32,7],[568,8]]},"212":{"position":[[1645,8],[2977,8]]}}}],["station'",{"_index":1395,"t":{"142":{"position":[[1148,9]]}}}],["statist",{"_index":3105,"t":{"540":{"position":[[516,10]]},"610":{"position":[[19,11]]}}}],["statu",{"_index":118,"t":{"11":{"position":[[579,6],[642,6]]},"36":{"position":[[2,6]]},"40":{"position":[[249,6],[321,6]]},"63":{"position":[[103,6]]},"65":{"position":[[54,7],[3474,6]]},"69":{"position":[[1577,6],[1620,6]]},"75":{"position":[[407,6],[552,7],[627,7],[694,6]]},"77":{"position":[[79,6]]},"79":{"position":[[54,7],[189,6],[3682,6]]},"136":{"position":[[496,6]]},"140":{"position":[[823,6],[1326,6]]},"210":{"position":[[923,6]]},"452":{"position":[[682,6]]},"454":{"position":[[129,6]]},"540":{"position":[[474,6],[577,6]]},"566":{"position":[[633,6],[1403,6]]},"596":{"position":[[779,6]]},"610":{"position":[[2,6],[341,6],[365,6]]}}}],["status",{"_index":1057,"t":{"81":{"position":[[769,8]]}}}],["statusoverrideallow",{"_index":1042,"t":{"75":{"position":[[1045,22]]}}}],["stdout/stderr",{"_index":3281,"t":{"610":{"position":[[148,13]]}}}],["step",{"_index":495,"t":{"29":{"position":[[322,4],[981,5],[1944,5],[2015,5],[2068,4]]},"46":{"position":[[316,5]]},"55":{"position":[[3663,5]]},"72":{"position":[[800,6]]},"166":{"position":[[1460,5],[1534,5]]},"194":{"position":[[628,5]]},"196":{"position":[[1001,5]]},"230":{"position":[[105,5]]},"255":{"position":[[105,5]]},"303":{"position":[[978,5],[1066,5],[4147,4],[5070,4]]},"368":{"position":[[127,5]]},"448":{"position":[[1380,5]]},"516":{"position":[[188,5]]},"518":{"position":[[397,5]]},"530":{"position":[[457,4]]},"532":{"position":[[192,4],[277,4],[1638,4]]},"534":{"position":[[10,4]]},"536":{"position":[[776,4]]},"559":{"position":[[232,6],[367,5]]},"561":{"position":[[814,4]]},"633":{"position":[[29,4],[37,4]]}}}],["stick",{"_index":159,"t":{"15":{"position":[[269,5]]}}}],["still",{"_index":83,"t":{"9":{"position":[[229,5]]},"15":{"position":[[451,5]]},"75":{"position":[[1698,5]]},"116":{"position":[[1639,5],[1671,5]]},"184":{"position":[[137,5]]},"188":{"position":[[173,5]]},"198":{"position":[[2349,5]]},"208":{"position":[[1461,5]]},"222":{"position":[[2676,5]]},"228":{"position":[[790,5]]},"242":{"position":[[2649,5]]},"287":{"position":[[258,5]]},"303":{"position":[[850,5]]},"323":{"position":[[801,5]]},"408":{"position":[[157,7]]},"414":{"position":[[134,5]]},"484":{"position":[[70,5]]},"524":{"position":[[779,5]]},"568":{"position":[[2008,5]]},"573":{"position":[[102,5]]},"579":{"position":[[199,5],[353,5]]},"588":{"position":[[79,5]]},"596":{"position":[[2778,5]]},"623":{"position":[[1415,5]]},"653":{"position":[[401,5],[1548,5]]}}}],["stop",{"_index":81,"t":{"9":{"position":[[187,5]]},"38":{"position":[[137,7]]},"128":{"position":[[769,8]]},"150":{"position":[[1514,7]]},"154":{"position":[[1680,7]]},"315":{"position":[[890,6],[962,7]]},"331":{"position":[[560,7],[880,7]]},"343":{"position":[[128,4]]},"361":{"position":[[69,4],[343,5],[1430,7]]},"383":{"position":[[221,5]]},"403":{"position":[[1080,7]]},"454":{"position":[[342,7]]},"478":{"position":[[1096,7]]},"528":{"position":[[524,7]]},"557":{"position":[[2160,7]]},"590":{"position":[[898,7]]},"648":{"position":[[2093,9]]}}}],["storag",{"_index":198,"t":{"15":{"position":[[1379,7],[3567,7]]},"29":{"position":[[9,7],[1472,7]]},"38":{"position":[[1499,7],[1815,7]]},"109":{"position":[[557,8]]},"116":{"position":[[555,8]]},"158":{"position":[[630,7]]},"194":{"position":[[292,7]]},"476":{"position":[[0,7]]}}}],["store",{"_index":2,"t":{"2":{"position":[[32,6]]},"23":{"position":[[120,5],[203,5],[886,6],[1199,5],[1413,6]]},"25":{"position":[[18,5],[85,5],[141,5],[422,6]]},"27":{"position":[[86,6],[268,6]]},"29":{"position":[[59,6],[330,7],[1422,6],[3524,6],[3788,5],[3892,5],[4023,6]]},"109":{"position":[[279,6],[437,7],[1761,5]]},"116":{"position":[[157,6],[277,6],[435,7]]},"158":{"position":[[48,5]]},"383":{"position":[[1212,5],[1322,6],[3139,5]]},"385":{"position":[[57,5],[176,7]]},"442":{"position":[[728,7]]},"476":{"position":[[122,7]]},"512":{"position":[[86,6]]},"538":{"position":[[26,5]]},"602":{"position":[[32,6]]},"623":{"position":[[518,6]]}}}],["stored/avail",{"_index":2432,"t":{"335":{"position":[[136,16]]}}}],["straightforward",{"_index":1410,"t":{"147":{"position":[[406,15]]},"174":{"position":[[387,15]]}}}],["strang",{"_index":1614,"t":{"166":{"position":[[3254,7]]}}}],["strategi",{"_index":2616,"t":{"368":{"position":[[175,8]]}}}],["stream",{"_index":838,"t":{"55":{"position":[[4185,6],[4324,6],[4591,6],[4730,6]]},"75":{"position":[[1574,11]]},"144":{"position":[[473,7]]},"210":{"position":[[40,9],[153,6],[180,7],[1649,6]]},"212":{"position":[[348,6]]}}}],["streamtitl",{"_index":1977,"t":{"210":{"position":[[238,13]]}}}],["strict",{"_index":1872,"t":{"198":{"position":[[1338,6]]}}}],["strictli",{"_index":1863,"t":{"198":{"position":[[561,8]]}}}],["string",{"_index":360,"t":{"19":{"position":[[1272,6],[1479,6]]},"25":{"position":[[870,6],[921,6]]},"67":{"position":[[138,6],[196,6],[281,6],[325,6],[588,6]]},"81":{"position":[[138,6],[196,6],[272,6],[354,6],[561,6],[720,6],[841,6]]},"85":{"position":[[136,6],[192,6],[319,6],[363,6],[421,6]]},"91":{"position":[[137,6],[194,6],[328,6],[397,6],[471,6],[565,6]]},"99":{"position":[[138,6],[196,6],[333,6],[392,6],[457,6],[553,6],[632,6]]},"103":{"position":[[137,6],[194,6],[324,6],[368,6]]},"107":{"position":[[133,6],[186,6],[304,6],[408,6],[463,6]]},"114":{"position":[[1190,6],[1248,6],[1381,6],[1470,6],[1582,6]]},"121":{"position":[[713,6],[770,6],[907,6],[961,6]]},"144":{"position":[[136,6],[192,6],[323,6],[372,6],[424,6],[501,6]]},"164":{"position":[[137,6],[194,6],[324,6],[391,6],[467,6]]},"168":{"position":[[228,6],[281,6],[413,6],[537,6],[655,6],[775,6]]},"172":{"position":[[210,6],[389,7],[418,6],[442,6],[469,6],[493,6],[520,6],[612,7],[756,6],[801,6],[856,6],[906,6],[967,7],[1246,6],[1374,7],[4989,6]]},"190":{"position":[[1223,7]]},"196":{"position":[[1579,6],[2286,6],[3841,7]]},"200":{"position":[[141,6],[202,6],[347,6],[373,6],[398,6],[433,6],[457,6],[489,6]]},"206":{"position":[[135,6],[190,6],[314,6],[403,6],[474,6]]},"208":{"position":[[2249,6],[2308,6],[2445,6],[2538,6],[2606,6],[2656,6],[2731,6],[2865,6],[2952,6],[3012,7],[3074,6],[3136,7],[3200,6],[3246,6],[3309,6],[3357,7],[3427,6],[3590,6]]},"210":{"position":[[231,6]]},"212":{"position":[[138,6],[196,6],[329,6]]},"218":{"position":[[137,6],[194,6],[324,6],[419,6],[499,6]]},"220":{"position":[[521,7]]},"232":{"position":[[134,6],[188,6],[310,6],[499,6],[572,6]]},"236":{"position":[[144,6],[208,6],[363,6],[439,6],[520,6],[621,6]]},"238":{"position":[[498,6],[561,6],[709,6],[760,6],[825,6]]},"257":{"position":[[134,6],[188,6],[310,6],[489,6],[642,6]]},"261":{"position":[[145,6],[210,6],[368,6],[434,6],[506,6],[609,6],[695,6]]},"265":{"position":[[140,6],[200,6],[339,6],[450,6],[512,6]]},"269":{"position":[[144,6],[208,6],[359,6],[410,6]]},"273":{"position":[[133,6],[186,6],[304,6],[406,6]]},"277":{"position":[[136,6],[192,6],[325,6],[435,6]]},"281":{"position":[[134,6],[188,6],[309,6],[385,6]]},"285":{"position":[[212,6],[312,7]]},"287":{"position":[[315,7]]},"289":{"position":[[137,6],[194,6],[324,6],[426,6],[491,8],[538,6],[601,8],[649,6],[719,6]]},"295":{"position":[[302,6],[367,6],[521,6],[618,6]]},"301":{"position":[[261,6],[317,6],[445,6],[524,6],[569,7],[628,6],[675,7],[733,6],[816,7],[874,6],[959,7]]},"305":{"position":[[138,6],[196,6],[335,6],[382,6],[432,6]]},"317":{"position":[[139,6],[198,6],[335,6],[397,6],[467,6]]},"321":{"position":[[134,6],[188,6],[309,6],[385,6]]},"329":{"position":[[133,6],[186,6],[310,6],[385,6]]},"333":{"position":[[139,6],[198,6],[334,6],[434,6]]},"341":{"position":[[1593,6],[1657,6],[1815,6],[1876,6]]},"343":{"position":[[3693,6]]},"345":{"position":[[134,6],[188,6],[318,6],[405,6],[475,6],[542,6]]},"347":{"position":[[119,7]]},"355":{"position":[[325,6]]},"357":{"position":[[1414,6]]},"363":{"position":[[176,6]]},"381":{"position":[[183,6]]},"383":{"position":[[569,6]]},"393":{"position":[[136,6],[192,6],[319,6]]},"395":{"position":[[208,6],[277,6]]},"397":{"position":[[74,6],[219,6],[386,7],[444,6],[765,7],[1162,6],[1334,7],[1388,7]]},"416":{"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]]},"418":{"position":[[456,6]]},"431":{"position":[[24,6],[69,7],[118,6]]},"462":{"position":[[75,6]]},"524":{"position":[[709,6]]},"561":{"position":[[3676,6],[3771,7],[4316,6],[4673,6],[4708,6],[4750,6],[5201,7],[5366,7],[5409,7]]},"575":{"position":[[628,7]]},"625":{"position":[[745,6],[818,7]]},"638":{"position":[[749,6],[861,6]]},"646":{"position":[[471,7],[781,6],[906,8],[1057,8],[1737,6],[1916,6]]}}}],["strip",{"_index":1880,"t":{"198":{"position":[[2110,6],[2309,9],[2365,9],[2512,5]]}}}],["strong",{"_index":3109,"t":{"544":{"position":[[340,6]]}}}],["strongli",{"_index":452,"t":{"25":{"position":[[286,8]]}}}],["structur",{"_index":225,"t":{"15":{"position":[[2497,10]]},"67":{"position":[[747,9],[775,9],[1092,10],[1740,10],[2129,9],[2157,9],[2584,10],[3104,10]]},"81":{"position":[[988,9],[1016,9],[1333,10],[1981,10],[2412,9],[2440,9],[2867,10],[3387,10]]},"85":{"position":[[495,9],[523,9],[836,10],[1476,10],[1903,9],[1931,9],[2354,10],[2872,10]]},"91":{"position":[[658,9],[686,9],[1001,10],[1645,10],[2132,9],[2160,9],[2585,10],[3104,10]]},"99":{"position":[[754,9],[782,9],[1099,10],[1747,10],[2191,9],[2219,9],[2646,10],[3166,10]]},"103":{"position":[[431,9],[459,9],[774,10],[1418,10],[1813,9],[1841,9],[2266,10],[2785,10]]},"107":{"position":[[537,9],[565,9],[892,10],[1560,10],[2013,9],[2041,9],[2478,10],[3003,10]]},"109":{"position":[[1140,9],[1189,9]]},"114":{"position":[[1679,9],[1707,9],[2024,10],[2672,10],[3126,9],[3154,9],[3581,10],[4101,10]]},"116":{"position":[[1138,9],[1187,9]]},"121":{"position":[[1044,9],[1072,9],[1387,10],[2031,10],[2426,9],[2454,9],[2879,10],[3398,10]]},"144":{"position":[[557,9],[585,9],[906,10],[1562,10],[2001,9],[2029,9],[2460,10],[2982,10]]},"164":{"position":[[584,9],[612,9],[927,10],[1571,10],[2026,9],[2054,9],[2479,10],[2998,10]]},"168":{"position":[[905,9],[933,9],[1256,10],[1916,10],[2300,9],[2328,9],[2761,10],[3284,10]]},"200":{"position":[[792,9],[820,9],[1143,10],[1803,10],[2504,9],[2532,9],[2965,10],[3488,10]]},"206":{"position":[[561,9],[589,9],[900,10],[1536,10],[1927,9],[1955,9],[2376,10],[2893,10]]},"208":{"position":[[3692,9],[3720,9],[4039,10],[4691,10],[5531,9],[5559,9],[5988,10],[6509,10]]},"212":{"position":[[418,9],[446,9],[763,10],[1411,10],[1756,9],[1784,9],[2211,10],[2731,10]]},"218":{"position":[[593,9],[621,9],[936,10],[1580,10],[1952,9],[1980,9],[2405,10],[2924,10]]},"224":{"position":[[229,9]]},"232":{"position":[[662,9],[690,9],[1015,10],[1679,10],[2006,9],[2034,9],[2469,10],[2993,10]]},"236":{"position":[[714,9],[742,9],[1057,10],[1957,10],[2444,9],[2472,9],[2897,10],[3416,10]]},"238":{"position":[[899,9],[927,9],[1240,10],[2133,10],[2560,9],[2588,9],[3011,10],[3529,10]]},"257":{"position":[[737,9],[765,9],[1088,10],[1748,10],[2086,9],[2114,9],[2547,10],[3070,10]]},"261":{"position":[[817,9],[845,9],[1162,10],[2069,10],[2513,9],[2541,9],[2968,10],[3488,10]]},"265":{"position":[[586,9],[614,9],[941,10],[1883,10],[2336,9],[2364,9],[2801,10],[3326,10]]},"269":{"position":[[473,9],[501,9],[816,10],[1716,10],[2111,9],[2139,9],[2564,10],[3083,10]]},"273":{"position":[[536,9],[564,9],[885,10],[1541,10],[1925,9],[1953,9],[2384,10],[2906,10]]},"277":{"position":[[557,9],[585,9],[898,10],[1538,10],[1901,9],[1929,9],[2352,10],[2870,10]]},"281":{"position":[[527,9],[555,9],[864,10],[1496,10],[1888,9],[1916,9],[2335,10],[2851,10]]},"289":{"position":[[788,9],[816,9],[1131,10],[1775,10],[2164,9],[2192,9],[2617,10],[3136,10]]},"295":{"position":[[715,9],[743,9],[1060,10],[1967,10],[2421,9],[2449,9],[2876,10],[3396,10]]},"301":{"position":[[1028,9],[1056,9],[1369,10],[2009,10],[2454,9],[2482,9],[2905,10],[3423,10]]},"305":{"position":[[569,9],[597,9],[914,10],[1562,10],[2049,9],[2077,9],[2504,10],[3024,10]]},"317":{"position":[[546,9],[574,9],[893,10],[1545,10],[2021,9],[2049,9],[2478,10],[2999,10]]},"321":{"position":[[446,9],[474,9],[783,10],[1415,10],[1758,9],[1786,9],[2205,10],[2721,10]]},"329":{"position":[[482,9],[510,9],[837,10],[1505,10],[1868,9],[1896,9],[2333,10],[2858,10]]},"333":{"position":[[520,9],[548,9],[867,10],[1519,10],[1904,9],[1932,9],[2361,10],[2882,10]]},"341":{"position":[[1959,9],[1987,9],[2302,10],[3202,10],[3655,9],[3683,9],[4108,10],[4627,10]]},"345":{"position":[[664,9],[692,9],[1009,10],[1657,10],[2150,9],[2178,9],[2605,10],[3125,10]]},"351":{"position":[[286,9]]},"379":{"position":[[227,9]]},"385":{"position":[[36,9]]},"393":{"position":[[417,9],[445,9],[766,10],[1422,10],[1761,9],[1789,9],[2220,10],[2742,10]]},"492":{"position":[[565,9]]},"544":{"position":[[1163,10]]},"548":{"position":[[67,10]]}}}],["stub",{"_index":1387,"t":{"142":{"position":[[134,4],[272,4],[295,4],[413,4]]}}}],["style",{"_index":1270,"t":{"116":{"position":[[1944,5]]}}}],["su",{"_index":809,"t":{"55":{"position":[[2545,2]]},"59":{"position":[[1144,2]]}}}],["subdirectori",{"_index":2486,"t":{"343":{"position":[[3545,12]]}}}],["subhead",{"_index":1341,"t":{"132":{"position":[[559,9]]}}}],["submiss",{"_index":2080,"t":{"248":{"position":[[680,11]]},"257":{"position":[[505,10],[601,10]]}}}],["submit",{"_index":72,"t":{"9":{"position":[[32,6],[384,9]]},"109":{"position":[[2083,10]]},"244":{"position":[[214,6]]},"248":{"position":[[539,6],[655,6]]},"448":{"position":[[1393,10]]}}}],["subsequ",{"_index":2561,"t":{"361":{"position":[[90,10]]},"623":{"position":[[1059,10]]}}}],["subset",{"_index":2437,"t":{"341":{"position":[[230,6]]}}}],["subson",{"_index":666,"t":{"40":{"position":[[705,9]]},"125":{"position":[[856,8]]},"134":{"position":[[728,9]]},"172":{"position":[[2599,10]]},"313":{"position":[[64,8],[621,8]]},"315":{"position":[[38,8],[173,8],[279,8],[452,8],[544,8],[815,8]]},"317":{"position":[[485,8],[616,8],[825,8],[1167,8],[1249,8],[1477,8],[2235,8],[2429,8],[2950,8],[3484,10]]},"357":{"position":[[753,8],[1464,8],[2268,8]]},"395":{"position":[[169,8],[724,8]]},"401":{"position":[[243,8]]},"403":{"position":[[417,8]]},"406":{"position":[[309,8]]},"408":{"position":[[208,8]]},"410":{"position":[[241,8]]},"414":{"position":[[575,8]]},"530":{"position":[[1453,8],[1592,8]]},"557":{"position":[[1309,8]]},"575":{"position":[[503,8]]},"581":{"position":[[543,8]]},"584":{"position":[[179,8]]},"586":{"position":[[492,8]]},"596":{"position":[[428,8]]}}}],["subsonic.json",{"_index":2552,"t":{"357":{"position":[[775,13],[1486,13],[2290,13]]},"361":{"position":[[903,13],[1184,13]]},"401":{"position":[[265,13]]},"406":{"position":[[331,13]]},"408":{"position":[[230,13]]},"410":{"position":[[263,13]]},"414":{"position":[[597,13]]},"555":{"position":[[65,13],[366,13],[951,13]]},"579":{"position":[[382,13]]},"581":{"position":[[565,13]]},"584":{"position":[[201,13]]},"586":{"position":[[514,13]]}}}],["subsonic_en",{"_index":2335,"t":{"317":{"position":[[261,15]]}}}],["subsonic_id",{"_index":2333,"t":{"317":{"position":[[127,11],[214,11]]}}}],["subsonic_nam",{"_index":2334,"t":{"317":{"position":[[184,13]]}}}],["subsonic_password",{"_index":2337,"t":{"317":{"position":[[379,17]]}}}],["subsonic_transforms=musicbrainz",{"_index":3154,"t":{"557":{"position":[[1372,31]]}}}],["subsonic_transforms=n",{"_index":2740,"t":{"403":{"position":[[480,26]]}}}],["subsonic_url",{"_index":2338,"t":{"317":{"position":[[454,12]]}}}],["subsonic_us",{"_index":2336,"t":{"317":{"position":[[321,13]]}}}],["subsonic_user=myus",{"_index":2739,"t":{"403":{"position":[[448,20]]},"557":{"position":[[1340,20]]}}}],["subtract",{"_index":1856,"t":{"198":{"position":[[167,11]]}}}],["succe",{"_index":2682,"t":{"383":{"position":[[3262,8]]},"623":{"position":[[1013,8]]}}}],["succeed",{"_index":2656,"t":{"383":{"position":[[550,9],[589,9],[2607,9]]}}}],["success",{"_index":2505,"t":{"343":{"position":[[5365,7]]},"361":{"position":[[994,11],[1276,10]]},"590":{"position":[[744,10]]},"623":{"position":[[971,7]]}}}],["successfulli",{"_index":92,"t":{"9":{"position":[[371,12]]},"361":{"position":[[291,12]]},"524":{"position":[[632,12]]},"623":{"position":[[1364,12]]}}}],["succinctli",{"_index":2578,"t":{"363":{"position":[[1010,11]]}}}],["such",{"_index":174,"t":{"15":{"position":[[649,4]]},"222":{"position":[[1263,5],[2030,5]]},"242":{"position":[[1240,5],[2013,5]]},"283":{"position":[[106,4]]},"313":{"position":[[117,5],[397,5]]},"381":{"position":[[286,4]]},"385":{"position":[[396,4]]},"395":{"position":[[160,4]]},"450":{"position":[[501,5]]},"561":{"position":[[6516,5]]},"575":{"position":[[1104,4]]},"600":{"position":[[101,4]]}}}],["sudo",{"_index":833,"t":{"55":{"position":[[4135,4],[4541,4]]}}}],["suffici",{"_index":2037,"t":{"228":{"position":[[653,10]]},"248":{"position":[[411,10]]}}}],["suffix",{"_index":1879,"t":{"198":{"position":[[1961,8],[2123,8],[2319,6],[2518,8]]},"200":{"position":[[737,8]]},"621":{"position":[[88,6]]},"629":{"position":[[210,7]]}}}],["suggest",{"_index":1489,"t":{"154":{"position":[[1885,10],[3084,10]]},"568":{"position":[[1382,9],[1694,9]]}}}],["super",{"_index":1789,"t":{"190":{"position":[[479,5]]},"651":{"position":[[525,8]]},"653":{"position":[[968,8]]}}}],["super('coolplay",{"_index":3373,"t":{"640":{"position":[[713,19]]}}}],["superag",{"_index":2982,"t":{"482":{"position":[[1630,13],[1644,13]]},"646":{"position":[[1529,13],[2167,13]]},"648":{"position":[[1556,13]]},"651":{"position":[[352,13]]}}}],["suppli",{"_index":3249,"t":{"575":{"position":[[1793,8]]}}}],["support",{"_index":101,"t":{"11":{"position":[[198,7]]},"15":{"position":[[1814,7]]},"25":{"position":[[360,8]]},"36":{"position":[[367,7]]},"38":{"position":[[720,8],[1073,8],[1465,8]]},"87":{"position":[[439,7]]},"136":{"position":[[111,10]]},"140":{"position":[[665,8]]},"152":{"position":[[191,8]]},"166":{"position":[[167,7]]},"172":{"position":[[5170,7]]},"210":{"position":[[765,8],[1686,9]]},"220":{"position":[[397,7]]},"226":{"position":[[214,9],[267,8]]},"230":{"position":[[664,7]]},"255":{"position":[[669,7]]},"283":{"position":[[39,8]]},"297":{"position":[[93,8]]},"313":{"position":[[81,8],[361,8]]},"315":{"position":[[16,8],[194,7],[327,7],[592,7]]},"323":{"position":[[301,9],[393,9]]},"327":{"position":[[118,9]]},"343":{"position":[[58,9]]},"347":{"position":[[24,7]]},"363":{"position":[[51,7]]},"482":{"position":[[1456,9]]},"484":{"position":[[51,10]]},"530":{"position":[[1378,8],[1523,8]]},"573":{"position":[[712,7]]},"575":{"position":[[468,7]]},"579":{"position":[[284,8]]},"596":{"position":[[104,8],[552,8],[872,8],[914,8]]}}}],["support/multi",{"_index":2971,"t":{"482":{"position":[[1203,13]]}}}],["sure",{"_index":766,"t":{"55":{"position":[[1027,4]]},"87":{"position":[[640,4],[1091,4]]},"142":{"position":[[1201,4]]},"166":{"position":[[2651,4]]},"182":{"position":[[84,4]]},"196":{"position":[[3756,4]]},"204":{"position":[[403,4]]},"216":{"position":[[409,4]]},"275":{"position":[[981,4]]},"283":{"position":[[767,4]]},"343":{"position":[[4375,4],[4423,4]]},"442":{"position":[[173,4]]},"448":{"position":[[2318,4]]},"623":{"position":[[1246,4]]},"629":{"position":[[474,4]]}}}],["surfac",{"_index":3240,"t":{"573":{"position":[[219,7]]},"648":{"position":[[891,8]]},"653":{"position":[[3127,8]]}}}],["switch",{"_index":979,"t":{"67":{"position":[[1533,6],[2861,6]]},"81":{"position":[[1774,6],[3144,6]]},"85":{"position":[[1271,6],[2631,6]]},"91":{"position":[[1439,6],[2862,6]]},"99":{"position":[[1540,6],[2923,6]]},"103":{"position":[[1212,6],[2543,6]]},"107":{"position":[[1348,6],[2755,6]]},"114":{"position":[[2465,6],[3858,6]]},"121":{"position":[[1825,6],[3156,6]]},"144":{"position":[[1353,6],[2737,6]]},"164":{"position":[[1365,6],[2756,6]]},"168":{"position":[[1706,6],[3038,6]]},"200":{"position":[[1593,6],[3242,6]]},"206":{"position":[[1332,6],[2653,6]]},"208":{"position":[[4483,6],[6265,6]]},"212":{"position":[[1204,6],[2488,6]]},"218":{"position":[[1374,6],[2682,6]]},"232":{"position":[[1468,6],[2746,6]]},"236":{"position":[[1495,6],[3174,6]]},"238":{"position":[[1675,6],[3288,6]]},"257":{"position":[[1538,6],[2824,6]]},"261":{"position":[[1603,6],[3245,6]]},"265":{"position":[[1397,6],[3078,6]]},"269":{"position":[[1254,6],[2841,6]]},"273":{"position":[[1332,6],[2661,6]]},"277":{"position":[[1333,6],[2629,6]]},"281":{"position":[[1293,6],[2612,6]]},"289":{"position":[[1569,6],[2894,6]]},"295":{"position":[[1501,6],[3153,6]]},"301":{"position":[[1804,6],[3182,6]]},"305":{"position":[[1355,6],[2781,6]]},"317":{"position":[[1337,6],[2755,6]]},"321":{"position":[[1212,6],[2482,6]]},"329":{"position":[[1293,6],[2610,6]]},"333":{"position":[[1311,6],[2638,6]]},"341":{"position":[[2740,6],[4385,6]]},"345":{"position":[[1450,6],[2882,6]]},"393":{"position":[[1213,6],[2497,6]]},"470":{"position":[[2811,8]]},"642":{"position":[[650,6],[1246,6]]}}}],["symbol",{"_index":1636,"t":{"172":{"position":[[231,7]]}}}],["syntax",{"_index":852,"t":{"55":{"position":[[4969,6]]},"67":{"position":[[1237,6],[2729,6]]},"81":{"position":[[1478,6],[3012,6]]},"85":{"position":[[981,6],[2499,6]]},"91":{"position":[[1146,6],[2730,6]]},"99":{"position":[[1244,6],[2791,6]]},"103":{"position":[[919,6],[2411,6]]},"107":{"position":[[1037,6],[2623,6]]},"114":{"position":[[2169,6],[3726,6]]},"121":{"position":[[1532,6],[3024,6]]},"140":{"position":[[51,7]]},"144":{"position":[[1051,6],[2605,6]]},"164":{"position":[[1072,6],[2624,6]]},"168":{"position":[[1401,6],[2906,6]]},"200":{"position":[[1288,6],[3110,6]]},"204":{"position":[[126,6]]},"206":{"position":[[1045,6],[2521,6]]},"208":{"position":[[4184,6],[6133,6]]},"212":{"position":[[908,6],[2356,6]]},"216":{"position":[[128,6]]},"218":{"position":[[1081,6],[2550,6]]},"232":{"position":[[1160,6],[2614,6]]},"236":{"position":[[1202,6],[3042,6]]},"238":{"position":[[1385,6],[3156,6]]},"257":{"position":[[1233,6],[2692,6]]},"261":{"position":[[1307,6],[3113,6]]},"265":{"position":[[1086,6],[2946,6]]},"269":{"position":[[961,6],[2709,6]]},"271":{"position":[[233,7]]},"273":{"position":[[1030,6],[2529,6]]},"277":{"position":[[1043,6],[2497,6]]},"281":{"position":[[1009,6],[2480,6]]},"283":{"position":[[483,6]]},"289":{"position":[[1276,6],[2762,6]]},"295":{"position":[[1205,6],[3021,6]]},"301":{"position":[[1514,6],[3050,6]]},"305":{"position":[[1059,6],[2649,6]]},"317":{"position":[[1038,6],[2623,6]]},"321":{"position":[[928,6],[2350,6]]},"329":{"position":[[982,6],[2478,6]]},"333":{"position":[[1012,6],[2506,6]]},"341":{"position":[[2447,6],[4253,6]]},"345":{"position":[[1154,6],[2750,6]]},"365":{"position":[[620,7]]},"393":{"position":[[911,6],[2365,6]]},"440":{"position":[[243,7]]}}}],["system",{"_index":1368,"t":{"138":{"position":[[321,6]]},"275":{"position":[[86,8],[345,6]]},"297":{"position":[[71,6]]},"301":{"position":[[117,7]]},"375":{"position":[[66,7]]},"460":{"position":[[58,6]]},"476":{"position":[[2164,6]]},"501":{"position":[[11,6]]}}}],["systemctl",{"_index":3031,"t":{"505":{"position":[[24,9],[48,9],[96,9]]}}}],["systemd",{"_index":3011,"t":{"501":{"position":[[0,7]]}}}],["s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i",{"_index":2769,"t":{"421":{"position":[[371,45]]}}}],["s滾石40\\\\s滾石撞樂隊\\\\s40團拚經典(.+)$/i",{"_index":2768,"t":{"421":{"position":[[267,33]]}}}],["tab",{"_index":199,"t":{"15":{"position":[[1387,3],[3575,3],[6154,3]]},"65":{"position":[[241,4]]},"79":{"position":[[332,4]]},"158":{"position":[[387,4],[412,4],[638,4]]},"194":{"position":[[271,3],[300,3]]},"196":{"position":[[1171,4],[1768,4],[1963,4],[3124,3]]},"275":{"position":[[688,4]]},"327":{"position":[[160,3]]},"530":{"position":[[3349,3]]},"532":{"position":[[941,3]]},"536":{"position":[[79,3]]},"596":{"position":[[2866,3]]}}}],["tabl",{"_index":1071,"t":{"83":{"position":[[942,5]]}}}],["tablet/laptop/desktop",{"_index":983,"t":{"67":{"position":[[1888,21],[3252,21]]},"81":{"position":[[2129,21],[3535,21]]},"85":{"position":[[1624,21],[3020,21]]},"91":{"position":[[1793,21],[3252,21]]},"99":{"position":[[1895,21],[3314,21]]},"103":{"position":[[1566,21],[2933,21]]},"107":{"position":[[1708,21],[3151,21]]},"114":{"position":[[2820,21],[4249,21]]},"121":{"position":[[2179,21],[3546,21]]},"144":{"position":[[1710,21],[3130,21]]},"164":{"position":[[1719,21],[3146,21]]},"168":{"position":[[2064,21],[3432,21]]},"200":{"position":[[1951,21],[3636,21]]},"206":{"position":[[1684,21],[3041,21]]},"208":{"position":[[4839,21],[6657,21]]},"212":{"position":[[1559,21],[2879,21]]},"218":{"position":[[1728,21],[3072,21]]},"232":{"position":[[1827,21],[3141,21]]},"236":{"position":[[2105,21],[3564,21]]},"238":{"position":[[2281,21],[3677,21]]},"257":{"position":[[1896,21],[3218,21]]},"261":{"position":[[2217,21],[3636,21]]},"265":{"position":[[2031,21],[3474,21]]},"269":{"position":[[1864,21],[3231,21]]},"273":{"position":[[1689,21],[3054,21]]},"277":{"position":[[1686,21],[3018,21]]},"281":{"position":[[1644,21],[2999,21]]},"289":{"position":[[1923,21],[3284,21]]},"295":{"position":[[2115,21],[3544,21]]},"301":{"position":[[2157,21],[3571,21]]},"305":{"position":[[1710,21],[3172,21]]},"317":{"position":[[1693,21],[3147,21]]},"321":{"position":[[1563,21],[2869,21]]},"329":{"position":[[1653,21],[3006,21]]},"333":{"position":[[1667,21],[3030,21]]},"341":{"position":[[3350,21],[4775,21]]},"345":{"position":[[1805,21],[3273,21]]},"393":{"position":[[1570,21],[2890,21]]}}}],["tag",{"_index":639,"t":{"38":{"position":[[1528,5],[1833,7]]},"309":{"position":[[164,4]]},"347":{"position":[[352,4]]},"437":{"position":[[15,3]]},"482":{"position":[[53,3]]},"520":{"position":[[223,3]]},"522":{"position":[[13,4],[341,4],[456,4]]},"524":{"position":[[440,4]]},"573":{"position":[[769,6]]}}}],["tagged/organ",{"_index":3111,"t":{"544":{"position":[[401,16]]}}}],["tags/metadata",{"_index":2352,"t":{"319":{"position":[[1052,13]]}}}],["take",{"_index":1049,"t":{"75":{"position":[[1623,4]]},"83":{"position":[[411,4]]},"87":{"position":[[1461,4]]},"198":{"position":[[139,6]]},"343":{"position":[[4215,4]]},"476":{"position":[[2426,4]]},"538":{"position":[[503,4]]},"592":{"position":[[233,4]]},"644":{"position":[[53,4]]},"648":{"position":[[927,4],[1164,5]]},"653":{"position":[[2737,4]]}}}],["taken",{"_index":1360,"t":{"136":{"position":[[406,5]]},"140":{"position":[[733,5]]},"210":{"position":[[833,5]]}}}],["target",{"_index":693,"t":{"42":{"position":[[750,8]]}}}],["tautulli",{"_index":3477,"t":{"653":{"position":[[272,9],[1183,9]]}}}],["tbd",{"_index":2690,"t":{"387":{"position":[[64,5]]}}}],["tcp",{"_index":860,"t":{"55":{"position":[[5643,3],[5811,3],[5958,3],[6069,3],[7029,3],[7197,3],[7515,3],[7626,3],[7953,4],[9288,3],[9456,3],[9582,3],[9804,3]]},"275":{"position":[[1530,3],[1606,3]]},"279":{"position":[[35,3]]}}}],["teal",{"_index":1263,"t":{"116":{"position":[[1791,4],[1831,4]]},"121":{"position":[[2292,4],[3672,4]]},"341":{"position":[[3463,4],[4901,4]]}}}],["teal.fm",{"_index":19,"t":{"4":{"position":[[90,7]]},"116":{"position":[[79,7],[96,7],[1320,8],[1628,7],[1660,7],[1756,7],[1870,7],[1964,7]]},"125":{"position":[[905,7]]},"335":{"position":[[51,7],[68,7],[250,7],[364,7],[394,7]]},"337":{"position":[[37,7]]},"339":{"position":[[8,7]]},"341":{"position":[[96,8]]},"596":{"position":[[483,7],[661,7]]}}}],["teal.fm'",{"_index":1260,"t":{"116":{"position":[[1163,9],[1221,9]]}}}],["tealfm",{"_index":1286,"t":{"121":{"position":[[1114,6],[1321,6],[1661,6],[1741,6],[1965,6],[2640,6],[2832,6],[3351,6],[3804,8]]},"341":{"position":[[2029,6],[2236,6],[2576,6],[2656,6],[2845,6],[2984,6],[3045,6],[3136,6],[3869,6],[4061,6],[4580,6],[5091,8]]},"579":{"position":[[318,7]]},"588":{"position":[[183,7]]}}}],["tealfm.json",{"_index":2445,"t":{"341":{"position":[[819,11],[1028,11],[1258,11]]}}}],["tealfm_app_pw",{"_index":1285,"t":{"121":{"position":[[947,13]]}}}],["tealfm_en",{"_index":1283,"t":{"121":{"position":[[831,13]]}}}],["tealfm_id",{"_index":1281,"t":{"121":{"position":[[703,9],[786,9]]}}}],["tealfm_identifi",{"_index":1284,"t":{"121":{"position":[[889,17]]}}}],["tealfm_nam",{"_index":1282,"t":{"121":{"position":[[758,11]]}}}],["team",{"_index":1847,"t":{"196":{"position":[[3366,4]]},"568":{"position":[[1558,7]]}}}],["teamid",{"_index":1850,"t":{"196":{"position":[[3525,9]]},"200":{"position":[[2150,9],[3844,9]]}}}],["technic",{"_index":2884,"t":{"470":{"position":[[956,11]]},"653":{"position":[[3777,11]]}}}],["techniqu",{"_index":1633,"t":{"172":{"position":[[30,10],[121,10],[3553,10],[4739,10]]}}}],["tell",{"_index":2035,"t":{"228":{"position":[[510,4]]},"248":{"position":[[278,4]]},"466":{"position":[[115,4]]},"638":{"position":[[82,4]]},"640":{"position":[[931,5]]},"642":{"position":[[112,4]]},"651":{"position":[[553,4]]},"653":{"position":[[996,4]]}}}],["templat",{"_index":1574,"t":{"166":{"position":[[353,8]]},"499":{"position":[[275,8],[374,8]]}}}],["tempor",{"_index":44,"t":{"7":{"position":[[360,8]]},"172":{"position":[[2274,10],[4621,8]]}}}],["temporari",{"_index":1813,"t":{"196":{"position":[[300,9]]}}}],["temporarili",{"_index":2540,"t":{"353":{"position":[[79,11],[317,11]]}}}],["tend",{"_index":2323,"t":{"313":{"position":[[532,4]]}}}],["term",{"_index":1215,"t":{"109":{"position":[[1616,5]]},"116":{"position":[[1610,5]]},"190":{"position":[[1451,5]]},"303":{"position":[[1842,5]]},"351":{"position":[[268,5]]},"355":{"position":[[209,5]]},"566":{"position":[[1262,6]]}}}],["termin",{"_index":2934,"t":{"476":{"position":[[2074,9]]}}}],["test",{"_index":883,"t":{"55":{"position":[[8805,6]]},"172":{"position":[[4915,6],[4941,7]]},"343":{"position":[[4360,9]]},"363":{"position":[[77,7],[339,4],[429,4]]},"377":{"position":[[144,5],[261,5]]},"383":{"position":[[1941,4]]},"522":{"position":[[541,8]]},"638":{"position":[[392,4]]},"646":{"position":[[2052,4],[2095,4]]}}}],["text",{"_index":339,"t":{"19":{"position":[[311,4],[371,4]]},"67":{"position":[[1103,4],[1543,4],[1566,4],[2595,4],[2871,4],[2894,4]]},"81":{"position":[[1344,4],[1784,4],[1807,4],[2878,4],[3154,4],[3177,4]]},"85":{"position":[[847,4],[1281,4],[1304,4],[2365,4],[2641,4],[2664,4]]},"91":{"position":[[1012,4],[1449,4],[1472,4],[2596,4],[2872,4],[2895,4]]},"99":{"position":[[1110,4],[1550,4],[1573,4],[2657,4],[2933,4],[2956,4]]},"103":{"position":[[785,4],[1222,4],[1245,4],[2277,4],[2553,4],[2576,4]]},"107":{"position":[[903,4],[1358,4],[1381,4],[2489,4],[2765,4],[2788,4]]},"114":{"position":[[2035,4],[2475,4],[2498,4],[3592,4],[3868,4],[3891,4]]},"121":{"position":[[1398,4],[1835,4],[1858,4],[2890,4],[3166,4],[3189,4]]},"144":{"position":[[917,4],[1363,4],[1386,4],[2471,4],[2747,4],[2770,4]]},"158":{"position":[[491,4]]},"164":{"position":[[938,4],[1375,4],[1398,4],[2490,4],[2766,4],[2789,4]]},"168":{"position":[[1267,4],[1716,4],[1739,4],[2772,4],[3048,4],[3071,4]]},"172":{"position":[[74,4],[148,4],[596,4]]},"196":{"position":[[1589,4],[2296,4]]},"200":{"position":[[1154,4],[1603,4],[1626,4],[2976,4],[3252,4],[3275,4]]},"206":{"position":[[911,4],[1342,4],[1365,4],[2387,4],[2663,4],[2686,4]]},"208":{"position":[[4050,4],[4493,4],[4516,4],[5999,4],[6275,4],[6298,4]]},"212":{"position":[[774,4],[1214,4],[1237,4],[2222,4],[2498,4],[2521,4]]},"218":{"position":[[947,4],[1384,4],[1407,4],[2416,4],[2692,4],[2715,4]]},"232":{"position":[[1026,4],[1478,4],[1501,4],[2480,4],[2756,4],[2779,4]]},"236":{"position":[[1068,4],[1505,4],[1528,4],[2908,4],[3184,4],[3207,4]]},"238":{"position":[[1251,4],[1685,4],[1708,4],[3022,4],[3298,4],[3321,4]]},"257":{"position":[[1099,4],[1548,4],[1571,4],[2558,4],[2834,4],[2857,4]]},"261":{"position":[[1173,4],[1613,4],[1636,4],[2979,4],[3255,4],[3278,4]]},"265":{"position":[[952,4],[1407,4],[1430,4],[2812,4],[3088,4],[3111,4]]},"269":{"position":[[827,4],[1264,4],[1287,4],[2575,4],[2851,4],[2874,4]]},"273":{"position":[[896,4],[1342,4],[1365,4],[2395,4],[2671,4],[2694,4]]},"277":{"position":[[909,4],[1343,4],[1366,4],[2363,4],[2639,4],[2662,4]]},"281":{"position":[[875,4],[1303,4],[1326,4],[2346,4],[2622,4],[2645,4]]},"289":{"position":[[1142,4],[1579,4],[1602,4],[2628,4],[2904,4],[2927,4]]},"295":{"position":[[1071,4],[1511,4],[1534,4],[2887,4],[3163,4],[3186,4]]},"301":{"position":[[1380,4],[1814,4],[1837,4],[2916,4],[3192,4],[3215,4]]},"305":{"position":[[925,4],[1365,4],[1388,4],[2515,4],[2791,4],[2814,4]]},"317":{"position":[[904,4],[1347,4],[1370,4],[2489,4],[2765,4],[2788,4]]},"321":{"position":[[794,4],[1222,4],[1245,4],[2216,4],[2492,4],[2515,4]]},"329":{"position":[[848,4],[1303,4],[1326,4],[2344,4],[2620,4],[2643,4]]},"333":{"position":[[878,4],[1321,4],[1344,4],[2372,4],[2648,4],[2671,4]]},"341":{"position":[[2313,4],[2750,4],[2773,4],[4119,4],[4395,4],[4418,4]]},"345":{"position":[[1020,4],[1460,4],[1483,4],[2616,4],[2892,4],[2915,4]]},"393":{"position":[[777,4],[1223,4],[1246,4],[2231,4],[2507,4],[2530,4]]},"492":{"position":[[397,4],[622,4]]},"503":{"position":[[160,4]]},"532":{"position":[[725,4]]},"534":{"position":[[458,4]]},"557":{"position":[[759,4],[854,4]]},"561":{"position":[[2416,4],[2862,4],[5918,4],[5971,4],[6051,4],[6120,4],[6371,4],[6933,4]]},"568":{"position":[[2504,4],[2567,4],[2631,4]]},"592":{"position":[[177,4],[215,4]]}}}],["textbox",{"_index":2345,"t":{"319":{"position":[[326,7]]}}}],["thank",{"_index":3004,"t":{"492":{"position":[[752,5]]}}}],["theme",{"_index":2588,"t":{"365":{"position":[[800,5]]}}}],["themself",{"_index":3137,"t":{"551":{"position":[[67,8]]}}}],["therefor",{"_index":1980,"t":{"210":{"position":[[577,10]]},"470":{"position":[[800,10]]},"575":{"position":[[1849,10]]}}}],["these",{"_index":1333,"t":{"128":{"position":[[874,6]]}}}],["thing",{"_index":2015,"t":{"222":{"position":[[79,7]]},"242":{"position":[[79,7]]},"470":{"position":[[2702,6]]}}}],["think",{"_index":1788,"t":{"190":{"position":[[331,6]]},"230":{"position":[[7,5]]},"255":{"position":[[7,5]]},"361":{"position":[[675,5]]},"566":{"position":[[270,5]]}}}],["third",{"_index":1525,"t":{"160":{"position":[[0,5]]},"331":{"position":[[82,5]]}}}],["this.baseurl",{"_index":3431,"t":{"646":{"position":[[1149,12]]}}}],["this.canbacklog",{"_index":3473,"t":{"651":{"position":[[611,15]]}}}],["this.canpol",{"_index":3376,"t":{"640":{"position":[[1000,12]]}}}],["this.config",{"_index":3425,"t":{"646":{"position":[[830,12]]}}}],["this.config.token",{"_index":3444,"t":{"646":{"position":[[2449,23]]},"648":{"position":[[2024,23]]},"651":{"position":[[835,23]]}}}],["this.configdir}/currentcr",{"_index":2666,"t":{"383":{"position":[[1346,30]]}}}],["this.discover([someplay",{"_index":3491,"t":{"653":{"position":[[3070,26],[3603,26]]}}}],["this.emitt",{"_index":3399,"t":{"642":{"position":[[1418,14]]}}}],["this.logger.verbose(`config",{"_index":3435,"t":{"646":{"position":[[1294,27]]}}}],["this.playersourceoftruth",{"_index":3480,"t":{"653":{"position":[[1084,24]]}}}],["this.processrecentplays(play",{"_index":3470,"t":{"648":{"position":[[2786,31]]}}}],["this.requiresauth",{"_index":3374,"t":{"640":{"position":[[806,17]]}}}],["this.requiresauthinteract",{"_index":3375,"t":{"640":{"position":[[890,28]]}}}],["this.scrobble(discov",{"_index":3496,"t":{"653":{"position":[[3677,26]]}}}],["this.url.tostr",{"_index":3436,"t":{"646":{"position":[[1353,27]]}}}],["thorough",{"_index":2888,"t":{"470":{"position":[[1330,8]]}}}],["those",{"_index":1934,"t":{"208":{"position":[[970,5]]},"210":{"position":[[1705,5]]},"397":{"position":[[971,5]]},"561":{"position":[[2835,5]]},"568":{"position":[[444,5]]}}}],["though",{"_index":2379,"t":{"323":{"position":[[785,7]]},"359":{"position":[[828,7]]},"452":{"position":[[933,6]]},"490":{"position":[[190,7]]}}}],["thousand",{"_index":576,"t":{"29":{"position":[[3849,9],[3906,9]]}}}],["thread",{"_index":1537,"t":{"160":{"position":[[655,6]]}}}],["three",{"_index":1463,"t":{"152":{"position":[[296,5],[412,5]]},"343":{"position":[[3459,5]]},"361":{"position":[[168,5]]},"561":{"position":[[3370,5]]}}}],["threshold",{"_index":1299,"t":{"125":{"position":[[68,10]]},"128":{"position":[[1011,11]]},"134":{"position":[[1009,10],[1044,11]]},"138":{"position":[[11,9],[162,10]]},"172":{"position":[[3712,9]]},"210":{"position":[[1375,9],[1577,11]]},"391":{"position":[[89,9],[228,10]]},"653":{"position":[[178,9]]}}}],["through",{"_index":212,"t":{"15":{"position":[[1842,7]]},"19":{"position":[[758,7]]},"55":{"position":[[393,7]]},"128":{"position":[[498,7]]},"168":{"position":[[147,7]]},"285":{"position":[[74,7]]},"297":{"position":[[485,7],[575,7],[665,7],[953,7]]},"309":{"position":[[283,7]]},"323":{"position":[[711,7],[728,7]]},"510":{"position":[[362,7]]},"596":{"position":[[1208,7],[1240,7]]},"640":{"position":[[988,7]]},"648":{"position":[[2593,7]]}}}],["through/to",{"_index":3316,"t":{"631":{"position":[[170,11]]}}}],["throw",{"_index":365,"t":{"19":{"position":[[1396,5]]},"190":{"position":[[57,5]]},"194":{"position":[[564,8]]},"383":{"position":[[477,6],[664,5],[2757,5],[2881,5]]},"646":{"position":[[942,5],[1095,5],[1224,5],[2037,5],[2582,5],[2615,5]]},"648":{"position":[[2558,5]]},"651":{"position":[[1064,5]]}}}],["thrown",{"_index":3294,"t":{"621":{"position":[[1295,7]]}}}],["thu",{"_index":1963,"t":{"208":{"position":[[3531,4]]}}}],["time",{"_index":31,"t":{"7":{"position":[[203,4]]},"9":{"position":[[152,5]]},"25":{"position":[[121,4]]},"29":{"position":[[1202,5],[4060,5]]},"69":{"position":[[978,4],[1230,4],[1374,4]]},"75":{"position":[[1845,4]]},"81":{"position":[[949,4]]},"87":{"position":[[337,5],[1123,6]]},"128":{"position":[[710,4],[929,4]]},"134":{"position":[[1240,4]]},"156":{"position":[[161,5]]},"160":{"position":[[92,5],[519,4]]},"166":{"position":[[1507,5]]},"172":{"position":[[2747,4],[2789,4],[2952,4],[3477,4],[4522,5],[4551,4]]},"174":{"position":[[527,6]]},"177":{"position":[[159,4],[253,5]]},"190":{"position":[[1186,4]]},"198":{"position":[[130,5],[158,4],[633,5]]},"297":{"position":[[1793,4]]},"303":{"position":[[237,4],[312,4]]},"315":{"position":[[721,4]]},"331":{"position":[[53,5]]},"341":{"position":[[337,5]]},"343":{"position":[[148,4],[1688,4]]},"347":{"position":[[174,5]]},"353":{"position":[[666,5]]},"383":{"position":[[1583,4]]},"448":{"position":[[868,5]]},"454":{"position":[[870,5]]},"470":{"position":[[1122,4],[3239,4]]},"488":{"position":[[28,4]]},"492":{"position":[[771,5]]},"540":{"position":[[591,4]]},"623":{"position":[[900,4]]},"648":{"position":[[1243,5]]}}}],["timeout",{"_index":2850,"t":{"452":{"position":[[439,7]]}}}],["timerang",{"_index":1717,"t":{"172":{"position":[[4077,9]]}}}],["timestamp",{"_index":36,"t":{"7":{"position":[[248,9],[393,9],[430,9]]},"87":{"position":[[286,11],[843,9],[962,9]]},"172":{"position":[[2165,10],[2305,9],[2391,10],[2437,10],[2901,9],[3003,9],[3115,11]]},"198":{"position":[[0,9],[59,10],[387,11]]},"635":{"position":[[476,9]]},"644":{"position":[[896,9]]},"648":{"position":[[850,9]]},"651":{"position":[[134,9]]},"653":{"position":[[2424,9]]}}}],["timezon",{"_index":1417,"t":{"150":{"position":[[623,8]]},"154":{"position":[[756,8]]},"476":{"position":[[28,8],[1450,8],[1589,8]]},"478":{"position":[[596,8]]},"528":{"position":[[260,8]]}}}],["tip",{"_index":144,"t":{"13":{"position":[[0,3]]},"15":{"position":[[1934,3],[3965,3]]},"50":{"position":[[225,3]]},"69":{"position":[[244,3]]},"83":{"position":[[1467,3]]},"147":{"position":[[389,3]]},"174":{"position":[[281,3],[1043,3]]},"196":{"position":[[3693,3]]},"325":{"position":[[514,3]]},"361":{"position":[[594,3]]},"375":{"position":[[74,3]]},"472":{"position":[[0,3]]},"478":{"position":[[0,3]]},"482":{"position":[[2314,3]]},"512":{"position":[[411,3]]},"524":{"position":[[562,3]]},"538":{"position":[[1115,3]]},"540":{"position":[[0,3]]},"544":{"position":[[1502,3],[1619,3]]},"561":{"position":[[4346,3]]},"623":{"position":[[0,3]]},"625":{"position":[[91,3]]}}}],["titl",{"_index":41,"t":{"7":{"position":[[334,6]]},"172":{"position":[[169,7],[1277,7],[4497,6]]},"190":{"position":[[219,6],[1205,6]]},"319":{"position":[[1125,6],[1430,5],[1712,5]]},"347":{"position":[[130,6],[458,5],[543,5],[574,5],[598,5]]},"357":{"position":[[1408,5],[1441,9],[2520,8]]},"359":{"position":[[126,6],[202,8],[256,5]]},"363":{"position":[[845,8],[881,5],[1072,6]]},"365":{"position":[[785,5]]},"395":{"position":[[579,5],[735,8],[869,8]]},"397":{"position":[[604,5],[679,8],[778,5],[868,5],[982,6],[1548,8],[1660,9]]},"399":{"position":[[153,8],[207,5]]},"410":{"position":[[61,6],[136,5],[393,8],[425,5]]},"412":{"position":[[268,6]]},"414":{"position":[[271,8],[725,8],[766,5]]},"418":{"position":[[209,8],[246,5],[291,5],[418,7]]},"421":{"position":[[72,8],[212,5],[236,8]]},"423":{"position":[[44,5],[86,8]]},"425":{"position":[[54,8],[117,8]]},"555":{"position":[[523,8],[577,5]]},"561":{"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]]},"568":{"position":[[1477,6],[2561,5],[3036,5]]},"573":{"position":[[248,5]]},"575":{"position":[[190,5],[588,5],[638,8],[827,6],[836,8]]},"579":{"position":[[533,8]]},"588":{"position":[[687,8]]}}}],["title.mp4",{"_index":2358,"t":{"319":{"position":[[1772,9]]}}}],["title/album",{"_index":3176,"t":{"561":{"position":[[3951,11],[5026,11],[5816,11]]}}}],["title/artist/album/listen",{"_index":2532,"t":{"349":{"position":[[307,28],[688,28]]}}}],["title>.+?)\\\\.\\\\w+$/i",{"_index":2360,"t":{"319":{"position":[[1806,24]]}}}],["titleonli",{"_index":2554,"t":{"357":{"position":[[1336,12],[1801,11]]}}}],["titles/artist",{"_index":3183,"t":{"561":{"position":[[6473,14]]}}}],["titleweight",{"_index":3236,"t":{"568":{"position":[[2592,14]]},"592":{"position":[[1241,14]]}}}],["tld",{"_index":1231,"t":{"114":{"position":[[94,4],[344,3]]},"121":{"position":[[176,3],[490,3]]}}}],["tldr",{"_index":1037,"t":{"75":{"position":[[287,4]]},"351":{"position":[[245,5]]},"353":{"position":[[961,4]]}}}],["tmp:noexec",{"_index":2941,"t":{"476":{"position":[[2342,11]]}}}],["tmpf",{"_index":2939,"t":{"476":{"position":[[2321,6]]}}}],["tmt_yxr90am",{"_index":2907,"t":{"470":{"position":[[2054,13]]}}}],["to",{"_index":709,"t":{"46":{"position":[[140,3]]},"48":{"position":[[191,3]]},"55":{"position":[[811,3]]},"72":{"position":[[128,3]]},"156":{"position":[[107,4]]}}}],["to/from",{"_index":859,"t":{"55":{"position":[[5624,7],[7010,7],[9269,7]]}}}],["toggl",{"_index":1377,"t":{"140":{"position":[[674,8]]},"210":{"position":[[774,8]]},"253":{"position":[[225,6]]},"381":{"position":[[515,7]]}}}],["token",{"_index":306,"t":{"15":{"position":[[5408,8]]},"38":{"position":[[501,8],[916,8]]},"48":{"position":[[222,5]]},"69":{"position":[[602,5]]},"72":{"position":[[32,5],[99,5],[193,5],[379,5],[588,5],[636,5],[687,5],[765,5],[901,5],[978,5],[1099,7]]},"75":{"position":[[922,8],[2018,8]]},"81":{"position":[[284,5],[2277,8],[3695,8]]},"85":{"position":[[375,5],[1784,8],[3194,8]]},"105":{"position":[[365,5]]},"107":{"position":[[420,5],[1890,8],[3340,8]]},"111":{"position":[[152,6],[210,5]]},"114":{"position":[[701,6],[930,5],[1484,5],[1532,6],[2991,8],[4432,8]]},"150":{"position":[[1885,8],[1984,8],[2411,8],[2908,8],[2999,8],[3424,8]]},"152":{"position":[[1049,8],[1615,8],[2279,8],[2888,8]]},"154":{"position":[[2659,8],[3855,8]]},"172":{"position":[[640,8],[673,6],[725,6]]},"192":{"position":[[230,6],[263,5],[326,5]]},"194":{"position":[[426,5],[482,5],[666,6]]},"196":{"position":[[68,5],[181,5],[224,5],[310,5],[589,7],[641,5],[751,5],[915,5],[975,5],[1663,5],[2355,6],[2454,8],[2543,5],[3111,5],[3185,5],[3677,5]]},"200":{"position":[[2267,8],[2286,5],[2334,5],[3961,8],[3980,5],[4028,5]]},"238":{"position":[[772,5],[2441,8],[3851,8]]},"242":{"position":[[241,6],[286,6],[508,6],[542,5],[917,5],[957,5],[1301,5],[1624,6],[1645,5],[2087,5],[2510,6],[2577,6],[2632,8],[2684,6],[2716,5],[2786,6]]},"246":{"position":[[52,5],[161,5],[279,6]]},"248":{"position":[[110,5],[222,6],[384,5]]},"253":{"position":[[191,5],[204,5]]},"257":{"position":[[353,7],[538,5],[2054,8],[3385,8]]},"263":{"position":[[465,5]]},"265":{"position":[[462,5],[2213,8],[3663,8]]},"295":{"position":[[2286,8],[3727,8]]},"303":{"position":[[2213,6]]},"307":{"position":[[15,5],[230,5],[770,5],[972,5],[1262,5]]},"331":{"position":[[922,5],[1152,5]]},"383":{"position":[[3079,5],[3219,5]]},"530":{"position":[[1809,5],[1994,5],[2512,5],[2525,5],[2581,5]]},"621":{"position":[[484,8],[799,8]]},"635":{"position":[[365,5]]},"638":{"position":[[607,5],[680,6],[742,6]]},"642":{"position":[[774,6]]},"646":{"position":[[152,5],[811,6],[846,6],[865,5],[896,5],[2442,6]]},"648":{"position":[[2017,6]]},"651":{"position":[[828,6]]}}}],["token.trim",{"_index":3427,"t":{"646":{"position":[[918,12]]}}}],["toler",{"_index":3184,"t":{"561":{"position":[[6555,8]]}}}],["tool",{"_index":1514,"t":{"158":{"position":[[350,5],[614,5]]},"194":{"position":[[209,5]]},"196":{"position":[[1103,5],[1706,6]]},"214":{"position":[[137,5]]},"319":{"position":[[96,5]]},"653":{"position":[[77,4]]}}}],["top",{"_index":607,"t":{"33":{"position":[[347,3]]},"38":{"position":[[257,3]]},"196":{"position":[[1201,3]]},"198":{"position":[[910,5],[951,3],[1019,4],[1028,3],[1185,4]]},"357":{"position":[[75,3]]},"470":{"position":[[1181,3]]},"524":{"position":[[157,3]]},"532":{"position":[[1713,3]]},"536":{"position":[[851,3]]},"568":{"position":[[3084,3],[3120,3]]},"573":{"position":[[143,3]]},"621":{"position":[[329,3],[613,3]]},"631":{"position":[[706,3]]}}}],["topic",{"_index":315,"t":{"15":{"position":[[5576,8]]},"38":{"position":[[1265,8]]}}}],["touch",{"_index":3020,"t":{"503":{"position":[[102,5]]}}}],["toward",{"_index":3152,"t":{"557":{"position":[[869,7]]},"592":{"position":[[1184,7]]}}}],["trace",{"_index":58,"t":{"7":{"position":[[615,5]]}}}],["track",{"_index":94,"t":{"11":{"position":[[49,6],[793,5]]},"109":{"position":[[103,8],[1821,5]]},"123":{"position":[[58,6]]},"128":{"position":[[841,6],[911,5],[973,5],[1070,5],[1202,7]]},"130":{"position":[[44,5],[76,5]]},"134":{"position":[[780,5],[950,5],[1195,5],[1256,5]]},"138":{"position":[[56,5]]},"160":{"position":[[81,5],[493,6],[617,6]]},"166":{"position":[[1930,5],[2489,9],[2519,5],[2788,8],[2945,8],[3233,5]]},"172":{"position":[[1271,5],[3069,5]]},"190":{"position":[[655,5],[774,5],[862,5],[1049,5],[1199,5]]},"198":{"position":[[79,6],[179,5],[222,5],[280,5],[583,7],[679,5],[955,5],[1032,5],[1234,6],[1469,8],[1604,7]]},"208":{"position":[[2500,5]]},"210":{"position":[[121,5],[487,7],[1409,5]]},"220":{"position":[[474,6]]},"238":{"position":[[89,6]]},"263":{"position":[[96,6]]},"275":{"position":[[276,6]]},"283":{"position":[[174,6]]},"285":{"position":[[253,6],[441,5]]},"287":{"position":[[58,5],[277,6],[407,5],[456,6],[471,6],[543,6],[558,6]]},"289":{"position":[[449,6],[559,6]]},"291":{"position":[[78,8],[234,6]]},"297":{"position":[[303,6]]},"303":{"position":[[150,5],[186,5]]},"311":{"position":[[41,6]]},"315":{"position":[[869,5]]},"319":{"position":[[2005,5]]},"335":{"position":[[313,6]]},"343":{"position":[[444,7]]},"353":{"position":[[760,5],[954,6]]},"359":{"position":[[581,6]]},"365":{"position":[[1112,6]]},"385":{"position":[[70,7],[140,5],[184,6],[207,5],[236,5],[437,6],[476,6],[571,5]]},"391":{"position":[[134,5]]},"397":{"position":[[862,5],[1470,5]]},"410":{"position":[[55,5],[94,5]]},"414":{"position":[[760,5]]},"462":{"position":[[288,6]]},"466":{"position":[[196,5],[265,5],[345,5],[386,5],[413,8]]},"470":{"position":[[819,6],[1013,5],[1099,5]]},"540":{"position":[[554,6]]},"542":{"position":[[547,5]]},"544":{"position":[[649,6]]},"546":{"position":[[46,6]]},"561":{"position":[[2063,5],[2124,5],[3765,5]]},"566":{"position":[[437,5]]},"568":{"position":[[1436,5],[1515,8]]},"596":{"position":[[2069,5],[2198,7]]},"598":{"position":[[128,6]]},"635":{"position":[[462,6],[586,6],[616,6]]},"638":{"position":[[2025,5],[2152,5]]},"644":{"position":[[62,5],[566,5],[813,6]]},"648":{"position":[[303,5],[417,5],[1072,5],[1393,5],[2158,5],[2223,5],[2625,5],[2687,5]]},"651":{"position":[[45,6],[116,5],[156,5],[593,6],[897,5]]},"653":{"position":[[423,5],[711,5],[1051,6],[2241,5],[2409,5],[2635,5],[2902,5],[3172,7],[3931,5]]}}}],["track'",{"_index":1356,"t":{"134":{"position":[[1645,7]]},"315":{"position":[[735,7]]}}}],["track.scrobbl",{"_index":2032,"t":{"226":{"position":[[512,14]]}}}],["track.updatenowplay",{"_index":2033,"t":{"226":{"position":[[530,22]]}}}],["track/artist/album",{"_index":1783,"t":{"188":{"position":[[387,18]]}}}],["track/artists/album",{"_index":425,"t":{"23":{"position":[[518,21]]}}}],["track/device/servic",{"_index":2218,"t":{"297":{"position":[[1750,20]]}}}],["track/record",{"_index":3158,"t":{"561":{"position":[[134,15]]}}}],["track/song",{"_index":3191,"t":{"566":{"position":[[81,11]]}}}],["track/title/album",{"_index":3246,"t":{"575":{"position":[[1545,17]]}}}],["tracknam",{"_index":3409,"t":{"644":{"position":[[692,10],[820,10]]}}}],["tracks/play",{"_index":3460,"t":{"648":{"position":[[1907,13]]}}}],["trade",{"_index":1532,"t":{"160":{"position":[[444,5]]}}}],["traffic",{"_index":858,"t":{"55":{"position":[[5608,7],[5795,7],[6994,7],[7181,7],[9253,7],[9440,7]]},"166":{"position":[[939,7]]}}}],["tranform",{"_index":2733,"t":{"397":{"position":[[1080,10]]}}}],["transform",{"_index":253,"t":{"15":{"position":[[3840,12]]},"23":{"position":[[296,10],[307,9],[449,9],[581,9],[613,9],[804,16]]},"25":{"position":[[248,10]]},"29":{"position":[[294,10],[970,10],[1913,9],[1963,11],[2186,9],[3067,10],[3169,11]]},"154":{"position":[[140,11],[1738,11],[1956,15],[3155,15]]},"172":{"position":[[2085,11],[2151,9]]},"188":{"position":[[135,9],[300,9]]},"198":{"position":[[2588,15]]},"204":{"position":[[602,9],[732,11]]},"216":{"position":[[610,9],[742,11]]},"222":{"position":[[1276,12],[2043,12]]},"242":{"position":[[1253,12],[2026,12]]},"283":{"position":[[911,9],[1043,11]]},"311":{"position":[[750,15],[1227,15]]},"353":{"position":[[518,11]]},"357":{"position":[[85,12],[490,15],[991,11],[1170,15],[2005,15]]},"359":{"position":[[61,14],[999,11],[1144,14]]},"361":{"position":[[436,14]]},"363":{"position":[[257,14]]},"365":{"position":[[27,15],[170,11],[311,11],[707,10],[740,9]]},"368":{"position":[[105,10],[274,9]]},"385":{"position":[[621,9]]},"391":{"position":[[540,11]]},"395":{"position":[[845,11]]},"397":{"position":[[1185,10]]},"399":{"position":[[56,11]]},"406":{"position":[[46,15]]},"408":{"position":[[46,15]]},"414":{"position":[[199,15]]},"418":{"position":[[469,12]]},"551":{"position":[[226,15],[795,15]]},"553":{"position":[[146,15]]},"555":{"position":[[289,11]]},"571":{"position":[[63,9]]},"584":{"position":[[46,15]]},"586":{"position":[[134,15]]},"588":{"position":[[323,15]]},"590":{"position":[[231,15]]},"592":{"position":[[455,15]]},"594":{"position":[[509,15],[1088,15]]},"638":{"position":[[2002,9]]},"648":{"position":[[2253,9]]},"651":{"position":[[946,10]]}}}],["tray",{"_index":2131,"t":{"275":{"position":[[136,4]]}}}],["treat",{"_index":1032,"t":{"72":{"position":[[620,5]]},"222":{"position":[[1243,7],[1442,7],[2010,7],[2339,7]]},"242":{"position":[[1220,7],[1423,7],[1993,7],[2325,7]]}}}],["tree",{"_index":970,"t":{"67":{"position":[[1146,4],[2638,4]]},"81":{"position":[[1387,4],[2921,4]]},"85":{"position":[[890,4],[2408,4]]},"91":{"position":[[1055,4],[2639,4]]},"99":{"position":[[1153,4],[2700,4]]},"103":{"position":[[828,4],[2320,4]]},"107":{"position":[[946,4],[2532,4]]},"114":{"position":[[2078,4],[3635,4]]},"121":{"position":[[1441,4],[2933,4]]},"144":{"position":[[960,4],[2514,4]]},"164":{"position":[[981,4],[2533,4]]},"168":{"position":[[1310,4],[2815,4]]},"200":{"position":[[1197,4],[3019,4]]},"206":{"position":[[954,4],[2430,4]]},"208":{"position":[[4093,4],[6042,4]]},"212":{"position":[[817,4],[2265,4]]},"218":{"position":[[990,4],[2459,4]]},"232":{"position":[[1069,4],[2523,4]]},"236":{"position":[[1111,4],[2951,4]]},"238":{"position":[[1294,4],[3065,4]]},"257":{"position":[[1142,4],[2601,4]]},"261":{"position":[[1216,4],[3022,4]]},"265":{"position":[[995,4],[2855,4]]},"269":{"position":[[870,4],[2618,4]]},"273":{"position":[[939,4],[2438,4]]},"277":{"position":[[952,4],[2406,4]]},"281":{"position":[[918,4],[2389,4]]},"289":{"position":[[1185,4],[2671,4]]},"295":{"position":[[1114,4],[2930,4]]},"301":{"position":[[1423,4],[2959,4]]},"305":{"position":[[968,4],[2558,4]]},"317":{"position":[[947,4],[2532,4]]},"321":{"position":[[837,4],[2259,4]]},"329":{"position":[[891,4],[2387,4]]},"333":{"position":[[921,4],[2415,4]]},"341":{"position":[[2356,4],[4162,4]]},"345":{"position":[[1063,4],[2659,4]]},"393":{"position":[[820,4],[2274,4]]}}}],["tri",{"_index":387,"t":{"21":{"position":[[300,3]]},"55":{"position":[[6711,3],[8587,3],[8878,3],[10103,3]]},"65":{"position":[[2542,3],[2703,3],[3003,3],[3263,3]]},"79":{"position":[[2717,3],[2878,3],[3178,3],[3438,3]]},"188":{"position":[[65,3]]},"198":{"position":[[2044,6]]},"204":{"position":[[577,3]]},"210":{"position":[[2211,3]]},"216":{"position":[[585,3]]},"222":{"position":[[3018,5],[3175,6],[3211,3]]},"230":{"position":[[118,6],[372,3],[978,6],[1042,6]]},"242":{"position":[[2970,5],[3129,6],[3165,3]]},"255":{"position":[[118,6],[372,3],[983,6],[1053,6]]},"271":{"position":[[458,3]]},"297":{"position":[[690,3],[762,3]]},"303":{"position":[[766,6]]},"319":{"position":[[1859,5]]},"343":{"position":[[1710,3]]},"355":{"position":[[354,5]]},"383":{"position":[[1602,5]]},"395":{"position":[[45,3]]},"397":{"position":[[565,3],[717,5],[798,5],[1354,3]]},"448":{"position":[[899,5],[1366,3]]},"452":{"position":[[1079,3]]},"488":{"position":[[346,3]]},"532":{"position":[[713,5],[745,5]]},"534":{"position":[[446,5],[478,5]]},"544":{"position":[[1440,6]]},"548":{"position":[[344,6]]},"561":{"position":[[875,3],[5316,3]]},"575":{"position":[[414,6]]},"596":{"position":[[1532,3],[1615,3]]},"646":{"position":[[1143,3],[1759,3],[2356,3]]},"648":{"position":[[1880,3]]},"651":{"position":[[20,3],[571,3],[742,3]]}}}],["trigger",{"_index":1010,"t":{"69":{"position":[[1047,9]]},"297":{"position":[[1674,8],[1798,7]]},"454":{"position":[[888,9]]},"610":{"position":[[414,7]]}}}],["trivial",{"_index":520,"t":{"29":{"position":[[723,7],[897,7]]},"633":{"position":[[63,9]]}}}],["troublehoot",{"_index":3009,"t":{"499":{"position":[[72,15]]}}}],["troubleshoot",{"_index":481,"t":{"27":{"position":[[364,12]]},"29":{"position":[[1875,15]]},"31":{"position":[[191,15],[356,15]]},"166":{"position":[[3067,16]]},"222":{"position":[[3140,15]]},"230":{"position":[[838,15]]},"242":{"position":[[3094,15]]},"253":{"position":[[424,12]]},"255":{"position":[[843,15]]},"297":{"position":[[2042,15]]},"331":{"position":[[1478,15]]},"343":{"position":[[225,15]]},"448":{"position":[[1340,16]]},"470":{"position":[[2161,15]]},"490":{"position":[[131,16]]},"495":{"position":[[150,12]]}}}],["true",{"_index":137,"t":{"11":{"position":[[1152,4]]},"15":{"position":[[4901,5],[5190,5]]},"31":{"position":[[483,5]]},"33":{"position":[[380,4]]},"65":{"position":[[1117,4],[3311,5]]},"67":{"position":[[1995,5],[3371,5]]},"75":{"position":[[906,5],[2002,5]]},"79":{"position":[[1258,4],[3519,5]]},"81":{"position":[[2236,5],[3654,5]]},"85":{"position":[[273,4]]},"91":{"position":[[277,4],[1931,5],[3403,5]]},"99":{"position":[[281,4],[2037,5],[3468,5]]},"103":{"position":[[277,4],[1702,5],[3082,5]]},"107":{"position":[[261,4],[1849,5],[3299,5]]},"114":{"position":[[1333,4]]},"116":{"position":[[1713,4]]},"121":{"position":[[853,4]]},"136":{"position":[[735,4],[836,4]]},"140":{"position":[[1039,4],[1162,4]]},"144":{"position":[[273,4],[1821,5],[1956,5],[3251,5],[3386,5]]},"162":{"position":[[733,5]]},"164":{"position":[[277,4],[1852,5],[3292,5]]},"166":{"position":[[2101,4],[3570,4]]},"168":{"position":[[356,4]]},"198":{"position":[[2914,5]]},"200":{"position":[[293,4],[604,4],[713,4],[2090,5],[2426,5],[2462,5],[2486,4],[3784,5],[4120,5],[4156,5],[4180,4]]},"206":{"position":[[269,4],[1811,5],[3183,5]]},"208":{"position":[[2395,4],[2741,4],[2814,5],[4954,5],[5484,5],[6783,5],[7313,5]]},"210":{"position":[[1137,4],[1260,4],[1944,5]]},"212":{"position":[[281,4],[1668,5],[3000,5]]},"218":{"position":[[277,4],[1860,5],[3217,5]]},"232":{"position":[[265,4],[1942,5],[3264,5]]},"236":{"position":[[305,4],[2243,5],[3715,5]]},"238":{"position":[[656,4]]},"257":{"position":[[265,4],[2038,5],[3369,5]]},"261":{"position":[[309,4],[2359,5],[3790,5]]},"265":{"position":[[289,4],[2172,5],[3622,5]]},"269":{"position":[[305,4],[2000,5],[3380,5]]},"273":{"position":[[261,4],[1800,5],[3175,5]]},"277":{"position":[[273,4],[1814,5],[3160,5]]},"281":{"position":[[265,4],[1728,5],[3099,5]]},"289":{"position":[[277,4],[2054,5],[3428,5]]},"295":{"position":[[466,4]]},"297":{"position":[[1387,5],[1504,4]]},"301":{"position":[[398,4],[2243,5],[3671,5]]},"305":{"position":[[281,4],[1841,5],[3315,5]]},"317":{"position":[[285,4],[1829,5],[2003,4],[3294,5],[3468,4]]},"319":{"position":[[1628,5],[1920,5],[2423,5],[2481,4]]},"321":{"position":[[265,4],[1647,5],[2969,5]]},"329":{"position":[[261,4]]},"333":{"position":[[285,4]]},"341":{"position":[[1754,4]]},"343":{"position":[[1055,5],[1183,5],[1200,4],[2602,5],[2773,5],[2790,4],[3831,5],[4076,5],[4093,4]]},"345":{"position":[[265,4],[1937,5],[2132,4],[3417,5],[3612,4]]},"351":{"position":[[413,5]]},"359":{"position":[[391,5],[457,5],[518,5],[596,5]]},"361":{"position":[[850,4]]},"363":{"position":[[344,4]]},"365":{"position":[[133,4],[461,4]]},"383":{"position":[[532,4],[2163,4],[2265,4],[2594,4]]},"393":{"position":[[273,4],[1709,5],[3039,5]]},"397":{"position":[[1057,5],[1068,4]]},"399":{"position":[[335,4],[446,5]]},"470":{"position":[[1603,4],[2438,5],[2457,4]]},"476":{"position":[[2316,4]]},"544":{"position":[[1227,4]]},"548":{"position":[[131,4]]},"553":{"position":[[340,4]]},"555":{"position":[[705,4],[761,4]]},"561":{"position":[[765,4]]},"566":{"position":[[1902,4],[1974,4]]},"579":{"position":[[614,4]]},"588":{"position":[[768,4]]},"623":{"position":[[1286,4]]},"640":{"position":[[826,5],[1015,5]]},"646":{"position":[[562,6],[1388,5],[1830,5],[2480,5]]},"651":{"position":[[629,5]]}}}],["truli",{"_index":1794,"t":{"190":{"position":[[1398,5]]}}}],["trust",{"_index":861,"t":{"55":{"position":[[5692,5],[7078,5],[9337,5]]},"72":{"position":[[835,6]]},"275":{"position":[[1429,8]]},"303":{"position":[[4943,8]]},"470":{"position":[[308,7]]}}}],["truth",{"_index":1221,"t":{"109":{"position":[[1943,6]]},"128":{"position":[[555,6]]},"134":{"position":[[56,5],[689,5]]},"470":{"position":[[130,6],[618,6],[778,5]]},"648":{"position":[[69,5]]},"653":{"position":[[627,5]]}}}],["ts",{"_index":2687,"t":{"385":{"position":[[715,2]]},"640":{"position":[[518,2]]},"644":{"position":[[438,2]]}}}],["ts/j",{"_index":3407,"t":{"644":{"position":[[474,5]]}}}],["tsx",{"_index":2691,"t":{"389":{"position":[[4,3]]}}}],["ttl",{"_index":2619,"t":{"368":{"position":[[223,4]]}}}],["tuhe1cphrxi",{"_index":2891,"t":{"470":{"position":[[1779,13]]}}}],["tune",{"_index":2650,"t":{"381":{"position":[[405,4]]}}}],["tunein",{"_index":2170,"t":{"283":{"position":[[137,7]]}}}],["turn",{"_index":589,"t":{"31":{"position":[[0,7],[381,4]]},"166":{"position":[[3288,4]]},"319":{"position":[[2263,4],[2334,6]]},"448":{"position":[[1414,4],[1444,4]]},"468":{"position":[[26,4]]},"470":{"position":[[1420,4],[2192,4],[2312,4]]},"490":{"position":[[13,4],[221,4]]},"499":{"position":[[590,6]]},"581":{"position":[[159,7]]}}}],["tutori",{"_index":2689,"t":{"387":{"position":[[23,8],[55,8]]}}}],["tv",{"_index":2497,"t":{"343":{"position":[[4855,2]]}}}],["twice",{"_index":2885,"t":{"470":{"position":[[1019,5]]}}}],["two",{"_index":539,"t":{"29":{"position":[[1626,3]]},"44":{"position":[[154,3]]},"87":{"position":[[761,3]]},"128":{"position":[[67,3]]},"134":{"position":[[1110,3]]},"172":{"position":[[2329,3]]},"192":{"position":[[216,3]]},"196":{"position":[[156,3]]},"379":{"position":[[183,3]]},"383":{"position":[[2011,3]]},"431":{"position":[[188,3],[575,3],[639,4]]},"470":{"position":[[942,3],[2946,3]]},"559":{"position":[[228,3]]},"575":{"position":[[607,3]]},"619":{"position":[[379,3]]}}}],["two/anoth",{"_index":2776,"t":{"431":{"position":[[473,11]]}}}],["twog",{"_index":1290,"t":{"121":{"position":[[2391,5],[3771,5]]},"341":{"position":[[944,5],[1153,5],[1383,5],[3562,5],[5000,5]]}}}],["tyler",{"_index":1689,"t":{"172":{"position":[[1877,7]]}}}],["type",{"_index":154,"t":{"15":{"position":[[195,6],[282,5],[1568,4],[1993,5],[2360,4],[2456,4],[3261,4],[4872,7],[5162,7],[5358,7],[5491,7],[5751,6],[5861,4],[5931,6],[6119,4]]},"17":{"position":[[22,5],[335,5]]},"29":{"position":[[1392,5],[1630,5],[3033,5],[3515,5],[4887,5]]},"38":{"position":[[330,5],[447,7],[552,7],[606,7],[823,7],[1176,7],[1556,7]]},"40":{"position":[[356,4]]},"44":{"position":[[158,5]]},"65":{"position":[[271,6]]},"67":{"position":[[27,4],[73,5],[102,4],[825,4],[2351,4],[3495,7]]},"75":{"position":[[1344,6],[1389,4],[1488,4],[1557,4]]},"79":{"position":[[362,6]]},"81":{"position":[[27,4],[73,5],[102,4],[1066,4],[2634,4],[3820,7]]},"85":{"position":[[27,4],[73,5],[102,4],[571,4],[2123,4],[3303,7]]},"91":{"position":[[27,4],[73,5],[102,4],[735,4],[2353,4],[3594,7]]},"99":{"position":[[27,4],[73,5],[102,4],[832,4],[2413,4],[3612,7]]},"101":{"position":[[562,4]]},"103":{"position":[[27,4],[73,5],[102,4],[508,4],[2034,4],[3183,7]]},"107":{"position":[[27,4],[73,5],[102,4],[620,4],[2240,4],[3453,7]]},"109":{"position":[[1180,4]]},"114":{"position":[[1079,4],[1125,5],[1154,4],[1757,4],[3348,4],[4557,7]]},"116":{"position":[[1178,4]]},"121":{"position":[[603,4],[649,5],[678,4],[1121,4],[2647,4],[3796,7]]},"128":{"position":[[412,5]]},"132":{"position":[[586,5]]},"144":{"position":[[27,4],[73,5],[102,4],[637,4],[1790,7],[2225,4],[3220,7]]},"147":{"position":[[120,5],[383,5]]},"150":{"position":[[2580,7],[2825,7],[2934,7],[3137,7],[3333,7]]},"152":{"position":[[76,4],[141,5],[222,5],[1784,7],[1986,7],[2188,7],[2389,7],[2593,7],[2797,7]]},"154":{"position":[[1976,7],[2731,7],[3175,7],[3527,7],[3772,7],[3927,7],[3993,7]]},"164":{"position":[[27,4],[73,5],[102,4],[661,4],[2247,4],[3456,7]]},"166":{"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]]},"168":{"position":[[27,4],[73,5],[197,4],[986,4],[2525,4],[3667,7]]},"198":{"position":[[2608,7],[3155,7]]},"200":{"position":[[27,4],[73,5],[102,4],[873,4],[2729,4],[4188,7]]},"206":{"position":[[27,4],[73,5],[102,4],[636,4],[2146,4],[3289,7]]},"208":{"position":[[958,5],[1107,5],[1202,6],[2137,4],[2183,5],[2212,4],[3609,5],[3771,4],[5754,4],[7350,7]]},"212":{"position":[[27,4],[73,5],[102,4],[496,4],[1978,4],[3078,7]]},"218":{"position":[[27,4],[73,5],[102,4],[670,4],[2173,4],[3299,7]]},"226":{"position":[[229,5]]},"232":{"position":[[27,4],[73,5],[102,4],[744,4],[2232,4],[3318,7]]},"236":{"position":[[27,4],[73,5],[102,4],[791,4],[2665,4],[3906,7]]},"238":{"position":[[382,4],[428,5],[457,4],[975,4],[2780,4],[3960,7]]},"257":{"position":[[27,4],[73,5],[102,4],[818,4],[2311,4],[3407,7]]},"261":{"position":[[27,4],[73,5],[102,4],[895,4],[2735,4],[3934,7]]},"265":{"position":[[27,4],[73,5],[102,4],[669,4],[2563,4],[3776,7]]},"269":{"position":[[27,4],[73,5],[102,4],[550,4],[2332,4],[3481,7]]},"273":{"position":[[27,4],[73,5],[102,4],[616,4],[1769,7],[2149,4],[3144,7]]},"277":{"position":[[27,4],[73,5],[102,4],[633,4],[2121,4],[3237,7]]},"281":{"position":[[27,4],[73,5],[102,4],[601,4],[2106,4],[3249,7]]},"289":{"position":[[27,4],[73,5],[102,4],[865,4],[2385,4],[3528,7]]},"295":{"position":[[184,4],[230,5],[259,4],[793,4],[2643,4],[3852,7]]},"297":{"position":[[1229,4],[1634,6]]},"301":{"position":[[152,4],[198,5],[227,4],[1104,4],[2674,4],[3872,7]]},"305":{"position":[[27,4],[73,5],[102,4],[647,4],[2271,4],[3513,7]]},"311":{"position":[[58,4],[770,7],[1083,7],[1247,7],[1480,7],[1568,7]]},"317":{"position":[[27,4],[73,5],[102,4],[625,4],[2244,4],[3476,7]]},"319":{"position":[[625,6]]},"321":{"position":[[27,4],[73,5],[102,4],[520,4],[1976,4],[3070,7]]},"323":{"position":[[295,5]]},"329":{"position":[[27,4],[73,5],[102,4],[565,4],[2095,4],[3218,7]]},"333":{"position":[[27,4],[73,5],[102,4],[599,4],[1788,7],[2127,4],[3162,7]]},"341":{"position":[[1476,4],[1522,5],[1551,4],[2036,4],[3876,4],[5083,7]]},"343":{"position":[[1026,7],[2200,4],[2573,7],[3802,7]]},"345":{"position":[[27,4],[73,5],[102,4],[742,4],[2372,4],[3620,7]]},"355":{"position":[[571,4],[657,7]]},"357":{"position":[[129,4],[138,4],[510,7],[887,7],[1043,4],[1190,7],[1310,7],[1598,7],[1776,7],[2025,7],[2402,7]]},"359":{"position":[[177,7]]},"361":{"position":[[1064,7],[1107,7],[1379,7],[1467,7]]},"363":{"position":[[1295,7],[1577,7]]},"393":{"position":[[27,4],[73,5],[102,4],[497,4],[1985,4],[3081,7]]},"399":{"position":[[128,7]]},"401":{"position":[[377,7]]},"406":{"position":[[66,7],[443,7]]},"408":{"position":[[66,7],[342,7]]},"410":{"position":[[375,7]]},"412":{"position":[[389,4]]},"414":{"position":[[219,7],[709,7]]},"418":{"position":[[193,7]]},"421":{"position":[[220,7]]},"423":{"position":[[70,7]]},"425":{"position":[[38,7],[101,7]]},"427":{"position":[[10,7]]},"429":{"position":[[10,7]]},"431":{"position":[[666,7]]},"466":{"position":[[83,4],[129,4],[222,4],[300,4],[369,4]]},"470":{"position":[[1526,7],[2361,7]]},"472":{"position":[[88,6]]},"482":{"position":[[1982,7],[2186,7]]},"532":{"position":[[2026,7]]},"536":{"position":[[1164,7]]},"551":{"position":[[246,7],[815,7]]},"553":{"position":[[166,7]]},"555":{"position":[[177,7],[478,7],[1063,7]]},"561":{"position":[[199,5],[316,5],[1328,5]]},"566":{"position":[[744,4],[846,4]]},"577":{"position":[[216,6]]},"579":{"position":[[494,7]]},"581":{"position":[[691,7]]},"584":{"position":[[66,7],[313,7]]},"586":{"position":[[154,7],[626,7]]},"588":{"position":[[343,7],[648,7]]},"590":{"position":[[251,7],[847,7],[935,7]]},"592":{"position":[[475,7],[751,7],[1068,7]]},"594":{"position":[[529,7],[1015,7],[1108,7],[1490,7],[1581,7]]},"619":{"position":[[356,4]]},"621":{"position":[[753,7]]},"631":{"position":[[674,4]]},"638":{"position":[[1131,5],[1462,4],[1542,4],[1648,4],[1748,4]]},"640":{"position":[[426,4],[503,4]]},"642":{"position":[[173,4],[875,5],[1104,4],[1253,6]]},"653":{"position":[[633,4]]}}}],["type=simpl",{"_index":3025,"t":{"503":{"position":[[307,11]]}}}],["typeof",{"_index":3426,"t":{"646":{"position":[[888,7],[1037,7]]}}}],["typescript",{"_index":2623,"t":{"373":{"position":[[39,11]]},"379":{"position":[[194,10]]}}}],["typic",{"_index":1803,"t":{"194":{"position":[[455,9]]}}}],["tz",{"_index":1418,"t":{"150":{"position":[[637,2]]},"154":{"position":[[770,2]]},"476":{"position":[[1510,3],[1603,2]]},"478":{"position":[[610,2]]},"528":{"position":[[274,2]]}}}],["tz=america/new_york",{"_index":2931,"t":{"476":{"position":[[1694,19]]}}}],["tz=etc/gmt",{"_index":1416,"t":{"150":{"position":[[602,10]]},"154":{"position":[[735,10]]},"331":{"position":[[346,10]]},"478":{"position":[[575,10]]},"528":{"position":[[239,10]]}}}],["tz=europe/moscow",{"_index":2407,"t":{"331":{"position":[[657,16]]}}}],["u",{"_index":2814,"t":{"444":{"position":[[111,1]]},"476":{"position":[[2088,1]]}}}],["ua",{"_index":2822,"t":{"448":{"position":[[526,4],[737,4],[1049,4]]}}}],["ubuntu",{"_index":3014,"t":{"501":{"position":[[91,7]]}}}],["ui",{"_index":123,"t":{"11":{"position":[[676,2]]},"87":{"position":[[712,2],[746,3],[981,3]]},"208":{"position":[[105,2],[1501,2],[1741,2]]},"253":{"position":[[53,2]]},"307":{"position":[[346,2]]},"315":{"position":[[267,2]]},"482":{"position":[[2326,2]]},"530":{"position":[[379,2]]},"596":{"position":[[1346,2],[1379,2],[1420,2]]},"629":{"position":[[38,2]]},"648":{"position":[[2207,2]]}}}],["uid",{"_index":2139,"t":{"275":{"position":[[1567,3]]},"476":{"position":[[2015,3],[2100,3]]}}}],["uid/gid",{"_index":2945,"t":{"478":{"position":[[310,7]]}}}],["ultim",{"_index":1907,"t":{"204":{"position":[[89,10]]},"216":{"position":[[91,10]]},"283":{"position":[[446,10]]}}}],["unabl",{"_index":71,"t":{"9":{"position":[[22,6]]}}}],["unattend",{"_index":3049,"t":{"518":{"position":[[302,11]]}}}],["unauthent",{"_index":3327,"t":{"635":{"position":[[208,15]]}}}],["unavail",{"_index":1105,"t":{"87":{"position":[[537,12]]}}}],["unavoid",{"_index":2474,"t":{"343":{"position":[[1959,11]]}}}],["uncaught",{"_index":2866,"t":{"457":{"position":[[184,8]]}}}],["unchang",{"_index":1867,"t":{"198":{"position":[[1059,10]]}}}],["uncom",{"_index":1160,"t":{"101":{"position":[[183,9]]},"478":{"position":[[368,13],[929,9]]},"538":{"position":[[1941,9]]},"561":{"position":[[677,9]]}}}],["uncomment/cr",{"_index":2152,"t":{"279":{"position":[[69,16]]}}}],["unconstrain",{"_index":3180,"t":{"561":{"position":[[6066,13]]}}}],["uncorrect",{"_index":3252,"t":{"577":{"position":[[492,11]]}}}],["undefin",{"_index":2895,"t":{"470":{"position":[[1824,9],[2097,9]]},"561":{"position":[[1734,9]]},"642":{"position":[[846,11]]},"646":{"position":[[790,10],[875,9],[1024,9],[1746,10]]}}}],["under",{"_index":245,"t":{"15":{"position":[[3162,5]]},"38":{"position":[[239,5]]},"109":{"position":[[373,5]]},"116":{"position":[[371,5]]},"132":{"position":[[569,5]]},"158":{"position":[[438,5]]},"162":{"position":[[954,5]]},"196":{"position":[[1383,5],[2216,5]]},"271":{"position":[[337,5]]},"313":{"position":[[275,6]]},"323":{"position":[[82,5]]},"343":{"position":[[2009,5]]},"470":{"position":[[1499,5]]},"503":{"position":[[46,5]]},"568":{"position":[[2738,5]]}}}],["understand",{"_index":964,"t":{"67":{"position":[[916,10],[2292,10]]},"72":{"position":[[820,10],[873,11]]},"81":{"position":[[1157,10],[2575,10]]},"85":{"position":[[662,10],[2066,10]]},"91":{"position":[[826,10],[2295,10]]},"99":{"position":[[923,10],[2354,10]]},"103":{"position":[[599,10],[1976,10]]},"107":{"position":[[711,10],[2176,10]]},"114":{"position":[[1848,10],[3289,10]]},"121":{"position":[[1212,10],[2589,10]]},"144":{"position":[[728,10],[2164,10]]},"164":{"position":[[752,10],[2189,10]]},"168":{"position":[[1077,10],[2463,10]]},"200":{"position":[[964,10],[2667,10]]},"206":{"position":[[727,10],[2090,10]]},"208":{"position":[[3862,10],[5694,10]]},"212":{"position":[[587,10],[1919,10]]},"218":{"position":[[761,10],[2115,10]]},"232":{"position":[[835,10],[2169,10]]},"236":{"position":[[882,10],[2607,10]]},"238":{"position":[[1066,10],[2723,10]]},"257":{"position":[[909,10],[2249,10]]},"261":{"position":[[986,10],[2676,10]]},"265":{"position":[[760,10],[2499,10]]},"269":{"position":[[641,10],[2274,10]]},"273":{"position":[[707,10],[2088,10]]},"277":{"position":[[724,10],[2064,10]]},"281":{"position":[[692,10],[2051,10]]},"289":{"position":[[956,10],[2327,10]]},"295":{"position":[[884,10],[2584,10]]},"301":{"position":[[1195,10],[2617,10]]},"305":{"position":[[738,10],[2212,10]]},"317":{"position":[[716,10],[2184,10]]},"321":{"position":[[611,10],[1921,10]]},"329":{"position":[[656,10],[2031,10]]},"333":{"position":[[690,10],[2067,10]]},"341":{"position":[[2127,10],[3818,10]]},"345":{"position":[[833,10],[2313,10]]},"393":{"position":[[588,10],[1924,10]]},"575":{"position":[[1946,10]]}}}],["undesir",{"_index":3182,"t":{"561":{"position":[[6273,10]]}}}],["undocu",{"_index":1044,"t":{"75":{"position":[[1367,12]]},"464":{"position":[[376,13]]}}}],["unexpect",{"_index":2678,"t":{"383":{"position":[[2646,10],[2798,10]]},"561":{"position":[[6258,10]]}}}],["unexpectedli",{"_index":2845,"t":{"452":{"position":[[129,12]]}}}],["unfortun",{"_index":2876,"t":{"470":{"position":[[200,14]]}}}],["uniqu",{"_index":949,"t":{"67":{"position":[[156,6]]},"81":{"position":[[156,6]]},"85":{"position":[[154,6]]},"91":{"position":[[155,6]]},"99":{"position":[[156,6]]},"103":{"position":[[155,6]]},"107":{"position":[[151,6]]},"114":{"position":[[1208,6]]},"121":{"position":[[731,6]]},"144":{"position":[[154,6]]},"164":{"position":[[155,6]]},"168":{"position":[[246,6]]},"172":{"position":[[1200,6]]},"174":{"position":[[594,6]]},"190":{"position":[[293,7],[1374,6]]},"200":{"position":[[159,6]]},"206":{"position":[[153,6]]},"208":{"position":[[2267,6]]},"212":{"position":[[156,6]]},"218":{"position":[[155,6]]},"232":{"position":[[152,6]]},"236":{"position":[[162,6]]},"238":{"position":[[516,6]]},"257":{"position":[[152,6]]},"261":{"position":[[163,6]]},"265":{"position":[[158,6]]},"269":{"position":[[162,6]]},"273":{"position":[[151,6]]},"277":{"position":[[154,6]]},"281":{"position":[[152,6]]},"289":{"position":[[155,6]]},"295":{"position":[[320,6]]},"301":{"position":[[279,6]]},"305":{"position":[[156,6]]},"317":{"position":[[157,6]]},"321":{"position":[[152,6]]},"329":{"position":[[151,6]]},"333":{"position":[[157,6]]},"341":{"position":[[1611,6]]},"345":{"position":[[152,6]]},"349":{"position":[[300,6],[681,6]]},"355":{"position":[[73,6]]},"357":{"position":[[159,6]]},"393":{"position":[[154,6]]},"575":{"position":[[991,6]]},"619":{"position":[[325,6],[473,6]]}}}],["unit",{"_index":548,"t":{"29":{"position":[[2372,4],[2417,4],[4347,4],[4392,4]]},"172":{"position":[[4910,4]]},"503":{"position":[[241,6]]}}}],["unix",{"_index":776,"t":{"55":{"position":[[1517,4],[1577,4],[1599,4],[4072,4],[4170,4],[4309,4],[4478,4],[4576,4],[4715,4],[5931,4],[6100,4],[6412,4],[7488,4],[7657,4],[7771,4],[7988,5],[8292,4]]},"59":{"position":[[116,4],[176,4],[198,4]]},"67":{"position":[[405,4]]},"275":{"position":[[654,4],[786,4],[944,4],[1282,4],[1637,4]]}}}],["unknown",{"_index":1599,"t":{"166":{"position":[[1896,8],[1980,7],[2014,7],[2181,7],[2357,7]]},"208":{"position":[[1225,8]]},"341":{"position":[[510,8],[1240,7],[1431,11]]},"448":{"position":[[1096,7]]},"454":{"position":[[901,7]]},"466":{"position":[[206,9],[286,7]]}}}],["unless",{"_index":1108,"t":{"87":{"position":[[832,6]]},"140":{"position":[[1062,7],[1121,7]]},"150":{"position":[[1507,6]]},"154":{"position":[[1673,6]]},"172":{"position":[[2097,6]]},"210":{"position":[[1160,7],[1219,7]]},"275":{"position":[[1370,6]]},"303":{"position":[[2280,6]]},"331":{"position":[[553,6],[873,6]]},"403":{"position":[[1073,6]]},"478":{"position":[[1089,6]]},"528":{"position":[[517,6]]},"557":{"position":[[2153,6]]},"575":{"position":[[1643,6]]},"653":{"position":[[3845,6]]}}}],["unlik",{"_index":2496,"t":{"343":{"position":[[4795,8]]}}}],["unmatch",{"_index":370,"t":{"19":{"position":[[1648,10]]}}}],["unnam",{"_index":3311,"t":{"629":{"position":[[115,7]]},"642":{"position":[[901,10]]}}}],["unoffici",{"_index":1503,"t":{"156":{"position":[[25,10]]},"343":{"position":[[39,10],[265,11]]},"470":{"position":[[485,10]]}}}],["unqiu",{"_index":1796,"t":{"190":{"position":[[1503,6]]}}}],["unrel",{"_index":2257,"t":{"303":{"position":[[1614,9]]}}}],["unreli",{"_index":3257,"t":{"592":{"position":[[12,10]]}}}],["unseen",{"_index":3479,"t":{"653":{"position":[[1044,6]]}}}],["unsent",{"_index":1110,"t":{"87":{"position":[[923,6]]}}}],["unsupport",{"_index":1595,"t":{"166":{"position":[[1487,11]]},"484":{"position":[[0,11]]}}}],["unsur",{"_index":2439,"t":{"341":{"position":[[530,6]]}}}],["untest",{"_index":2376,"t":{"323":{"position":[[531,8]]}}}],["until",{"_index":1346,"t":{"134":{"position":[[770,5]]},"561":{"position":[[1154,5]]}}}],["untouch",{"_index":540,"t":{"29":{"position":[[1711,9]]}}}],["unus",{"_index":531,"t":{"29":{"position":[[1139,6]]},"33":{"position":[[224,8]]}}}],["uosrpjt3u5dhaaup3x",{"_index":1530,"t":{"160":{"position":[[332,24]]}}}],["uosrpjt3u5dhaaup3xq30d",{"_index":1551,"t":{"162":{"position":[[771,28]]}}}],["uosrpjt3u5dhaaup3xq30dwfosgqugdsyzl3qe743waavy2eur2ckyjcz4rv123q3psbkxklwa6ahc9xmefev6btfsp8luje3jswwrqogzcduowvzwo5saig",{"_index":1570,"t":{"164":{"position":[[1890,122],[3330,122]]}}}],["up",{"_index":80,"t":{"9":{"position":[[174,3]]},"23":{"position":[[792,2]]},"27":{"position":[[238,2]]},"67":{"position":[[1322,2],[2813,2]]},"81":{"position":[[1563,2],[3096,2]]},"85":{"position":[[1066,2],[2583,2]]},"91":{"position":[[1231,2],[2814,2]]},"99":{"position":[[1329,2],[2875,2]]},"101":{"position":[[319,2]]},"103":{"position":[[1004,2],[2495,2]]},"107":{"position":[[1122,2],[2707,2]]},"109":{"position":[[2123,2]]},"114":{"position":[[2254,2],[3810,2]]},"121":{"position":[[1617,2],[3108,2]]},"134":{"position":[[391,2]]},"144":{"position":[[1136,2],[2689,2]]},"164":{"position":[[1157,2],[2708,2]]},"168":{"position":[[1486,2],[2990,2]]},"174":{"position":[[994,2]]},"179":{"position":[[446,2]]},"184":{"position":[[171,2]]},"200":{"position":[[1373,2],[3194,2]]},"206":{"position":[[1130,2],[2605,2]]},"208":{"position":[[4269,2],[6217,2]]},"212":{"position":[[993,2],[2440,2]]},"218":{"position":[[1166,2],[2634,2]]},"224":{"position":[[13,2]]},"226":{"position":[[24,2]]},"228":{"position":[[253,2]]},"232":{"position":[[1245,2],[2698,2]]},"236":{"position":[[1287,2],[3126,2]]},"238":{"position":[[1470,2],[3240,2]]},"257":{"position":[[1318,2],[2776,2]]},"261":{"position":[[1392,2],[3197,2]]},"265":{"position":[[1171,2],[3030,2]]},"269":{"position":[[1046,2],[2793,2]]},"273":{"position":[[1115,2],[2613,2]]},"277":{"position":[[1128,2],[2581,2]]},"281":{"position":[[1094,2],[2564,2]]},"289":{"position":[[1361,2],[2846,2]]},"295":{"position":[[1290,2],[3105,2]]},"301":{"position":[[1599,2],[3134,2]]},"305":{"position":[[1144,2],[2733,2]]},"317":{"position":[[1123,2],[2707,2]]},"321":{"position":[[1013,2],[2434,2]]},"329":{"position":[[1067,2],[2562,2]]},"333":{"position":[[1097,2],[2590,2]]},"341":{"position":[[2532,2],[4337,2]]},"343":{"position":[[1656,2]]},"345":{"position":[[1239,2],[2834,2]]},"347":{"position":[[256,3]]},"355":{"position":[[18,2]]},"368":{"position":[[98,2]]},"383":{"position":[[769,2]]},"393":{"position":[[996,2],[2449,2]]},"452":{"position":[[767,2]]},"454":{"position":[[732,2]]},"507":{"position":[[48,2]]},"512":{"position":[[209,2]]},"516":{"position":[[283,2]]},"526":{"position":[[24,2]]},"530":{"position":[[195,2]]},"538":{"position":[[2077,2]]},"540":{"position":[[245,2],[371,3]]},"542":{"position":[[398,2]]},"544":{"position":[[1627,2]]},"568":{"position":[[505,2],[2801,2]]},"598":{"position":[[8,2]]},"651":{"position":[[67,2]]}}}],["up/logn",{"_index":1228,"t":{"111":{"position":[[85,7]]}}}],["updat",{"_index":681,"t":{"42":{"position":[[476,6]]},"69":{"position":[[768,6],[1028,6],[1132,8],[1301,6],[1331,6],[1440,6],[1644,6]]},"75":{"position":[[84,6],[233,7],[343,6],[590,6],[679,6],[796,8],[1886,6]]},"87":{"position":[[874,6]]},"138":{"position":[[284,7]]},"196":{"position":[[2870,7]]},"198":{"position":[[1130,6]]},"319":{"position":[[188,7]]},"476":{"position":[[238,8]]},"510":{"position":[[32,7],[127,8]]},"512":{"position":[[159,6]]},"516":{"position":[[363,6]]},"588":{"position":[[268,8],[781,6]]},"625":{"position":[[616,6]]},"631":{"position":[[161,8]]}}}],["upgrad",{"_index":475,"t":{"27":{"position":[[117,9]]},"510":{"position":[[213,9],[310,7],[352,9],[444,9]]},"512":{"position":[[418,9]]},"514":{"position":[[104,7],[125,10]]},"516":{"position":[[140,7],[219,7]]},"518":{"position":[[293,8]]},"623":{"position":[[11,10],[261,7]]},"629":{"position":[[482,7]]},"631":{"position":[[182,7],[260,8],[278,8],[296,7],[322,7],[340,9],[425,7],[509,7],[645,8],[682,7]]}}}],["upgrade(",{"_index":3043,"t":{"516":{"position":[[10,10]]}}}],["upper",{"_index":1166,"t":{"101":{"position":[[361,5]]},"538":{"position":[[2119,5]]}}}],["upstream",{"_index":1772,"t":{"179":{"position":[[540,8]]},"182":{"position":[[182,8]]},"343":{"position":[[1463,8]]},"452":{"position":[[112,8],[184,8],[307,8],[506,8],[664,8],[963,8]]},"653":{"position":[[1067,8],[1263,8],[1346,8]]}}}],["upstreamerror",{"_index":3437,"t":{"646":{"position":[[1552,13],[2190,13]]}}}],["uptim",{"_index":613,"t":{"36":{"position":[[187,6]]},"452":{"position":[[783,6]]}}}],["uri",{"_index":1128,"t":{"91":{"position":[[525,3]]},"99":{"position":[[512,3]]},"236":{"position":[[574,3]]},"261":{"position":[[561,3]]},"285":{"position":[[244,3],[465,3]]},"289":{"position":[[462,3],[572,3]]},"303":{"position":[[1957,3],[2009,3],[2037,3],[2254,4],[2438,3],[2651,4],[2821,3],[3281,3],[3975,3],[5145,3],[5324,3]]},"305":{"position":[[487,3]]},"343":{"position":[[2316,4],[2950,4],[3042,3],[3219,4],[3371,3],[3451,3],[3759,4],[4141,4]]},"345":{"position":[[387,3]]},"476":{"position":[[1082,4]]},"530":{"position":[[650,4],[770,3]]}}}],["uriblacklist",{"_index":2182,"t":{"285":{"position":[[117,12],[352,15]]},"289":{"position":[[2090,15],[3464,15]]}}}],["uriwhitelist",{"_index":2183,"t":{"285":{"position":[[133,12]]},"289":{"position":[[2110,15],[3484,15]]}}}],["url",{"_index":234,"t":{"15":{"position":[[2642,6],[2845,6],[2999,6],[5249,6],[5376,6],[5544,6],[5976,6]]},"21":{"position":[[12,3],[58,4],[454,4],[510,3],[631,3],[865,3]]},"38":{"position":[[465,6],[880,6],[1229,6],[1652,7]]},"40":{"position":[[220,3]]},"65":{"position":[[115,3],[267,3],[287,4],[352,4],[379,4],[549,3],[660,4],[977,4],[999,3],[1062,3],[1141,3],[1199,3],[1333,4],[2593,3],[2657,3],[2784,3],[2826,3],[2853,3],[3340,3],[3508,3],[3536,4],[3586,3],[3833,3]]},"67":{"position":[[494,4],[608,3],[662,3]]},"79":{"position":[[115,3],[358,3],[378,4],[493,4],[520,4],[690,3],[801,4],[1118,4],[1140,3],[1203,3],[1282,3],[1340,3],[1474,4],[2768,3],[2832,3],[2959,3],[3001,3],[3028,3],[3548,3],[3716,3],[3744,4],[3794,3],[4041,3],[4274,3]]},"81":{"position":[[467,4],[581,3],[635,3]]},"83":{"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]]},"85":{"position":[[326,3],[1855,6],[3265,6]]},"87":{"position":[[1326,3],[1448,3]]},"89":{"position":[[24,3],[136,3],[174,3],[507,3],[595,3]]},"95":{"position":[[24,3],[136,3],[174,3],[501,3],[589,3]]},"101":{"position":[[525,3]]},"103":{"position":[[331,3],[1743,6],[3123,6]]},"107":{"position":[[341,3],[1962,6],[3412,6]]},"116":{"position":[[2031,4]]},"140":{"position":[[4,3],[182,3],[252,3],[366,3]]},"142":{"position":[[130,3],[268,3],[291,3],[325,3],[409,3],[555,3]]},"144":{"position":[[384,3],[1878,6],[3308,6]]},"150":{"position":[[2017,6],[2482,6],[3032,6],[3495,6]]},"152":{"position":[[668,6],[848,6],[1082,6],[1686,6],[1882,6],[2084,6],[2312,6],[2959,6]]},"204":{"position":[[4,3],[60,4],[69,3],[235,3],[333,3],[598,3],[641,3],[679,3],[728,3],[744,3]]},"206":{"position":[[351,3],[1827,6],[3199,6]]},"208":{"position":[[1377,3],[1554,3],[1583,4],[5005,6],[6834,6]]},"210":{"position":[[1589,3],[1610,3],[1628,3],[1801,3],[1960,6]]},"212":{"position":[[355,3],[1707,6],[3039,6]]},"216":{"position":[[4,3],[62,4],[71,3],[239,3],[337,3],[606,3],[649,3],[687,3],[738,3],[754,3]]},"218":{"position":[[363,3],[1876,6],[3233,6]]},"222":{"position":[[331,3],[477,3],[882,3],[1792,4],[2880,4],[2909,3],[3072,3],[3156,3],[3239,3],[3299,3]]},"224":{"position":[[216,3]]},"228":{"position":[[498,3],[691,3],[839,3],[923,3],[1013,3]]},"230":{"position":[[66,3],[138,3],[155,3],[210,3],[505,3],[525,3],[968,3]]},"232":{"position":[[397,4],[414,3]]},"238":{"position":[[716,3],[2512,6],[3922,6]]},"240":{"position":[[229,3]]},"242":{"position":[[321,3],[468,3],[871,3],[1777,4],[2836,4],[2865,3],[3025,3],[3110,3],[3193,3],[3253,3]]},"244":{"position":[[66,3],[221,3]]},"248":{"position":[[160,3],[266,3],[449,3]]},"253":{"position":[[260,3],[271,3]]},"255":{"position":[[66,3],[138,3],[155,3],[210,3],[510,3],[530,3],[973,3]]},"257":{"position":[[390,4],[407,3]]},"265":{"position":[[376,3],[2285,6],[3735,6]]},"269":{"position":[[366,3],[2041,6],[3421,6]]},"271":{"position":[[210,3],[428,3]]},"273":{"position":[[331,3],[1856,6],[3231,6]]},"281":{"position":[[1778,6],[3149,6]]},"283":{"position":[[339,4],[348,3],[417,4],[426,3],[592,3],[690,3],[907,3],[950,3],[988,3],[1039,3],[1055,3]]},"289":{"position":[[362,3],[2070,6],[3444,6]]},"303":{"position":[[2048,3],[2133,3],[3580,3],[4243,3],[4305,4],[4394,3],[4485,3],[4853,3]]},"307":{"position":[[42,3]]},"317":{"position":[[474,3],[1845,6],[3310,6]]},"321":{"position":[[1697,6],[3019,6]]},"323":{"position":[[113,4],[291,3],[411,3],[504,3]]},"325":{"position":[[107,4],[380,3],[462,3]]},"333":{"position":[[341,3],[1818,6],[3192,6]]},"343":{"position":[[3236,3],[3321,3],[3478,3],[3728,3],[5240,3]]},"357":{"position":[[411,4]]},"381":{"position":[[316,5]]},"383":{"position":[[1092,3],[1170,3],[2353,3]]},"385":{"position":[[430,3]]},"391":{"position":[[284,4],[458,3],[536,3],[552,3]]},"393":{"position":[[338,3],[1725,6],[3055,6]]},"448":{"position":[[836,3],[921,3],[1616,4],[1625,4]]},"450":{"position":[[89,3],[589,5]]},"476":{"position":[[24,3],[1244,3]]},"478":{"position":[[220,3]]},"482":{"position":[[2111,6],[2234,6]]},"530":{"position":[[363,3],[2608,3],[3460,4]]},"538":{"position":[[580,3],[596,3],[651,3],[818,3],[1437,4]]},"551":{"position":[[121,4],[575,3],[598,3],[639,3],[1030,6]]},"610":{"position":[[300,3]]},"621":{"position":[[555,6],[870,6]]},"646":{"position":[[332,3],[343,6],[428,4],[575,3],[724,4],[1322,4]]}}}],["url(norm",{"_index":3421,"t":{"646":{"position":[[585,12]]}}}],["url.pathnam",{"_index":3423,"t":{"646":{"position":[[666,13],[691,12]]}}}],["url.port",{"_index":3422,"t":{"646":{"position":[[601,9],[623,8],[642,8]]}}}],["url/cod",{"_index":2498,"t":{"343":{"position":[[5017,8]]}}}],["url/jellyfin_url",{"_index":1946,"t":{"208":{"position":[[1670,17]]}}}],["url:port",{"_index":2161,"t":{"281":{"position":[[331,8]]},"321":{"position":[[331,8]]}}}],["urlbas",{"_index":1141,"t":{"97":{"position":[[115,7]]}}}],["us",{"_index":103,"t":{"11":{"position":[[239,4],[342,5],[970,5]]},"15":{"position":[[35,6],[468,3],[522,3],[1459,3],[1602,3],[1886,5],[2077,4],[2270,5],[3157,4],[3252,4],[3647,3],[3836,3],[4234,5],[4288,3],[4387,4],[5829,5],[6244,4]]},"17":{"position":[[313,5]]},"19":{"position":[[5,5],[128,5],[941,4],[1314,4],[1763,3],[1806,4],[1831,3],[1882,3],[1901,4]]},"21":{"position":[[24,4],[307,3],[368,3],[378,6]]},"23":{"position":[[129,4],[689,4],[919,5],[1181,3],[1395,3]]},"25":{"position":[[0,5],[242,5],[828,3],[928,4]]},"29":{"position":[[35,4],[284,5],[1265,4],[1367,4],[1446,6],[1467,4],[1775,4],[1821,4],[1865,4],[2047,4],[2141,4],[2545,3],[3490,4],[3657,4],[4156,4],[4470,3]]},"31":{"position":[[127,3],[182,4]]},"33":{"position":[[285,5],[339,3]]},"36":{"position":[[65,4]]},"40":{"position":[[339,3]]},"42":{"position":[[856,4]]},"44":{"position":[[15,4]]},"46":{"position":[[20,4],[101,4],[487,3]]},"48":{"position":[[25,4],[138,5],[163,5]]},"50":{"position":[[15,4],[161,4]]},"53":{"position":[[42,3]]},"55":{"position":[[17,4],[423,3],[496,4],[530,3],[1263,5],[1563,3],[1699,3],[2173,3],[2856,3],[3267,3],[3539,3],[3790,4],[4065,4],[4471,4],[4867,4],[5595,4],[5669,3],[5747,3],[5867,3],[6751,5],[6981,4],[7055,3],[7133,3],[7253,3],[7359,5],[7377,3],[7424,3],[7715,3],[8627,5],[8752,3],[9240,4],[9314,3],[9392,3],[9512,3],[10131,5]]},"57":{"position":[[31,5]]},"59":{"position":[[162,3],[298,3],[772,3]]},"61":{"position":[[80,3]]},"65":{"position":[[80,4],[205,3],[339,3],[960,3],[1132,4],[1351,4],[2549,3],[2710,3],[2965,3],[3010,3],[3222,3],[3324,3],[3494,3]]},"67":{"position":[[509,5],[627,3],[676,5],[694,3],[904,3],[1869,3],[2280,3],[3233,3]]},"69":{"position":[[15,4],[331,4],[589,5],[716,4],[873,4],[1095,4]]},"72":{"position":[[167,3],[268,3],[365,3],[503,4],[1028,3]]},"75":{"position":[[3,4],[195,5],[1359,4]]},"77":{"position":[[38,3]]},"79":{"position":[[80,4],[296,3],[480,3],[1101,3],[1273,4],[1492,4],[2724,3],[2885,3],[3140,3],[3185,3],[3397,3],[3532,3],[3702,3],[4187,4]]},"81":{"position":[[376,4],[482,5],[600,3],[649,5],[667,3],[1145,3],[2110,3],[2563,3],[3516,3]]},"83":{"position":[[6,4],[281,3],[315,5],[444,5],[516,3],[723,5],[812,4],[1668,3]]},"85":{"position":[[303,5],[650,3],[1605,3],[2054,3],[3001,3]]},"87":{"position":[[1229,3],[1361,5],[1393,3],[1420,5]]},"89":{"position":[[31,4],[144,3],[188,3],[573,5]]},"91":{"position":[[307,5],[532,3],[814,3],[1774,3],[2283,3],[3233,3]]},"93":{"position":[[105,3],[206,5],[287,3],[318,3]]},"95":{"position":[[31,4],[144,3],[188,3],[567,5]]},"97":{"position":[[15,5],[86,5]]},"99":{"position":[[311,5],[519,3],[911,3],[1876,3],[2342,3],[3295,3]]},"101":{"position":[[82,5],[581,4]]},"103":{"position":[[307,5],[587,3],[1547,3],[1964,3],[2914,3]]},"105":{"position":[[374,3]]},"107":{"position":[[291,5],[381,5],[699,3],[1689,3],[2164,3],[3132,3]]},"109":{"position":[[6,4],[858,5],[1034,4],[1582,5]]},"111":{"position":[[39,3],[93,5]]},"114":{"position":[[11,4],[190,3],[486,4],[687,3],[713,4],[796,5],[916,3],[1363,5],[1836,3],[2801,3],[3277,3],[4230,3]]},"116":{"position":[[6,4],[856,5],[1032,4],[1576,5],[1787,3],[1878,3],[1982,3]]},"121":{"position":[[23,4],[183,5],[290,3],[883,5],[1200,3],[2160,3],[2577,3],[3527,3]]},"128":{"position":[[277,3]]},"132":{"position":[[49,3],[454,5],[612,3]]},"134":{"position":[[623,3],[1098,4],[1720,5]]},"138":{"position":[[147,5],[251,3]]},"140":{"position":[[8,4],[214,3],[388,4]]},"142":{"position":[[59,4],[200,3],[313,4],[421,3],[914,3],[1002,3],[1369,5]]},"144":{"position":[[303,5],[439,4],[716,3],[1691,3],[2152,3],[3111,3]]},"147":{"position":[[169,6],[237,5]]},"150":{"position":[[211,3],[468,5],[1522,5],[2523,5]]},"152":{"position":[[546,5],[1727,5]]},"154":{"position":[[120,3],[178,3],[384,3],[601,5],[1688,5],[1764,5],[1822,4],[2985,5],[3021,4]]},"156":{"position":[[20,4],[191,3]]},"158":{"position":[[40,4],[94,4],[225,3]]},"162":{"position":[[129,5],[989,4],[1111,3],[1212,5]]},"164":{"position":[[307,5],[740,3],[1700,3],[2177,3],[3127,3]]},"166":{"position":[[36,5],[236,5],[778,5],[837,5],[2230,5],[2585,6],[3410,5]]},"168":{"position":[[386,5],[1065,3],[2045,3],[2451,3],[3413,3]]},"172":{"position":[[16,4],[136,4],[1002,5],[1114,4],[1810,4],[5115,4]]},"174":{"position":[[1026,4]]},"177":{"position":[[29,5]]},"182":{"position":[[0,3]]},"184":{"position":[[96,3],[242,5],[384,4],[557,3]]},"186":{"position":[[69,5]]},"188":{"position":[[3,5],[113,5],[292,5],[529,3],[567,5]]},"196":{"position":[[2624,5],[3095,3]]},"198":{"position":[[2165,5],[2442,3]]},"200":{"position":[[323,5],[952,3],[1932,3],[2655,3],[3617,3]]},"204":{"position":[[8,4],[73,4],[271,3],[561,5],[704,3]]},"206":{"position":[[299,5],[715,3],[1665,3],[2078,3],[3022,3]]},"208":{"position":[[8,5],[320,3],[368,3],[902,3],[1267,3],[1388,3],[1489,4],[1588,3],[1923,3],[2021,3],[2425,5],[3850,3],[4820,3],[5682,3],[6638,3]]},"210":{"position":[[53,3],[218,3],[648,3],[1562,5],[1642,3],[1747,3],[2218,3]]},"212":{"position":[[311,5],[575,3],[1540,3],[1907,3],[2860,3]]},"214":{"position":[[177,3]]},"216":{"position":[[8,4],[75,4],[275,3],[569,5],[712,3]]},"218":{"position":[[307,5],[749,3],[1709,3],[2103,3],[3053,3]]},"220":{"position":[[119,4],[574,5],[682,5],[706,3]]},"222":{"position":[[16,3],[119,5],[237,3],[287,3],[318,3],[455,3],[538,3],[860,3],[959,3],[1650,3],[1765,3],[2220,3],[2515,3],[2532,3],[2588,3],[2742,5],[2764,3],[2817,3],[2858,3],[2890,3],[3218,3]]},"226":{"position":[[184,3],[460,3]]},"228":{"position":[[181,3],[492,3],[608,4],[721,3],[821,5]]},"230":{"position":[[44,3],[572,3]]},"232":{"position":[[295,5],[322,5],[373,5],[443,4],[823,3],[1808,3],[2157,3],[3122,3]]},"234":{"position":[[110,4],[308,3]]},"236":{"position":[[335,5],[581,3],[870,3],[2086,3],[2595,3],[3545,3]]},"238":{"position":[[125,4],[686,5],[1054,3],[2262,3],[2711,3],[3658,3]]},"240":{"position":[[347,4]]},"242":{"position":[[16,3],[119,5],[237,3],[282,3],[308,3],[446,3],[529,3],[849,3],[944,3],[1631,3],[1750,3],[2201,3],[2517,3],[2573,3],[2708,5],[2727,3],[2780,3],[2814,3],[2846,3],[3172,3]]},"244":{"position":[[29,3]]},"246":{"position":[[138,3]]},"248":{"position":[[132,3],[260,3],[376,4],[563,5]]},"253":{"position":[[470,5]]},"255":{"position":[[44,3],[577,3]]},"257":{"position":[[295,5],[322,5],[368,5],[436,4],[583,4],[897,3],[1877,3],[2237,3],[3199,3]]},"259":{"position":[[111,4],[193,3]]},"261":{"position":[[339,5],[568,3],[974,3],[2198,3],[2664,3],[3617,3]]},"263":{"position":[[132,4],[474,3]]},"265":{"position":[[319,5],[416,5],[748,3],[2012,3],[2487,3],[3455,3]]},"267":{"position":[[6,4]]},"269":{"position":[[335,5],[629,3],[1845,3],[2262,3],[3212,3]]},"271":{"position":[[12,3],[214,4],[465,3]]},"273":{"position":[[291,5],[695,3],[1670,3],[2076,3],[3035,3]]},"275":{"position":[[1438,3]]},"277":{"position":[[303,5],[712,3],[1667,3],[2052,3],[2999,3]]},"279":{"position":[[25,5]]},"281":{"position":[[295,5],[680,3],[1625,3],[2039,3],[2980,3]]},"283":{"position":[[352,4],[430,4],[628,3],[1013,3]]},"285":{"position":[[111,5],[276,4]]},"287":{"position":[[94,3],[167,5]]},"289":{"position":[[307,5],[944,3],[1904,3],[2315,3],[3265,3]]},"291":{"position":[[6,4]]},"295":{"position":[[496,5],[872,3],[2096,3],[2572,3],[3525,3]]},"297":{"position":[[20,3],[185,3],[1271,5]]},"299":{"position":[[84,4]]},"301":{"position":[[428,5],[1183,3],[2138,3],[2605,3],[3552,3]]},"303":{"position":[[75,4],[776,3],[856,3],[1174,5],[1596,4],[1964,3],[2377,3],[2561,3],[3013,3],[3222,3],[3490,3],[3758,5],[4816,3],[5003,5],[5033,3]]},"305":{"position":[[311,5],[726,3],[1691,3],[2200,3],[3153,3]]},"307":{"position":[[55,4],[435,3]]},"309":{"position":[[147,4]]},"311":{"position":[[170,3],[281,5],[353,3],[393,3],[580,3],[868,3],[1345,3]]},"313":{"position":[[19,4],[233,5],[270,4],[430,5],[635,3]]},"315":{"position":[[149,3],[335,5]]},"317":{"position":[[315,5],[704,3],[1674,3],[2172,3],[3128,3]]},"319":{"position":[[25,5],[673,4],[1176,5],[1334,3],[1529,5],[2164,4],[2219,3]]},"321":{"position":[[295,5],[599,3],[1544,3],[1909,3],[2850,3]]},"323":{"position":[[640,3]]},"325":{"position":[[18,3],[72,5],[126,5],[353,3],[435,3]]},"327":{"position":[[81,3]]},"329":{"position":[[291,5],[644,3],[1634,3],[2019,3],[2987,3]]},"331":{"position":[[941,4],[969,5]]},"333":{"position":[[315,5],[678,3],[1648,3],[2055,3],[3011,3]]},"335":{"position":[[6,4]]},"341":{"position":[[51,4],[327,4],[484,5],[561,4],[608,3],[1784,5],[2115,3],[3331,3],[3806,3],[4756,3]]},"343":{"position":[[543,5],[580,3],[1572,5],[1717,3],[1914,3],[2882,3],[3385,3],[3427,5],[4748,5],[4917,5],[5135,5]]},"345":{"position":[[295,5],[821,3],[1786,3],[2301,3],[3254,3]]},"351":{"position":[[336,4]]},"353":{"position":[[708,5],[1019,3],[1044,5],[1315,3]]},"355":{"position":[[255,4]]},"357":{"position":[[34,5],[206,4],[295,4],[614,4],[693,4],[965,4],[1379,4],[2129,4],[2208,4]]},"359":{"position":[[785,3],[1026,5],[1169,4]]},"363":{"position":[[235,4],[1488,3]]},"365":{"position":[[117,3],[244,5]]},"368":{"position":[[3,4],[184,4],[264,5]]},"373":{"position":[[213,5]]},"375":{"position":[[133,3],[336,3]]},"377":{"position":[[219,6],[270,3],[332,4]]},"381":{"position":[[392,4]]},"383":{"position":[[812,4],[1439,4]]},"385":{"position":[[49,4],[296,6],[515,3]]},"389":{"position":[[116,3],[257,3]]},"391":{"position":[[213,5],[528,4]]},"393":{"position":[[303,5],[383,3],[576,3],[1551,3],[1912,3],[2871,3]]},"395":{"position":[[17,4],[116,6],[284,5],[585,5]]},"397":{"position":[[319,3],[557,4],[953,4]]},"399":{"position":[[83,4]]},"401":{"position":[[121,5],[176,4],[452,4]]},"403":{"position":[[58,5],[107,3],[290,4],[476,3],[557,5]]},"406":{"position":[[170,4],[249,4]]},"410":{"position":[[213,3]]},"412":{"position":[[15,4],[126,6]]},"414":{"position":[[32,5],[148,5],[508,4]]},"416":{"position":[[372,6],[912,4],[960,3]]},"421":{"position":[[0,5]]},"431":{"position":[[370,3]]},"437":{"position":[[32,3]]},"440":{"position":[[150,4],[415,4],[469,3]]},"442":{"position":[[14,3],[113,3],[720,3]]},"444":{"position":[[45,5],[80,5]]},"448":{"position":[[109,5],[1894,3],[2005,3]]},"450":{"position":[[148,3],[542,3]]},"454":{"position":[[218,5],[316,5],[385,5],[421,5],[487,5],[549,5],[594,4],[634,5]]},"464":{"position":[[171,3]]},"470":{"position":[[478,3],[1405,6],[2657,5]]},"476":{"position":[[341,3],[498,4],[647,4],[700,4],[731,5],[851,3],[1036,5],[1128,5],[1204,4],[1305,3],[1477,5],[1955,5]]},"478":{"position":[[211,3],[348,5]]},"482":{"position":[[32,5],[211,3],[367,4],[746,3],[927,3],[1530,3],[2382,5]]},"492":{"position":[[515,5]]},"499":{"position":[[245,3],[342,3]]},"501":{"position":[[46,4]]},"516":{"position":[[317,4]]},"518":{"position":[[27,4]]},"520":{"position":[[204,3]]},"522":{"position":[[18,3],[532,4]]},"524":{"position":[[566,5]]},"526":{"position":[[60,5]]},"530":{"position":[[730,4],[1281,3],[1398,5],[1429,3],[1818,3],[2235,5],[2621,4],[3245,3],[3429,3],[4068,3]]},"532":{"position":[[20,3],[357,3],[590,3]]},"534":{"position":[[90,3],[323,3]]},"538":{"position":[[373,3],[407,5],[536,5],[604,3],[825,3],[1316,3],[1406,3],[1507,3],[1840,5]]},"542":{"position":[[253,5]]},"544":{"position":[[131,4],[222,6],[1517,5]]},"551":{"position":[[76,5],[571,3],[631,4],[913,4]]},"555":{"position":[[316,4]]},"557":{"position":[[89,5],[271,3],[519,5],[993,3],[1181,4],[1368,3],[1454,5]]},"559":{"position":[[261,5]]},"561":{"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]]},"566":{"position":[[154,3],[349,3],[423,4],[1044,4],[1188,4],[1211,5]]},"568":{"position":[[387,4],[471,5],[539,4],[697,4],[1171,3],[1922,4],[2090,5],[2754,5],[3145,4]]},"571":{"position":[[115,5]]},"573":{"position":[[40,4],[382,3],[795,3],[1046,5]]},"575":{"position":[[118,3],[1165,3],[1877,5],[1970,5],[2002,3]]},"577":{"position":[[5,5]]},"579":{"position":[[0,3],[249,5]]},"581":{"position":[[59,5]]},"586":{"position":[[0,5]]},"588":{"position":[[217,3]]},"590":{"position":[[112,4]]},"592":{"position":[[206,3],[273,3],[599,3],[833,3],[1110,3]]},"594":{"position":[[115,3],[279,5]]},"596":{"position":[[809,5],[1269,5],[1709,3],[1974,4],[2606,3],[2850,3]]},"619":{"position":[[216,3],[367,4]]},"621":{"position":[[999,3],[1123,3]]},"623":{"position":[[1150,5],[1226,5]]},"625":{"position":[[176,5],[591,5],[1153,4],[1196,3],[1224,3],[1309,5],[1379,5]]},"629":{"position":[[194,5]]},"633":{"position":[[186,4],[198,5]]},"635":{"position":[[1018,4]]},"638":{"position":[[54,5],[123,5],[1052,5]]},"640":{"position":[[409,4]]},"644":{"position":[[45,4],[496,3]]},"648":{"position":[[997,3],[1266,5],[3070,4]]},"653":{"position":[[1562,3],[1810,4],[2518,5],[3794,5],[3838,3],[3893,5]]}}}],["usag",{"_index":679,"t":{"42":{"position":[[407,5],[470,5]]},"69":{"position":[[441,6]]},"72":{"position":[[105,5]]},"315":{"position":[[359,5]]},"319":{"position":[[1551,5]]},"323":{"position":[[554,5]]},"331":{"position":[[1106,5]]},"357":{"position":[[1925,5]]},"359":{"position":[[800,5]]},"368":{"position":[[416,5]]},"381":{"position":[[414,5]]},"476":{"position":[[2479,6]]},"482":{"position":[[1747,5]]},"526":{"position":[[591,5],[626,5]]},"542":{"position":[[172,5]]},"571":{"position":[[104,5]]}}}],["usecas",{"_index":1406,"t":{"147":{"position":[[41,8],[142,8]]},"222":{"position":[[2207,7]]},"242":{"position":[[2188,7]]},"460":{"position":[[116,9]]}}}],["user",{"_index":236,"t":{"15":{"position":[[2674,7],[2877,7],[3035,7],[6008,7]]},"29":{"position":[[1305,6]]},"42":{"position":[[812,4]]},"48":{"position":[[217,4]]},"55":{"position":[[2385,5],[2466,4],[2513,4],[2553,4],[2919,5]]},"59":{"position":[[984,5],[1065,4],[1112,4],[1152,4]]},"61":{"position":[[143,5]]},"65":{"position":[[573,6],[868,5]]},"69":{"position":[[526,4],[597,4]]},"72":{"position":[[27,4],[94,4],[188,4],[355,5],[583,4],[631,4],[973,4],[1094,4]]},"75":{"position":[[253,4]]},"79":{"position":[[714,6],[1009,5]]},"81":{"position":[[279,4]]},"85":{"position":[[370,4],[389,4],[444,4]]},"87":{"position":[[6,5]]},"93":{"position":[[6,5]]},"105":{"position":[[6,5],[360,4]]},"107":{"position":[[415,4],[434,4],[486,4]]},"109":{"position":[[833,4]]},"114":{"position":[[275,6]]},"116":{"position":[[831,4]]},"121":{"position":[[378,6]]},"128":{"position":[[734,6]]},"130":{"position":[[26,4],[197,6]]},"136":{"position":[[174,4],[316,4]]},"142":{"position":[[1293,5]]},"150":{"position":[[17,4]]},"152":{"position":[[704,7],[884,7],[1918,7],[2120,7]]},"164":{"position":[[543,4]]},"172":{"position":[[2108,4],[3172,4],[3214,4]]},"190":{"position":[[562,5]]},"192":{"position":[[258,4]]},"194":{"position":[[421,4]]},"196":{"position":[[268,6],[693,5],[2538,4],[3672,4]]},"198":{"position":[[2331,4],[2448,4],[2493,4],[2616,7],[3163,7]]},"200":{"position":[[2329,4],[4023,4]]},"208":{"position":[[590,4],[631,5],[732,6],[2472,4],[2773,5],[2837,6],[2892,5],[5037,7],[6866,7]]},"222":{"position":[[201,4],[226,6],[273,6],[755,4],[1189,6],[1511,5],[1956,6],[2408,5],[2577,6]]},"228":{"position":[[553,5]]},"238":{"position":[[767,4],[786,4],[848,4]]},"242":{"position":[[201,4],[226,6],[268,6],[738,4],[1166,6],[1492,5],[1939,6],[2394,5],[2562,6]]},"248":{"position":[[173,6],[321,5]]},"253":{"position":[[186,4]]},"263":{"position":[[460,4]]},"265":{"position":[[457,4],[476,4],[535,4]]},"275":{"position":[[926,4],[1557,4]]},"303":{"position":[[931,4],[1031,4],[1097,4]]},"307":{"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]]},"313":{"position":[[747,6]]},"317":{"position":[[421,4],[1886,7],[3351,7]]},"343":{"position":[[1512,6],[2112,4]]},"355":{"position":[[155,4],[175,4]]},"370":{"position":[[68,4]]},"383":{"position":[[829,4],[1140,4],[1298,4],[2273,4],[2322,4],[2717,4]]},"412":{"position":[[4,4],[378,4],[397,5]]},"414":{"position":[[227,7],[406,4],[717,7]]},"418":{"position":[[201,7]]},"421":{"position":[[228,7]]},"423":{"position":[[78,7]]},"425":{"position":[[46,7],[109,7]]},"427":{"position":[[18,7]]},"429":{"position":[[18,7]]},"431":{"position":[[674,7]]},"442":{"position":[[1024,4]]},"444":{"position":[[26,4]]},"454":{"position":[[296,5]]},"476":{"position":[[1825,4],[2043,4]]},"482":{"position":[[2147,7]]},"501":{"position":[[159,4]]},"505":{"position":[[60,4],[108,4],[206,4]]},"530":{"position":[[2507,4],[2923,5],[3043,4]]},"544":{"position":[[774,5]]},"546":{"position":[[171,5]]},"551":{"position":[[49,5],[84,4]]},"596":{"position":[[958,5]]},"625":{"position":[[116,5]]},"635":{"position":[[350,4]]},"638":{"position":[[592,4],[672,4],[1099,5]]},"640":{"position":[[856,4]]},"646":{"position":[[207,5],[1963,4]]},"653":{"position":[[3143,4]]}}}],["user/.config",{"_index":799,"t":{"55":{"position":[[2372,12],[2529,12]]},"59":{"position":[[971,12],[1128,12]]}}}],["user/account",{"_index":2019,"t":{"222":{"position":[[1362,13],[2143,13]]},"242":{"position":[[1338,13],[2124,13]]}}}],["user/password",{"_index":2681,"t":{"383":{"position":[[3105,13],[3353,13]]}}}],["user:group",{"_index":2932,"t":{"476":{"position":[[1795,10]]}}}],["user:kasm",{"_index":807,"t":{"55":{"position":[[2456,9],[2503,9]]},"59":{"position":[[1055,9],[1102,9]]}}}],["user_id",{"_index":1559,"t":{"164":{"position":[[405,9]]}}}],["usera",{"_index":2383,"t":{"325":{"position":[[252,7]]}}}],["userb",{"_index":2386,"t":{"325":{"position":[[336,7]]}}}],["usernam",{"_index":317,"t":{"15":{"position":[[5610,11]]},"38":{"position":[[1294,11]]},"83":{"position":[[435,8]]},"85":{"position":[[428,8],[1834,11],[3244,11]]},"107":{"position":[[470,8],[1940,11],[3390,11]]},"150":{"position":[[2461,11],[3474,11]]},"152":{"position":[[1665,11],[2938,11]]},"202":{"position":[[215,8]]},"206":{"position":[[414,8],[1867,11],[3239,11]]},"208":{"position":[[382,8],[491,8],[2456,8],[2561,8]]},"214":{"position":[[284,8]]},"218":{"position":[[466,8],[1894,11],[3251,11]]},"228":{"position":[[194,8]]},"232":{"position":[[513,8]]},"238":{"position":[[832,8],[2491,11],[3901,11]]},"257":{"position":[[666,10]]},"265":{"position":[[519,8],[2263,11],[3713,11]]},"317":{"position":[[342,8]]},"357":{"position":[[416,9]]},"530":{"position":[[492,8]]},"538":{"position":[[527,8]]},"621":{"position":[[534,11],[849,11]]}}}],["username/apikey",{"_index":2034,"t":{"228":{"position":[[85,15],[444,16],[616,15],[735,15]]}}}],["username/apikey/password",{"_index":2030,"t":{"226":{"position":[[101,24]]}}}],["usersallow",{"_index":1451,"t":{"150":{"position":[[2047,13],[3062,13]]},"152":{"position":[[2342,13]]},"208":{"position":[[637,11],[5101,13],[6930,13]]},"307":{"position":[[439,10],[708,10],[855,13],[1120,13]]},"313":{"position":[[652,10]]},"317":{"position":[[1934,13],[3399,13]]}}}],["usersblock",{"_index":1966,"t":{"208":{"position":[[5146,13],[6975,13]]}}}],["usescas",{"_index":1459,"t":{"152":{"position":[[32,8]]}}}],["usual",{"_index":682,"t":{"42":{"position":[[518,8]]},"194":{"position":[[215,8]]},"198":{"position":[[1075,7]]},"389":{"position":[[202,7]]},"452":{"position":[[993,7]]},"561":{"position":[[1880,8]]}}}],["utmost",{"_index":994,"t":{"69":{"position":[[373,6]]}}}],["v",{"_index":869,"t":{"55":{"position":[[6067,1],[7624,1],[7948,2]]},"166":{"position":[[1313,1],[1344,1]]}}}],["v18.19.1",{"_index":2629,"t":{"375":{"position":[[26,8]]}}}],["valid",{"_index":966,"t":{"67":{"position":[[942,5],[1244,6],[1262,8],[1387,8],[2318,5],[2736,6],[2754,8]]},"81":{"position":[[1183,5],[1485,6],[1503,8],[1628,8],[2601,5],[3019,6],[3037,8]]},"85":{"position":[[688,5],[988,6],[1006,8],[1129,8],[2092,5],[2506,6],[2524,8]]},"91":{"position":[[852,5],[1153,6],[1171,8],[1295,8],[2321,5],[2737,6],[2755,8]]},"99":{"position":[[949,5],[1251,6],[1269,8],[1394,8],[2380,5],[2798,6],[2816,8]]},"103":{"position":[[625,5],[926,6],[944,8],[1068,8],[2002,5],[2418,6],[2436,8]]},"107":{"position":[[737,5],[1044,6],[1062,8],[1192,8],[2202,5],[2630,6],[2648,8]]},"114":{"position":[[1874,5],[2176,6],[2194,8],[2319,8],[3315,5],[3733,6],[3751,8]]},"121":{"position":[[69,5],[1238,5],[1539,6],[1557,8],[1681,8],[2615,5],[3031,6],[3049,8]]},"144":{"position":[[754,5],[1058,6],[1076,8],[1203,8],[2190,5],[2612,6],[2630,8]]},"164":{"position":[[778,5],[1079,6],[1097,8],[1221,8],[2215,5],[2631,6],[2649,8]]},"168":{"position":[[1103,5],[1408,6],[1426,8],[1554,8],[2489,5],[2913,6],[2931,8]]},"196":{"position":[[2827,5],[3817,6]]},"200":{"position":[[990,5],[1295,6],[1313,8],[1441,8],[2693,5],[3117,6],[3135,8]]},"206":{"position":[[753,5],[1052,6],[1070,8],[1192,8],[2116,5],[2528,6],[2546,8]]},"208":{"position":[[3888,5],[4191,6],[4209,8],[4335,8],[5720,5],[6140,6],[6158,8]]},"212":{"position":[[613,5],[915,6],[933,8],[1058,8],[1945,5],[2363,6],[2381,8]]},"218":{"position":[[787,5],[1088,6],[1106,8],[1230,8],[2141,5],[2557,6],[2575,8]]},"232":{"position":[[861,5],[1167,6],[1185,8],[1314,8],[2195,5],[2621,6],[2639,8]]},"236":{"position":[[908,5],[1209,6],[1227,8],[1351,8],[2633,5],[3049,6],[3067,8]]},"238":{"position":[[1092,5],[1392,6],[1410,8],[1533,8],[2749,5],[3163,6],[3181,8]]},"257":{"position":[[935,5],[1240,6],[1258,8],[1386,8],[2275,5],[2699,6],[2717,8]]},"261":{"position":[[1012,5],[1314,6],[1332,8],[1457,8],[2702,5],[3120,6],[3138,8]]},"265":{"position":[[786,5],[1093,6],[1111,8],[1241,8],[2525,5],[2953,6],[2971,8]]},"269":{"position":[[667,5],[968,6],[986,8],[1110,8],[2300,5],[2716,6],[2734,8]]},"273":{"position":[[733,5],[1037,6],[1055,8],[1182,8],[2114,5],[2536,6],[2554,8]]},"277":{"position":[[750,5],[1050,6],[1068,8],[1191,8],[2090,5],[2504,6],[2522,8]]},"281":{"position":[[718,5],[1016,6],[1034,8],[1155,8],[2077,5],[2487,6],[2505,8]]},"289":{"position":[[982,5],[1283,6],[1301,8],[1425,8],[2353,5],[2769,6],[2787,8]]},"295":{"position":[[910,5],[1212,6],[1230,8],[1355,8],[2610,5],[3028,6],[3046,8]]},"301":{"position":[[1221,5],[1521,6],[1539,8],[1662,8],[2643,5],[3057,6],[3075,8]]},"303":{"position":[[2423,5],[2636,5]]},"305":{"position":[[764,5],[1066,6],[1084,8],[1209,8],[2238,5],[2656,6],[2674,8]]},"317":{"position":[[742,5],[1045,6],[1063,8],[1189,8],[2210,5],[2630,6],[2648,8]]},"321":{"position":[[637,5],[935,6],[953,8],[1074,8],[1947,5],[2357,6],[2375,8]]},"329":{"position":[[682,5],[989,6],[1007,8],[1137,8],[2057,5],[2485,6],[2503,8]]},"333":{"position":[[716,5],[1019,6],[1037,8],[1163,8],[2093,5],[2513,6],[2531,8]]},"341":{"position":[[2153,5],[2454,6],[2472,8],[2596,8],[3844,5],[4260,6],[4278,8]]},"345":{"position":[[859,5],[1161,6],[1179,8],[1304,8],[2339,5],[2757,6],[2775,8]]},"349":{"position":[[196,5]]},"383":{"position":[[820,8],[1243,8],[1447,8],[2561,6],[2698,5]]},"393":{"position":[[614,5],[918,6],[936,8],[1063,8],[1950,5],[2372,6],[2390,8]]},"457":{"position":[[330,6]]},"530":{"position":[[635,5]]},"638":{"position":[[98,5],[1189,5],[1679,5]]},"653":{"position":[[2292,5],[2329,5]]}}}],["valkey",{"_index":440,"t":{"23":{"position":[[1272,6],[1560,8]]},"25":{"position":[[369,7],[436,6],[474,6],[625,7],[769,7],[971,6],[1182,9]]},"476":{"position":[[2372,6],[2669,7]]},"478":{"position":[[354,6],[950,6],[1104,8]]},"542":{"position":[[120,6]]},"544":{"position":[[1630,6]]},"625":{"position":[[597,6],[756,6],[800,6],[839,9],[901,9],[1173,7],[1200,6],[1315,7],[1442,9],[1497,9]]}}}],["valkey/valkey",{"_index":460,"t":{"25":{"position":[[640,13],[784,13]]},"476":{"position":[[2684,13]]},"478":{"position":[[1122,13]]}}}],["valkeydata",{"_index":462,"t":{"25":{"position":[[691,11]]},"476":{"position":[[2735,11]]},"478":{"position":[[1180,11]]}}}],["valkeydata:/data",{"_index":461,"t":{"25":{"position":[[665,16],[809,18]]},"476":{"position":[[2709,16]]},"478":{"position":[[1151,16]]}}}],["valu",{"_index":247,"t":{"15":{"position":[[3238,5],[6124,5],[6230,5]]},"19":{"position":[[421,5],[1279,6],[1432,5]]},"29":{"position":[[2271,5],[4246,5]]},"67":{"position":[[203,5]]},"75":{"position":[[734,7]]},"81":{"position":[[203,5]]},"85":{"position":[[199,5]]},"87":{"position":[[1406,5]]},"91":{"position":[[201,5]]},"93":{"position":[[326,6]]},"97":{"position":[[176,5]]},"99":{"position":[[203,5]]},"101":{"position":[[488,5]]},"103":{"position":[[201,5]]},"107":{"position":[[193,5]]},"114":{"position":[[423,6],[1255,5]]},"121":{"position":[[569,6],[777,5]]},"134":{"position":[[1312,6],[1367,6]]},"136":{"position":[[624,5]]},"140":{"position":[[928,5]]},"142":{"position":[[307,5],[685,5]]},"144":{"position":[[199,5]]},"158":{"position":[[107,5],[281,6],[552,5],[757,5],[798,5]]},"164":{"position":[[201,5]]},"168":{"position":[[288,5],[509,6],[630,6],[750,6],[868,6]]},"172":{"position":[[1260,6]]},"194":{"position":[[445,5]]},"200":{"position":[[209,5]]},"204":{"position":[[285,6]]},"206":{"position":[[197,5]]},"208":{"position":[[310,5],[2315,5]]},"210":{"position":[[1028,5]]},"212":{"position":[[203,5]]},"216":{"position":[[289,6]]},"218":{"position":[[201,5]]},"226":{"position":[[197,6]]},"228":{"position":[[283,6]]},"232":{"position":[[195,5]]},"236":{"position":[[215,5]]},"238":{"position":[[568,5]]},"246":{"position":[[92,5],[151,5]]},"257":{"position":[[195,5]]},"261":{"position":[[217,5]]},"265":{"position":[[207,5]]},"269":{"position":[[215,5]]},"273":{"position":[[193,5]]},"275":{"position":[[1129,7],[1693,5]]},"277":{"position":[[199,5],[381,6],[489,6]]},"281":{"position":[[195,5]]},"283":{"position":[[642,6]]},"289":{"position":[[201,5]]},"295":{"position":[[374,5]]},"301":{"position":[[324,5]]},"305":{"position":[[203,5]]},"313":{"position":[[200,5]]},"317":{"position":[[205,5]]},"319":{"position":[[926,6]]},"321":{"position":[[195,5]]},"329":{"position":[[193,5]]},"333":{"position":[[205,5]]},"341":{"position":[[202,6],[1664,5]]},"343":{"position":[[791,5]]},"345":{"position":[[195,5]]},"359":{"position":[[688,5],[862,5],[917,6]]},"363":{"position":[[210,5],[272,6]]},"383":{"position":[[468,5]]},"393":{"position":[[199,5]]},"397":{"position":[[1038,6]]},"418":{"position":[[399,5]]},"530":{"position":[[226,6],[847,6],[2670,6],[3596,6]]},"532":{"position":[[443,5],[1024,5],[1167,5],[1309,5],[1447,5]]},"534":{"position":[[176,5]]},"536":{"position":[[162,5],[305,5],[447,5],[585,5]]},"538":{"position":[[861,6],[894,6],[1551,6],[2249,5],[2274,6]]},"561":{"position":[[5252,5]]},"568":{"position":[[745,6]]},"621":{"position":[[110,6]]}}}],["vaniti",{"_index":952,"t":{"67":{"position":[[225,6]]},"81":{"position":[[225,6]]},"85":{"position":[[219,6]]},"91":{"position":[[222,6]]},"99":{"position":[[225,6]]},"103":{"position":[[222,6]]},"107":{"position":[[210,6]]},"114":{"position":[[1277,6]]},"121":{"position":[[798,6]]},"144":{"position":[[219,6]]},"164":{"position":[[222,6]]},"168":{"position":[[305,6]]},"200":{"position":[[234,6]]},"206":{"position":[[216,6]]},"208":{"position":[[2338,6]]},"212":{"position":[[225,6]]},"218":{"position":[[222,6]]},"232":{"position":[[213,6]]},"236":{"position":[[243,6]]},"238":{"position":[[595,6]]},"257":{"position":[[213,6]]},"261":{"position":[[246,6]]},"265":{"position":[[231,6]]},"269":{"position":[[243,6]]},"273":{"position":[[210,6]]},"277":{"position":[[219,6]]},"281":{"position":[[213,6]]},"289":{"position":[[222,6]]},"295":{"position":[[403,6]]},"301":{"position":[[344,6]]},"305":{"position":[[225,6]]},"317":{"position":[[228,6]]},"321":{"position":[[213,6]]},"329":{"position":[[210,6]]},"333":{"position":[[228,6]]},"341":{"position":[[1692,6]]},"345":{"position":[[213,6]]},"393":{"position":[[219,6]]}}}],["var",{"_index":1878,"t":{"198":{"position":[[1840,4]]}}}],["var/run/avahi",{"_index":1591,"t":{"166":{"position":[[1346,14]]}}}],["var/run/dbus:/var/run/dbu",{"_index":1590,"t":{"166":{"position":[[1315,27]]}}}],["vari",{"_index":488,"t":{"29":{"position":[[91,4]]},"648":{"position":[[460,7]]}}}],["variabl",{"_index":148,"t":{"15":{"position":[[62,9],[334,9],[1039,9],[1240,9],[1255,8],[3410,9]]},"19":{"position":[[84,9],[448,8],[726,10],[1188,8],[1567,8],[1739,8]]},"55":{"position":[[6795,9],[8671,9],[10175,9]]},"67":{"position":[[93,8]]},"81":{"position":[[93,8]]},"83":{"position":[[1529,8]]},"85":{"position":[[93,8]]},"91":{"position":[[93,8]]},"99":{"position":[[93,8]]},"103":{"position":[[93,8]]},"107":{"position":[[93,8]]},"114":{"position":[[1145,8]]},"121":{"position":[[669,8]]},"144":{"position":[[93,8]]},"164":{"position":[[93,8]]},"168":{"position":[[188,8]]},"200":{"position":[[93,8]]},"206":{"position":[[93,8]]},"208":{"position":[[2203,8]]},"212":{"position":[[93,8]]},"218":{"position":[[93,8]]},"232":{"position":[[93,8]]},"236":{"position":[[93,8]]},"238":{"position":[[448,8]]},"257":{"position":[[93,8]]},"261":{"position":[[93,8]]},"265":{"position":[[93,8]]},"269":{"position":[[93,8]]},"273":{"position":[[93,8]]},"277":{"position":[[93,8]]},"281":{"position":[[93,8]]},"289":{"position":[[93,8]]},"295":{"position":[[250,8]]},"297":{"position":[[1603,8]]},"301":{"position":[[218,8]]},"305":{"position":[[93,8]]},"317":{"position":[[93,8]]},"321":{"position":[[93,8]]},"329":{"position":[[93,8]]},"333":{"position":[[93,8]]},"341":{"position":[[1542,8]]},"345":{"position":[[93,8]]},"393":{"position":[[93,8]]},"448":{"position":[[1515,8]]},"476":{"position":[[1501,8],[1979,9]]},"482":{"position":[[496,9],[893,9],[2411,9]]},"528":{"position":[[420,9]]},"538":{"position":[[1177,8]]},"621":{"position":[[58,10]]}}}],["variou",{"_index":2577,"t":{"363":{"position":[[932,8],[975,8]]},"412":{"position":[[284,7]]},"414":{"position":[[316,8]]},"429":{"position":[[49,8]]}}}],["verbos",{"_index":1540,"t":{"162":{"position":[[271,8]]}}}],["veri",{"_index":171,"t":{"15":{"position":[[624,4]]},"31":{"position":[[262,4]]},"172":{"position":[[4786,4]]},"190":{"position":[[584,4]]},"196":{"position":[[1825,4]]},"368":{"position":[[212,4]]},"490":{"position":[[178,4]]},"653":{"position":[[3863,4]]}}}],["verifi",{"_index":122,"t":{"11":{"position":[[656,8]]},"19":{"position":[[1694,6],[1854,6]]},"109":{"position":[[1810,10]]},"230":{"position":[[148,6],[713,6]]},"255":{"position":[[148,6],[718,6]]},"309":{"position":[[396,6]]},"319":{"position":[[293,6],[492,6]]},"452":{"position":[[711,6]]},"524":{"position":[[602,6]]},"653":{"position":[[3226,8]]}}}],["version",{"_index":476,"t":{"27":{"position":[[143,8]]},"83":{"position":[[1481,8]]},"114":{"position":[[1024,7]]},"128":{"position":[[1053,7]]},"190":{"position":[[802,8],[1077,8]]},"230":{"position":[[381,9]]},"255":{"position":[[381,9]]},"347":{"position":[[556,8]]},"365":{"position":[[921,8],[976,8]]},"375":{"position":[[170,8],[370,7]]},"412":{"position":[[250,8]]},"414":{"position":[[290,9]]},"423":{"position":[[26,8],[105,9]]},"482":{"position":[[247,7]]},"510":{"position":[[119,7],[379,8],[464,9]]},"512":{"position":[[436,7]]},"514":{"position":[[6,8]]},"516":{"position":[[36,8],[211,7]]},"518":{"position":[[16,10],[55,7],[80,7],[175,7],[426,9]]},"522":{"position":[[99,7],[240,7]]},"524":{"position":[[12,7],[99,7],[188,7],[277,8],[480,7],[685,8],[701,7],[750,7]]},"538":{"position":[[1129,8]]},"631":{"position":[[141,7],[209,8],[304,8],[361,8],[490,9]]},"646":{"position":[[1859,7],[1928,7],[1991,8]]}}}],["via",{"_index":96,"t":{"11":{"position":[[98,3],[445,3],[665,3]]},"38":{"position":[[767,3],[1120,3]]},"172":{"position":[[2138,3]]},"177":{"position":[[120,4]]},"190":{"position":[[672,3],[887,3]]},"192":{"position":[[56,3]]},"202":{"position":[[188,3]]},"206":{"position":[[446,3],[517,3]]},"373":{"position":[[313,3]]},"530":{"position":[[1668,3],[1840,3]]}}}],["video",{"_index":1940,"t":{"208":{"position":[[1234,6]]}}}],["view",{"_index":765,"t":{"55":{"position":[[985,7],[1071,7]]},"65":{"position":[[937,4]]},"79":{"position":[[1078,4]]},"101":{"position":[[168,4]]},"116":{"position":[[1746,4],[2000,4]]},"253":{"position":[[492,4]]},"309":{"position":[[484,4]]},"335":{"position":[[106,7]]},"341":{"position":[[649,4]]},"476":{"position":[[1212,4],[1312,4]]},"488":{"position":[[186,4]]},"526":{"position":[[514,7]]},"538":{"position":[[1926,4]]}}}],["vinyl",{"_index":3229,"t":{"568":{"position":[[1782,5]]}}}],["violat",{"_index":722,"t":{"48":{"position":[[174,8]]},"69":{"position":[[576,9]]},"72":{"position":[[111,8]]},"156":{"position":[[85,9]]}}}],["virtual",{"_index":1747,"t":{"172":{"position":[[5063,9]]}}}],["visibl",{"_index":911,"t":{"65":{"position":[[556,7],[671,8]]},"75":{"position":[[1707,7]]},"79":{"position":[[697,7],[812,8]]},"646":{"position":[[1945,10]]}}}],["visit",{"_index":1119,"t":{"89":{"position":[[257,5]]},"95":{"position":[[257,5]]},"194":{"position":[[129,5]]},"196":{"position":[[1054,5],[1838,5]]},"303":{"position":[[5419,5]]},"343":{"position":[[5215,5]]},"383":{"position":[[2336,5]]},"530":{"position":[[1153,5],[3931,5]]},"540":{"position":[[375,5]]},"610":{"position":[[278,8],[355,5]]}}}],["vite",{"_index":2983,"t":{"482":{"position":[[1660,7]]}}}],["vitej",{"_index":2628,"t":{"373":{"position":[[284,6]]}}}],["vlc",{"_index":1316,"t":{"125":{"position":[[973,3]]},"277":{"position":[[1845,6],[3191,6]]},"319":{"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]]},"321":{"position":[[347,3],[516,3],[720,3],[1057,3],[1134,3],[1352,3],[1972,3],[2161,3],[2677,3],[3078,5]]},"357":{"position":[[1657,3]]},"468":{"position":[[61,3],[88,3]]},"596":{"position":[[504,3]]}}}],["vlc.json",{"_index":2555,"t":{"357":{"position":[[1674,8]]}}}],["vlc_enabl",{"_index":2365,"t":{"321":{"position":[[246,10]]}}}],["vlc_id",{"_index":2363,"t":{"321":{"position":[[127,6],[204,6]]}}}],["vlc_name",{"_index":2364,"t":{"321":{"position":[[179,8]]}}}],["vlc_password",{"_index":2368,"t":{"321":{"position":[[372,12]]}}}],["vlc_url",{"_index":2366,"t":{"321":{"position":[[301,7]]}}}],["vldjjo",{"_index":2586,"t":{"365":{"position":[[731,8]]}}}],["vnc",{"_index":748,"t":{"55":{"position":[[415,4],[2161,3],[2253,3]]},"59":{"position":[[760,3],[852,3]]}}}],["vnc_pw",{"_index":793,"t":{"55":{"position":[[2264,7],[2965,6]]},"59":{"position":[[863,7]]},"61":{"position":[[189,6]]}}}],["volum",{"_index":442,"t":{"23":{"position":[[1332,6]]},"25":{"position":[[555,6],[654,8],[682,8],[798,8]]},"55":{"position":[[1540,6],[1611,6],[1692,6],[2002,8],[2312,8],[2664,8],[6429,6],[6575,8],[7876,8],[8309,6],[8451,8]]},"59":{"position":[[139,6],[210,6],[291,6],[601,8],[911,8],[1263,8]]},"150":{"position":[[1447,8]]},"154":{"position":[[1613,8]]},"275":{"position":[[1225,8]]},"331":{"position":[[493,8]]},"403":{"position":[[1013,8]]},"476":{"position":[[299,8],[615,8],[2698,8],[2726,8]]},"478":{"position":[[1033,8],[1138,8],[1168,9]]},"528":{"position":[[457,8]]},"557":{"position":[[2093,8]]}}}],["volume/bind",{"_index":437,"t":{"23":{"position":[[1090,11]]}}}],["vote",{"_index":3120,"t":{"544":{"position":[[780,6]]},"546":{"position":[[177,6]]}}}],["vp",{"_index":612,"t":{"36":{"position":[[168,3]]}}}],["vpn",{"_index":2378,"t":{"323":{"position":[[721,3]]}}}],["vs",{"_index":1667,"t":{"172":{"position":[[1453,3]]},"395":{"position":[[540,3]]},"397":{"position":[[838,3]]}}}],["vscode",{"_index":2637,"t":{"377":{"position":[[65,7],[321,6]]}}}],["vulfpeck",{"_index":2898,"t":{"470":{"position":[[1878,8]]}}}],["w+.com)/i",{"_index":2759,"t":{"416":{"position":[[669,17]]}}}],["wait",{"_index":1324,"t":{"128":{"position":[[339,5]]},"134":{"position":[[764,5]]},"343":{"position":[[4186,4]]},"448":{"position":[[65,5]]}}}],["wall",{"_index":1202,"t":{"109":{"position":[[692,6]]},"116":{"position":[[690,6]]}}}],["want",{"_index":204,"t":{"15":{"position":[[1594,4],[1655,4],[3722,4],[3828,4],[3907,4]]},"19":{"position":[[1874,4]]},"55":{"position":[[3290,4],[6002,4],[7559,4]]},"65":{"position":[[642,4],[819,4]]},"69":{"position":[[1422,4]]},"75":{"position":[[1866,4]]},"79":{"position":[[783,4],[960,4]]},"150":{"position":[[82,4],[130,4],[203,4],[296,4],[359,4]]},"152":{"position":[[232,4],[309,4],[425,4]]},"154":{"position":[[112,4],[303,4],[376,4],[533,4]]},"162":{"position":[[527,4]]},"184":{"position":[[88,4]]},"198":{"position":[[2185,4],[2355,4]]},"208":{"position":[[700,4],[1467,4]]},"226":{"position":[[208,5],[619,5]]},"228":{"position":[[310,5]]},"246":{"position":[[118,4]]},"297":{"position":[[331,4]]},"307":{"position":[[647,4]]},"323":{"position":[[238,5]]},"343":{"position":[[2245,5]]},"359":{"position":[[777,4]]},"410":{"position":[[26,4],[119,4]]},"499":{"position":[[211,4],[291,4]]},"512":{"position":[[452,4]]},"530":{"position":[[3279,4]]},"532":{"position":[[349,4]]},"534":{"position":[[82,4]]},"544":{"position":[[1563,4]]},"559":{"position":[[68,4]]},"566":{"position":[[341,4],[1740,4]]},"568":{"position":[[348,4],[1213,4]]},"579":{"position":[[127,4]]},"588":{"position":[[14,4],[85,4]]},"592":{"position":[[101,4],[198,4]]},"625":{"position":[[1188,4]]}}}],["wantedby=default.target",{"_index":3030,"t":{"503":{"position":[[416,23]]}}}],["warn",{"_index":276,"t":{"15":{"position":[[4626,7],[5461,7],[5685,7]]},"19":{"position":[[1502,7],[1510,5],[1591,4]]},"33":{"position":[[182,7]]},"38":{"position":[[776,4],[971,7],[1129,4],[1369,7]]},"55":{"position":[[8962,7]]},"156":{"position":[[0,7]]},"188":{"position":[[412,7]]},"275":{"position":[[1295,7]]},"297":{"position":[[1482,7]]},"343":{"position":[[0,7],[1346,7],[4740,7]]},"457":{"position":[[71,4]]},"561":{"position":[[6038,7]]}}}],["watch",{"_index":1047,"t":{"75":{"position":[[1586,9]]}}}],["wax",{"_index":2904,"t":{"470":{"position":[[1982,3]]}}}],["way",{"_index":258,"t":{"15":{"position":[[3998,3]]},"29":{"position":[[1453,3]]},"72":{"position":[[204,3]]},"196":{"position":[[160,4]]},"198":{"position":[[1529,3]]},"210":{"position":[[1853,3]]},"275":{"position":[[815,3]]},"355":{"position":[[80,3]]},"383":{"position":[[2931,3]]},"454":{"position":[[777,3]]},"470":{"position":[[673,3]]},"495":{"position":[[137,4]]},"532":{"position":[[397,3]]},"534":{"position":[[130,3]]},"544":{"position":[[366,3],[1239,3]]},"548":{"position":[[143,3]]},"566":{"position":[[263,3]]},"575":{"position":[[321,4]]},"596":{"position":[[2723,3]]}}}],["web",{"_index":604,"t":{"33":{"position":[[146,3]]},"55":{"position":[[2180,3]]},"59":{"position":[[779,3]]},"89":{"position":[[344,3]]},"95":{"position":[[344,3]]},"136":{"position":[[419,3]]},"140":{"position":[[746,3]]},"194":{"position":[[120,3]]},"196":{"position":[[337,3],[766,3],[1802,3],[1881,3],[1920,3]]},"202":{"position":[[72,3]]},"206":{"position":[[450,3],[521,3]]},"208":{"position":[[101,3]]},"210":{"position":[[846,3]]},"214":{"position":[[70,3]]},"303":{"position":[[4227,3],[5429,3]]},"319":{"position":[[35,3],[285,3]]},"335":{"position":[[102,3]]},"343":{"position":[[2208,3]]},"373":{"position":[[142,3]]},"385":{"position":[[426,3]]},"448":{"position":[[2023,3]]},"450":{"position":[[182,3],[200,3],[484,3]]},"454":{"position":[[529,3]]},"482":{"position":[[1613,3],[2322,3]]},"524":{"position":[[80,3]]},"596":{"position":[[1006,3]]},"600":{"position":[[128,3]]},"635":{"position":[[50,3]]}}}],["webhook",{"_index":302,"t":{"15":{"position":[[5313,11]]},"38":{"position":[[0,8],[187,8],[249,7],[286,8],[322,7],[402,11]]},"323":{"position":[[101,7],[282,8]]},"383":{"position":[[1692,8]]},"542":{"position":[[414,8]]},"596":{"position":[[815,8]]},"635":{"position":[[1023,8]]}}}],["webscrobbl",{"_index":605,"t":{"33":{"position":[[233,14]]},"125":{"position":[[936,12]]},"134":{"position":[[268,13]]},"323":{"position":[[21,12],[314,12],[644,12]]},"325":{"position":[[31,12]]},"327":{"position":[[301,12]]},"329":{"position":[[348,12],[428,12],[552,12],[765,12],[1111,12],[1197,12],[1433,12],[2082,12],[2280,12],[2805,12],[3226,14]]},"448":{"position":[[79,12],[409,14],[434,14],[664,14],[689,14],[2425,13]]},"476":{"position":[[876,14]]},"596":{"position":[[491,12]]},"653":{"position":[[251,14],[1193,13]]}}}],["webscrobbler.json",{"_index":2380,"t":{"325":{"position":[[161,17]]}}}],["webscrobbler/lfm",{"_index":2837,"t":{"448":{"position":[[1697,16]]}}}],["websit",{"_index":1133,"t":{"93":{"position":[[131,7]]},"114":{"position":[[200,7]]},"116":{"position":[[1729,8]]},"196":{"position":[[838,7]]},"327":{"position":[[101,7],[128,8]]},"470":{"position":[[191,8]]},"532":{"position":[[566,7]]},"534":{"position":[[299,7]]}}}],["websocket",{"_index":1370,"t":{"140":{"position":[[130,11],[302,10]]},"271":{"position":[[49,9]]},"273":{"position":[[352,9]]},"383":{"position":[[1887,9]]}}}],["week",{"_index":1100,"t":{"87":{"position":[[314,5],[765,4]]}}}],["weight",{"_index":1701,"t":{"172":{"position":[[3664,8]]},"568":{"position":[[2388,6],[2730,7],[2774,7]]}}}],["well",{"_index":380,"t":{"21":{"position":[[125,4]]},"27":{"position":[[313,4]]},"38":{"position":[[1520,4]]},"134":{"position":[[963,4]]},"154":{"position":[[92,4]]},"297":{"position":[[558,4]]},"383":{"position":[[167,4],[1571,4]]},"452":{"position":[[566,5]]},"462":{"position":[[119,5]]},"510":{"position":[[267,4]]},"542":{"position":[[36,4]]},"561":{"position":[[6323,4],[6425,4]]},"573":{"position":[[776,5]]},"579":{"position":[[97,4]]},"610":{"position":[[165,4]]}}}],["went",{"_index":2915,"t":{"470":{"position":[[3021,4]]}}}],["wgxl6bsuq343",{"_index":2484,"t":{"343":{"position":[[2716,16],[3945,17]]}}}],["whatev",{"_index":1067,"t":{"83":{"position":[[554,8]]},"134":{"position":[[432,8]]},"323":{"position":[[224,9]]},"343":{"position":[[2232,8]]},"538":{"position":[[642,8]]},"592":{"position":[[238,8]]}}}],["whatever.tld/subdir/api",{"_index":2488,"t":{"343":{"position":[[3585,26]]}}}],["wheatu",{"_index":2722,"t":{"395":{"position":[[772,10],[954,10]]},"561":{"position":[[3058,10],[4525,10],[4689,7],[4730,8],[4937,10],[5475,10],[5537,9],[5695,10]]},"575":{"position":[[675,10],[921,10]]}}}],["when/if",{"_index":2878,"t":{"470":{"position":[[349,7]]}}}],["whether",{"_index":47,"t":{"7":{"position":[[440,7]]},"72":{"position":[[543,7]]},"359":{"position":[[23,7]]},"653":{"position":[[2676,7]]}}}],["whistl",{"_index":3326,"t":{"635":{"position":[[146,9]]}}}],["whitelist",{"_index":2151,"t":{"277":{"position":[[1830,12],[3176,12]]},"285":{"position":[[263,9]]},"329":{"position":[[1822,12],[3182,12]]}}}],["whitelistedapp",{"_index":1627,"t":{"168":{"position":[[2265,18],[3642,18]]}}}],["whitelisteddevic",{"_index":1625,"t":{"168":{"position":[[2216,21],[3593,21]]}}}],["whitespac",{"_index":1637,"t":{"172":{"position":[[252,11]]}}}],["whole",{"_index":1723,"t":{"172":{"position":[[4433,5],[4466,5]]}}}],["whose",{"_index":2195,"t":{"289":{"position":[[456,5],[566,5]]}}}],["wide",{"_index":487,"t":{"29":{"position":[[84,6]]}}}],["wider",{"_index":3121,"t":{"544":{"position":[[824,5]]},"546":{"position":[[221,5]]}}}],["window",{"_index":831,"t":{"55":{"position":[[4039,7],[4859,7],[5411,7],[8834,7],[9050,7],[9734,7]]},"87":{"position":[[770,6],[1175,6]]},"158":{"position":[[356,7]]},"160":{"position":[[509,6]]},"166":{"position":[[996,7]]},"319":{"position":[[196,6]]},"389":{"position":[[250,6]]},"482":{"position":[[972,7]]}}}],["wish",{"_index":439,"t":{"23":{"position":[[1173,4]]},"285":{"position":[[7,4]]},"383":{"position":[[607,4]]},"403":{"position":[[161,4]]},"470":{"position":[[1992,4]]},"530":{"position":[[3022,4],[3175,4]]},"557":{"position":[[329,4],[1052,4]]},"653":{"position":[[1554,4]]}}}],["within",{"_index":222,"t":{"15":{"position":[[2387,6]]},"19":{"position":[[323,6],[1286,6]]},"160":{"position":[[500,6]]},"172":{"position":[[3020,6]]},"303":{"position":[[1407,6]]},"327":{"position":[[290,6]]},"351":{"position":[[305,6]]},"355":{"position":[[521,6]]},"357":{"position":[[1944,6]]},"363":{"position":[[7,6],[32,6]]},"561":{"position":[[6728,6]]}}}],["without",{"_index":756,"t":{"55":{"position":[[778,7],[3546,7],[4924,7]]},"65":{"position":[[3541,7]]},"69":{"position":[[1267,7]]},"75":{"position":[[292,7],[1171,7]]},"79":{"position":[[3749,7]]},"196":{"position":[[348,7]]},"198":{"position":[[1417,7]]},"222":{"position":[[2701,7]]},"232":{"position":[[345,7]]},"236":{"position":[[1668,7]]},"238":{"position":[[1847,7]]},"242":{"position":[[2674,7]]},"257":{"position":[[345,7]]},"261":{"position":[[1777,7]]},"265":{"position":[[1576,7]]},"269":{"position":[[1427,7]]},"287":{"position":[[289,7]]},"295":{"position":[[1675,7]]},"303":{"position":[[4857,7]]},"315":{"position":[[513,7]]},"341":{"position":[[2913,7]]},"375":{"position":[[391,7]]},"383":{"position":[[2638,7]]},"440":{"position":[[499,7]]},"460":{"position":[[153,7]]},"464":{"position":[[538,7]]},"510":{"position":[[57,7]]},"518":{"position":[[39,7]]},"561":{"position":[[6018,7]]},"568":{"position":[[477,7]]},"573":{"position":[[45,7]]},"577":{"position":[[162,7]]},"596":{"position":[[2178,7],[2275,7]]},"653":{"position":[[2646,7]]}}}],["won't",{"_index":1779,"t":{"186":{"position":[[213,5]]},"575":{"position":[[352,5]]}}}],["word",{"_index":1647,"t":{"172":{"position":[[575,4],[634,5]]}}}],["work",{"_index":359,"t":{"19":{"position":[[1262,5]]},"40":{"position":[[154,7]]},"55":{"position":[[3208,5],[3592,4],[6693,4],[8569,4],[8825,4],[8913,7],[10085,4]]},"61":{"position":[[432,5]]},"109":{"position":[[208,5]]},"116":{"position":[[206,5]]},"118":{"position":[[26,4]]},"156":{"position":[[247,4]]},"160":{"position":[[695,6]]},"188":{"position":[[452,4]]},"192":{"position":[[179,6]]},"222":{"position":[[3090,8]]},"230":{"position":[[84,7],[418,6]]},"242":{"position":[[3044,8]]},"255":{"position":[[84,7],[418,6]]},"283":{"position":[[333,5]]},"291":{"position":[[303,4]]},"297":{"position":[[553,4]]},"303":{"position":[[624,4],[2371,5]]},"323":{"position":[[491,4]]},"335":{"position":[[382,4]]},"343":{"position":[[133,7],[194,5],[1541,7],[1631,5],[4807,4]]},"375":{"position":[[237,7]]},"450":{"position":[[429,5]]},"452":{"position":[[1166,7]]},"454":{"position":[[350,8]]},"462":{"position":[[166,5],[226,5]]},"482":{"position":[[83,7],[565,7],[822,7]]},"544":{"position":[[1473,4]]},"548":{"position":[[377,4]]},"568":{"position":[[1989,4]]},"640":{"position":[[885,4]]},"648":{"position":[[663,4]]}}}],["workflow",{"_index":1753,"t":{"174":{"position":[[375,8]]}}}],["workingdirectory=/path/to/multi",{"_index":3026,"t":{"503":{"position":[[319,31]]}}}],["workspac",{"_index":744,"t":{"55":{"position":[[285,10]]},"377":{"position":[[25,9]]}}}],["world",{"_index":2910,"t":{"470":{"position":[[2087,5]]}}}],["worldwid",{"_index":3208,"t":{"566":{"position":[[1084,11]]},"573":{"position":[[571,9],[984,9]]}}}],["worri",{"_index":1754,"t":{"174":{"position":[[422,5]]},"653":{"position":[[2664,5]]}}}],["worst",{"_index":1795,"t":{"190":{"position":[[1408,5]]}}}],["wrap",{"_index":1269,"t":{"116":{"position":[[1936,7]]}}}],["wrapped.baileytownsend.dev",{"_index":1268,"t":{"116":{"position":[[1905,26]]}}}],["write",{"_index":965,"t":{"67":{"position":[[934,5],[2310,5]]},"81":{"position":[[1175,5],[2593,5]]},"85":{"position":[[680,5],[2084,5]]},"91":{"position":[[844,5],[2313,5]]},"99":{"position":[[941,5],[2372,5]]},"103":{"position":[[617,5],[1994,5]]},"107":{"position":[[729,5],[2194,5]]},"109":{"position":[[469,5],[1086,8]]},"114":{"position":[[1866,5],[3307,5]]},"116":{"position":[[467,5],[1084,8]]},"121":{"position":[[1230,5],[2607,5]]},"144":{"position":[[746,5],[2182,5]]},"164":{"position":[[770,5],[2207,5]]},"168":{"position":[[1095,5],[2481,5]]},"200":{"position":[[982,5],[2685,5]]},"206":{"position":[[745,5],[2108,5]]},"208":{"position":[[3880,5],[5712,5]]},"212":{"position":[[605,5],[1937,5]]},"218":{"position":[[779,5],[2133,5]]},"232":{"position":[[853,5],[2187,5]]},"236":{"position":[[900,5],[2625,5]]},"238":{"position":[[1084,5],[2741,5]]},"257":{"position":[[927,5],[2267,5]]},"261":{"position":[[1004,5],[2694,5]]},"265":{"position":[[778,5],[2517,5]]},"269":{"position":[[659,5],[2292,5]]},"273":{"position":[[725,5],[2106,5]]},"277":{"position":[[742,5],[2082,5]]},"281":{"position":[[710,5],[2069,5]]},"289":{"position":[[974,5],[2345,5]]},"295":{"position":[[902,5],[2602,5]]},"301":{"position":[[1213,5],[2635,5]]},"305":{"position":[[756,5],[2230,5]]},"317":{"position":[[734,5],[2202,5]]},"321":{"position":[[629,5],[1939,5]]},"329":{"position":[[674,5],[2049,5]]},"333":{"position":[[708,5],[2085,5]]},"341":{"position":[[2145,5],[3836,5]]},"345":{"position":[[851,5],[2331,5]]},"393":{"position":[[606,5],[1942,5]]},"470":{"position":[[2488,5]]}}}],["written",{"_index":2622,"t":{"373":{"position":[[19,7]]}}}],["wrong",{"_index":3250,"t":{"575":{"position":[[1842,6]]},"581":{"position":[[69,5]]}}}],["ws",{"_index":2389,"t":{"327":{"position":[[66,2]]}}}],["ws://192.168.0.101",{"_index":1372,"t":{"140":{"position":[[393,20]]},"144":{"position":[[1885,21],[3315,21]]}}}],["ws://192.168.0.101/api/live/nowplaying/websocket",{"_index":1373,"t":{"140":{"position":[[417,48]]}}}],["ws://192.168.0.101:3456/mopidy/w",{"_index":2178,"t":{"283":{"position":[[1180,34]]}}}],["ws://azura.mydomain.com",{"_index":1374,"t":{"140":{"position":[[466,25]]}}}],["ws://azura.mydomain.com.com/api/live/nowplaying/websocket",{"_index":1375,"t":{"140":{"position":[[495,57]]}}}],["ws://localhost:6680/mopidy/w",{"_index":2172,"t":{"283":{"position":[[542,29],[1070,29]]},"289":{"position":[[331,30]]}}}],["ws://localhost:7905",{"_index":2120,"t":{"271":{"position":[[469,19]]},"273":{"position":[[311,19],[1863,22],[3238,22]]}}}],["ws://mopidy.mydomain.com:6680/mopidy/w",{"_index":2177,"t":{"283":{"position":[[1120,40]]}}}],["ws://mopidy.mydomain.com:80/mopw",{"_index":2180,"t":{"283":{"position":[[1244,33]]}}}],["ws_blacklist",{"_index":2394,"t":{"329":{"position":[[297,12]]}}}],["ws_enabl",{"_index":2393,"t":{"329":{"position":[[243,9]]}}}],["ws_id",{"_index":2391,"t":{"329":{"position":[[127,5],[202,5]]}}}],["ws_name",{"_index":2392,"t":{"329":{"position":[[178,7]]}}}],["ws_whitelist",{"_index":2395,"t":{"329":{"position":[[372,12]]}}}],["wss://mydomain.com/custom/azura/w",{"_index":1376,"t":{"140":{"position":[[553,36],[593,34]]}}}],["ws|wss]://host:[port",{"_index":1369,"t":{"140":{"position":[[59,22]]},"271":{"position":[[241,22]]}}}],["x",{"_index":549,"t":{"29":{"position":[[2415,1],[4390,1]]},"333":{"position":[[466,1]]},"470":{"position":[[3119,2],[3180,2],[3196,1]]},"642":{"position":[[840,1]]}}}],["x11",{"_index":1562,"t":{"164":{"position":[[486,5]]},"448":{"position":[[543,5],[754,5]]}}}],["x86",{"_index":759,"t":{"55":{"position":[[854,3]]},"474":{"position":[[36,3]]}}}],["x86/arm",{"_index":3267,"t":{"596":{"position":[[1293,7]]}}}],["x86_64",{"_index":2823,"t":{"448":{"position":[[555,7],[766,7]]}}}],["xdg_config_home/multi",{"_index":2965,"t":{"482":{"position":[[990,22]]}}}],["xdg_data_home/multi",{"_index":2967,"t":{"482":{"position":[[1060,20]]}}}],["xdg_runtime_dir",{"_index":795,"t":{"55":{"position":[[2280,16]]},"59":{"position":[[879,16]]}}}],["xml",{"_index":2307,"t":{"309":{"position":[[489,3]]}}}],["xw",{"_index":1499,"t":{"154":{"position":[[2221,7],[3420,7]]},"566":{"position":[[1066,2]]},"573":{"position":[[615,6],[1028,7]]},"586":{"position":[[397,7]]},"590":{"position":[[494,7]]},"594":{"position":[[793,7],[1372,7]]}}}],["xxx",{"_index":2977,"t":{"482":{"position":[[1404,5],[1427,5]]}}}],["y",{"_index":2796,"t":{"440":{"position":[[486,1]]},"470":{"position":[[3122,2],[3188,2]]}}}],["y4j3",{"_index":1293,"t":{"121":{"position":[[2407,5],[3787,5]]},"341":{"position":[[960,6],[1169,6],[1399,6],[3578,6],[5016,6]]}}}],["yamaha",{"_index":1317,"t":{"125":{"position":[[1001,6]]},"596":{"position":[[508,6]]}}}],["yamahaextendedcontrol",{"_index":2712,"t":{"393":{"position":[[349,21]]}}}],["yandex",{"_index":1319,"t":{"125":{"position":[[1042,6]]},"331":{"position":[[13,6],[131,6],[145,6],[194,6],[404,6],[568,6],[949,6],[1060,6],[1134,6],[1364,6],[1523,6]]},"333":{"position":[[1772,7],[3146,7]]},"596":{"position":[[525,6]]}}}],["ye",{"_index":1543,"t":{"162":{"position":[[371,3],[413,3],[504,3]]},"596":{"position":[[2593,4]]}}}],["year",{"_index":3119,"t":{"544":{"position":[[754,4]]},"546":{"position":[[151,4]]}}}],["yearinmusic.teal.fm",{"_index":1267,"t":{"116":{"position":[[1882,19]]}}}],["ym_api_key=chang",{"_index":2409,"t":{"331":{"position":[[705,17]]}}}],["ym_enable_ynison=tru",{"_index":2412,"t":{"331":{"position":[[760,21]]}}}],["ym_language=ru",{"_index":2411,"t":{"331":{"position":[[743,14]]}}}],["ym_log_level=info",{"_index":2415,"t":{"331":{"position":[[825,17]]}}}],["ym_port=9980",{"_index":2410,"t":{"331":{"position":[[728,12]]}}}],["ym_push_ttl=45",{"_index":2413,"t":{"331":{"position":[[784,14]]}}}],["ym_queue_cache_ttl=15",{"_index":2414,"t":{"331":{"position":[[801,21]]}}}],["ym_token",{"_index":2417,"t":{"331":{"position":[[932,8]]}}}],["ym_token=agaaaaaco3_345345",{"_index":2408,"t":{"331":{"position":[[676,26]]}}}],["ymbridg",{"_index":2428,"t":{"333":{"position":[[590,8],[799,8],[1141,8],[1223,8],[1451,8],[1796,11],[2118,8],[2312,8],[2833,8],[3170,11]]}}}],["ymbridge_api_key",{"_index":2427,"t":{"333":{"position":[[417,16]]}}}],["ymbridge_api_key=chang",{"_index":2404,"t":{"331":{"position":[[466,23]]}}}],["ymbridge_en",{"_index":2423,"t":{"333":{"position":[[261,15]]}}}],["ymbridge_id",{"_index":2421,"t":{"333":{"position":[[127,11],[214,11]]}}}],["ymbridge_nam",{"_index":2422,"t":{"333":{"position":[[184,13]]}}}],["ymbridge_url",{"_index":2424,"t":{"333":{"position":[[321,12]]}}}],["ymbridge_url=http://yandex",{"_index":2402,"t":{"331":{"position":[[419,26]]}}}],["you'll",{"_index":2534,"t":{"351":{"position":[[0,6]]}}}],["you'r",{"_index":3104,"t":{"540":{"position":[[251,6]]}}}],["you'v",{"_index":2531,"t":{"349":{"position":[[125,6]]}}}],["young",{"_index":2746,"t":{"408":{"position":[[172,7]]}}}],["yourappnam",{"_index":2495,"t":{"343":{"position":[[4498,13]]}}}],["yourhostip:yourport",{"_index":2348,"t":{"319":{"position":[[807,19]]}}}],["yourmultiscrobblerinstance]/api/webscrobbl",{"_index":2371,"t":{"323":{"position":[[118,45]]}}}],["yourmusic.com",{"_index":2760,"t":{"416":{"position":[[729,17]]}}}],["yourmusicsource.com",{"_index":2524,"t":{"347":{"position":[[421,21]]}}}],["yourpassword",{"_index":2343,"t":{"317":{"position":[[1918,15],[3383,15]]}}}],["yourport",{"_index":2349,"t":{"319":{"position":[[846,8]]}}}],["yourself",{"_index":1460,"t":{"152":{"position":[[259,8]]},"303":{"position":[[5023,9]]},"343":{"position":[[2086,8]]},"653":{"position":[[353,8]]}}}],["yourus",{"_index":2342,"t":{"317":{"position":[[1894,11],[1950,10],[3359,11],[3415,10]]}}}],["youtub",{"_index":1294,"t":{"123":{"position":[[152,7]]},"125":{"position":[[1077,7]]},"596":{"position":[[538,7]]},"600":{"position":[[208,7]]}}}],["youtube.js/wiki/how",{"_index":2459,"t":{"343":{"position":[[642,19]]}}}],["youtubetv",{"_index":2457,"t":{"343":{"position":[[570,9],[4767,9]]},"454":{"position":[[224,9],[322,9]]}}}],["yt",{"_index":664,"t":{"40":{"position":[[695,2]]},"343":{"position":[[27,2],[185,2],[4975,2],[5381,2]]},"345":{"position":[[1916,2],[3396,2]]}}}],["ytm",{"_index":2454,"t":{"343":{"position":[[300,3],[1431,3],[1472,3],[1663,3]]},"454":{"position":[[41,3],[151,3],[622,3],[803,3],[1162,3]]},"470":{"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":2510,"t":{"345":{"position":[[391,13]]}}}],["ytm_client_secret",{"_index":2511,"t":{"345":{"position":[[457,17]]}}}],["ytm_cooki",{"_index":2512,"t":{"345":{"position":[[531,10]]}}}],["ytm_enabl",{"_index":2508,"t":{"345":{"position":[[246,10]]}}}],["ytm_id",{"_index":2506,"t":{"345":{"position":[[127,6],[204,6]]}}}],["ytm_log_diff=tru",{"_index":2890,"t":{"470":{"position":[[1632,17]]}}}],["ytm_name",{"_index":2507,"t":{"345":{"position":[[179,8]]}}}],["ytm_redirect_uri",{"_index":2509,"t":{"345":{"position":[[301,16]]}}}],["ytmusic",{"_index":2463,"t":{"343":{"position":[[1034,10],[2581,10],[2828,7],[3810,10],[4294,7]]},"345":{"position":[[734,7],[942,7],[1283,7],[1364,7],[1590,7],[2364,7],[2557,7],[3077,7],[3628,9]]},"470":{"position":[[1534,10],[1729,8],[2369,10],[2539,7]]}}}],["ytmusic.json",{"_index":2462,"t":{"343":{"position":[[982,12],[2537,12],[3406,12]]},"470":{"position":[[1472,14]]}}}],["ytmusic/callback",{"_index":2489,"t":{"343":{"position":[[3627,16]]}}}],["z",{"_index":2917,"t":{"470":{"position":[[3130,2],[3210,2]]}}}],["zimerman",{"_index":1715,"t":{"172":{"position":[[3902,8],[4341,8]]}}}]],"pipeline":["stemmer"]}}] \ No newline at end of file +[{"documents":[{"i":1,"t":"Overview","u":"/multi-scrobbler/configuration/","b":["Docs","Configuration"]},{"i":32,"t":"Overview","u":"/multi-scrobbler/configuration/clients/","b":["Docs","Configuration","Scrobble Clients"]},{"i":43,"t":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","b":["Docs","Configuration","Scrobble Clients"]},{"i":47,"t":"Discord","u":"/multi-scrobbler/configuration/clients/discord/","b":["Docs","Configuration","Scrobble Clients","Discord"]},{"i":53,"t":"Discord (Headless)","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","b":["Docs","Configuration","Scrobble Clients","Discord"]},{"i":67,"t":"Discord (App)","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","b":["Docs","Configuration","Scrobble Clients","Discord"]},{"i":86,"t":"Last.fm","u":"/multi-scrobbler/configuration/clients/lastfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":92,"t":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","b":["Docs","Configuration","Scrobble Clients"]},{"i":96,"t":"Libre.fm","u":"/multi-scrobbler/configuration/clients/librefm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":104,"t":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","b":["Docs","Configuration","Scrobble Clients"]},{"i":111,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","b":["Docs","Configuration","Scrobble Clients"]},{"i":115,"t":"Duplicate Scrobble Guidance","u":"/multi-scrobbler/configuration/duplicates/","b":["Docs","Configuration"]},{"i":137,"t":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","b":["Docs","Configuration","Scrobble Clients"]},{"i":144,"t":"Apple Music","u":"/multi-scrobbler/configuration/sources/applemusic/","b":["Docs","Configuration","Scrobble Sources"]},{"i":154,"t":"Overview","u":"/multi-scrobbler/configuration/sources/","b":["Docs","Configuration","Scrobble Sources"]},{"i":169,"t":"Kitchen Sink","u":"/multi-scrobbler/configuration/kitchensink/","b":["Docs","Configuration"]},{"i":179,"t":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":187,"t":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","b":["Docs","Configuration","Scrobble Sources"]},{"i":189,"t":"Deezer","u":"/multi-scrobbler/configuration/sources/deezer/","b":["Docs","Configuration","Scrobble Sources"]},{"i":199,"t":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":203,"t":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","b":["Docs","Configuration","Scrobble Sources"]},{"i":209,"t":"Kodi","u":"/multi-scrobbler/configuration/sources/kodi/","b":["Docs","Configuration","Scrobble Sources"]},{"i":215,"t":"Google Cast (Chromecast)","u":"/multi-scrobbler/configuration/sources/google-cast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":219,"t":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":221,"t":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":235,"t":"Listenbrainz (Endpoint)","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","b":["Docs","Configuration","Scrobble Sources"]},{"i":254,"t":"Libre.fm","u":"/multi-scrobbler/configuration/sources/librefm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":258,"t":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":262,"t":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","b":["Docs","Configuration","Scrobble Sources"]},{"i":266,"t":"Last.fm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":270,"t":"Mopidy","u":"/multi-scrobbler/configuration/sources/mopidy/","b":["Docs","Configuration","Scrobble Sources"]},{"i":278,"t":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","b":["Docs","Configuration","Scrobble Sources"]},{"i":282,"t":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","b":["Docs","Configuration","Scrobble Sources"]},{"i":286,"t":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":292,"t":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","b":["Docs","Configuration","Scrobble Sources"]},{"i":296,"t":"Sonos","u":"/multi-scrobbler/configuration/sources/sonos/","b":["Docs","Configuration","Scrobble Sources"]},{"i":302,"t":"Spotify","u":"/multi-scrobbler/configuration/sources/spotify/","b":["Docs","Configuration","Scrobble Sources"]},{"i":306,"t":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","b":["Docs","Configuration","Scrobble Sources"]},{"i":312,"t":"Subsonic","u":"/multi-scrobbler/configuration/sources/subsonic/","b":["Docs","Configuration","Scrobble Sources"]},{"i":318,"t":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","b":["Docs","Configuration","Scrobble Sources"]},{"i":326,"t":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","b":["Docs","Configuration","Scrobble Sources"]},{"i":330,"t":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","b":["Docs","Configuration","Scrobble Sources"]},{"i":334,"t":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","b":["Docs","Configuration","Scrobble Sources"]},{"i":342,"t":"Youtube Music","u":"/multi-scrobbler/configuration/sources/youtube-music/","b":["Docs","Configuration","Scrobble Sources"]},{"i":346,"t":"Yandex Music","u":"/multi-scrobbler/configuration/sources/yandex-music/","b":["Docs","Configuration","Scrobble Sources"]},{"i":350,"t":"Enhancing Scrobbles","u":"/multi-scrobbler/configuration/transforms/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":375,"t":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":392,"t":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":413,"t":"Development","u":"/multi-scrobbler/development/dev-common/","b":["Docs","Development"]},{"i":432,"t":"FAQ","u":"/multi-scrobbler/FAQ/","b":["Docs"]},{"i":458,"t":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","b":["Docs","Configuration","Enhance Scrobbles"]},{"i":510,"t":"Help","u":"/multi-scrobbler/help/","b":["Docs"]},{"i":525,"t":"Flatpak","u":"/multi-scrobbler/development/flatpak/","b":["Docs","Development"]},{"i":538,"t":"Overview","u":"/multi-scrobbler/installation/","b":["Docs","Installation"]},{"i":552,"t":"Quickstart","u":"/multi-scrobbler/quickstart/","b":["Docs"]},{"i":570,"t":"Systemd","u":"/multi-scrobbler/installation/service/","b":["Docs","Installation"]},{"i":578,"t":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","b":["Docs","Development"]},{"i":600,"t":"Overview","u":"/multi-scrobbler/updating/","b":["Docs","Updating"]},{"i":617,"t":"Upgrade Path","u":"/multi-scrobbler/updating/upgrade-path/","b":["Docs","Updating","Upgrade Path"]},{"i":619,"t":"From < 0.14.0","u":"/multi-scrobbler/updating/upgrade-path/0140/","b":["Docs","Updating","Upgrade Path"]},{"i":632,"t":"Overview","u":"/multi-scrobbler/","b":["Docs"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,2.54]],["t/32",[0,2.54]],["t/43",[1,3.616]],["t/47",[2,3.237]],["t/53",[2,2.425,3,3.14]],["t/67",[2,2.425,4,3.14]],["t/86",[5,3.616]],["t/92",[6,3.616]],["t/96",[7,3.616]],["t/104",[8,3.616]],["t/111",[9,3.237]],["t/115",[10,2.511,11,2.166,12,2.511]],["t/137",[13,3.616]],["t/144",[14,3.14,15,2.213]],["t/154",[0,2.54]],["t/169",[16,3.14,17,3.14]],["t/179",[18,4.191]],["t/187",[19,4.191]],["t/189",[20,4.191]],["t/199",[21,4.191]],["t/203",[22,4.191]],["t/209",[23,4.191]],["t/215",[24,2.511,25,2.511,26,2.511]],["t/219",[1,3.616]],["t/221",[27,3.14,28,2.709]],["t/235",[9,2.425,28,2.709]],["t/254",[7,3.616]],["t/258",[9,3.237]],["t/262",[6,3.616]],["t/266",[5,3.616]],["t/270",[29,4.191]],["t/278",[15,1.474,30,2.092,31,2.092,32,2.092]],["t/282",[33,4.191]],["t/286",[8,3.616]],["t/292",[34,4.191]],["t/296",[35,4.191]],["t/302",[36,4.191]],["t/306",[37,4.191]],["t/312",[38,4.191]],["t/318",[13,3.616]],["t/326",[39,4.191]],["t/330",[40,3.14,41,3.14]],["t/334",[42,4.191]],["t/342",[15,2.213,43,3.14]],["t/346",[15,2.213,44,3.14]],["t/350",[11,2.709,45,3.14]],["t/375",[46,3.14,47,2.425]],["t/392",[47,2.425,48,3.14]],["t/413",[49,4.191]],["t/432",[50,4.191]],["t/458",[47,2.425,51,3.14]],["t/510",[52,4.191]],["t/525",[53,4.191]],["t/538",[0,2.54]],["t/552",[54,4.191]],["t/570",[55,4.191]],["t/578",[56,3.14,57,3.14]],["t/600",[0,2.54]],["t/617",[58,3.14,59,3.14]],["t/619",[60,3.14,61,3.14]],["t/632",[0,2.54]]],"invertedIndex":[["",{"_index":60,"t":{"619":{"position":[[5,1]]}}}],["0.14.0",{"_index":61,"t":{"619":{"position":[[7,6]]}}}],["app",{"_index":4,"t":{"67":{"position":[[8,5]]}}}],["appl",{"_index":14,"t":{"144":{"position":[[0,5]]}}}],["azuracast",{"_index":18,"t":{"179":{"position":[[0,9]]}}}],["cast",{"_index":25,"t":{"215":{"position":[[7,4]]}}}],["chromecast",{"_index":26,"t":{"215":{"position":[[12,12]]}}}],["daemon",{"_index":32,"t":{"278":{"position":[[18,7]]}}}],["deezer",{"_index":20,"t":{"189":{"position":[[0,6]]}}}],["develop",{"_index":49,"t":{"413":{"position":[[0,11]]}}}],["development/tutori",{"_index":57,"t":{"578":{"position":[[7,20]]}}}],["discord",{"_index":2,"t":{"47":{"position":[[0,7]]},"53":{"position":[[0,7]]},"67":{"position":[[0,7]]}}}],["duplic",{"_index":10,"t":{"115":{"position":[[0,9]]}}}],["endpoint",{"_index":28,"t":{"221":{"position":[[7,10]]},"235":{"position":[[13,10]]}}}],["enhanc",{"_index":45,"t":{"350":{"position":[[0,9]]}}}],["faq",{"_index":50,"t":{"432":{"position":[[0,3]]}}}],["flatpak",{"_index":53,"t":{"525":{"position":[[0,7]]}}}],["googl",{"_index":24,"t":{"215":{"position":[[0,6]]}}}],["guidanc",{"_index":12,"t":{"115":{"position":[[19,8]]}}}],["headless",{"_index":3,"t":{"53":{"position":[[8,10]]}}}],["help",{"_index":52,"t":{"510":{"position":[[0,4]]}}}],["icecast",{"_index":21,"t":{"199":{"position":[[0,7]]}}}],["jellyfin",{"_index":19,"t":{"187":{"position":[[0,8]]}}}],["jriver",{"_index":22,"t":{"203":{"position":[[0,6]]}}}],["kitchen",{"_index":16,"t":{"169":{"position":[[0,7]]}}}],["kodi",{"_index":23,"t":{"209":{"position":[[0,4]]}}}],["koito",{"_index":1,"t":{"43":{"position":[[0,5]]},"219":{"position":[[0,5]]}}}],["last.fm",{"_index":5,"t":{"86":{"position":[[0,7]]},"266":{"position":[[0,7]]}}}],["lastfm",{"_index":27,"t":{"221":{"position":[[0,6]]}}}],["libre.fm",{"_index":7,"t":{"96":{"position":[[0,8]]},"254":{"position":[[0,8]]}}}],["listenbrainz",{"_index":9,"t":{"111":{"position":[[0,12]]},"235":{"position":[[0,12]]},"258":{"position":[[0,12]]}}}],["maloja",{"_index":6,"t":{"92":{"position":[[0,6]]},"262":{"position":[[0,6]]}}}],["mopidi",{"_index":29,"t":{"270":{"position":[[0,6]]}}}],["mpd",{"_index":30,"t":{"278":{"position":[[0,3]]}}}],["mpri",{"_index":34,"t":{"292":{"position":[[0,5]]}}}],["music",{"_index":15,"t":{"144":{"position":[[6,5]]},"278":{"position":[[4,6]]},"342":{"position":[[8,5]]},"346":{"position":[[7,5]]}}}],["musicbrainz",{"_index":51,"t":{"458":{"position":[[0,11]]}}}],["musiccast",{"_index":41,"t":{"330":{"position":[[7,9]]}}}],["musikcub",{"_index":33,"t":{"282":{"position":[[0,9]]}}}],["nativ",{"_index":46,"t":{"375":{"position":[[0,6]]}}}],["overview",{"_index":0,"t":{"1":{"position":[[0,8]]},"32":{"position":[[0,8]]},"154":{"position":[[0,8]]},"538":{"position":[[0,8]]},"600":{"position":[[0,8]]},"632":{"position":[[0,8]]}}}],["path",{"_index":59,"t":{"617":{"position":[[8,4]]}}}],["player",{"_index":31,"t":{"278":{"position":[[11,6]]}}}],["plex",{"_index":37,"t":{"306":{"position":[[0,4]]}}}],["quickstart",{"_index":54,"t":{"552":{"position":[[0,10]]}}}],["rockski",{"_index":8,"t":{"104":{"position":[[0,7]]},"286":{"position":[[0,7]]}}}],["scrobbl",{"_index":11,"t":{"115":{"position":[[10,8]]},"350":{"position":[[10,9]]}}}],["sink",{"_index":17,"t":{"169":{"position":[[8,4]]}}}],["sono",{"_index":35,"t":{"296":{"position":[[0,5]]}}}],["sourc",{"_index":56,"t":{"578":{"position":[[0,6]]}}}],["spotifi",{"_index":36,"t":{"302":{"position":[[0,7]]}}}],["stage",{"_index":47,"t":{"375":{"position":[[7,5]]},"392":{"position":[[5,5]]},"458":{"position":[[12,5]]}}}],["subson",{"_index":38,"t":{"312":{"position":[[0,8]]}}}],["systemd",{"_index":55,"t":{"570":{"position":[[0,7]]}}}],["teal.fm",{"_index":13,"t":{"137":{"position":[[0,7]]},"318":{"position":[[0,7]]}}}],["upgrad",{"_index":58,"t":{"617":{"position":[[0,7]]}}}],["user",{"_index":48,"t":{"392":{"position":[[0,4]]}}}],["vlc",{"_index":39,"t":{"326":{"position":[[0,3]]}}}],["webscrobbl",{"_index":42,"t":{"334":{"position":[[0,12]]}}}],["yamaha",{"_index":40,"t":{"330":{"position":[[0,6]]}}}],["yandex",{"_index":44,"t":{"346":{"position":[[0,6]]}}}],["youtub",{"_index":43,"t":{"342":{"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":"Base URL","u":"/multi-scrobbler/configuration/","h":"#base-url","p":1},{"i":11,"t":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":1},{"i":13,"t":"Secondary Caching Store","u":"/multi-scrobbler/configuration/","h":"#secondary-caching","p":1},{"i":15,"t":"Database","u":"/multi-scrobbler/configuration/","h":"#database","p":1},{"i":17,"t":"Retention","u":"/multi-scrobbler/configuration/","h":"#retention","p":1},{"i":19,"t":"Debug Mode","u":"/multi-scrobbler/configuration/","h":"#debug-mode","p":1},{"i":21,"t":"Disable Web","u":"/multi-scrobbler/configuration/","h":"#disable-web","p":1},{"i":23,"t":"Monitoring","u":"/multi-scrobbler/configuration/","h":"#monitoring","p":1},{"i":24,"t":"Upstream Services Status","u":"/multi-scrobbler/configuration/","h":"#upstream-services-status","p":1},{"i":26,"t":"Webhook Configurations","u":"/multi-scrobbler/configuration/","h":"#webhook-configurations","p":1},{"i":28,"t":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":1},{"i":30,"t":"Prometheus","u":"/multi-scrobbler/configuration/","h":"#prometheus","p":1},{"i":34,"t":"Clients","u":"/multi-scrobbler/configuration/clients/","h":"#clients","p":32},{"i":36,"t":"Features","u":"/multi-scrobbler/configuration/clients/","h":"#features","p":32},{"i":37,"t":"Duplicate Detection","u":"/multi-scrobbler/configuration/clients/","h":"#duplicate-detection","p":32},{"i":39,"t":"Dead Scrobbles","u":"/multi-scrobbler/configuration/clients/","h":"#dead-scrobbles","p":32},{"i":41,"t":"Now Playing","u":"/multi-scrobbler/configuration/clients/","h":"#now-playing","p":32},{"i":45,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":43},{"i":49,"t":"App","u":"/multi-scrobbler/configuration/clients/discord/","h":"#app","p":47},{"i":51,"t":"Headless","u":"/multi-scrobbler/configuration/clients/discord/","h":"#headless","p":47},{"i":55,"t":"Required Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#required-setup","p":53},{"i":56,"t":"User Token","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#user-token","p":53},{"i":58,"t":"Optional Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#optional-setup","p":53},{"i":59,"t":"Configure When Presence Is Used","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configure-when-presence-is-used","p":53},{"i":61,"t":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#discord-application","p":53},{"i":63,"t":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#artwork","p":53},{"i":65,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configuration","p":53},{"i":69,"t":"Required Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#required-setup","p":67},{"i":70,"t":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-application","p":67},{"i":72,"t":"Discord Connection","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-connection","p":67},{"i":74,"t":"Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":67},{"i":76,"t":"1. Add Discord Service to Multi-Scrobbler Docker Compose Stack","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":67},{"i":78,"t":"2. Login to Discord","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":67},{"i":80,"t":"Optional Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#optional-setup","p":67},{"i":82,"t":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#artwork","p":67},{"i":84,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#configuration","p":67},{"i":88,"t":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#callbackredirect-url","p":86},{"i":90,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":86},{"i":94,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":92},{"i":98,"t":"Callback/Redirect URL","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#callbackredirect-url","p":96},{"i":100,"t":"Custom Libre.fm instance","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#custom-librefm-instance","p":96},{"i":102,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#configuration","p":96},{"i":106,"t":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":104},{"i":108,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#configuration","p":104},{"i":109,"t":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":104},{"i":113,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":111},{"i":117,"t":"How Duplicates Are Detected","u":"/multi-scrobbler/configuration/duplicates/","h":"#how-duplicates-are-detected","p":115},{"i":119,"t":"Configurations Where Duplicates DO NOT Occur","u":"/multi-scrobbler/configuration/duplicates/","h":"#valid-configs","p":115},{"i":121,"t":"Configurations Where Duplicates CAN Occur","u":"/multi-scrobbler/configuration/duplicates/","h":"#invalid-configs","p":115},{"i":122,"t":"Upstream Scrobbles Sent to Multiple Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#upstream-scrobbles-sent-to-multiple-sources","p":115},{"i":124,"t":"Sources and Clients are Dependent","u":"/multi-scrobbler/configuration/duplicates/","h":"#dependent-source-client","p":115},{"i":126,"t":"Configuration Solutions to Avoid Duplicates","u":"/multi-scrobbler/configuration/duplicates/","h":"#configuration-solutions-to-avoid-duplicates","p":115},{"i":127,"t":"Independent Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#independent-sources","p":115},{"i":129,"t":"Alternative Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#alternative-sources","p":115},{"i":131,"t":"Mirror-Only Clients or Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/duplicates/","h":"#isolated-sources","p":115},{"i":133,"t":"Normalize All Scrobbles","u":"/multi-scrobbler/configuration/duplicates/","h":"#normalize-all-scrobbles","p":115},{"i":135,"t":"The Last.fm Problem","u":"/multi-scrobbler/configuration/duplicates/","h":"#lastfm","p":115},{"i":139,"t":"Setup","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#setup","p":137},{"i":141,"t":"Configuration","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#configuration","p":137},{"i":142,"t":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":137},{"i":146,"t":"1. Getting a Media User Token","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#1-getting-a-media-user-token","p":144},{"i":148,"t":"2. Authentication","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#2-authentication","p":144},{"i":150,"t":"How Multi-Scrobbler handles Apple Music quirks","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#how-multi-scrobbler-handles-apple-music-quirks","p":144},{"i":152,"t":"Configuration Reference","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#configuration-reference","p":144},{"i":156,"t":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":154},{"i":158,"t":"Features","u":"/multi-scrobbler/configuration/sources/","h":"#features","p":154},{"i":159,"t":"Types of Sources","u":"/multi-scrobbler/configuration/sources/","h":"#types-of-sources","p":154},{"i":161,"t":"Multi-Device/User","u":"/multi-scrobbler/configuration/sources/","h":"#multi-deviceuser","p":154},{"i":163,"t":"Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/sources/","h":"#limiting-scrobble-destination","p":154},{"i":165,"t":"When Is Activity Scrobbled?","u":"/multi-scrobbler/configuration/sources/","h":"#when-is-activity-scrobbled","p":154},{"i":167,"t":"Monitoring","u":"/multi-scrobbler/configuration/sources/","h":"#monitoring","p":154},{"i":170,"t":"What's This?","u":"/multi-scrobbler/configuration/kitchensink/","h":"#whats-this","p":169},{"i":172,"t":"Examples","u":"/multi-scrobbler/configuration/kitchensink/","h":"#examples","p":169},{"i":173,"t":"Multiple Sources to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-sources-clients","p":169},{"i":175,"t":"Scrobble for Multiple People to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-persons-services","p":169},{"i":177,"t":"Use Musicbrainz to Fix Scrobbles from Navidrome","u":"/multi-scrobbler/configuration/kitchensink/","h":"#use-musicbrainz-to-fix-scrobbles-from-navidrome","p":169},{"i":181,"t":"URL","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#url","p":179},{"i":183,"t":"Station","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#station","p":179},{"i":185,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":179},{"i":191,"t":"Retrieve ARL","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#retrieve-arl","p":189},{"i":193,"t":"Duplicate detection","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#duplicate-detection","p":189},{"i":195,"t":"Family account","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#family-account","p":189},{"i":197,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":189},{"i":201,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":199},{"i":205,"t":"URL","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#url","p":203},{"i":207,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":203},{"i":211,"t":"URL","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#url","p":209},{"i":213,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":209},{"i":217,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":215},{"i":223,"t":"Setup","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#setup","p":221},{"i":225,"t":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#standard-base-url","p":221},{"i":227,"t":"Authentication","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#authentication","p":221},{"i":229,"t":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#multiple-sources","p":221},{"i":231,"t":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#troubleshooting-url","p":221},{"i":233,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":221},{"i":237,"t":"Setup","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#setup","p":235},{"i":239,"t":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#standard-base-url","p":235},{"i":241,"t":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":235},{"i":243,"t":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#multiple-sources","p":235},{"i":245,"t":"Setup for Popular Apps","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#setup-for-popular-apps","p":235},{"i":246,"t":"Navidrome","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#navidrome","p":235},{"i":248,"t":"Music Assistant","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#music-assistant","p":235},{"i":250,"t":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#troubleshooting-url","p":235},{"i":252,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":235},{"i":256,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/librefm-source/","h":"#configuration","p":254},{"i":260,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":258},{"i":264,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":262},{"i":268,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":266},{"i":272,"t":"URI Blacklist/Whitelist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#uri-blacklistwhitelist","p":270},{"i":274,"t":"Album Blacklist","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#album-blacklist","p":270},{"i":276,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":270},{"i":280,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":278},{"i":284,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":282},{"i":288,"t":"Setup","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#setup","p":286},{"i":290,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":286},{"i":294,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":292},{"i":298,"t":"Filtering Activity","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#filtering-activity","p":296},{"i":300,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#configuration","p":296},{"i":304,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":302},{"i":308,"t":"Matching With Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":310,"t":"Using Musicbrainz With Multi-Scrobbler","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":314,"t":"Enhanced Playback Reporting","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#enhanced-playback-reporting","p":312},{"i":316,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":312},{"i":320,"t":"Setup","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#setup","p":318},{"i":322,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":318},{"i":324,"t":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":318},{"i":328,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":326},{"i":332,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":330},{"i":336,"t":"Multiple Users","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#multiple-users","p":334},{"i":338,"t":"Connectors Black/Whitelist","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#connectors-blackwhitelist","p":334},{"i":340,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":334},{"i":344,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":342},{"i":348,"t":"Configuration","u":"/multi-scrobbler/configuration/sources/yandex-music/","h":"#configuration","p":346},{"i":352,"t":"Journey of a Scrobble","u":"/multi-scrobbler/configuration/transforms/","h":"#journey-of-a-scrobble","p":350},{"i":354,"t":"Lifecycle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecycle-hooks","p":350},{"i":356,"t":"Hook","u":"/multi-scrobbler/configuration/transforms/","h":"#hook","p":350},{"i":358,"t":"Modification Stage","u":"/multi-scrobbler/configuration/transforms/","h":"#stage","p":350},{"i":360,"t":"Configuring Stages","u":"/multi-scrobbler/configuration/transforms/","h":"#configuring-stages","p":350},{"i":362,"t":"Rules for Play Data","u":"/multi-scrobbler/configuration/transforms/","h":"#stage-rules","p":350},{"i":364,"t":"Stage Flow Control","u":"/multi-scrobbler/configuration/transforms/","h":"#flow-control","p":350},{"i":366,"t":"Conditionally Run","u":"/multi-scrobbler/configuration/transforms/","h":"#conditional-modification","p":350},{"i":368,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/","h":"#logging","p":350},{"i":370,"t":"Best Practices","u":"/multi-scrobbler/configuration/transforms/","h":"#best-practices","p":350},{"i":371,"t":"Caching","u":"/multi-scrobbler/configuration/transforms/","h":"#caching","p":350},{"i":373,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/","h":"#examples","p":350},{"i":377,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#configuration","p":375},{"i":379,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/native/","h":"#rules","p":375},{"i":381,"t":"Default Stage","u":"/multi-scrobbler/configuration/transforms/native/","h":"#default-stage","p":375},{"i":383,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/native/","h":"#env-configuration","p":375},{"i":385,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/native/","h":"#examples","p":375},{"i":386,"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":375},{"i":388,"t":"Don't parse specific artists","u":"/multi-scrobbler/configuration/transforms/native/","h":"#dont-parse-specific-artists","p":375},{"i":390,"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":375},{"i":394,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":392},{"i":396,"t":"Search-And-Replace Expression","u":"/multi-scrobbler/configuration/transforms/user/","h":"#search-and-replace-expression","p":392},{"i":398,"t":"Rules","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rules","p":392},{"i":400,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/user/","h":"#examples","p":392},{"i":401,"t":"Usage with when condition","u":"/multi-scrobbler/configuration/transforms/user/","h":"#usage-with-when-condition","p":392},{"i":403,"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":392},{"i":405,"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":392},{"i":407,"t":"Rename misspelled artist in all new Plays","u":"/multi-scrobbler/configuration/transforms/user/","h":"#rename-misspelled-artist-in-all-new-plays","p":392},{"i":409,"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":392},{"i":411,"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":392},{"i":414,"t":"Architecture","u":"/multi-scrobbler/development/dev-common/","h":"#architecture","p":413},{"i":416,"t":"Project Setup","u":"/multi-scrobbler/development/dev-common/","h":"#project-setup","p":413},{"i":418,"t":"VSCode","u":"/multi-scrobbler/development/dev-common/","h":"#vscode","p":413},{"i":420,"t":"Common Development","u":"/multi-scrobbler/development/dev-common/","h":"#common-development","p":413},{"i":422,"t":"Config","u":"/multi-scrobbler/development/dev-common/","h":"#config","p":413},{"i":424,"t":"Concrete Class","u":"/multi-scrobbler/development/dev-common/","h":"#concrete-class","p":413},{"i":426,"t":"Play Object","u":"/multi-scrobbler/development/dev-common/","h":"#play-object","p":413},{"i":428,"t":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":413},{"i":430,"t":"Profiling","u":"/multi-scrobbler/development/dev-common/","h":"#profiling","p":413},{"i":433,"t":"Connection Issues","u":"/multi-scrobbler/FAQ/","h":"#connection-issues","p":432},{"i":434,"t":"Webscrobbler/Listenbrainz Endpoint doesn't connect","u":"/multi-scrobbler/FAQ/","h":"#ingress-connection","p":432},{"i":436,"t":"Spotify/Deezer/LastFM won't authenticate","u":"/multi-scrobbler/FAQ/","h":"#spotifydeezerlastfm-wont-authenticate","p":432},{"i":438,"t":"I get errors with ECONNRESET ETIMEDOUT ENOTFOUND EAI_AGAIN","u":"/multi-scrobbler/FAQ/","h":"#i-get-errors-with-econnreset-etimedout-enotfound-eai_again","p":432},{"i":440,"t":"Youtube Music fails after some time","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-fails-after-some-time","p":432},{"i":442,"t":"Configuration Issues","u":"/multi-scrobbler/FAQ/","h":"#configuration-issues","p":432},{"i":443,"t":"Config could not be parsed","u":"/multi-scrobbler/FAQ/","h":"#config-could-not-be-parsed","p":432},{"i":445,"t":"Scrobbling Issues","u":"/multi-scrobbler/FAQ/","h":"#scrobbling-issues","p":432},{"i":446,"t":"How do I prevent duplicate scrobbles?","u":"/multi-scrobbler/FAQ/","h":"#how-do-i-prevent-duplicate-scrobbles","p":432},{"i":448,"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":432},{"i":450,"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":432},{"i":452,"t":"Google Cast device does not track media","u":"/multi-scrobbler/FAQ/","h":"#google-cast-device-does-not-track-media","p":432},{"i":454,"t":"VLC is not scrobbling fields correctly","u":"/multi-scrobbler/FAQ/","h":"#vlc-is-not-scrobbling-fields-correctly","p":432},{"i":456,"t":"Youtube Music misses or duplicates scrobbles","u":"/multi-scrobbler/FAQ/","h":"#youtube-music-misses-or-duplicates-scrobbles","p":432},{"i":460,"t":"More Than Mainstream Data","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":458},{"i":462,"t":"As The Artist Intended","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"","p":458},{"i":464,"t":"Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#configuration","p":458},{"i":465,"t":"API Setup","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#api-setup","p":458},{"i":467,"t":"Stage Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#stage-configuration","p":458},{"i":469,"t":"Rules and Hooks","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#rules-and-hooks","p":458},{"i":471,"t":"ENV Configuration","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#env-configuration","p":458},{"i":473,"t":"Matching with Musicbrainz","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#matching-with-musicbrainz","p":458},{"i":475,"t":"Searching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#searching","p":458},{"i":477,"t":"Refining","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#refining","p":458},{"i":478,"t":"Score","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#score","p":458},{"i":480,"t":"Filtering","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filtering","p":458},{"i":482,"t":"Sorting","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sorting","p":458},{"i":484,"t":"Best Practices","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#best-practices","p":458},{"i":485,"t":"Caching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#caching","p":458},{"i":487,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default","p":458},{"i":489,"t":"Search Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#search-considerations","p":458},{"i":491,"t":"Filter Considerations","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#filter-considerations","p":458},{"i":493,"t":"Using Partial Match","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#using-partial-match","p":458},{"i":495,"t":"Logging","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#logging","p":458},{"i":497,"t":"Examples","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#examples","p":458},{"i":498,"t":"Minimal","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#minimal","p":458},{"i":500,"t":"Sensible Default","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#sensible-default-1","p":458},{"i":502,"t":"Add Metadata Only (No Scrobble Modification)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#add-metadata-only-no-scrobble-modification","p":458},{"i":504,"t":"Use Native Stage if no Musicbrainz Matches","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-native-stage-if-no-musicbrainz-matches","p":458},{"i":506,"t":"Different Search Methods Based on Source (Last.fm and Spotify)","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#override-stage-configuration-example","p":458},{"i":508,"t":"Use Metadata for Discord Album Art","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-metadata-for-discord-album-art","p":458},{"i":511,"t":"Getting Useful Data","u":"/multi-scrobbler/help/","h":"#getting-useful-data","p":510},{"i":512,"t":"Logs","u":"/multi-scrobbler/help/","h":"#logs","p":510},{"i":514,"t":"Debug Mode","u":"/multi-scrobbler/help/","h":"#debug-mode","p":510},{"i":516,"t":"Copy Play Debug Data","u":"/multi-scrobbler/help/","h":"#copy-play-debug-data","p":510},{"i":518,"t":"Finding Help","u":"/multi-scrobbler/help/","h":"#finding-help","p":510},{"i":519,"t":"FAQ","u":"/multi-scrobbler/help/","h":"#faq","p":510},{"i":521,"t":"Existing Issues","u":"/multi-scrobbler/help/","h":"#existing-issues","p":510},{"i":523,"t":"Reporting an Issue","u":"/multi-scrobbler/help/","h":"#reporting-an-issue","p":510},{"i":526,"t":"Install Requirements","u":"/multi-scrobbler/development/flatpak/","h":"#install-requirements","p":525},{"i":527,"t":"Flatpak and flatpak-builder","u":"/multi-scrobbler/development/flatpak/","h":"#flatpak-and-flatpak-builder","p":525},{"i":529,"t":"Update Project source","u":"/multi-scrobbler/development/flatpak/","h":"#update-project-source","p":525},{"i":531,"t":"Generate Sources and Build","u":"/multi-scrobbler/development/flatpak/","h":"#generate-sources-and-build","p":525},{"i":532,"t":"Use Setup Script","u":"/multi-scrobbler/development/flatpak/","h":"#use-setup-script","p":525},{"i":534,"t":"Manual Setup","u":"/multi-scrobbler/development/flatpak/","h":"#manual-setup","p":525},{"i":536,"t":"Run App","u":"/multi-scrobbler/development/flatpak/","h":"","p":525},{"i":540,"t":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":538},{"i":542,"t":"Recommended Settings","u":"/multi-scrobbler/installation/","h":"#recommended-settings","p":538},{"i":544,"t":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":538},{"i":546,"t":"Local Installation","u":"/multi-scrobbler/installation/","h":"#local-installation","p":538},{"i":548,"t":"Nodejs","u":"/multi-scrobbler/installation/","h":"#nodejs","p":538},{"i":550,"t":"Flatpak","u":"/multi-scrobbler/installation/","h":"#flatpak","p":538},{"i":554,"t":"Create Docker Compose File","u":"/multi-scrobbler/quickstart/","h":"#create-docker-compose-file","p":552},{"i":556,"t":"Setup Sources","u":"/multi-scrobbler/quickstart/","h":"#setup-sources","p":552},{"i":558,"t":"(Optional) Correct Scrobbles with Musicbrainz","u":"/multi-scrobbler/quickstart/","h":"#optional-correct-scrobbles-with-musicbrainz","p":552},{"i":560,"t":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":552},{"i":562,"t":"Enable Musicbrainz For A Source","u":"/multi-scrobbler/quickstart/","h":"","p":552},{"i":564,"t":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":552},{"i":566,"t":"Start Multi-Scrobbler","u":"/multi-scrobbler/quickstart/","h":"#start-multi-scrobbler","p":552},{"i":568,"t":"Next Steps","u":"/multi-scrobbler/quickstart/","h":"#next-steps","p":552},{"i":572,"t":"Create A Unit File","u":"/multi-scrobbler/installation/service/","h":"#create-a-unit-file","p":570},{"i":574,"t":"Start the Service","u":"/multi-scrobbler/installation/service/","h":"#start-the-service","p":570},{"i":576,"t":"Other Service Methods","u":"/multi-scrobbler/installation/service/","h":"","p":570},{"i":580,"t":"Scenario","u":"/multi-scrobbler/development/dev-source/","h":"#scenario","p":578},{"i":582,"t":"Minimal Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#minimal-implementation","p":578},{"i":583,"t":"Define and Implement Config","u":"/multi-scrobbler/development/dev-source/","h":"#define-and-implement-config","p":578},{"i":585,"t":"Create CoolPlayer Source","u":"/multi-scrobbler/development/dev-source/","h":"#create-coolplayer-source","p":578},{"i":587,"t":"Initialize Source from Config","u":"/multi-scrobbler/development/dev-source/","h":"#initialize-source-from-config","p":578},{"i":589,"t":"Implement Play Object Transform","u":"/multi-scrobbler/development/dev-source/","h":"#implement-play-object-transform","p":578},{"i":591,"t":"Implement Stages","u":"/multi-scrobbler/development/dev-source/","h":"#implement-stages","p":578},{"i":593,"t":"Implement Polling","u":"/multi-scrobbler/development/dev-source/","h":"#implement-polling","p":578},{"i":595,"t":"Further Implementation","u":"/multi-scrobbler/development/dev-source/","h":"#further-implementation","p":578},{"i":596,"t":"Backlog","u":"/multi-scrobbler/development/dev-source/","h":"#backlog","p":578},{"i":598,"t":"Other Source Types","u":"/multi-scrobbler/development/dev-source/","h":"#other-source-types","p":578},{"i":601,"t":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":600},{"i":603,"t":"Database","u":"/multi-scrobbler/updating/","h":"#database","p":600},{"i":605,"t":"Configuration","u":"/multi-scrobbler/updating/","h":"#configuration","p":600},{"i":607,"t":"Update Instructions","u":"/multi-scrobbler/updating/","h":"#update-instructions","p":600},{"i":609,"t":"Versioning","u":"/multi-scrobbler/updating/","h":"#versioning","p":600},{"i":611,"t":"Git","u":"/multi-scrobbler/updating/","h":"#git","p":600},{"i":613,"t":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":600},{"i":615,"t":"What Version Am I Using?","u":"/multi-scrobbler/updating/","h":"#what-version-am-i-using","p":600},{"i":620,"t":"Source/Client IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#sourceclient-ids","p":619},{"i":622,"t":"Configuring IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#configuring-ids","p":619},{"i":624,"t":"Cached Scrobble Migration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cached-scrobble-migration","p":619},{"i":626,"t":"Cache Configuration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cache-configuration","p":619},{"i":628,"t":"Renamed ENV Keys","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#renamed-env-keys","p":619},{"i":630,"t":"(Optional) ENV Client/Source Names","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#optional-env-clientsource-names","p":619},{"i":634,"t":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":632},{"i":636,"t":"Source","u":"/multi-scrobbler/","h":"#source","p":632},{"i":638,"t":"Client","u":"/multi-scrobbler/","h":"#client","p":632},{"i":640,"t":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":632},{"i":642,"t":"Installation","u":"/multi-scrobbler/","h":"#installation","p":632},{"i":644,"t":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":632},{"i":646,"t":"Usage","u":"/multi-scrobbler/","h":"#usage","p":632},{"i":648,"t":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":632},{"i":650,"t":"Development","u":"/multi-scrobbler/","h":"#development","p":632},{"i":652,"t":"License","u":"/multi-scrobbler/","h":"#license","p":632}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,1.672,1,4.504]],["t/5",[2,2.292,3,2.249,4,2.907]],["t/7",[5,5.371,6,5.371]],["t/9",[7,4.246,8,3.378]],["t/11",[9,4.821]],["t/13",[9,3.232,10,4.486,11,4.486]],["t/15",[12,6.04]],["t/17",[13,6.692]],["t/19",[14,4.504,15,4.848]],["t/21",[16,5.371,17,5.371]],["t/23",[18,6.04]],["t/24",[19,4.049,20,3.375,21,4.486]],["t/26",[0,1.672,22,5.371]],["t/28",[23,5.371,24,4.848]],["t/30",[25,6.692]],["t/34",[4,4.336]],["t/36",[26,6.04]],["t/37",[27,3.595,28,4.504]],["t/39",[29,5.371,30,2.855]],["t/41",[31,5.371,32,3.595]],["t/45",[0,2.084]],["t/49",[33,5.611]],["t/51",[34,6.692]],["t/55",[2,2.744,35,4.504]],["t/56",[36,4.504,37,4.504]],["t/58",[2,2.744,38,4.246]],["t/59",[0,1.397,39,4.486,40,2.821]],["t/61",[41,3.869,42,4.848]],["t/63",[43,6.04]],["t/65",[0,2.084]],["t/69",[2,2.744,35,4.504]],["t/70",[41,3.869,42,4.848]],["t/72",[41,3.869,44,4.504]],["t/74",[2,3.419]],["t/76",[20,1.697,41,1.625,45,2.036,46,2.036,47,1.563,48,1.697,49,1.697,50,2.036,51,2.256]],["t/78",[41,3.232,52,4.049,53,4.486]],["t/80",[2,2.744,38,4.246]],["t/82",[43,6.04]],["t/84",[0,2.084]],["t/88",[8,3.378,54,4.848]],["t/90",[0,2.084]],["t/94",[0,2.084]],["t/98",[8,3.378,54,4.848]],["t/100",[55,4.049,56,4.486,57,4.486]],["t/102",[0,2.084]],["t/106",[2,3.419]],["t/108",[0,2.084]],["t/109",[58,6.04]],["t/113",[0,2.084]],["t/117",[27,3.595,28,4.504]],["t/119",[0,1.397,27,3.002,59,4.049]],["t/121",[0,1.397,27,3.002,59,4.049]],["t/122",[3,1.691,19,3.045,30,1.793,60,3.374,61,2.338]],["t/124",[3,2.249,4,2.907,62,4.486]],["t/126",[0,1.199,27,2.577,63,3.851,64,3.851]],["t/127",[3,2.693,65,5.371]],["t/129",[3,2.693,66,5.371]],["t/131",[4,2.186,30,1.793,67,3.374,68,3.045,69,3.045]],["t/133",[30,2.855,70,5.371]],["t/135",[71,4.504,72,5.371]],["t/139",[2,3.419]],["t/141",[0,2.084]],["t/142",[73,6.692]],["t/146",[36,2.829,37,2.829,45,3.045,74,3.045,75,3.045]],["t/148",[52,4.848,76,4.504]],["t/150",[47,2.081,48,2.258,58,2.709,77,3.002,78,2.373,79,3.002]],["t/152",[0,1.672,80,5.371]],["t/156",[3,3.355]],["t/158",[26,6.04]],["t/159",[1,4.504,3,2.693]],["t/161",[47,3.723,81,5.371]],["t/163",[30,2.384,68,4.049,69,4.049]],["t/165",[30,2.855,82,4.848]],["t/167",[18,6.04]],["t/170",[83,6.692]],["t/172",[84,4.821]],["t/173",[3,1.931,4,2.496,61,4.002]],["t/175",[4,2.186,30,1.793,61,3.618,85,3.374]],["t/177",[30,1.793,40,2.122,86,2.338,87,3.374,88,3.045]],["t/181",[8,4.209]],["t/183",[89,6.692]],["t/185",[0,2.084]],["t/191",[90,5.371,91,5.371]],["t/193",[27,3.595,28,4.504]],["t/195",[92,5.371,93,5.371]],["t/197",[0,2.084]],["t/201",[0,2.084]],["t/205",[8,4.209]],["t/207",[0,2.084]],["t/211",[8,4.209]],["t/213",[0,2.084]],["t/217",[0,2.084]],["t/223",[2,3.419]],["t/225",[7,3.546,8,2.821,94,4.049]],["t/227",[76,5.611]],["t/229",[3,2.693,61,3.723]],["t/231",[8,3.378,95,4.848]],["t/233",[0,2.084]],["t/237",[2,3.419]],["t/239",[7,3.546,8,2.821,94,4.049]],["t/241",[37,5.611]],["t/243",[3,2.693,61,3.723]],["t/245",[2,2.292,33,3.761,96,4.486]],["t/246",[88,6.04]],["t/248",[78,4.246,97,5.371]],["t/250",[8,3.378,95,4.848]],["t/252",[0,2.084]],["t/256",[0,2.084]],["t/260",[0,2.084]],["t/264",[0,2.084]],["t/268",[0,2.084]],["t/272",[98,5.371,99,5.371]],["t/274",[100,4.504,101,5.371]],["t/276",[0,2.084]],["t/280",[0,2.084]],["t/284",[0,2.084]],["t/288",[2,3.419]],["t/290",[0,2.084]],["t/294",[0,2.084]],["t/298",[82,4.848,102,4.246]],["t/300",[0,2.084]],["t/304",[0,2.084]],["t/308",[103,4.246,104,5.371]],["t/310",[40,2.422,47,2.669,48,2.897,86,2.669]],["t/314",[105,4.486,106,4.486,107,4.049]],["t/316",[0,2.084]],["t/320",[2,3.419]],["t/322",[0,2.084]],["t/324",[20,4.04,102,4.246]],["t/328",[0,2.084]],["t/332",[0,2.084]],["t/336",[36,4.504,61,3.723]],["t/338",[108,5.371,109,5.371]],["t/340",[0,2.084]],["t/344",[0,2.084]],["t/348",[0,2.084]],["t/352",[30,2.855,110,5.371]],["t/354",[111,5.371,112,4.504]],["t/356",[112,5.611]],["t/358",[113,4.848,114,3.723]],["t/360",[0,1.672,114,3.723]],["t/362",[32,3.002,115,3.546,116,3.546]],["t/364",[114,3.109,117,4.486,118,4.486]],["t/366",[119,5.371,120,4.848]],["t/368",[121,5.611]],["t/370",[122,4.848,123,4.848]],["t/371",[9,4.821]],["t/373",[84,4.821]],["t/377",[0,2.084]],["t/379",[115,5.29]],["t/381",[114,3.723,124,4.504]],["t/383",[0,1.672,125,4.246]],["t/385",[84,4.821]],["t/386",[40,1.888,55,2.709,126,2.517,127,2.009,128,2.709,129,2.709]],["t/388",[126,3.229,127,2.577,130,3.851,131,3.851]],["t/390",[127,2.258,132,3.045,133,4.377,134,3.374]],["t/394",[0,2.084]],["t/396",[135,3.546,136,4.486,137,4.486]],["t/398",[115,5.29]],["t/400",[84,4.821]],["t/401",[138,4.504,139,5.371]],["t/403",[32,2.258,133,2.829,140,2.829,141,3.374,142,2.829]],["t/405",[133,2.829,140,2.829,143,3.374,144,3.374,145,3.374]],["t/407",[32,2.258,127,2.258,142,2.829,146,3.045,147,3.374]],["t/409",[32,2.009,100,2.517,127,2.009,140,2.517,142,2.517,148,3.002]],["t/411",[47,1.874,127,2.932,128,2.44,129,2.44,132,2.44,149,2.704]],["t/414",[150,6.692]],["t/416",[2,2.744,151,4.848]],["t/418",[152,6.692]],["t/420",[153,5.371,154,4.848]],["t/422",[155,5.29]],["t/424",[156,5.371,157,5.371]],["t/426",[32,3.595,158,4.848]],["t/428",[3,2.249,4,2.907,159,3.546]],["t/430",[160,6.692]],["t/433",[44,4.504,161,4.04]],["t/434",[24,3.476,44,3.229,162,3.851,163,3.851]],["t/436",[76,3.761,164,4.486,165,4.486]],["t/438",[166,3.374,167,3.374,168,3.374,169,3.374,170,3.374]],["t/440",[78,3.044,171,3.476,172,3.851,173,3.476]],["t/442",[0,1.672,161,4.04]],["t/443",[126,4.504,155,4.246]],["t/445",[30,2.855,161,4.04]],["t/446",[27,3.002,30,2.384,174,4.486]],["t/448",[30,1.595,61,2.081,71,2.517,127,2.009,175,2.517,176,2.709]],["t/450",[173,2.036,175,1.891,177,2.036,178,2.036,179,2.256,180,2.256,181,2.036,182,2.256,183,2.256]],["t/452",[75,3.045,175,2.829,177,3.045,178,3.045,184,3.374]],["t/454",[30,2.047,176,3.476,185,3.851,186,3.851]],["t/456",[27,2.258,30,1.793,78,2.667,171,3.045,187,3.374]],["t/460",[116,3.546,188,4.486,189,4.486]],["t/462",[127,3.595,190,5.371]],["t/464",[0,2.084]],["t/465",[2,2.744,191,4.848]],["t/467",[0,1.672,114,3.723]],["t/469",[112,4.504,115,4.246]],["t/471",[0,1.672,125,4.246]],["t/473",[86,3.723,103,4.246]],["t/475",[135,5.29]],["t/477",[192,6.692]],["t/478",[193,6.692]],["t/480",[102,5.29]],["t/482",[194,6.692]],["t/484",[122,4.848,123,4.848]],["t/485",[9,4.821]],["t/487",[124,4.504,195,4.848]],["t/489",[135,4.246,196,4.848]],["t/491",[102,4.246,196,4.848]],["t/493",[40,2.821,103,3.546,197,4.486]],["t/495",[121,5.611]],["t/497",[84,4.821]],["t/498",[198,6.04]],["t/500",[124,4.504,195,4.848]],["t/502",[30,2.047,46,3.476,113,3.476,199,3.476]],["t/504",[40,2.122,86,2.338,103,2.667,114,2.338,200,3.374]],["t/506",[3,1.355,7,2.137,71,2.267,135,2.137,201,2.704,202,2.44,203,2.704]],["t/508",[40,2.122,41,2.43,100,2.829,199,3.045,204,3.374]],["t/511",[40,2.821,74,4.049,116,3.546]],["t/512",[121,5.611]],["t/514",[14,4.504,15,4.848]],["t/516",[14,3.229,32,2.577,116,3.044,205,3.851]],["t/518",[206,5.371,207,5.371]],["t/519",[208,6.692]],["t/521",[161,4.04,209,5.371]],["t/523",[107,4.848,161,4.04]],["t/526",[35,4.504,210,4.504]],["t/527",[211,5.831,212,4.486]],["t/529",[3,2.249,151,4.049,213,3.761]],["t/531",[3,2.249,214,4.486,215,4.486]],["t/532",[2,2.292,40,2.821,216,4.486]],["t/534",[2,2.744,217,5.371]],["t/536",[33,4.504,120,4.848]],["t/540",[49,5.034]],["t/542",[218,5.371,219,5.371]],["t/544",[49,3.375,84,3.232,138,3.761]],["t/546",[210,4.504,220,5.371]],["t/548",[221,6.692]],["t/550",[211,6.04]],["t/554",[49,2.897,50,3.476,159,3.044,222,3.476]],["t/556",[2,2.744,3,2.693]],["t/558",[30,2.047,38,3.044,86,2.669,223,3.851]],["t/560",[0,1.397,86,3.109,191,4.049]],["t/562",[3,2.249,86,3.109,224,4.486]],["t/564",[2,2.744,4,3.481]],["t/566",[47,3.109,48,3.375,225,3.761]],["t/568",[226,5.371,227,5.371]],["t/572",[159,3.546,222,4.049,228,4.486]],["t/574",[20,4.04,225,4.504]],["t/576",[20,4.04,202,4.848]],["t/580",[229,6.692]],["t/582",[198,4.848,230,3.869]],["t/583",[155,3.546,230,3.232,231,4.486]],["t/585",[3,2.249,159,3.546,232,4.486]],["t/587",[3,2.249,155,3.546,233,4.486]],["t/589",[32,2.577,158,3.476,230,2.774,234,3.851]],["t/591",[114,3.723,230,3.869]],["t/593",[230,3.869,235,5.371]],["t/595",[230,3.869,236,5.371]],["t/596",[237,6.692]],["t/598",[1,4.504,3,2.693]],["t/601",[213,5.611]],["t/603",[12,6.04]],["t/605",[0,2.084]],["t/607",[213,4.504,238,5.371]],["t/609",[239,6.04]],["t/611",[240,6.692]],["t/613",[49,5.034]],["t/615",[40,3.378,239,4.848]],["t/620",[241,5.371,242,4.848]],["t/622",[0,1.672,242,4.848]],["t/624",[9,3.232,30,2.384,243,4.486]],["t/626",[0,1.672,9,3.869]],["t/628",[125,3.546,146,4.049,244,4.486]],["t/630",[38,3.044,125,3.044,245,3.851,246,3.851]],["t/634",[47,2.669,48,2.897,181,3.476,247,3.851]],["t/636",[3,3.355]],["t/638",[4,4.336]],["t/640",[225,4.504,248,5.371]],["t/642",[210,5.611]],["t/644",[0,2.084]],["t/646",[138,5.611]],["t/648",[249,6.692]],["t/650",[154,6.04]],["t/652",[250,6.692]]],"invertedIndex":[["1",{"_index":45,"t":{"76":{"position":[[0,2]]},"146":{"position":[[0,2]]}}}],["2",{"_index":52,"t":{"78":{"position":[[0,2]]},"148":{"position":[[0,2]]}}}],["account",{"_index":93,"t":{"195":{"position":[[7,7]]}}}],["activ",{"_index":82,"t":{"165":{"position":[[8,8]]},"298":{"position":[[10,8]]}}}],["add",{"_index":46,"t":{"76":{"position":[[3,3]]},"502":{"position":[[0,3]]}}}],["album",{"_index":100,"t":{"274":{"position":[[0,5]]},"409":{"position":[[25,6]]},"508":{"position":[[25,5]]}}}],["altern",{"_index":66,"t":{"129":{"position":[[0,11]]}}}],["api",{"_index":191,"t":{"465":{"position":[[0,3]]},"560":{"position":[[22,3]]}}}],["app",{"_index":33,"t":{"49":{"position":[[0,3]]},"245":{"position":[[18,4]]},"536":{"position":[[4,3]]}}}],["appl",{"_index":77,"t":{"150":{"position":[[28,5]]}}}],["applic",{"_index":42,"t":{"61":{"position":[[8,11]]},"70":{"position":[[8,11]]}}}],["architectur",{"_index":150,"t":{"414":{"position":[[0,12]]}}}],["arl",{"_index":91,"t":{"191":{"position":[[9,3]]}}}],["art",{"_index":204,"t":{"508":{"position":[[31,3]]}}}],["artist",{"_index":127,"t":{"386":{"position":[[11,7]]},"388":{"position":[[21,7]]},"390":{"position":[[8,7]]},"407":{"position":[[18,6]]},"409":{"position":[[16,8]]},"411":{"position":[[16,6],[45,6]]},"448":{"position":[[47,7]]},"462":{"position":[[7,6]]}}}],["artwork",{"_index":43,"t":{"63":{"position":[[0,7]]},"82":{"position":[[0,7]]}}}],["assist",{"_index":97,"t":{"248":{"position":[[6,9]]}}}],["authent",{"_index":76,"t":{"148":{"position":[[3,14]]},"227":{"position":[[0,14]]},"436":{"position":[[28,12]]}}}],["avoid",{"_index":64,"t":{"126":{"position":[[27,5]]}}}],["backlog",{"_index":237,"t":{"596":{"position":[[0,7]]}}}],["base",{"_index":7,"t":{"9":{"position":[[0,4]]},"225":{"position":[[9,4]]},"239":{"position":[[9,4]]},"506":{"position":[[25,5]]}}}],["best",{"_index":122,"t":{"370":{"position":[[0,4]]},"484":{"position":[[0,4]]}}}],["black/whitelist",{"_index":109,"t":{"338":{"position":[[11,15]]}}}],["blacklist",{"_index":101,"t":{"274":{"position":[[6,9]]}}}],["blacklist/whitelist",{"_index":99,"t":{"272":{"position":[[4,19]]}}}],["build",{"_index":215,"t":{"531":{"position":[[21,5]]}}}],["builder",{"_index":212,"t":{"527":{"position":[[20,7]]}}}],["cach",{"_index":9,"t":{"11":{"position":[[0,7]]},"13":{"position":[[10,7]]},"371":{"position":[[0,7]]},"485":{"position":[[0,7]]},"624":{"position":[[0,6]]},"626":{"position":[[0,5]]}}}],["callback/redirect",{"_index":54,"t":{"88":{"position":[[0,17]]},"98":{"position":[[0,17]]}}}],["cast",{"_index":178,"t":{"450":{"position":[[7,4]]},"452":{"position":[[7,4]]}}}],["class",{"_index":157,"t":{"424":{"position":[[9,5]]}}}],["client",{"_index":4,"t":{"5":{"position":[[18,7]]},"34":{"position":[[0,7]]},"124":{"position":[[12,7]]},"131":{"position":[[12,7]]},"173":{"position":[[29,7]]},"175":{"position":[[41,7]]},"428":{"position":[[9,7]]},"564":{"position":[[6,7]]},"638":{"position":[[0,6]]}}}],["client/sourc",{"_index":245,"t":{"630":{"position":[[15,13]]}}}],["common",{"_index":153,"t":{"420":{"position":[[0,6]]}}}],["compos",{"_index":50,"t":{"76":{"position":[[49,7]]},"554":{"position":[[14,7]]}}}],["concret",{"_index":156,"t":{"424":{"position":[[0,8]]}}}],["condit",{"_index":139,"t":{"401":{"position":[[16,9]]}}}],["condition",{"_index":119,"t":{"366":{"position":[[0,13]]}}}],["config",{"_index":155,"t":{"422":{"position":[[0,6]]},"443":{"position":[[0,6]]},"583":{"position":[[21,6]]},"587":{"position":[[23,6]]}}}],["configur",{"_index":0,"t":{"3":{"position":[[0,13]]},"26":{"position":[[8,14]]},"45":{"position":[[0,13]]},"59":{"position":[[0,9]]},"65":{"position":[[0,13]]},"84":{"position":[[0,13]]},"90":{"position":[[0,13]]},"94":{"position":[[0,13]]},"102":{"position":[[0,13]]},"108":{"position":[[0,13]]},"113":{"position":[[0,13]]},"119":{"position":[[0,14]]},"121":{"position":[[0,14]]},"126":{"position":[[0,13]]},"141":{"position":[[0,13]]},"152":{"position":[[0,13]]},"185":{"position":[[0,13]]},"197":{"position":[[0,13]]},"201":{"position":[[0,13]]},"207":{"position":[[0,13]]},"213":{"position":[[0,13]]},"217":{"position":[[0,13]]},"233":{"position":[[0,13]]},"252":{"position":[[0,13]]},"256":{"position":[[0,13]]},"260":{"position":[[0,13]]},"264":{"position":[[0,13]]},"268":{"position":[[0,13]]},"276":{"position":[[0,13]]},"280":{"position":[[0,13]]},"284":{"position":[[0,13]]},"290":{"position":[[0,13]]},"294":{"position":[[0,13]]},"300":{"position":[[0,13]]},"304":{"position":[[0,13]]},"316":{"position":[[0,13]]},"322":{"position":[[0,13]]},"328":{"position":[[0,13]]},"332":{"position":[[0,13]]},"340":{"position":[[0,13]]},"344":{"position":[[0,13]]},"348":{"position":[[0,13]]},"360":{"position":[[0,11]]},"377":{"position":[[0,13]]},"383":{"position":[[4,13]]},"394":{"position":[[0,13]]},"442":{"position":[[0,13]]},"464":{"position":[[0,13]]},"467":{"position":[[6,13]]},"471":{"position":[[4,13]]},"560":{"position":[[0,9]]},"605":{"position":[[0,13]]},"622":{"position":[[0,11]]},"626":{"position":[[6,13]]},"644":{"position":[[0,13]]}}}],["connect",{"_index":44,"t":{"72":{"position":[[8,10]]},"433":{"position":[[0,10]]},"434":{"position":[[43,7]]}}}],["connector",{"_index":108,"t":{"338":{"position":[[0,10]]}}}],["consider",{"_index":196,"t":{"489":{"position":[[7,14]]},"491":{"position":[[7,14]]}}}],["content",{"_index":144,"t":{"405":{"position":[[25,7]]}}}],["control",{"_index":118,"t":{"364":{"position":[[11,7]]}}}],["coolplay",{"_index":232,"t":{"585":{"position":[[7,10]]}}}],["copi",{"_index":205,"t":{"516":{"position":[[0,4]]}}}],["correct",{"_index":223,"t":{"558":{"position":[[11,7]]}}}],["correctli",{"_index":176,"t":{"448":{"position":[[55,9]]},"454":{"position":[[29,9]]}}}],["creat",{"_index":159,"t":{"428":{"position":[[0,8]]},"554":{"position":[[0,6]]},"572":{"position":[[0,6]]},"585":{"position":[[0,6]]}}}],["custom",{"_index":55,"t":{"100":{"position":[[0,6]]},"386":{"position":[[34,6]]}}}],["data",{"_index":116,"t":{"362":{"position":[[15,4]]},"460":{"position":[[21,4]]},"511":{"position":[[15,4]]},"516":{"position":[[16,4]]}}}],["databas",{"_index":12,"t":{"15":{"position":[[0,8]]},"603":{"position":[[0,8]]}}}],["dead",{"_index":29,"t":{"39":{"position":[[0,4]]}}}],["debug",{"_index":14,"t":{"19":{"position":[[0,5]]},"514":{"position":[[0,5]]},"516":{"position":[[10,5]]}}}],["default",{"_index":124,"t":{"381":{"position":[[0,7]]},"487":{"position":[[9,7]]},"500":{"position":[[9,7]]}}}],["defin",{"_index":231,"t":{"583":{"position":[[0,6]]}}}],["delimit",{"_index":129,"t":{"386":{"position":[[41,9]]},"411":{"position":[[28,10]]}}}],["depend",{"_index":62,"t":{"124":{"position":[[24,9]]}}}],["destin",{"_index":69,"t":{"131":{"position":[[41,11]]},"163":{"position":[[18,11]]}}}],["detect",{"_index":28,"t":{"37":{"position":[[10,9]]},"117":{"position":[[19,8]]},"193":{"position":[[10,9]]}}}],["develop",{"_index":154,"t":{"420":{"position":[[7,11]]},"650":{"position":[[0,11]]}}}],["devic",{"_index":184,"t":{"452":{"position":[[12,6]]}}}],["device/us",{"_index":81,"t":{"161":{"position":[[6,11]]}}}],["differ",{"_index":201,"t":{"506":{"position":[[0,9]]}}}],["disabl",{"_index":16,"t":{"21":{"position":[[0,7]]}}}],["discord",{"_index":41,"t":{"61":{"position":[[0,7]]},"70":{"position":[[0,7]]},"72":{"position":[[0,7]]},"76":{"position":[[7,7]]},"78":{"position":[[12,7]]},"508":{"position":[[17,7]]}}}],["docker",{"_index":49,"t":{"76":{"position":[[42,6]]},"540":{"position":[[0,6]]},"544":{"position":[[0,6]]},"554":{"position":[[7,6]]},"613":{"position":[[0,6]]}}}],["doesn't",{"_index":163,"t":{"434":{"position":[[35,7]]}}}],["don't",{"_index":130,"t":{"388":{"position":[[0,5]]}}}],["duplic",{"_index":27,"t":{"37":{"position":[[0,9]]},"117":{"position":[[4,10]]},"119":{"position":[[21,10]]},"121":{"position":[[21,10]]},"126":{"position":[[33,10]]},"193":{"position":[[0,9]]},"446":{"position":[[17,9]]},"456":{"position":[[24,10]]}}}],["eai_again",{"_index":170,"t":{"438":{"position":[[49,9]]}}}],["econnreset",{"_index":167,"t":{"438":{"position":[[18,10]]}}}],["enabl",{"_index":224,"t":{"562":{"position":[[0,6]]}}}],["end",{"_index":145,"t":{"405":{"position":[[42,3]]}}}],["endpoint",{"_index":24,"t":{"28":{"position":[[7,8]]},"434":{"position":[[26,8]]}}}],["enhanc",{"_index":105,"t":{"314":{"position":[[0,8]]}}}],["enotfound",{"_index":169,"t":{"438":{"position":[[39,9]]}}}],["env",{"_index":125,"t":{"383":{"position":[[0,3]]},"471":{"position":[[0,3]]},"628":{"position":[[8,3]]},"630":{"position":[[11,3]]}}}],["error",{"_index":166,"t":{"438":{"position":[[6,6]]}}}],["etimedout",{"_index":168,"t":{"438":{"position":[[29,9]]}}}],["exampl",{"_index":84,"t":{"172":{"position":[[0,8]]},"373":{"position":[[0,8]]},"385":{"position":[[0,8]]},"400":{"position":[[0,8]]},"497":{"position":[[0,8]]},"544":{"position":[[13,7]]}}}],["exist",{"_index":209,"t":{"521":{"position":[[0,8]]}}}],["express",{"_index":137,"t":{"396":{"position":[[19,10]]}}}],["extract",{"_index":132,"t":{"390":{"position":[[0,7]]},"411":{"position":[[0,7]]}}}],["fail",{"_index":172,"t":{"440":{"position":[[14,5]]}}}],["famili",{"_index":92,"t":{"195":{"position":[[0,6]]}}}],["faq",{"_index":208,"t":{"519":{"position":[[0,3]]}}}],["featur",{"_index":26,"t":{"36":{"position":[[0,8]]},"158":{"position":[[0,8]]}}}],["field",{"_index":186,"t":{"454":{"position":[[22,6]]}}}],["file",{"_index":222,"t":{"554":{"position":[[22,4]]},"572":{"position":[[14,4]]}}}],["filter",{"_index":102,"t":{"298":{"position":[[0,9]]},"324":{"position":[[8,9]]},"480":{"position":[[0,9]]},"491":{"position":[[0,6]]}}}],["find",{"_index":206,"t":{"518":{"position":[[0,7]]}}}],["fix",{"_index":87,"t":{"177":{"position":[[19,3]]}}}],["flatpak",{"_index":211,"t":{"527":{"position":[[0,7],[12,7]]},"550":{"position":[[0,7]]}}}],["flow",{"_index":117,"t":{"364":{"position":[[6,4]]}}}],["further",{"_index":236,"t":{"595":{"position":[[0,7]]}}}],["gener",{"_index":214,"t":{"531":{"position":[[0,8]]}}}],["get",{"_index":74,"t":{"146":{"position":[[3,7]]},"511":{"position":[[0,7]]}}}],["git",{"_index":240,"t":{"611":{"position":[[0,3]]}}}],["googl",{"_index":177,"t":{"450":{"position":[[0,6]]},"452":{"position":[[0,6]]}}}],["handl",{"_index":58,"t":{"109":{"position":[[0,6]]},"150":{"position":[[20,7]]}}}],["headless",{"_index":34,"t":{"51":{"position":[[0,8]]}}}],["health",{"_index":23,"t":{"28":{"position":[[0,6]]}}}],["help",{"_index":207,"t":{"518":{"position":[[8,4]]}}}],["help/faq",{"_index":249,"t":{"648":{"position":[[0,8]]}}}],["hook",{"_index":112,"t":{"354":{"position":[[10,5]]},"356":{"position":[[0,4]]},"469":{"position":[[10,5]]}}}],["id",{"_index":242,"t":{"620":{"position":[[14,3]]},"622":{"position":[[12,3]]}}}],["identifi",{"_index":73,"t":{"142":{"position":[[0,10]]}}}],["implement",{"_index":230,"t":{"582":{"position":[[8,14]]},"583":{"position":[[11,9]]},"589":{"position":[[0,9]]},"591":{"position":[[0,9]]},"593":{"position":[[0,9]]},"595":{"position":[[8,14]]}}}],["independ",{"_index":65,"t":{"127":{"position":[[0,11]]}}}],["inform",{"_index":179,"t":{"450":{"position":[[18,11]]}}}],["initi",{"_index":233,"t":{"587":{"position":[[0,10]]}}}],["instal",{"_index":210,"t":{"526":{"position":[[0,7]]},"546":{"position":[[6,12]]},"642":{"position":[[0,12]]}}}],["instanc",{"_index":57,"t":{"100":{"position":[[16,8]]}}}],["instruct",{"_index":238,"t":{"607":{"position":[[7,12]]}}}],["intend",{"_index":190,"t":{"462":{"position":[[14,8]]}}}],["interpol",{"_index":6,"t":{"7":{"position":[[8,13]]}}}],["issu",{"_index":161,"t":{"433":{"position":[[11,6]]},"442":{"position":[[14,6]]},"445":{"position":[[11,6]]},"521":{"position":[[9,6]]},"523":{"position":[[13,5]]}}}],["journey",{"_index":110,"t":{"352":{"position":[[0,7]]}}}],["key",{"_index":244,"t":{"628":{"position":[[12,4]]}}}],["last.fm",{"_index":71,"t":{"135":{"position":[[4,7]]},"448":{"position":[[0,7]]},"506":{"position":[[41,8]]}}}],["libre.fm",{"_index":56,"t":{"100":{"position":[[7,8]]}}}],["licens",{"_index":250,"t":{"652":{"position":[[0,7]]}}}],["lifecycl",{"_index":111,"t":{"354":{"position":[[0,9]]}}}],["limit",{"_index":68,"t":{"131":{"position":[[23,8]]},"163":{"position":[[0,8]]}}}],["local",{"_index":220,"t":{"546":{"position":[[0,5]]}}}],["log",{"_index":121,"t":{"368":{"position":[[0,7]]},"495":{"position":[[0,7]]},"512":{"position":[[0,4]]}}}],["login",{"_index":53,"t":{"78":{"position":[[3,5]]}}}],["mainstream",{"_index":189,"t":{"460":{"position":[[10,10]]}}}],["manual",{"_index":217,"t":{"534":{"position":[[0,6]]}}}],["match",{"_index":103,"t":{"308":{"position":[[0,8]]},"473":{"position":[[0,8]]},"493":{"position":[[14,5]]},"504":{"position":[[35,7]]}}}],["media",{"_index":75,"t":{"146":{"position":[[13,5]]},"452":{"position":[[34,5]]}}}],["metadata",{"_index":199,"t":{"502":{"position":[[4,8]]},"508":{"position":[[4,8]]}}}],["method",{"_index":202,"t":{"506":{"position":[[17,7]]},"576":{"position":[[14,7]]}}}],["migrat",{"_index":243,"t":{"624":{"position":[[16,9]]}}}],["minim",{"_index":198,"t":{"498":{"position":[[0,7]]},"582":{"position":[[0,7]]}}}],["mirror",{"_index":67,"t":{"131":{"position":[[0,6]]}}}],["miss",{"_index":187,"t":{"456":{"position":[[14,6]]}}}],["missing/incorrect",{"_index":180,"t":{"450":{"position":[[33,17]]}}}],["misspel",{"_index":147,"t":{"407":{"position":[[7,10]]}}}],["mode",{"_index":15,"t":{"19":{"position":[[6,4]]},"514":{"position":[[6,4]]}}}],["modif",{"_index":113,"t":{"358":{"position":[[0,12]]},"502":{"position":[[31,13]]}}}],["modifi",{"_index":134,"t":{"390":{"position":[[38,6]]}}}],["monitor",{"_index":18,"t":{"23":{"position":[[0,10]]},"167":{"position":[[0,10]]}}}],["more",{"_index":188,"t":{"460":{"position":[[0,4]]}}}],["ms",{"_index":181,"t":{"450":{"position":[[54,2]]},"634":{"position":[[25,4]]}}}],["multi",{"_index":47,"t":{"76":{"position":[[26,5]]},"150":{"position":[[4,5]]},"161":{"position":[[0,5]]},"310":{"position":[[23,5]]},"411":{"position":[[39,5]]},"566":{"position":[[6,5]]},"634":{"position":[[9,5]]}}}],["multipl",{"_index":61,"t":{"122":{"position":[[27,8]]},"173":{"position":[[0,8],[20,8]]},"175":{"position":[[13,8],[32,8]]},"229":{"position":[[0,8]]},"243":{"position":[[0,8]]},"336":{"position":[[0,8]]},"448":{"position":[[38,8]]}}}],["music",{"_index":78,"t":{"150":{"position":[[34,5]]},"248":{"position":[[0,5]]},"440":{"position":[[8,5]]},"456":{"position":[[8,5]]}}}],["musicbrainz",{"_index":86,"t":{"177":{"position":[[4,11]]},"310":{"position":[[6,11]]},"473":{"position":[[14,11]]},"504":{"position":[[23,11]]},"558":{"position":[[34,11]]},"560":{"position":[[10,11]]},"562":{"position":[[7,11]]}}}],["name",{"_index":246,"t":{"630":{"position":[[29,5]]}}}],["nativ",{"_index":200,"t":{"504":{"position":[[4,6]]}}}],["navidrom",{"_index":88,"t":{"177":{"position":[[38,9]]},"246":{"position":[[0,9]]}}}],["new",{"_index":142,"t":{"403":{"position":[[32,3]]},"407":{"position":[[32,3]]},"409":{"position":[[39,3]]}}}],["next",{"_index":226,"t":{"568":{"position":[[0,4]]}}}],["nodej",{"_index":221,"t":{"548":{"position":[[0,6]]}}}],["normal",{"_index":70,"t":{"133":{"position":[[0,9]]}}}],["now",{"_index":31,"t":{"41":{"position":[[0,3]]}}}],["object",{"_index":158,"t":{"426":{"position":[[5,6]]},"589":{"position":[[15,6]]}}}],["occur",{"_index":59,"t":{"119":{"position":[[39,5]]},"121":{"position":[[36,5]]}}}],["option",{"_index":38,"t":{"58":{"position":[[0,8]]},"80":{"position":[[0,8]]},"558":{"position":[[0,10]]},"630":{"position":[[0,10]]}}}],["parenthes",{"_index":143,"t":{"405":{"position":[[11,13]]}}}],["pars",{"_index":126,"t":{"386":{"position":[[0,5]]},"388":{"position":[[6,5]]},"443":{"position":[[20,6]]}}}],["partial",{"_index":197,"t":{"493":{"position":[[6,7]]}}}],["peopl",{"_index":85,"t":{"175":{"position":[[22,6]]}}}],["phrase",{"_index":141,"t":{"403":{"position":[[7,6]]}}}],["play",{"_index":32,"t":{"41":{"position":[[4,7]]},"362":{"position":[[10,4]]},"403":{"position":[[36,5]]},"407":{"position":[[36,5]]},"409":{"position":[[43,5]]},"426":{"position":[[0,4]]},"516":{"position":[[5,4]]},"589":{"position":[[10,4]]}}}],["playback",{"_index":106,"t":{"314":{"position":[[9,8]]}}}],["player",{"_index":182,"t":{"450":{"position":[[57,6]]}}}],["plex",{"_index":104,"t":{"308":{"position":[[14,4]]}}}],["poll",{"_index":235,"t":{"593":{"position":[[10,7]]}}}],["popular",{"_index":96,"t":{"245":{"position":[[10,7]]}}}],["practic",{"_index":123,"t":{"370":{"position":[[5,9]]},"484":{"position":[[5,9]]}}}],["presenc",{"_index":39,"t":{"59":{"position":[[15,8]]}}}],["prevent",{"_index":174,"t":{"446":{"position":[[9,7]]}}}],["primari",{"_index":149,"t":{"411":{"position":[[8,7]]}}}],["problem",{"_index":72,"t":{"135":{"position":[[12,7]]}}}],["profil",{"_index":160,"t":{"430":{"position":[[0,9]]}}}],["project",{"_index":151,"t":{"416":{"position":[[0,7]]},"529":{"position":[[7,7]]}}}],["prometheu",{"_index":25,"t":{"30":{"position":[[0,10]]}}}],["quick",{"_index":248,"t":{"640":{"position":[[0,5]]}}}],["quirk",{"_index":79,"t":{"150":{"position":[[40,6]]}}}],["recommend",{"_index":218,"t":{"542":{"position":[[0,11]]}}}],["refer",{"_index":80,"t":{"152":{"position":[[14,9]]}}}],["refin",{"_index":192,"t":{"477":{"position":[[0,8]]}}}],["remov",{"_index":140,"t":{"403":{"position":[[0,6]]},"405":{"position":[[0,6]]},"409":{"position":[[0,6]]}}}],["renam",{"_index":146,"t":{"407":{"position":[[0,6]]},"628":{"position":[[0,7]]}}}],["replac",{"_index":136,"t":{"396":{"position":[[11,7]]}}}],["report",{"_index":107,"t":{"314":{"position":[[18,9]]},"523":{"position":[[0,9]]}}}],["requir",{"_index":35,"t":{"55":{"position":[[0,8]]},"69":{"position":[[0,8]]},"526":{"position":[[8,12]]}}}],["retent",{"_index":13,"t":{"17":{"position":[[0,9]]}}}],["retriev",{"_index":90,"t":{"191":{"position":[[0,8]]}}}],["rule",{"_index":115,"t":{"362":{"position":[[0,5]]},"379":{"position":[[0,5]]},"398":{"position":[[0,5]]},"469":{"position":[[0,5]]}}}],["run",{"_index":120,"t":{"366":{"position":[[14,3]]},"536":{"position":[[0,3]]}}}],["scenario",{"_index":229,"t":{"580":{"position":[[0,8]]}}}],["score",{"_index":193,"t":{"478":{"position":[[0,5]]}}}],["script",{"_index":216,"t":{"532":{"position":[[10,6]]}}}],["scrobbl",{"_index":30,"t":{"39":{"position":[[5,9]]},"122":{"position":[[9,9]]},"131":{"position":[[32,8]]},"133":{"position":[[14,9]]},"163":{"position":[[9,8]]},"165":{"position":[[17,10]]},"175":{"position":[[0,8]]},"177":{"position":[[23,9]]},"352":{"position":[[13,8]]},"445":{"position":[[0,10]]},"446":{"position":[[27,10]]},"448":{"position":[[17,8]]},"454":{"position":[[11,10]]},"456":{"position":[[35,9]]},"502":{"position":[[22,8]]},"558":{"position":[[19,9]]},"624":{"position":[[7,8]]}}}],["scrobbler",{"_index":48,"t":{"76":{"position":[[32,9]]},"150":{"position":[[10,9]]},"310":{"position":[[29,9]]},"566":{"position":[[12,9]]},"634":{"position":[[15,9]]}}}],["search",{"_index":135,"t":{"396":{"position":[[0,6]]},"475":{"position":[[0,9]]},"489":{"position":[[0,6]]},"506":{"position":[[10,6]]}}}],["secondari",{"_index":10,"t":{"13":{"position":[[0,9]]}}}],["secret",{"_index":5,"t":{"7":{"position":[[0,7]]}}}],["sensibl",{"_index":195,"t":{"487":{"position":[[0,8]]},"500":{"position":[[0,8]]}}}],["sent",{"_index":60,"t":{"122":{"position":[[19,4]]}}}],["servic",{"_index":20,"t":{"24":{"position":[[9,8]]},"76":{"position":[[15,7]]},"324":{"position":[[0,7]]},"574":{"position":[[10,7]]},"576":{"position":[[6,7]]}}}],["set",{"_index":219,"t":{"542":{"position":[[12,8]]}}}],["setup",{"_index":2,"t":{"5":{"position":[[0,5]]},"55":{"position":[[9,5]]},"58":{"position":[[9,5]]},"69":{"position":[[9,5]]},"74":{"position":[[0,5]]},"80":{"position":[[9,5]]},"106":{"position":[[0,5]]},"139":{"position":[[0,5]]},"223":{"position":[[0,5]]},"237":{"position":[[0,5]]},"245":{"position":[[0,5]]},"288":{"position":[[0,5]]},"320":{"position":[[0,5]]},"416":{"position":[[8,5]]},"465":{"position":[[4,5]]},"532":{"position":[[4,5]]},"534":{"position":[[7,5]]},"556":{"position":[[0,5]]},"564":{"position":[[0,5]]}}}],["solut",{"_index":63,"t":{"126":{"position":[[14,9]]}}}],["sort",{"_index":194,"t":{"482":{"position":[[0,7]]}}}],["sourc",{"_index":3,"t":{"5":{"position":[[6,7]]},"122":{"position":[[36,7]]},"124":{"position":[[0,7]]},"127":{"position":[[12,7]]},"129":{"position":[[12,7]]},"156":{"position":[[0,7]]},"159":{"position":[[9,7]]},"173":{"position":[[9,7]]},"229":{"position":[[9,7]]},"243":{"position":[[9,7]]},"428":{"position":[[21,7]]},"506":{"position":[[34,6]]},"529":{"position":[[15,6]]},"531":{"position":[[9,7]]},"556":{"position":[[6,7]]},"562":{"position":[[25,6]]},"585":{"position":[[18,6]]},"587":{"position":[[11,6]]},"598":{"position":[[6,6]]},"636":{"position":[[0,6]]}}}],["source/cli",{"_index":241,"t":{"620":{"position":[[0,13]]}}}],["specif",{"_index":131,"t":{"388":{"position":[[12,8]]}}}],["spotifi",{"_index":203,"t":{"506":{"position":[[54,8]]}}}],["spotify/deezer/lastfm",{"_index":164,"t":{"436":{"position":[[0,21]]}}}],["stack",{"_index":51,"t":{"76":{"position":[[57,5]]}}}],["stage",{"_index":114,"t":{"358":{"position":[[13,5]]},"360":{"position":[[12,6]]},"364":{"position":[[0,5]]},"381":{"position":[[8,5]]},"467":{"position":[[0,5]]},"504":{"position":[[11,5]]},"591":{"position":[[10,6]]}}}],["standard",{"_index":94,"t":{"225":{"position":[[0,8]]},"239":{"position":[[0,8]]}}}],["start",{"_index":225,"t":{"566":{"position":[[0,5]]},"574":{"position":[[0,5]]},"640":{"position":[[6,5]]}}}],["station",{"_index":89,"t":{"183":{"position":[[0,7]]}}}],["statu",{"_index":21,"t":{"24":{"position":[[18,6]]}}}],["step",{"_index":227,"t":{"568":{"position":[[5,5]]}}}],["store",{"_index":11,"t":{"13":{"position":[[18,5]]}}}],["string",{"_index":128,"t":{"386":{"position":[[19,6]]},"411":{"position":[[52,6]]}}}],["time",{"_index":173,"t":{"440":{"position":[[31,4]]},"450":{"position":[[74,5]]}}}],["titl",{"_index":133,"t":{"390":{"position":[[21,5],[45,5]]},"403":{"position":[[19,5]]},"405":{"position":[[51,5]]}}}],["token",{"_index":37,"t":{"56":{"position":[[5,5]]},"146":{"position":[[24,5]]},"241":{"position":[[0,5]]}}}],["track",{"_index":175,"t":{"448":{"position":[[26,6]]},"450":{"position":[[12,5]]},"452":{"position":[[28,5]]}}}],["transform",{"_index":234,"t":{"589":{"position":[[22,9]]}}}],["troubleshoot",{"_index":95,"t":{"231":{"position":[[0,15]]},"250":{"position":[[0,15]]}}}],["type",{"_index":1,"t":{"3":{"position":[[14,5]]},"159":{"position":[[0,5]]},"598":{"position":[[13,5]]}}}],["unit",{"_index":228,"t":{"572":{"position":[[9,4]]}}}],["updat",{"_index":213,"t":{"529":{"position":[[0,6]]},"601":{"position":[[0,8]]},"607":{"position":[[0,6]]}}}],["upstream",{"_index":19,"t":{"24":{"position":[[0,8]]},"122":{"position":[[0,8]]}}}],["uri",{"_index":98,"t":{"272":{"position":[[0,3]]}}}],["url",{"_index":8,"t":{"9":{"position":[[5,3]]},"88":{"position":[[18,3]]},"98":{"position":[[18,3]]},"181":{"position":[[0,3]]},"205":{"position":[[0,3]]},"211":{"position":[[0,3]]},"225":{"position":[[14,3]]},"231":{"position":[[16,3]]},"239":{"position":[[14,3]]},"250":{"position":[[16,3]]}}}],["us",{"_index":40,"t":{"59":{"position":[[27,4]]},"177":{"position":[[0,3]]},"310":{"position":[[0,5]]},"386":{"position":[[26,5]]},"493":{"position":[[0,5]]},"504":{"position":[[0,3]]},"508":{"position":[[0,3]]},"511":{"position":[[8,6]]},"532":{"position":[[0,3]]},"615":{"position":[[18,6]]}}}],["usag",{"_index":138,"t":{"401":{"position":[[0,5]]},"544":{"position":[[7,5]]},"646":{"position":[[0,5]]}}}],["user",{"_index":36,"t":{"56":{"position":[[0,4]]},"146":{"position":[[19,4]]},"336":{"position":[[9,5]]}}}],["variou",{"_index":148,"t":{"409":{"position":[[7,8]]}}}],["version",{"_index":239,"t":{"609":{"position":[[0,10]]},"615":{"position":[[5,7]]}}}],["vlc",{"_index":185,"t":{"454":{"position":[[0,3]]}}}],["vscode",{"_index":152,"t":{"418":{"position":[[0,6]]}}}],["web",{"_index":17,"t":{"21":{"position":[[8,3]]}}}],["webhook",{"_index":22,"t":{"26":{"position":[[0,7]]}}}],["webscrobbler/listenbrainz",{"_index":162,"t":{"434":{"position":[[0,25]]}}}],["weird",{"_index":183,"t":{"450":{"position":[[68,5]]}}}],["what'",{"_index":83,"t":{"170":{"position":[[0,6]]}}}],["won't",{"_index":165,"t":{"436":{"position":[[22,5]]}}}],["work",{"_index":247,"t":{"634":{"position":[[30,5]]}}}],["youtub",{"_index":171,"t":{"440":{"position":[[0,7]]},"456":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":1,"t":"Configuration","s":"Overview","u":"/multi-scrobbler/configuration/","p":1},{"i":32,"t":"Scrobble Clients","s":"Overview","u":"/multi-scrobbler/configuration/clients/","p":32},{"i":43,"t":"To monitor and re-scrobble activity from a Koito account create a Koito (Source)","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","p":43},{"i":47,"t":"Discord Client Overview","s":"Discord","u":"/multi-scrobbler/configuration/clients/discord/","p":47},{"i":53,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","s":"Discord (Headless)","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","p":53},{"i":67,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler.","s":"Discord (App)","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","p":67},{"i":86,"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":86},{"i":92,"t":"Setup a Maloja server if you have not already done this.","s":"Maloja","u":"/multi-scrobbler/configuration/clients/maloja/","p":92},{"i":96,"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":96},{"i":104,"t":"To monitor and re-scrobble activity from Rocksky create a Rocksky (Source)","s":"Rocksky","u":"/multi-scrobbler/configuration/clients/rocksky/","p":104},{"i":111,"t":"* To monitor and re-scrobble activity from a Listenbrainz account create a Listenbrainz (Source)","s":"Listenbrainz","u":"/multi-scrobbler/configuration/clients/listenbrainz/","p":111},{"i":115,"t":"Common Scenarios and Solutions for Duplicate Scrobbles","s":"Duplicate Scrobble Guidance","u":"/multi-scrobbler/configuration/duplicates/","p":115},{"i":137,"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":137},{"i":144,"t":"This Source monitors your Apple Music listening history via the official Apple Music API and scrobbles new activity to your configured Clients.","s":"Apple Music","u":"/multi-scrobbler/configuration/sources/applemusic/","p":144},{"i":154,"t":"Scrobble Sources","s":"Overview","u":"/multi-scrobbler/configuration/sources/","p":154},{"i":169,"t":"Kitchen Sink Examples","s":"Kitchen Sink","u":"/multi-scrobbler/configuration/kitchensink/","p":169},{"i":179,"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":179},{"i":187,"t":"Must be using Jellyfin 10.7 or greater","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","p":187},{"i":189,"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":189},{"i":199,"t":"Icecast Source Configuration","s":"Icecast","u":"/multi-scrobbler/configuration/sources/icecast/","p":199},{"i":203,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can be found in the JRiver GUI:","s":"JRiver","u":"/multi-scrobbler/configuration/sources/jriver/","p":203},{"i":209,"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":209},{"i":215,"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":215},{"i":219,"t":"Koito (Source)","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","p":219},{"i":221,"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":221},{"i":235,"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":235},{"i":254,"t":"Libre.fm (Source)","s":"Libre.fm","u":"/multi-scrobbler/configuration/sources/librefm-source/","p":254},{"i":258,"t":"Listenbrainz (Source)","s":"Listenbrainz","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","p":258},{"i":262,"t":"To scrobble to a Maloja server, create a Maloja (Client)","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","p":262},{"i":266,"t":"Last.fm (Source)","s":"Last.fm","u":"/multi-scrobbler/configuration/sources/lastfm-source/","p":266},{"i":270,"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":270},{"i":278,"t":"MS communicates with MPD using the TCP client connection.","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","p":278},{"i":282,"t":"In order to use Musikcube configure it to accept websocket connections in server setup:","s":"Musikcube","u":"/multi-scrobbler/configuration/sources/musikcube/","p":282},{"i":286,"t":"Rocksky (Source)","s":"Rocksky","u":"/multi-scrobbler/configuration/sources/rocksky-source/","p":286},{"i":292,"t":"MPRIS is a standard interface for communicating with Music Players on linux operating systems.","s":"MPRIS","u":"/multi-scrobbler/configuration/sources/mpris/","p":292},{"i":296,"t":"Multi-scrobbler can use the Sonos local API to monitor what your Sonos system is playing.","s":"Sonos","u":"/multi-scrobbler/configuration/sources/sonos/","p":296},{"i":302,"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":302},{"i":306,"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":306},{"i":312,"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":312},{"i":318,"t":"Teal.fm (Source)","s":"Teal.fm","u":"/multi-scrobbler/configuration/sources/tealfm-source/","p":318},{"i":326,"t":"MS communicates with VLC using the Web (http) interface module","s":"VLC","u":"/multi-scrobbler/configuration/sources/vlc/","p":326},{"i":330,"t":"Monitor MusicCast device/receivers for music played on Network/USB/CD inputs.","s":"Yamaha MusicCast","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","p":330},{"i":334,"t":"After installing the Webscrobbler extension open the preferences/settings for it:","s":"Webscrobbler","u":"/multi-scrobbler/configuration/sources/webscrobbler/","p":334},{"i":342,"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":342},{"i":346,"t":"Monitor your Yandex Music listening activity in real-time.","s":"Yandex Music","u":"/multi-scrobbler/configuration/sources/yandex-music/","p":346},{"i":350,"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":350},{"i":375,"t":"Enhancing Scrobbles with Built-in Parsing","s":"Native Stage","u":"/multi-scrobbler/configuration/transforms/native/","p":375},{"i":392,"t":"Enhancing Scrobbles with Regex Parsing","s":"User Stage","u":"/multi-scrobbler/configuration/transforms/user/","p":392},{"i":413,"t":"Common Development Knowledge","s":"Development","u":"/multi-scrobbler/development/dev-common/","p":413},{"i":432,"t":"Connection Issues","s":"FAQ","u":"/multi-scrobbler/FAQ/","p":432},{"i":458,"t":"Enhancing Scrobbles with Musicbrainz","s":"Musicbrainz Stage","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","p":458},{"i":510,"t":"Getting Useful Data","s":"Help","u":"/multi-scrobbler/help/","p":510},{"i":525,"t":"Building Flatpak App","s":"Flatpak","u":"/multi-scrobbler/development/flatpak/","p":525},{"i":538,"t":"Installation","s":"Overview","u":"/multi-scrobbler/installation/","p":538},{"i":552,"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":552},{"i":570,"t":"Local Install as a Service","s":"Systemd","u":"/multi-scrobbler/installation/service/","p":570},{"i":578,"t":"Developing a new Source","s":"Source Development/Tutorial","u":"/multi-scrobbler/development/dev-source/","p":578},{"i":600,"t":"Updating Multi-Scrobbler","s":"Overview","u":"/multi-scrobbler/updating/","p":600},{"i":617,"t":"Updating Multi-Scrobbler","s":"Upgrade Path","u":"/multi-scrobbler/updating/upgrade-path/","p":617},{"i":619,"t":"Upgrading to 0.14.0","s":"From < 0.14.0","u":"/multi-scrobbler/updating/upgrade-path/0140/","p":619},{"i":632,"t":"Latest Release","s":"Overview","u":"/multi-scrobbler/","p":632}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,4.073]],["t/32",[1,1.588,2,3.475]],["t/43",[1,1.036,3,1.426,4,2.11,5,1.859,6,4.216,7,2.454,8,1.976,9,0.991]],["t/47",[2,3.229,10,3.832,11,4.961]],["t/53",[3,1.143,10,2.154,12,1.704,13,1.039,14,2.407,15,1.583,16,2.154,17,2.407,18,2.407,19,2.407,20,1.406,21,2.407,22,1.143]],["t/67",[3,1.143,10,2.154,12,1.704,13,1.039,14,2.407,15,1.583,16,2.154,17,2.407,18,2.407,19,2.407,20,1.406,21,2.407,22,1.143]],["t/86",[1,0.986,3,1.359,4,2.01,5,1.771,7,2.338,8,1.883,9,0.944,23,2.562,24,3.317,25,2.562]],["t/92",[26,3.749,27,3.749,28,2.466,29,4.346,30,3.749]],["t/96",[1,0.986,3,1.359,4,2.01,5,1.771,7,2.338,8,1.883,9,0.944,23,2.562,31,4.074]],["t/104",[1,1.09,3,1.501,4,2.221,5,1.956,8,2.08,9,1.043,32,4.368]],["t/111",[1,0.986,3,1.359,4,2.01,5,1.771,7,2.338,8,1.883,9,0.944,23,2.562,33,3.647]],["t/115",[1,1.292,34,3.749,35,4.346,36,4.346,37,4.346]],["t/137",[1,1.036,3,1.426,4,2.11,5,1.859,8,1.976,9,0.991,38,3.482,39,3.482,40,3.004]],["t/144",[0,1.821,1,0.768,2,1.682,3,1.058,5,1.38,9,0.735,20,1.98,41,3.928,42,1.996,43,2.584,44,2.584,45,2.584,46,1.821,47,2.229]],["t/154",[1,1.588,9,1.519]],["t/169",[48,4.961,49,4.961,50,4.961]],["t/179",[1,1.136,12,1.021,13,0.928,22,1.021,42,1.925,51,2.492,52,3.821,53,2.15,54,2.15,55,2.15,56,2.492,57,2.492,58,2.492,59,2.15,60,2.492]],["t/187",[13,1.726,61,4.633,62,4.633,63,4.633]],["t/189",[9,1.005,13,1.316,16,1.739,64,1.943,65,3.532,66,2.252,67,3.532,68,1.739,69,2.252,70,2.252,71,2.252,72,1.943,73,2.252,74,1.466,75,2.252,76,2.252]],["t/199",[0,3.497,9,1.412,77,4.961]],["t/203",[12,1.241,22,1.241,28,1.72,78,2.136,79,1.837,80,4.424,81,2.341,82,2.136,83,1.973,84,3.031,85,2.615]],["t/209",[12,1.297,22,1.297,30,2.733,78,2.232,79,1.92,81,2.446,82,2.232,83,2.062,85,2.733,86,4.568]],["t/215",[1,0.798,3,1.099,12,1.099,13,0.999,15,1.523,20,1.352,22,1.099,78,1.891,87,2.683,88,2.683,89,2.683,90,2.683,91,2.683,92,2.683,93,2.683]],["t/219",[6,4.606,9,1.519]],["t/221",[1,0.986,9,0.944,12,1.359,22,1.359,25,2.562,28,1.883,83,2.159,94,2.562,95,2.862,96,2.562]],["t/235",[1,0.986,9,0.944,12,1.359,22,1.359,28,1.883,33,2.562,83,2.159,94,2.562,95,2.862,96,2.562]],["t/254",[9,1.519,31,4.606]],["t/258",[9,1.519,33,4.123]],["t/262",[1,1.217,2,2.663,8,2.322,27,4.708,28,2.322]],["t/266",[9,1.519,25,4.123]],["t/270",[9,0.735,15,1.466,20,1.98,28,1.466,97,2.584,98,2.584,99,1.821,100,2.229,101,3.389,102,2.584,103,2.229,104,2.584,105,2.584,106,2.584]],["t/278",[2,2.517,13,1.44,79,2.343,107,2.986,108,3.866,109,3.866,110,2.725]],["t/282",[0,2.454,13,1.297,26,3.004,28,1.976,78,2.454,94,2.689,110,2.454,111,3.482,112,3.482]],["t/286",[9,1.519,32,4.606]],["t/292",[20,1.755,79,2.11,82,2.454,101,3.004,113,3.482,114,3.004,115,3.482,116,3.482,117,3.004]],["t/296",[3,1.359,12,1.359,13,1.236,15,1.883,22,1.359,46,2.338,117,2.862,118,4.722,119,2.862]],["t/302",[1,0.433,13,0.542,15,1.829,46,1.026,53,2.133,54,2.133,55,1.256,59,1.256,74,1.61,83,0.948,107,1.91,114,1.256,120,3.799,121,1.456,122,1.456,123,1.456,124,1.456,125,1.256,126,1.456,127,1.456,128,1.456,129,1.456,130,1.456,131,2.473,132,1.456,133,1.256,134,1.456]],["t/306",[13,1.18,110,2.232,135,3.168,136,4.568,137,3.168,138,3.168,139,3.168,140,3.168,141,3.168,142,3.168]],["t/312",[9,0.862,13,1.129,46,2.136,96,2.341,99,2.136,103,2.615,143,3.031,144,3.031,145,3.031,146,3.031,147,3.031,148,3.031]],["t/318",[9,1.519,40,4.606]],["t/326",[13,1.365,79,2.221,81,2.83,82,2.583,107,2.83,149,3.664,150,3.664,151,3.664]],["t/330",[3,1.584,15,2.194,20,1.949,152,3.866,153,3.866,154,3.866,155,3.866]],["t/334",[156,3.356,157,4.346,158,4.346,159,4.346,160,4.346]],["t/342",[20,1.826,64,2.007,72,2.007,74,1.514,79,1.41,99,1.64,161,3.623,162,2.326,163,3.623,164,2.326,165,2.326,166,2.326,167,3.623,168,2.326,169,2.326]],["t/346",[3,1.584,5,2.064,20,1.949,42,2.986,74,2.517,170,3.866,171,3.866]],["t/350",[1,0.629,12,0.867,22,1.377,68,1.634,74,1.377,99,1.491,100,1.825,133,1.825,172,2.116,173,1.491,174,2.116,175,2.116,176,2.116,177,2.116,178,2.116,179,2.116,180,2.116,181,2.116,182,2.116,183,2.116,184,2.116]],["t/375",[1,1.378,173,3.265,185,4.633,186,3.997]],["t/392",[1,1.378,173,3.265,186,3.997,187,4.633]],["t/413",[34,4.28,188,4.28,189,4.961]],["t/432",[110,3.763,190,5.339]],["t/458",[1,1.475,173,3.497,191,4.961]],["t/510",[13,1.848,68,3.832,192,4.961]],["t/525",[193,4.961,194,4.961,195,4.961]],["t/538",[156,4.463]],["t/552",[12,1.297,13,1.18,22,1.297,125,2.733,196,4.568,197,3.168,198,3.168,199,4.568,200,3.168]],["t/570",[119,4.28,156,3.832,201,4.961]],["t/578",[9,1.412,47,4.28,188,4.28]],["t/600",[12,2.032,22,2.032,202,4.28]],["t/617",[12,2.032,22,2.032,202,4.28]],["t/619",[203,5.339,204,5.339]],["t/632",[205,5.339,206,5.339]]],"invertedIndex":[["",{"_index":23,"t":{"86":{"position":[[0,1]]},"96":{"position":[[0,1]]},"111":{"position":[[0,1]]}}}],["0.14.0",{"_index":204,"t":{"619":{"position":[[13,6]]}}}],["10.7",{"_index":62,"t":{"187":{"position":[[23,4]]}}}],["abil",{"_index":133,"t":{"302":{"position":[[335,7]]},"350":{"position":[[36,7]]}}}],["accept",{"_index":94,"t":{"221":{"position":[[39,6]]},"235":{"position":[[39,6]]},"282":{"position":[[42,6]]}}}],["access",{"_index":66,"t":{"189":{"position":[[39,6]]}}}],["account",{"_index":7,"t":{"43":{"position":[[49,7]]},"86":{"position":[[65,7]]},"96":{"position":[[57,7]]},"111":{"position":[[58,7]]}}}],["accur",{"_index":123,"t":{"302":{"position":[[102,10]]}}}],["accuraci",{"_index":134,"t":{"302":{"position":[[391,8]]}}}],["activ",{"_index":5,"t":{"43":{"position":[[27,8]]},"86":{"position":[[29,8]]},"96":{"position":[[29,8]]},"104":{"position":[[27,8]]},"111":{"position":[[29,8]]},"137":{"position":[[27,8]]},"144":{"position":[[107,8]]},"346":{"position":[[36,8]]}}}],["actual",{"_index":129,"t":{"302":{"position":[[231,6]]}}}],["affect",{"_index":131,"t":{"302":{"position":[[323,6],[380,6]]}}}],["airson",{"_index":147,"t":{"312":{"position":[[126,8]]}}}],["album",{"_index":181,"t":{"350":{"position":[[150,5]]}}}],["alreadi",{"_index":29,"t":{"92":{"position":[[38,7]]}}}],["api",{"_index":46,"t":{"144":{"position":[[85,3]]},"296":{"position":[[40,3]]},"302":{"position":[[304,4]]},"312":{"position":[[73,3]]}}}],["app",{"_index":195,"t":{"525":{"position":[[17,3]]}}}],["appl",{"_index":41,"t":{"144":{"position":[[26,5],[73,5]]}}}],["applic",{"_index":96,"t":{"221":{"position":[[69,12]]},"235":{"position":[[69,12]]},"312":{"position":[[32,11]]}}}],["artist",{"_index":180,"t":{"350":{"position":[[137,8]]}}}],["atproto",{"_index":38,"t":{"137":{"position":[[43,7]]}}}],["autom",{"_index":174,"t":{"350":{"position":[[75,9]]}}}],["automix",{"_index":121,"t":{"302":{"position":[[27,7]]}}}],["azuracast",{"_index":51,"t":{"179":{"position":[[0,9]]}}}],["bandcamp",{"_index":105,"t":{"270":{"position":[[123,9]]}}}],["break",{"_index":75,"t":{"189":{"position":[[159,8]]}}}],["browser",{"_index":169,"t":{"342":{"position":[[199,8]]}}}],["build",{"_index":193,"t":{"525":{"position":[[0,8]]}}}],["built",{"_index":185,"t":{"375":{"position":[[25,5]]}}}],["button",{"_index":90,"t":{"215":{"position":[[47,6]]}}}],["case",{"_index":57,"t":{"179":{"position":[[76,4]]}}}],["cast",{"_index":89,"t":{"215":{"position":[[28,4]]}}}],["chang",{"_index":72,"t":{"189":{"position":[[115,6]]},"342":{"position":[[166,6]]}}}],["chromecast",{"_index":91,"t":{"215":{"position":[[54,10]]}}}],["client",{"_index":2,"t":{"32":{"position":[[9,7]]},"47":{"position":[[8,6]]},"144":{"position":[[135,8]]},"262":{"position":[[49,8]]},"278":{"position":[[39,6]]}}}],["common",{"_index":34,"t":{"115":{"position":[[0,6]]},"413":{"position":[[0,6]]}}}],["commun",{"_index":79,"t":{"203":{"position":[[32,11]]},"209":{"position":[[32,11]]},"278":{"position":[[3,12]]},"292":{"position":[[34,13]]},"326":{"position":[[3,12]]},"342":{"position":[[0,13]]}}}],["compos",{"_index":200,"t":{"552":{"position":[[84,8]]}}}],["config",{"_index":172,"t":{"350":{"position":[[16,7]]}}}],["configur",{"_index":0,"t":{"1":{"position":[[0,13]]},"144":{"position":[[124,10]]},"199":{"position":[[15,13]]},"282":{"position":[[26,9]]}}}],["connect",{"_index":110,"t":{"278":{"position":[[46,11]]},"282":{"position":[[59,11]]},"306":{"position":[[63,7]]},"432":{"position":[[0,10]]}}}],["correctli",{"_index":52,"t":{"179":{"position":[[18,9],[186,10]]}}}],["creat",{"_index":8,"t":{"43":{"position":[[57,6]]},"86":{"position":[[73,6]]},"96":{"position":[[65,6]]},"104":{"position":[[49,6]]},"111":{"position":[[66,6]]},"137":{"position":[[59,6]]},"262":{"position":[[33,6]]}}}],["current",{"_index":21,"t":{"53":{"position":[[101,9]]},"67":{"position":[[101,9]]}}}],["data",{"_index":68,"t":{"189":{"position":[[53,4]]},"350":{"position":[[64,4]]},"510":{"position":[[15,4]]}}}],["decid",{"_index":168,"t":{"342":{"position":[[155,7]]}}}],["deezer",{"_index":67,"t":{"189":{"position":[[46,6],[104,6]]}}}],["deezer'",{"_index":70,"t":{"189":{"position":[[90,8]]}}}],["determin",{"_index":124,"t":{"302":{"position":[[113,9]]}}}],["develop",{"_index":188,"t":{"413":{"position":[[7,11]]},"578":{"position":[[0,10]]}}}],["devic",{"_index":88,"t":{"215":{"position":[[14,6]]}}}],["device/receiv",{"_index":153,"t":{"330":{"position":[[18,16]]}}}],["differ",{"_index":182,"t":{"350":{"position":[[164,9]]}}}],["discord",{"_index":10,"t":{"47":{"position":[[0,7]]},"53":{"position":[[58,7]]},"67":{"position":[[58,7]]}}}],["docker",{"_index":199,"t":{"552":{"position":[[66,6],[77,6]]}}}],["done",{"_index":30,"t":{"92":{"position":[[46,4]]},"209":{"position":[[107,4]]}}}],["duplic",{"_index":37,"t":{"115":{"position":[[35,9]]}}}],["durat",{"_index":59,"t":{"179":{"position":[[117,8]]},"302":{"position":[[407,8]]}}}],["enabl",{"_index":83,"t":{"203":{"position":[[91,8]]},"209":{"position":[[86,8]]},"221":{"position":[[12,7]]},"235":{"position":[[12,7]]},"302":{"position":[[35,7]]}}}],["end",{"_index":125,"t":{"302":{"position":[[141,4]]},"552":{"position":[[100,3]]}}}],["endors",{"_index":162,"t":{"342":{"position":[[63,8]]}}}],["endpoint",{"_index":146,"t":{"312":{"position":[[108,8]]}}}],["enhanc",{"_index":173,"t":{"350":{"position":[[47,7]]},"375":{"position":[[0,9]]},"392":{"position":[[0,9]]},"458":{"position":[[0,9]]}}}],["exampl",{"_index":50,"t":{"169":{"position":[[13,8]]}}}],["extens",{"_index":158,"t":{"334":{"position":[[34,9]]}}}],["fashion",{"_index":175,"t":{"350":{"position":[[85,7]]}}}],["find",{"_index":135,"t":{"306":{"position":[[0,4]]}}}],["flatpak",{"_index":194,"t":{"525":{"position":[[9,7]]}}}],["found",{"_index":84,"t":{"203":{"position":[[112,5]]}}}],["function",{"_index":16,"t":{"53":{"position":[[32,13]]},"67":{"position":[[32,13]]},"189":{"position":[[168,14]]}}}],["get",{"_index":192,"t":{"510":{"position":[[0,7]]}}}],["getnowplay",{"_index":145,"t":{"312":{"position":[[94,13]]}}}],["googl",{"_index":163,"t":{"342":{"position":[[75,7],[148,6]]}}}],["greater",{"_index":63,"t":{"187":{"position":[[31,7]]}}}],["gui",{"_index":85,"t":{"203":{"position":[[132,4]]},"209":{"position":[[124,4]]}}}],["guid",{"_index":196,"t":{"552":{"position":[[5,5],[111,5]]}}}],["headless",{"_index":98,"t":{"270":{"position":[[12,8]]}}}],["histori",{"_index":43,"t":{"144":{"position":[[48,7]]}}}],["http",{"_index":150,"t":{"326":{"position":[[39,6]]}}}],["icecast",{"_index":77,"t":{"199":{"position":[[0,7]]}}}],["icon",{"_index":92,"t":{"215":{"position":[[65,4]]}}}],["implement",{"_index":143,"t":{"312":{"position":[[49,10]]}}}],["input",{"_index":155,"t":{"330":{"position":[[70,7]]}}}],["instal",{"_index":156,"t":{"334":{"position":[[6,10]]},"538":{"position":[[0,12]]},"570":{"position":[[6,7]]}}}],["instanc",{"_index":142,"t":{"306":{"position":[[84,9]]}}}],["integr",{"_index":165,"t":{"342":{"position":[[104,11]]}}}],["interfac",{"_index":82,"t":{"203":{"position":[[81,9]]},"209":{"position":[[76,9]]},"292":{"position":[[20,9]]},"326":{"position":[[46,9]]}}}],["issu",{"_index":190,"t":{"432":{"position":[[11,6]]}}}],["jellyfin",{"_index":61,"t":{"187":{"position":[[14,8]]}}}],["jriver",{"_index":80,"t":{"203":{"position":[[49,6],[125,6]]}}}],["kitchen",{"_index":48,"t":{"169":{"position":[[0,7]]}}}],["knowledg",{"_index":189,"t":{"413":{"position":[[19,9]]}}}],["kodi",{"_index":86,"t":{"209":{"position":[[49,4],[119,4]]}}}],["koito",{"_index":6,"t":{"43":{"position":[[43,5],[66,5]]},"219":{"position":[[0,5]]}}}],["last.fm",{"_index":25,"t":{"86":{"position":[[82,7]]},"221":{"position":[[97,7]]},"266":{"position":[[0,7]]}}}],["last.fm/libre.fm",{"_index":24,"t":{"86":{"position":[[48,16]]}}}],["latest",{"_index":205,"t":{"632":{"position":[[0,6]]}}}],["length",{"_index":55,"t":{"179":{"position":[[41,6]]},"302":{"position":[[238,6]]}}}],["libre.fm",{"_index":31,"t":{"96":{"position":[[48,8],[74,8]]},"254":{"position":[[0,8]]}}}],["lifecycl",{"_index":184,"t":{"350":{"position":[[201,10]]}}}],["linux",{"_index":115,"t":{"292":{"position":[[70,5]]}}}],["listen",{"_index":42,"t":{"144":{"position":[[38,9]]},"179":{"position":[[103,9]]},"346":{"position":[[26,9]]}}}],["listenbrainz",{"_index":33,"t":{"111":{"position":[[45,12],[75,12]]},"235":{"position":[[97,12]]},"258":{"position":[[0,12]]}}}],["local",{"_index":119,"t":{"296":{"position":[[34,5]]},"570":{"position":[[0,5]]}}}],["make",{"_index":138,"t":{"306":{"position":[[25,4]]}}}],["maloja",{"_index":27,"t":{"92":{"position":[[8,6]]},"262":{"position":[[18,6],[42,6]]}}}],["mani",{"_index":100,"t":{"270":{"position":[[67,4]]},"350":{"position":[[159,4]]}}}],["match",{"_index":176,"t":{"350":{"position":[[96,8]]}}}],["mean",{"_index":164,"t":{"342":{"position":[[88,5]]}}}],["media",{"_index":87,"t":{"215":{"position":[[8,5]]}}}],["method",{"_index":65,"t":{"189":{"position":[[28,7],[138,7]]}}}],["mix",{"_index":126,"t":{"302":{"position":[[175,7]]}}}],["modifi",{"_index":130,"t":{"302":{"position":[[278,8]]}}}],["modul",{"_index":151,"t":{"326":{"position":[[56,6]]}}}],["monitor",{"_index":3,"t":{"43":{"position":[[3,7]]},"53":{"position":[[111,10]]},"67":{"position":[[111,10]]},"86":{"position":[[5,7]]},"96":{"position":[[5,7]]},"104":{"position":[[3,7]]},"111":{"position":[[5,7]]},"137":{"position":[[3,7]]},"144":{"position":[[12,8]]},"215":{"position":[[118,7]]},"296":{"position":[[47,7]]},"330":{"position":[[0,7]]},"346":{"position":[[0,7]]}}}],["mopidi",{"_index":97,"t":{"270":{"position":[[0,6]]}}}],["mpd",{"_index":108,"t":{"278":{"position":[[21,3]]}}}],["mpri",{"_index":113,"t":{"292":{"position":[[0,5]]}}}],["ms",{"_index":107,"t":{"278":{"position":[[0,2]]},"302":{"position":[[92,2],[416,2]]},"326":{"position":[[0,2]]}}}],["ms'",{"_index":132,"t":{"302":{"position":[[330,4]]}}}],["multi",{"_index":22,"t":{"53":{"position":[[127,5]]},"67":{"position":[[127,5]]},"179":{"position":[[160,5]]},"203":{"position":[[13,5]]},"209":{"position":[[13,5]]},"215":{"position":[[98,5]]},"221":{"position":[[20,5]]},"235":{"position":[[20,5]]},"296":{"position":[[0,5]]},"350":{"position":[[0,5],[183,5]]},"552":{"position":[[44,5]]},"600":{"position":[[9,5]]},"617":{"position":[[9,5]]}}}],["music",{"_index":20,"t":{"53":{"position":[[87,5]]},"67":{"position":[[87,5]]},"144":{"position":[[32,5],[79,5]]},"215":{"position":[[150,5]]},"270":{"position":[[21,5],[56,5]]},"292":{"position":[[53,5]]},"330":{"position":[[39,5]]},"342":{"position":[[22,5],[180,5]]},"346":{"position":[[20,5]]}}}],["musicbrainz",{"_index":191,"t":{"458":{"position":[[25,11]]}}}],["musiccast",{"_index":152,"t":{"330":{"position":[[8,9]]}}}],["musikcub",{"_index":111,"t":{"282":{"position":[[16,9]]}}}],["navidrom",{"_index":148,"t":{"312":{"position":[[139,10]]}}}],["network/usb/cd",{"_index":154,"t":{"330":{"position":[[55,14]]}}}],["new",{"_index":47,"t":{"144":{"position":[[103,3]]},"578":{"position":[[13,3]]}}}],["non",{"_index":102,"t":{"270":{"position":[[85,3]]}}}],["note",{"_index":139,"t":{"306":{"position":[[30,4]]}}}],["now",{"_index":14,"t":{"53":{"position":[[20,3]]},"67":{"position":[[20,3]]}}}],["offici",{"_index":45,"t":{"144":{"position":[[64,8]]}}}],["open",{"_index":159,"t":{"334":{"position":[[44,4]]}}}],["oper",{"_index":116,"t":{"292":{"position":[[76,9]]}}}],["order",{"_index":78,"t":{"203":{"position":[[3,5]]},"209":{"position":[[3,5]]},"215":{"position":[[132,5]]},"282":{"position":[[3,5]]}}}],["outsid",{"_index":95,"t":{"221":{"position":[[61,7]]},"235":{"position":[[61,7]]}}}],["overview",{"_index":11,"t":{"47":{"position":[[15,8]]}}}],["pandora",{"_index":104,"t":{"270":{"position":[[114,8]]}}}],["pars",{"_index":186,"t":{"375":{"position":[[34,7]]},"392":{"position":[[31,7]]}}}],["phone/comput",{"_index":93,"t":{"215":{"position":[[78,14]]}}}],["play",{"_index":15,"t":{"53":{"position":[[24,7]]},"67":{"position":[[24,7]]},"215":{"position":[[160,5]]},"270":{"position":[[48,7]]},"296":{"position":[[81,8]]},"302":{"position":[[212,4],[287,4],[431,7]]},"330":{"position":[[45,6]]}}}],["player",{"_index":114,"t":{"292":{"position":[[59,7]]},"302":{"position":[[16,6]]}}}],["playlist/queu",{"_index":122,"t":{"302":{"position":[[72,14]]}}}],["plex",{"_index":136,"t":{"306":{"position":[[10,4],[79,4]]}}}],["port",{"_index":141,"t":{"306":{"position":[[50,4]]}}}],["posit",{"_index":56,"t":{"179":{"position":[[51,9]]}}}],["preferences/set",{"_index":160,"t":{"334":{"position":[[53,20]]}}}],["presenc",{"_index":19,"t":{"53":{"position":[[71,8]]},"67":{"position":[[71,8]]}}}],["profil",{"_index":39,"t":{"137":{"position":[[51,7]]}}}],["queue",{"_index":127,"t":{"302":{"position":[[191,5]]}}}],["re",{"_index":4,"t":{"43":{"position":[[15,2]]},"86":{"position":[[17,2]]},"96":{"position":[[17,2]]},"104":{"position":[[15,2]]},"111":{"position":[[17,2]]},"137":{"position":[[15,2]]}}}],["real",{"_index":171,"t":{"346":{"position":[[48,4]]}}}],["reduc",{"_index":58,"t":{"179":{"position":[[92,6]]}}}],["regex",{"_index":187,"t":{"392":{"position":[[25,5]]}}}],["releas",{"_index":206,"t":{"632":{"position":[[7,7]]}}}],["remov",{"_index":73,"t":{"189":{"position":[[125,6]]}}}],["replac",{"_index":177,"t":{"350":{"position":[[109,9]]}}}],["report",{"_index":53,"t":{"179":{"position":[[28,6]]},"302":{"position":[[266,6],[419,7]]}}}],["rich",{"_index":18,"t":{"53":{"position":[[66,4]]},"67":{"position":[[66,4]]}}}],["risk",{"_index":76,"t":{"189":{"position":[[211,5]]}}}],["rockski",{"_index":32,"t":{"104":{"position":[[41,7],[58,7]]},"286":{"position":[[0,7]]}}}],["run",{"_index":198,"t":{"552":{"position":[[31,7]]}}}],["scenario",{"_index":35,"t":{"115":{"position":[[7,9]]}}}],["scrobbl",{"_index":1,"t":{"32":{"position":[[0,8]]},"43":{"position":[[18,8]]},"86":{"position":[[20,8]]},"96":{"position":[[20,8]]},"104":{"position":[[18,8]]},"111":{"position":[[20,8]]},"115":{"position":[[45,9]]},"137":{"position":[[18,8]]},"144":{"position":[[93,9]]},"154":{"position":[[0,8]]},"179":{"position":[[132,8],[176,9]]},"215":{"position":[[141,8]]},"221":{"position":[[46,9]]},"235":{"position":[[46,9]]},"262":{"position":[[4,8]]},"302":{"position":[[346,8]]},"350":{"position":[[55,8]]},"375":{"position":[[10,9]]},"392":{"position":[[10,9]]},"458":{"position":[[10,9]]}}}],["scrobbler",{"_index":12,"t":{"53":{"position":[[5,9],[133,10]]},"67":{"position":[[5,9],[133,10]]},"179":{"position":[[166,9]]},"203":{"position":[[19,9]]},"209":{"position":[[19,9]]},"215":{"position":[[104,9]]},"221":{"position":[[26,9]]},"235":{"position":[[26,9]]},"296":{"position":[[6,9]]},"350":{"position":[[6,9]]},"552":{"position":[[50,9]]},"600":{"position":[[15,9]]},"617":{"position":[[15,9]]}}}],["scrobbler'",{"_index":183,"t":{"350":{"position":[[189,11]]}}}],["server",{"_index":28,"t":{"92":{"position":[[15,6]]},"203":{"position":[[74,6]]},"221":{"position":[[105,7]]},"235":{"position":[[110,7]]},"262":{"position":[[25,7]]},"270":{"position":[[27,6]]},"282":{"position":[[74,6]]}}}],["servic",{"_index":201,"t":{"570":{"position":[[19,7]]}}}],["set",{"_index":17,"t":{"53":{"position":[[49,3]]},"67":{"position":[[49,3]]}}}],["setup",{"_index":26,"t":{"92":{"position":[[0,5]]},"282":{"position":[[81,6]]}}}],["shorter",{"_index":128,"t":{"302":{"position":[[204,7]]}}}],["sink",{"_index":49,"t":{"169":{"position":[[8,4]]}}}],["solut",{"_index":36,"t":{"115":{"position":[[21,9]]}}}],["sono",{"_index":118,"t":{"296":{"position":[[28,5],[65,5]]}}}],["sourc",{"_index":9,"t":{"43":{"position":[[72,8]]},"86":{"position":[[90,8]]},"96":{"position":[[83,8]]},"104":{"position":[[66,8]]},"111":{"position":[[88,8]]},"137":{"position":[[76,8]]},"144":{"position":[[5,6]]},"154":{"position":[[9,7]]},"189":{"position":[[5,6],[192,6]]},"199":{"position":[[8,6]]},"219":{"position":[[6,8]]},"221":{"position":[[5,6]]},"235":{"position":[[5,6]]},"254":{"position":[[9,8]]},"258":{"position":[[13,8]]},"266":{"position":[[8,8]]},"270":{"position":[[98,7]]},"286":{"position":[[8,8]]},"312":{"position":[[5,6]]},"318":{"position":[[8,8]]},"578":{"position":[[17,6]]}}}],["spotifi",{"_index":120,"t":{"302":{"position":[[8,7],[47,7],[249,7],[360,7]]}}}],["standard",{"_index":101,"t":{"270":{"position":[[72,8],[89,8]]},"292":{"position":[[11,8]]}}}],["stop",{"_index":166,"t":{"342":{"position":[[120,4]]}}}],["string",{"_index":178,"t":{"350":{"position":[[119,7]]}}}],["subson",{"_index":144,"t":{"312":{"position":[[64,8]]}}}],["such",{"_index":103,"t":{"270":{"position":[[106,4]]},"312":{"position":[[117,5]]}}}],["support",{"_index":99,"t":{"270":{"position":[[39,8]]},"312":{"position":[[81,8]]},"342":{"position":[[50,9]]},"350":{"position":[[24,7]]}}}],["system",{"_index":117,"t":{"292":{"position":[[86,8]]},"296":{"position":[[71,6]]}}}],["tcp",{"_index":109,"t":{"278":{"position":[[35,3]]}}}],["teal.fm",{"_index":40,"t":{"137":{"position":[[68,7]]},"318":{"position":[[0,7]]}}}],["threshold",{"_index":60,"t":{"179":{"position":[[141,10]]}}}],["time",{"_index":74,"t":{"189":{"position":[[153,5]]},"302":{"position":[[217,4],[292,4]]},"342":{"position":[[140,4]]},"346":{"position":[[53,5]]},"350":{"position":[[174,5]]}}}],["titl",{"_index":179,"t":{"350":{"position":[[130,6]]}}}],["to",{"_index":71,"t":{"189":{"position":[[99,4]]}}}],["token",{"_index":137,"t":{"306":{"position":[[15,5]]}}}],["track",{"_index":54,"t":{"179":{"position":[[35,5]]},"302":{"position":[[130,5],[166,5]]}}}],["tunein",{"_index":106,"t":{"270":{"position":[[137,7]]}}}],["unoffici",{"_index":64,"t":{"189":{"position":[[17,10]]},"342":{"position":[[31,10]]}}}],["up",{"_index":197,"t":{"552":{"position":[[24,2]]}}}],["updat",{"_index":202,"t":{"600":{"position":[[0,8]]},"617":{"position":[[0,8]]}}}],["upgrad",{"_index":203,"t":{"619":{"position":[[0,9]]}}}],["url",{"_index":140,"t":{"306":{"position":[[42,3]]}}}],["us",{"_index":13,"t":{"53":{"position":[[15,4]]},"67":{"position":[[15,4]]},"179":{"position":[[126,5]]},"187":{"position":[[8,5]]},"189":{"position":[[12,4],[183,3]]},"215":{"position":[[36,5]]},"278":{"position":[[25,5]]},"282":{"position":[[12,3]]},"296":{"position":[[20,3]]},"302":{"position":[[55,4]]},"306":{"position":[[55,4]]},"312":{"position":[[19,4]]},"326":{"position":[[25,5]]},"510":{"position":[[8,6]]},"552":{"position":[[60,5]]}}}],["via",{"_index":44,"t":{"144":{"position":[[56,3]]}}}],["violat",{"_index":69,"t":{"189":{"position":[[77,9]]}}}],["vlc",{"_index":149,"t":{"326":{"position":[[21,3]]}}}],["web",{"_index":81,"t":{"203":{"position":[[70,3]]},"209":{"position":[[72,3]]},"326":{"position":[[35,3]]}}}],["webscrobbl",{"_index":157,"t":{"334":{"position":[[21,12]]}}}],["websocket",{"_index":112,"t":{"282":{"position":[[49,9]]}}}],["work",{"_index":167,"t":{"342":{"position":[[125,7],[186,5]]}}}],["yandex",{"_index":170,"t":{"346":{"position":[[13,6]]}}}],["yt",{"_index":161,"t":{"342":{"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 type. 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 config files but it will still create and use data files in the local or docker data directory. Use ENV-based configuration if... You are the only person for whom MS is scrobbling for or You have a very simple setup for MS such as one scrobble Client and one Source IE Jellyfin -> Koito, or You are not comfortable editing JSON files Config Example docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler environment: - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser - JELLYFIN_ID=myJellyin # ... # ... 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 -> See Config and Data Directories Docker -> /config (in the container) -- see the Storage tab in the Docker installation docs for how to configure this correctly Use File-based configuration if... You are comfortable editing JSON files You have more than one of the same type of Source/Client you want to use EX 2x Last.fm accounts, 3x Jellyfin accounts You want activity from specific Sources 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, more configuration is possible using File. AIO enables complete configuration. 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. These are the same examples you will find in the Configuration section of each Source/Client There is also a kitchensink example that provides examples of using all sources/clients in a complex configuration. Each config file is named after the type of the Client/Source. Within each file, a JSON array defines all of the instances for that type of Client/Source. Example directory structure: /CONFIG_DIR jellyfin.json lastfm.json koito.json Config Example jellyfin.json [ { \"name\": \"Foxx JF Server\", \"id\": \"foxxJf\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } } ] Multiple of Same Config Example jellyfin.json [ { \"name\": \"Foxx JF Server\", \"id\": \"foxxJf\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } }, { \"name\": \"Foo's JF Server\", \"id\": \"fooJf\", \"data\": { \"url\": \"http://192.168.0.150:8096\", \"user\": \"foo\", \"apiKey\": \"9c5bb56bd6540c756fbf481ebd9c5c40\" } } ] You can find an example of the file name that should be used under the File Configuration for each Source/Client. Note: this is the same value that is used for type in AIO configs. MS will parse an all-in-one configuration file (config.json) located in the directory specified by the CONFIG_DIR environmental variable. The file's location defaults to: Local installation -> See Config and Data Directories Docker -> /config/config.json (in the container) -- see the Storage tab in the Docker installation docs for how to configure this correctly Use AIO-based configuration if... ...All of the reasons listed in File You want to setup monitoring/webhooks, default settings for all Sources/Clients, or global config options You want to use Transformers (other than what is provided for Musicbrainz ENV) You want complete control over all potential MS configuration tip AIO config is the \"complete\" way to configure MS. All settings available in File/ENV are available in AIO and AIO has more exclusive settings. AIO enables configuring default settings for all Sources/Clients There is a kitchensink example that provides examples of using all sources/clients in a complex configuration. Use the Config Playground to explore the entire config schema with an editable example The example used can also be found in the repo directory at /config/config.json.example in the example below 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\": \"Cool Spotify Name\", \"id\": \"mySpotifyId\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\" } } ], \"clients\": [ { \"type\": \"maloja\", \"enable\": true, \"name\": \"Foxx Maloja\", \"id\": \"myMalojaId\", \"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 } } ] } Source/Client AIO Configs require a 'type' property Compared to their File equivalent, Sources/Clients configured using AIO require an additional type property. config.json { \"sources\": [ { \"name\": \"Foxx JF Server\", \"type: \"jellyfin\", \"id\": \"foxxJf\", \"data\": { \"url\": \"http://localhost:8096\", \"user\": \"FoxxMD\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } } ] } You can find an example of the required type value by referring to the AIO tab in each Source/Client's Configuration section example. This is the same value that is used as the name of individual File config files.","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":"Defines the URL that is used to generate default redirect URLs for authentication for services like 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":12,"t":"Multi-scrobbler implements caching to reduce external API calls and make some actions faster. A default in-memory cache store is used so that you always benefit from some caching. An optional, secondary store can be configured for greater caching capabilities. What is Cached? Auth Data Scrobble Transforms Transform API Calls Authentication sessions/tokens/etc... are cached for quicker requests and for persistence across restarts. The results of transform rules are cached so that if a scrobble with identical data (track/artists/album) is identified and it has the same set of transform rules then the cached transform results can be applied. 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. Auth Cache Configuration Auth caching defaults to a file that is stored in the DATA_DIR directory using the pre-defined file name ms-auth.cache. This provides automatic persistence across restarts for long-lived auth data/credentials if you have configured a persisted volume/bind mount for configuration (/config is mounted in docker compose). If you wish to use the secondary store for caching Auth you must explicitly configure it. This is because valkey can potentially be ephemeral if you do not provide a volume for its data directory. To explicitly configure auth to use the secondary store: ENV AIO compose.yaml services: multi-scrobbler: # ... environment: - CACHE_AUTH=valkey # ... config.json { \"cache\": { \"auth\": { \"provider\": \"valkey\" } }, // ... }","s":"Caching","u":"/multi-scrobbler/configuration/","h":"#caching","p":1},{"i":14,"t":"Using a secondary store enables: persistence of cached data across restarts a larger store (more data is saved) a longer time-to-live in the store (cached data is fetchable for a longer period) These benefits are particularly beneficial when using transforms like Musicbrainz and it is strongly recommended for these scenarios. Currently, Multi-scrobbler only supports Valkey, an open-source fork of Redis, as a secondary store. Adding Valkey container to multi-scrobbler A valkey container can be added to the multi-scrobbler docker compose stack: Named Volume Bind Mount docker-compose.yml services: multi-scrobbler: # ... valkey: image: valkey/valkey volumes: - valkeydata:/data volumes: valkeydata: driver: local docker-compose.yml services: multi-scrobbler: # ... valkey: image: valkey/valkey volumes: - ./valkeyData:/data 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 compose.yaml services: multi-scrobbler: # ... environment: - CACHE_VALKEY=redis://192.168.0.120:6379 # ... Example config.json { \"cache\": { \"valkey\": \"redis://192.168.0.120:6379\" }, // ... }","s":"Secondary Caching Store","u":"/multi-scrobbler/configuration/","h":"#secondary-caching","p":1},{"i":16,"t":"Multi-scrobbler depends on a SQLite database (ms.db) that is created on first run and stored in the CONFIG_DIR. When upgrading Multi-scrobbler version, if there are any required database changes than this database is automatically backed up and migrated. The database stores all Plays for your Sources/Clients as well as metadata and debugging information to help troubleshoot issues. Each Play is associated with a Source/Config in the database based on your configuration. You must set IDs for each Source/Client so that the database can identify these even when the configuration is changed.","s":"Database","u":"/multi-scrobbler/configuration/","h":"#database","p":1},{"i":18,"t":"How much storage does the database use? The amount of data stored for each Play can widely vary based on a few factors: how much data the Source service exposes how many clients each Source is scrobble to (Plays are duplicated for each Client a Source sends a scrobble to) if you are using any Transforms the diff of each step is stored, along with any external request/response data (like Musicbrainz queries) The MS repository contains a benchmark to measure an average database size in a few common scenarios. Minimal With Original Input All Debug Deta Assuming your Sources send a minimal amount of data or you have compacted all plays: Play Count DB Size 100 160kb 1000 1MB 10k 10.2MB Assuming your Sources have a non-trivial amount of input data (like Spotify or Listenbrainz) that is not compacted: Play Count DB Size 100 356kb 1000 3MB 10k 29.6MB Assuming your Sources/Clients: have a non-trivial amount of input data (like Spotify or Listenbrainz) and has many Transforms steps that include requests nothing is compacted Play Count DB Size 100 684kb 1000 6.28MB 10k 61.3MB A retention policy can be configured to delete Plays, or unused debug data, from the database after a certain amount of time. If no configuration is provided then a default policy is used that should be reasonable for most users. Compaction Deletion The Compaction Retention Policy is used to delete different types of debug data from your stored Plays. This is a useful way to reduce used storage space when you are not having problems with your Plays, or iterating on a configuration, that requires referencing all this extra data. There are two types of data that can be compacted (deleted from the Play): input - this is the untouched data retrieved by Multi-scrobbler, from a Source, and used to generate a Play/scrobble. This can be used to reconstruct and replay a Play, when used from troubleshooting or reporting an issue transform - this is all of the steps generated by transforms, the diff of the Play resulting from the step, and any request/responses used to complete the step Defaults When no Compact configuration is provided, Multi-scrobbler uses this policy: Compact (delete) input and transform data on all Plays after 3 days Configuring Compaction Policy​ Details Each value in the configuration properties below can be either a number of seconds EX 3600 = 10 minutes a unit of a common duration with the pattern X unit EX 30 minutes 5 hours 2 days ENV AIO COMPACT_PROPERTIES - which properties to compact RETENTION_COMPACT_AFTER - Default to use for all Plays RETENTION_COMPACT_COMPLETED_AFTER - Compact only completed Plays after... RETENTION_COMPACT_FAILED_AFTER - Compact only failed Plays after... RETENTION_COMPACT_DUPED_AFTER - Compact only duped/discard Plays after... Example # only delete input when compacting COMPACT_PROPERTIES=input # compact all plays after 3 days RETENTION_COMPACT_AFTER=3 days # specifically compact completed plays after 30 minutes RETENTION_COMPACT_COMPLETED_AFTER=30 minutes Compacting all Play types and deleting both input and transform: config.json { \"database\": { \"retention\": { \"compactAfter\": \"3 days\", \"compact\": [ \"input\", \"transform\" ] } } } Delete only input during compacting Compact all after 3 days except completed which compacts after 30 minutes config.json { \"database\": { \"retention\": { \"compactAfter\": { \"completed\": \"30 minutes\", \"duped\": \"3 days\", \"failed\": \"3 days\" }, \"compact\": [ \"input\" ] } } } The Deletion Retention Policy is used to delete different types of stored Plays from Multi-scrobbler database. This does not delete Plays from your Clients. It's only deleting the \"in-flight\" data MS used to create the scrobble that was eventually sent to your clients. Plays Should be Ephemeral Multi-Scrobbler is not designed to store Plays/Scrobbles indefinitely. It should scale fine for thousands of scrobbles but it not meant to store 10's of thousands of scrobbles forever. It is not a scrobbler server. You should set a reasonable deletion policy so that MS stores less than 1000 scrobbles at a time, ideally less. Defaults When no Deletion policy configuration is provided, Multi-scrobbler uses this policy: Delete all Plays after 7 days Configuring Deletion Policy​ Details Each value in the configuration properties below can be either a number of seconds EX 3600 = 10 minutes a unit of a common duration with the pattern X unit EX 30 minutes 5 hours 2 days ENV AIO RETENTION_DELETE_AFTER - Default to use for all Plays RETENTION_DELETE_COMPLETED_AFTER - Delete only completed Plays after... RETENTION_DELETE_FAILED_AFTER - Delete only failed Plays after... RETENTION_DELETE_DUPED_AFTER - Delete only duped/discard Plays after... Example # delete all plays after 3 days RETENTION_DELETE_AFTER=3 days # specifically, delete completed plays after 30 minutes RETENTIOND_DELETE_COMPLETED_AFTER=30 minutes Deleting all Play types after 3 days: config.json { \"database\": { \"retention\": { \"deleteAfter\": \"3 days\" } } } Delete all after 3 days except completed which are deleted after 30 minutes config.json { \"database\": { \"retention\": { \"deleteAfter\": { \"completed\": \"30 minutes\", \"duped\": \"3 days\", \"failed\": \"3 days\" }, } } }","s":"Retention","u":"/multi-scrobbler/configuration/","h":"#retention","p":1},{"i":20,"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":22,"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":25,"t":"A status page for monitoring the reachability of public services used by some Sources/Clients is available at https://status.multi-scrobbler.app This monitor runs on a VPS and checks the uptime of actual APIs for these services, not just landing pages. On a ~minute interval it checks: Listenbrainz API Musicbrainz API CoverArtArchive API Last.fm API A few MS-hosted support services","s":"Upstream Services Status","u":"/multi-scrobbler/configuration/","h":"#upstream-services-status","p":1},{"i":27,"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":29,"t":"An endpoint for monitoring the health of sources/clients is available at GET http://YourMultiScrobblerDomain/api/health Returns 200 OK when everything is working or 500 Internal Server Error if anything is not The plain url (/api/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 /api/health?type=spotify or /api/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 /api/health will return 500 if they are not authenticated For sources that poll (spotify, yt music, subsonic) /api/health will 500 if they are not polling","s":"Health Endpoint","u":"/multi-scrobbler/configuration/","h":"#health-endpoint","p":1},{"i":31,"t":"A Prometheus export endpoint is available at GET http://YourMultiScrobblerDomain/api/metrics It includes metrics for: Count of discovered plays per Source Count of Queued/Scrobbled/Deadletter scrobbles per Client Number of issues per Source/Client If any of these metrics is > 0 it means your Source/Client is not operating normally Caching metrics Additionally, general process metrics like cpu and memory usage can be enabled with the env PROMETHEUS_FULL=true Example Usage Update your Prometheus Configuration file (usually at /etc/prometheus.yml) to add a job to the scrape_configssection like this: scrape_configs: # # ...your other jobs are here # - job_name: multi-scrobbler scrape_interval: 30s metrics_path: '/api/metrics' static_configs: - targets: ['myMultiscrobblerIp:9078'] Grafana Dashboard Github user 4rft5 created a Grafana dashboard that uses the Prometheus metrics from above. Download the json dashboard here: multiscrobbler-dashboard.json","s":"Prometheus","u":"/multi-scrobbler/configuration/","h":"#prometheus","p":1},{"i":33,"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":32},{"i":35,"t":"Name Now Playing Discord ✅ Last.fm ✅ Libre.fm ✅ Listenbrainz ✅ Koito ✅ Maloja ❌ Rocksky ❌ Teal.fm ✅","s":"Clients","u":"/multi-scrobbler/configuration/clients/","h":"#clients","p":32},{"i":38,"t":"Before a Play is scrobbled to a client MS checks existing scrobbles from the Client's API to see if the Play has already been scrobbled. For each Play, MS fetches (cached) scrobbles from the Client in a time range inclusive of the Play's listening timestamp and then scores existing scrobbles against the Play based on: Similarity of Title, Artists, and Album Temporal closeness of the Play's timestamp to the existing scrobble's timestamp Whether MS detected the Play as a repeat (applicable to Sources that report realtime Player data) Detailed scoring breakdowns against each existing scrobble are logged at the TRACE logging level or in the debug data for a scrobble. See the Duplicate Scrobble Guidance page to learn how duplicates are detected and how you can ensure your configuration avoids possible duplicates.","s":"Duplicate Detection","u":"/multi-scrobbler/configuration/clients/","h":"#duplicate-detection","p":32},{"i":40,"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":32},{"i":42,"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":32},{"i":44,"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 For Koito versions <=0.1.7, you must have the environment variable KOITO_ALLOWED_HOSTS set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. koito.mydomain.com.","s":"Koito","u":"/multi-scrobbler/configuration/clients/koito/","h":"","p":43},{"i":46,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description KOITO_ID string A globally unique ID EX myComponentId KOITO_NAME string Value of KOITO_ID A vanity name EX My Cool Component KOITO_ENABLE boolean true Should this component be used? KOITO_URL string URL for the Koito server KOITO_TOKEN string User token for the user to scrobble for KOITO_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a koito type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a koito Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client koito configs will validate correctly in the editor but both source and client koito configs are allowed in the real CONFIG/koito.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a koito Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/koito.json [ { \"name\": \"Koito Client A\", \"id\": \"myKoitoClient\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the koito type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a koito Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a koito Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Koito Client A\", \"id\": \"myKoitoClient\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/koito/","h":"#configuration","p":43},{"i":48,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler. There are two types of Discord integrations to choose from:","s":"Discord","u":"/multi-scrobbler/configuration/clients/discord/","h":"","p":47},{"i":50,"t":"The App integration uses an existing Discord application on a desktop computer to set Rich Presence. Uses \"permitted\" access to Discord, no TOS issues More restricted customization compared to Headless Only active when your existing Discord application is open For most scenarios it requires additional, OS-specific steps to setup correctly May require an additional program on your machine to relay the Discord connection This is potentially insecure, or less secure, then Headless Can use discord in a container as an easy alternative This is a Headless-like experience App Docs","s":"App","u":"/multi-scrobbler/configuration/clients/discord/","h":"#app","p":47},{"i":52,"t":"The Headless integration uses Discord cloud Gateway/API, directly, to set Rich Presence. Does not require an existing Discord application (uses Discord cloud API) Using this Violates Discord TOS because it requires a user token More customization than App integration Active if any Discord application is online Headless Docs","s":"Headless","u":"/multi-scrobbler/configuration/clients/discord/","h":"#headless","p":47},{"i":54,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler. This integration is headless, it does not depend on any specific Discord application to be running. tip Check the main Discord docs page for a comparison between App and Headless. How MS Uses Discord API Multi-scrobbler does its utmost to implement, to-spec, Gateway API communication and respect usage. It requires no permissions and reads no data other than monitoring what other user sessions are active. Aside from the on-paper violation of using a user token programmatically (on your behalf), there is no misuse of the API to achieve rich presence. Additionally, MS uses the state of non-MS sessions to conservatively update presence. By default it will not conflict with any other official presence activities and is only used when you are actually active on a device. REQUIRED Interaction after Starting Multi-Scrobbler Every time multi-scrobbler is started a discord session update needs to be triggered so that MS can capture the signals it uses to determine if presence can be updated. This only needs to be once, after starting multi-scrobbler. But it does need to be every time multi-scrobbler is (re)started. Without these signals MS will not update presence. This session update can happen automatically after some time so you may not need to do anything. If you want to force the update then do one of the following: Open discord on a device it was not recently active on Exit discord on an active device Change your status (online, idle, etc...) Set a custom status Cause a presence update with a different app (listening to..., playing..., etc.)","s":"Discord (Headless)","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"","p":53},{"i":57,"t":"You must provide a Discord User Token for your account in order to authenticate with Discord. User Token usage violates Discord TOS This functionality requires you to use your own Discord User Token in a way that is against Discord's policies/terms of service. If you use this scrobbler you do so at your risk. There is no precedent for Discord punishing users who use their own token for non-abuse/spam reasons but there is also no guarantee this lack of enforcement will continue. Refer to the How MS Uses Discord API section above to gauge whether this risk is acceptable to you. User Token is a Sensitive Credential Treat your User Token like a login credential. Anyone who has your token can access Discord as you. When finding instructions for obtaining this token only run commands, or follow steps, that you can understand and trust. Do not run commands you do not understand. Never give your token to someone else. No instructions will be provided for obtaining a User Token because it is against Discord's policies to use it. Instead, you can search online for \"how to obtain discord user token\".","s":"User Token","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#user-token","p":53},{"i":60,"t":"MS uses several signals from your \"real\" Discord sessions to determine if it should update presence. The default configuration is conservative to ensure that MS does not conflict with other apps using presence. Additionally, it only updates if a \"real\" user device is active on discord. TLDR Without any additional configuration, MS will only update presence if: you have discord open on a real device your status is either: online, idle, or dnd (not invisible) no other apps are broadcasting listening activities (listening to spotify, etc...) Online Status​ Configure if MS is allowed to update presence based on your online status. If this setting is not defined MS will only update if your status is online, idle, or dnd. Allowed Values: online idle dnd invisible Example Only allow presence updating when all of your \"real\" sessions are either online or idle. In File/AIO: [ { \"name\": \"MS\", \"enable\": true, \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\", \"statusOverrideAllow\": [\"online\", \"idle\"] } } ] In ENV: DISCORD_STATUS_OVERRIDE_ALLOW=online,idle Other Listening Activities​ Without any additional configuration, MS will not set Rich Presence if other apps are broadcasting listening activities EX \"Listening to Spotify\". What about other activity types? Discord uses an undocumented activity type priority to determine what activity is shown \"first\" for your profile. The Listening activity type has the lowest priority. This means that if you start any other type of activity (streaming, watching, competing, etc...) it will take precedence over MS's listening activity. Your listening activity will still be visible by clicking into your full profile. Configure the names of other listening activities that MS is allowed to broadcast at the same time as. Example You want to allow MS to update presence even if Spotify is also broadcasting a listening activity. In File/AIO: [ { \"name\": \"MS\", \"enable\": true, \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\", \"listeningActivityAllow\": [\"spotify\"] } } ] In ENV: DISCORD_LISTENING_ACTIVITY_ALLOW=spotify","s":"Configure When Presence Is Used","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configure-when-presence-is-used","p":53},{"i":62,"t":"Creating a Discord App enables you to use custom album cover art and secondary status images for more links. Creating an App is free and simple, it is recommended you do this to get the most functionality from Rich Presence. Create An Application Go to the Discord Developer Portal Click on \"New Application\" and give it a name Copy the Application Id (Client Id) shown after creation Add this Id to your Multi-Scrobbler config Env Config => DISCORD_APPLICATION_ID=12345678 File Config => \"applicationId\": \"12345678\"","s":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#discord-application","p":53},{"i":64,"t":"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible. note If no Application Id is configured the status art will always be the Discord Default. The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below. Artwork URL Types​ External URLs Musicbrainz/Cover Art Achive MS Default Discord Default When Application Id is configured MS can use external URLs for artwork. External URLs that are not from known music services are disabled by default. This is to preserve your privacy because Discord does not host images, it only links to them and the URL is visible to other users. Why Should I Care? There are some scenarios where you may not want your artwork URLs to be visible, for example: A Source may be accessible only on your LAN (Jellyfin at http://192.168.0.101) A Source may be internet-facing but you do not want to expose this information to discord/other users A Source may be internet-facing but requires authentication to view the image MS will use your artwork URLs only if: artwork url is from a known music service/Cover Art Archive or artwork url starts with https and artwork (DISCORD_ARTWORK) is true => always uses the url a list of custom domains keywords an external artwork url should contain EX ENV => DISCORD_ARTWORK=mycdn,jellyfin File Config => \"artwork\": [\"mycdn\",\"jellyfin\"] Examples None of the below URLs will ever be used because they are not https http://foobar.com/cool.jpg <-- NOT allowed, not http http://192.168.0.112/fun.png <-- NOT allowed, not http When DISCORD_ARTWORK is not set: https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service https://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service https://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set https://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set Setting DISCORD_ARTWORK=true https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- allowed, is https https://anything.com/neat.jpg <-- allowed, is https Setting DISCORD_ARTWORK=mycdn,jellyfin https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- NOT allowed, is https but does not contain \"mycdn\" or \"jellyfin\" https://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains \"jellyfin\" When Application Id is configured MS can try to use Cover Art Archive to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you. MS will try to use Cover Art Archive if: The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an External URL condition and the scrobble data contains a Musicbrainz Release (Album) MBID Basically, if MS would normally use the MS Default art, it will first try to use Cover Art Archive if the scrobble has a Release MBID. Some Source, like Jellyfin and Plex, can automatically provide this ID if the music is \"matched\" in your library. For all others, you can configure MS to use the Musicbrainz Stage for Discord to try to get this MBID. When Application Id is configured and these conditions are true: Cannot use an External URL and Cannot get album art from Cover Art Archive and Play does not contain artwork information (no artwork shown in dashboard) The status artwork will use a default URL instead of your artwork URL. Without any other configuration, the default URL is an icon from the multi-scrobbler repository: This default image can be customized: ENV Config => DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png File Config => \"artworkDefaultUrl\": \"https://cooldomain.com/art.png\" Remember, this URL need to be accessible on the public internet. When Application Id is not configured Discord will show its own image. No custom artwork can be used in this configuration. This is also the image Discord will display if the artwork URL cannot be fetched.","s":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#artwork","p":53},{"i":66,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description DISCORD_ID string A globally unique ID EX myComponentId DISCORD_NAME string Value of DISCORD_ID A vanity name EX My Cool Component DISCORD_TOKEN string User Token acquired from an active Discord sessions DISCORD_APPLICATION_ID string Application ID used to display album art DISCORD_ARTWORK boolean A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains DISCORD_ARTWORK_DEFAULT_URL string or boolean A URL of an image to use as a fallback if the album art URL cannot be used. Or false to use discord's default. DISCORD_STATUS_OVERRIDE_ALLOW string online,idle,dnd A comma-separated list of statuses are allowed to have presence. DISCORD_LISTENING_ACTIVITY_ALLOW string A commera-seperated list of listening activity names MS is allowed to broadcast presence at the same time as. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a discord type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client discord configs will validate correctly in the editor but both source and client discord configs are allowed in the real CONFIG/discord.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/discord.json [ { \"name\": \"Discord\", \"enable\": true, \"id\": \"myDiscordRemote\", \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the discord type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Discord\", \"enable\": true, \"id\": \"myDiscordRemote\", \"data\": { \"token\": \"Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E\", \"applicationId\": \"8190211179716453570\" }, \"type\": \"discord\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-headless/","h":"#configuration","p":53},{"i":68,"t":"This scrobbler uses Now Playing functionality to set your Discord Rich Presence to the music you are currently monitoring with multi-scrobbler. This integration uses an existing Discord application to set your Rich Presence. tip Check the main Discord docs page for a comparison between App and Headless.","s":"Discord (App)","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":67},{"i":71,"t":"You must create a Discord App in order to use this integration. Creating an App is free and simple. Go to the Discord Developer Portal Click on \"New Application\" and give it a name Copy the Application Id (Client Id) shown after creation Add this Id to your Multi-Scrobbler config Env Config => DISCORD_APPLICATION_ID=12345678 File Config => \"applicationId\": \"12345678\"","s":"Discord Application","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-application","p":67},{"i":73,"t":"This integration uses an existing, running Discord application to communicate with Discord and set Rich Presence. Multi-scrobbler must be able to communicate with the Discord application, either by being on the same machine or over a network. Containerized Discord Native Discord Kasm Workspaces provides a self-hostable Discord container image. This image provides a desktop-like experience, through browser-based VNC, to use the official Discord application. This containerized approach can be used instead of configuring MS to use a Native Discord application on a specific machine. Advantages Setup is much simpler Discord runs in the same stack as multi-scrobbler Configuration is copy-paste. Skip all of the Discord Connection instructions. Get a Headless-like experience without needing to break Discord TOS Disadvantages Image only available for x86 arch Image and container are large (1GB+) Discord does not notify other clients of notifications in a channel if any client is viewing that channel. To avoid this, make sure your container discord instance is not viewing any server/channel/dm. Sometimes, Discord does not deliver \"notifications you missed\" to mobile because this depends on all clients being offline. Setup Setup is basically the same as using the instructions for Discord on Linux with MS on Same Host (Docker). 1. Add Discord Service to Multi-Scrobbler Docker Compose Stack Detailed Explanation Add the kasmweb/discord service to your compose stack Mount the directory containing Discord's unix socket to a named volume Configure MS to use Discord's unix socket Mount the unix socket volume into MS's container Add ENV DISCORD_IPC_LOCATIONS to point to the mounted volume Use this example docker-compose.yaml to modify your existing multi-scrobbler docker-compose.yaml: Example docker-compose.yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler:latest environment: # ... - DISCORD_APPLICATION_ID=12345678 # add below line - DISCORD_IPC_LOCATIONS=/run/discord-ipc-0 volumes: # ... # add below line - kasm_run:/run # ... # .. add discord service below kasmcord: container_name: kasmcord image: kasmweb/discord:1.14.0 ports: # VNC port to use in web browser - 6901:6901 shm_size: 512m environment: # set a password for VNC access VNC_PW: hunter2 XDG_RUNTIME_DIR: /run/user/1000 volumes: - kasm_run:/run/user/1000 - kasm_config:/home/kasm-user/.config user: \"0\" entrypoint: sh -c \"chmod 700 /run/user/1000 && chown -R kasm-user:kasm-user /run/user/1000 && chown -R kasm-user:kasm-user /home/kasm-user/.config && su kasm-user -c '/dockerstartup/kasm_default_profile.sh /dockerstartup/vnc_startup.sh /dockerstartup/kasm_startup.sh'\" volumes: kasm_run: name: kasm_run kasm_config: name: kasm_config Then re-deploy your stack. 2. Login to Discord Navigate in your browser to the IP/host Multi-Scrobbler/Discord are running on. Use the port set in the kasmcord service: # basic auth login # user: kasm_user # pass is what was set in env VNC_PW https://192.168.MY.HOST:6901 Login to Discord normally. After login is complete MS should connect automatically when a Now Playing event happens. If it does not or reports authentication failure then restart MS (but not Discord). If MS works then you are done and can move on to Optional Setup. Use this method if you want to connect MS to Discord running on a physical desktop. Local MS Installation Requires No Config If MS was installed locally (not Docker) on the same machine as the Discord application then MS should automatically detect the correct method and use it without any configuration from you. This will work for any OS. If MS cannot determine this automatically, follow the steps for your OS below. Follow the sections below to configure MS for your specific environment. Find IPC Connection​ Discord uses OS-specific methods to communicate with other applications on the same host, called IPC. You may need to determine some details about the IPC method in order for MS to communicate with it correctly. Discord on Linux Discord on MacOS Discord on Windows On Linux, Discord uses a Unix Socket for IPC. With Discord running, run this command: $ sudo netstat -apeen | grep discord unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0 We see that the path we need is: /run/user/1000/discord-ipc-0 On MacOS, Discord uses a Unix Socket for IPC. With Discord running, run this command: $ sudo netstat -apeen | grep discord unix 2 [ ACC ] STREAM LISTENING 11026149 1641787/Discord /home/foxx/.var/app/com.discordapp.Discord/cache/scoped_dirnnxNIn/SingletonSocket unix 2 [ ACC ] STREAM LISTENING 11036791 1642030/exe /run/user/1000/discord-ipc-0 We see that the path we need is: /run/user/1000/discord-ipc-0 Windows uses Named Pipes for IPC. These aren't easily iteratable without external software, like Pipetap. The syntax for a named pipe is like this: \\\\.\\pipe\\app_named_pipe_foo and Discord's names follow this pattern: \\\\.\\pipe\\discord-ipc-0 Where 0 increments for each different instance of Discord (official, canary, nightly, etc...). The default Discord pipe name is: discord-ipc-0 Pass IPC to Multi-Scrobbler​ After finding your IPC connection path you will need to make it accessible to Multi-Scrobbler. Discord on Linux Discord on MacOS Discord on Windows MS on Different Host MS on Same Host (Docker) MS on Same Host (Non-Docker) Insecure Communication This method of exposing Discord IPC is not secure. There is no authentication used for the traffic relayed to/from the opened TCP port. You should only use this method if you trust the network your machine is on. Additionally: Do use a firewall to limit source (IP) of incoming traffic to this TCP port Do not expose this port to the public internet Use socat to bidirectionally relay communication from Discord's unix socket to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login. $ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0 In your MS docker compose file add the host:port of the host running Discord/socat to DISCORD_IPC_LOCATIONS environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655 In your MS docker compose file, pass the path of Discord's unix socket as a volume and add this path to DISCORD_IPC_LOCATIONS in environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=/run/discord-ipc-0 volumes: - /run/user/1000/discord-ipc-0:/run/discord-ipc-0 No configuration is required. If MS does not automatically work for you then try the MS on Same Host (Docker) method using the DISCORD_IPC_LOCATIONS environment variable. MS on Different Host MS on Same Host (Docker) MS on Same Host (Non-Docker) Insecure Communication This method of exposing Discord IPC is not secure. There is no authentication used for the traffic relayed to/from the opened TCP port. You should only use this method if you trust the network your machine is on. Additionally: Do use a firewall to limit source (IP) of incoming traffic to this TCP port Do not expose this port to the public internet Use one of the methods below to setup socat on your macOS machine. socat installed natively Install socat using homebrew to use it as a native command on your host. Then, use socat to bidirectionally relay communication from Discord's unix socket to a listening TCP port on the same host. Likely, you will want to setup a service to start this command on login. $ socat -v TCP-LISTEN:6655,reuseaddr,fork UNIX-CONNECT:/run/user/1000/discord-ipc-0 socat in Docker Use the socat container in combination with the Discord unix socket found earlier: docker-compose.yaml services: socat: image: alpine/socat ports: - \"6655:6655\" volumes: - /run/user/1000/discord-ipc-0:/run/discord-ipc-0 command: - '-v' - 'TCP-LISTEN:6655,reuseaddr,fork' - 'UNIX-CONNECT:/run/discord-ipc-0' In your MS docker compose file add the host:port of the host running Discord/socat to DISCORD_IPC_LOCATIONS environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=192.168.DISCORD_HOST.IP:6655 In your MS docker compose file, pass the path of Discord's unix socket as a volume and add this path to DISCORD_IPC_LOCATIONS in environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=/discord-ipc-0 volumes: - /run/user/1000/discord-ipc-0:/run/discord-ipc-0 No configuration is required. If MS does not automatically work for you then try the MS on Same Host (Docker) method using the DISCORD_IPC_LOCATIONS environment variable. MS in Docker MS on Same Host (Non-Docker) note While it is possible to use named pipes directly in Docker this has not been tested and may only work for windows containers. If you are adventurous, try this out and if you can get it working please report your findings in an issue. warning This method is experimental and may be buggy and prone to crashes. If you are a Windows or Rust developer please consider helping improve the pipe proxy implementation. Insecure Communication This method of exposing Discord IPC is not secure. There is no authentication used for the traffic relayed to/from the opened TCP port. You should only use this method if you trust the network your machine is on. Additionally: Do use a firewall to limit source (IP) of incoming traffic to this TCP port Do not expose this port to the public internet Use pipeProxy to connect to the Discord named pipe and expose it on a TCP port. Download the latest pipeProxy.exe from the releases page. The host/ip should be the IP of the machine running discord. Run pipeProxy from the windows command line: pipeProxy.exe --pipe \"\\\\.\\pipe\\discord-ipc-0\" --tcp \"192.168.0.100:6655\" In your MS docker compose file add the host:port of the host running pipeProxy to DISCORD_IPC_LOCATIONS environment: docker-compose.yaml environment: # ... DISCORD_IPC_LOCATIONS=192.168.0.100:6655 No configuration is required. If MS does not automatically work for you then try the MS in Docker method using the DISCORD_IPC_LOCATIONS environment variable.","s":"Discord Connection","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#discord-connection","p":67},{"i":75,"t":"Setup is basically the same as using the instructions for Discord on Linux with MS on Same Host (Docker).","s":"Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":67},{"i":77,"t":"Detailed Explanation Add the kasmweb/discord service to your compose stack Mount the directory containing Discord's unix socket to a named volume Configure MS to use Discord's unix socket Mount the unix socket volume into MS's container Add ENV DISCORD_IPC_LOCATIONS to point to the mounted volume Use this example docker-compose.yaml to modify your existing multi-scrobbler docker-compose.yaml: Example docker-compose.yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler:latest environment: # ... - DISCORD_APPLICATION_ID=12345678 # add below line - DISCORD_IPC_LOCATIONS=/run/discord-ipc-0 volumes: # ... # add below line - kasm_run:/run # ... # .. add discord service below kasmcord: container_name: kasmcord image: kasmweb/discord:1.14.0 ports: # VNC port to use in web browser - 6901:6901 shm_size: 512m environment: # set a password for VNC access VNC_PW: hunter2 XDG_RUNTIME_DIR: /run/user/1000 volumes: - kasm_run:/run/user/1000 - kasm_config:/home/kasm-user/.config user: \"0\" entrypoint: sh -c \"chmod 700 /run/user/1000 && chown -R kasm-user:kasm-user /run/user/1000 && chown -R kasm-user:kasm-user /home/kasm-user/.config && su kasm-user -c '/dockerstartup/kasm_default_profile.sh /dockerstartup/vnc_startup.sh /dockerstartup/kasm_startup.sh'\" volumes: kasm_run: name: kasm_run kasm_config: name: kasm_config Then re-deploy your stack.","s":"1. Add Discord Service to Multi-Scrobbler Docker Compose Stack","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":67},{"i":79,"t":"Navigate in your browser to the IP/host Multi-Scrobbler/Discord are running on. Use the port set in the kasmcord service: # basic auth login # user: kasm_user # pass is what was set in env VNC_PW https://192.168.MY.HOST:6901 Login to Discord normally. After login is complete MS should connect automatically when a Now Playing event happens. If it does not or reports authentication failure then restart MS (but not Discord). If MS works then you are done and can move on to Optional Setup.","s":"2. Login to Discord","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"","p":67},{"i":81,"t":"note Due to the limitations of the Discord local API the other listening activity detection and online status customizations found in Headless are not available for the Local integration.","s":"Optional Setup","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#optional-setup","p":67},{"i":83,"t":"Multi-scrobbler can display Album Art in your Discord status. The image that is used differs based on if the image URL is publically accessible. The order in which multi-scrobbler determines what image to use is the same as the order of the tabs shown below. Artwork URL Types​ External URLs Musicbrainz/Cover Art Achive MS Default MS can use external URLs for artwork. External URLs that are not from known music services are disabled by default. This is to preserve your privacy because Discord does not host images, it only links to them and the URL is visible to other users. Why Should I Care? There are some scenarios where you may not want your artwork URLs to be visible, for example: A Source may be accessible only on your LAN (Jellyfin at http://192.168.0.101) A Source may be internet-facing but you do not want to expose this information to discord/other users A Source may be internet-facing but requires authentication to view the image MS will use your artwork URLs only if: artwork url is from a known music service/Cover Art Archive or artwork url starts with https and artwork (DISCORD_ARTWORK) is true => always uses the url a list of custom domains keywords an external artwork url should contain EX ENV => DISCORD_ARTWORK=mycdn,jellyfin File Config => \"artwork\": [\"mycdn\",\"jellyfin\"] Examples None of the below URLs will ever be used because they are not https http://foobar.com/cool.jpg <-- NOT allowed, not http http://192.168.0.112/fun.png <-- NOT allowed, not http When DISCORD_ARTWORK is not set: https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service https://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service https://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set https://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set Setting DISCORD_ARTWORK=true https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- allowed, is https https://anything.com/neat.jpg <-- allowed, is https Setting DISCORD_ARTWORK=mycdn,jellyfin https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- NOT allowed, is https but does not contain \"mycdn\" or \"jellyfin\" https://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains \"jellyfin\" MS can try to use Cover Art Archive to get album art. The URL it retrieves is public which means it acts like an External URL that is always available for you. MS will try to use Cover Art Archive if: The scrobble data does not contain an album art url (no art in dashboard) or the existing url has failed an External URL condition and the scrobble data contains a Musicbrainz Release (Album) MBID Basically, if MS would normally use the MS Default art, it will first try to use Cover Art Archive if the scrobble has a Release MBID. Some Source, like Jellyfin and Plex, can automatically provide this ID if the music is \"matched\" in your library. For all others, you can configure MS to use the Musicbrainz Stage for Discord to try to get this MBID. When these conditions are true: Cannot use an External URL and Cannot get album art from Cover Art Archive and Play does not contain artwork information (no artwork shown in dashboard) The status artwork will use a default URL instead of your artwork URL. Without any other configuration, the default URL is an icon from the multi-scrobbler repository: This default image can be customized: ENV Config => DISCORD_ARTWORK_DEFAULT_URL=https://cooldomain.com/art.png File Config => \"artworkDefaultUrl\": \"https://cooldomain.com/art.png\" Remember, this URL need to be accessible on the public internet.","s":"Artwork","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#artwork","p":67},{"i":85,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description DISCORD_ID string A globally unique ID EX myComponentId DISCORD_NAME string Value of DISCORD_ID A vanity name EX My Cool Component DISCORD_APPLICATION_ID string Application ID DISCORD_IPC_LOCATIONS string A commera-separated list of host:port network locations or file paths to unix socket for Discord DISCORD_ARTWORK boolean A boolean indicating if external artwork URLs should be used. Or a comma-separated list of allowed domains DISCORD_ARTWORK_DEFAULT_URL string or boolean A URL of an image to use as a fallback if the album art URL cannot be used. Or false to use discord's default. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a discord type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client discord configs will validate correctly in the editor but both source and client discord configs are allowed in the real CONFIG/discord.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a discord Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/discord.json [ { \"name\": \"Desktop\", \"enable\": true, \"id\": \"myDiscordLocal\", \"data\": { \"applicationId\": \"8190211179716453570\", \"ipcLocations\": [ \"192.168.0.105:6655\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the discord type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a discord Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Desktop\", \"enable\": true, \"id\": \"myDiscordLocal\", \"data\": { \"applicationId\": \"8190211179716453570\", \"ipcLocations\": [ \"192.168.0.105:6655\" ] }, \"type\": \"discord\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/discord/discord-app/","h":"#configuration","p":67},{"i":87,"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) Limits for Old Scrobbles Last.fm will not accept scrobbles that are timestamped as older than 2 weeks from the current time. This is not officially documented but has been confirmed by multiple people/mods in the last.fm support forums: [1] [2] [3] Multi-scrobbler can queue scrobbles for you if the Last.fm service is unavailable, or if there is an issue with a specific scrobble. However, you are responsible for making sure these scrobbles are eventually sent to Last.fm (by retrying in the UI or retarting Last.fm client in UI) before the two week window has passed or else they will not be scrobblable at all unless the timestamp is changed. A future update to Multi-scrobbler will enable editing of unsent scrobble data and modifying the timestamp from the UI. If you have issues with specific scrobbles not being sent and retries/restarts do not fix it, please make sure to create a new issue in a timely manner so that it can be resolved before the window has passed. 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":86},{"i":89,"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":86},{"i":91,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LASTFM_ID string A globally unique ID EX myComponentId LASTFM_NAME string Value of LASTFM_ID A vanity name EX My Cool Component LASTFM_ENABLE boolean true Should this component be used? LASTFM_API_KEY string API Key generated from Last.fm/Libre.fm account LASTFM_SECRET string Secret generated from Last.fm/Libre.fm account LASTFM_REDIRECT_URI string http://localhost:9078/lastfm/callback Optional URI to use for callback. LASTFM_SESSION string Optional session id returned from a completed auth flow Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a lastfm type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a lastfm Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client lastfm configs will validate correctly in the editor but both source and client lastfm configs are allowed in the real CONFIG/lastfm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a lastfm Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/lastfm.json [ { \"name\": \"Foxx LFM Client\", \"id\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the lastfm type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Foxx LFM Client\", \"id\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/lastfm/","h":"#configuration","p":86},{"i":93,"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":92},{"i":95,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MALOJA_ID string A globally unique ID EX myComponentId MALOJA_NAME string Value of MALOJA_ID A vanity name EX My Cool Component MALOJA_ENABLE boolean true Should this component be used? MALOJA_URL string URL for maloja server MALOJA_API_KEY string API Key for Maloja server Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a maloja type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a maloja Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client maloja configs will validate correctly in the editor but both source and client maloja configs are allowed in the real CONFIG/maloja.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a maloja Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/maloja.json [ { \"name\": \"Maloja Client\", \"id\": \"myMalojaClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the maloja type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Maloja Client\", \"id\": \"myMalojaClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/maloja/","h":"#configuration","p":92},{"i":97,"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 website you will need an account. Or, you can run your own GNU FM instance using the source code. No API account, API Key, or Secret is currently 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":96},{"i":99,"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":96},{"i":101,"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":96},{"i":103,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LIBREFM_ID string A globally unique ID EX myComponentId LIBREFM_NAME string Value of LIBREFM_ID A vanity name EX My Cool Component LIBREFM_ENABLE boolean true Should this component be used? LIBREFM_API_KEY string Optional Secret for Libre.fm account LIBREFM_SECRET string Optional Secret for Libre.fm account LIBREFM_REDIRECT_URI string http://localhost:9078/librefm/callback Optional URI to use for callback. LIBREFM_SESSION string Optional session id returned from a completed auth flow LIBREFM_URLBASE string https://libre.fm/2.0/ (Optional) The host and path prefix for your Libre.fm instance Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a librefm type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a librefm Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client librefm configs will validate correctly in the editor but both source and client librefm configs are allowed in the real CONFIG/librefm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a librefm Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/librefm.json [ { \"name\": \"Foxx Libre Client\", \"id\": \"myLibreFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the librefm type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Foxx Libre Client\", \"id\": \"myLibreFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" }, \"type\": \"librefm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/librefm/","h":"#configuration","p":96},{"i":105,"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 and your your Atmosphere Account. How does that work? Your Atmosphere Account consists of social data (it's just JSON) stored in a personal repository on a PDS (Personal Data Server), all of which is standardized under the AT Protocol. The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by indpendent entities so your data and experience not locked behind a walled garden. Although each layer can be implemented separately (you can self-host everything!), it is normally a simple process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a Bluesky, but there are other public account providers. When Multi-Scrobbler uses the AT Protocol... multi-scrobbler \"scrobbles\" (writes) 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 their 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":104},{"i":107,"t":"You will need an Atmosphere Account to use Rocksky. Navigate to rocksky.app and sign up/logn using your Atmosphere Account Then, navigate to the Access Tokens in the Rocksky settings dropdown, and create a new token","s":"Setup","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#setup","p":104},{"i":110,"t":"The handle used with multi-scrobbler should be your full Atmosphere Account 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. API Applications Deprecated In < 0.14.1, Multi-Scrobber used Rocksky's API Appication \"API Key\" for communication with a Listenbrainz-compatible API from Rocksky. Going forward, this should be replaced with the official guidance in the Setup section above: use an Access Token. This uses the native Rocksky API which has more functionality. If your configuration is using either (File/AIO) 'key': ... (ENV) ROCKSKY_KEY you should redo the Setup section and modify your configuration to use an Access Token instead. Keys are now deprecated and functionality for them will be removed in a future version of Multi-Scrobbler. ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description ROCKSKY_ID string A globally unique ID EX myComponentId ROCKSKY_NAME string Value of ROCKSKY_ID A vanity name EX My Cool Component ROCKSKY_ENABLE boolean true Should this component be used? ROCKSKY_KEY string API Key generated from API Applications in Rocksky for your account ROCKSKY_TOKEN string Access Token generated from https://rocksky.app/access-tokens in Rocksky for your account ROCKSKY_HANDLE string The fully-qualified handle for your ATPRoto/Bluesky account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a rocksky type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a rocksky Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client rocksky configs will validate correctly in the editor but both source and client rocksky configs are allowed in the real CONFIG/rocksky.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a rocksky Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/rocksky.json [ { \"id\": \"myRockskyClient\", \"name\": \"FoxxMD Rocksky Client\", \"configureAs\": \"client\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the rocksky type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"id\": \"myRockskyClient\", \"name\": \"FoxxMD Rocksky Client\", \"configureAs\": \"client\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] }","s":"Handle","u":"/multi-scrobbler/configuration/clients/rocksky/","h":"#handle","p":104},{"i":112,"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":111},{"i":114,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LZ_ID string A globally unique ID EX myComponentId LZ_NAME string Value of LZ_ID A vanity name EX My Cool Component LZ_ENABLE boolean true Should this component be used? LZ_URL string https://api.listenbrainz.org/ URL for the ListenBrainz server, if not using the default LZ_TOKEN string User token for the user to scrobble for LZ_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a listenbrainz type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a listenbrainz Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client listenbrainz configs will validate correctly in the editor but both source and client listenbrainz configs are allowed in the real CONFIG/listenbrainz.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a listenbrainz Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/listenbrainz.json [ { \"name\": \"Foxx LZ Client\", \"id\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the listenbrainz type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"name\": \"Foxx LZ Client\", \"id\": \"brainzClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/clients/listenbrainz/","h":"#configuration","p":111},{"i":116,"t":"Multi-scrobbler's flexibility in configuration allows you to build some complex pipelines for scrobbling but it can also be a footgun for duplicating scrobbles.","s":"Duplicate Scrobble Guidance","u":"/multi-scrobbler/configuration/duplicates/","h":"","p":115},{"i":118,"t":"Multi-scrobbler uses multiple techniques for evaluating the similarity of text in scrobbles against existing data. These techniques are used on all text from a scrobble (title, artist, album...): Character and string normalization Symbols and multiple whitespaces are removed. All characters are converted to lowercase. Non ascii characters are converted to their ascii counterparts. this string! is the. same => this string is the same this string is the same => this string is the same ThIs STRING iS THe SAMe => this string is the same Dina Ögon => Dina Ogon Nanã => Nana Word-order invariant text similarity Strings with multiple words (tokens) are re-arranged so that tokens are ordered to be as close to other, similar tokens are possible: Example 1 String A: there change is => there change is String B: there is change => there change is Example 2 String A: you, doin hwat are => you doin hwat are String B: what are you doing => you doing what are Then, the strings are independently compared using Levenshtein Distance and Dice's Coefficient. The algorithm that gives the highest score for similarity is used so that matching is aggressive. For Artists, Multi-scrobbler attempts to extract unique Artists from common patterns in single-string artist values and track titles. Matching Common Artist Patterns Common joiners and patterns are detected in artist/track strings and the artists are extracted. Example of common joiners are: ft. feat vs. etc... Example 1 Melendi, Ryan Lewis, The Righteous Brothers (featuring Joan Jett & The Blackhearts, Robin Schulz) becomes Melendi, Ryan Lewis, The Righteous Brothers, Joan Jett, The Blackhearts, Robin Schulz Example 2 Childish Gambino - 12.38 (feat. 21 Savage, Ink & Kadhja Bonet) becomes Childish Gambino, 21 Savage, Ink, Kadhja Bonet - 12.38 note MS uses \"smart\" heuristics to prevent artists with actual punctuation (Tyler, The Creator) from accidentally being separated The extraction examples above are done only for matching other scrobble data (which is also parsed like the above), the resulting scrobble data is never transformed unless the user explicitly configures it via a native transform The timestamps for Scrobbles are compared at different levels of granularity based on where they originate from. Temporally Comparing Scrobbles Timestamp closeness for two scrobbles can be classified in one of these states: Exact Timestamps differ by 1 seconds or less. Close Timestamps differ by less than the known granularity of the Source they are from. For most Sources (and all Clients) this is 10 seconds or less. For some sources (subsonic) the granularity is 60 seconds because they only report \"now playing\" changes every 60 seconds. During If the Play was monitoring in real-time by Multi-scrobbler then it knows the time range during which the Play was listened to. If an existing scrobble with similar artist/track/album has a timestamp that occurred during the known listening time then it is classified as during. Fuzzy If the timestamp occurs within a few seconds +/- of (existing scrobble + track duration) then, potentially, the Source timestamped the existing scrobble at the end of when the user listened to it, rather than when the user started listening to it. This is common for Spotify plays. Each of the above classification results in a different score that is roughly descending from the order given above. Exact score is based on the Souce of the scrobble and if it was monitored in real-time by Multi-Scrobbler. Finally, all of the above comparison/normalization techniques are combined when comparing a \"new\" Play/Scrobble against existing data. Each comparison is given a weighted score. If the score is above the match threshold then it is marked as a duplicated. Match Scoring Example Frédéric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 <-- New scrobble Frédéric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 <-- Existing scrobble from client After comparing against all existing scrobbles from the client, in a timerange around the new scrobble, MS finds a match and logs the match along with the score breakdown of the consistuent parts: Source: Frédéric Chopin - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:51-04:00 (S) Closest Scrobble: Frédéric Chopin / Krystian Zimerman - Ballade No. 4 in F Minor, Op. 52 @ 2026-05-04T13:01:48-04:00 (S) Artist: (0.30 + Whole Match Bonus 0.52) * (0.3 + Whole Match Bonus 0.05) = 0.29 Title: 1.00 * 0.4 = 0.40 Time: (Close) 1 * 0.5 = 0.50 Time Detail => Existing: 13:01:48-04:00 - Candidate: 13:01:51-04:00 | Temporal Sameness: Close | Play Diff: 3s (Needed <10s) | Range Comparison N/A Score 1.19 => Matched! All of the above techniques and scoring gives Multi-scrobbler a very good chance of detecting duplicate scrobbles, regardless of where they were originally from. Of Multi-Scrobbler's 400+ unit tests, 70+ are related to testing scoring, artist extraction, and fuzzing string normalization/simiarlity. The dupe detection is so good that it is virtually gauranteed for most configurations and is used for backlogging missed scrobbles for Sources that support fetching history. However, it's not possible to gaurantee this for all possible Multi-scrobbler configurations. See the below sections to learn more.","s":"How Duplicates Are Detected","u":"/multi-scrobbler/configuration/duplicates/","h":"#how-duplicates-are-detected","p":115},{"i":120,"t":"Any Source/Client configuration where there is only one Source and one Client and they are not the same service/account Any Source/Client configuration where scrobbles only flow in one direction IE you do not have a Last.fm Client Account A that is also a Last.fm Source Account A tip The majority of simple Multi-scrobbler configurations fall into these categories. If your workflow is straightforward you do not need to worry about duplicates at all. Multi-scrobbler can handle recieving the same data from a Source multiple times. This is fine because the data is always the same and always unique to each Source. Since MS scrobbled the data to your clients you can be pretty confident that the same cleanup/matching process for that data will result in an indentical/similar match to the existing scrobble. IE Same inputs in -> same inputs out. Even this scenario with multiple, mixed Sources is OK: Because the scrobbles coming from each Source are independent of each other. And they end up in Clients that are not also used as Sources. tip This is a common scenario when scrobbles are backlogged from a Source IE on startup MS fetches the last 50 Plays from Spotify/Lastfm/Listenbrainz.","s":"Configurations Where Duplicates DO NOT Occur","u":"/multi-scrobbler/configuration/duplicates/","h":"#valid-configs","p":115},{"i":123,"t":"In this scenario your device using Spotify is configured in MS as a Spotify Source but it also is scrobbling to Last.fm (via Pano Scrobbler, as an example). ❌ Time Race Condition: Potentially, the scrobbles arrive in Multi-scrobbler at exactly the same time. There are no existing scrobbles in Koito to check against, yet. So Multi-scrobbler scrobbles both to Koito, resulting in duplicate scrobbles. ❌ Different Scrobble Data: Pano Scrobbler, or Last.fm, may modify the scrobble data. When MS recieves the scrobble from Last.fm it may be just different enough that it does not get detected as a duplicate.","s":"Upstream Scrobbles Sent to Multiple Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#upstream-scrobbles-sent-to-multiple-sources","p":115},{"i":125,"t":"In this scenario, you have a Client that is also a Source and that Source is feeding scrobbles to a different Client that receives scrobbles from everywhere (or has some overlap with the original Client). ❌ Different Scrobble Data: Last.fm may modify the scrobble data. When MS recieves the scrobble from Last.fm it may be just different enough that it does not get detected as a duplicate. ❌ Consistency Issues: If the Koito Client has a backed up queue or is not currently scrobbling (imagine it was Last.fm or Listenbrainz, and they had upstream availability issues), then there is no existing scrobble yet and nothing to match against.","s":"Sources and Clients are Dependent","u":"/multi-scrobbler/configuration/duplicates/","h":"#dependent-source-client","p":115},{"i":128,"t":"Use a configuration mentioned in Configurations Where Duplicates DO NOT Occur: make sure all of your Sources are independent. The activity/scrobbles from each Source do not have any upstream duplicates of activity.","s":"Independent Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#independent-sources","p":115},{"i":130,"t":"Imagine you have a scenario where a device/player can only scrobble to Last.fm. But you want to use MS for all other devices/sources and still have all your scrobbles end up in your \"main\" Last.fm account for social reasons/stats. Instead of using the same Last.fm account for all activity and potentially having dependent client/sources, create an additional last.fm account that is used only for the device that needs it. This ensures the scrobbles from that device are isolated from the main account and do not prevent duplicates, so you can continue to use the main account as an MS Client:","s":"Alternative Sources","u":"/multi-scrobbler/configuration/duplicates/","h":"#alternative-sources","p":115},{"i":132,"t":"In Multi-scrobbler, by default, all Sources scrobble to all Clients. Using Limit Scrobble Destinations configuration can ensure that your dependent Source/Clients only scrobble to destinations where the scrobbles won't be duplicated. And/or limit other Sources to not scrobble to dependent Sources/Clients. Here is an example where all Sources only scrobble to a dependent Last.fm Client, and then the dependent Last.fm Source only scrobbles to a \"mirror-only\" (backup) Koito Client:","s":"Mirror-Only Clients or Limiting Scrobble Destination","u":"/multi-scrobbler/configuration/duplicates/","h":"#isolated-sources","p":115},{"i":134,"t":"If using one of the above solutions is not possible you can also try to aggressively normalize all scrobble data using the Musicbrainz transform stage. In this scenario you still have dependent Source/Clients that are not isolated but you can potentially improve duplicate detection by first using a transform stage to match scrobbles against the Musibrainz database and normalize their track/artist/album data. warning There is no gaurantee this will work but it is better than nothing. You should attempt to re-configure MS to use any of the other solutions before using this one.","s":"Normalize All Scrobbles","u":"/multi-scrobbler/configuration/duplicates/","h":"#normalize-all-scrobbles","p":115},{"i":136,"t":"Last.fm will happily accept almost any scrobble data you throw at it. It can then decide, opaquely, to match or modify that scrobble to some more \"official\" data it has server-side. This could be modifying the artists, title, or album sent in the scrobble. It can also mean modifying the mbid (unique identifier) or adding what it thinks is the correct one. There is nothing in the scrobble history API response from Last.fm that identifies it has done any of this. And it's not super great at being right about these modifications. What this means for you, the user, is that this is very plausible scenario: You scrobble Artist Foo, Artist Bar - My Cool Track to Last.fm via Pano Scrobbler (outside of Multi-scrobbler) Last.fm modifies the data to The Artist Foo - My Cool Track ft. Artist Bar (Album Version) You also scrobble Artist Foo, Artist Bar - My Cool Track to Multi-scrobbler via Pano LFM endpoint Source MS forwards this to Koito Client as-is Soon after, MS polls your Last.fm Source for new scrobbles and finds The Artist Foo - My Cool Track ft. Artist Bar (Album Version) It queries Koito to see if this was scrobbled It sees that a scrobble did happen at almost the same time BUT the track titles and artist strings are just different enough that it decides it's not a duplicate MS forwards the scrobble to Koito and you now have a duplicate This behavior is unique to Last.fm. It's truly the worst out of all the scrobbler services in terms of preserving your data as-is, or providing a unqiue identifier for your data.","s":"The Last.fm Problem","u":"/multi-scrobbler/configuration/duplicates/","h":"#lastfm","p":115},{"i":138,"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 browsing app for scrobbles stored in your Atmosphere Account. How does that work? Your Atmosphere Account consists of social data (it's just JSON) stored in a personal repository on a PDS (Personal Data Server), all of which is standardized under the AT Protocol. The AT Protocol defines how your data is stored, how you authenticate to write to it, and how indpendent apps share and consume it. Critically, each layer (data storage, app, communication) of the AT Protocol can be operated by indpendent entities so your data and experience not locked behind a walled garden. Although each layer can be implemented separately (you can self-host everything!), it is normally a simple process for an end-user to create and start using an Atmosphere Account as many apps can do everything for you. The most common example being a Bluesky, but there are other public account providers. When Multi-Scrobbler uses the AT Protocol... multi-scrobbler \"scrobbles\" (writes) 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 their 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 true production website, yet. To view your teal.fm scrobble data you can: use teal-relay-production.up.railway.app or teal-slice.wisp.place for a preview of teal.fm use yearinmusic.teal.fm or wrapped.baileytownsend.dev for wrapped-style stats of your teal.fm scrobbles use atproto.at to view the raw data (convenience URLs are generated in multi-scrobbler, per scrobble, for you to do this)","s":"Teal.fm","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"","p":137},{"i":140,"t":"note Multi-scrobbler will work with any Atmosphere Account, not just Bluesky. See Configuration below for provider-agnostic config. 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":137},{"i":143,"t":"The ATProto identifier used with multi-scrobbler should be either: A valid DID, starting with did:plc:... or did:web:... Your full Atmosphere Account 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 Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description TEALFM_ID string A globally unique ID EX myComponentId TEALFM_NAME string Value of TEALFM_ID A vanity name EX My Cool Component TEALFM_ENABLE boolean true Should this component be used? TEALFM_IDENTIFIER string Identify the account to login as TEALFM_APP_PW string The App Password you created for your account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a tealfm type Client with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a tealfm Client File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only client tealfm configs will validate correctly in the editor but both source and client tealfm configs are allowed in the real CONFIG/tealfm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a tealfm Client File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/tealfm.json [ { \"id\": \"myTealClient\", \"name\": \"Foxx Teal Client\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the tealfm type from the respective clients node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Client that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Client that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"clients\": [ { \"id\": \"myTealClient\", \"name\": \"Foxx Teal Client\", \"configureAs\": \"client\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\" }, \"type\": \"tealfm\" } ] }","s":"Identifier","u":"/multi-scrobbler/configuration/clients/tealfm/","h":"#identifier","p":137},{"i":145,"t":"This Source monitors your Apple Music listening history via the official Apple Music API and scrobbles new activity to your configured Clients. Because of how the Apple Music API works, Multi-Scrobbler (MS) requires two different tokens to function: a Media User Token (identifies your personal account) and an Authentication Token (authorizes API access).","s":"Apple Music","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"","p":144},{"i":147,"t":"The mediaUserToken is required to access your recently played history. You can extract it directly from the Apple Music web app: Visit music.apple.com in your browser and log in. Open your browser's Developer Tools (usually F12 or ⌘ + ⌥ + I). Navigate to the Application tab (Chrome/Edge) or Storage tab (Safari/Firefox). Expand Cookies in the left sidebar and select https://music.apple.com. Find the cookie named media-user-token and copy its value (it typically starts with 0.). Token Expiry The mediaUserToken will eventually expire. If Multi-Scrobbler begins throwing authentication errors in the logs, simply repeat these steps to obtain and configure a fresh token.","s":"1. Getting a Media User Token","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#1-getting-a-media-user-token","p":144},{"i":149,"t":"To authorize API access, Multi-Scrobbler requires an Authentication Token (JWT). Because the official Apple Music API is designed for developers, there are two ways to provide this token depending on your situation: Browser Token (Free & Most Common): Best for 99% of users. You can easily extract a temporary token from the Apple Music web player without needing an Apple Developer account. MusicKit Key (Requires Paid Apple Developer Account): If you happen to be enrolled in the paid Apple Developer Program ($99/year), you can provide a private key to automatically generate permanent tokens. Choose your preferred method below: Browser Token (Free) MusicKit Key (Paid Account) Since most users don't have a paid developer account, extracting the token from the web player is the standard approach. Behind the scenes, the Apple Music website makes a lot of background requests, which can make finding the right token confusing. To filter out the noise and grab the exact token we need, follow the steps for your browser below: Chrome, Edge & Firefox Visit music.apple.com and log in. Open Developer Tools (F12 or Ctrl+Shift+I / ⌘ + ⌥ + I) and navigate to the Network tab. In the filter box at the top left, paste exactly: https://amp-api.music.apple.com/v1/me/account (Label 1). Click the Fetch/XHR filter button to hide irrelevant requests (Label 2). Reload the page (Label 3). Under the \"Name\" column, click the request starting with account?meta= (Label 4). In the panel that opens, scroll down to the Request Headers section. Find the authorization header. Copy the long string of text after the Bearer prefix (Label 5). Safari Before you can extract the token in Safari, you must enable developer tools. Open Safari Settings (⌘ + ,), navigate to the Advanced tab, and check \"Show features for web developers\" at the very bottom. Visit music.apple.com and log in. Open the Web Inspector (⌘+⌥+I or Develop > Show Web Inspector) and navigate to the Network tab. In the filter bar on the left side of the inspector, paste exactly: https://amp-api.music.apple.com/v1/me/account (Label 1). Reload the page (Label 2). Click the account request that appears in the Name list (Label 3). In the details sidebar, look under the Request section for the Authorization header. Copy the long string of text after the Bearer prefix (Label 4). Once you have your token, add it to your configuration file along with the origin header: applemusic.json { \"data\": { \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsIm...\", \"mediaUserToken\": \"your-media-user-token-here\", \"origin\": \"https://music.apple.com\" } } Origin Header Required When using a JWT extracted from the browser, Apple requires the request to match the domain it was issued to. You must include the origin field in your config as shown above. Note: Browser-generated JWTs are valid for a maximum of 35 days and must be updated manually when they expire. Apple Developer Account Required To generate JWTs automatically, you must be enrolled in the paid Apple Developer Program ($99/year) and create a MusicKit key. If you don't have an account, use the Browser Token (Free) tab instead. To generate JWTs automatically and avoid manual token refreshes, you need an Apple Music API key: Go to the Apple Developer portal and create a MusicKit key. Download the .p8 file — this is your private key. Note your Key ID and Team ID (found in your Apple Developer account Membership details). Add these details to your config: applemusic.json { \"data\": { \"key\": { \"id\": \"2HPSNJZ88N\", \"teamId\": \"SN6YASW8G4\", \"p8\": \"-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----\" }, \"mediaUserToken\": \"your-media-user-token-here\" } } tip When pasting the contents of your .p8 file into JSON, make sure to replace physical line breaks with \\n so it remains a valid, single-line JSON string.","s":"2. Authentication","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#2-authentication","p":144},{"i":151,"t":"Timestamp Estimation​ The Apple Music API does not provide timestamps for when tracks were played. Multi-Scrobbler estimates play times by taking the current time and subtracting track durations backwards: The most recent track is assumed to have finished playing now. Each older track is estimated to have played duration seconds before the previous one. For the most accurate scrobble timestamps, it is highly recommended to keep the polling interval (APPLEMUSIC_INTERVAL) low (the default is 60 seconds). Duplicate Play Recovery​ The Apple Music history API strictly deduplicates tracks. Instead of showing the same song multiple times in a row, it simply bumps the re-played track back to the #1 spot and removes the older entry. For example, if you listen to Song A → Song B, your history is [Song B, Song A]. If you then listen to Song A again, the API returns [Song A, Song B] (Song A was bumped to the top). If Multi-Scrobbler polled when the top track was Song A, and polls again after it's bumped back to the top, the top track appears functionally unchanged. This usually confuses standard scrobblers into ignoring the update entirely. By default, MS correctly detects this \"top-rebound\" pattern, extracts the intermediate tracks that were squeezed in (Song B), and scrobbles Song A again as a re-listen. Note: Because of this strict deduplication, \"pure loops\" (listening to Song A continuously on repeat without playing anything else in between) cannot be tracked. The history list never changes shape, so MS has no way of knowing it was played again. If you ever experience false positives (tracks being scrobbled that you didn't actually re-listen to), you can disable this recovery behavior with \"recoverUnchangedTopHistory\": false in your config options or by setting the APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY=false env var. Album name normalization​ The Apple Music API appends - EP or - Single to the album name for EPs and singles. These suffixes are not part of the official names of the album and can cause issues when trying to scrobble or match metadata. By default, Multi-Scrobbler strips these suffixes out so only the official name is used. If you do not want this behavior it can be disabled with ENV APPLEMUSIC_NORMALIZE_ALBUM=false or File/AIO option \"normalizeAlbum\": false. Stripping Suffix with User Stage If you still want this stripping functionality but with more control over how it is applied you can use a User Stage. Here is an example of creating a User Stage to only strip suffixes for a specific scrobble client: Example config.json { // ... \"transformers\": [ { \"type\": \"user\", \"name\": \"AppleAlbumStip\", \"defaults\": { \"album\": [ \"/ - (EP|Single)$/i\" ] } } ] } applemusic.json { { \"id\": \"myAppleMusic\", \"name\": \"My Apple Music\", \"data\": { // ... }, \"options\": { \"normalizeAlbum\": false } } } lastfm.json [ { \"name\": \"Foxx LFM Client\", \"id\": \"myLastFmClient\", \"enable\": true, \"configureAs\": \"client\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"user\", \"name\": \"AppleAlbumStip\", } ] } } } ]","s":"How Multi-Scrobbler handles Apple Music quirks","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#how-multi-scrobbler-handles-apple-music-quirks","p":144},{"i":153,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description APPLEMUSIC_ID string A globally unique ID EX myComponentId APPLEMUSIC_NAME string Value of APPLEMUSIC_ID A vanity name EX My Cool Component APPLEMUSIC_ENABLE boolean true Should this component be used? APPLEMUSIC_KEY_ID string APPLEMUSIC_TEAM_ID string APPLEMUSIC_KEY_P8 string APPLEMUSIC_MEDIA_USER_TOKEN string APPLEMUSIC_TOKEN string APPLEMUSIC_ORIGIN_HEADER string Origin header to include in every Apple Music API request. APPLEMUSIC_RECOVER_UNCHANGED_TOP_HISTORY boolean true Fixes a quirk where Apple Music's history API hides duplicate plays. APPLEMUSIC_NORMALIZE_ALBUM boolean true Removes extraneous suffixes from album data Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a applemusic type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a applemusic Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source applemusic configs will validate correctly in the editor but both source and client applemusic configs are allowed in the real CONFIG/applemusic.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a applemusic Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/applemusic.json [ { \"id\": \"myAppleMusic\", \"name\": \"My Apple Music\", \"enable\": true, \"clients\": [], \"data\": { \"key\": { \"id\": \"2HPSNJZ88N\", \"teamId\": \"SN6YASW8G4\", \"p8\": \"-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----\" }, \"token\": \"your-jwt-token-here\", \"mediaUserToken\": \"your-media-user-token-here\", \"origin\": \"https://music.apple.com\", \"interval\": 60 }, \"options\": { \"logDiff\": true, \"recoverUnchangedTopHistory\": true, \"normalizeAlbum\": true } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the applemusic type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a applemusic Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a applemusic Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myAppleMusic\", \"name\": \"My Apple Music\", \"enable\": true, \"clients\": [], \"data\": { \"key\": { \"id\": \"2HPSNJZ88N\", \"teamId\": \"SN6YASW8G4\", \"p8\": \"-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEG...-----END PRIVATE KEY-----\" }, \"token\": \"your-jwt-token-here\", \"mediaUserToken\": \"your-media-user-token-here\", \"origin\": \"https://music.apple.com\", \"interval\": 60 }, \"options\": { \"logDiff\": true, \"recoverUnchangedTopHistory\": true, \"normalizeAlbum\": true }, \"type\": \"applemusic\" } ] }","s":"Configuration Reference","u":"/multi-scrobbler/configuration/sources/applemusic/","h":"#configuration-reference","p":144},{"i":155,"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":154},{"i":157,"t":"Name Networking Scrobble SOT Multi Device/User Scrobble Destination Thresholds Auto Monitoring Apple Music Active History ❌ ✅ ❌ ✅ 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 ❌ ✅ ❌ ✅ Sonos Active Activity ✅ ✅ ✅ ✅ Spotify Active Activity ✅ ✅ ✅ ✅ Subsonic-compatible APIs Active Activity ✅ ✅ ✅ ✅ teal.fm Active History ❌ ✅ ❌ ✅ WebScrobbler Ingress History ❌ ✅ ❌ ✅ VLC Active Activity ❌ ✅ ✅ ✅ Yamaha MusicCast Active Activity ❌ ✅ ✅ ✅ Yandex Music Active Activity ✅ ✅ ✅ Youtube Music Active History ❌ ✅ ❌ ✅","s":"Sources","u":"/multi-scrobbler/configuration/sources/","h":"#sources","p":154},{"i":160,"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":154},{"i":162,"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":154},{"i":164,"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":154},{"i":166,"t":"From Listening History​ For Listening History Source-Of-Truth based Sources, like Listenbrainz and Last.fm, newely discovered history is immediately forwarded to relevant Clients. From Ingress​ For Ingress communication based Sources, like Listenbrainz (Endpoint) and Webscrobbler, the client sending data to Multi-Scrobbler is what determines when activity is scrobbled. This means that it up to the behavior and implementation of whatever application you point at these Source endpoints: when the client sends \"this is scrobbled\", MS immediately forwards it to relevant Clients. From Listening Activity​ For Sources that use Active communication with Listening Activity as the Source-Of-Truth -- like Jellyfin, Plex, Spotify, Subsonic, etc... -- Multi-Scrobbler waits until the track changes or the active player becomes stale/disappears before determining if the activity should be scrobbled. This allows MS to record how long you listened to the track for as well as more accurately determine if Scrobble Thresholds have been met. Scrobble Thresholds​ A Source that monitors Listening Activity 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":"When Is Activity Scrobbled?","u":"/multi-scrobbler/configuration/sources/","h":"#when-is-activity-scrobbled","p":154},{"i":168,"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 monitor activity 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 monitor activity. This action can be taken on the Web Dashboard by clicking the link next to Monitoring 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 \"autoMonitor\": true } }","s":"Monitoring","u":"/multi-scrobbler/configuration/sources/","h":"#monitoring","p":154},{"i":171,"t":"On this page you find contrived, complex usecases for multi-scrobbler that provide examples of equivalent configuration types to fulfill that usecase. These example are useful for: getting an idea of what you can do with Multi-scrobbler using these examples as a starting point for your own configuration providing an example of the same configuration across different configuration types tip More common, straightforward scenarios can be found in the quickstart guide.","s":"What's This?","u":"/multi-scrobbler/configuration/kitchensink/","h":"#whats-this","p":169},{"i":174,"t":"You are the only user of Multi-scrobbler. You have many Sources you listen to and want to scrobble them to multiple services. You want to scrobble from... A Spotify account A Navidrome instance that you want to use with the built-in listenbrainz scrobble function A shared Plex instance that you want to scrobble only from a specific library named oldies You want to scrobble to... Your decades-old Last.fm account A Koito server for backup Configuration ENV File AIO Using ENV Config compose.yaml 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 # spotify - SPOTIFY_ID=foxxSpotify - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43 - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback # navidrome listenbrainz endpoint - LZE_ID=myLzNavidrome - LZE_TOKEN=myToken # plex - PLEX_ID=foxxPlex - PLEX_URL=192.168.0.233:32400 - PLEX_TOKEN=JtRnwQWD__XMJF8sT3jc - PLEX_USERS_ALLOW=foxx - PLEX_LIBRARIES_ALLOW=oldies # lastfm - LASTFM_ID=myLFM - LASTFM_API_KEY=myApiKey - LASTFM_SECRET=mySecret - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback # koito - KOITO_ID=foxxKoi - KOITO_TOKEN=029b081ba-9156-4pe7-88e5-3be671f5ea2b - KOITO_USER=admin - KOITO_URL=http://192.168.0.100:4110 volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped Using File Config CONFIG_DIR/spotify.json [ { \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] CONFIG_DIR/endpointlz.json [ { \"id\": \"myLzNavidrome\", \"name\": \"LZ for Navidrome\", \"data\": { \"token\": \"myToken\" } } ] CONFIG_DIR/plex.json [ { \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"foxx\"], \"librariesAllow\": [\"oldies\"], } } ] CONFIG_DIR/lastfm.json [ { \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] CONFIG_DIR/koito.json [ { \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Using AIO Config CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"spotify\", \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } }, { \"type\": \"endpointlz\", \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"data\": { \"token\": \"myToken\" } }, { \"type\": \"plex\", \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [\"foxx\"], \"librariesAllow\": [\"oldies\"] } } ], \"clients\": [ { \"type\": \"lastfm\", \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"type\": \"koito\", \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] }","s":"Multiple Sources to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-sources-clients","p":169},{"i":176,"t":"ENV Config Not Possible In this usescase there is more than one of the same type of Source/Client. This means only File or AIO configuration types are possible because ENV configuration only supports one Source/Client per type. You want to scrobble plays for yourself (Foxx), Fred, and Mary: The three of you want to scrobble from... Fred and Mary each have their own Jellyfin servers You have a Plex server The three of you want to scrobble to... Fred and Mary each have their own Last.fm accounts You have a Koito server Configuration File AIO Using File Config CONFIG_DIR/jellyin.json [ { \"id\": \"fredJf\", \"name\": \"Freds Jellyfin\", \"clients\": [\"fredLFM\"], \"data\": { \"url\": \"https://jellyfin.fred.com\", \"user\": \"Fred\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } }, { \"id\": \"maryJf\", \"name\": \"Marys Jellyfin\", \"clients\": [\"maryLFM\"], \"data\": { \"url\": \"https://jellyfin.mary.com\", \"user\": \"Mary\", \"apiKey\": \"26fe9c5dc6374542adc4f4d5e8352838\" } } ] CONFIG_DIR/plex.json [ { \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"clients\": [\"foxxKoi\"], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\" } } ] CONFIG_DIR/lastfm.json [ { \"id\": \"maryLFM\", \"name\": \"Marys Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"id\": \"fredLFM\", \"name\": \"Freds Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"fredApiKey\", \"secret\": \"fredSecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] CONFIG_DIR/koito.json [ { \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Using AIO Config CONFIG_DIR/config.json { \"sources\": [ { \"type\": \"jellyfin\", \"id\": \"fredJf\", \"name\": \"Freds Jellyfin\", \"clients\": [ \"fredLFM\" ], \"data\": { \"url\": \"https://jellyfin.fred.com\", \"user\": \"Fred\", \"apiKey\": \"c9fae8756fbf481ebd9c5bb56bd6540c\" } }, { \"type\": \"jellyfin\", \"id\": \"maryJf\", \"name\": \"Marys Jellyfin\", \"clients\": [ \"maryLFM\" ], \"data\": { \"url\": \"https://jellyfin.mary.com\", \"user\": \"Mary\", \"apiKey\": \"26fe9c5dc6374542adc4f4d5e8352838\" } }, { \"type\": \"plex\", \"id\": \"foxxPlex\", \"name\": \"Foxx Plex\", \"clients\": [ \"foxxKoi\" ], \"data\": { \"token\": \"JtRnwQWD__XMJF8sT3jc\", \"url\": \"192.168.0.233:32400\", \"usersallow\": [ \"foxx\" ] } } ], \"clients\": [ { \"type\": \"lastfm\", \"id\": \"maryLFM\", \"name\": \"Marys Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"maryApiKey\", \"secret\": \"marySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"type\": \"lastfm\", \"id\": \"fredLFM\", \"name\": \"Freds Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"fredApiKey\", \"secret\": \"fredSecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } }, { \"type\": \"koito\", \"id\": \"foxxKoi\", \"name\": \"Foxx Koito\", \"configureAs\": \"client\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] }","s":"Scrobble for Multiple People to Multiple Clients","u":"/multi-scrobbler/configuration/kitchensink/","h":"#multi-persons-services","p":169},{"i":178,"t":"You have multiple Sources of music but your personal, on-filesystem music collection is not well organized. You want to use the Musicbrainz Transformer to fix any scrobbles that use Navidrome, where your personal collection is located, so that the scrobble artists/album/title are all standardized. You want to scrobble from... A Spotify account A Navidrome instance that you want to use with the built-in listenbrainz scrobble function Plays from this Source should be fixed by Musicbrainz before going to your scrobble Clients You want to scrobble to... A Last.fm account Configuration ENV File AIO Using ENV Config compose.yaml 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 # required setup for musicbrainz - MB_CONTACT=contact@mydomain.com # a real email # searches with sensible release sorting with the searchOrder # isrc => basic => artist (native mode) - MB_PRESETS=default,sensible,native # spotify - SPOTIFY_ID=foxxSpotify - SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs - SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43 - SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback # navidrome listenbrainz endpoint - LZE_ID=myLzNavidrome - LZE_TOKEN=myToken # applies musicbrainz Stage to preTransform of navidrome source - LZE_TRANSFORMS=musicbrainz # lastfm - LASTFM_ID=myLFM - LASTFM_API_KEY=myApiKey - LASTFM_SECRET=mySecret - LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped Using File Config For non-ENV config, Musicbrainz Transformer must be setup using the AIO Config config.json file. This configuration uses the sensible defaults in the defaults property. This is a suggestion and can be removed if not desired. CONFIG_DIR/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\" ] } } ] } CONFIG_DIR/spotify.json [ { \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] CONFIG_DIR/endpointlz.json [ { \"id\": \"myLzNavidrome\", \"name\": \"LZ for Navidrome\", \"data\": { \"token\": \"myToken\" }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ] CONFIG_DIR/lastfm.json [ { \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Using AIO Config This configuration uses the sensible defaults in the defaults property. This is a suggestion and can be removed if not desired. CONFIG_DIR/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\" ] } } ], \"sources\": [ { \"type\": \"spotify\", \"id\": \"foxxSpotify\", \"name\": \"Foxx Spotify\", \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } }, { \"type\": \"endpointlz\", \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"data\": { \"token\": \"myToken\" }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" } ] } } } ], \"clients\": [ { \"type\": \"lastfm\", \"id\": \"myLFM\", \"name\": \"Old Lastfm\", \"configureAs\": \"client\", \"data\": { \"apiKey\": \"myApiKey\", \"secret\": \"mySecret\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] }","s":"Use Musicbrainz to Fix Scrobbles from Navidrome","u":"/multi-scrobbler/configuration/kitchensink/","h":"#use-musicbrainz-to-fix-scrobbles-from-navidrome","p":169},{"i":180,"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","s":"Azuracast","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"","p":179},{"i":182,"t":"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 Auto Monitoring Behavior This Source supports toggling monitoring on or off manually. This action can be taken on the Web Dashboard by clicking the link next to Monitoring found in each Source's status card. Additionally, the default monitoring behavior 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 monitor (unless manually invoked) // set to false to never monitor (unless manually invoked) \"autoMonitor\": true } }} When autoMonitor is not explicitly set, Multi-scrobbler will set the default monitoring 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 monitor based on when these conditions are met. If neither is configured automatic monitoring defaults to off and you should either manually initiate it or explicitly set the default behavior.","s":"URL","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#url","p":179},{"i":184,"t":"Station Identifier​ The station identifier multi-scrobbler uses (ENV AZURA_STATION or station in File/AIO config) needs to be the URL Stub or shortcode of the Azuracast station, not its display name. Use of the methods below to find an apprioriate station identifier. URL Stub Shortcode The URL Stub is the value used in the URL to access the station EX https://azura.mydomain.com/public/my-cool-station ^^^^ url stub ^^ Use my-cool-station as the station identifier. The shortcode can be found in the raw JSON response for your station. Navigate to this URL in your browser: https://azura.mydomain.com/api/stations Find your station in the returned data (by name) and then locate the value of the shortcode property in that object. Example [ { \"id\": 1, \"name\": \"My Cool Station\", \"shortcode\": \"my-cool-station\", \"description\": \"Re-broadcasts of my cool music\", \"frontend\": \"icecast\", \"backend\": \"liquidsoap\", ... Use my-cool-station as the station identifier. Station Access​ Multi-Scrobbler does not use authentication to communicate with Azuracast. Your station will likely need some form of Public Pages in order for you to monitor it. In your station's Edit Station Settings -> Public Pages make sure that at least one of these is enabled: Enable Public Pages Enable Public APIs note For users who aren't administrators of Azuracast: if you can access the station using https://azura.mydomain.com/public/xxxxxx then it is public.","s":"Station","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#station","p":179},{"i":186,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description AZURA_ID string A globally unique ID EX myComponentId AZURA_NAME string Value of AZURA_ID A vanity name EX My Cool Component AZURA_ENABLE boolean true Should this component be used? AZURA_STATION string The specific station to monitor AZURA_URL string Base URL of the Azuracast instance AZURA_KEY string API Key used to access data about private streams AZURA_LISTENERS_NUM string AZURA_LIVE boolean Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a azuracast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a azuracast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source azuracast configs will validate correctly in the editor but both source and client azuracast configs are allowed in the real CONFIG/azuracast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a azuracast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/azuracast.json [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"Cool Station\", \"id\": \"myAzura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the azuracast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a azuracast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a azuracast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"type\": \"azuracast\", \"enable\": true, \"name\": \"Cool Station\", \"id\": \"myAzura\", \"data\": { \"url\": \"ws://192.168.0.101\", \"station\": \"my-station-name\", \"monitorWhenLive\": true, \"monitorWhenListeners\": 1 } } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/azuracast/","h":"#configuration","p":179},{"i":188,"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 library types (like those labelled as mixed or book for audiobooks) multi-scrobbler will only scrobble media Jellyfin detects as Audio. To allow other media types to be scrobbled set allowMediaTypes or JELLYFIN_MEDIATYPES_ALLOW with a list of official types. One or more of: Unknown, Video, Audio, Photo, Book If you use this setting you must explicitly specify Audio, it will no longer be provided as a default External Asset URL If you use MS and Jellyfin on an internal or otherwise inaccessible network but still want album art assets used in the UI or for Discord to be accessible you can specify a URL to replace your internal url. Use (file) frontendUrlOverride or (env) JELLYFIN_FRONTEND_URL_OVERRIDE to replace url/JELLYFIN_URL, respectively, when rendering links for the dashboard UI or other resources. Example: Your JELLYFIN_URL is http://jellyfin:8096 but your Jellyfin instance is externally accessible (by MS or in general) at https://jellyfin.mydomain.com. Use JELLYFIN_FRONTEND_URL_OVERRIDE=https://jellyfin.mydomain.com in order for the MS dashboard to use https://jellyfin.mydomain.com/art/1234.jpg when linking to album art. Configuration​ ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description JELLYFIN_ID string A globally unique ID EX myComponentId JELLYFIN_NAME string Value of JELLYFIN_ID A vanity name EX My Cool Component JELLYFIN_ENABLE boolean true Should this component be used? JELLYFIN_USER string The username of the user to authenticate for or track scrobbles for JELLYFIN_PASSWORD string Password of the username to authenticate for JELLYFIN_APIKEY string API Key to authenticate with. JELLYFIN_URL string HOST:PORT of the Jellyfin server to connect to JELLYFIN_USERS_ALLOW string OR true Only scrobble for specific users from this comma-delimited list. If true, scrobble for all users. JELLYFIN_USERS_BLOCK string Do not scrobble for users from this comma-delimited list JELLYFIN_DEVICES_ALLOW string Only scrobble if device or application name contains strings from this comma-delimited list JELLYFIN_DEVICES_BLOCK string Do not scrobble if device or application name contains strings from this comma-delimited list JELLYFIN_LIBRARIES_ALLOW string Only scrobble if library name contains string from this comma-delimited list JELLYFIN_LIBRARIES_BLOCK string Do not scrobble if library name contains strings from this comma-delimited list JELLYFIN_FRONTEND_URL_OVERRIDE string HOST:PORT of the Jellyfin server that your browser will be able to access from the frontend (and thus load images and links from) JELLYFIN_MEDIATYPES_ALLOW string Allow media types from this comma-delimited list to be scrobbled Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a jellyfin type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a jellyfin Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source jellyfin configs will validate correctly in the editor but both source and client jellyfin configs are allowed in the real CONFIG/jellyfin.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a jellyfin Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/jellyfin.json [ { \"name\": \"Cool JF Server\", \"enable\": true, \"id\": \"myJellyfin\", \"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\" ], \"allowMediaTypes\": [ \"audio\" ], \"frontendUrlOverride\": \"https://myJellyfinExternal.tld\" }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the jellyfin type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a jellyfin Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a jellyfin Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Cool JF Server\", \"enable\": true, \"id\": \"myJellyfin\", \"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\" ], \"allowMediaTypes\": [ \"audio\" ], \"frontendUrlOverride\": \"https://myJellyfinExternal.tld\" }, \"options\": { \"logPayload\": true, \"logFilterFailure\": \"debug\" }, \"type\": \"jellyfin\" } ] }","s":"Jellyfin","u":"/multi-scrobbler/configuration/sources/jellyfin/","h":"","p":187},{"i":190,"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":189},{"i":192,"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":189},{"i":194,"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":189},{"i":196,"t":"Multi-scrobbler can monitor listening history for accounts linked to a Deezer Family Account. Instructions Start multi-scrobbler using the ARL for the main account. In the logs look for Linked Accounts associated with the Deezer Source. It will look something like this: VERBOSE: [App] [Sources] [Deezer - MyDeezer] Linked Accounts: Name: Joe | ID: 166276334 | Private?: Yes Name: Mary | ID: 48475231 | Private?: Yes Name: FoxxMD | ID: 896225281 | Private?: No Name: Cool Guy | ID: 128522478 | Private?: Yes The Account ID you want to monitor should be set: ENV File or AIO Set in your docker compose environment section: - DEEZER_ACCOUNT_ID=896225281 Add an accountId property to the data section [ { \"name\": \"DeezerARL\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30D...\", \"accountId\": \"896225281\" } } ] Restart multi-scrobbler to start monitoring that account. Restrictions Deezer may not return the correct listening history under these circumstances: The ARL used is not for the main account If you can get an ARL specifically for the linked account (login as the linked account), use that instead of family accountId The ARL account is private The linked account to be monitored ( using accountId) is private","s":"Family account","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#family-account","p":189},{"i":198,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description DEEZER_ID string A globally unique ID EX myComponentId DEEZER_NAME string Value of DEEZER_ID A vanity name EX My Cool Component DEEZER_ENABLE boolean true Should this component be used? DEEZER_ARL string ARL retrieved from Deezer response header DEEZER_ACCOUNT_ID string The ID (USER_ID) of the linked account to monitor. DEEZER_USER_AGENT string Mozilla/5.0 (X11; Linux i686; rv:135.0) Gecko/20100101 Firefox/135.0 User agent Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a deezer type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a deezer Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source deezer configs will validate correctly in the editor but both source and client deezer configs are allowed in the real CONFIG/deezer.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a deezer Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/deezer.json [ { \"name\": \"Family Account\", \"id\": \"myDeezerId\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the deezer type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a deezer Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a deezer Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Family Account\", \"id\": \"myDeezerId\", \"enable\": true, \"clients\": [], \"data\": { \"arl\": \"UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig\" }, \"type\": \"deezer\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/deezer/","h":"#configuration","p":189},{"i":200,"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 monitoring for Icecast Sources is off by default. Use Monitoring Behavior to initiate scrobbling or configure automatic scrobble. Auto Monitoring Behavior This Source supports toggling monitoring on or off manually. This action can be taken on the Web Dashboard by clicking the link next to Monitoring found in each Source's status card. Additionally, the default monitoring behavior 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 monitor (unless manually invoked) // set to false to never monitor (unless manually invoked) \"autoMonitor\": true } }} This component's default monitoring behavior, when the above is not set, is to never monitor. 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":199},{"i":202,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description ICECAST_ID string A globally unique ID EX myComponentId ICECAST_NAME string Value of ICECAST_ID A vanity name EX My Cool Component ICECAST_ENABLE boolean true Should this component be used? ICECAST_URL string The Icecast stream URL ICECAST_AUTO_MONITOR boolean Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a icecast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a icecast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source icecast configs will validate correctly in the editor but both source and client icecast configs are allowed in the real CONFIG/icecast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a icecast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/icecast.json [ { \"name\": \"Station 1\", \"enable\": true, \"id\": \"myIceStation1\", \"data\": { \"url\": \"http://myIcecast.com/radio\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the icecast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a icecast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a icecast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Station 1\", \"enable\": true, \"id\": \"myIceStation1\", \"data\": { \"url\": \"http://myIcecast.com/radio\" }, \"type\": \"icecast\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/icecast/","h":"#configuration","p":199},{"i":204,"t":"In order for multi-scrobbler to communicate with JRiver you must have Web Server Interface enabled. This can be found 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":203},{"i":206,"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":203},{"i":208,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description JRIVER_ID string A globally unique ID EX myComponentId JRIVER_NAME string Value of JRIVER_ID A vanity name EX My Cool Component JRIVER_ENABLE boolean true Should this component be used? JRIVER_URL string http://localhost:52199/MCWS/v1/ URL of the JRiver HTTP server to connect to JRIVER_USER string If you have enabled authentication, the username you set JRIVER_PASSWORD string If you have enabled authentication, the password you set Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a jriver type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a jriver Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source jriver configs will validate correctly in the editor but both source and client jriver configs are allowed in the real CONFIG/jriver.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a jriver Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/jriver.json [ { \"name\": \"My JRiver Server\", \"id\": \"myRiver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the jriver type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a jriver Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a jriver Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"My JRiver Server\", \"id\": \"myRiver\", \"enable\": true, \"data\": { \"url\": \"0.0.0.0\", \"username\": \"auser\", \"password\": \"apassword\" }, \"type\": \"jriver\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/jriver/","h":"#configuration","p":203},{"i":210,"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":209},{"i":212,"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":209},{"i":214,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description KODI_ID string A globally unique ID EX myComponentId KODI_NAME string Value of KODI_ID A vanity name EX My Cool Component KODI_ENABLE boolean true Should this component be used? KODI_URL string http://localhost:8080/jsonrpc URL of the Kodi HTTP server to connect to KODI_USER string The username set for Remote Control via Web Sever KODI_PASSWORD string The password set for Remote Control via Web Sever Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a kodi type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a kodi Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source kodi configs will validate correctly in the editor but both source and client kodi configs are allowed in the real CONFIG/kodi.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a kodi Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/kodi.json [ { \"name\": \"My Kodi Server\", \"id\": \"myKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the kodi type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a kodi Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a kodi Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"My Kodi Server\", \"id\": \"myKodi\", \"enable\": true, \"data\": { \"url\": \"http://localhost:8080/jsonrpc\", \"username\": \"myUser\", \"password\": \"myPassword\" }, \"type\": \"kodi\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/kodi/","h":"#configuration","p":209},{"i":216,"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":215},{"i":218,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. note Manually configuring cast device connections is only available through file-based config. Environmental Variable Type Default Description CC_ID string A globally unique ID EX myComponentId CC_NAME string Value of CC_ID A vanity name EX My Cool Component CC_ENABLE boolean true Should this component be used? CC_BLACKLIST_DEVICES string DO NOT scrobble from any cast devices on this comma-delimited list that START WITH these values CC_WHITELIST_DEVICES string ONLY scrobble from any cast device on this comma-delimited list that START WITH these values CC_BLACKLIST_APPS string DO NOT scrobble from any application on this comma-delimited list that START WITH these values CC_WHITELIST_APPS string ONLY scrobble from any application on this comma-delimited list that START WITH these values Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a chromecast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a chromecast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source chromecast configs will validate correctly in the editor but both source and client chromecast configs are allowed in the real CONFIG/chromecast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a chromecast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/chromecast.json [ { \"name\": \"My Cast\", \"id\": \"myCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the chromecast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a chromecast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a chromecast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"My Cast\", \"id\": \"myCast\", \"data\": { \"blacklistedDevices\": [], \"whitelistedDevices\": [], \"blacklistedApps\": [], \"whitelistedApps\": [] }, \"type\": \"chromecast\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/google-cast/","h":"#configuration","p":215},{"i":220,"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: File/AIO config must include \"configureAs\": \"source\" Configuration​ ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_KOITO_ID string A globally unique ID EX myComponentId SOURCE_KOITO_NAME string Value of SOURCE_KOITO_ID A vanity name EX My Cool Component SOURCE_KOITO_ENABLE boolean true Should this component be used? SOURCE_KOITO_URL string URL for the Koito server SOURCE_KOITO_TOKEN string User token for the user to scrobble for SOURCE_KOITO_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a koito type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a koito Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source koito configs will validate correctly in the editor but both source and client koito configs are allowed in the real CONFIG/koito.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a koito Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a koito Client config. This requirement does not apply to AIO koito configs. Config Example Mobile Experience This displays an example config file of a koito Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/koito.json [ { \"name\": \"Koito Source B\", \"id\": \"myKoitoSource\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the koito type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a koito Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a koito Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Koito Source B\", \"id\": \"myKoitoSource\", \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" }, \"type\": \"koito\" } ] }","s":"Koito","u":"/multi-scrobbler/configuration/sources/koito-source/","h":"","p":219},{"i":222,"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) Recommended Alternative This Source has the same data limitations as the Last.fm (Source) and Last.fm (Client) have: Last.fm does not support separating artists/album artists fields which means any multi-artist tracks will have all artists combined into one string. This makes scrobbling to other services, and using metadata corrections like Musicbrainz, more difficult. If your application has the option to scrobble using Listenbrainz then use the Listenbrainz (Endpoint) Source instead.","s":"Lastfm (Endpoint)","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"","p":221},{"i":224,"t":"Scenario Picker Use one of the scenarios below based on how on your service(s) (things \"scrobbling\" to Multi-Scrobbler using this Source) will need to interact with MS. One Service Many Services, Same User Many Services, Many Users, Can use LFM Account Many Services, Many Users, Cannot use LFM Account Service cannot use standard URL You have one service, like Panoscrobbler, that will scrobble to Multi-Scrobbler. Configure one Last.fm Endpoint Source. Use the standard base URL to configure your service and apikey/user, if necessary. Use the same apikey/user in MS as you do in your service. You may have more than one service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler. All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same Clients. Configure one Lastfm Endpoint Source. Use the standard base URL to configure your service and configure apikey/user in MS, if necessary. Use the same apikey/user for all your services as you configure in MS. You have more than one service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All of these services can accept a apikey/user to authenticate a Last.fm user/account. Configure one Last.fm Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For each Lastfm Endpoint Source, configure a different apikey/user. Use that same apikey/user when configuring Last.fm for the associated service. All Last.fm Endpoint Sources should use the same standard base URL. You have more than one service that will scrobble to Multi-Scrobbler, like ArchiveTune and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All, or some, of these services cannot accept an apikey/user to authenticate a Last.fm user/account. This is not a common scenario but if it fits your usecase then use these guidelines to differentiate your services: Configure one Last.fm Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For any groups of services that can use apikey/user, use the instructions for Many Services, Many Users, Can use LFM Account For any groups of services that cannot accept an apikey/user... You can still configure a Source without an apikey/user. Any services not using an account will use this \"default\" Source. If multiple groups cannot use an apikey/user, or the groups cannot use the standard base URL, then use different base url Slugs. You have one service, like PanoScrobbler, that will scrobble to Multi-Scrobbler. You have already tried the One Service scenario with the standard base URL but it is not working. This is not a common scenario. Check the Troubleshooting URL section before trying this. At this point, you can try to use a different base url Slug. Your service must be able to set a \"fully custom\" URL for Last.fm IE it must allow you to set more than just a domain/host.","s":"Setup","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#setup","p":221},{"i":226,"t":"When setting up your Last.fm client to communicate with Multi-Scrobbler replace the Last.fm domain with your Multi-Scrobbler domain: https://last.fm => https://yourMSDomain MS accepts Last.fm API calls with the same url base and structure as the last.fm api, IE http://yourMSDomain/2.0/","s":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#standard-base-url","p":221},{"i":228,"t":"If you are only setting up one Lastfm Endpoint Source then you do not need to configure any explicit username/apiKey/password for MS. If your Last.fm Client requires these credentials use any fake values you want. Supported Auth Types Currently, Multi-Scrobbler only supports the Mobile Application auth flow. If your client requires one of the other authentication flows please open an issue. Note: Your client does not need to implement any auth in order to use a Lastfm Endpoint Source. You can directly make track.scrobble or track.updateNowPlaying api calls to http://yourMSDomain/2.0/ with any fake auth data you want.","s":"Authentication","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#authentication","p":221},{"i":230,"t":"If you need configure more than one Lastfm Endpoint Source then you should configure username/apiKey for MS, per Source. This enables MS to differentiate scrobbles for each Source. Use the same username and/or API Key you configure with MS when setting up your Last.fm Client. These values can be anything you want, as long as they match between MS and your client. Password can be anything and is not checked. However, if you cannot configure username/apiKeys for your scenario you may also use a URL Slug to tell MS which Source belongs to a specific user. This is not a common scenario and should only be used if username/apiKey configuration is not sufficient or not possible. Different URL Base (Slug) If you cannot use different username/apiKey per Source (or Last.fm Client) you can still differentiate Sources by using a different url base (slug) for Last.fm communication. Setting a slug in config will change the url base for MS like this: slug: \"mySlug\" http://yourMsDomain/api/lastfm/mySlug The above url base is equivalent to making calls to http://yourMSDomain/2.0/","s":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#multiple-sources","p":221},{"i":232,"t":"If you think your service should be able to use the standard base URL but it is not working follow these steps before trying the the base URL Slug. Verify URL Format​ Some service may require http/https in the URL format (http://myMSDomainOrIp:9078) while others may not (myDomainOrIp:9078). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works. Some Services Require HTTPS Some services that can scrobble to a custom Last.fm URL may require the URL to have 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. Is MS is Reachable?​ Verify that MS can be accessed by your service, or from the same host as the service is running. See the FAQ for guidance on troubleshooting ingress connection issues. Service Logging​ If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Last.fm apiKey/user, or trying to make a scrobble request. If you decide to report this issue, please include this logging in your issue.","s":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#troubleshooting-url","p":221},{"i":234,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LFM_ID string A globally unique ID EX myComponentId LFM_NAME string Value of LFM_ID A vanity name EX My Cool Component LFM_ENABLE boolean true Should this component be used? LFM_SLUG string When using multiple sources without apikey/user, or not using the standard base URL, this is the URL base path that should be used to identify scrobbles for this source LFM_USERNAME string A fake username to differentiate LFM Endpoint Sources LFM_API_KEY string A fake api key to differentiate LFM Endpoint Sources Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a endpointlfm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a endpointlfm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source endpointlfm configs will validate correctly in the editor but both source and client endpointlfm configs are allowed in the real CONFIG/endpointlfm.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a endpointlfm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/endpointlfm.json [ { \"name\": \"LFM For App\", \"enable\": true, \"id\": \"myLfmApp\", \"data\": { \"slug\": \"mySlug\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the endpointlfm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlfm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlfm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"LFM For App\", \"enable\": true, \"id\": \"myLfmApp\", \"data\": { \"slug\": \"mySlug\" }, \"type\": \"endpointlfm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-endpoint/","h":"#configuration","p":221},{"i":236,"t":"This Source enables multi-scrobbler to accept scrobbles from outside applications as if it was a Listenbrainz server. If your service/player has a \"Scrobble to Listenbrainz\" feature and there is an option to set the Listenbrainz URL then multi-scrobbler can accept scrobbles from that service/player by imitating a real 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":235},{"i":238,"t":"Scenario Picker Use one of the scenarios below based on how on your service(s) (things \"scrobbling\" to Multi-Scrobbler using this Source) will need to interact with MS. One Service Many Services, Same User Many Services, Many Users, Can use Tokens Many Services, Many Users, Cannot use Tokens Service cannot use standard URL You have one service, like Navidrome, that will scrobble to Multi-Scrobbler. Configure one Listenbrainz Endpoint Source. Use the standard base URL to configure your service and set a Token, if necessary. Use the same Token in MS as you do in your service. You may have more than one service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler. All of these services will scrobble for the same user (you) and all of the scrobbles should go to the same Clients. Configure one Listenbrainz Endpoint Source. Use the standard base URL to configure your service and configure a Token in MS, if necessary. Use the same token for all your services as you configure in MS. You have more than one service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All of these services can accept a Token to authenticate a Listenbrainz user/account. Configure one Listenbrainz Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For each Listenbrainz Endpoint Source, configure a different Token. Use that same token when configuring Listenbrainz for the associated service. All Listenbrainz Endpoint Sources should use the same standard base URL. You have more than one service that will scrobble to Multi-Scrobbler, like Navidrome and Panoscrobbler. Some of these services should scrobble for different users, scrobble to different Clients, or generally be treated differently (such as for transforms). All, or some, of these services cannot accept a Token to authenticate a Listenbrainz user/account. This is not a common scenario but if it fits your usecase then use these guidelines to differentiate your services: Configure one Listenbrainz Endpoint Sources per service that should be treated differently. That is, if multiple services are all \"the same user\" then you only need one Source for that entire group of services. For any groups of services that can accept a token, use the instructions for Many Services, Many Users, Can use Tokens For any groups of services that cannot accept a token... You can still configure a Source without a Token. Any services not using a token will use this \"default\" Source. If multiple groups cannot use a token, or the groups cannot use the standard base URL, then use different base url Slugs. You have one service, like Navidrome, that will scrobble to Multi-Scrobbler. You have already tried the One Service scenario with both standard base URL and neither is working. This is not a common scenario. Check the Troubleshooting URL section before trying this. At this point, you can try to use a different base url Slug. Your service must be able to set a \"fully custom\" URL for Listenbrainz IE it must allow you to set more than just a domain/host.","s":"Setup","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#setup","p":235},{"i":240,"t":"In most scenarios you should use one of the following as the base URL when configuring your service to scrobble to multi-scrobbler: http://myMultiScrobblerIP:9078 http://myMultiScrobblerIP:9078/1/ Default Scrobble Submit URL Multi-scrobbler will accept Listenbrainz scrobbles at http://myMultiScrobblerIP:9078/1/submit-listens which is the standard Listenbrainz server path for scrobbling.","s":"Standard Base URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#standard-base-url","p":235},{"i":242,"t":"Most Listenbrainz clients require an Authentication Token to be provided during setup. This value can be anything you want but ensure you use the same value for token (ENV LZE_TOKEN) in your configuration for this Listenbrainz Endpoint Source. If your service does not require a token, or does not let you set one, then do not configure it for this Source either.","s":"Token","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#token","p":235},{"i":244,"t":"If you need configure more than one Listenbrainz Endpoint Source then MS can differentiate scrobbles based on Token so that you can use the same, standard base URL for many users. However, if you cannot configure multiple tokens for your scenario you may also use a URL Slug to tell MS which Source belongs to a specific user. This is not a common scenario and should only be used if Token configuration is not sufficient or not possible. Different URL Base (Slug) When a slug is defined in ENV/File config MS will listen for listenbrainz submit-listens requests using the slug as the base route path. Example: LZE_SLUG=foobar MS will accept requests for submit-listens (scrobble submissions and now playing) at http://myMultiScrobblerIP:9078/api/listenbrainz/foobar http://myMultiScrobblerIP:9078/api/listenbrainz/foobar/submit-listens","s":"Multiple Sources","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#multiple-sources","p":235},{"i":247,"t":"Details Set the ListenBrainz.BaseURL (env ND_LISTENBRAINZ_BASEURL) to http://myMultiScrobblerIP:9078/1/","s":"Navidrome","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#navidrome","p":235},{"i":249,"t":"Details Music Assistant Docs In your Music Assistant UI navigate to Settings -> Plugins Click Add a plugin Add ListenBrainz Scrobbler In the ListenBrainz Scrobbler configuration screen: User Token is the Token you configured Toggle Show advanced settings Base URL is the URL you can configured, or the equivalent of http://myMultiScrobblerIP:9078 for your MS instance Save the configuration and you are ready to scrobble To troubleshoot any errors, and assuming you are using Home Assistant, view the Logs in the Music Assistant Add-ons. Please include these logs in any reported issue.","s":"Music Assistant","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#music-assistant","p":235},{"i":251,"t":"If you think your service should be able to use the standard base URL but it is not working follow these steps before trying the the base URL Slug. Verify URL Format​ Some service may require http/https in the URL format (http://myMSDomainOrIp:9078) while others may not (myDomainOrIp:9078). Check the docs for your service to see if they specify this or have an example. Try both versions, if possible, to see if one works. Some Services Require HTTPS Some services that can scrobble to a custom Listenbrainz URL may require the URL to have 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. Is MS is Reachable?​ Verify that MS can be accessed by your service, or from the same host as the service is running. See the FAQ for guidance on troubleshooting ingress connection issues. Service Logging​ If you service has accessible logging, check to see if it outputs the URL it is trying to reach when authenticating the Listenbrainz account/user, or trying to make a scrobble request. If you decide to report this issue, please include this logging in your issue.","s":"Troubleshooting URL","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#troubleshooting-url","p":235},{"i":253,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description LZE_ID string A globally unique ID EX myComponentId LZE_NAME string Value of LZE_ID A vanity name EX My Cool Component LZE_ENABLE boolean true Should this component be used? LZE_SLUG string When using multiple sources without tokens, or not using a standard base URL, this is the URL base path that should be used to identify scrobbles for this source LZE_TOKEN string If an LZ submission request contains this token in the Authorization Header it will be used to match the submission with this Source LZE_USERNAME string The listenbrainz \"username\" to associate with this Source Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a endpointlz type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a endpointlz Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source endpointlz configs will validate correctly in the editor but both source and client endpointlz configs are allowed in the real CONFIG/endpointlz.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a endpointlz Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/endpointlz.json [ { \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"enable\": true, \"data\": { \"token\": \"myToken\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the endpointlz type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlz Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a endpointlz Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"LZ for Navidrome\", \"id\": \"myLzNavidrome\", \"enable\": true, \"data\": { \"token\": \"myToken\" }, \"type\": \"endpointlz\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-endpoint/","h":"#configuration","p":235},{"i":255,"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":254},{"i":257,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_LIBREFM_ID string A globally unique ID EX myComponentId SOURCE_LIBREFM_NAME string Value of SOURCE_LIBREFM_ID A vanity name EX My Cool Component SOURCE_LIBREFM_ENABLE boolean true Should this component be used? SOURCE_LIBREFM_API_KEY string Optional Secret for Libre.fm account SOURCE_LIBREFM_SECRET string Optional Secret for Libre.fm account SOURCE_LIBREFM_REDIRECT_URI string http://localhost:9078/librefm/callback Optional URI to use for callback. SOURCE_LIBREFM_SESSION string Optional session id returned from a completed auth flow SOURCE_LIBREFM_URLBASE string https://libre.fm/2.0/ (Optional) The host and path prefix for your Libre.fm instance Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a librefm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a librefm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source librefm configs will validate correctly in the editor but both source and client librefm configs are allowed in the real CONFIG/librefm.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a librefm Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a librefm Client config. This requirement does not apply to AIO librefm configs. Config Example Mobile Experience This displays an example config file of a librefm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/librefm.json [ { \"name\": \"Foxx Libre Source\", \"id\": \"myLibreFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the librefm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a librefm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Foxx Libre Source\", \"id\": \"myLibreFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"anything\", \"secret\": \"anything\", \"redirectUri\": \"http://localhost:9078/librefm/callback\" }, \"type\": \"librefm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/librefm-source/","h":"#configuration","p":254},{"i":259,"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":258},{"i":261,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_LZ_ID string A globally unique ID EX myComponentId SOURCE_LZ_NAME string Value of SOURCE_LZ_ID A vanity name EX My Cool Component SOURCE_LZ_ENABLE boolean true Should this component be used? SOURCE_LZ_URL string https://api.listenbrainz.org/ URL for the ListenBrainz server, if not using the default SOURCE_LZ_TOKEN string User token for the user to scrobble for SOURCE_LZ_USER string Username of the user to scrobble for Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a listenbrainz type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a listenbrainz Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source listenbrainz configs will validate correctly in the editor but both source and client listenbrainz configs are allowed in the real CONFIG/listenbrainz.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a listenbrainz Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a listenbrainz Client config. This requirement does not apply to AIO listenbrainz configs. Config Example Mobile Experience This displays an example config file of a listenbrainz Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/listenbrainz.json [ { \"name\": \"Foxx LZ Source\", \"id\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the listenbrainz type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a listenbrainz Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Foxx LZ Source\", \"id\": \"brainzSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"FoxxMD\", \"url\": \"https://api.listenbrainz.org\" }, \"type\": \"listenbrainz\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/listenbrainz-source/","h":"#configuration","p":258},{"i":263,"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: File/AIO config must include \"configureAs\": \"source\"","s":"Maloja","u":"/multi-scrobbler/configuration/sources/maloja/","h":"","p":262},{"i":265,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_MALOJA_ID string A globally unique ID EX myComponentId SOURCE_MALOJA_NAME string Value of SOURCE_MALOJA_ID A vanity name EX My Cool Component SOURCE_MALOJA_ENABLE boolean true Should this component be used? SOURCE_MALOJA_URL string URL for maloja server SOURCE_MALOJA_API_KEY string API Key for Maloja server Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a maloja type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a maloja Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source maloja configs will validate correctly in the editor but both source and client maloja configs are allowed in the real CONFIG/maloja.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a maloja Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a maloja Client config. This requirement does not apply to AIO maloja configs. Config Example Mobile Experience This displays an example config file of a maloja Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/maloja.json [ { \"name\": \"Maloja Source\", \"id\": \"myMalojaSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the maloja type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a maloja Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Maloja Source\", \"id\": \"myMalojaSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"url\": \"http://localhost:42010\", \"apiKey\": \"myMalojaKey\" }, \"type\": \"maloja\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/maloja/","h":"#configuration","p":262},{"i":267,"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":266},{"i":269,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_LASTFM_ID string A globally unique ID EX myComponentId SOURCE_LASTFM_NAME string Value of SOURCE_LASTFM_ID A vanity name EX My Cool Component SOURCE_LASTFM_ENABLE boolean true Should this component be used? SOURCE_LASTFM_API_KEY string API Key generated from Last.fm/Libre.fm account SOURCE_LASTFM_SECRET string Secret generated from Last.fm/Libre.fm account SOURCE_LASTFM_REDIRECT_URI string http://localhost:9078/lastfm/callback Optional URI to use for callback. SOURCE_LASTFM_SESSION string Optional session id returned from a completed auth flow Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a lastfm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a lastfm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source lastfm configs will validate correctly in the editor but both source and client lastfm configs are allowed in the real CONFIG/lastfm.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a lastfm Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a lastfm Client config. This requirement does not apply to AIO lastfm configs. Config Example Mobile Experience This displays an example config file of a lastfm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/lastfm.json [ { \"name\": \"Foxx LFM Source\", \"id\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the lastfm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a lastfm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Foxx LFM Source\", \"id\": \"myLastFmSource\", \"enable\": true, \"configureAs\": \"source\", \"data\": { \"apiKey\": \"a89cba1569901a0671d5a9875fed4be1\", \"secret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/lastfm/callback\" }, \"type\": \"lastfm\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/lastfm-source/","h":"#configuration","p":266},{"i":271,"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":270},{"i":273,"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":270},{"i":275,"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":270},{"i":277,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MOPIDY_ID string A globally unique ID EX myComponentId MOPIDY_NAME string Value of MOPIDY_ID A vanity name EX My Cool Component MOPIDY_ENABLE boolean true Should this component be used? MOPIDY_URL string ws://localhost:6680/mopidy/ws/ URL of the Mopidy HTTP server to connect to MOPIDY_URI_DENYLIST string Do not scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive MOPIDY_URI_ALLOWLIST string Only scrobble tracks whose URI STARTS WITH any of these strings, case-insensitive MOPIDY_ALBUM_DENYLIST string Soundcloud Remove album data that matches any case-insensitive string from this list when scrobbling, Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a mopidy type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a mopidy Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source mopidy configs will validate correctly in the editor but both source and client mopidy configs are allowed in the real CONFIG/mopidy.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a mopidy Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/mopidy.json [ { \"name\": \"Mopidy Desktop\", \"id\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the mopidy type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a mopidy Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a mopidy Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Mopidy Desktop\", \"id\": \"MyMopidy\", \"enable\": true, \"data\": { \"url\": \"localhost\", \"uriBlacklist\": [], \"uriWhitelist\": [], \"albumBlacklist\": [] }, \"type\": \"mopidy\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mopidy/","h":"#configuration","p":270},{"i":279,"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\" Multi-scrobbler requires only the read permission in order to monitor your activity.","s":"MPD (Music Player Daemon)","u":"/multi-scrobbler/configuration/sources/mpd/","h":"","p":278},{"i":281,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MPD_ID string A globally unique ID EX myComponentId MPD_NAME string Value of MPD_ID A vanity name EX My Cool Component MPD_ENABLE boolean true Should this component be used? MPD_URL string localhost:6600 URL:PORT of the MPD server to connect to MPD_PASSWORD string Password for the server, if set https://mpd.readthedocs.io/en/stable/user.html#permissions-and-passwords Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a mpd type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a mpd Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source mpd configs will validate correctly in the editor but both source and client mpd configs are allowed in the real CONFIG/mpd.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a mpd Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/mpd.json [ { \"enable\": true, \"id\": \"myMPD\", \"name\": \"Desktop\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the mpd type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a mpd Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a mpd Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"enable\": true, \"id\": \"myMPD\", \"name\": \"Desktop\", \"data\": { \"url\": \"192.168.0.100:6600\", \"password\": \"MY_PASSWORD\" }, \"options\": { \"disableDiscovery\": false }, \"type\": \"mpd\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpd/","h":"#configuration","p":278},{"i":283,"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":282},{"i":285,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MC_ID string A globally unique ID EX myComponentId MC_NAME string Value of MC_ID A vanity name EX My Cool Component MC_ENABLE boolean true Should this component be used? MC_URL string ws://localhost:7905 URL of the Musikcube Websocket (Metadata) server to connect to MC_PASSWORD string Password set in Musikcube https://github.com/clangen/musikcube/wiki/remote-api-documentation Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a musikcube type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a musikcube Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source musikcube configs will validate correctly in the editor but both source and client musikcube configs are allowed in the real CONFIG/musikcube.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a musikcube Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/musikcube.json [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"Desktop\", \"id\": \"myMusikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the musikcube type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a musikcube Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a musikcube Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"type\": \"musikcube\", \"enable\": true, \"name\": \"Desktop\", \"id\": \"myMusikcube\", \"data\": { \"url\": \"ws://localhost:7905\", \"password\": \"MY_PASSWORD\" } } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/musikcube/","h":"#configuration","p":282},{"i":287,"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":286},{"i":289,"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":286},{"i":291,"t":"See the Rocksky (Client) configuration for general setup. The only difference for Source configuration: File/AIO config must include \"configureAs\": \"source\" ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_ROCKSKY_ID string A globally unique ID EX myComponentId SOURCE_ROCKSKY_NAME string Value of SOURCE_ROCKSKY_ID A vanity name EX My Cool Component SOURCE_ROCKSKY_ENABLE boolean true Should this component be used? SOURCE_ROCKSKY_KEY string API Key generated from API Applications in Rocksky for your account SOURCE_ROCKSKY_HANDLE string The fully-qualified handle for your ATPRoto/Bluesky account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a rocksky type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a rocksky Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source rocksky configs will validate correctly in the editor but both source and client rocksky configs are allowed in the real CONFIG/rocksky.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a rocksky Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a rocksky Client config. This requirement does not apply to AIO rocksky configs. Config Example Mobile Experience This displays an example config file of a rocksky Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/rocksky.json [ { \"id\": \"myRockskySource\", \"name\": \"FoxxMD Rocksky Source\", \"configureAs\": \"source\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the rocksky type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a rocksky Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myRockskySource\", \"name\": \"FoxxMD Rocksky Source\", \"configureAs\": \"source\", \"data\": { \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaWQiOiJkaWQ6cGxjOng0NjVwZmtyeW5zaDZ...\", \"handle\": \"alice.bsky.social\" }, \"type\": \"rocksky\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/rocksky-source/","h":"#configuration","p":286},{"i":293,"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":292},{"i":295,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MPRIS_ID string A globally unique ID EX myComponentId MPRIS_NAME string Value of MPRIS_ID A vanity name EX My Cool Component MPRIS_ENABLE boolean true Should this component be used? MPRIS_BLACKLIST string DO NOT scrobble from any players that START WITH values from this comma-delimited list MPRIS_WHITELIST string ONLY scrobble from any players that START WITH values from this comma-delimited list Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a mpris type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a mpris Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source mpris configs will validate correctly in the editor but both source and client mpris configs are allowed in the real CONFIG/mpris.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a mpris Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/mpris.json [ { \"name\": \"Desktop\", \"id\": \"myMprisUbuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the mpris type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a mpris Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a mpris Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Desktop\", \"id\": \"myMprisUbuntu\", \"enable\": true, \"data\": { \"whitelist\": [ \"vlc\", \"mpd\" ], \"blacklist\": [ \"spotify\" ] }, \"type\": \"mpris\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/mpris/","h":"#configuration","p":292},{"i":297,"t":"Multi-scrobbler can use the Sonos local API to monitor what your Sonos system is playing. MS supports scrobbling simultaneous, different Plays based on what each Group/Zone is playing. Use Musicbrainz for better scrobbling For some services, including Spotify, Sonos only reports the first artist for a Track. You will most likely want to enable Musicbrainz scrobble enhancements so that your plays have correct information, including all artists, when scrobbled. Avoid Sonos activity through other Sources Activity reporting for other Sources does not work well when played through Sonos. If you have other Sources configured for Multi-Scrobbler that you may play through Sonos you should try to add Sonos to the \"deny\" list for that Source so that it does not try to monitor Sonos activity. Check the documentation for each individual Source to see how to configure this exclusion. For example, to prevent the Plex Source from monitoring audio played through Sonos, add Sonos to the \"block\" list ENV EX: PLEX_DEVICES_BLOCK=sonos How to report issues If your Sonos Source is logging errors or the scrobble data is not as expected please create a bug report after enabling the following debug logging options based on the config type you have: ENV File Enable Debug Mode using DEBUG_MODE=true Enable logPayload and logFitlerFailure in your sonos.json, or AIO file, config: [ { \"enable\": true, \"name\": \"MySonos\", \"data\": { \"host\": \"192.168.0.150\" }, \"options\": { \"logFilterFailure\": \"warn\", \"logPayload\": true } } ] Additional logging for the Sonos library may be enabled by including this environmental variable (regardless of config type): DEBUG=sonos:* The above changes: Triggers multi-scrobbler to log the raw data recieved from Sonos when a new track/device/service is seen for the first time Trigger multi-scrobbler to log the reason it considers a play from Sonos as invalid (and will not monitor it) Logs low-level activity from the Sonos library Please include these additional logs when creating a bug report. They are essential to troubleshooting your issue.","s":"Sonos","u":"/multi-scrobbler/configuration/sources/sonos/","h":"","p":296},{"i":299,"t":"The optional devices and groups related properties found in the config below can be used to include or exclude Sonos devices/groups by name, case-insensitive.","s":"Filtering Activity","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#filtering-activity","p":296},{"i":301,"t":"You must define the IP address of at least one Sonos/accessory in order for Multi-scrobbler to connect to your Sonos system. ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SONOS_ID string A globally unique ID EX myComponentId SONOS_NAME string Value of SONOS_ID A vanity name EX My Cool Component SONOS_ENABLE boolean true Should this component be used? SONOS_HOST string IP address of any connected Sonos speaker or device SONOS_DEVICES_ALLOW string Only scrobble if device name contains strings from this comma-delimited list SONOS_DEVICES_BLOCK string Do not scrobble if device name contains strings from this comma-delimited list SONOS_GROUPS_ALLOW string Only scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list SONOS_GROUPS_BLOCK string Do not scrobble if the name of a group the playing device belongs to contains strings from this comma-delimited list Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a sonos type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a sonos Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source sonos configs will validate correctly in the editor but both source and client sonos configs are allowed in the real CONFIG/sonos.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a sonos Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/sonos.json [ { \"enable\": true, \"id\": \"MySonos\", \"name\": \"Boom 2\", \"data\": { \"host\": \"192.168.0.150\", \"devicesAllow\": [ \"move\", \"beam\" ], \"devicesBlock\": [ \"roam\" ], \"groupsAllow\": [ \"family\" ], \"groupsBlock\": [ \"bedroom\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the sonos type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a sonos Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a sonos Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"enable\": true, \"id\": \"MySonos\", \"name\": \"Boom 2\", \"data\": { \"host\": \"192.168.0.150\", \"devicesAllow\": [ \"move\", \"beam\" ], \"devicesBlock\": [ \"roam\" ], \"groupsAllow\": [ \"family\" ], \"groupsBlock\": [ \"bedroom\" ] }, \"type\": \"sonos\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/sonos/","h":"#configuration","p":296},{"i":303,"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​ Premium Account Required Starting March 9th 2026 all applications on the Spotify Developer platform will only continue to work if they are owned by a Spotify Premium account. If your App is not created by a Premium account you will likely recieve a 403 error when trying to use MS with Spotify. If you do not have a Spotify Premium account you can still use Spotify with MS but it will require you to coordinate with a (friend?) user who does have Spotify Premium: Follow the steps below logged in as the Spotify Premium account user After completing App creation (step 4 or 5), navigate to the User Management page for the created App Add your (non-premium) account here using your account email/name Complete the rest of the authentication/configuration process normally Assure your friend: Creating a Spotify Developer app does not give anyone access to the owner's account. The authentication process within MS is where authorization is given: it requires clicking the link in MS's dashboard and following a separate auth flow. This auth flow only authorizes access to the specific account used in the flow, unrelated to the owner of the developer app. 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":302},{"i":305,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SPOTIFY_ID string A globally unique ID EX myComponentId SPOTIFY_NAME string Value of SPOTIFY_ID A vanity name EX My Cool Component SPOTIFY_ENABLE boolean true Should this component be used? SPOTIFY_CLIENT_ID string spotify client id SPOTIFY_CLIENT_SECRET string spotify client secret SPOTIFY_REDIRECT_URI string http://localhost:9078/callback spotify redirect URI -- required only if not the default shown here. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a spotify type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a spotify Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source spotify configs will validate correctly in the editor but both source and client spotify configs are allowed in the real CONFIG/spotify.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a spotify Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/spotify.json [ { \"id\": \"MySpotify\", \"name\": \"Foxx Spotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the spotify type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a spotify Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a spotify Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"MySpotify\", \"name\": \"Foxx Spotify\", \"enable\": true, \"clients\": [], \"data\": { \"clientId\": \"a89cba1569901a0671d5a9875fed4be1\", \"clientSecret\": \"ec42e09d5ae0ee0f0816ca151008412a\", \"redirectUri\": \"http://localhost:9078/callback\", \"interval\": 60 }, \"type\": \"spotify\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/spotify/","h":"#configuration","p":302},{"i":307,"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","s":"Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":309,"t":"In Plex, if the Plex Music Agent is set on a Music Library then Plex attempts to match your music with Musicbrainz when it is first imported. Plex uses ID3/metdata tags to match or falls back to matching based on file name and folder names. If it cannot find a match it can be fixed through a Fix Match option in the album/track context menu. See plex documentation for more information. You can verify if an Item has been matched by: Clicking on the Item context menu (...) Get Info View XML If a node like this is present then it has been matched: <Guid id=\"mbid://4e631558-13b0...\"/>","s":"Matching With Plex","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":311,"t":"The MBID from the above <Guid> node is a Track, a special type of ID that specifically identifies a song on a specific album. If this is present then Multi-scrobbler can use it to gaurantee your scrobble, and all its metadata, is matched 1:1 with what is in your Plex library when using the Musicbrainz Stage to enrich your scrobble. To configure MS to use Musicbrainz with your Plex metadata use one of the methods below: ENV File File AIO Add to your multi-scrobbler docker compose file environment section for Musicbrainz ENV Configuration: # a real email that Musicbrainz can use to contact you in case of issues - MB_CONTACT=myEmail@myEmailProvider.com - MB_PRESETS=id,default - PLEX_TRANSFORMS=musicbrainz Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { // a real email that Musicbrainz can use to contact you in case of issues \"contact\": \"myEmail@myEmailProvider.com\" } ] } } ] } In your File Config: plex.json [ { \"name\": \"MyPlex\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\" \"searchOrder\": [\"mbidrecording\", \"basicOrIds\", \"basic\"] } ] } } } ] Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { // a real email that Musicbrainz can use to contact you in case of issues \"contact\": \"myEmail@myEmailProvider.com\" } ] } } ] // ... \"sources\": [ // ... { \"name\": \"MyPlex\", \"type\": \"plex\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"searchOrder\": [\"mbidrecording\", \"basicOrIds\", \"basic\"] } ] } } } ] }","s":"Using Musicbrainz With Multi-Scrobbler","u":"/multi-scrobbler/configuration/sources/plex/","h":"","p":306},{"i":313,"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 service 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":312},{"i":315,"t":"Multi-Scrobbler supports the new Open Subsonic extension, Playback Report, that enables millisecond-accurate player position and state reporting. To use this new data, your Subsonic server must support the extension and the active playback Client must report it. The UI for your Subsonic Source and active Player will indicate support using contextual icons. Usage of Enhanced Playback Reporting is optional: MS will fallback to classic, less accurate Subsonic Now Playing when it is not available. Stale Players without Playback Reporting For Subsonic server/client combinations that do not support Enhanced Playback Reporting, multi-scrobbler will cleanup players that report they are playing for much longer period of time than the track's length (when length is reported). This prevents repeated scrobbles from Subsonic-compatible servers that continue returning a track after playback stops. If the server properly reports no playing song when playback has stopped or this causes issues for your setup, the detection can be disabled by setting detectStaleNowPlayingFromMinutesAgo to false in File/AIO config.","s":"Enhanced Playback Reporting","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#enhanced-playback-reporting","p":312},{"i":317,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SUBSONIC_ID string A globally unique ID EX myComponentId SUBSONIC_NAME string Value of SUBSONIC_ID A vanity name EX My Cool Component SUBSONIC_ENABLE boolean true Should this component be used? SUBSONIC_USER string Username to login to the server with SUBSONIC_PASSWORD string Password for the user to login to the server with SUBSONIC_URL string URL of the subsonic media server to query Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a subsonic type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a subsonic Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source subsonic configs will validate correctly in the editor but both source and client subsonic configs are allowed in the real CONFIG/subsonic.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a subsonic Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/subsonic.json [ { \"id\": \"mySubsonic\", \"name\": \"Airsonic Server\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ], \"detectStaleNowPlayingFromMinutesAgo\": true } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the subsonic type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a subsonic Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a subsonic Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"mySubsonic\", \"name\": \"Airsonic Server\", \"enable\": true, \"data\": { \"url\": \"http://localhost:4040/airsonic\", \"user\": \"yourUser\", \"password\": \"yourPassword\", \"usersAllow\": [ \"yourUser\" ], \"detectStaleNowPlayingFromMinutesAgo\": true }, \"type\": \"subsonic\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/subsonic/","h":"#configuration","p":312},{"i":319,"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":318},{"i":321,"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":318},{"i":323,"t":"See the teal.fm (Client) configuration for general setup. The main differences for Source configuration: File/AIO config must include \"configureAs\": \"source\"","s":"Configuration","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#configuration","p":318},{"i":325,"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 Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description SOURCE_TEALFM_ID string A globally unique ID EX myComponentId SOURCE_TEALFM_NAME string Value of SOURCE_TEALFM_ID A vanity name EX My Cool Component SOURCE_TEALFM_ENABLE boolean true Should this component be used? SOURCE_TEALFM_IDENTIFIER string Identify the account to login as SOURCE_TEALFM_APP_PW string The App Password you created for your account Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a tealfm type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a tealfm Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source tealfm configs will validate correctly in the editor but both source and client tealfm configs are allowed in the real CONFIG/tealfm.json After you finish editing, switch to text and then copy all text to get a completed config. configureAs Required When configuring a tealfm Source in a File Config you must set \"configureAs\": \"source\" Without this property, Multi-Scrobbler will assume the config is for a tealfm Client config. This requirement does not apply to AIO tealfm configs. Config Example Mobile Experience This displays an example config file of a tealfm Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/tealfm.json [ { \"id\": \"myTealSource\", \"name\": \"Foxx Teal Source\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the tealfm type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a tealfm Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myTealSource\", \"name\": \"Foxx Teal Source\", \"configureAs\": \"source\", \"data\": { \"identifier\": \"alice.bsky.social\", \"appPassword\": \"twog-phu7-4dhe-y4j3\", \"serviceAllow\": [ \"plyr\" ], \"serviceDeny\": [ \"last.fm\" ] }, \"type\": \"tealfm\" } ] }","s":"Service Filtering","u":"/multi-scrobbler/configuration/sources/tealfm-source/","h":"#service-filtering","p":318},{"i":327,"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":326},{"i":329,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description VLC_ID string A globally unique ID EX myComponentId VLC_NAME string Value of VLC_ID A vanity name EX My Cool Component VLC_ENABLE boolean true Should this component be used? VLC_URL string localhost:8080 URL:PORT of the VLC server to connect to VLC_PASSWORD string Password for the server Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a vlc type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a vlc Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source vlc configs will validate correctly in the editor but both source and client vlc configs are allowed in the real CONFIG/vlc.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a vlc Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/vlc.json [ { \"enable\": true, \"id\": \"myVlc\", \"name\": \"Desktop\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the vlc type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a vlc Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a vlc Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"enable\": true, \"id\": \"myVlc\", \"name\": \"Desktop\", \"data\": { \"url\": \"localhost:8080\", \"password\": \"changeme\" }, \"type\": \"vlc\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/vlc/","h":"#configuration","p":326},{"i":331,"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":330},{"i":333,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description MCAST_ID string A globally unique ID EX myComponentId MCAST_NAME string Value of MCAST_ID A vanity name EX My Cool Component MCAST_ENABLE boolean true Should this component be used? MCAST_URL string The host or URL of the YamahaExtendedControl endpoint to use Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a musiccast type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a musiccast Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source musiccast configs will validate correctly in the editor but both source and client musiccast configs are allowed in the real CONFIG/musiccast.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a musiccast Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/musiccast.json [ { \"name\": \"Livingroom Reciever\", \"id\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the musiccast type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a musiccast Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a musiccast Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"name\": \"Livingroom Reciever\", \"id\": \"myYamaha\", \"enable\": true, \"data\": { \"url\": \"192.168.0.101\" }, \"type\": \"musiccast\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/yamaha-musiccast/","h":"#configuration","p":330},{"i":335,"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":334},{"i":337,"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":334},{"i":339,"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":334},{"i":341,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description WS_ID string A globally unique ID EX myComponentId WS_NAME string Value of WS_ID A vanity name EX My Cool Component WS_ENABLE boolean true Should this component be used? WS_BLACKLIST string Block scrobbling from specific WebScrobbler Connectors WS_WHITELIST string Only allow scrobbling from specific WebScrobbler Connectors Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a webscrobbler type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a webscrobbler Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source webscrobbler configs will validate correctly in the editor but both source and client webscrobbler configs are allowed in the real CONFIG/webscrobbler.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a webscrobbler Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/webscrobbler.json [ { \"id\": \"MyWebScrobbler\", \"name\": \"Firefox Laptop\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the webscrobbler type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a webscrobbler Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a webscrobbler Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"MyWebScrobbler\", \"name\": \"Firefox Laptop\", \"data\": { \"slug\": \"MyOptionalSlug\", \"whitelist\": [], \"blacklist\": [] }, \"type\": \"webscrobbler\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/webscrobbler/","h":"#configuration","p":334},{"i":343,"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":342},{"i":345,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description YTM_ID string A globally unique ID EX myComponentId YTM_NAME string Value of YTM_ID A vanity name EX My Cool Component YTM_ENABLE boolean true Should this component be used? YTM_REDIRECT_URI string Google Cloud Console project OAuth Client Authorized redirect URI YTM_CLIENT_ID string Google Cloud Console project OAuth Client ID YTM_CLIENT_SECRET string Google Cloud Console project OAuth Client Secret YTM_COOKIE string The cookie retrieved from the Request Headers of music.youtube.com after logging in. Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a ytmusic type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a ytmusic Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source ytmusic configs will validate correctly in the editor but both source and client ytmusic configs are allowed in the real CONFIG/ytmusic.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a ytmusic Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/ytmusic.json [ { \"id\": \"myYtMusic\", \"name\": \"Foxx YT Music\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the ytmusic type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a ytmusic Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a ytmusic Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myYtMusic\", \"name\": \"Foxx YT Music\", \"enable\": true, \"clients\": [], \"data\": { \"cookie\": \"__Secure-1PSIDTS=sidts-CjEB3EgAEvCd-......\", \"clientId\": \"891098404....apps.googleusercontent.com\", \"clientSecret\": \"GOCS...\" }, \"options\": { \"logDiff\": true }, \"type\": \"ytmusic\" } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/youtube-music/","h":"#configuration","p":342},{"i":347,"t":"Monitor your Yandex Music listening activity in real-time. This Source requires a third party docker container to communicate with Yandex Music, yandex-music-bridge. Example Docker Compose with yandex-music-bridge ~/msData/docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # ...your other sources/clients here # add for yandex music - YMBRIDGE_URL=http://yandex-music-bridge:9980 - YMBRIDGE_API_KEY=change-me volumes: - \"./config:/config\" ports: - \"9078:9078\" restart: unless-stopped yandex-music-bridge: image: ghcr.io/druidblack/yandex-music-bridge:latest environment: - TZ=Europe/Moscow - YM_TOKEN=AgAAAAACO3_345345 - YM_API_KEY=change-me - YM_PORT=9980 - YM_LANGUAGE=ru - YM_ENABLE_YNISON=true - YM_PUSH_TTL=45 - YM_QUEUE_CACHE_TTL=15 - YM_LOG_LEVEL=INFO ports: - \"9980:9980\" restart: unless-stopped You will need to acquire your own token for YM_TOKEN used in yandex-music-bridge using the instructions provided there. Need Help? If your issue is specifically related to yandex-music-bridge (errors in the container, usage instructions, general Yandex setup like token etc...) please open an issue on that repository instead of Multi-Scrobbler's. If you have issues specifically with the MS Source please mention Druidblack (@Druidblack) when opening an issue or discussion. Yandex Music is not available in the country of the main Multi-Scrobbler developer (FoxxMD) so they can only help troubleshooting general MS issues related to Yandex Music.","s":"Yandex Music","u":"/multi-scrobbler/configuration/sources/yandex-music/","h":"","p":346},{"i":349,"t":"ENV File AIO Configuration Type This is configuration for the ENV Config Type. Environmental Variable Type Default Description YMBRIDGE_ID string A globally unique ID EX myComponentId YMBRIDGE_NAME string Value of YMBRIDGE_ID A vanity name EX My Cool Component YMBRIDGE_ENABLE boolean true Should this component be used? YMBRIDGE_URL string URL of the local Python bridge, for example http://yandex-music-bridge:9980 YMBRIDGE_API_KEY string Optional API key sent as X-API-Key to the bridge Bold/Italic = Required Config Structure This displays the structure of the File Configuration for a ymbridge type Source with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Loading ... Config Example This displays an example config file of a ymbridge Source File Configuration that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuration is correct. Any errors show up as squiggly lines. important Only source ymbridge configs will validate correctly in the editor but both source and client ymbridge configs are allowed in the real CONFIG/ymbridge.json After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a ymbridge Source File Configuration that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/ymbridge.json [ { \"id\": \"myYandex\", \"name\": \"Yandex Music\", \"type\": \"ymbridge\", \"data\": { \"url\": \"http://192.168.1.161:9980\", \"apiKey\": \"change-me\", \"interval\": 3 } } ] Config Structure This displays the structure of the all-in-one (config.json) configuration with all possible properties, their shape, and descriptions/types. Use this to understand how to write a valid config. Select the ymbridge type from the respective sources node below, then expand it. Loading ... Config Example This displays an example config file of a all-in-one (config.json) configuration that includes a ymbridge Source that adheres to the shown Config Structure. text mode lets you edit the JSON directly. tree mode gives you a guided point-and-click editing experience that always keeps the JSON syntax valid. Both modes validate that the configuraion is correct. Any errors show up as squiggly lines. After you finish editing, switch to text and then copy all text to get a completed config. Config Example Mobile Experience This displays an example config file of a all-in-one (config.json) configuration that includes a ymbridge Source that adheres to the shown Config Structure. The example config file editor is meant for a larger screen experience so only the read-only example is shown. Please use this site on a tablet/laptop/desktop to enable file editor features. CONFIG/config.json { \"sources\": [ { \"id\": \"myYandex\", \"name\": \"Yandex Music\", \"type\": \"ymbridge\", \"data\": { \"url\": \"http://192.168.1.161:9980\", \"apiKey\": \"change-me\", \"interval\": 3 } } ] }","s":"Configuration","u":"/multi-scrobbler/configuration/sources/yandex-music/","h":"#configuration","p":346},{"i":351,"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":350},{"i":353,"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":350},{"i":355,"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":"Lifecycle Hooks","u":"/multi-scrobbler/configuration/transforms/","h":"#lifecycle-hooks","p":350},{"i":357,"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":350},{"i":359,"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":350},{"i":361,"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":350},{"i":363,"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":350},{"i":365,"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":350},{"i":367,"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":350},{"i":369,"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":350},{"i":372,"t":"MS uses caching to reduce the number of API calls needed for stages like Musicbrainz and to speed up all transforms by caching steps and results. However, the default caching strategy uses a small cache size and very short TTLs because it is in-memory. If you are using any Transform stages you should configure secondary caching to increase the cache size and lifetime of cached items. This will also reduce memory usage in MS.","s":"Caching","u":"/multi-scrobbler/configuration/transforms/","h":"#caching","p":350},{"i":374,"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":350},{"i":376,"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":375},{"i":378,"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":375},{"i":380,"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":375},{"i":382,"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":375},{"i":384,"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":375},{"i":387,"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":375},{"i":389,"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":375},{"i":391,"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":375},{"i":393,"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":392},{"i":395,"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\", \"title\": [ // removes badterm from track title \"badterm\" ] } ] } } } ]","s":"Configuration","u":"/multi-scrobbler/configuration/transforms/user/","h":"#configuration","p":392},{"i":397,"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":392},{"i":399,"t":"Each Rule must be an array of search-and-replace expressions: lastfm.json [ { \"name\": \"myLastFm\", \"configureAs\": \"source\", \"data\": { // ... }, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"user\", \"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":392},{"i":402,"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 { \"type\": \"user\", \"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":392},{"i":404,"t":"Removes the phrase (Album Version) from the Title of a Play Example { \"type\": \"user\", \"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":392},{"i":406,"t":"Example { \"compare\": { \"candidate\": { \"type\": \"user\", \"title\": [ \"/(\\(.+\\))\\s*$/\" ] }, \"existing\": { \"type\": \"user\", \"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":392},{"i":408,"t":"Example { \"type\": \"user\", \"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":392},{"i":410,"t":"Example { \"type\": \"user\", \"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":392},{"i":412,"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 { \"type\": \"user\", \"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":392},{"i":415,"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":413},{"i":417,"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":413},{"i":419,"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":413},{"i":421,"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":413},{"i":423,"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":413},{"i":425,"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":413},{"i":427,"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":413},{"i":429,"t":"Source Development and Tutorial Client Development and Tutorial (TBD)","s":"Creating Clients and Sources","u":"/multi-scrobbler/development/dev-common/","h":"#creating-clients-and-sources","p":413},{"i":431,"t":"Run tsx with inspect args NODE_ENV=production node node_modules/.bin/tsx --inspect --heap-prof src/backend/index.ts Use chrome://inspect from a chromium-based browser and attach to the running process, usually localhost:9229 From the opened DevTools window use Performance or Memory to profile the running process.","s":"Profiling","u":"/multi-scrobbler/development/dev-common/","h":"#profiling","p":413},{"i":435,"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":432},{"i":437,"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":432},{"i":439,"t":"These are errors indicating a network issue is occuring between you and the Source/Client. ECONNRESET means the upstream service unexpectedly closed the connection ETIMEDOUT means the upstream service did not respond to a request MS ENOTFOUND means that MS could not find a DNS record for the domain of the upstream service EAI_AGAIN means that a DNS server did not respond to MS's request to lookup the record for a domain ECONNRESET and timeout issues can occur when you have a poor connection or if the upstream service is overloaded or is generally not behaving well. This is a common occurrence for Listenbrainz/Musicbrainz related requests. Please check the Upstream Services Status Page to independently verify if the service is misbehaving. If the service is up and has good uptime then the issue may be in your network. ENOTFOUND and EAI_AGAIN and generally caused by DNS caching (stale records) or misbehaving DNS servers. Though this can happen at the upstream service's end, it is usually an issue in your network. If you run a Pihole, AdGaurd, or other DNS solution try flushing the cache for the mishaving domain and check that your DNS application is working correctly.","s":"I get errors with ECONNRESET ETIMEDOUT ENOTFOUND EAI_AGAIN","u":"/multi-scrobbler/FAQ/","h":"#i-get-errors-with-econnreset-etimedout-enotfound-eai_again","p":432},{"i":441,"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":432},{"i":444,"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":432},{"i":447,"t":"Multi-scrobbler has a robust duplicate scrobble detection system that should handle this for you in the majority of usecases. If you have a simple setup without any circular dependencies then you are already protected against duplicates. If your scenario is more complex or you have a service(s) acting as both a Client and Source you should refer to the Duplicate Scrobble Guidance page to determine if you can avoid a configuration that may result in duplicate scrobbles.","s":"How do I prevent duplicate scrobbles?","u":"/multi-scrobbler/FAQ/","h":"#how-do-i-prevent-duplicate-scrobbles","p":432},{"i":449,"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":432},{"i":451,"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":432},{"i":453,"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":432},{"i":455,"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":432},{"i":457,"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":432},{"i":459,"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":458},{"i":461,"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":458},{"i":463,"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":458},{"i":466,"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":458},{"i":468,"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":458},{"i":470,"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":458},{"i":472,"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":458},{"i":474,"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":458},{"i":476,"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":458},{"i":479,"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":458},{"i":481,"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":458},{"i":483,"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":458},{"i":486,"t":"You should setup metadata caching to reduce API calls, improve transform performance, and reduce memory usage when using this stage.","s":"Caching","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#caching","p":458},{"i":488,"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":458},{"i":490,"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":458},{"i":492,"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":458},{"i":494,"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":458},{"i":496,"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":458},{"i":499,"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":458},{"i":501,"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":458},{"i":503,"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":458},{"i":505,"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":458},{"i":507,"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":458},{"i":509,"t":"The Discord Client can fetch album art images from Cover Art Archive if the Scrobble data contains a Release MBID. Use the Musicbrainz Stage on the preCompare hook for your Discord client so that missing Musicbrainz IDs are populated for this functionality. Example ENV File AIO Using the ENV Configuration from above, add these fields to your docker compose environment: - MB_CONTACT=contact@mydomain.com - MB_PRESETS=id,native,sensible - DISCORD_TRANSFORMS=musicbrainz Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { // sensible defaults \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"searchArtistMethod\": \"native\", \"searchOrder\": [\"isrc\",\"basic\", \"artist\"] } } ] } In your Discord File Config: discord.json [ { \"name\": \"MS\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", } ] } } } ] Your AIO Config: config.json { // ... \"transformers\": [ { \"type\": \"musicbrainz\", \"name\": \"MyMB\", \"data\": { \"apis\": [ { \"contact\": \"contact@mydomain.com\" } ] }, \"defaults\": { // sensible defaults \"releaseStatusPriority\": [\"official\"], \"releaseGroupPrimaryTypePriority\": [\"album\", \"single\", \"ep\"], \"releaseCountryPriority\": [\"XW\"], \"searchArtistMethod\": \"native\", \"searchOrder\": [\"isrc\",\"basic\", \"artist\"] } } ], \"sources\": [ { \"name\": \"MS\", \"type\": \"discord\", \"data\": { /* ... */}, \"options\": { \"playTransform\": { \"preCompare\": [ { \"type\": \"musicbrainz\", } ] } } } ] }","s":"Use Metadata for Discord Album Art","u":"/multi-scrobbler/configuration/transforms/musicbrainz/","h":"#use-metadata-for-discord-album-art","p":458},{"i":513,"t":"Multi-scrobbeler has a real-time log shown in the dashboard. These are the same logs you would find in docker logs. In the dashboard, logs can be filtered by LEVELS to give you a better view of errors/warnings. When creating an issue please include all logs at the lowest level possible (DEBUG) to help provide context for your issue. You should try to include logs that occurred before and after your issue/error occurs as this can help determine if MS was behaving normally.","s":"Logs","u":"/multi-scrobbler/help/","h":"#logs","p":510},{"i":515,"t":"If possible, turn on Debug Mode and replicate your issue. Debug Mode enables much more logging that can reveal additional data for troubleshooting. This mode will make your logs very noisy, though, so it's recommended to turn it off after collecting logs.","s":"Debug Mode","u":"/multi-scrobbler/help/","h":"#debug-mode","p":510},{"i":517,"t":"From the dashboard, each Source/Client has a few details page links: Opening the details page for the Source/Client reveals a lists all of the Plays that were discovered (Sources) or scrobbled (Clients). Click on the Debug icon to copy debugging data relevant to that Play. This data should be included in any issue you create. To include this data in an issue either paste the copied data into a text file and save as debugdata.json, attaching to the issue. Or directly paste the copied data into an issue/comment using fenced code blocks markdown to preserve the structure like: This is the contents of my comment/issue text on github. I am explaining my issue here. Here is the debug data: ```json { \"input\": { \"aProperty: 123, \"foo\": \"bar\" } } ``` Thank you for your time.","s":"Copy Play Debug Data","u":"/multi-scrobbler/help/","h":"#copy-play-debug-data","p":510},{"i":520,"t":"Check the FAQ to see if your issue is a known issue or a commonly-experienced issue with Multi-Scrobbler. The FAQ also includes fixes or ways to help troubleshoot these common issues.","s":"FAQ","u":"/multi-scrobbler/help/","h":"#faq","p":510},{"i":522,"t":"On the github repository for Multi-Scrobbler, search existing issues and discussions to see if anyone else has had this issue and if it has already been solved.","s":"Existing Issues","u":"/multi-scrobbler/help/","h":"#existing-issues","p":510},{"i":524,"t":"Before reporting an issue please consider: If this a how-do-I question, troublehooting, or generally not a bug/error with multi-scrobbler please consider starting a discussion instead of opening an issue If you want to request new functionality use the Feature Request issue template If you want to request a new Source/Client implementation use the New Source/Client issue template If none of the above apply to you then create a new bug report. Please include all logs and play debug data relevant to your issue. The more logs the better. If possible, replicate the issue with debug mode turned on.","s":"Reporting an Issue","u":"/multi-scrobbler/help/","h":"#reporting-an-issue","p":510},{"i":528,"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":525},{"i":530,"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":525},{"i":533,"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":525},{"i":535,"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":525},{"i":537,"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":525},{"i":539,"t":"tip For the difference between ENV and File examples in this document see Configuration Types.","s":"Overview","u":"/multi-scrobbler/installation/","h":"","p":538},{"i":541,"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","s":"Docker","u":"/multi-scrobbler/installation/","h":"#docker","p":538},{"i":543,"t":"Storage Networking Base URL Timezone Linux Host Read Only Caching You should bind a host directory into the container for storing configurations, credentials, database, and other files. Otherwise, these will be lost when the container is updated. docker-compose.yml services: multi-scrobbler: # ... volumes: - \"./config:/config\" Optionally, use a separate directory for data (database, cache, etc...) by mounting an additional directory and setting the DATA_DIR ENV to the directory that should be used inside the container: docker-compose.yml services: multi-scrobbler: # ... environment: # ... - DATA_DIR=/msData volumes: - \"./config:/config\" # used for config files - \"./my/host/folder:/msData\" # used for data files 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. docker-compose.yml services: multi-scrobbler: # ... ports: - \"9078:9078\" 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) docker-compose.yml services: multi-scrobbler: # ... environment: - BASE_URL=http://hostMachineIP Set the timezone for the container using the environmental variable TZ. docker-compose.yml services: multi-scrobbler: # ... environment: # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - TZ=America/New_York If you are running this container with Docker on a Linux Host you should specify user:group permissions of the user who owns the configuration and data directories 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 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 Optionally, add a Valkey service to your stack for secondary caching to take advantage of faster performance, reduced memory usage, and cached api calls to external services. docker-compose.yml services: multi-scrobbler: image: foxxmd/multi-scrobbler # ... environment: # ... CACHE_VALKEY=redis://valkey:6379 # ... valkey: image: valkey/valkey volumes: - valkeydata:/data volumes: valkeydata: driver: local","s":"Recommended Settings","u":"/multi-scrobbler/installation/","h":"#recommended-settings","p":538},{"i":545,"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 Optional caching using valkey (after uncommenting) 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 # uncomment along with valkey service/volume below for better caching #- CACHE_VALKEY=redis://valkey:6379 volumes: - ./config:/config ports: - 9078:9078 restart: unless-stopped #valkey: # image: valkey/valkey # volumes: # - valkeydata:/data #volumes: # valkeydata: # driver: local","s":"Docker Usage Example","u":"/multi-scrobbler/installation/","h":"#docker-usage-example","p":538},{"i":547,"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":538},{"i":549,"t":"Clone this repository somewhere using the latest git tag and then install from the working directory. git clone --branch <LATEST_RELEASE_TAG> 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 Config And Data Directories​ The directories MS uses for Configuration (config.json, jellyfin.json, etc...) and Data (database, cache, etc...) can be specified by environmental variables passed directly to npm/node, or set in an .env file in the working directory. When parsing these ENVs MS will resolve relative directories but not bash expansions like ~ for home. Examples: CONFIG_DIR=/my/absolute/path => sets directory to use for config files DATA_DIR=./relative/data => sets directory relative to working directory for data files If you do not set these environmental variables then MS will attempt to use OS-standardized directories: Linux MacOS Windows Config => $XDG_CONFIG_HOME/multi-scrobbler or ~/.config/multi-scrobbler Data => $XDG_DATA_HOME/multi-scrobbler or ~/.local/share/multi-scrobbler Config => ~/Library/Preferences/multi-scrobbler Data => ~/Library/Application Support/multi-scrobbler Config => %APPDATA%\\multi-scrobbler\\Config Data => %LOCALAPPDATA%\\multi-scrobbler\\Data 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":538},{"i":551,"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":538},{"i":553,"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":552},{"i":555,"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":552},{"i":557,"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 - JELLYFIN_ID=myJellyin 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 - SPOTIFY_ID=mySpotify 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 - LZE_ID=navidromeLZ 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 - PLEX_ID=myPlex # 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. Add these values to the environment section in the docker-compose.yml you created. ~/msData/docker-compose.yml - SOURCE_LASTFM_API_KEY=MY_API_KEY_PLACEDHOLDER - SOURCE_LASTFM_SECRET=MY_SECRET_PLACEHOLDER - SOURCE_LASTFM_REDIRECT_URI=http://192.168.0.100:9078/lastfm/callback - SOURCE_LASTFM_ID=myLFMSource 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":552},{"i":559,"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 # isrc => then tries basic text fields => then tries extracted artists - MB_PRESETS=default,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":552},{"i":561,"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 # isrc => then tries basic text fields => then tries extracted artists - MB_PRESETS=default,sensible,native Presets are found here.","s":"Configure Musicbrainz API","u":"/multi-scrobbler/quickstart/","h":"","p":552},{"i":563,"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":552},{"i":565,"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. Koito Last.fm Maloja 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 - KOITO_ID=myKoito tip For Koito versions <=0.1.7, you must have the environment variable KOITO_ALLOWED_HOSTS set correctly in your Koito environment/container. Ensure it is set to the IP address or domain name that you use to access Koito with e.g. koito.mydomain.com. 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 - LASTFM_ID=myLfmClient 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 - MALOJA_ID=myMaloja","s":"Setup Clients","u":"/multi-scrobbler/quickstart/","h":"#setup-clients","p":552},{"i":567,"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":552},{"i":569,"t":"See more advanced docker options as well as other install methods in the Installation docs Setup secondary caching with valkey for increased performance and reduced memory usage 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":552},{"i":571,"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":570},{"i":573,"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":570},{"i":575,"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":570},{"i":577,"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":570},{"i":579,"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":578},{"i":581,"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":578},{"i":584,"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":578},{"i":586,"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":578},{"i":588,"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":578},{"i":590,"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":578},{"i":592,"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":578},{"i":594,"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":578},{"i":597,"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":578},{"i":599,"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":578},{"i":602,"t":"The majority of Multi-scrobbler updates can be completed without any manual intervention. This is guaranteed for patch version updates. Regardless, it is recommended to consult the Github Release Notes before any upgrades. The release notes contain all changelogs as well as most breaking changes/notices. The Upgrade Path docs contain information for upgrading through required versions or in-depth migration guides. Check this section before upgrading any minor versions.","s":"Updating","u":"/multi-scrobbler/updating/","h":"#updating","p":600},{"i":604,"t":"Multi-scrobbler depends on a SQLite database (ms.db) that is created on first run and stored in the CONFIG_DIR. If any database migrations are required for an update then your database is automatically backed up before migration occurs. The backup file is created in the same directory. You can manually make a backup of this database by making a copy of ms.db and any similarly named files like ms.db-journal. tip If upgrading a minor version you may want to make a backup for extra safety.","s":"Database","u":"/multi-scrobbler/updating/","h":"#database","p":600},{"i":606,"t":"Minor versions may have breaking changes related to configuration. Consult the Github Release Notes and Upgrade Paths before upgrading.","s":"Configuration","u":"/multi-scrobbler/updating/","h":"#configuration","p":600},{"i":608,"t":"Assuming: upgrade(s) are only patch versions and the Release Notes do not contain any other guidance or you have checked the release notes, upgrade paths docs, and completed all migration steps for the specific version upgrade Docker Compose local docker compose pull docker compose up -d Assuming the repository was used for initial installation with git clone, update by pulling the latest commit: git pull and restart multi-scrobbler.","s":"Update Instructions","u":"/multi-scrobbler/updating/","h":"#update-instructions","p":600},{"i":610,"t":"Multi-scrobbler versioning uses semver without a major version (for now): Minor version bumps (0.12.2 => 0.13.0) may have breaking changes or include major new behavior Patch version bumps (0.12.2 => 0.12.3) may have new behavior or fix bugs, but have no breaking changes. These can be safely upgraded unattended. Check the Github Release Notes for breaking changes, changelogs, and any migration steps required between minor versions.","s":"Versioning","u":"/multi-scrobbler/updating/","h":"#versioning","p":600},{"i":612,"t":"The default master branch is not stable. The goal is to have it be functional bleeding-edge development with non-functioning development isolated to pull requests and other branches. For a stable release use the latest git tag EX: git clone --branch 0.13.0 https://github.com/FoxxMD/multi-scrobbler.git","s":"Git","u":"/multi-scrobbler/updating/","h":"#git","p":600},{"i":614,"t":"Docker image tags use this pattern: :latest is the latest stable release IE If the latest released version was 0.13.0 then :latest is also 0.13.0 :latest will always be the latest release. Before pulling a new image you should check if the version bump has breaking changes. :edge is built automatically from the master branch Pinned semver tags are published alongside releases EX :0.12.2 Additionally, Pull Requests may have docker images published with tags like :pr-521. These are not guaranteed to be stable and should only be used for testing.","s":"Docker","u":"/multi-scrobbler/updating/","h":"#docker","p":600},{"i":616,"t":"The current version of Multi-Scrobbler can be found in several places: Open the Web Dashboard, the version is displayed next the Multi-Scrobbler logo in the top left corner On startup the version is immediately printed to logs EX: [2026-04-16 09:17:32.428 -0400] INFO : [Init] Version: 0.13.0 Checking the running docker container or image for the org.opencontainers.image.version label When running MS from a non-pinned source (like :edge tag, a pull request, or git branch) the version will be shown as the branch name and short commit hash EX master-1c78da79 tip Using the above information you can verify if you have pulled and successfully recreated a docker container with a new version. If the version string does not change from the previous version running then you are still running the old container","s":"What Version Am I Using?","u":"/multi-scrobbler/updating/","h":"#what-version-am-i-using","p":600},{"i":618,"t":"The majority of changes are detailed in Github Release Notes, including most breaking changes. You should consult the release notes for each version you will be updating through/to. Upgrade paths for specific version, detailed here, are reserved for: Required Upgrades In Depth Upgrades Required Upgrade Versions you must upgrade to before upgrading to a newer version. Likely due to the codebase containing functionality to upgrade persistent data that cannot be migrating across multiple versions. Optional Upgrade (Breaking) Changes to configuration/data that require more detail or formatting than is feasible in Github release notes. These upgrades may be skipped. The type of upgrade is shown at the top of each page with the same colored callout shown above.","s":"Upgrade Path","u":"/multi-scrobbler/updating/upgrade-path/","h":"","p":617},{"i":621,"t":"MS 0.14.0 introduces a database for persisting Plays/Scrobbles, queues, and other data associated with a Source/Client. To make this association atomic a Source/Client ID is now configurable. This ID is what MS will use to identify the Source/Client in your config with the Source/Client in the database. This ID needs to be unique to the client or source type it is used on IE: two Koito Clients cannot both have the ID myKoitoID it is recommended that the ID be globally unique among all sources/clients, but it's not required","s":"Source/Client IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#sourceclient-ids","p":619},{"i":623,"t":"ENV File AIO For each Source/Client in your environmental variables, add a key with the suffix _ID and the ID value. EX compose.yaml services: multi-scrobbler: # ... environment: - KOTIO_TOKEN=... # ...more koito config - KOITO_ID=myKoitoID - JELLYFIN_URL=... # ...more jellyin config - JELLYFIN_ID=myJellyfinID Add an id to the top-level for each Source/Client configuration, next to data: koito.json [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"id\": \"myKoitoID\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] Add an id to the top-level for each Source/Client configuration, next to data: config.json { \"sources\": [ { \"name\": \"koito-source\", \"configureAs\": \"source\", \"type\": \"koito\", \"id\": \"myKoitoID\", \"data\": { \"token\": \"029b081ba-9156-4pe7-88e5-3be671f5ea2b\", \"username\": \"admin\", \"url\": \"http://192.168.0.100:4110\" } } ] } Default ID In 0.14.0, If you do not add an ID then Multi-Scrobbler will automatically use the name of the Source/Client as the ID. The name is shown in the Dashboard. If you decide to add an ID later, you must use the Source/Client name as the ID in order to keep Plays/Scobbles associated with the same config. In 0.16.0+ you are required to have an ID or a configuration error is thrown.","s":"Configuring IDs","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#configuring-ids","p":619},{"i":625,"t":"tip Before upgrading, if your MS dashboard shows 0 queued/failed for all Scrobble Clients then you can ignore this section. important The cached scrobbles for a Client/Source were based on its name. If you plan on changing the name of a Client/Source with this upgrade you should do it after this migration has run or else MS will not be able to find any associated cached scrobbles. MS 0.14.0 introduces a database for persisting Plays/Scrobbles, queues, and other data. Prior to 0.14.0, queued/failed scrobbles were stored in a cache file inside your CONFIG_DIR named ms-scrobble.cache. When a Client is created and enabled in 0.14.0 it will attempt to automatically migrate scrobbles from this cache into the database. You can see progress/results for this process by filtering logs for [Cached Scrobble Migration] If the process fails MS will attempt to migrate failed scrobbles, again, the next time it is started Your cached scrobbles are not deleted in either the success or failure outcome If the process succeeds then MS knows to ignore the cache on subsequent startups note This process only occurs for Clients that are enabled. If you are using ENV for config then your Clients are automatically enabled If you are using File/AIO make sure that the enable property is either true or not present in your Client configs Even if your Client does not start successfully (EX due to authentication) you should still enable and start all Clients in order to get all scrobbled migrated.","s":"Cached Scrobble Migration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cached-scrobble-migration","p":619},{"i":627,"t":"In 0.14.0 Cache has been simplified with much of the required configuration being removed. tip This only applies to users who have cache in their AIO Config config.json or are using CACHE_* ENV Config If you do not have any of the above Cache configuration defined then you can ignore this section. Scrobble Caching Removed​ Scrobble caching has removed and replaced by the new database. Remove any ENV Config starting with CACHE_SCROBBLE Remove cache.scrobble from the AIO Config Metadata Config Simplified​ Metadata caching remains the same but the config has been simplified. If you were using Valkey for caching update your config: ENV AIO Remove CACHE_METADATA Rename CACHE_METADATA_CONN to CACHE_VALKEY Remove cache.metadata and add a new string key valkey to the cache object, containing your valkey connection string: \"cache\": { + \"valkey\": \"redis://valkey:6379\" - \"metadata\": { - \"provider\": \"valkey\", - \"connection\": \"redis://valkey:6379\" - } } Auth Config Simplified​ Auth caching remains the same but the config has been simplified. The connection option for Auth is no longer configurable. You may specify provider as either file (default, uses CONFIG_DIR) or valkey. If you want to use Valkey for auth it will use the same config as Metadata. ENV AIO Remove CACHE_AUTH_CONN Add CACHE_VALKEY (if using valkey) Remove the connection property from the auth object. If using file the entire auth object can be removed. \"cache\": { + \"valkey\": \"redis://valkey:6379\", \"auth\": { \"provider\": \"valkey\", - \"connection\": \"redis://valkey:6379\" } }","s":"Cache Configuration","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#cache-configuration","p":619},{"i":629,"t":"In an effort to standard ENV prefixes some ENV keys have been renamed: LZENDPOINT_ENABLE => LZE_ENABLE LFMENDPOINT_ENABLE => LFM_ENABLE","s":"Renamed ENV Keys","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#renamed-env-keys","p":619},{"i":631,"t":"In the MS Dashboard, prior to 0.14.0, UI Client/Sources configured with ENV Config always had generated names like unnamed-koito. ENV Config Clients/Sources can now be configured with a name by using the _NAME suffix, example: compose.yaml services: multi-scrobbler: # ... environment: - KOTIO_TOKEN=... # ... - KOITO_ID=myKoitoID - KOITO_NAME=Koito A - JELLYFIN_URL=... # .. - JELLYFIN_ID=myJellyfinID - JELLYFIN_NAME=Foxx Jelly important If you have cached scrobbles make sure to upgrade and run Cached Scrobble Migration before adding names to Client/Sources.","s":"(Optional) ENV Client/Source Names","u":"/multi-scrobbler/updating/upgrade-path/0140/","h":"#optional-env-clientsource-names","p":619},{"i":633,"t":"A dockerized app that monitors your music listening activity from everywhere and scrobbles it anywhere. Supports monitoring activity from many Sources Apple Music 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 Music Assistant Plex Rocksky Sonos Spotify Subsonic-compatible APIs (like Airsonic and Navidrome) teal.fm WebScrobbler VLC Yamaha MusicCast Yandex Music Youtube Music Supports scrobbling to many Clients Discord (Now Playing) 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 New UI Preview A full rewrite of the UI is now available for preview. The new UI modernizes Multi-Scrobbler and gives you in depth insight into how your scrobbles are handled end-to-end. To try out the stable-release preview navigate to http://yourMSDomain:9078/next Or to try out the latest preview snapshot see the docker image pinned in this comment. 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":632},{"i":635,"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. Diagram","s":"How Does multi-scrobbler (MS) Work?","u":"/multi-scrobbler/","h":"#how-does-multi-scrobbler-ms-work","p":632},{"i":637,"t":"A Source is a data source that contains information about music you are playing or have listened to, such as: 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":632},{"i":639,"t":"A Client is an application that stores the historical information about what music you have played (scrobbles). Examples are Koito, 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":632},{"i":641,"t":"See the Quick Start Guide","s":"Quick Start","u":"/multi-scrobbler/","h":"#quick-start","p":632},{"i":643,"t":"See the Installation documentation","s":"Installation","u":"/multi-scrobbler/","h":"#installation","p":632},{"i":645,"t":"See the Configuration documentation","s":"Configuration","u":"/multi-scrobbler/","h":"#configuration","p":632},{"i":647,"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":632},{"i":649,"t":"Having issues with connections or configuration? Check the FAQ before creating an issue!","s":"Help/FAQ","u":"/multi-scrobbler/","h":"#helpfaq","p":632},{"i":651,"t":"Detailed architecture and development guides for Sources/Clients","s":"Development","u":"/multi-scrobbler/","h":"#development","p":632},{"i":653,"t":"MIT","s":"License","u":"/multi-scrobbler/","h":"#license","p":632}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/2",[0,4.332,1,3.533,2,6.147,3,3.403,4,1.007]],["t/4",[0,1.832,4,1.144,5,0.749,6,1.089,7,0.536,8,2.011,9,1.43,10,2.351,11,3.645,12,2.012,13,2.276,14,1.757,15,1.986,16,1.621,17,1.866,18,3.695,19,1.764,20,1.673,21,0.753,22,0.855,23,1.545,24,2.213,25,2.445,26,1.405,27,2.213,28,1.755,29,1.148,30,1.108,31,1.317,32,1.037,33,0.707,34,1.022,35,2.708,36,2.777,37,4.484,38,1.523,39,1.367,40,0.818,41,1.493,42,1.405,43,1.959,44,1.333,45,1.17,46,2.371,47,1.172,48,1.089,49,3.723,50,1.735,51,1.453,52,1.271,53,0.652,54,0.317,55,0.548,56,1.053,57,1.333,58,0.991,59,1.757,60,1.757,61,1.604,62,2.001,63,2.213,64,3.102,65,1.405,66,0.845,67,2.213,68,2.213,69,1.673,70,0.835,71,3.493,72,1.643,73,3.645,74,1.123,75,1.903,76,1.404,77,2.512,78,2.903,79,1.802,80,1.254,81,1.824,82,1.972,83,3.702,84,2.53,85,0.645,86,2.213,87,0.835,88,1.457,89,2.213,90,0.855,91,0.761,92,1.604,93,0.936,94,1.127,95,1.301,96,0.678,97,1.443,98,1.555,99,1.545,100,1.757,101,2.067,102,1.494,103,2.244,104,3.366,105,1.863,106,3.798,107,2.956,108,1.491,109,1.367,110,1.604,111,0.962,112,1.053,113,0.77,114,3.645,115,1.447,116,2.001,117,3.176,118,5.11,119,2.011,120,2.012,121,4.82,122,1.943,123,4.358,124,1.416,125,3.06,126,3.4,127,4.054,128,0.976,129,2.213,130,2.213,131,2.213,132,1.673,133,2.213,134,1.243,135,0.888,136,1.253,137,1.086,138,2.213,139,0.845,140,1.493,141,0.877,142,2.213,143,1.216,144,0.796,145,1.208,146,0.815,147,0.787,148,1.271,149,1.333,150,1.405,151,1.148,152,1.864,153,2.213,154,2.001,155,2.213,156,2.213,157,1.493,158,2.001,159,0.877,160,2.213,161,2.213,162,0.57,163,1.757,164,2.001,165,2.933,166,2.001,167,2.001,168,1.757,169,1.861,170,2.903,171,2.213,172,2.001,173,1.217,174,1.861,175,1.861,176,1.861,177,2.213,178,2.903,179,3.723,180,3.723,181,3.723,182,2.213,183,1.513,184,0.968,185,1.861,186,0.714,187,2.213,188,1.604,189,1.447,190,1.604,191,1.493,192,1.193,193,1.757,194,2.092,195,2.213,196,1.757,197,1.757,198,1.545,199,2.001,200,1.861,201,2.213,202,0.835,203,2.213,204,2.816,205,2.048,206,2.434,207,1.861,208,1.177,209,1.673,210,1.861,211,2.001,212,2.213,213,2.001,214,2.213,215,1.089,216,1.053,217,1.545,218,1.545,219,1.065,220,1.447,221,1.604,222,1.108,223,1.301,224,1.861,225,1.333]],["t/6",[4,1.221,5,1.198,6,1.739,7,0.45,19,1.821,33,2.51,40,1.597,75,2.647,83,4.005,102,3.154,103,2.797,145,1.97,152,4.712,223,5.533,226,3.519,227,6.611,228,2.142,229,5.699]],["t/8",[4,0.78,5,0.572,6,1.177,7,0.579,8,3.241,9,1.957,10,3.255,13,2.873,14,0.875,15,1.874,21,2.321,25,1.362,34,0.988,36,1.954,47,1.135,51,1.059,54,1.354,55,1.392,58,2.153,64,2.366,79,2.327,84,1.929,87,2.573,95,2.826,108,1.746,109,4.214,115,4.459,126,3.677,136,2.061,143,1.034,159,1.905,170,4.774,183,1.954,189,3.143,191,3.244,192,3.677,208,1.52,230,7.926,231,1.602,232,4.347,233,4.808,234,2.896,235,3.817,236,3.486,237,2.826,238,2.971,239,2.321,240,3.677,241,2.702,242,6.82,243,2.327,244,3.053,245,5.415,246,2.925,247,4.808,248,4.113,249,4.808,250,4.601,251,2.091,252,2.592,253,4.808,254,4.808,255,2.45,256,4.808,257,4.808,258,2.153,259,2.762,260,3.636,261,2.007,262,1.969,263,3.053,264,1.792,265,2.971,266,2.253,267,4.009,268,3.357,269,2.091,270,4.347,271,1.929,272,2.971,273,2.091,274,2.971,275,4.808,276,4.808,277,4.808,278,4.331,279,4.808,280,4.808,281,2.121,282,2.289,283,2.407,284,4.808]],["t/10",[4,1.061,7,0.56,9,1.484,16,1.552,17,1.538,22,2.528,28,2.382,36,2.659,47,0.698,51,1.016,53,1.926,72,4.093,74,1.669,85,1.908,91,2.251,103,2.328,111,2.845,122,2.771,143,1.806,183,2.659,192,3.527,271,2.625,285,6.428,286,2.497,287,5.732,288,3.676,289,5.915,290,5.502,291,8.388,292,5.194,293,6.668,294,4.825,295,2.659,296,3.76,297,4.742,298,4.413,299,3.459,300,6.542,301,5.915,302,6.542,303,6.542,304,6.542,305,6.542,306,6.542,307,6.542,308,6.542,309,6.542,310,6.542,311,6.542,312,6.542,313,6.542,314,6.542]],["t/12",[4,1.103,7,0.533,9,1.158,14,0.929,15,1.463,17,1.2,25,1.445,34,1.02,36,2.074,37,4.18,40,1.502,47,1.129,53,2.094,54,1.018,55,1.046,58,2.284,74,1.413,82,1.596,105,3.163,108,0.881,111,2.22,137,1.488,143,1.097,145,1.279,146,3.552,147,1.816,150,3.24,252,2.751,255,3.623,286,1.948,299,3.76,315,2.698,316,5.992,317,3.442,318,4.649,319,2.252,320,5.473,321,2.189,322,4.051,323,4.292,324,3.562,325,5.123,326,1.58,327,3.699,328,5.714,329,4.614,330,4.614,331,5.443,332,5.103,333,5.103,334,2.429,335,5.198,336,3.69,337,4.18,338,5.103,339,5.103,340,2.751,341,2.698,342,2.751,343,3.336,344,3.336,345,2.554,346,4.614,347,1.431,348,4.614,349,4.292,350,5.103,351,2.251,352,3.699,353,4.292,354,5.103,355,5.103,356,4.965,357,3.442,358,4.965,359,4.614,360,3,361,3.336,362,5.103]],["t/14",[4,0.637,5,0.662,7,0.526,9,1.263,25,1.577,34,1.068,35,3.129,36,3.483,47,1.16,51,0.864,52,4.338,53,2.523,54,1.45,55,1.49,56,3.595,58,2.493,76,2.848,81,1.797,93,2.355,97,1.421,108,0.961,112,2.651,137,1.624,146,2.051,147,1.981,162,1.434,251,2.422,252,3.002,262,2.18,316,4.815,325,5.055,327,4.036,328,5.271,335,3.536,336,2.889,353,4.683,356,3.887,358,7.07,360,5.401,361,3.64,363,2.152,364,3.64,365,5.271,366,2.263,367,5.568,368,4.683,369,5.568,370,5.568,371,5.568,372,3.198,373,2.694,374,2.651,375,5.568,376,5.568,377,4.338,378,4.211,379,5.034,380,6.351,381,6.351,382,4.683,383,4.683,384,5.034,385,3.727,386,4.036,387,5.568,388,5.568,389,5.568]],["t/16",[3,2.798,4,1.024,28,2.636,31,1.687,33,2.312,38,2.288,54,1.282,55,1.317,73,5.475,83,3.689,103,3.186,106,4.36,120,2.132,143,1.557,288,4.068,325,4.926,340,3.903,342,3.903,347,2.031,351,3.194,390,4.256,391,6.546,392,5.516,393,6.546,394,3.392,395,4.733,396,3.446,397,4.068,398,4.733,399,4.884,400,2.372,401,4.068,402,3.105,403,4.597,404,3.983,405,4.474,406,7.24,407,5.248]],["t/18",[3,0.958,4,0.948,5,0.86,6,1.048,7,0.544,9,0.929,12,1.708,17,1.229,19,1.3,22,1.582,25,1.159,31,0.578,33,0.792,34,1.136,38,0.784,40,1.227,47,1.142,51,0.635,53,0.73,54,0.962,55,1.064,74,1.334,76,0.935,77,2.761,85,1.77,98,2.675,103,2.574,105,2.02,106,1.493,119,0.882,124,0.621,136,1.064,137,1.77,140,2.761,143,0.533,146,2.818,147,0.882,151,1.286,162,1.055,173,2.252,174,6.727,183,1.664,206,2.676,207,2.085,209,3.096,217,6.246,219,1.495,228,0.676,238,2.529,251,1.078,255,1.263,263,2.599,317,1.673,318,1.621,325,4.21,334,1.18,345,1.241,359,2.242,366,1.664,392,4.15,400,2.774,401,2.938,404,1.364,408,2.761,409,5.333,410,2.479,411,2.242,412,2.858,413,2.479,414,1.797,415,2.124,416,2.599,417,3.25,418,3.362,419,1.875,420,4.093,421,1.731,422,1.393,423,2.479,424,2.479,425,2.479,426,5.487,427,2.489,428,3.443,429,1.424,430,6.782,431,2.479,432,2.764,433,10.028,434,4.397,435,5.228,436,4.727,437,2.479,438,5.487,439,2.479,440,5.228,441,2.479,442,2.207,443,3.701,444,1.664,445,2.479,446,2.479,447,2.479,448,1.968,449,2.479,450,2.479,451,2.479,452,7.651,453,7.723,454,7.677,455,2.242,456,1.968,457,1.708,458,2.085,459,1.731,460,1.875,461,2.479,462,2.479,463,2.085,464,1.393,465,2.479,466,1.731,467,2.085,468,2.479,469,2.479,470,1.11,471,8.696,472,2.164,473,2.858,474,4.093,475,6.486,476,5.104,477,3.25,478,4.093,479,2.761,480,2.479,481,2.479,482,2.479,483,2.479,484,3.853,485,2.479,486,4.093,487,2.479,488,2.479,489,2.479,490,0.826,491,4.093,492,1.673,493,2.967,494,3.701,495,1.393,496,2.479,497,1.968,498,1.731,499,1.968,500,2.085,501,2.479,502,2.479,503,2.085,504,4.093,505,0.958,506,2.479,507,2.479,508,2.858,509,2.085,510,2.479,511,2.479,512,2.479,513,2.479,514,2.479,515,2.479,516,4.093]],["t/20",[3,2.776,4,0.821,5,0.854,7,0.51,9,1.629,25,2.034,41,4.846,47,1.111,97,2.274,137,2.598,143,2.083,145,2.233,159,2.846,164,6.495,184,1.868,271,3.887,298,4.846,401,5.85,404,4.902,470,3.216,517,5.825,518,3.485,519,5.657,520,7.183,521,6.041,522,6.495,523,7.183,524,6.495,525,2.81,526,5.432]],["t/22",[5,1.105,7,0.532,9,1.746,15,1.584,16,1.826,38,2.432,58,3.445,91,2.648,119,2.739,148,4.421,166,6.958,170,4.635,184,2.001,219,2.201,266,3.606,272,4.755,319,2.118,455,6.958,527,3.347,528,4.234,529,6.17,530,5.82,531,7.696,532,3.445,533,3.445,534,7.238,535,4.755,536,7.696,537,4.524]],["t/25",[1,3.71,7,0.437,17,1.795,28,2.779,53,2.93,87,2.879,93,3.229,106,4.596,147,2.716,152,3.82,319,2.914,412,5.328,444,3.102,475,5.533,532,3.417,538,4.035,539,4.889,540,3.29,541,6.059,542,5.149,543,7.632,544,6.9,545,7.632,546,6.9,547,4.486,548,7.632,549,5.328,550,7.632]],["t/27",[4,0.886,5,1.006,6,1.143,14,1.41,15,0.95,19,1.86,25,1.307,40,1.123,47,1.19,51,1.314,54,1.109,55,1.14,70,1.741,77,4.468,93,3.277,103,1.642,108,1.611,119,1.642,122,2.264,128,2.036,134,2.593,137,2.614,143,1.424,145,2.121,158,7.005,170,5.099,198,6.514,199,4.172,200,7.12,202,2.498,204,6.402,205,4.658,206,4.33,207,3.881,208,2.833,209,3.49,210,6.516,211,4.172,213,4.172,215,2.27,216,2.197,217,3.221,218,3.221,219,1.32,223,4.554,258,2.066,272,2.851,288,2.593,335,4.206,532,2.066,537,2.713,551,4.172,552,5.859,553,3.49,554,5.065,555,3.664,556,2.488,557,3.345,558,6.623,559,4.614,560,4.614,561,4.614,562,4.614,563,5.57,564,4.206,565,5.988,566,4.614,567,4.614,568,4.614,569,4.614,570,4.614,571,5.988,572,4.614,573,6.623,574,3.277,575,4.33,576,4.614,577,4.614,578,4.614,579,4.614,580,4.614]],["t/29",[3,2.651,5,0.815,7,0.393,11,6.547,13,2.285,19,1.327,31,1.599,45,3.627,106,4.132,108,1.184,110,4.973,119,2.441,122,1.835,152,3.434,183,2.789,208,2.168,229,4.973,261,2.863,286,3.305,321,2.942,421,4.789,484,4.356,538,4.577,540,2.441,554,5.66,563,5.77,574,2.902,581,5.77,582,6.86,583,4.901,584,5.446,585,5.446,586,5.188,587,10.271,588,4.485,589,4.356,590,5.77,591,8.576,592,8.657,593,7.827,594,6.86,595,4.485,596,6.86,597,6.86,598,4.789,599,5.77,600,5.77,601,2.527,602,3.375]],["t/31",[3,2.458,4,0.727,5,0.756,6,1.098,7,0.364,9,1.443,13,2.119,15,1.309,22,2.458,30,3.184,33,2.031,40,1.079,47,1.034,51,0.987,54,0.911,55,0.936,65,4.039,83,4.202,97,1.623,124,1.594,152,3.184,174,5.349,226,2.847,228,1.733,263,4.039,316,3.574,324,4.44,400,1.685,434,6.937,525,2.489,527,3.981,574,2.691,603,9.153,604,6.36,605,9.073,606,3.831,607,6.175,608,6.36,609,4.81,610,4.291,611,3.499,612,3.739,613,3.739,614,6.36,615,4.538,616,6.36,617,3.574,618,4.611,619,6.36,620,8.248,621,6.36,622,6.36,623,3.864,624,6.36,625,6.36,626,6.36,627,6.36,628,6.36,629,6.36,630,6.36,631,8.248,632,4.039,633,6.36,634,5.349,635,6.36,636,6.36]],["t/33",[6,1.471,40,1.445,51,1.322,87,3.213,194,4.787,325,4.687,400,2.257,402,3.654,444,3.463,637,3.292,638,7.702,639,5.409]],["t/35",[47,1.189,48,4.059,87,3.112,108,1.424,194,4.636,400,2.186,444,3.354,640,3.806,641,4.059,642,5.394,643,5.098,644,5.566]],["t/38",[1,2.579,4,0.735,5,0.764,6,1.434,17,2.163,34,1.035,38,2.031,40,1.803,66,2.454,75,2.796,96,1.97,103,2.955,271,3.332,272,3.971,281,4.29,283,3.217,316,3.612,319,1.768,344,4.202,345,4.605,366,2.613,400,2.667,401,3.612,470,2.877,472,3.398,539,3.398,637,2.484,645,6.427,646,4.659,647,5.103,648,6.427,649,8.304,650,2.484,651,6.014,652,5.429,653,5.001,654,4.487,655,2.965,656,2.188,657,2.396,658,5.811,659,4.336,660,5.406,661,5.103,662,4.666,663,4.659,664,6.427,665,3.217,666,5.811,667,6.427,668,4.336,669,4.861,670,3.692]],["t/40",[6,1.323,32,3.591,40,1.799,54,1.097,55,1.127,66,2.926,206,5.01,263,4.866,281,3.381,335,4.866,336,3.976,347,2.149,351,3.381,366,3.115,475,5.556,527,3.333,555,7.913,556,4.132,671,7.664,672,7.011,673,6.446,674,5.35,675,2.637,676,7.664,677,4.306,678,5.17,679,7.664,680,7.664,681,6.084]],["t/42",[4,0.833,5,1.158,6,1.724,7,0.477,9,1.198,14,1.517,15,1.498,25,2.062,34,0.658,38,1.668,40,1.414,45,2.791,47,1.151,54,1.042,55,1.071,74,1.446,82,1.651,90,2.814,93,2.233,97,2.127,108,1.551,111,2.296,128,2.329,141,2.885,143,1.566,144,1.9,145,1.323,162,1.36,184,1.373,204,3.993,219,1.51,225,4.385,245,4.191,246,2.264,278,3.352,299,2.791,373,2.554,400,2.769,459,3.685,470,4.47,527,2.296,534,5.278,538,3.85,540,1.879,564,5.292,640,4.694,665,4.172,682,2.325,683,2.474,684,4.407,685,3.523,686,5.279,687,5.279,688,3.561,689,3.993,690,2.905,691,3.18,692,3.262,693,3.262,694,5.279,695,2.739,696,4.191,697,7.281,698,1.634,699,2.363,700,5.279]],["t/44",[0,2.575,5,0.622,7,0.581,10,1.801,17,1.231,31,1.22,33,2.649,38,2.97,40,1.228,43,2.128,47,0.772,48,5.301,51,1.288,54,1.036,55,1.065,58,2.343,75,1.762,79,2.533,80,1.762,85,2.111,88,2.048,90,2.023,108,0.904,112,2.492,119,2.576,122,2.843,135,2.1,143,1.925,162,1.865,215,2.575,228,1.426,229,3.794,258,4.207,281,2.309,283,2.62,319,2.283,396,2.492,527,3.609,540,1.863,662,2.941,670,3.007,685,2.533,701,2.492,702,3.152,703,2.767,704,4.155,705,3.794,706,5.053,707,1.842,708,2.411,709,3.323,710,4.732,711,4.732,712,3.234,713,4.732,714,3.13,715,3.794,716,6.56,717,6.544,718,3.982,719,5.234,720,4.155,721,5.234,722,7.238,723,7.238,724,5.234,725,5.234,726,7.238,727,5.234,728,4.732,729,4.732,730,4.732,731,3.323,732,3.654,733,2.767,734,4.732,735,4.732]],["t/46",[4,1.048,5,0.397,6,1.697,7,0.447,8,1.188,9,1.179,10,1.148,13,2.399,14,1.924,15,1.995,16,1.514,19,1.599,25,0.945,31,0.778,34,0.648,40,0.881,47,1.09,48,4.771,50,2.975,51,1.505,74,0.663,80,1.124,85,1.515,96,1.592,97,1.326,98,1.677,108,1.101,113,3.105,119,1.188,120,1.879,122,1.706,124,1.599,136,0.868,137,1.861,139,1.274,144,1.201,162,0.86,184,0.868,186,1.077,202,2.407,208,1.642,215,3.139,219,1.486,228,1.416,231,1.731,239,2.813,246,2.229,262,2.253,264,1.244,326,1.609,347,1.457,363,2.008,490,2.125,505,2.008,518,2.844,675,1.788,698,1.033,708,1.731,713,3.017,716,3.627,717,3.017,736,1.29,737,5.196,738,1.188,739,1.306,740,3.337,741,1.306,742,1.892,743,3.337,744,3.337,745,1.306,746,2.941,747,1.96,748,2.033,749,1.984,750,1.96,751,3.071,752,1.96,753,2.818,754,2.559,755,2.033,756,1.828,757,2.033,758,1.808,759,1.849,760,1.712,761,2.908,762,1.849,763,1.625,764,1.828,765,2.033,766,1.914,767,1.124,768,2.944,769,1.136,770,4.698,771,1.914,772,1.984,773,1.937,774,1.984,775,1.828,776,1.694,777,1.96,778,2.033,779,1.914,780,5.196,781,3.627,782,3.627,783,3.627,784,3.627,785,3.627,786,3.505,787,1.161,788,1.259,789,1.201,790,1.274,791,1.29]],["t/48",[7,0.472,19,1.596,54,1.181,55,1.425,143,1.774,373,3.992,400,2.186,464,4.636,540,2.936,601,3.039,640,3.806,641,4.766,683,3.866,792,5.239,793,5.394,794,4.739,795,5.566]],["t/50",[3,2.733,7,0.55,12,2.952,31,2.056,43,2.875,76,2.668,79,3.422,80,2.381,81,2.282,90,2.733,143,1.521,150,4.491,220,4.623,222,4.417,251,3.076,273,3.838,281,3.893,374,3.367,385,3.076,418,3.54,508,4.937,530,5.348,595,4.623,637,3.41,641,5.099,695,3.669,714,2.668,761,2.488,792,4.491,793,4.623,794,4.062,796,4.259,797,7.072,798,7.072,799,5.348,800,6.714,801,5.615,802,6.394,803,4.157,804,5.615,805,5.615,806,5.615,807,5.127]],["t/52",[7,0.571,31,2.166,79,3.724,81,2.483,90,2.974,124,1.929,143,1.655,202,2.903,273,3.347,281,3.396,319,2.118,637,3.592,641,5.223,695,3.993,756,2.708,792,4.887,793,5.031,794,5.339,799,5.82,800,6.488,808,7.378,809,7.696,810,6.11,811,5.82]],["t/54",[0,2.497,1,2.036,7,0.551,12,2.118,16,1.204,17,2.185,28,1.848,31,1.651,34,0.633,54,1.378,55,1.453,70,3.078,74,1.008,79,2.455,84,2.036,90,3.591,91,3.04,124,1.775,143,1.523,202,1.914,266,3.319,273,3.081,315,2.683,319,2.246,351,2.239,366,3.317,373,2.455,374,2.416,390,2.983,397,2.306,400,1.877,442,2.736,457,2.118,538,3.746,539,2.683,540,2.521,547,2.983,589,3.222,601,1.869,612,2.983,615,2.792,617,5.551,637,1.961,640,2.341,641,4.86,650,1.961,677,2.852,683,2.378,685,2.455,695,2.633,775,1.786,788,1.914,792,4.498,793,6.458,794,2.915,800,4.945,810,4.029,811,3.838,812,3.542,813,4.029,814,5.074,815,5.074,816,5.074,817,2.497,818,3.679,819,5.609,820,5.074,821,5.074,822,5.074,823,5.074,824,5.074,825,4.588,826,3.317,827,4.588,828,4.588,829,2.455,830,4.798,831,3.679,832,4.029,833,3.838,834,5.958,835,3.679,836,4.588,837,2.09,838,3.542,839,3.838,840,2.416,841,3.542,842,4.588,843,4.268,844,3.222]],["t/57",[7,0.566,17,1.431,28,2.918,31,1.418,53,1.792,55,0.895,88,2.381,101,2.61,102,2.442,105,3.097,124,2.634,140,4.106,151,3.158,202,4.08,223,3.577,226,2.724,232,5.502,269,2.647,282,2.897,286,2.323,319,1.674,418,3.046,442,3.281,453,5.502,615,3.348,641,5.171,653,4.826,661,4.832,675,2.094,678,4.106,683,2.851,699,2.724,714,2.295,749,3.059,799,4.602,810,4.832,811,4.602,840,2.897,845,6.06,846,6.086,847,6.362,848,5.118,849,6.086,850,6.086,851,4.602,852,6.086,853,4.832,854,3.76,855,6.086,856,3.158,857,5.239,858,5.118,859,3.577,860,4.832,861,4.158,862,7.535,863,5.809,864,4.602,865,6.086]],["t/60",[4,1.022,7,0.441,9,1.494,17,2.386,19,1.632,30,2.292,32,2.146,34,0.821,38,1.447,47,1.108,51,1.023,70,1.727,74,0.91,82,1.433,84,1.838,85,1.335,90,4.047,97,1.681,108,1.332,111,1.992,124,1.148,136,1.191,143,1.417,149,2.758,183,3.429,184,1.713,202,2.485,204,4.982,222,3.297,266,3.087,273,3.356,366,1.862,374,2.18,394,2.146,407,3.32,538,4.461,612,2.692,617,5.389,641,4.151,650,3.921,670,2.631,685,3.187,690,3.624,698,2.767,712,2.83,754,1.418,760,1.509,769,2.872,792,2.908,793,6.27,811,7.253,819,4.183,827,4.141,828,4.141,830,3.872,834,3.852,837,2.713,843,7.518,848,3.852,866,3.32,867,3.852,868,7.715,869,6.587,870,6.38,871,5.956,872,4.982,873,5.54,874,4.58,875,4.58,876,4.141,877,4.775,878,4.141,879,3.464,880,4.58,881,4.58,882,2.908,883,3.636,884,2.994,885,4.58,886,4.58]],["t/62",[6,1.23,7,0.408,9,1.617,14,1.756,15,1.467,33,3.082,42,4.526,47,0.946,54,1.02,55,1.048,56,3.393,81,2.3,97,1.819,108,1.23,120,2.842,273,3.857,328,4.975,372,4.094,525,2.789,538,3.768,637,3.73,641,4.362,657,2.656,675,2.453,683,3.339,695,3.698,707,2.508,708,2.374,754,2.207,760,2.349,792,4.526,793,4.659,872,5.39,887,4.975,888,4.975,889,4.005,890,5.39,891,4.293,892,3.768,893,5.994,894,5.167,895,5.658,896,6.444]],["t/64",[4,1.002,5,0.831,7,0.562,9,1.129,14,1.121,15,1.024,17,2.059,19,0.611,21,1.075,30,1.581,31,0.736,34,0.62,38,0.998,40,1.045,46,3.439,47,1.095,51,0.773,53,2.489,54,0.882,55,0.906,56,4.169,70,1.191,74,1.74,76,3.046,78,1.902,82,0.988,84,1.997,85,0.921,91,1.087,94,1.609,105,1.221,120,2.378,122,2.818,124,1.247,135,1.268,141,1.252,143,1.635,147,1.771,152,1.581,162,1.282,184,1.294,251,1.374,269,1.374,274,1.952,281,1.394,286,1.206,294,5.761,295,2.841,318,5.526,326,1.907,351,1.394,394,1.48,400,0.837,402,2.135,414,2.29,422,1.775,457,1.318,466,2.205,484,2.006,527,2.165,532,1.414,534,2.29,538,3.256,542,4.155,601,2.269,611,1.738,637,2.938,641,4.159,646,2.29,657,2.834,685,1.528,695,3.196,698,3.042,699,2.228,706,2.205,714,2.323,733,1.67,746,1.771,754,1.541,764,1.111,837,1.301,883,3.951,887,4.879,888,6.774,889,1.775,897,7.885,898,2.856,899,2.856,900,5.726,901,2.508,902,2.389,903,2.508,904,2.856,905,2.657,906,4.89,907,4.186,908,2.856,909,1.857,910,2.856,911,6.395,912,5.548,913,2.657,914,4.5,915,2.856,916,5.569,917,2.856,918,2.856,919,2.856,920,5.569,921,4.5,922,2.856,923,4.5,924,2.856,925,2.856,926,2.657,927,3.16,928,2.536,929,3.62,930,1.639,931,1.857,932,2.389,933,1.236,934,2.856,935,2.856,936,2.856,937,2.508]],["t/66",[4,1.03,5,0.375,6,1.555,7,0.515,8,1.122,9,1.128,10,1.085,13,2.326,14,1.909,15,1.968,16,1.46,17,0.741,19,1.562,25,0.893,31,0.735,34,0.62,47,1.079,50,2.905,51,1.484,56,1.501,74,0.987,80,1.062,82,0.986,85,1.449,90,1.921,96,1.523,97,1.782,98,1.604,108,1.205,113,3.046,120,2.056,122,1.645,124,0.79,136,0.82,137,1.794,139,1.204,141,2.437,144,1.135,162,0.812,165,1.636,184,1.292,186,1.017,202,2.32,208,1.571,219,1.421,228,1.355,231,1.656,239,2.747,262,2.439,264,2.293,318,2.062,326,1.539,347,1.394,363,1.921,366,1.282,490,2.049,505,1.921,518,2.777,637,1.219,641,4.705,650,1.219,657,1.853,675,1.71,698,2.162,708,1.656,733,1.667,736,1.219,738,1.122,739,1.234,741,1.234,742,1.148,745,1.234,746,3.006,747,1.875,748,1.945,749,1.898,750,1.875,751,3.006,752,1.875,753,2.732,754,2.499,755,1.945,756,1.749,757,1.945,758,1.729,759,1.769,760,1.638,761,2.84,762,1.769,763,1.555,764,1.749,765,1.945,766,1.831,767,1.062,768,2.865,769,1.073,771,1.831,772,1.898,773,1.853,774,1.898,775,1.749,776,1.621,777,1.875,778,1.945,779,1.831,787,1.097,788,1.189,789,1.135,790,1.204,791,1.219,793,3.249,819,2.002,845,2.385,870,2.385,871,4.494,872,3.759,873,4.18,888,3.47,897,2.504,912,2.504,938,4.494,939,2.851,940,3.153,941,2.851,942,2.851,943,2.201,944,3.071,945,2.922,946,2.851,947,2.385,948,3.153,949,3.153,950,3.153,951,3.153,952,2.851,953,3.153,954,4.494,955,4.97]],["t/68",[0,3.835,1,3.128,7,0.536,54,1.116,55,1.378,79,3.771,143,2.014,273,3.39,281,3.439,373,3.771,400,2.065,539,4.121,540,2.774,601,2.871,637,3.012,640,3.596,641,4.94,677,4.38,683,3.652,792,5.946,793,6.122,794,4.477,800,5.441,812,5.441,813,6.188]],["t/71",[6,1.301,7,0.431,9,1.71,14,1.801,15,1.551,33,2.93,42,4.786,47,0.979,54,1.079,55,1.109,108,1.301,120,2.914,273,3.992,525,2.949,637,3.547,641,4.515,675,2.594,699,3.374,707,2.652,708,2.511,754,2.334,760,2.484,794,4.33,872,5.7,890,5.7,891,4.54,892,3.985,893,6.34,894,5.464,895,5.984,896,6.815]],["t/73",[3,0.579,4,0.724,5,0.426,6,0.618,7,0.562,9,0.603,10,1.233,12,1.495,14,0.273,15,1.021,16,0.356,17,2.273,28,2.801,29,4.183,31,1.01,35,1.494,36,3.833,37,0.881,38,0.474,43,2.414,47,1.08,51,0.413,53,1.864,54,0.906,55,0.874,56,2.828,57,0.903,58,3.681,64,2.133,70,1.003,74,0.298,75,0.895,76,2.24,80,0.505,82,2.522,84,1.437,91,1.707,94,1.355,95,0.881,96,0.46,98,0.484,101,1.536,102,0.602,103,0.534,105,1.028,108,1.152,112,1.266,124,1.243,135,0.602,143,0.932,145,0.376,149,0.903,152,0.751,159,0.594,162,1.414,170,0.903,178,0.903,216,0.714,234,0.903,238,0.927,252,3.203,261,2.479,266,0.703,267,0.881,269,0.652,281,1.173,286,1.655,295,1.762,296,3.681,315,0.793,318,0.98,320,0.881,321,1.14,331,0.825,336,0.778,344,0.98,351,2.422,356,2.501,360,4.255,361,4.362,374,1.705,378,3.278,385,2.387,390,0.881,400,0.397,403,0.952,408,1.012,414,4.306,418,0.751,442,1.931,457,1.495,470,1.19,472,1.406,479,3.346,525,2.832,530,2.709,532,3.747,533,0.671,539,0.793,542,2.417,552,2.011,553,1.134,557,1.087,609,6.432,611,0.825,612,2.106,634,1.261,637,2.121,640,0.692,641,4.996,650,2.121,662,0.843,685,1.287,699,0.671,701,0.714,702,0.903,703,0.793,708,0.499,714,1.003,718,3.268,720,2.844,731,2.753,756,0.528,759,0.534,761,0.936,762,0.534,763,0.469,766,1.32,773,0.559,776,0.867,792,0.952,793,0.98,794,0.861,796,1.601,799,1.134,800,1.047,801,2.844,803,3.721,804,3.938,805,2.844,817,3.283,829,1.287,837,1.475,838,1.047,840,1.705,845,4.492,859,3.226,861,1.38,863,4.306,864,2.709,879,3.278,882,0.952,892,0.793,895,1.19,906,2.844,909,1.563,928,0.764,956,1.355,957,2.436,958,2.659,959,2,960,3.92,961,1.356,962,1.047,963,1.499,964,1.859,965,3.239,966,1.261,967,1.261,968,1.499,969,1.19,970,1.012,971,0.98,972,1.499,973,1.356,974,1.356,975,1.19,976,1.499,977,1.499,978,2.659,979,0.843,980,1.499,981,1.261,982,1.499,983,1.261,984,2.611,985,1.261,986,1.356,987,6.645,988,5.273,989,5.611,990,0.738,991,1.261,992,2.404,993,8.64,994,1.356,995,3.013,996,0.98,997,1.356,998,1.356,999,1.356,1000,1.356,1001,2.236,1002,1.356,1003,1.356,1004,3.239,1005,1.356,1006,1.356,1007,2.404,1008,1.356,1009,1.356,1010,2.404,1011,1.356,1012,1.356,1013,2.404,1014,2.404,1015,2.404,1016,1.356,1017,1.356,1018,1.356,1019,1.356,1020,1.356,1021,2.404,1022,2.404,1023,1.19,1024,1.356,1025,1.356,1026,1.356,1027,3.026,1028,1.356,1029,1.134,1030,1.356,1031,3.92,1032,3.703,1033,2.659,1034,2.659,1035,2.659,1036,2.659,1037,4.335,1038,2.659,1039,2.659,1040,2.659,1041,2.659,1042,2.659,1043,5.94,1044,5.94,1045,1.356,1046,1.261,1047,1.499,1048,1.499,1049,1.499,1050,1.499,1051,2.659,1052,1.499,1053,1.499,1054,1.499,1055,4.962,1056,3.582,1057,6.469,1058,3.239,1059,2.158,1060,3.239,1061,6.304,1062,2.404,1063,3.239,1064,3.582,1065,2.659,1066,2.659,1067,2.659,1068,3.582,1069,1.499,1070,0.927,1071,1.087,1072,1.499,1073,1.499,1074,1.499,1075,1.499,1076,0.98,1077,1.499,1078,1.356,1079,1.499,1080,1.499,1081,1.356,1082,1.499,1083,0.952,1084,1.19,1085,1.012,1086,3.582,1087,1.087,1088,2.659,1089,1.499,1090,1.499,1091,1.499]],["t/75",[7,0.49,17,2.012,36,3.479,43,3.479,82,3.095,94,4.36,532,3.831,641,4.211,861,4.441,984,5.155]],["t/77",[4,0.595,7,0.473,9,1.181,17,1.224,36,3.362,37,3.059,47,1.155,51,1.119,53,2.436,54,1.032,55,1.061,56,3.432,57,3.134,58,3.228,76,2.719,108,1.428,124,2.238,143,1.119,162,2.131,216,2.477,252,2.806,281,2.296,296,3.228,356,5.775,360,5.703,361,5.408,378,5.452,472,2.752,525,3.669,533,2.33,609,5.452,641,2.561,701,2.477,714,1.963,759,1.852,766,2.656,845,5.452,882,3.305,895,4.132,960,7.479,964,2.7,965,6.519,985,4.377,986,4.705,987,6.567,988,6.256,989,4.377,990,2.561,991,4.377,992,4.705,993,4.705,994,4.705,995,6.064,996,3.402,997,4.705,998,4.705,999,4.705,1000,4.705,1001,4.377,1002,4.705,1003,4.705,1004,7.479,1005,4.705,1006,4.705,1007,6.519,1008,4.705,1009,4.705,1010,6.519,1011,4.705,1012,4.705,1013,6.519,1014,6.519,1015,6.519,1016,4.705,1017,4.705,1018,4.705,1019,4.705,1020,4.705,1021,6.519,1022,6.519,1023,4.132]],["t/79",[7,0.418,9,1.655,17,2.294,28,2.657,43,2.966,47,1.041,53,2.149,54,1.045,94,3.718,98,2.355,124,1.829,143,1.935,145,1.829,261,3.046,286,2.786,296,3.267,331,4.015,336,3.786,351,3.22,385,3.174,400,1.933,470,3.267,553,5.519,557,5.29,611,4.015,640,3.367,641,4.427,702,4.395,703,3.858,838,5.094,859,5.734,964,3.786,995,6.138,1001,6.138,1024,6.598,1025,6.598,1026,6.598,1027,5.094,1028,6.598,1029,5.519]],["t/81",[35,5.472,90,3.217,135,3.341,152,4.167,159,3.298,319,2.291,538,4.402,641,4.096,650,3.217,662,4.678,695,4.32,794,4.782,800,5.812,811,6.296,1059,5.014,1092,4.894]],["t/83",[4,0.598,5,0.86,7,0.563,9,1.187,14,1.168,15,1.077,17,2.105,19,0.652,21,1.146,30,1.686,31,0.785,34,0.652,38,1.064,40,1.089,46,3.561,47,1.107,51,0.812,53,2.55,54,0.919,55,0.944,56,3.949,70,1.27,74,1.648,76,3.129,78,2.028,82,1.053,84,2.1,85,0.982,91,1.159,94,1.716,105,1.302,120,0.992,122,2.831,124,1.311,141,1.334,143,1.685,147,1.862,152,1.686,162,1.348,184,1.361,251,1.465,269,1.465,274,2.081,281,1.486,286,1.286,294,5.832,295,2.942,318,5.66,326,1.62,351,1.486,394,1.578,400,0.892,402,2.244,414,2.441,422,1.892,457,1.406,466,2.351,484,2.138,527,2.276,532,1.508,534,2.441,538,2.767,542,4.33,601,2.364,611,1.853,641,3.158,657,2.921,685,1.63,695,2.715,698,3.084,699,2.343,706,2.351,714,2.421,733,1.781,746,1.198,754,1.62,837,1.387,883,4.155,887,5.052,888,6.784,889,1.892,897,7.818,898,3.045,899,3.045,900,5.852,901,2.674,902,2.547,903,2.674,904,3.045,905,2.833,906,5.095,907,4.401,908,3.045,909,1.98,910,3.045,911,6.592,912,5.746,913,2.833,914,4.732,915,3.045,916,5.803,917,3.045,918,3.045,919,3.045,920,5.803,921,4.732,922,3.045,923,4.732,924,3.045,925,3.045,926,2.833,927,3.323,928,2.666,929,3.773,930,1.747,931,1.98,932,2.547,933,1.318,934,3.045,935,3.045,936,3.045,937,2.674]],["t/85",[4,1.04,5,0.387,6,1.57,7,0.506,8,1.158,9,1.156,10,1.12,13,2.366,14,1.917,15,2.011,16,1.49,19,1.583,25,0.922,31,0.758,34,0.635,47,1.114,50,2.944,51,1.496,56,1.549,71,2.011,74,1.012,80,1.096,85,1.486,96,1.561,97,1.813,98,1.644,108,1.084,113,3.079,120,2.092,122,1.679,136,0.846,137,1.831,139,1.242,141,2.019,144,1.171,162,0.838,165,1.688,184,1.325,186,1.05,208,1.61,219,1.457,228,1.389,231,1.697,239,2.784,262,2.227,264,2.34,318,2.127,326,1.577,347,1.429,363,1.969,490,2.091,505,1.969,518,2.815,637,1.258,641,4.578,657,1.213,675,1.753,698,1.577,708,1.697,718,1.79,720,2.584,733,1.721,736,1.258,738,1.158,739,1.273,741,1.273,742,1.185,745,1.273,746,2.91,747,1.922,748,1.993,749,1.945,750,1.922,751,3.042,752,1.922,753,2.779,754,2.532,755,1.993,756,1.793,757,1.993,758,1.773,759,1.813,760,1.679,761,2.878,762,1.813,763,1.594,764,1.793,765,1.993,766,1.877,767,1.096,768,2.909,769,1.108,771,1.877,772,1.945,773,1.899,774,1.945,775,1.793,776,1.661,777,1.922,778,1.993,779,1.877,787,1.132,788,1.227,789,1.171,790,1.242,791,1.258,796,3.068,845,2.461,872,3.853,873,4.285,888,2.272,897,2.584,912,2.584,938,4.607,939,2.942,942,2.942,943,2.272,944,2.011,945,2.995,946,2.942,947,2.461,952,2.942,954,4.607,957,1.829,987,2.584,988,2.461,989,2.737,1093,5.095,1094,5.095,1095,5.095]],["t/87",[3,3.236,5,0.633,6,0.919,7,0.516,12,3.057,33,2.88,34,0.664,40,1.755,50,1.917,53,1.568,54,1.199,55,1.232,66,2.796,82,1.666,87,3.949,88,3.823,90,2.058,91,1.833,93,2.253,97,1.359,102,2.137,122,1.959,124,1.334,128,2.35,135,2.137,136,1.385,143,1.145,178,3.207,217,3.718,231,1.774,248,2.763,258,2.384,319,2.481,321,3.142,366,2.977,373,2.577,386,3.86,397,2.42,464,2.992,479,4.941,497,4.228,498,5.113,540,1.895,555,4.228,574,2.253,598,3.718,617,2.992,623,2.495,637,2.058,651,5.474,674,3.718,693,5.174,701,2.535,707,1.874,712,3.291,776,1.736,829,2.577,856,3.801,894,3.86,956,2.713,979,4.116,990,2.62,1027,5.113,1032,4.941,1059,3.207,1096,4.027,1097,3.481,1098,4.027,1099,4.815,1100,7.325,1101,3.059,1102,4.815,1103,5.325,1104,5.325,1105,5.325,1106,5.325,1107,4.815,1108,2.992,1109,4.479,1110,5.325,1111,5.325,1112,3.381,1113,5.325,1114,4.027,1115,4.479,1116,2.992,1117,2.871,1118,4.815]],["t/89",[4,0.838,7,0.583,9,1.662,13,2.44,14,1.333,38,2.85,51,1.137,54,1.399,55,1.438,72,3.233,82,2.292,98,2.364,122,2.8,143,1.576,144,2.637,162,1.888,192,3.95,285,6.205,286,2.797,299,3.874,527,3.923,533,3.28,703,4.769,964,4.68,1096,5.541,1116,4.117,1119,4.652,1120,5.817,1121,6.624,1122,5.541]],["t/91",[4,1.042,5,0.389,6,1.689,7,0.469,8,1.164,9,1.161,10,1.126,13,2.373,14,1.919,15,1.986,16,1.495,19,1.586,22,1.977,25,0.926,31,0.762,34,0.638,47,1.086,50,2.95,51,1.498,74,0.65,80,1.102,85,1.492,88,2.002,96,1.568,97,1.819,98,2.033,108,1.088,113,3.084,117,2.875,120,2.098,126,2.758,136,0.851,137,1.837,139,1.249,144,1.178,145,1.282,162,0.843,184,1.638,186,1.056,189,3.345,191,3.451,192,2.758,208,1.617,219,1.463,228,1.394,231,1.704,239,2.79,245,4.062,246,2.194,248,3.269,250,4.25,258,1.465,262,2.367,264,1.219,287,5.63,319,0.9,326,1.584,331,1.8,347,1.435,363,1.977,490,2.098,505,1.977,518,2.821,583,1.61,675,1.761,698,1.013,708,1.704,736,1.264,738,1.164,739,1.28,741,1.28,742,1.863,745,1.28,746,2.917,747,1.93,748,2.002,749,1.953,750,1.93,751,3.048,752,1.93,753,2.788,754,2.538,755,2.002,756,1.8,757,2.002,758,1.78,759,1.821,760,1.686,761,2.884,762,1.821,763,1.6,764,1.8,765,2.002,766,1.885,767,1.102,768,2.916,769,1.114,771,1.885,772,1.953,773,1.907,774,1.953,775,1.8,776,1.668,777,1.93,778,2.002,779,1.885,787,1.138,788,1.234,789,1.178,790,1.249,791,1.264,819,2.077,1096,3.869,1116,1.838,1121,2.958,1123,5.116,1124,3.272,1125,3.272,1126,3.272,1127,3.272,1128,1.97,1129,3.272,1130,2.022,1131,4.626,1132,3.709]],["t/93",[4,0.79,7,0.498,19,1.337,22,2.671,33,2.207,36,3.536,43,3.536,47,0.738,51,1.073,52,4.996,58,3.094,70,2.607,76,2.607,119,3.095,122,1.849,136,1.797,143,1.486,162,1.781,194,5.348,216,3.29,252,3.727,258,4.472,283,3.46,319,2.393,347,1.939,525,3.403,632,4.389,702,4.163,703,3.655,707,2.432,708,2.302,709,4.389,752,2.607,786,5.868,795,4.663,909,4.063,1133,6.25,1134,6.25,1135,6.25,1136,5.488,1137,6.25,1138,6.25,1139,5.227,1140,5.813,1141,6.25,1142,6.25,1143,5.813,1144,6.912,1145,3.884]],["t/95",[4,1.056,5,0.406,6,1.706,7,0.452,8,1.216,9,1.201,10,1.176,13,2.43,14,1.93,15,2.007,16,1.537,19,1.615,25,0.968,31,0.797,34,0.66,47,1.095,50,3.004,51,1.514,74,0.679,80,1.151,85,1.544,96,1.622,97,1.862,98,1.708,108,1.118,113,3.13,119,1.884,120,1.908,122,1.733,126,2.854,136,0.889,137,1.889,139,1.305,144,1.23,162,0.881,184,1.685,186,1.103,194,5.552,196,4.203,197,4.203,208,1.673,219,1.514,228,1.443,231,1.763,239,2.841,246,2.27,258,1.53,262,2.106,264,1.274,319,0.94,326,1.639,347,1.485,363,2.046,490,2.158,505,2.046,518,2.872,675,1.822,698,1.058,708,1.763,736,1.321,738,1.216,739,1.337,741,1.337,742,1.927,745,1.337,746,2.97,747,1.997,748,2.071,749,2.021,750,1.997,751,3.098,752,1.997,753,2.854,754,2.584,755,2.071,756,1.863,757,2.071,758,1.842,759,1.884,760,1.744,761,2.937,762,1.884,763,1.656,764,1.863,765,2.071,766,1.95,767,1.151,768,2.977,769,1.163,771,1.95,772,2.021,773,1.973,774,2.021,775,1.863,776,1.726,777,1.997,778,2.071,779,1.95,787,1.189,788,1.289,789,1.23,790,1.305,791,1.321,1146,5.293,1147,3.418,1148,3.418,1149,3.418,1150,3.418,1151,4.786,1152,5.293]],["t/97",[4,0.845,5,1.077,7,0.585,28,2.689,33,2.358,40,1.253,88,4.001,90,2.854,91,3.119,112,3.516,124,1.851,136,1.921,248,3.832,258,3.306,269,3.212,285,4.69,286,2.82,319,2.814,373,3.574,540,2.628,642,6.685,698,2.287,701,3.516,702,4.448,714,2.786,829,3.574,1153,4.983,1154,7.386,1155,7.386,1156,5.354,1157,7.386]],["t/99",[4,0.838,7,0.583,9,1.662,13,2.44,14,1.333,38,2.85,51,1.137,54,1.399,55,1.438,72,3.233,82,2.292,98,2.364,122,2.8,143,1.576,144,2.637,162,1.888,192,3.95,285,6.205,286,2.797,299,3.874,527,3.923,533,3.28,642,4.79,703,4.769,964,4.68,1116,4.117,1119,4.652,1120,5.817,1158,6.624,1159,7.327]],["t/101",[7,0.553,9,1.863,14,1.495,34,1.024,72,3.624,85,2.395,102,3.296,112,4.599,136,2.136,219,2.349,642,5.369,690,4.519,695,4.262,829,3.974,1160,7.426,1161,8.213,1162,8.213,1163,8.213]],["t/103",[4,1.037,5,0.383,6,1.683,7,0.466,8,1.148,9,1.148,10,1.11,13,2.355,14,1.915,15,1.979,16,1.481,19,1.577,25,0.913,31,0.752,34,0.631,47,1.084,50,2.933,51,1.493,74,0.641,80,1.086,85,1.475,88,1.98,96,1.551,97,1.805,98,2.014,108,1.078,112,1.536,113,3.07,117,2.843,120,2.082,126,2.728,136,0.839,137,1.82,139,1.231,144,1.161,145,1.924,162,0.831,184,1.623,186,1.041,192,2.728,208,1.599,219,1.447,228,1.379,231,1.685,239,2.774,246,2.17,248,3.668,262,2.46,264,1.202,326,1.567,331,1.775,347,1.419,363,1.955,490,2.079,505,1.955,518,2.804,532,1.444,583,1.587,589,4.489,642,4.081,675,1.741,698,0.999,708,1.685,718,1.775,736,1.247,738,1.148,739,1.262,741,1.262,742,1.842,745,1.262,746,2.9,747,1.908,748,1.98,749,1.932,750,1.908,751,3.032,752,1.908,753,2.766,754,2.523,755,1.98,756,1.78,757,1.98,758,1.761,759,1.8,760,1.667,761,2.867,762,1.8,763,1.583,764,1.78,765,1.98,766,1.864,767,1.086,768,2.897,769,1.098,771,1.864,772,1.932,773,1.886,774,1.932,775,1.78,776,1.65,777,1.908,778,1.98,779,1.864,787,1.122,788,1.217,789,1.161,790,1.231,791,1.247,819,2.048,1116,1.813,1128,1.943,1130,1.993,1158,2.916,1160,2.916,1164,5.06,1165,3.225,1166,3.225,1167,3.225,1168,3.225,1169,5.645,1170,3.225,1171,2.916,1172,2.338,1173,8.202,1174,4.575,1175,4.575,1176,5.06]],["t/105",[5,0.782,6,0.789,7,0.482,13,2.19,19,0.884,21,2.238,30,2.287,33,2.1,34,1.293,39,4.063,40,1.789,42,2.901,51,0.709,54,0.941,55,0.967,70,1.723,71,2.823,74,0.908,77,3.082,87,1.723,88,3.297,90,1.766,91,1.572,98,1.474,103,2.34,105,1.766,111,1.987,113,2.288,119,1.626,124,1.145,134,2.567,141,1.81,222,2.287,228,1.245,261,1.907,273,3.665,278,2.901,286,1.744,293,7.089,315,2.416,325,4.239,335,4.175,342,2.463,347,1.281,400,1.21,402,1.959,415,2.37,416,2.901,422,4.329,427,2.175,436,4.131,444,1.857,457,1.907,495,2.567,499,3.627,528,2.514,532,2.045,540,1.626,542,5.685,586,4.973,601,1.683,610,3.082,611,2.514,613,2.686,637,1.766,643,5.518,653,2.751,672,3.455,682,2.1,701,2.175,714,1.723,750,2.48,761,1.607,775,2.314,792,2.901,817,2.248,833,3.455,851,4.973,854,2.823,900,2.987,902,3.455,945,2.686,956,2.328,962,3.189,1117,2.463,1177,4.767,1178,4.175,1179,2.567,1180,5.585,1181,3.627,1182,4.436,1183,2.108,1184,5.945,1185,3.455,1186,4.131,1187,3.842,1188,5.945,1189,4.131,1190,4.131,1191,3.189,1192,4.131,1193,4.131,1194,4.131,1195,3.618,1196,4.436,1197,6.966,1198,4.568,1199,3.082,1200,3.455,1201,2.624,1202,3.312,1203,3.627,1204,3.627,1205,3.189,1206,4.131,1207,4.568,1208,4.131,1209,3.627,1210,3.627,1211,3.312,1212,4.131,1213,4.568,1214,4.568,1215,4.568]],["t/107",[7,0.551,33,2.611,88,3.77,91,2.814,143,1.758,202,3.635,643,5.954,703,5.095,707,2.877,714,3.084,1180,6.985,1216,8.176,1217,7.393,1218,8.176,1219,8.176]],["t/110",[4,1.044,5,0.338,6,1.632,7,0.532,8,1.011,9,1.302,10,0.978,13,2.192,14,1.879,15,1.914,16,1.362,19,1.492,22,1.767,25,0.804,31,0.662,34,0.57,43,1.859,47,1.075,50,2.775,51,1.444,54,0.942,55,0.845,74,0.564,80,0.956,81,0.917,85,1.334,88,3.171,96,1.402,97,1.167,98,1.476,102,1.835,108,0.991,113,2.934,120,1.691,124,0.712,125,2.904,136,1.189,137,1.674,139,1.084,144,1.022,162,0.732,184,0.739,186,0.917,202,2.908,208,1.445,219,1.308,226,1.272,228,1.794,231,1.523,239,2.624,243,1.374,246,1.962,258,2.946,262,2.083,264,1.059,269,1.236,283,1.422,319,2.23,326,1.416,347,1.283,351,1.253,363,1.767,396,1.352,442,1.532,444,1.155,490,1.912,505,1.767,518,2.653,637,1.767,640,1.31,643,5.996,668,1.916,675,1.574,683,2.143,690,1.563,698,0.879,708,1.523,714,2.165,733,1.502,736,1.098,738,1.011,739,1.111,741,1.111,742,1.665,745,1.111,746,2.743,747,1.725,748,1.789,749,1.746,750,1.725,751,2.884,752,1.725,753,2.575,754,2.387,755,1.789,756,1.609,757,1.789,758,1.591,759,1.627,760,1.507,761,2.712,762,1.627,763,1.431,764,1.609,765,1.789,766,1.685,767,0.956,768,2.721,769,0.967,771,1.685,772,1.746,773,1.705,774,1.746,775,1.609,776,1.491,777,1.725,778,1.789,779,1.685,787,0.988,788,1.071,789,1.022,790,1.084,791,1.098,817,1.398,829,1.374,884,1.857,891,1.711,959,1.31,990,1.398,1109,2.389,1153,1.916,1180,2.059,1196,3.873,1197,2.568,1199,1.916,1201,1.632,1220,5.468,1221,4.135,1222,1.916,1223,4.558,1224,2.568,1225,2.568,1226,2.568,1227,4.573,1228,2.841,1229,2.841,1230,2.841,1231,2.255,1232,1.983,1233,4.573,1234,2.841,1235,1.474,1236,4.573,1237,2.841,1238,2.841,1239,2.841,1240,2.841,1241,2.841,1242,2.255,1243,2.568,1244,2.568,1245,4.135,1246,4.573,1247,4.135]],["t/112",[4,0.88,5,0.915,7,0.44,28,2.802,33,2.968,40,1.576,54,1.102,55,1.132,88,3.636,90,2.974,91,2.648,101,3.301,112,3.664,119,3.307,124,2.329,202,2.903,444,4.315,539,4.069,540,2.739,574,3.256,637,2.974,701,3.664,829,3.724,856,3.993,877,5.579,1097,5.031]],["t/114",[4,1.043,5,0.39,6,1.69,7,0.47,8,1.168,9,1.164,10,1.13,13,2.378,14,1.92,15,1.987,16,1.498,19,1.588,25,0.93,31,0.765,34,0.64,40,0.87,47,1.087,50,2.955,51,1.499,74,1.019,80,1.105,85,1.496,96,1.572,97,1.822,98,1.655,108,1.09,113,3.088,117,2.883,119,1.168,120,1.859,122,1.689,124,1.582,125,3.258,136,0.854,137,1.841,139,1.253,144,1.182,162,0.846,184,1.642,186,1.059,202,2.382,208,1.621,215,3.107,219,1.467,228,1.398,231,1.709,239,2.794,246,2.2,262,2.236,264,1.224,326,1.588,347,1.439,363,1.983,444,3.792,490,2.103,505,1.983,518,2.825,675,1.766,698,1.017,708,1.709,736,1.269,738,1.168,739,1.285,741,1.285,742,1.868,745,1.285,746,2.921,747,1.935,748,2.007,749,1.959,750,1.935,751,3.052,752,1.935,753,2.793,754,2.542,755,2.007,756,1.805,757,2.007,758,1.785,759,1.826,760,1.691,761,2.889,762,1.826,763,1.605,764,1.805,765,2.007,766,1.89,767,1.105,768,2.921,769,1.118,771,1.89,772,1.959,773,1.912,774,1.959,775,1.805,776,1.673,777,1.935,778,2.007,779,1.89,781,3.582,782,3.582,783,3.582,784,3.582,785,3.582,787,1.142,788,1.238,789,1.182,790,1.253,791,1.269,1248,5.13,1249,3.283,1250,3.283,1251,3.283,1252,5.709,1253,3.283,1254,3.283,1255,4.639,1256,3.88,1257,5.13]],["t/116",[4,0.974,40,1.674,54,1.22,107,6.763,345,4.264,698,2.637,1258,5.747,1259,8.519,1260,5.131,1261,8.519,1262,8.519]],["t/118",[4,0.577,5,0.839,6,0.872,7,0.404,16,0.56,17,0.924,18,1.544,21,2.858,34,0.734,38,1.242,40,1.63,41,1.593,47,1.121,51,1.162,54,1.072,55,1.039,70,0.891,75,0.795,81,0.762,82,2.341,91,0.813,93,0.999,96,1.548,101,1.013,102,0.947,103,1.399,109,1.459,124,1.266,128,2.228,135,0.947,136,0.614,146,1.448,150,1.499,162,0.608,173,1.299,178,3.546,183,0.96,202,1.905,209,2.973,218,4.111,220,4.275,226,3.351,238,3.12,239,1.719,241,1.327,244,2.496,255,2.003,262,2.714,266,1.106,267,1.388,271,0.947,272,1.459,281,3.459,299,1.248,345,1.968,366,2.87,397,2.971,400,1.733,412,1.648,417,1.874,419,1.786,427,3.113,429,2.258,442,1.273,457,2.458,464,1.327,467,1.986,470,1.057,472,1.248,473,4.565,476,1.986,479,2.652,492,3.972,494,2.135,495,1.327,508,3.525,540,1.399,547,1.388,564,1.499,602,1.162,611,1.299,640,1.089,646,1.712,647,3.121,650,2.276,651,4.894,652,5.49,653,3.042,654,4.565,655,2.33,656,2.771,657,0.88,658,3.554,659,4.412,662,2.838,666,2.135,669,1.786,675,1.353,678,1.593,682,1.255,692,2.429,699,2.261,701,1.124,702,1.422,707,1.777,738,0.84,769,1.338,779,0.87,813,3.121,826,1.544,900,2.57,945,1.388,956,1.203,959,1.089,1070,1.459,1076,2.57,1108,1.327,1145,1.327,1195,1.299,1201,1.356,1235,1.225,1258,1.593,1263,5.888,1264,2.135,1265,4.247,1266,2.361,1267,2.361,1268,3.931,1269,2.361,1270,3.931,1271,2.361,1272,3.931,1273,2.361,1274,2.361,1275,2.361,1276,2.361,1277,3.931,1278,2.361,1279,2.361,1280,3.121,1281,3.931,1282,3.931,1283,3.931,1284,1.786,1285,2.361,1286,2.361,1287,2.361,1288,2.361,1289,2.361,1290,2.361,1291,1.712,1292,1.459,1293,3.24,1294,1.327,1295,3.306,1296,2.135,1297,1.874,1298,2.85,1299,1.986,1300,3.931,1301,3.931,1302,3.931,1303,3.931,1304,3.931,1305,3.931,1306,3.931,1307,3.931,1308,3.554,1309,3.931,1310,3.554,1311,3.931,1312,3.931,1313,3.931,1314,3.931,1315,3.931,1316,3.931,1317,3.931,1318,3.931,1319,2.135,1320,1.986,1321,1.544,1322,2.361,1323,2.361,1324,2.361,1325,2.135,1326,4.566,1327,3.554,1328,3.306,1329,2.85,1330,2.361,1331,2.361,1332,2.361,1333,2.361,1334,2.361,1335,2.361,1336,2.361,1337,2.135,1338,1.593,1339,2.135,1340,5.888,1341,5.888,1342,5.888,1343,5.888,1344,4.453,1345,5.888,1346,5.888,1347,4.952,1348,5.324,1349,3.931,1350,7.06,1351,3.931,1352,3.931,1353,3.931,1354,2.361,1355,2.361,1356,2.361,1357,3.306,1358,2.361,1359,2.361,1360,3.931,1361,3.931,1362,2.361,1363,2.135,1364,2.361,1365,2.361,1366,2.361,1367,2.135,1368,2.361,1369,2.361,1370,2.361,1371,2.361,1372,1.874,1373,2.361,1374,2.361,1375,2.361,1376,2.361,1377,2.973,1378,1.986,1379,1.422,1380,2.361,1381,2.361,1382,1.593,1383,2.361,1384,2.361,1385,2.361,1386,3.121,1387,1.986,1388,1.182]],["t/120",[0,3.892,4,1.015,5,1.244,6,1.631,7,0.341,16,2.105,17,1.86,20,4.513,21,2.031,34,1.178,40,1.667,42,3.789,45,4.691,47,0.637,54,1.132,55,1.164,82,3.16,83,4.03,87,2.983,88,3.095,91,2.053,103,3.157,128,3.49,176,5.018,234,3.594,251,3.44,255,3.04,281,2.633,326,2.449,345,2.987,347,1.674,366,2.425,400,1.581,407,4.326,427,2.84,430,6.28,503,5.018,585,4.737,613,3.508,646,4.326,738,2.123,1130,3.687,1195,3.283,1220,4.025,1284,4.513,1387,5.018,1389,5.967,1390,4.737,1391,3.789,1392,5.018,1393,5.395,1394,5.967,1395,5.395,1396,5.395,1397,4.326,1398,5.967,1399,5.967,1400,5.967,1401,5.967,1402,4.326,1403,4.025,1404,4.513,1405,5.967]],["t/123",[1,2.827,4,0.806,5,0.837,7,0.403,17,2.07,34,1.097,40,1.837,47,0.939,48,4.331,51,1.094,54,1.26,55,1.479,82,2.204,87,3.621,150,4.473,183,3.578,251,3.064,255,3.589,281,3.108,345,4.406,366,3.578,457,3.674,490,2.347,564,4.473,653,4.243,662,3.959,830,4.141,927,4.473,990,3.466,1397,5.107,1406,7.959,1407,7.045,1408,7.045,1409,5.593,1410,4.606]],["t/125",[3,3.452,5,1.062,6,1.751,17,1.696,21,2.455,34,1.113,40,1.826,47,0.953,48,3.548,87,3.66,152,3.61,251,3.137,281,3.182,345,3.61,347,2.023,373,3.489,398,4.714,429,4.142,444,2.931,448,5.725,457,4.049,653,4.343,662,4.052,674,5.034,990,3.548,1117,3.888,1397,5.228,1410,4.714,1411,7.211,1412,4.456,1413,6.52,1414,7.211,1415,6.52,1416,5.454]],["t/128",[4,1.117,5,1.161,7,0.479,90,3.232,103,2.976,321,3.587,345,4.887,692,5.168,979,4.699,1284,6.325,1416,6.325,1417,7.034,1418,8.363]],["t/130",[6,1.255,7,0.582,11,5.497,17,2.11,32,3.406,33,2.321,40,1.652,82,2.274,84,2.917,87,3.836,88,4.087,90,2.809,91,2.501,150,4.615,222,3.638,251,3.161,269,3.161,345,3.638,347,2.039,390,4.273,459,5.074,670,4.175,812,6.797,830,5.276,854,4.491,1181,5.771,1195,3.999,1321,4.752,1415,6.572,1419,7.268,1420,7.268,1421,7.268,1422,6.113]],["t/132",[4,0.862,5,1.224,6,1.708,7,0.431,40,1.843,48,3.709,51,1.17,54,1.079,55,1.109,74,1.497,83,3.84,87,3.462,106,4.54,345,3.773,390,6.053,528,4.147,623,3.532,670,4.33,1059,5.527,1423,8.298,1424,6.815,1425,6.34,1426,6.34]],["t/134",[4,0.831,7,0.598,16,2.129,17,1.709,21,2.474,23,5.074,32,3.406,34,1.119,40,1.522,66,2.775,83,3.703,96,2.228,146,3.306,147,2.587,150,4.615,170,4.378,226,3.254,251,3.161,261,3.034,295,2.955,345,3.638,390,4.273,392,3.771,394,3.406,448,5.771,611,4.938,653,4.378,662,4.084,701,3.46,933,3.512,1084,5.771,1291,5.269,1292,4.491,1386,5.771,1422,6.113,1427,7.548,1428,7.268,1429,7.268]],["t/136",[5,0.854,6,0.893,16,1.228,17,1.939,21,1.761,30,3.595,34,1.166,40,1.766,41,3.491,48,4.058,53,1.524,54,1.028,55,1.31,75,2.418,81,1.67,82,1.619,87,3.653,101,2.22,105,2,119,1.841,124,1.297,132,6.737,186,2.874,234,3.117,251,2.251,262,1.494,268,3.613,319,1.424,340,4.446,345,3.595,366,2.103,377,2.973,396,3.419,421,3.613,448,4.108,457,2.16,495,4.634,498,3.613,554,3.383,564,4.56,574,2.189,598,3.613,640,2.387,655,3.313,656,3.543,657,3.074,682,2.988,684,2.736,702,3.117,707,1.821,709,3.286,738,2.555,763,1.619,829,2.504,838,3.613,856,2.685,901,4.108,929,3.042,956,2.636,990,4.383,1097,3.383,1132,3.751,1205,3.613,1232,5.013,1297,5.701,1388,2.59,1406,6.493,1410,3.383,1430,5.175,1431,5.206,1432,5.175,1433,4.352,1434,3.914,1435,4.352,1436,5.175,1437,3.491,1438,5.175,1439,6.458,1440,5.175,1441,5.175,1442,5.175,1443,5.175]],["t/138",[5,0.557,7,0.552,13,2.23,19,0.907,22,1.811,30,2.345,32,3.137,33,2.138,34,1.299,39,4.137,40,1.675,42,2.975,51,0.727,54,1.119,55,1.149,70,1.767,71,2.895,74,0.931,77,3.161,87,1.767,88,3.335,90,1.811,103,2.383,105,1.811,111,2.038,113,2.33,119,1.667,122,1.253,124,1.174,134,2.633,141,1.856,184,1.218,228,1.277,261,1.955,273,3.922,286,1.789,293,6.768,315,2.477,325,4.299,400,1.241,415,2.431,422,4.391,427,2.23,444,1.904,457,1.955,495,2.633,532,2.098,540,1.667,542,5.751,586,5.064,607,3.161,610,3.161,611,2.578,613,2.754,637,1.811,644,6.661,701,2.23,714,1.767,750,2.526,761,1.649,775,2.356,804,3.72,817,2.305,854,2.895,877,3.397,892,3.54,900,3.063,902,3.543,909,3.936,945,2.754,956,2.387,962,3.271,1117,2.526,1153,3.161,1177,3.397,1180,5.664,1181,5.316,1182,4.517,1183,2.161,1184,6.054,1185,3.543,1186,4.236,1187,3.941,1188,6.054,1189,4.236,1190,4.236,1191,3.271,1192,4.236,1193,4.236,1194,4.236,1195,2.578,1196,4.517,1199,3.161,1200,3.543,1201,2.691,1202,3.397,1203,3.72,1204,3.72,1205,3.271,1444,3.941,1445,3.72,1446,6.696,1447,4.685,1448,4.685,1449,5.632,1450,4.685,1451,4.685,1452,4.236,1453,4.685,1454,4.685,1455,4.685,1456,4.685,1457,3.941,1458,4.236,1459,3.271,1460,3.543]],["t/140",[4,0.869,14,1.383,16,1.803,33,2.945,47,0.984,54,1.088,55,1.118,75,2.559,88,3.609,105,2.937,135,3.05,143,1.634,162,1.958,216,4.727,261,3.172,273,4.012,283,3.804,364,4.969,530,5.748,689,5.748,703,4.018,707,2.674,754,2.353,902,5.748,1180,5.51,1196,6.699,1461,7.6,1462,7.6,1463,6.392,1464,5.748]],["t/143",[4,1.026,5,0.37,6,1.67,7,0.499,8,1.109,9,1.117,10,1.072,13,2.31,14,1.905,15,1.962,16,1.448,19,1.554,25,0.882,31,0.726,33,0.995,34,0.614,47,1.077,50,2.89,51,1.48,54,0.705,55,0.724,70,1.175,74,0.619,80,1.049,85,1.436,88,3.142,96,1.509,97,1.257,98,1.589,108,1.054,113,3.033,117,2.767,120,1.798,124,0.781,136,1.28,137,1.78,139,1.19,144,1.121,162,0.803,184,0.81,186,1.005,208,1.556,216,1.483,219,1.408,228,1.89,231,1.64,237,1.832,239,2.733,246,2.112,262,2.003,264,1.161,273,1.355,283,1.56,326,1.524,340,4.072,347,1.381,351,1.375,363,1.903,442,1.68,490,2.033,505,1.903,518,2.763,675,1.694,698,0.965,708,1.64,733,2.603,736,1.204,738,1.109,739,1.219,741,1.219,742,1.793,745,1.219,746,2.857,747,1.857,748,1.926,749,1.88,750,1.857,751,3.102,752,1.857,753,2.714,754,2.486,755,1.926,756,1.732,757,1.926,758,1.713,759,1.752,760,1.623,761,2.825,762,1.752,763,1.54,764,1.732,765,1.926,766,1.814,767,1.049,768,2.849,769,1.061,771,1.814,772,1.88,773,1.835,774,1.88,775,1.732,776,1.605,777,1.857,778,1.926,779,1.814,787,1.084,788,1.175,789,1.121,790,1.19,791,1.204,859,1.832,884,2.037,1180,2.259,1182,2.102,1196,4.118,1199,2.102,1201,1.79,1220,4.679,1221,4.452,1222,2.102,1223,4.846,1224,2.817,1225,2.817,1226,2.817,1444,4.141,1449,4.141,1465,3.116,1466,3.116,1467,4.924,1468,3.116,1469,3.116,1470,3.116,1471,3.116,1472,7.124,1473,4.452,1474,4.924,1475,4.452,1476,4.452,1477,4.452,1478,4.452,1479,4.452]],["t/145",[4,0.866,5,0.9,6,1.307,17,1.78,31,1.764,39,4.677,40,1.284,54,1.084,55,1.113,88,2.961,90,2.925,124,1.897,202,3.739,261,3.159,286,2.889,319,2.727,340,4.081,457,3.159,464,4.253,540,2.693,564,4.806,601,3.651,650,2.925,683,3.546,707,2.663,714,2.855,829,3.662,1388,3.789,1480,6.92,1481,4.449,1482,4.558]],["t/147",[4,0.77,31,1.569,47,1.056,54,0.964,55,0.991,70,2.54,77,4.543,78,5.153,101,2.888,108,1.163,124,1.688,136,1.751,202,3.547,208,2.128,268,4.701,271,3.433,273,2.929,286,2.571,374,3.206,400,1.784,418,3.371,497,5.346,533,3.015,601,2.481,609,5.093,618,4.882,637,2.603,663,4.882,703,3.561,705,4.882,708,2.243,714,2.54,756,2.37,787,2.343,790,2.571,841,4.701,862,5.664,892,3.561,964,3.494,1119,4.276,1293,3.705,1388,3.371,1480,4.701,1481,3.959,1483,7.196,1484,6.089,1485,6.734,1486,4.882,1487,5.664,1488,6.734,1489,6.734,1490,6.471,1491,5.346,1492,5.664,1493,6.734,1494,6.734,1495,6.089,1496,4.543,1497,5.346,1498,6.734]],["t/149",[0,1.447,1,1.18,3,1.137,4,0.336,7,0.269,13,1.566,14,0.856,15,1.209,21,1.001,22,2.594,29,1.526,31,1.711,33,1.502,34,0.586,41,1.984,47,1.113,54,0.421,55,0.433,66,1.123,70,1.109,78,4.043,88,3.341,91,2.022,92,2.132,97,0.751,101,2.017,102,1.887,105,1.817,108,0.812,120,1.73,124,1.682,134,2.642,135,1.887,141,1.165,143,0.632,151,1.526,159,1.165,162,1.212,178,2.832,202,3.728,206,1.923,217,3.283,218,3.283,226,1.317,228,0.802,234,1.771,237,1.729,239,1.601,240,1.586,243,1.423,258,4.129,262,1.697,269,1.279,271,1.887,286,1.123,319,1.617,321,2.52,334,3.913,344,1.923,351,2.593,352,3.409,374,3.196,390,1.729,418,1.472,419,2.224,427,1.4,429,3.856,464,1.653,471,2.659,472,3.107,479,3.172,499,2.335,525,1.84,533,3.287,537,1.729,539,2.486,601,2.473,617,1.653,623,2.203,634,2.473,665,2.354,689,3.556,703,3.107,704,2.335,705,3.409,708,1.566,709,1.867,714,1.109,733,1.555,751,1.673,754,0.911,760,1.936,764,1.655,766,1.732,779,1.083,795,1.984,802,4.252,829,1.423,835,2.132,837,1.211,838,2.053,840,1.4,890,4.444,891,1.771,892,5.042,893,2.473,957,2.642,964,4.062,966,2.473,969,4.665,971,1.923,979,1.653,1030,2.659,1046,2.473,1119,2.986,1140,2.473,1153,1.984,1172,3.409,1183,1.357,1191,2.053,1195,1.618,1293,3.694,1294,1.653,1328,2.473,1409,3.733,1433,2.473,1439,2.132,1480,6.555,1481,2.764,1482,3.539,1483,3.955,1484,4.252,1486,3.409,1487,2.473,1491,2.335,1492,2.473,1495,2.659,1496,1.984,1499,6.638,1500,2.941,1501,2.224,1502,2.941,1503,2.941,1504,6.713,1505,7.341,1506,4.702,1507,4.702,1508,5.33,1509,2.659,1510,1.923,1511,2.941,1512,2.941,1513,2.659,1514,2.473,1515,4.389,1516,2.941,1517,2.659,1518,2.659,1519,2.335,1520,2.224,1521,2.659,1522,2.473,1523,4.702,1524,4.702,1525,6.99,1526,2.941,1527,2.473,1528,2.659,1529,2.941,1530,3.955,1531,2.659,1532,2.941,1533,2.941,1534,2.473,1535,5.125,1536,4.252,1537,5.876,1538,5.876,1539,2.473,1540,4.252,1541,2.941,1542,2.941,1543,2.941,1544,3.074,1545,2.473,1546,5.313,1547,2.659,1548,2.941,1549,2.659,1550,2.659,1551,2.659,1552,2.659,1553,2.053,1554,2.941,1555,2.473]],["t/151",[3,1.316,6,1.116,7,0.302,9,1.197,12,1.421,14,0.62,16,0.808,17,1.241,19,1.021,21,1.159,32,1.596,33,1.087,34,0.658,40,1.336,47,1.176,51,1.003,54,0.925,55,1.071,66,1.3,74,1.446,80,1.147,81,1.099,82,1.065,84,2.118,97,0.869,103,1.212,105,1.316,108,1.551,115,2.226,117,1.914,120,1.554,124,1.974,126,1.836,128,1.502,135,1.366,137,0.993,141,1.349,143,0.732,145,1.824,146,1.254,148,1.956,149,2.051,151,1.767,157,2.297,165,3.777,173,2.904,178,2.051,184,0.886,189,2.226,191,2.297,192,1.836,227,2.864,231,1.134,234,2.051,238,2.104,241,1.914,245,2.704,246,1.461,248,1.767,250,2.297,269,1.481,295,1.384,319,2.003,341,1.801,342,1.836,345,1.705,366,2.627,372,1.956,373,1.648,397,1.547,398,3.451,400,2.38,432,1.801,473,3.685,495,1.914,534,3.826,537,4.631,547,2.002,549,2.377,554,4.225,583,1.676,589,2.162,601,2.682,611,1.874,617,1.914,618,2.469,623,1.596,639,6.269,640,1.571,650,3.044,651,4.225,657,2.713,662,1.914,663,2.469,677,1.914,678,2.297,682,3.064,683,2.473,684,2.791,690,1.874,701,3.077,712,2.104,747,1.284,761,1.198,764,1.198,771,1.254,829,2.554,837,1.402,841,2.377,844,2.162,854,2.104,933,2.529,956,1.735,1099,4.772,1132,2.469,1183,1.571,1199,2.297,1201,1.956,1235,1.767,1280,5.78,1293,1.874,1294,2.966,1329,2.469,1388,3.235,1464,5.506,1480,5.082,1497,2.704,1514,2.864,1539,2.864,1540,3.079,1556,6.463,1557,3.405,1558,3.405,1559,2.575,1560,2.297,1561,3.079,1562,3.405,1563,3.079,1564,5.278,1565,3.405,1566,5.278,1567,2.864,1568,5.436,1569,3.405,1570,3.405,1571,2.377,1572,3.405,1573,3.405,1574,3.405,1575,3.405,1576,3.405,1577,3.405,1578,2.469,1579,3.405,1580,3.079,1581,3.405,1582,3.405,1583,3.685,1584,5.78,1585,7.28,1586,3.405,1587,4.772,1588,5.278,1589,3.405,1590,3.079,1591,1.571,1592,1.571]],["t/153",[4,1.001,5,1.04,6,1.003,7,0.416,8,1.028,9,1.052,10,0.994,13,2.214,14,1.884,15,1.923,16,1.378,19,1.503,25,0.818,31,0.673,34,0.724,47,1.139,50,2.796,51,1.451,74,0.574,80,0.973,85,1.352,96,1.421,97,1.697,98,1.496,108,1.003,113,2.952,120,2.143,124,1.162,136,0.751,137,1.693,139,1.103,144,1.04,145,1.162,162,0.745,184,2.386,186,0.932,202,2.93,208,1.465,219,1.326,228,1.583,231,1.545,239,2.644,258,3.478,262,2.45,264,2.165,319,1.276,326,1.436,334,1.376,345,1.446,347,1.301,363,1.792,400,0.766,429,3.336,490,1.934,505,1.792,518,2.673,549,3.237,601,2.139,623,3.114,657,1.077,675,1.596,698,0.895,708,1.545,736,1.117,738,1.028,739,1.131,741,1.131,742,1.688,745,1.131,746,2.764,747,1.749,748,1.814,749,1.77,750,1.749,751,2.905,752,1.749,753,2.601,754,2.405,755,1.814,756,1.632,757,1.814,758,1.613,759,1.65,760,1.528,761,2.733,762,1.65,763,1.45,764,1.632,765,1.814,766,1.708,767,0.973,768,2.745,769,0.984,771,1.708,772,1.77,773,1.728,774,1.77,775,1.632,776,1.512,777,1.749,778,1.814,779,1.708,787,1.006,788,1.09,789,1.04,790,1.103,791,1.117,1112,1.835,1195,2.551,1235,1.499,1329,3.362,1388,1.446,1480,4.64,1481,2.726,1483,3.9,1492,3.9,1496,3.128,1499,4.193,1508,5.277,1528,2.613,1535,2.017,1546,4.193,1549,4.193,1550,4.193,1551,4.193,1552,4.193,1580,4.193,1584,2.294,1587,4.193,1590,4.193,1593,4.637,1594,2.89,1595,2.89,1596,2.89,1597,2.89,1598,2.89,1599,2.89,1600,2.89,1601,2.89,1602,2.89,1603,2.89,1604,2.89,1605,2.89,1606,2.89,1607,8.754,1608,4.637,1609,3.681]],["t/155",[5,1.154,34,1.033,46,4.078,51,1.287,76,3.126,183,3.369,266,3.883,400,2.196,402,3.555,601,3.578,665,4.148,682,2.646,930,4.3,1178,5.262,1610,6.58,1611,6.58]],["t/157",[40,1.062,46,2.101,47,1.233,48,2.101,54,0.611,87,2.362,90,4.352,108,0.737,183,1.736,194,2.4,319,1.175,444,2.545,529,4.581,535,2.639,540,1.52,574,2.649,601,3.007,602,2.101,642,2.792,643,2.639,644,2.881,665,2.138,930,2.216,957,2.4,1231,3.39,1338,2.881,1388,5.175,1423,3.861,1480,2.981,1610,3.39,1612,4.27,1613,3.861,1614,3.39,1615,3.096,1616,2.981,1617,2.981,1618,3.096,1619,3.39,1620,3.23,1621,3.23,1622,3.23,1623,3.096,1624,3.23,1625,3.23,1626,3.23,1627,3.096,1628,2.981,1629,3.861,1630,3.39,1631,3.39]],["t/160",[5,1.254,7,0.317,17,2.155,19,1.071,22,2.139,29,2.872,31,1.29,34,1.232,40,1.715,48,2.723,53,2.515,54,1.372,55,1.41,75,1.863,87,2.087,90,3.542,95,3.253,124,1.387,141,2.193,173,3.045,227,4.655,231,1.843,296,2.478,315,2.926,321,2.374,334,2.635,366,3.057,373,2.678,374,2.635,396,2.635,400,2.263,414,5.452,416,3.514,444,2.25,456,4.394,464,3.11,529,3.42,540,2.676,556,2.984,583,2.723,598,3.863,639,3.514,650,3.82,665,3.764,682,3.06,685,2.678,707,1.947,714,2.087,769,2.56,817,2.723,826,4.916,957,3.11,1085,3.734,1211,4.012,1338,3.734,1388,4.276,1393,5.004,1534,4.655,1578,4.012,1632,5.534,1633,7.52,1634,4.394,1635,3.863,1636,5.004,1637,5.004,1638,4.655,1639,5.004,1640,5.534,1641,5.534,1642,5.534,1643,5.534,1644,5.534]],["t/162",[4,0.948,5,1.154,12,3.459,90,3.203,124,2.434,400,2.573,470,3.71,528,4.56,540,2.949,682,3.101,830,5.709,956,4.222,1515,5.418]],["t/164",[1,2.732,4,1.081,5,1.024,6,1.888,7,0.541,9,1.545,14,1.239,19,1.318,22,2.632,34,0.849,40,1.603,47,1.135,51,1.057,54,0.975,55,1.002,72,3.004,74,1.353,101,2.921,108,1.769,114,5.15,134,3.826,135,3.457,219,2.703,244,4.324,495,3.826,527,2.962,690,4.741,691,4.101,1059,4.101,1645,5.406,1646,6.809,1647,4.936,1648,5.406,1649,6.809,1650,4.936,1651,6.809]],["t/166",[4,0.56,5,1.187,6,1.501,7,0.458,9,1.111,14,0.891,15,1.008,16,1.162,17,1.625,25,1.387,30,2.452,34,0.861,38,2.748,40,1.614,46,2.41,47,1.121,54,0.989,55,1.017,66,1.87,74,0.973,81,2.959,87,1.848,90,3.78,136,1.797,144,1.763,145,1.732,172,4.429,173,3.802,175,5.812,176,4.12,183,1.991,218,3.419,266,2.295,288,2.752,315,2.59,347,1.374,352,3.551,366,1.991,397,2.226,409,3.889,416,4.388,444,2.809,464,2.752,473,3.419,475,3.551,529,4.27,535,3.027,540,1.743,574,2.923,602,2.41,605,4.429,606,2.95,637,1.893,639,3.11,650,4.023,665,2.452,668,3.304,682,2.777,684,2.59,685,4.208,691,2.95,695,2.541,698,1.517,707,1.723,715,3.551,759,1.743,817,3.4,930,2.541,1211,5.01,1232,4.824,1310,4.429,1338,4.662,1388,4.008,1560,3.304,1634,3.889,1637,7.24,1652,5.01,1653,5.812,1654,4.429,1655,4.898,1656,3.419,1657,4.12,1658,4.898,1659,4.429,1660,6.91,1661,6.91,1662,4.429,1663,3.419,1664,4.898,1665,4.898]],["t/168",[1,2.561,4,0.73,5,1.153,14,1.161,15,1.313,17,1.501,25,1.807,31,1.487,34,0.796,40,1.555,47,1.155,54,1.184,55,1.216,74,1.268,75,2.149,90,3.195,93,2.7,103,2.942,124,2.072,135,2.561,136,1.66,143,1.972,145,2.072,152,3.195,159,2.529,165,3.312,184,2.15,222,3.195,299,3.375,322,5.067,326,1.976,351,4.045,373,3.088,377,3.666,527,2.776,533,2.857,538,3.375,540,3.263,612,3.752,650,2.467,678,4.306,684,3.375,685,3.088,691,5.522,760,2.103,779,2.351,840,3.038,889,3.586,943,4.456,1101,3.666,1666,5.368,1667,3.944,1668,4.627,1669,5.771,1670,5.368]],["t/171",[0,3.709,4,1.178,7,0.525,19,1.776,51,1.599,54,1.314,55,1.35,70,2.843,81,2.432,82,2.358,101,3.233,105,3.547,107,5.984,159,2.986,221,5.464,251,3.279,427,3.588,457,3.146,539,3.985,758,2.623,759,2.682,1395,6.815,1671,7.537,1672,7.286,1673,7.537,1674,5.984,1675,6.815,1676,5.984]],["t/174",[4,0.396,5,0.636,6,1.371,7,0.42,9,1.213,12,1.445,14,1.189,15,1.1,19,1.536,25,1.514,34,1.18,40,1.347,47,1.205,48,3.906,53,1.575,54,0.935,55,1.081,56,1.649,57,2.086,58,1.55,72,1.528,84,3.186,87,1.306,88,2.092,108,1.689,112,2.546,117,5.076,119,1.232,120,2.788,122,1.965,124,0.868,126,2.883,128,1.528,159,1.372,163,2.75,183,3.227,188,3.877,189,3.496,190,3.877,191,3.608,192,3.961,193,4.245,202,3.165,215,2.631,246,3.151,248,2.775,250,3.608,287,4.539,296,1.55,336,1.797,360,2.036,361,2.264,392,1.797,415,1.797,444,2.174,549,3.733,556,1.867,574,1.465,623,1.623,650,1.338,683,1.623,696,2.75,716,3.733,781,3.733,782,4.56,783,4.56,784,4.56,785,4.56,786,3.608,930,4.119,931,2.036,996,2.264,1098,4.94,1108,1.946,1179,1.946,1185,2.619,1256,4.044,1329,3.877,1426,2.913,1677,4.539,1678,6.532,1679,3.463,1680,2.619,1681,2.619,1682,2.619,1683,2.619,1684,3.131,1685,3.131,1686,3.131,1687,3.131,1688,3.131,1689,3.131,1690,3.463,1691,3.463,1692,3.463,1693,3.463,1694,3.463,1695,3.131,1696,2.913,1697,3.131,1698,3.131,1699,3.463,1700,3.463,1701,3.463,1702,3.463,1703,2.336,1704,2.336,1705,3.131,1706,4.835,1707,3.131,1708,4.498,1709,4.498,1710,3.131,1711,4.835,1712,4.835,1713,4.835,1714,3.877,1715,4.498,1716,4.245,1717,4.835,1718,4.835,1719,3.131,1720,4.835,1721,2.913]],["t/176",[4,0.751,5,0.416,6,1.714,7,0.308,9,1.222,14,1.196,15,1.352,16,1.278,19,1.799,25,1.861,30,1.75,34,1.222,40,1.115,46,4.318,47,1.211,48,3.633,81,1.128,82,1.094,83,2.744,84,2.637,87,1.319,88,1.368,93,1.479,96,1.651,103,1.917,108,1.693,117,4.733,119,2.338,120,2.887,122,2.423,124,1.85,126,4.886,127,4.531,163,2.776,192,3.981,202,2.785,215,2.65,246,3.613,248,3.831,250,4.981,287,5.205,400,0.926,607,2.359,696,2.776,716,3.761,781,3.761,782,3.761,783,3.761,784,3.761,785,3.761,786,3.634,930,3.831,1710,3.161,1711,4.871,1712,4.871,1713,4.871,1714,2.535,1719,3.161,1720,6.675,1722,3.496,1723,2.776,1724,9.296,1725,8.406,1726,4.277,1727,3.496,1728,5.387,1729,7.383,1730,5.387,1731,5.387,1732,7.383,1733,5.387,1734,5.387,1735,5.387,1736,5.387,1737,5.387,1738,5.387]],["t/178",[4,0.687,5,0.814,6,1.182,7,0.51,9,1.364,14,1.359,15,1.237,19,1.612,25,1.702,31,0.709,34,1.078,39,2.986,40,1.348,43,1.964,47,1.216,53,0.896,54,0.692,55,0.884,56,1.449,57,1.833,58,1.362,66,1.162,71,1.881,72,1.343,74,1.579,84,2.747,87,1.148,88,1.891,94,3.062,108,1.608,112,1.449,117,2.716,120,2.341,126,2.606,128,1.343,137,0.887,145,1.211,146,2.521,147,3.169,159,1.206,163,3.837,183,3.035,188,3.503,189,3.159,190,3.503,191,3.26,192,3.691,193,3.837,202,1.823,219,1.382,246,2.073,248,2.508,250,3.26,282,1.449,287,4.23,288,1.71,296,1.362,319,1.33,336,1.579,341,1.609,360,1.789,361,1.99,392,1.579,400,0.806,442,1.641,444,1.964,518,1.047,549,3.374,556,1.641,574,1.287,601,1.78,623,1.426,656,2.046,657,1.801,683,1.426,696,2.416,769,1.036,829,2.338,891,1.833,928,1.551,933,1.191,959,2.773,996,1.99,1098,3.655,1108,1.71,1112,3.069,1179,1.71,1183,1.404,1235,2.508,1256,3.655,1294,2.716,1329,3.503,1583,3.374,1591,2.229,1592,2.229,1677,4.911,1680,2.302,1681,2.302,1682,2.302,1683,2.302,1684,2.752,1685,2.752,1686,2.752,1687,2.752,1688,2.752,1689,2.752,1695,2.752,1696,2.56,1697,2.752,1698,2.752,1703,2.053,1704,2.053,1705,2.752,1706,4.37,1707,2.752,1708,4.065,1709,4.065,1716,3.837,1717,4.37,1718,4.37,1721,2.56,1739,3.043,1740,3.374,1741,2.56,1742,2.752,1743,2.56,1744,2.302,1745,4.055,1746,2.416,1747,3.817,1748,3.93,1749,2.416,1750,2.56,1751,2.56,1752,4.37,1753,4.37,1754,3.846,1755,2.776,1756,3.159,1757,3.26,1758,3.503,1759,3.655,1760,3.503,1761,3.374]],["t/180",[7,0.536,40,1.703,47,0.832,54,1.116,55,1.147,80,3.153,97,1.989,119,2.774,143,1.676,173,4.288,259,4.477,317,5.258,400,2.065,470,3.489,617,4.38,640,3.596,650,3.012,682,2.489,1338,6.318,1578,5.65,1615,6.789,1663,5.441,1762,6.555,1763,5.258,1764,6.555,1765,5.258]],["t/182",[4,0.946,5,0.619,7,0.473,14,1.312,15,1.071,17,2.1,25,1.474,31,1.213,34,0.649,38,2.614,47,1.149,51,0.808,54,0.745,55,0.766,74,1.774,80,1.752,91,1.791,93,2.202,103,1.852,105,2.786,122,2.388,136,1.353,143,2.139,145,1.807,159,2.062,165,2.7,184,1.875,274,3.216,299,4.722,322,4.132,326,1.611,351,3.65,353,4.377,377,2.989,385,2.264,434,4.377,525,2.036,527,2.264,533,2.33,538,3.812,540,3.663,612,3.059,650,2.011,678,3.511,684,4.722,691,4.342,695,2.7,714,1.963,718,4.913,760,1.715,762,1.852,840,2.477,889,2.924,927,3.305,1085,3.511,1108,4.051,1544,5.838,1614,4.132,1615,3.773,1635,3.633,1650,3.773,1657,4.377,1666,4.377,1667,3.216,1668,3.773,1669,4.705,1670,6.064,1766,4.705,1767,5.724,1768,5.204,1769,4.705,1770,5.204,1771,5.204,1772,5.204,1773,7.209,1774,4.132,1775,6.064,1776,4.705,1777,4.705,1778,4.705,1779,4.705,1780,3.936]],["t/184",[7,0.574,9,1.219,13,1.789,14,0.978,16,1.275,29,2.787,34,0.67,47,1.045,50,1.934,51,0.834,54,1.055,55,1.084,71,3.319,85,1.566,91,2.536,97,2.147,101,3.161,108,1.452,120,1.582,122,2.62,124,1.346,135,2.156,136,1.916,143,1.155,159,2.128,162,1.384,178,3.235,186,3.161,219,1.536,265,3.319,286,2.051,319,1.478,321,2.304,340,5.113,386,3.894,539,4.447,540,1.912,542,6.398,583,2.643,598,3.75,601,1.979,690,2.956,699,2.405,701,2.557,703,2.84,714,3.173,736,2.076,746,1.912,817,2.643,870,4.063,964,2.787,979,3.019,1045,4.857,1459,3.75,1615,6.098,1620,4.063,1764,4.518,1781,8.766,1782,4.857,1783,9.051,1784,9.484,1785,5.372,1786,5.372,1787,5.372,1788,4.518,1789,4.518,1790,5.372,1791,5.372,1792,5.372]],["t/186",[4,1.044,5,1.085,6,0.568,7,0.47,8,1.17,9,1.165,10,1.132,12,1.373,13,2.38,14,1.92,15,1.988,16,1.5,19,1.661,25,0.931,31,0.766,34,0.788,38,1.039,47,1.088,50,2.957,51,1.5,74,0.653,80,1.107,85,1.498,96,1.575,97,1.824,98,1.658,108,1.338,112,1.566,113,3.09,120,1.862,122,1.691,136,0.855,137,1.843,139,1.256,144,1.184,162,0.847,178,3.094,184,2.016,186,2.04,208,1.624,219,1.469,228,1.4,231,1.711,239,2.796,258,1.473,262,2.372,264,1.915,319,0.905,326,1.591,347,1.441,363,1.985,490,2.106,505,1.985,518,2.827,540,1.17,675,1.768,698,1.018,708,1.711,714,1.241,736,1.271,738,1.17,739,1.287,741,1.287,742,1.871,745,1.287,746,2.923,747,1.938,748,2.01,749,1.961,750,1.938,751,3.054,752,1.938,753,2.796,754,2.544,755,2.01,756,1.808,757,2.01,758,1.788,759,1.828,760,1.693,761,2.891,762,1.828,763,1.607,764,1.808,765,2.01,766,1.893,767,1.107,768,2.924,769,1.12,771,1.893,772,1.961,773,1.915,774,1.961,775,1.808,776,1.675,777,1.938,778,2.01,779,1.893,787,1.145,788,1.241,789,1.184,790,1.256,791,1.271,879,2.488,1508,2.611,1615,6.894,1769,4.645,1776,2.974,1777,4.645,1778,2.974,1779,4.645,1781,6.814,1782,2.974,1793,5.138,1794,3.289,1795,3.289,1796,3.289,1797,3.289,1798,5.138,1799,5.138]],["t/188",[4,0.934,5,0.909,6,0.779,7,0.508,8,0.72,9,1.023,10,0.696,12,0.844,13,1.776,14,1.766,15,1.763,16,1.265,17,1.061,19,1.533,20,1.529,22,0.782,25,0.573,31,0.471,32,0.948,33,1.441,34,0.43,40,1.481,46,4.607,47,1.159,50,2.345,51,1.33,54,0.857,55,0.88,56,0.963,72,1.522,74,1.059,76,2.011,80,0.681,81,1.113,84,1.384,85,1.006,96,1.057,97,1.361,98,1.113,105,0.782,108,1.266,112,1.642,113,2.551,118,3.119,119,1.897,120,1.328,122,1.6,123,3.119,124,1.917,125,3.385,126,1.86,127,2.901,136,0.897,137,1.315,139,0.772,141,2.904,143,0.742,144,0.728,145,0.865,159,0.801,162,0.889,168,2.739,169,2.901,184,1.809,186,1.456,208,1.09,215,2.623,216,1.642,219,0.986,222,1.012,228,0.94,231,1.149,239,2.218,243,1.669,258,2.917,262,2.674,264,0.754,273,0.88,286,2.285,298,1.364,299,1.069,318,2.255,319,1.793,326,1.068,329,1.829,347,0.968,363,1.333,365,1.412,372,1.162,385,0.88,401,1.939,490,1.503,505,1.333,518,2.242,527,1.962,533,0.905,588,2.255,601,0.745,637,1.333,641,0.995,657,1.286,662,1.136,675,1.187,682,0.646,693,2.788,698,1.853,699,0.905,703,1.069,707,0.712,708,1.503,714,1.702,720,2.739,736,0.782,738,0.72,739,0.791,741,0.791,742,1.256,745,0.791,746,2.319,747,1.301,748,1.35,749,1.317,750,1.301,751,2.476,752,1.702,753,2.086,754,2.017,755,1.35,756,1.214,757,1.35,758,1.2,759,1.228,760,1.487,761,2.293,762,1.228,763,1.079,764,1.214,765,1.35,766,1.271,767,1.162,768,2.257,769,0.688,771,1.271,772,1.317,773,1.286,774,1.317,775,1.214,776,1.125,777,1.301,778,1.35,779,1.271,786,1.364,787,0.704,788,1.301,789,0.728,790,0.772,791,0.782,796,1.218,829,0.979,830,2.028,888,2.408,889,2.535,931,3.134,944,4.299,957,1.136,964,1.049,1203,1.606,1481,3.134,1520,2.609,1525,2.739,1527,1.701,1617,2.408,1645,2.739,1650,1.466,1714,3.27,1715,3.794,1764,1.701,1788,1.701,1800,2.022,1801,2.022,1802,3.45,1803,1.412,1804,3.45,1805,4.511,1806,1.529,1807,3.45,1808,2.022,1809,5.033,1810,4.511,1811,3.45,1812,1.466,1813,2.022,1814,2.022,1815,3.45,1816,2.022,1817,4.511,1818,3.45,1819,2.022,1820,2.022,1821,2.901,1822,2.022,1823,2.022,1824,2.022,1825,2.022,1826,3.45,1827,2.022,1828,2.022,1829,2.022,1830,2.022,1831,2.022,1832,4.191,1833,2.022,1834,2.022,1835,2.022,1836,2.022,1837,2.022,1838,3.45,1839,3.45,1840,3.45,1841,3.45,1842,3.119,1843,3.119,1844,2.739,1845,3.45,1846,3.45,1847,3.45,1848,3.45,1849,3.45]],["t/190",[5,1.204,7,0.543,29,4.922,34,0.993,88,3.116,170,4.796,205,4.381,261,3.324,366,3.237,397,3.618,683,3.731,714,3.004,799,6.023,810,6.322,847,6.322,971,5.206,1235,4.132,1616,7.073,1850,6.698,1851,7.2,1852,7.2]],["t/192",[7,0.518,16,1.473,29,3.222,47,0.867,54,0.889,55,0.913,77,4.189,78,5.449,81,2.004,101,2.663,108,1.402,134,3.489,136,2.59,162,1.6,239,2.114,271,2.492,319,1.709,321,2.663,325,3.416,334,2.956,374,3.865,402,2.663,466,5.668,495,3.489,637,2.4,650,2.4,706,4.335,708,2.705,709,3.943,754,1.923,760,2.982,787,2.161,790,2.371,859,3.65,891,4.89,892,4.293,964,3.222,1032,4.189,1388,3.108,1439,4.501,1482,3.74,1486,5.886,1487,5.222,1490,7.531,1491,4.93,1515,4.059,1518,5.614,1520,4.696,1521,5.614,1531,5.614,1553,4.335,1567,5.222,1616,5.668,1851,5.614,1853,7.906,1854,9.596,1855,8.12,1856,6.209,1857,6.209,1858,5.614,1859,6.209]],["t/194",[3,2.593,5,0.798,14,1.221,15,1.381,17,1.578,34,0.836,38,2.12,40,1.138,47,1.145,51,1.042,75,2.259,81,2.165,82,2.099,108,1.158,109,4.146,145,2.353,228,1.829,261,2.8,345,3.358,366,3.47,402,2.878,415,3.481,470,3.004,650,2.593,662,3.77,663,6.188,682,2.998,761,2.361,794,3.854,844,4.26,956,3.418,990,3.301,1032,4.526,1209,5.327,1291,6.806,1321,4.386,1388,3.358,1402,4.864,1616,6.554,1627,4.864,1853,5.327,1860,6.067,1861,8.536,1862,8.536,1863,6.067,1864,6.71,1865,6.71,1866,6.71,1867,5.643,1868,6.71,1869,6.71]],["t/196",[5,0.871,6,0.919,7,0.516,9,1.208,12,2.223,15,1.096,25,1.508,34,0.913,36,2.165,47,1.164,54,1.199,55,1.232,58,2.384,70,2.763,84,2.137,88,4.171,97,1.359,102,2.939,108,1.632,120,2.784,125,3.381,134,2.992,143,1.575,184,1.385,186,1.718,219,1.523,237,4.306,252,2.871,269,2.316,271,2.137,273,2.316,336,2.763,405,3.291,525,2.084,540,3.209,583,2.62,595,3.481,650,2.831,763,1.666,812,5.113,859,3.13,861,2.763,889,5.49,1388,3.666,1508,7.757,1616,6.295,1725,4.815,1853,7.506,1863,4.815,1870,5.815,1871,3.718,1872,5.325,1873,5.325,1874,5.325,1875,7.57,1876,5.325,1877,7.325,1878,4.479,1879,5.325,1880,5.325,1881,9.018,1882,5.325,1883,5.325,1884,5.325]],["t/198",[4,1.05,5,1.091,6,1.105,7,0.448,8,1.194,9,1.184,10,1.155,13,2.406,14,1.925,15,1.998,16,1.519,19,1.603,25,0.95,31,0.782,34,0.65,47,1.106,50,2.982,51,1.507,74,0.667,80,1.13,85,1.522,88,2.505,96,1.599,97,1.844,98,1.684,108,1.105,113,3.111,120,2.127,124,0.841,136,0.873,137,1.867,139,1.281,144,1.208,162,0.864,184,1.665,186,1.083,208,1.649,219,1.492,228,1.422,231,1.738,239,2.82,262,2.259,264,1.251,326,1.616,347,1.464,363,2.017,466,2.342,490,2.133,505,2.017,518,2.851,540,1.194,598,2.342,675,1.796,698,1.039,708,1.738,736,1.297,738,1.194,739,1.313,741,1.313,742,1.9,745,1.313,746,2.948,747,1.968,748,2.042,749,1.992,750,1.968,751,3.077,752,1.968,753,2.826,754,2.565,755,2.042,756,1.836,757,2.042,758,1.816,759,1.857,760,1.72,761,2.915,762,1.857,763,1.632,764,1.836,765,2.042,766,1.922,767,1.13,768,2.951,769,1.142,771,1.922,772,1.992,773,1.945,774,1.992,775,1.836,776,1.701,777,1.968,778,2.042,779,1.922,787,1.168,788,1.266,789,1.208,790,1.281,791,1.297,889,1.886,984,2.021,1535,2.342,1616,6.553,1853,5.083,1870,4.143,1885,5.218,1886,3.355,1887,3.355,1888,3.355,1889,3.355,1890,3.355,1891,3.355,1892,3.034,1893,3.034,1894,3.355,1895,3.355,1896,3.034,1897,3.355,1898,2.822,1899,5.218,1900,5.218,1901,5.218]],["t/200",[4,0.717,5,1.145,7,0.537,14,1.141,15,0.881,18,5.343,25,1.212,26,2.718,34,0.925,38,2.583,40,1.542,47,1.129,51,0.664,54,1.17,55,1.202,74,1.475,82,1.962,93,2.653,97,1.093,103,1.523,108,0.739,110,3.103,122,2.327,135,1.718,136,1.113,137,1.248,143,1.955,145,1.86,151,2.221,159,2.941,165,2.221,173,2.355,175,3.6,184,1.93,222,2.143,226,1.916,228,2.023,262,1.236,269,1.862,295,1.74,299,2.263,322,3.398,326,1.325,342,4.902,351,3.839,377,2.459,400,1.134,402,2.69,470,1.916,527,1.862,533,1.916,538,2.263,540,3.555,574,1.811,612,2.516,650,2.424,678,4.231,682,2.37,684,4.321,685,3.035,691,3.777,754,1.325,760,1.411,795,2.888,840,2.038,870,3.237,879,6.181,889,2.405,1108,3.524,1117,2.308,1183,1.975,1222,2.888,1294,2.405,1338,4.231,1391,2.718,1457,6.243,1501,3.237,1544,5.343,1614,3.398,1620,7.285,1663,2.988,1666,3.6,1667,2.645,1668,3.103,1670,3.6,1774,3.398,1775,5.275,1780,3.237,1781,4.979,1806,3.237,1809,3.6,1902,4.378,1903,4.28,1904,4.28,1905,4.28,1906,3.87,1907,3.6,1908,4.28,1909,4.28,1910,3.87,1911,4.28,1912,3.87,1913,6.272,1914,6.272,1915,4.28]],["t/202",[4,1.063,5,1.105,6,0.604,7,0.456,8,1.244,9,1.222,10,1.203,13,2.459,14,1.936,15,2.018,16,1.559,19,1.63,25,0.99,31,0.815,34,0.671,47,1.099,50,3.032,51,1.522,74,0.695,80,1.177,85,1.571,96,1.651,97,1.885,98,1.738,108,1.134,113,3.153,120,1.935,122,1.757,136,0.909,137,1.916,139,1.335,144,1.258,162,0.901,178,3.244,184,1.709,186,1.128,208,1.702,219,1.54,228,1.468,231,1.794,239,2.867,262,1.897,264,2.008,326,1.668,347,1.511,363,2.082,490,2.189,505,2.082,518,2.899,675,1.854,698,1.083,708,1.794,736,1.351,738,1.244,739,1.368,741,1.368,742,1.961,745,1.368,746,2.997,747,2.032,748,2.108,749,2.057,750,2.032,751,3.123,752,2.032,753,2.889,754,2.608,755,2.108,756,1.895,757,2.108,758,1.874,759,1.917,760,1.775,761,2.964,762,1.917,763,1.685,764,1.895,765,2.108,766,1.984,767,1.177,768,3.008,769,1.19,771,1.984,772,2.057,773,2.008,774,2.057,775,1.895,776,1.757,777,2.032,778,2.108,779,1.984,787,1.217,788,1.319,789,1.258,790,1.335,791,1.351,879,2.644,1620,7.18,1781,4.277,1912,4.871,1916,5.387,1917,3.496,1918,3.496,1919,3.496,1920,3.496,1921,5.387,1922,5.387]],["t/204",[1,3.748,4,0.887,7,0.444,47,0.997,54,1.111,55,1.142,91,2.671,97,1.981,105,2.999,119,2.762,145,1.945,159,3.075,162,1.999,215,3.819,216,3.695,286,2.963,533,3.474,699,3.474,817,3.819,931,4.562,957,5.249,1185,5.869,1481,5.491,1486,5.626,1621,7.064,1923,4.562,1924,7.017,1925,6.527]],["t/206",[7,0.576,14,1.511,15,1.709,21,2.188,30,3.217,47,0.886,51,1.289,54,1.189,55,1.222,64,3.162,74,1.65,82,2.01,92,4.659,102,2.579,111,2.796,122,2.898,136,1.671,143,1.978,145,1.611,146,3.059,159,2.546,241,4.666,244,4.081,263,4.081,267,3.778,269,2.796,274,3.971,295,2.613,296,2.877,299,3.398,321,2.757,385,4.229,386,4.659,762,2.287,803,3.778,957,3.612,979,3.612,1145,3.612,1183,2.965,1481,3.778,1621,6.957,1926,5.406,1927,5.406,1928,7.508,1929,4.202,1930,5.406,1931,6.427,1932,6.427,1933,5.406,1934,6.427,1935,8.304]],["t/208",[4,1.051,5,1.092,6,0.58,7,0.448,8,1.196,9,1.185,10,1.157,13,2.408,14,1.926,15,1.999,16,1.521,19,1.604,25,0.952,31,0.783,34,0.651,47,1.092,50,2.984,51,1.508,74,0.668,80,1.132,85,1.524,96,1.602,97,2.116,98,1.686,108,1.107,113,3.113,119,2.281,120,1.888,122,1.714,136,0.874,137,1.869,139,1.283,143,1.124,144,1.21,162,0.866,184,1.667,186,1.085,208,1.651,215,3.154,216,3.052,219,1.494,228,1.424,231,1.741,239,2.822,262,2.261,264,1.253,286,1.995,294,1.931,326,1.618,347,1.466,363,2.019,385,1.462,490,2.135,505,2.019,518,2.853,675,1.798,698,1.041,708,1.741,736,1.299,738,1.196,739,1.315,741,1.315,742,1.903,745,1.315,746,2.95,747,1.971,748,2.045,749,1.995,750,1.971,751,3.079,752,1.971,753,2.829,754,2.567,755,2.045,756,1.839,757,2.045,758,1.818,759,1.86,760,1.722,761,2.917,762,1.86,763,1.634,764,1.839,765,2.045,766,1.925,767,1.132,768,2.954,769,1.144,771,1.925,772,1.995,773,1.948,774,1.995,775,1.839,776,1.704,777,1.971,778,2.045,779,1.925,787,1.17,788,1.268,789,1.21,790,1.283,791,1.299,1621,7.346,1928,3.039,1930,4.395,1936,5.225,1937,3.362,1938,3.362,1939,3.362,1940,3.362,1941,3.362,1942,5.225,1943,5.225,1944,5.225,1945,5.225]],["t/210",[1,3.141,4,0.895,47,1.002,53,2.305,54,1.121,55,1.151,91,2.694,97,1.998,105,3.025,143,2.019,148,5.393,162,2.017,215,3.851,216,3.726,294,4.496,533,3.504,564,4.97,670,4.496,698,2.423,699,3.504,702,4.714,817,3.851,1622,7.101,1923,4.601,1924,7.077,1925,6.583,1946,6.214]],["t/212",[7,0.576,14,1.511,15,1.709,21,2.188,30,3.217,47,0.886,51,1.289,54,1.189,55,1.222,64,3.162,74,1.65,82,2.01,102,2.579,111,2.796,122,2.898,136,1.671,143,1.978,146,3.059,148,3.692,159,2.546,226,2.877,241,4.666,244,4.081,263,4.081,267,3.778,269,2.796,274,3.971,295,2.613,296,3.718,299,3.398,321,2.757,385,4.229,386,4.659,762,2.287,803,3.778,979,3.612,1145,3.612,1183,2.965,1417,5.406,1622,6.957,1926,5.406,1927,5.406,1929,4.202,1930,5.406,1933,5.406,1947,7.508,1948,6.427,1949,6.427,1950,6.427,1951,6.427,1952,6.427]],["t/214",[4,1.047,5,1.088,6,0.574,7,0.446,8,1.183,9,1.175,10,1.144,13,2.394,14,1.923,15,1.994,16,1.51,19,1.597,25,0.942,31,0.775,34,0.646,47,1.09,50,2.97,51,1.504,74,0.661,80,1.12,85,1.511,96,1.588,97,1.835,98,1.672,108,1.099,113,3.101,119,2.265,120,1.875,122,1.702,136,0.865,137,1.856,139,1.269,143,1.114,144,1.197,148,2.976,162,0.857,184,1.655,186,1.073,208,1.637,215,3.132,216,3.03,219,1.482,228,1.412,231,1.726,239,2.809,262,2.25,264,1.239,294,1.91,326,1.604,347,1.453,363,2.002,385,1.446,490,2.12,505,2.002,518,2.84,533,2.32,564,3.29,675,1.783,698,1.029,708,1.726,736,1.285,738,1.183,739,1.301,741,1.301,742,1.886,745,1.301,746,2.937,747,1.954,748,2.027,749,1.978,750,1.954,751,3.066,752,1.954,753,2.812,754,2.555,755,2.027,756,1.823,757,2.027,758,1.803,759,1.844,760,1.707,761,2.904,762,1.844,763,1.621,764,1.823,765,2.027,766,1.909,767,1.12,768,2.939,769,1.132,771,1.909,772,1.978,773,1.931,774,1.978,775,1.823,776,1.689,777,1.954,778,2.027,779,1.909,787,1.157,788,1.254,789,1.197,790,1.269,791,1.285,866,3.756,1622,7.327,1946,4.113,1947,5.756,1953,5.181,1954,3.325,1955,3.325,1956,3.325,1957,3.325,1958,3.325,1959,5.181,1960,5.181,1961,4.358,1962,5.181]],["t/216",[3,2.975,4,0.976,5,0.915,7,0.488,12,2.12,14,0.59,15,1.289,17,1.667,18,2.12,19,1.863,22,1.253,28,2.803,31,1.184,34,0.96,36,2.546,38,1.98,40,1.063,47,1.133,51,1.101,54,0.727,55,0.922,57,1.953,74,1.244,75,1.092,76,2.363,80,1.092,90,1.253,93,1.372,94,1.652,97,1.297,105,1.253,108,1.41,135,2.039,141,2.013,143,1.093,145,0.813,162,0.835,168,2.574,184,1.321,208,1.606,219,0.927,222,2.543,228,1.707,271,2.514,273,2.21,281,1.431,296,1.452,299,1.715,326,2.195,342,1.748,351,1.431,366,1.318,372,1.863,373,1.569,374,1.544,385,1.41,390,1.906,400,1.346,401,2.855,402,2.179,403,3.226,404,1.784,415,1.683,418,2.543,427,1.544,460,2.452,470,3.822,472,1.715,508,2.264,517,2.12,518,1.116,519,3.226,532,2.275,540,1.154,599,2.727,601,2.308,606,1.953,623,1.519,637,3.415,665,1.623,682,2.608,684,1.715,698,2.384,699,1.452,761,1.788,776,2.043,794,1.863,801,2.574,803,2.987,830,4.801,835,2.351,839,3.842,861,1.683,884,2.12,979,1.822,984,3.06,988,2.452,1027,2.264,1032,2.188,1055,2.932,1059,1.953,1063,4.594,1078,2.932,1081,2.932,1092,1.906,1139,2.452,1177,2.351,1179,1.822,1187,2.727,1201,1.863,1210,2.574,1327,2.932,1379,3.06,1391,2.059,1412,3.139,1459,2.264,1481,6.019,1527,2.727,1544,2.12,1617,4.373,1618,6.587,1619,4.973,1625,3.842,1812,5.581,1906,2.932,1963,3.243,1964,2.932,1965,4.034,1966,2.574,1967,6.264,1968,3.243,1969,7.09,1970,3.243,1971,2.932,1972,3.243,1973,3.243,1974,3.243,1975,3.243,1976,2.727,1977,3.243,1978,3.243,1979,3.243,1980,3.243,1981,3.243,1982,3.243,1983,2.932,1984,2.932,1985,3.243,1986,3.243,1987,5.081,1988,6.264,1989,5.664,1990,4.034,1991,5.081,1992,2.574,1993,5.081,1994,2.932,1995,2.727,1996,5.269,1997,3.243,1998,3.243]],["t/218",[4,1.059,5,1.076,6,0.553,7,0.438,8,1.14,9,1.141,10,1.102,13,2.346,14,1.921,15,2.003,16,1.475,19,1.572,25,0.907,31,0.746,34,0.627,38,1.012,40,1.195,47,1.131,50,2.924,51,1.49,70,2.656,74,0.636,80,1.078,85,1.467,95,1.883,96,1.542,97,1.284,98,1.624,108,1.073,113,3.062,120,1.83,135,1.285,136,1.99,137,1.812,139,1.223,141,2.79,144,1.153,152,1.603,162,0.825,184,0.833,186,1.033,208,1.59,219,1.439,228,1.371,231,1.676,239,2.765,262,2.346,264,1.194,326,1.558,347,1.411,363,1.945,385,1.393,490,2.07,505,1.945,518,2.796,637,1.945,675,1.732,698,0.992,708,1.676,736,1.238,738,1.14,739,1.253,741,1.253,742,1.832,745,1.253,746,2.891,747,1.898,748,1.969,749,1.921,750,1.898,751,3.024,752,1.898,753,2.755,754,2.515,755,1.969,756,1.771,757,1.969,758,1.751,759,1.791,760,1.658,761,2.859,762,1.791,763,1.574,764,1.771,765,1.969,766,1.854,767,1.078,768,2.887,769,1.09,771,1.854,772,1.921,773,1.875,774,1.921,775,1.771,776,1.641,777,1.898,778,1.969,779,1.854,787,1.114,788,1.208,789,1.153,790,1.223,791,1.238,830,3.653,944,4.352,1544,2.094,1618,5.549,1619,7.186,1832,4.241,1989,4.55,1999,5.032,2000,3.203,2001,3.203,2002,3.203,2003,3.203,2004,3.203,2005,3.203,2006,5.032,2007,5.032,2008,5.032,2009,5.032,2010,5.032]],["t/220",[4,1.111,5,1.201,6,1.282,7,0.452,8,1.071,9,1.086,10,1.035,13,2.265,14,1.934,15,1.973,16,1.415,19,1.53,22,1.163,25,1.356,31,1.39,33,0.961,34,0.597,40,1.259,43,1.223,47,1.069,48,5.007,50,2.846,51,1.466,54,0.431,55,0.443,74,0.598,75,1.013,80,1.013,85,1.396,96,1.468,97,1.222,98,1.545,108,1.03,113,2.996,119,1.704,120,1.757,122,1.595,124,1.495,136,0.782,137,1.739,139,1.149,143,0.647,144,1.083,162,0.775,184,0.782,186,0.971,202,2.25,208,1.513,215,2.935,219,1.706,228,1.626,231,1.595,239,2.692,246,3.184,262,2.144,264,1.121,326,1.483,341,1.591,347,1.343,363,1.851,432,1.591,457,1.256,490,1.987,505,1.851,518,2.721,540,1.071,606,1.812,675,1.648,682,0.961,690,1.655,698,0.931,701,1.432,708,1.595,716,3.343,736,1.163,738,1.071,739,1.177,741,1.177,742,1.744,745,1.177,746,2.814,747,1.806,748,1.874,749,1.828,750,1.806,751,2.951,752,1.806,753,2.661,754,2.448,755,1.874,756,1.685,757,1.874,758,1.666,759,1.704,760,1.578,761,2.783,762,1.704,763,1.498,764,1.685,765,1.874,766,1.764,767,1.013,768,2.8,769,1.024,770,4.33,771,1.764,772,1.828,773,1.785,774,1.828,775,1.685,776,1.561,777,1.806,778,1.874,779,1.764,781,3.343,782,3.343,783,3.343,784,3.343,785,3.343,786,3.23,787,1.047,788,1.135,789,1.083,790,1.149,791,1.163,837,1.239,1280,3.802,1388,1.506,2011,2.72,2012,4.788,2013,3.008,2014,3.008,2015,3.008,2016,3.008,2017,3.008,2018,4.788]],["t/222",[5,1.215,6,1.48,7,0.567,16,1.604,30,3.383,33,2.738,34,0.843,40,1.734,53,1.99,54,1.228,55,0.994,81,2.181,82,2.114,87,4.052,88,2.645,90,2.612,93,2.859,97,1.725,119,2.405,145,1.694,147,2.405,240,3.644,262,1.952,269,2.94,321,2.899,342,3.644,372,3.883,444,3.486,540,2.405,574,2.859,637,3.314,656,3.206,682,2.158,701,3.218,763,2.114,807,4.9,856,3.507,945,3.973,1059,4.071,1070,4.177,1097,4.419,2019,6.759,2020,6.759]],["t/224",[1,1.447,4,1.113,5,1.157,6,1.157,7,0.606,16,2.397,17,1.764,22,2.132,32,1.69,38,2.892,40,1.675,44,3.322,45,1.907,53,3.233,54,1.221,55,1.255,66,1.377,74,0.716,81,2.421,82,2.934,87,3.452,88,2.936,91,2.305,102,1.447,103,1.283,122,2.56,124,2.351,128,2.956,143,1.186,146,2.032,157,3.722,162,0.929,251,3.517,261,1.505,283,1.805,286,2.106,287,3.409,295,2.723,404,1.984,405,2.228,415,4.604,427,2.626,457,4.063,574,3.608,607,3.722,695,1.871,698,1.117,759,1.283,831,2.614,837,1.485,856,3.476,858,6.311,861,1.871,891,2.172,1132,4.857,1183,3.934,1242,2.863,1672,2.863,1803,3.851,2021,3.261,2022,3.033,2023,3.033,2024,7.311,2025,8.306,2026,6.699,2027,4.988,2028,5.953,2029,3.261,2030,3.261,2031,2.727,2032,3.503,2033,3.261]],["t/226",[6,1.363,17,1.856,38,2.495,45,4.174,47,0.843,54,1.351,55,1.388,82,2.469,87,3.945,113,2.747,122,2.111,143,1.698,243,3.82,319,2.597,320,4.641,347,2.214,733,4.99,817,3.884,856,4.096,2034,7.895,2035,7.895,2036,6.64]],["t/228",[3,2.702,4,0.799,5,1.041,6,1.652,7,0.501,16,2.079,17,1.644,19,1.353,31,2.041,34,0.871,54,1.001,55,1.028,84,3.515,87,2.637,91,3.015,93,3.706,135,2.805,136,1.818,143,1.504,286,2.669,287,5.413,315,3.697,319,1.924,320,4.11,321,2.999,331,5.518,347,1.961,373,3.383,374,3.328,574,3.706,637,2.702,699,3.13,756,2.46,773,2.606,776,2.28,857,4.571,1130,5.413,2036,5.88,2037,6.321,2038,6.991,2039,7.368,2040,6.991,2041,6.991]],["t/230",[1,2.442,4,1.131,5,1.207,6,1.547,7,0.566,12,2.54,14,1.107,16,1.444,17,2.389,21,2.071,32,2.851,38,3.009,40,1.032,81,1.964,82,1.904,84,2.442,87,3.379,91,2.094,96,1.865,97,1.553,103,2.166,122,2.646,124,1.525,136,1.582,143,1.723,215,2.994,216,2.897,221,4.412,226,2.724,251,3.486,258,2.724,287,3.76,319,1.674,320,3.577,321,2.61,347,1.707,352,4.412,397,2.765,427,2.897,457,3.739,528,3.348,574,2.575,589,5.088,607,5.406,677,3.42,817,2.994,2031,6.06,2032,6.282,2036,5.118,2042,9.521,2043,4.106,2044,4.832,2045,5.502,2046,5.502,2047,6.086]],["t/232",[1,3.16,2,4.138,3,3.418,7,0.451,16,1.407,17,1.852,28,2.158,31,2.061,38,2.489,40,1.336,43,2.41,51,0.92,53,3.115,54,0.849,55,0.872,66,2.263,72,2.616,75,3.173,79,2.868,82,1.854,87,2.971,93,2.508,96,1.817,122,2.752,228,1.616,259,3.405,261,3.287,271,3.549,278,5.001,286,2.263,294,4.524,295,3.831,321,2.543,334,2.822,385,2.579,396,2.822,404,3.262,418,2.967,470,2.654,490,1.975,519,3.764,528,3.262,529,3.663,532,2.654,541,4.706,668,3.999,683,2.778,695,3.076,714,2.971,733,3.134,769,2.018,776,1.933,840,2.822,932,4.483,1085,3.999,1183,2.735,1191,4.138,1431,4.298,1434,4.483,1635,4.138,1902,5.498,2025,4.986,2032,3.764,2048,5.36,2049,5.36,2050,5.36,2051,5.36,2052,4.986,2053,4.706]],["t/234",[4,1.047,5,1.167,6,0.573,7,0.51,8,1.181,9,1.174,10,1.142,13,2.392,14,1.923,15,1.993,16,1.509,19,1.596,25,0.94,31,0.773,34,0.645,38,1.635,40,0.563,47,1.089,50,2.968,51,1.503,74,0.659,80,1.118,85,1.509,96,1.586,97,1.833,98,1.669,108,1.098,113,3.099,120,1.872,122,1.384,128,1.464,136,0.863,137,1.854,139,1.267,144,1.195,162,0.855,184,1.653,186,1.071,208,1.635,215,1.633,219,1.479,228,1.41,231,1.723,239,2.807,258,1.486,262,2.248,264,1.237,273,2.25,319,0.913,326,1.602,340,1.789,347,1.451,363,1.999,490,2.118,505,1.999,518,2.838,574,2.189,675,1.78,698,1.028,708,1.723,718,1.826,736,1.283,738,1.181,739,1.299,741,1.299,742,1.884,745,1.299,746,2.934,747,1.952,748,2.024,749,1.975,750,1.952,751,3.064,752,1.952,753,2.809,754,2.553,755,2.024,756,1.82,757,2.024,758,1.8,759,1.841,760,1.705,761,2.902,762,1.841,763,1.618,764,1.82,765,2.024,766,1.906,767,1.118,768,2.936,769,1.13,771,1.906,772,1.975,773,1.928,774,1.975,775,1.82,776,1.687,777,1.952,778,2.024,779,1.906,787,1.155,788,1.252,789,1.195,790,1.267,791,1.283,837,1.367,1132,5.205,1183,1.531,2025,2.791,2031,3.913,2032,3.285,2039,4.352,2046,4.678,2054,5.174,2055,3.319,2056,3.001,2057,3.319,2058,3.319,2059,3.319,2060,9.152,2061,5.174,2062,5.174]],["t/236",[5,1.085,6,1.291,7,0.428,33,2.916,40,1.786,54,1.307,55,1.343,88,2.925,90,2.889,97,1.908,119,3.249,122,1.999,143,1.608,145,1.873,444,4.451,540,2.66,637,2.889,701,3.559,769,2.545,779,2.754,856,4.738,1097,4.888,2063,9.131,2064,7.476]],["t/238",[1,1.45,4,1.114,5,1.158,6,1.158,7,0.603,16,2.398,17,1.766,22,2.135,32,1.693,38,2.894,40,1.676,44,3.328,45,1.911,53,3.234,54,1.222,55,1.255,66,1.38,74,0.718,81,2.424,82,2.936,91,2.308,102,1.45,103,1.286,122,2.561,124,2.352,128,2.959,143,1.443,146,2.035,157,3.727,162,0.931,202,3.879,251,3.52,261,1.508,283,1.809,286,2.109,295,2.726,404,1.988,405,2.233,415,4.607,427,2.63,444,3.893,457,4.065,490,1.204,574,3.61,607,3.727,695,1.875,698,1.119,759,1.286,831,2.62,837,1.488,856,3.897,858,6.318,861,1.875,891,2.176,1183,3.937,1242,2.869,1672,2.869,1677,5.001,1803,3.857,2021,3.267,2022,3.039,2023,3.039,2024,6.065,2027,4.995,2028,5.958,2029,3.267,2030,3.267,2031,2.733,2032,3.508,2033,3.267]],["t/240",[4,0.903,7,0.452,16,1.873,38,2.495,40,1.774,53,2.325,54,1.351,55,1.388,74,1.568,119,2.809,122,2.524,251,3.434,444,3.836,650,3.051,672,5.971,718,4.344,840,3.758,856,4.096,1183,3.642,2065,7.138,2066,6.64,2067,7.895]],["t/242",[4,1.079,5,1.122,6,1.363,7,0.452,9,1.791,16,1.873,31,2.199,43,3.209,53,2.325,82,2.469,84,3.168,105,3.051,136,2.454,143,1.698,202,3.808,286,3.014,444,3.836,492,5.326,574,3.34,589,5.013,670,4.535,2068,6.64]],["t/244",[4,1.07,5,1.01,7,0.564,12,2.78,14,1.212,16,1.58,17,2.317,38,3.114,40,1.441,51,1.034,81,2.149,82,2.083,91,2.292,96,2.041,111,2.897,122,2.502,124,2.129,128,2.939,202,3.529,251,3.696,334,4.045,400,1.765,415,3.456,427,3.171,444,3.454,457,2.78,574,2.818,640,3.073,650,3.808,672,6.426,718,3.665,856,3.456,1183,3.073,1925,5.602,2031,5.037,2032,6.257,2043,4.494,2044,5.288,2045,6.023,2069,6.023,2070,6.661,2071,6.023,2072,6.661,2073,6.661]],["t/247",[9,1.988,143,1.885,472,4.633,2066,7.37,2074,7.923,2075,7.923]],["t/249",[3,2.712,4,1.148,7,0.402,16,1.665,17,1.65,38,2.218,40,1.19,47,0.749,55,1.292,79,3.396,92,5.088,112,3.341,122,2.349,124,1.759,143,1.889,202,3.312,208,2.218,221,5.088,228,1.913,271,3.524,364,4.588,404,3.861,432,3.711,444,3.57,470,3.142,472,3.711,525,3.75,601,3.53,693,4.337,703,3.711,760,2.313,764,2.469,774,2.679,776,2.288,909,4.125,1774,5.572,1844,5.572,2065,6.345,2076,9.081,2077,8.781,2078,6.345]],["t/251",[1,3.16,2,4.138,3,3.418,7,0.451,16,1.407,17,1.852,28,2.158,31,2.061,38,2.489,40,1.336,43,2.41,51,0.92,53,3.115,54,0.849,55,0.872,66,2.263,72,2.616,75,3.173,79,2.868,82,1.854,93,2.508,96,1.817,122,2.752,228,1.616,259,3.405,261,3.287,271,3.549,278,5.001,286,2.263,294,4.524,295,3.831,321,2.543,334,2.822,385,2.579,396,2.822,404,3.262,418,2.967,444,3.201,470,2.654,490,1.975,519,3.764,528,3.262,529,3.663,532,2.654,541,4.706,668,3.999,683,2.778,695,3.076,714,2.971,733,3.134,769,2.018,776,1.933,840,2.822,932,4.483,1085,3.999,1183,2.735,1191,4.138,1431,4.298,1434,4.483,1635,4.138,1902,5.498,2032,3.764,2048,5.36,2049,5.36,2050,5.36,2051,5.36,2052,4.986,2053,4.706,2079,5.928]],["t/253",[4,1.045,5,1.166,6,0.571,7,0.523,8,1.177,9,1.17,10,1.138,13,2.387,14,1.922,15,1.991,16,1.505,19,1.593,21,1.126,25,0.937,31,0.771,34,0.643,38,1.63,40,0.561,47,1.089,50,2.964,51,1.502,74,0.657,76,1.247,80,1.113,85,1.504,96,1.581,97,1.829,98,1.665,108,1.095,113,3.096,120,1.868,122,1.38,128,1.459,136,0.86,137,1.85,139,1.263,144,1.19,162,0.852,184,1.65,186,1.067,202,2.703,208,1.63,215,1.627,219,1.475,228,1.406,231,1.719,239,2.803,262,2.244,264,1.233,326,1.597,334,1.574,340,1.783,347,1.447,363,1.994,405,2.043,444,1.344,490,2.113,505,1.994,518,2.834,675,1.775,698,1.024,708,1.719,718,1.82,736,1.278,738,1.177,739,1.294,741,1.294,742,1.879,745,1.294,746,2.93,747,1.946,748,2.019,749,1.97,750,1.946,751,3.06,752,1.946,753,2.804,754,2.549,755,2.019,756,1.815,757,2.019,758,1.795,759,1.836,760,1.7,761,2.897,762,1.836,763,1.614,764,1.815,765,2.019,766,1.901,767,1.113,768,2.931,769,1.126,771,1.901,772,1.97,773,1.923,774,1.97,775,1.815,776,1.682,777,1.946,778,2.019,779,1.901,787,1.151,788,1.247,789,1.19,790,1.263,791,1.278,837,1.362,1183,1.526,1256,4.798,1482,1.992,1535,2.309,1677,3.188,1708,4.339,1709,4.339,1721,7.689,2068,2.781,2071,4.665,2080,5.159,2081,3.307,2082,2.99,2083,3.307,2084,3.307,2085,5.159]],["t/255",[4,1.184,5,1.185,6,1.721,7,0.53,33,2.447,34,0.955,40,1.69,82,2.397,90,2.962,111,3.333,162,1.974,246,3.287,457,3.199,540,2.727,642,6.77,690,4.217,701,3.648,707,2.697,754,2.373,861,3.976,956,3.905,1388,3.836,2086,6.929]],["t/257",[4,1.049,5,1.175,6,0.845,7,0.458,8,1.101,9,1.111,10,1.065,13,2.302,14,1.934,15,1.987,16,1.442,19,1.549,25,1.387,31,1.416,34,0.61,47,1.075,50,2.882,51,1.477,54,0.443,55,0.455,74,0.615,80,1.042,85,1.428,88,1.916,96,1.501,97,1.764,98,1.961,108,1.049,112,1.473,113,3.026,117,2.752,120,2.035,126,2.64,136,0.805,137,1.772,139,1.181,143,0.666,144,1.114,145,1.887,162,0.797,184,1.58,186,0.999,192,2.64,208,1.548,219,1.738,228,1.335,231,1.631,239,2.725,246,2.964,248,3.585,262,2.422,264,1.154,326,1.516,331,1.703,341,1.636,347,1.374,363,1.893,432,1.636,490,2.024,505,1.893,518,2.755,532,1.385,583,1.523,589,4.387,642,3.973,675,1.685,698,0.958,708,1.631,718,1.703,736,1.196,738,1.101,739,1.211,741,1.211,742,1.783,745,1.211,746,2.849,747,1.847,748,1.916,749,1.87,750,1.847,751,2.984,752,1.847,753,2.703,754,2.479,755,1.916,756,1.723,757,1.916,758,1.704,759,1.743,760,1.614,761,2.817,762,1.743,763,1.532,764,1.723,765,1.916,766,1.804,767,1.042,768,2.84,769,1.053,771,1.804,772,1.87,773,1.825,774,1.87,775,1.723,776,1.597,777,1.847,778,1.916,779,1.804,787,1.077,788,1.167,789,1.114,790,1.181,791,1.196,819,1.965,837,1.275,1116,1.739,1128,1.864,1130,1.912,1169,5.495,1171,2.798,1172,2.244,1173,8.604,1174,4.428,1175,4.428,2087,4.897,2088,3.095,2089,3.095,2090,3.095,2091,3.095,2092,3.095,2093,3.095,2094,3.095,2095,4.897]],["t/259",[4,1.039,5,0.881,6,1.569,7,0.52,28,2.7,33,2.901,40,1.737,54,1.062,55,1.091,88,2.901,91,2.552,101,3.181,112,3.53,119,3.496,124,1.858,202,2.797,444,4.346,539,3.921,540,2.639,574,3.137,606,4.466,637,2.866,682,2.368,701,3.53,829,3.588,856,3.848,877,5.376,1097,4.848,1388,3.712,2011,6.705]],["t/261",[4,1.054,5,1.18,6,0.857,7,0.461,8,1.12,9,1.126,10,1.083,13,2.323,14,1.939,15,1.995,16,1.458,19,1.56,25,1.406,31,1.432,34,0.619,40,0.842,47,1.079,50,2.903,51,1.484,54,0.451,55,0.463,74,0.986,80,1.06,85,1.447,96,1.521,97,1.78,98,1.602,108,1.061,113,3.044,117,2.789,119,1.12,120,1.81,122,1.643,124,1.54,125,3.152,136,0.819,137,1.792,139,1.202,143,0.677,144,1.133,162,0.811,184,1.598,186,1.016,202,2.318,208,1.569,215,3.024,219,1.757,228,1.353,231,1.653,239,2.745,246,2.992,262,2.192,264,1.173,326,1.537,341,1.664,347,1.392,363,1.918,432,1.664,444,3.941,490,2.047,505,1.918,518,2.775,675,1.708,698,0.975,708,1.653,736,1.217,738,1.12,739,1.232,741,1.232,742,1.807,745,1.232,746,2.87,747,1.872,748,1.942,749,1.895,750,1.872,751,3.004,752,1.872,753,2.729,754,2.497,755,1.942,756,1.747,757,1.942,758,1.727,759,1.766,760,1.636,761,2.838,762,1.766,763,1.553,764,1.747,765,1.942,766,1.828,767,1.06,768,2.863,769,1.071,771,1.828,772,1.895,773,1.85,774,1.895,775,1.747,776,1.619,777,1.872,778,1.942,779,1.828,781,3.465,782,3.465,783,3.465,784,3.465,785,3.465,787,1.095,788,1.187,789,1.133,790,1.202,791,1.217,837,1.296,1252,5.556,1255,4.488,1256,3.754,2096,4.964,2097,3.148,2098,3.148,2099,3.148,2100,3.148,2101,3.148,2102,4.964]],["t/263",[4,1.102,5,1.145,6,1.663,7,0.468,14,1.488,22,3.16,33,2.611,40,1.387,43,3.324,75,2.753,119,2.91,194,5.757,228,2.228,246,3.507,457,3.413,690,4.499]],["t/265",[4,1.066,5,1.189,6,0.883,7,0.442,8,1.164,9,1.161,10,1.126,13,2.373,14,1.948,15,2.013,16,1.495,19,1.586,25,1.449,31,1.468,34,0.638,47,1.086,50,2.95,51,1.498,54,0.468,55,0.481,74,0.65,80,1.102,85,1.492,96,1.568,97,1.819,98,1.651,108,1.088,113,3.084,119,1.821,120,1.855,122,1.685,126,2.758,136,0.851,137,1.837,139,1.249,143,0.704,144,1.178,162,0.843,184,1.638,186,1.056,194,5.674,196,4.062,197,4.062,208,1.617,219,1.802,228,1.394,231,1.704,239,2.79,246,3.056,258,1.465,262,2.057,264,1.219,319,0.9,326,1.584,341,1.73,347,1.435,363,1.977,432,1.73,490,2.098,505,1.977,518,2.821,675,1.761,698,1.013,708,1.704,736,1.264,738,1.164,739,1.28,741,1.28,742,1.863,745,1.28,746,2.917,747,1.93,748,2.002,749,1.953,750,1.93,751,3.048,752,1.93,753,2.788,754,2.538,755,2.002,756,1.8,757,2.002,758,1.78,759,1.821,760,1.686,761,2.884,762,1.821,763,1.6,764,1.8,765,2.002,766,1.885,767,1.102,768,2.916,769,1.114,771,1.885,772,1.953,773,1.907,774,1.953,775,1.8,776,1.668,777,1.93,778,2.002,779,1.885,787,1.138,788,1.234,789,1.178,790,1.249,791,1.264,837,1.347,1151,4.626,2103,5.116,2104,3.272,2105,3.272,2106,3.272,2107,3.272,2108,5.116]],["t/267",[4,1.168,5,1.164,6,1.69,7,0.517,33,2.887,34,0.917,40,1.732,54,1.053,55,1.082,82,2.301,87,3.954,90,2.843,111,3.2,162,1.895,246,3.155,457,3.07,540,2.618,574,3.112,637,2.843,690,4.047,701,3.502,707,2.588,754,2.278,856,3.817,861,3.817,956,3.748,1096,5.563,1097,4.809,1388,3.682,2086,6.651]],["t/269",[4,1.053,5,1.179,6,0.855,7,0.461,8,1.116,9,1.123,10,1.08,13,2.319,14,1.938,15,1.993,16,1.455,19,1.558,22,1.913,25,1.402,31,1.429,34,0.617,47,1.078,50,2.899,51,1.482,54,0.449,55,0.462,74,0.623,80,1.056,85,1.443,88,1.937,96,1.517,97,1.777,98,1.978,108,1.058,113,3.04,117,2.782,120,2.05,126,2.669,136,0.816,137,1.788,139,1.198,143,0.675,144,1.129,145,1.241,162,0.808,184,1.594,186,1.012,189,3.236,191,3.34,192,2.669,208,1.564,219,1.753,228,1.349,231,1.649,239,2.741,246,2.986,248,3.181,250,4.136,258,1.404,262,2.325,264,1.169,287,5.901,319,0.863,326,1.533,331,1.726,341,1.659,347,1.388,363,1.913,432,1.659,490,2.042,505,1.913,518,2.771,583,1.544,675,1.704,698,0.971,708,1.649,736,1.212,738,1.116,739,1.227,741,1.227,742,1.802,745,1.227,746,2.866,747,1.867,748,1.937,749,1.89,750,1.867,751,3,752,1.867,753,2.724,754,2.493,755,1.937,756,1.742,757,1.937,758,1.722,759,1.762,760,1.631,761,2.834,762,1.762,763,1.548,764,1.742,765,1.937,766,1.823,767,1.056,768,2.858,769,1.068,771,1.823,772,1.89,773,1.845,774,1.89,775,1.742,776,1.614,777,1.867,778,1.937,779,1.823,787,1.092,788,1.183,789,1.129,790,1.198,791,1.212,819,1.992,837,1.292,1096,3.744,1116,1.763,1128,1.889,1130,1.939,1131,4.476,1132,3.589,2109,4.95,2110,3.137,2111,3.137,2112,3.137,2113,3.137,2114,3.137,2115,3.137,2116,4.163]],["t/271",[4,0.884,5,0.918,7,0.533,14,1.406,15,1.794,21,1.961,30,2.883,40,0.977,44,3.469,47,0.994,51,1.199,54,1.248,55,1.282,74,1.535,93,2.437,97,1.47,111,2.506,119,2.749,122,2.867,135,2.312,136,1.498,143,1.662,146,2.846,159,2.282,241,4.342,244,3.658,261,2.404,263,3.658,267,3.386,274,3.559,294,4.438,296,3.459,299,3.046,321,2.471,385,3.792,386,4.176,400,2.047,415,2.989,442,3.106,601,2.846,650,2.226,682,1.839,762,2.05,794,3.309,800,4.021,979,3.237,1145,3.237,1183,4.022,1379,3.469,1623,7.406,1789,4.845,1926,4.845,1927,4.845,1929,3.766,1933,4.845,2117,5.208,2118,5.76,2119,5.76,2120,4.021,2121,6.986,2122,7.726,2123,5.76,2124,5.76,2125,5.76,2126,5.76,2127,5.76,2128,5.76,2129,5.76]],["t/273",[1,2.964,5,0.878,7,0.519,14,1.344,21,2.514,40,1.537,47,0.967,51,1.147,54,1.298,55,1.333,70,3.419,72,3.259,75,2.487,95,4.342,141,2.926,259,4.243,260,5.586,262,2.617,357,4.983,400,1.957,682,2.894,698,2.287,1128,5.459,1321,4.828,1571,5.156,1623,6.571,1966,5.864,2130,7.386,2131,8.195,2132,6.678,2133,6.212,2134,6.212,2135,7.386,2136,7.386]],["t/275",[5,0.825,7,0.499,32,3.251,34,1.087,40,1.617,47,0.93,51,1.077,54,1.365,55,1.403,108,1.505,141,2.749,186,3.227,205,3.817,259,3.986,260,5.247,262,2.003,269,3.792,377,3.986,456,5.508,656,3.404,657,3.841,682,3.409,837,2.857,1321,4.536,1623,5.03,2039,5.835,2134,8.412,2137,7.333,2138,6.273,2139,6.938]],["t/277",[4,1.037,5,1.078,6,0.556,7,0.439,8,1.146,9,1.146,10,1.108,13,2.353,14,1.914,15,1.978,16,1.48,19,1.576,21,1.096,25,0.912,31,0.75,34,0.777,40,1.058,47,1.123,50,2.931,51,1.492,70,1.906,74,0.64,80,1.084,85,1.473,96,1.549,97,1.803,98,1.63,108,1.076,113,3.068,119,1.146,120,1.836,122,1.668,136,0.837,137,1.818,139,1.229,141,1.276,144,1.159,162,0.83,184,1.622,186,1.039,208,1.597,219,1.445,228,1.377,231,1.683,239,2.771,259,3.582,260,4.716,262,2.618,264,1.2,294,1.85,326,1.564,347,1.417,363,1.953,385,1.401,490,2.077,505,1.953,518,2.802,657,1.2,675,1.739,682,1.613,698,0.997,708,1.683,736,1.244,738,1.146,739,1.26,741,1.26,742,1.84,745,1.26,746,2.898,747,1.906,748,1.977,749,1.929,750,1.906,751,3.03,752,1.906,753,2.763,754,2.521,755,1.977,756,1.778,757,1.977,758,1.758,759,1.798,760,1.665,761,2.865,762,1.798,763,1.58,764,1.778,765,1.977,766,1.861,767,1.084,768,2.894,769,1.096,771,1.861,772,1.929,773,1.883,774,1.929,775,1.778,776,1.648,777,1.906,778,1.977,779,1.861,787,1.12,788,1.215,789,1.159,790,1.229,791,1.244,796,3.043,1128,3.043,1235,1.671,1623,6.968,1929,3.303,2121,2.911,2131,4.568,2132,4.568,2134,2.708,2138,4.568,2140,5.053,2141,3.22,2142,3.22,2143,3.22,2144,3.22,2145,5.053,2146,3.22,2147,3.22,2148,5.053,2149,5.053]],["t/279",[6,1.375,7,0.456,12,3.324,14,1.449,17,1.873,31,1.856,47,0.85,54,1.14,55,1.171,90,3.078,143,1.713,296,3.565,385,3.464,540,2.834,699,3.565,732,5.559,775,2.802,817,3.918,818,5.773,840,3.791,1057,6.698,1624,7.174,2150,7.963,2151,7.963,2152,7.963,2153,7.963]],["t/281",[4,1.052,5,1.093,6,0.582,7,0.449,8,1.201,9,1.189,10,1.161,13,2.413,14,1.927,15,2.001,16,1.525,19,1.606,25,0.955,31,0.786,34,0.653,47,1.12,50,2.988,51,1.509,74,0.67,80,1.136,85,1.528,96,1.606,97,1.849,98,1.691,108,1.109,113,3.116,119,1.865,120,1.892,122,1.402,136,0.877,137,1.874,139,1.288,143,0.726,144,1.214,145,1.313,162,0.869,165,2.719,184,1.671,186,1.089,208,1.656,216,3.449,219,1.499,228,1.428,231,1.746,239,2.826,262,2.092,264,1.258,326,1.623,347,1.47,363,2.025,385,1.468,490,2.14,505,2.025,518,2.857,675,1.803,698,1.045,708,1.746,736,1.304,738,1.201,739,1.32,741,1.32,742,1.908,745,1.32,746,2.954,747,1.977,748,2.05,749,2.001,750,1.977,751,3.083,752,1.977,753,2.834,754,2.57,755,2.05,756,1.844,757,2.05,758,1.823,759,1.865,760,1.727,761,2.921,762,1.865,763,1.639,764,1.844,765,2.05,766,1.93,767,1.136,768,2.959,769,1.148,771,1.93,772,2.001,773,1.953,774,2.001,775,1.844,776,1.709,777,1.977,778,2.05,779,1.93,787,1.174,788,1.273,789,1.214,790,1.288,791,1.304,796,3.156,1624,7.11,2154,5.24,2155,3.374,2156,3.374,2157,3.374,2158,3.374,2159,3.051,2160,3.374,2161,3.374,2162,5.24,2163,5.24,2164,5.24,2165,4.738,2166,5.24]],["t/283",[4,0.828,7,0.556,17,2.285,43,3.951,47,0.955,74,1.438,82,2.265,97,2.285,105,3.46,119,3.713,122,2.394,134,4.068,143,1.925,159,2.868,216,3.446,226,3.241,295,2.943,296,4.008,342,4.827,385,3.149,490,2.411,699,3.241,754,2.242,762,2.576,856,3.756,1626,6.771,1766,6.546,1767,5.748,2167,7.24,2168,7.24,2169,7.24,2170,6.546]],["t/285",[4,1.055,5,1.096,6,0.588,7,0.451,8,1.212,9,1.197,10,1.172,13,2.425,14,1.929,15,2.005,16,1.533,19,1.682,25,0.964,31,0.794,34,0.658,47,1.094,50,3,51,1.513,74,0.677,80,1.147,85,1.539,96,1.618,97,1.858,98,1.703,108,1.116,113,3.126,119,1.212,120,1.903,122,1.728,136,0.886,137,1.885,139,1.3,143,0.732,144,1.226,162,0.877,184,1.681,186,1.099,208,1.668,216,3.077,219,1.509,228,1.439,231,1.758,239,2.837,262,2.102,264,1.269,319,0.937,326,1.634,342,1.836,347,1.48,363,2.04,385,1.481,490,2.153,505,2.04,518,2.868,675,1.816,698,1.054,708,1.758,736,1.316,738,1.212,739,1.332,741,1.332,742,1.922,745,1.332,746,2.966,747,1.991,748,2.065,749,2.015,750,1.991,751,3.094,752,1.991,753,2.848,754,2.58,755,2.065,756,1.857,757,2.065,758,1.837,759,1.878,760,1.739,761,2.932,762,1.878,763,1.651,764,1.857,765,2.065,766,1.944,767,1.147,768,2.971,769,1.159,771,1.944,772,2.015,773,1.967,774,2.015,775,1.857,776,1.721,777,1.991,778,2.065,779,1.944,787,1.185,788,1.284,789,1.226,790,1.3,791,1.316,796,3.179,1101,1.956,1626,7.369,1767,2.704,2165,4.772,2170,5.844,2171,5.278,2172,3.405,2173,3.405,2174,3.405,2175,3.405,2176,3.405,2177,5.278,2178,5.278]],["t/287",[4,0.887,5,0.922,6,1.73,7,0.444,33,2.478,40,1.764,79,3.755,81,2.504,261,3.239,293,6.162,540,2.762,601,2.859,606,4.674,643,6.678,669,5.869,682,2.983,701,3.695,1177,5.626,1178,4.928,1179,4.361,1182,5.236,1196,5.236]],["t/289",[6,1.471,34,1.062,40,1.445,43,3.463,79,4.122,422,4.787,643,5.264,714,3.213,840,4.055,861,4.42,1182,5.747,1196,5.747]],["t/291",[4,1.095,5,1.203,6,1.067,7,0.436,8,1.13,9,1.134,10,1.093,13,2.335,14,1.947,15,1.999,16,1.466,19,1.566,22,1.931,25,1.415,31,1.44,34,0.623,43,1.291,47,1.08,50,2.913,51,1.487,54,0.455,55,0.467,74,0.631,75,1.069,80,1.069,85,1.457,88,1.955,96,1.532,97,1.276,98,1.613,108,1.067,113,3.053,120,1.82,125,3.173,136,0.826,137,1.802,139,1.212,143,0.683,144,1.143,162,0.818,184,0.826,186,1.025,202,1.885,208,1.579,219,1.767,228,1.684,231,1.665,239,2.755,246,3.269,258,1.421,262,2.024,264,1.183,319,1.375,326,1.547,341,1.679,347,1.402,363,1.931,432,1.679,457,1.325,490,2.058,505,1.931,518,2.786,637,1.227,643,6.203,675,1.72,690,1.747,698,0.983,708,1.665,736,1.227,738,1.13,739,1.242,741,1.242,742,1.82,745,1.242,746,2.88,747,1.885,748,1.955,749,1.908,750,1.885,751,3.014,752,1.885,753,2.742,754,2.506,755,1.955,756,1.758,757,1.955,758,1.739,759,1.778,760,1.647,761,2.848,762,1.778,763,1.563,764,1.758,765,1.955,766,1.841,767,1.069,768,2.875,769,1.081,771,1.841,772,1.908,773,1.863,774,1.908,775,1.758,776,1.63,777,1.885,778,1.955,779,1.841,787,1.105,788,1.198,789,1.143,790,1.212,791,1.227,837,1.308,1220,4.169,1223,3.968,1242,2.521,1243,2.871,1244,2.871,1245,4.519,1247,4.519,2179,4.997,2180,3.175,2181,3.175,2182,3.175,2183,3.175,2184,4.997]],["t/293",[4,0.574,7,0.287,9,1.595,28,3.201,29,2.604,31,1.891,35,4.559,36,3.573,40,0.851,43,3.298,54,1.373,55,1.361,58,2.247,64,2.469,75,1.69,76,3.316,78,3.023,82,2.199,96,1.538,102,2.014,124,1.762,136,1.828,149,3.023,151,2.604,152,2.512,170,3.023,222,2.512,251,2.183,252,2.706,296,3.632,321,3.015,356,3.504,360,2.95,361,3.281,378,3.796,400,1.33,414,3.638,438,4.538,525,1.964,530,3.796,532,3.632,552,3.796,595,3.281,601,1.849,610,4.742,650,3.135,665,3.519,682,1.603,714,3.316,756,1.766,764,1.766,804,3.985,805,3.985,817,4.325,818,3.638,819,3.187,840,2.389,864,3.796,957,3.95,979,2.82,984,4.234,987,7.347,988,7.254,990,2.469,1057,5.912,1061,6.356,1062,4.538,1108,2.82,1183,2.315,1258,3.386,1437,3.386,1481,4.132,1497,3.985,1625,3.796,1765,4.742,1923,4.132,1946,6.441,2185,8.067,2186,5.019,2187,7.03,2188,9.254,2189,5.019,2190,4.538,2191,4.538,2192,5.019,2193,5.019,2194,4.538,2195,5.019,2196,5.019,2197,5.019,2198,5.019]],["t/295",[4,1.049,5,1.091,6,0.578,7,0.447,8,1.192,9,1.182,10,1.153,13,2.403,14,1.925,15,1.997,16,1.517,19,1.602,25,0.949,31,0.781,34,0.65,40,0.884,47,1.138,50,2.979,51,1.507,70,1.965,74,0.665,80,1.128,85,1.519,96,1.597,97,1.842,98,1.681,108,1.104,113,3.109,120,1.883,136,1.663,137,1.865,139,1.279,141,2.064,144,1.206,162,0.863,183,2.118,184,1.663,186,1.081,208,1.647,219,1.49,228,1.42,231,1.736,239,2.817,262,2.084,264,1.248,326,1.613,347,1.461,363,2.014,490,2.13,505,2.014,518,2.848,665,2.608,675,1.793,698,1.037,708,1.736,736,1.294,738,1.192,739,1.31,741,1.31,742,1.897,745,1.31,746,2.946,747,1.965,748,2.039,749,1.989,750,1.965,751,3.075,752,1.965,753,2.823,754,2.563,755,2.039,756,1.833,757,2.039,758,1.813,759,1.854,760,1.717,761,2.912,762,1.854,763,1.63,764,1.833,765,2.039,766,1.919,767,1.128,768,2.949,769,1.14,771,1.919,772,1.989,773,1.942,774,1.989,775,1.833,776,1.699,777,1.965,778,2.039,779,1.919,787,1.165,788,1.263,789,1.206,790,1.279,791,1.294,796,3.138,944,3.22,1624,3.941,1628,3.638,1832,3.138,1966,4.137,2133,4.382,2185,7.719,2199,5.211,2200,3.349,2201,3.349,2202,3.349,2203,3.349,2204,5.211,2205,5.211]],["t/297",[1,1.802,3,2.51,4,0.743,5,1.133,7,0.437,8,1.598,9,1.473,10,1.545,14,1.388,15,1.336,17,1.056,19,1.257,23,3.135,25,1.272,33,2.074,34,0.951,35,2.523,38,2.052,40,1.504,47,1.042,51,0.697,53,1.322,54,1.197,55,1.23,75,1.512,84,1.802,85,1.309,90,3.231,93,1.9,95,4.914,97,2.36,103,2.311,108,0.775,140,3.029,141,2.573,145,1.627,147,2.311,154,4.06,168,5.156,169,3.776,170,2.704,183,1.825,184,1.689,208,1.419,222,3.251,225,2.704,226,2.01,228,2.278,261,1.874,271,3.825,272,2.775,288,2.523,295,2.64,319,1.235,343,2.935,344,2.935,366,1.825,394,3.043,397,2.04,400,2.586,401,3.649,402,1.926,404,2.47,457,1.874,470,3.971,518,1.545,525,2.541,526,3.396,532,2.01,540,2.975,656,2.21,682,1.434,707,1.58,763,1.404,776,2.118,832,5.156,840,2.138,930,2.33,931,3.817,1083,2.851,1101,2.579,1321,2.935,1379,2.704,1397,3.255,1459,3.135,1563,4.06,1627,7.677,1765,3.029,1809,3.776,2206,4.49,2207,4.49,2208,3.565,2209,3.565,2210,4.49,2211,3.396,2212,5.462,2213,4.49,2214,4.49,2215,4.06,2216,4.06,2217,4.49,2218,4.49,2219,3.255,2220,3.776,2221,4.06]],["t/299",[7,0.479,14,1.522,108,1.444,145,2.096,159,3.314,162,2.155,219,2.391,228,2.279,259,4.804,260,6.325,830,4.916,1382,5.642,1627,6.063,2028,5.838,2222,7.562,2223,8.363]],["t/301",[4,1.011,5,1.05,6,0.513,7,0.422,8,1.058,9,1.076,10,1.024,13,2.251,14,1.892,15,1.938,16,1.603,19,1.523,25,0.842,31,0.693,34,0.591,40,1.146,47,1.149,50,2.832,51,1.462,54,0.426,55,0.438,74,0.591,76,2.549,80,1.001,85,1.384,96,1.454,97,1.725,98,1.531,108,1.425,111,1.294,113,2.983,120,1.743,136,0.773,137,1.726,139,1.135,141,2.677,144,1.071,162,0.766,184,1.539,186,0.96,208,1.5,219,1.357,228,1.293,231,1.581,239,2.678,262,2.672,264,1.109,326,1.469,347,1.331,363,1.834,385,2.064,400,1.257,479,3.201,490,1.972,505,1.834,518,2.708,532,2.124,675,1.633,698,0.921,699,1.332,708,1.581,731,3.013,732,3.313,736,1.149,738,1.058,739,1.164,741,1.164,742,1.728,745,1.164,746,2.8,747,1.79,748,1.857,749,1.812,750,1.79,751,2.938,752,1.79,753,2.644,754,2.436,755,1.857,756,1.67,757,1.857,758,1.651,759,1.689,760,1.564,761,2.769,762,1.689,763,1.484,764,1.67,765,1.857,766,1.748,767,1.001,768,2.785,769,1.012,771,1.748,772,1.812,773,1.769,774,1.812,775,1.67,776,1.547,777,1.79,778,1.857,779,1.748,787,1.035,788,1.122,789,1.071,790,1.135,791,1.149,830,4.34,944,4.175,1029,3.589,1627,6.708,1765,2.006,1832,4.069,1842,4.29,1843,4.29,1870,3.767,2028,3.313,2044,3.767,2215,4.29,2216,4.29,2224,2.974,2225,4.745,2226,2.974,2227,2.974,2228,2.974,2229,2.974,2230,2.974,2231,2.974,2232,2.974,2233,2.974,2234,4.745,2235,4.745,2236,4.745,2237,4.745,2238,4.745,2239,4.745,2240,4.745]],["t/303",[4,0.615,5,0.307,6,1.074,7,0.543,9,1.412,12,1.079,16,0.613,17,1.735,20,1.954,28,2.836,29,2.197,31,1.254,32,1.211,33,2.488,34,0.322,35,2.38,36,1.722,39,1.597,40,0.438,42,1.641,51,0.401,53,0.761,54,1.39,55,1.413,56,1.23,70,2.783,71,1.597,72,1.14,76,2.591,82,1.683,88,3.39,94,1.317,96,0.792,97,1.081,98,2.38,102,1.037,109,1.597,112,2.016,119,0.92,120,0.761,122,2.175,124,1.349,125,1.641,143,1.338,148,3.091,162,1.091,173,1.422,183,4.306,202,0.975,206,1.689,208,0.817,218,2.957,243,1.25,244,1.641,248,1.341,251,1.124,261,1.768,269,1.124,271,1.037,273,3.768,281,1.14,283,1.294,285,5.751,286,2.974,294,4.238,295,1.05,319,0.711,326,0.8,331,2.961,334,2.016,364,1.689,365,2.957,366,1.722,397,1.174,398,1.689,400,1.426,402,1.108,418,3.115,442,1.393,459,1.804,470,1.896,479,1.743,495,1.452,497,2.052,498,2.957,521,2.173,525,1.657,527,2.341,532,1.157,533,1.896,539,2.845,544,2.337,547,1.519,588,1.689,611,1.422,613,4.037,623,1.211,637,0.999,654,1.804,665,1.294,674,1.804,675,0.889,682,1.352,685,2.049,688,2.857,698,0.8,699,1.157,703,3.29,707,0.909,708,1.411,714,2.591,731,1.641,732,1.804,733,3.631,751,1.507,760,1.396,763,0.808,771,0.952,776,0.843,777,1.597,788,0.975,803,3.163,805,2.052,807,1.873,837,1.064,840,2.562,847,3.362,854,2.617,856,1.341,857,1.689,859,1.519,860,2.052,861,2.792,864,1.954,882,2.689,889,1.452,891,1.556,892,3.901,894,1.873,945,1.519,962,1.804,964,3.229,966,3.562,990,1.271,1085,1.743,1097,1.689,1108,1.452,1116,1.452,1119,1.641,1128,5.345,1130,3.325,1145,1.452,1156,3.07,1178,1.641,1191,2.957,1195,1.422,1205,1.804,1258,1.743,1264,2.337,1347,2.173,1388,1.294,1397,3.07,1460,1.954,1482,3.241,1544,1.689,1553,1.804,1560,1.743,1635,1.804,1663,1.804,1668,1.873,1723,2.052,1740,1.804,1803,1.804,1852,7.044,1910,2.337,1929,1.689,2052,2.173,2241,4.235,2242,2.584,2243,2.173,2244,2.337,2245,2.584,2246,2.584,2247,2.337,2248,2.173,2249,2.584,2250,3.829,2251,1.954,2252,2.584,2253,2.584,2254,2.584,2255,2.584,2256,2.584,2257,2.584,2258,2.584,2259,4.866,2260,2.584,2261,3.829,2262,2.584,2263,7.377,2264,2.584,2265,2.584,2266,2.584,2267,2.584,2268,5.627,2269,2.584,2270,2.584,2271,1.954,2272,2.584,2273,5.381,2274,5.381,2275,2.584,2276,2.337,2277,2.584,2278,2.584,2279,2.584,2280,2.584,2281,2.584,2282,2.584,2283,2.584,2284,2.584,2285,2.584,2286,2.584,2287,2.584,2288,2.584,2289,2.052]],["t/305",[4,1.046,5,1.087,6,1.343,7,0.445,8,1.179,9,1.172,10,1.14,13,2.389,14,1.922,15,1.992,16,1.507,19,1.594,25,0.938,31,1.204,34,0.644,47,1.104,50,2.966,51,1.503,74,1.026,80,1.115,85,1.507,96,1.583,97,1.831,98,1.667,108,1.096,113,3.098,117,2.903,120,2.112,136,0.861,137,1.852,139,1.265,144,1.192,162,0.854,183,4.035,184,1.651,186,1.069,188,3.745,189,3.378,190,3.745,191,3.485,192,2.786,193,5.042,208,1.633,219,1.477,228,1.408,231,1.721,239,2.805,248,1.719,262,2.246,264,1.235,285,2.104,326,1.6,347,1.449,363,1.997,490,2.115,505,1.997,518,2.836,549,3.607,623,1.552,675,1.778,698,1.026,708,1.721,736,1.28,738,1.179,739,1.296,741,1.296,742,1.881,745,1.296,746,2.932,747,1.949,748,2.022,749,1.972,750,1.949,751,3.062,752,1.949,753,2.807,754,2.664,755,2.022,756,1.818,757,2.022,758,1.798,759,1.839,760,1.703,761,2.899,762,1.839,763,1.616,764,1.818,765,2.022,766,1.903,767,1.115,768,2.934,769,1.128,771,1.903,772,1.972,773,1.926,774,1.972,775,1.818,776,1.685,777,1.949,778,2.022,779,1.903,787,1.153,788,1.25,789,1.192,790,1.265,791,1.28,1128,1.995,1329,3.745,2268,2.996,2290,5.167,2291,3.313,2292,3.313,2293,3.313,2294,3.313,2295,5.167,2296,4.671]],["t/307",[4,0.623,7,0.426,9,1.237,12,3.107,17,1.282,35,5.66,40,1.739,47,0.582,51,0.846,54,1.066,55,1.095,74,2.001,79,2.638,84,2.188,91,1.876,101,2.338,111,2.371,112,2.595,122,1.458,124,2.771,125,5.382,135,2.188,141,2.16,143,1.172,159,2.16,162,1.405,202,3.596,286,3.757,296,2.441,298,5.022,299,2.883,321,2.338,340,2.939,351,2.405,385,2.371,432,2.883,601,2.008,693,3.369,698,2.624,714,2.056,731,3.462,756,1.918,859,3.205,860,4.328,930,5.553,931,4.376,1481,3.205,1525,4.328,1714,6.602,1715,4.585,2297,7.444,2298,9.107,2299,9.533,2300,5.452,2301,5.452]],["t/309",[7,0.4,15,1.439,21,3.64,26,4.439,38,2.209,47,0.746,75,2.354,81,2.256,95,4.11,101,2.999,108,1.512,143,1.504,145,1.752,147,2.488,205,3.847,278,4.439,394,3.276,398,4.571,402,2.999,575,4.571,601,3.524,758,2.433,760,2.304,767,2.354,789,2.516,909,4.11,930,5.359,931,4.11,1101,4.016,1112,5.563,1292,4.32,1392,5.88,1898,5.88,2271,5.287,2302,6.991,2303,6.991,2304,6.955,2305,7.921,2306,7.921,2307,6.991,2308,6.991,2309,6.991]],["t/311",[3,2.956,4,0.745,5,0.536,7,0.546,9,1.478,12,2.72,14,1.392,15,1.724,16,1.071,17,1.061,19,1.792,21,1.536,25,2.166,26,2.865,29,2.341,34,1.044,36,1.834,40,1.105,47,1.222,54,0.933,55,0.959,58,2.02,94,3.32,102,1.811,108,1.599,120,1.329,137,1.9,145,1.633,146,2.401,147,3.598,162,1.162,226,2.02,252,2.433,259,4.395,319,1.793,340,2.433,342,3.514,525,1.765,639,2.865,657,1.682,682,1.441,758,1.57,769,2.604,789,1.624,929,2.652,930,3.969,931,2.652,933,1.765,1386,3.582,1591,3.007,1592,3.007,1744,5.786,1747,4.138,1754,4.708,1755,5.105,2310,3.582,2311,4.512,2312,4.512,2313,4.512,2314,4.512,2315,3.795,2316,6.517,2317,4.512,2318,6.517,2319,5.174,2320,5.174]],["t/313",[3,2.584,4,0.764,5,1.114,7,0.583,12,2.79,15,1.376,16,2.021,25,1.893,40,1.59,44,5.129,53,2.508,81,2.748,92,4.846,93,3.603,105,2.584,111,2.908,124,1.675,128,3.757,134,3.757,136,1.738,141,2.649,145,1.675,216,3.182,219,1.912,220,4.37,269,2.908,315,4.503,319,2.343,372,3.84,402,2.867,444,3.462,470,2.993,574,3.603,595,4.37,602,4.19,637,2.584,656,2.899,807,4.846,857,4.37,900,4.37,945,3.93,1083,4.245,1560,4.51,1611,6.761,1677,5.262,1714,4.846,2321,6.685,2322,6.685,2323,6.685]],["t/315",[3,2.298,5,0.707,6,1.027,7,0.452,14,1.082,17,1.398,34,0.741,40,1.009,43,2.418,54,1.13,55,1.161,90,3.05,93,3.992,97,1.518,119,3.152,143,1.279,145,1.49,152,2.977,165,3.086,343,5.16,365,4.152,366,2.418,368,5.002,374,2.831,400,2.347,408,4.012,470,4.739,508,4.152,534,4.312,556,4.255,583,2.926,602,4.966,615,3.272,639,3.776,640,2.744,662,3.342,663,4.312,665,4.723,682,1.899,690,3.272,693,3.675,706,4.152,707,2.777,826,3.888,837,2.449,844,3.776,854,3.675,943,4.152,947,4.498,1070,3.675,1231,4.722,1321,3.888,1560,5.324,1578,4.312,1662,5.377,1663,5.51,2120,5.51,2324,10.298,2325,5.947,2326,5.947,2327,5.947,2328,5.377,2329,5.947,2330,5.947,2331,4.722,2332,5.377]],["t/317",[4,1.045,5,1.086,6,0.57,7,0.444,8,1.175,9,1.169,10,1.136,13,2.385,14,1.921,15,1.99,16,1.503,19,1.592,25,0.935,31,0.769,34,0.642,47,1.116,50,2.961,51,1.501,74,0.656,80,1.111,85,1.502,96,1.579,97,1.827,98,1.662,108,1.094,113,3.094,119,2.763,120,1.866,122,1.695,124,1.588,136,0.858,137,1.848,139,1.26,144,1.188,162,0.85,184,2.019,186,1.065,208,1.628,215,1.624,216,3.016,219,1.473,228,1.404,231,1.716,239,2.801,262,2.242,264,1.23,326,1.595,347,1.445,363,1.991,421,2.304,490,2.111,505,1.991,518,2.831,602,4.597,675,1.773,698,1.022,708,1.716,736,1.276,738,1.175,739,1.292,741,1.292,742,1.876,745,1.292,746,2.928,747,1.943,748,2.016,749,1.967,750,1.943,751,3.058,752,1.943,753,2.801,754,2.547,755,2.016,756,1.813,757,2.016,758,1.793,759,1.833,760,1.698,761,2.895,762,1.833,763,1.612,764,1.813,765,2.016,766,1.898,767,1.111,768,2.929,769,1.124,771,1.898,772,1.967,773,1.92,774,1.967,775,1.813,776,1.68,777,1.943,778,2.016,779,1.898,787,1.149,788,1.245,789,1.188,790,1.26,791,1.276,859,3.029,1481,1.941,1611,4.09,1714,3.735,2332,4.658,2333,5.152,2334,3.301,2335,3.301,2336,3.301,2337,3.301,2338,3.301,2339,5.152,2340,3.103,2341,5.152,2342,7.159,2343,5.152]],["t/319",[4,0.858,5,0.892,6,1.705,7,0.43,33,2.397,34,0.936,39,4.639,40,1.788,53,2.211,79,3.632,81,2.422,119,2.671,261,3.133,422,4.218,533,3.361,540,2.671,606,4.521,644,7.112,669,5.677,682,2.397,701,3.574,909,4.413,1177,5.442,1181,5.96,1182,6.663,1444,7.699,2344,7.507,2345,7.507]],["t/321",[6,1.471,34,1.062,40,1.445,43,3.463,79,4.122,422,4.787,644,5.747,714,3.213,840,4.055,861,4.42,1182,5.747,1196,5.747]],["t/323",[4,1.12,5,1.164,6,1.45,14,1.529,22,3.247,43,3.415,75,2.829,228,2.29,246,3.603,457,3.506,644,5.668,690,4.623,812,5.865]],["t/325",[1,1.682,4,1.011,5,1.162,6,0.724,7,0.494,8,0.908,9,0.951,10,0.878,13,2.057,14,1.883,15,1.89,16,1.465,19,1.419,21,0.869,25,1.187,31,1.243,33,0.815,34,0.914,38,0.806,40,1.157,47,1.155,50,2.639,51,1.426,53,2.009,54,0.365,55,0.375,74,0.507,80,0.859,85,1.222,87,2.012,88,1.64,91,0.878,96,1.285,97,1.07,98,1.352,103,0.908,108,1.338,113,2.815,117,2.355,120,1.571,136,1.09,137,1.555,139,0.974,141,1.661,143,0.549,144,0.918,162,0.657,184,0.664,186,0.823,208,1.325,216,1.215,219,1.766,228,1.142,231,1.396,239,2.496,246,3.323,262,1.783,264,0.951,273,1.11,326,1.298,340,3.954,341,1.349,347,1.176,363,1.62,366,1.037,400,1.413,405,1.577,429,1.466,432,1.349,490,1.777,505,1.62,518,2.524,547,1.5,601,1.544,644,1.721,675,1.442,698,1.652,708,1.396,733,1.349,736,0.986,738,0.908,739,0.998,741,0.998,742,1.526,745,0.998,746,2.61,747,1.581,748,1.64,749,1.6,750,1.581,751,2.757,752,1.581,753,2.416,754,2.27,755,1.64,756,1.475,757,1.64,758,1.458,759,1.492,760,1.381,761,2.58,762,1.492,763,1.311,764,1.475,765,1.64,766,1.544,767,0.859,768,2.573,769,0.869,771,1.544,772,1.6,773,1.562,774,1.6,775,1.475,776,1.367,777,1.581,778,1.64,779,1.544,787,0.888,788,0.963,789,0.918,790,0.974,791,0.986,837,1.051,859,1.5,909,1.5,913,2.146,956,1.3,1182,1.721,1223,5.416,1328,2.146,1404,1.93,1449,3.525,1458,2.307,1459,1.781,1472,7.164,1473,3.79,1475,6.168,1476,6.168,1477,6.168,1478,6.168,1479,6.168,1515,2.74,1571,1.781,1656,1.781,1740,1.781,1812,3.867,2208,2.026,2310,2.026,2346,7.333,2347,6.822,2348,1.93,2349,2.552,2350,2.552,2351,2.552,2352,2.307,2353,2.552,2354,2.552,2355,2.552,2356,4.192,2357,5.334,2358,6.822,2359,6.176,2360,4.192,2361,2.552,2362,2.552,2363,2.552,2364,2.552]],["t/327",[3,1.494,4,0.665,7,0.52,12,1.613,14,0.703,15,1.438,16,0.917,17,1.828,18,3.801,19,0.748,21,1.979,34,0.871,38,1.221,42,2.454,47,1.175,50,1.391,51,0.903,54,0.832,55,1.144,66,1.476,70,1.458,80,1.301,82,1.209,97,1.984,101,1.658,102,1.551,108,1.439,128,1.705,136,1.005,143,1.672,145,1.751,184,2.022,186,1.247,216,3.327,228,1.053,237,2.272,240,4.192,258,1.73,259,2.22,271,3.12,278,3.692,294,5.495,295,1.571,296,3.129,335,2.454,336,2.005,342,3.135,364,2.527,374,1.84,394,1.811,397,2.642,400,1.024,401,2.172,402,3.757,427,1.84,463,3.251,470,3.732,517,3.801,519,2.454,528,2.127,532,2.603,533,2.603,615,2.127,617,2.172,640,1.783,655,3.224,656,2.646,657,2.167,682,1.234,703,2.044,704,4.616,705,2.802,714,2.193,754,1.197,760,1.274,764,1.36,766,2.142,776,1.26,787,2.023,812,4.059,817,1.902,833,2.923,856,2.005,863,4.215,887,2.698,956,1.969,964,2.005,990,1.902,1032,2.607,1092,2.272,1222,2.607,1292,2.388,1293,4.587,1459,2.698,1486,2.802,1510,2.527,1522,3.251,1628,7.149,1923,5.818,1992,3.069,2028,2.698,2078,3.495,2305,3.495,2365,5.814,2366,3.865,2367,5.814,2368,3.865,2369,3.865,2370,3.865,2371,8.336,2372,3.495,2373,3.865,2374,4.879,2375,5.814,2376,5.257,2377,4.89,2378,3.865,2379,3.865,2380,3.865,2381,3.865,2382,3.865,2383,3.865]],["t/329",[4,1.059,5,1.101,6,0.597,7,0.454,8,1.23,9,1.211,10,1.19,13,2.444,14,1.933,15,2.012,16,1.548,19,1.622,25,0.979,31,0.806,34,0.666,47,1.097,50,3.018,51,1.518,74,0.687,80,1.164,85,1.557,96,1.637,97,1.873,98,1.723,108,1.126,113,3.141,119,1.9,120,1.921,122,1.428,136,0.899,137,1.902,139,1.32,144,1.244,162,0.891,184,1.697,186,1.115,208,1.687,216,3.106,219,1.527,228,1.455,231,1.779,239,2.854,262,2.119,264,1.288,326,1.653,347,1.498,363,2.064,385,1.504,490,2.173,505,2.064,518,2.885,675,1.838,698,1.07,708,1.779,736,1.336,738,1.23,739,1.353,741,1.353,742,1.944,745,1.353,746,2.984,747,2.014,748,2.089,749,2.039,750,2.014,751,3.11,752,2.014,753,2.871,754,2.596,755,2.089,756,1.879,757,2.089,758,1.858,759,1.9,760,1.76,761,2.95,762,1.9,763,1.67,764,1.879,765,2.089,766,1.967,767,1.164,768,2.992,769,1.177,771,1.967,772,2.039,773,1.99,774,2.039,775,1.879,776,1.741,777,2.014,778,2.089,779,1.967,787,1.203,788,1.304,789,1.244,790,1.32,791,1.336,796,3.216,1628,6.607,2159,3.125,2376,4.828,2377,4.491,2384,5.34,2385,3.457,2386,3.457,2387,3.457,2388,6.524,2389,3.457,2390,5.34]],["t/331",[7,0.504,38,2.226,40,1.628,54,1.26,55,1.295,71,4.353,74,1.4,80,2.964,85,2.054,105,3.402,122,2.69,146,2.595,173,3.876,259,4.047,299,3.725,317,4.753,319,1.938,351,3.108,400,1.866,430,5.593,470,3.154,540,2.507,601,2.595,650,2.723,682,2.25,695,3.655,718,4.843,830,4.141,905,5.925,1085,4.753,1191,4.918,1199,4.753,1338,5.938,1630,7.984,1635,4.918,1663,4.918,2391,7.045,2392,7.045,2393,7.045,2394,7.045,2395,8.802]],["t/333",[4,1.063,5,1.105,6,0.604,7,0.482,8,1.244,9,1.222,10,1.203,13,2.459,14,1.936,15,2.018,16,1.559,19,1.63,25,0.99,31,0.815,34,0.671,47,1.099,50,3.032,51,1.522,74,0.695,80,1.177,85,1.571,96,1.651,97,1.885,98,1.738,108,1.134,113,3.153,120,1.935,122,1.757,136,0.909,137,1.916,139,1.335,144,1.258,162,0.901,184,1.709,186,1.128,208,1.702,219,1.54,228,1.468,231,1.794,239,2.867,262,1.897,264,1.303,301,4.871,326,1.668,347,1.511,363,2.082,490,2.189,505,2.082,518,2.899,532,1.565,574,1.479,675,1.854,698,1.083,708,1.794,736,1.351,738,1.244,739,1.368,741,1.368,742,1.961,745,1.368,746,2.997,747,2.032,748,2.108,749,2.057,750,2.032,751,3.123,752,2.032,753,2.889,754,2.608,755,2.108,756,1.895,757,2.108,758,1.874,759,1.917,760,1.775,761,2.964,762,1.917,763,1.685,764,1.895,765,2.108,766,1.984,767,1.177,768,3.008,769,1.19,771,1.984,772,2.057,773,2.008,774,2.057,775,1.895,776,1.757,777,2.032,778,2.108,779,1.984,787,1.217,788,1.319,789,1.258,790,1.335,791,1.351,1397,3.905,1630,7.381,2396,5.387,2397,3.496,2398,3.496,2399,3.496,2400,3.496,2401,5.387,2402,5.387,2403,5.387]],["t/335",[7,0.38,17,1.561,19,1.284,31,1.547,32,3.11,35,3.729,38,2.097,54,0.95,55,0.976,64,3.265,84,2.663,85,1.935,88,2.597,93,3.586,95,4.983,108,1.146,122,2.632,134,3.729,198,5.918,261,2.77,286,2.534,294,3.812,319,2.57,372,3.812,374,3.159,377,3.812,499,5.269,525,2.597,535,5.771,542,4.477,615,3.652,637,2.565,714,3.197,715,4.811,733,3.509,906,5.269,907,5.582,957,3.729,964,4.398,1085,4.477,1092,3.901,1097,4.339,1520,6.411,1530,5.582,1635,4.633,1638,5.582,1929,4.339,2120,5.918,2261,6.001,2404,6.637,2405,6.637,2406,5.582,2407,6.637,2408,6.637,2409,6.001,2410,6.637,2411,6.637,2412,6.637,2413,5.269]],["t/337",[0,3.35,5,1.181,6,1.487,7,0.586,14,1.239,15,1.401,21,2.933,31,1.587,34,1.074,38,2.152,47,1.19,51,1.057,108,1.487,111,2.962,122,2.528,128,3.004,143,1.853,319,2.601,394,3.19,535,4.208,1195,3.746,2032,6.308,2406,5.727,2414,6.809,2415,8.616,2416,6.809,2417,6.809,2418,8.616,2419,6.809,2420,6.809,2421,6.809,2422,6.809]],["t/339",[4,1.088,7,0.458,17,1.881,22,3.091,40,1.613,78,4.817,93,3.384,108,1.381,109,4.942,135,3.209,535,4.942,684,5.029,688,6.416,882,5.079,1153,6.416,2120,6.639,2423,7.998,2424,9.178]],["t/341",[4,1.057,5,1.098,6,0.591,7,0.452,8,1.219,9,1.203,10,1.178,12,2.212,13,2.432,14,1.931,15,2.008,16,1.539,19,1.616,25,0.97,31,0.798,34,0.661,40,0.899,47,1.122,50,3.006,51,1.515,74,0.68,80,1.153,85,1.546,96,1.625,97,1.353,98,1.71,108,1.12,113,3.132,120,1.91,136,0.89,137,1.891,139,1.307,144,1.233,162,0.882,184,0.89,186,1.105,208,1.675,219,1.516,228,1.445,231,1.766,239,2.843,262,2.108,264,1.276,326,1.641,347,1.487,363,2.049,490,2.16,505,2.049,518,2.874,535,5.938,675,1.824,698,1.641,708,1.766,736,1.323,738,1.219,739,1.34,741,1.34,742,1.93,745,1.34,746,2.972,747,2,748,2.074,749,2.024,750,2,751,3.1,752,2,753,2.857,754,2.586,755,2.074,756,1.865,757,2.074,758,1.845,759,1.886,760,1.747,761,2.939,762,1.886,763,1.658,764,1.865,765,2.074,766,1.953,767,1.153,768,2.979,769,1.166,771,1.953,772,2.024,773,1.976,774,2.024,775,1.865,776,1.729,777,2,778,2.074,779,1.953,787,1.192,788,1.292,789,1.233,790,1.307,791,1.323,1520,4.009,1966,4.209,2032,3.366,2133,4.459,2209,2.719,2424,4.793,2425,5.301,2426,3.424,2427,3.424,2428,3.424,2429,3.424,2430,5.301,2431,5.301,2432,5.301,2433,5.301]],["t/343",[2,1.779,3,0.985,4,0.479,5,0.498,6,1.557,7,0.506,9,1.209,14,0.762,16,0.993,17,2.077,19,1.194,22,0.985,29,2.172,30,1.276,33,2.177,34,0.769,38,1.323,40,0.71,43,1.036,45,1.347,47,1.082,50,0.917,53,1.233,54,0.365,55,0.375,66,0.973,70,2.571,75,1.41,81,0.822,82,1.93,84,1.023,85,0.743,88,0.997,91,2.124,93,1.078,96,0.781,97,1.36,98,0.822,99,1.779,102,1.68,105,1.618,108,1.065,120,1.569,122,1.823,124,1.049,134,1.432,136,0.663,143,1.146,145,1.335,152,2.096,170,3.21,184,2.178,188,3.035,190,3.035,192,1.374,208,1.323,228,0.695,231,0.849,234,1.535,241,1.432,248,2.172,261,2.845,262,0.736,267,1.498,270,3.786,271,2.138,281,1.124,285,5.135,286,3.292,290,2.143,295,1.036,319,1.466,321,1.796,331,2.304,336,2.172,347,0.715,351,1.124,364,3.484,365,1.779,366,1.702,372,1.464,394,2.497,397,1.902,398,1.666,404,1.402,412,1.779,421,1.779,429,1.464,454,1.927,470,1.874,472,2.214,475,1.847,492,1.719,525,2.414,527,3.188,533,1.141,540,1.49,554,1.666,556,1.374,595,1.666,600,5.19,601,2.273,611,1.402,623,1.194,637,1.618,640,1.931,650,0.985,662,1.432,675,0.877,682,0.814,688,1.719,695,3.202,699,1.141,701,1.213,703,1.347,707,1.875,708,0.849,712,1.575,714,1.579,715,1.847,733,2.214,746,1.896,759,0.907,760,1.38,761,0.897,771,0.939,774,1.598,787,1.854,794,1.464,795,1.719,808,3.324,817,1.254,818,3.035,819,3.384,835,1.847,840,1.993,843,2.143,844,1.618,854,2.587,857,4.457,859,1.498,861,2.765,862,2.143,866,1.847,882,2.659,889,2.353,891,1.535,892,1.347,931,1.498,937,2.023,956,2.133,964,2.765,979,2.353,985,2.143,1059,1.535,1076,1.666,1092,2.461,1098,1.927,1109,2.143,1119,1.618,1128,4.871,1130,3.293,1156,3.035,1179,1.432,1195,1.402,1217,2.304,1378,2.143,1386,2.023,1388,1.276,1403,1.719,1409,4.231,1416,1.927,1431,1.847,1445,2.023,1464,1.927,1482,4.664,1490,6.116,1496,2.824,1535,1.779,1545,2.143,1561,2.304,1609,4.231,1617,5.406,1634,2.023,1647,3.035,1668,3.035,1723,2.023,1726,2.023,1803,1.779,1850,3.521,1858,2.304,1871,1.779,2053,2.023,2220,3.521,2271,1.927,2289,2.023,2331,2.023,2434,2.548,2435,5.19,2436,2.143,2437,6.801,2438,3.786,2439,2.548,2440,2.548,2441,2.548,2442,2.304,2443,4.818,2444,5.733,2445,4.818,2446,2.304,2447,2.304,2448,2.304,2449,5.329,2450,2.548,2451,2.548,2452,2.548,2453,3.786,2454,2.548,2455,2.548,2456,1.927,2457,2.548,2458,2.548,2459,4.187,2460,2.304,2461,2.548,2462,2.304,2463,4.187,2464,4.187,2465,4.187,2466,2.548,2467,2.548,2468,2.548,2469,2.548,2470,2.548,2471,2.548,2472,2.548,2473,2.304,2474,2.548,2475,2.548,2476,2.548,2477,2.548,2478,2.548,2479,2.548,2480,2.548,2481,2.548,2482,2.548,2483,2.548,2484,2.548,2485,2.304,2486,2.023]],["t/345",[4,1.028,5,1.069,6,1.39,7,0.434,8,1.116,9,1.123,10,1.08,13,2.319,14,1.907,15,1.965,16,1.455,19,1.558,25,0.888,31,0.731,34,0.617,47,1.128,50,2.899,51,1.482,74,0.623,80,1.056,85,1.443,96,1.517,97,1.777,98,1.597,99,4.28,108,1.058,113,3.04,117,2.782,120,2.05,136,0.816,137,1.788,139,1.198,144,1.129,145,1.241,162,0.808,184,1.971,186,1.012,188,3.589,190,3.589,208,1.564,219,1.416,228,1.349,231,1.649,239,2.741,248,1.628,262,2.325,264,1.169,271,1.259,285,1.992,326,1.533,334,1.493,347,1.388,363,1.913,466,2.19,490,2.042,505,1.913,518,2.771,600,4.163,601,1.823,675,1.704,698,0.971,708,1.649,736,1.212,738,1.116,739,1.227,741,1.227,742,1.802,745,1.227,746,2.866,747,1.867,748,1.937,749,1.89,750,1.867,751,3,752,1.867,753,2.724,754,2.493,755,1.937,756,1.742,757,1.937,758,1.722,759,1.762,760,1.631,761,2.834,762,1.762,763,1.548,764,1.742,765,1.937,766,1.823,767,1.056,768,2.858,769,1.068,771,1.823,772,1.89,773,1.845,774,1.89,775,1.742,776,1.614,777,1.867,778,1.937,779,1.823,787,1.092,788,1.183,789,1.129,790,1.198,791,1.212,808,4.868,1128,1.889,1482,1.889,1490,4.637,1535,2.19,1609,3.93,1617,4.28,2437,5.157,2444,7.563,2446,4.476,2447,4.476,2448,4.476,2453,5.544,2487,4.95,2488,3.137,2489,3.137,2490,3.137,2491,3.137,2492,3.137,2493,3.137,2494,3.137,2495,4.95,2496,4.95,2497,4.95,2498,4.95]],["t/347",[3,3.654,5,0.871,7,0.419,12,3.057,17,1.722,22,2.831,31,1.241,36,2.977,43,2.165,47,0.782,51,0.827,52,3.059,53,1.568,54,1.291,55,1.327,56,3.487,57,3.207,58,3.279,76,2.763,90,2.058,91,2.521,105,2.058,106,3.207,125,3.381,152,2.666,202,2.763,208,1.683,252,2.871,266,2.495,269,2.316,296,3.279,336,3.801,360,3.13,366,2.165,374,3.487,403,4.651,404,2.93,422,2.992,525,2.084,540,1.895,556,3.949,601,3.927,615,2.93,623,2.495,650,2.058,769,1.813,776,2.388,812,3.718,817,2.62,861,3.801,892,2.816,941,4.815,996,3.481,1108,4.116,1209,4.228,1258,3.592,1382,4.941,1417,4.479,1631,8.394,1680,4.027,1703,3.592,1704,3.592,1860,4.815,2499,7.952,2500,3.718,2501,5.325,2502,4.815,2503,5.325,2504,5.325,2505,5.325,2506,5.325,2507,5.325,2508,5.325,2509,5.325,2510,5.325,2511,5.325,2512,5.325,2513,5.325,2514,5.325,2515,5.325,2516,5.325,2517,7.325,2518,4.479,2519,4.815]],["t/349",[4,1.052,5,1.093,6,0.582,7,0.449,8,1.201,9,1.189,10,1.161,13,2.413,14,1.927,15,2.001,16,1.525,19,1.676,25,0.955,31,0.786,34,0.653,35,1.896,47,1.093,50,2.988,51,1.529,74,0.67,80,1.136,85,1.528,96,1.606,97,1.338,98,1.691,108,1.109,113,3.116,120,1.892,122,1.718,126,2.825,136,0.877,137,1.874,139,1.288,144,1.214,145,0.846,162,0.869,184,0.877,186,1.089,208,1.656,217,3.658,219,1.499,228,1.428,231,1.746,239,2.826,258,2.346,262,2.092,264,1.258,319,1.442,326,1.623,347,1.47,363,2.025,397,2.381,477,2.679,490,2.14,498,2.355,505,2.025,518,2.857,549,3.658,601,2.367,675,1.803,698,1.045,708,1.746,736,1.304,738,1.201,739,1.32,741,1.32,742,1.908,745,1.32,746,2.954,747,1.977,748,2.05,749,2.001,750,1.977,751,3.083,752,1.977,753,2.834,754,2.57,755,2.05,756,1.844,757,2.05,758,1.823,759,1.865,760,1.727,761,2.921,762,1.865,763,1.639,764,1.844,765,2.05,766,1.93,767,1.136,768,2.959,769,1.148,771,1.93,772,2.001,773,1.953,774,2.001,775,1.844,776,1.709,777,1.977,778,2.05,779,1.93,787,1.174,788,1.273,789,1.214,790,1.288,791,1.304,1631,4.16,2499,4.408,2502,3.051,2520,5.24,2521,3.374,2522,3.374,2523,3.374,2524,3.051,2525,3.374,2526,3.374,2527,9.401,2528,5.24,2529,5.24,2530,5.24]],["t/351",[5,0.978,6,1.421,14,1.153,21,2.157,34,1.249,40,1.641,45,4.351,53,1.866,54,1.308,55,1.211,66,3.142,91,2.181,93,2.681,140,4.276,159,2.511,238,3.917,240,3.417,243,3.067,251,2.757,262,1.83,263,4.025,343,4.144,345,4.119,347,1.778,366,2.576,396,3.017,403,5.225,415,3.289,416,4.025,457,3.435,525,2.48,575,4.144,601,2.335,650,2.449,655,4.624,656,3.292,657,3.067,663,5.966,677,3.562,691,3.817,844,4.025,1092,3.726,1112,4.025,1258,4.276,1321,4.144,1674,5.032,1740,4.425,1992,5.032,2243,5.331,2372,5.731,2531,5.731,2532,6.338,2533,5.032,2534,5.731,2535,6.338,2536,6.338,2537,6.338,2538,5.731,2539,6.338,2540,5.331]],["t/353",[5,1.235,6,1.753,40,1.791,53,1.947,54,0.947,55,0.973,101,2.836,220,5.529,283,4.919,352,4.794,394,3.098,400,2.933,525,3.309,606,5.094,639,4.199,650,3.268,707,2.976,738,3.01,751,2.353,870,5.001,1107,5.979,1410,4.323,1412,4.086,1496,4.461,2219,7.125,2533,5.25,2540,5.562,2541,6.613,2542,6.613,2543,6.613,2544,6.613,2545,8.457,2546,8.457]],["t/355",[4,0.776,5,1.122,6,1.484,7,0.388,34,1.237,40,1.151,47,1.21,66,2.59,81,2.189,97,1.732,108,1.171,109,4.192,113,2.361,115,4.435,145,1.7,184,1.764,220,6.486,226,3.037,237,3.988,238,4.192,246,2.91,490,2.26,492,4.577,613,3.988,759,2.414,867,5.706,990,3.338,1205,4.736,1591,3.13,1592,3.13,2533,5.386,2547,6.784,2548,6.784,2549,5.458,2550,6.134,2551,5.706,2552,6.134]],["t/357",[5,0.823,6,1.195,7,0.498,16,1.165,34,1.284,40,1.616,47,1.177,51,0.762,53,1.446,54,0.703,55,0.723,66,2.643,75,2.331,82,1.536,91,1.69,108,0.848,111,2.136,115,3.211,145,1.231,146,1.809,220,6.733,231,1.636,265,3.035,269,2.136,281,3.055,283,4.014,366,1.996,377,2.821,400,2.692,416,3.119,457,2.05,467,4.131,493,3.56,495,2.76,606,2.958,613,4.07,653,2.958,682,2.211,688,3.313,691,2.958,707,2.436,813,5.497,867,4.131,956,4.436,990,5.31,1071,3.56,1117,2.648,1372,3.899,1402,3.56,1412,4.955,1437,3.313,1509,4.441,1591,2.266,1592,4.235,1652,5.019,2219,3.56,2533,5.497,2540,5.823,2549,5.829,2551,4.131,2552,7.25,2553,6.923,2554,4.441,2555,4.911,2556,5.823,2557,4.441,2558,4.911,2559,4.911,2560,3.899]],["t/359",[7,0.37,12,3.482,16,1.536,19,1.614,21,2.203,34,1.288,47,0.985,51,1.005,76,2.441,81,2.088,103,3.285,109,4,111,2.815,124,2.09,145,1.622,147,2.968,151,3.358,243,3.132,262,1.869,282,3.081,295,2.631,340,3.49,343,4.231,347,1.815,392,3.358,400,2.445,419,4.895,428,5.444,623,3.033,656,2.839,698,2.004,738,2.303,882,4.11,933,4.298,959,3.848,962,4.518,990,3.185,1117,3.49,1179,3.637,1183,2.986,1205,4.518,1293,3.561,1294,3.637,1320,5.444,1412,4,1559,4.895,2549,5.861,2560,5.139,2561,7.542]],["t/361",[4,0.96,7,0.531,14,1.645,15,1.635,19,1.866,25,2.082,31,0.809,34,1.047,47,1.226,51,1.141,74,1.969,76,1.309,82,1.085,103,1.235,108,1.747,109,2.144,111,2.845,122,0.928,128,1.531,137,2.144,143,1.152,144,1.249,145,1.843,146,2.927,150,2.203,159,2.122,215,1.707,216,1.652,219,0.992,262,1.002,265,3.309,266,1.626,272,2.144,298,3.613,319,0.955,394,1.626,537,2.04,602,3.218,615,1.909,655,3.017,656,2.705,684,1.835,698,1.074,738,1.235,866,2.515,933,3.879,959,4.279,1117,1.871,1293,1.909,1591,3.392,1592,3.392,1628,2.422,1780,2.624,1832,5.271,2209,2.755,2340,3.939,2377,2.918,2549,5.558,2562,3.47,2563,6.184,2564,6.683,2565,3.939,2566,5.355,2567,5.355,2568,3.47,2569,3.47]],["t/363",[1,2.188,4,0.623,7,0.485,19,1.055,22,2.107,34,1.057,47,1.176,72,4.018,75,1.836,79,2.638,82,1.705,84,2.188,103,3.393,135,2.188,136,2.204,146,3.122,165,2.829,173,4.096,183,2.216,184,2.368,219,2.424,241,3.064,243,2.638,255,3.792,265,4.6,266,2.554,274,3.369,281,2.405,326,2.82,337,4.376,341,5.326,397,4.471,400,2.716,432,2.883,457,3.107,495,3.064,528,3,547,3.205,615,3,655,3.91,656,3.1,657,3.395,661,4.328,682,1.741,685,2.638,889,3.064,927,3.462,929,3.205,933,3.85,959,2.515,1070,3.369,1663,3.806,2413,4.328,2570,4.585,2571,4.328,2572,5.196]],["t/365",[0,2.443,4,0.568,12,2.072,19,1.693,21,1.69,28,3.575,34,0.87,38,1.569,45,2.625,47,1.194,51,1.083,72,2.19,74,1.831,82,1.553,101,2.129,108,1.51,111,2.159,145,2.021,146,1.829,147,3.113,148,5.026,184,1.291,208,1.569,219,1.42,226,2.223,251,2.159,255,2.529,272,3.068,337,2.918,373,3.376,377,2.852,400,1.315,484,5.555,556,4.349,613,4.741,681,3.941,684,2.625,695,2.576,771,1.829,825,4.489,854,5.406,927,3.152,933,4.207,959,4.409,970,3.349,1092,2.918,1130,5.406,1195,2.731,1434,3.755,1437,3.349,1591,3.218,1592,3.218,1650,3.599,1667,4.311,1726,3.941,1754,3.92,1803,3.466,1995,4.175,2486,5.538,2565,4.202,2573,4.964,2574,4.489,2575,4.489,2576,3.941,2577,6.308,2578,6.784,2579,4.489,2580,4.964,2581,4.964,2582,6.976]],["t/367",[7,0.379,19,1.282,21,3.347,28,2.821,34,0.826,47,1.213,51,1.028,81,1.489,93,1.952,103,2.357,109,4.093,110,3.345,136,1.722,146,1.7,173,2.539,184,1.2,219,1.894,225,3.989,241,4.353,255,2.351,262,1.332,265,5.539,326,1.429,337,4.554,349,3.881,400,2.605,613,2.713,655,3.574,656,3.569,657,3.583,927,5.376,933,3.761,959,4.136,970,3.113,1027,5.408,1076,5.065,1222,4.468,1591,3.055,1592,3.055,2374,4.624,2549,2.93,2571,3.664,2572,3.221,2579,4.172,2583,4.614,2584,6.623,2585,4.614,2586,8.891,2587,8.891,2588,8.466,2589,4.614,2590,5.258,2591,4.614]],["t/369",[5,0.593,7,0.401,14,0.908,17,1.174,20,3.775,34,0.622,36,2.029,47,1.192,51,0.775,83,2.543,97,1.274,103,1.776,108,0.862,110,5.077,145,1.251,146,3.402,147,1.776,184,1.821,241,2.805,265,3.084,271,3.842,273,2.171,274,3.084,287,3.084,373,2.415,396,3.334,400,2.323,401,2.805,417,6.962,429,5.648,519,5.864,526,3.775,655,2.303,656,2.753,657,3.269,677,2.805,682,1.594,692,3.084,762,1.776,764,1.756,933,3.614,1145,3.935,1348,6.332,1404,3.775,1559,3.775,1591,3.231,1592,3.231,1636,4.513,1716,3.963,1754,2.805,2572,3.485,2592,4.992,2593,4.198,2594,4.513,2595,8.769,2596,4.992,2597,4.992,2598,4.992,2599,4.992,2600,4.992,2601,4.992,2602,4.992,2603,4.992,2604,4.992,2605,7.003,2606,7.003,2607,8.769,2608,4.992,2609,4.992,2610,4.992,2611,4.992,2612,4.992,2613,4.992,2614,4.992,2615,4.992,2616,4.992,2617,4.992,2618,4.992,2619,4.992,2620,4.992,2621,4.992,2622,4.992,2623,4.992,2624,4.992,2625,4.992,2626,4.992,2627,4.992,2628,4.992]],["t/372",[4,0.851,7,0.563,17,2.142,41,5.023,74,1.479,91,2.562,146,3.355,147,2.65,255,3.793,263,4.728,316,6.09,317,6.145,319,2.049,320,4.377,324,6.359,328,5.198,346,6.732,347,2.088,418,3.727,426,8.236,615,4.097,933,3.564,2306,6.732,2629,7.446,2630,7.446,2631,6.732,2632,7.446,2633,6.732,2634,7.446]],["t/374",[12,3.539,51,1.316,75,2.855,79,4.103,102,3.403,124,2.125,147,3.017,933,4.188,959,3.912,1491,6.732]],["t/376",[5,0.693,7,0.536,16,1.384,26,4.948,34,1.094,40,0.99,44,3.514,47,1.071,51,0.906,85,2.272,96,2.388,108,1.345,132,4.412,141,2.311,146,2.149,186,2.514,262,2.25,266,2.733,295,2.371,400,2.324,427,3.709,442,3.145,470,3.488,602,3.834,639,4.948,655,4.047,656,3.656,933,3.433,959,3.595,1059,3.514,1179,3.278,1210,4.632,1293,4.287,1294,3.278,1295,6.553,1296,5.275,1297,4.632,1298,6.36,1299,4.907,1320,6.553,1439,4.229,1832,5.284,1878,4.907,1990,6.186,2635,9.363,2636,5.834,2637,4.632,2638,5.834,2639,4.907,2640,6.553,2641,6.553,2642,6.553,2643,6.553,2644,6.553,2645,6.553,2646,6.553]],["t/378",[4,0.58,5,0.603,7,0.467,14,0.923,16,1.681,17,1.193,21,1.727,26,5.609,30,2.54,34,0.883,40,0.861,47,1.128,51,0.788,54,0.727,74,1.755,81,1.637,105,2.738,132,6.172,136,1.32,141,3.993,145,1.272,146,1.869,152,2.54,159,2.011,184,1.842,186,1.637,219,2.026,222,3.546,243,2.455,262,2.91,264,1.891,266,2.378,295,3.59,349,4.268,490,2.36,528,2.792,655,4.557,656,3.734,675,1.746,682,2.262,684,2.683,933,1.985,959,2.341,990,2.497,1083,4.498,1222,3.423,1258,3.423,1265,5.958,1292,3.136,1293,5.296,1297,5.624,1298,3.679,1299,4.268,1439,5.916,1806,3.838,1832,5.32,2374,3.542,2564,8.308,2647,5.074,2648,4.588,2649,5.074,2650,4.588,2651,5.074,2652,5.074,2653,5.074,2654,4.588,2655,8.161]],["t/380",[7,0.413,19,1.395,26,4.579,34,0.899,47,1.201,54,1.032,55,1.061,72,3.182,74,1.433,103,2.566,146,2.656,165,3.742,184,2.322,240,3.888,264,2.688,326,2.233,337,5.25,341,5.13,397,4.409,400,2.571,655,4.12,656,3.04,657,3.329,927,4.579,959,3.327,2570,6.065]],["t/382",[4,1.011,7,0.551,14,1.292,15,1.461,16,1.685,19,1.374,34,0.885,47,1.205,51,1.102,54,1.016,55,1.044,74,1.757,108,1.663,111,3.088,145,1.779,228,1.935,351,3.132,602,3.493,754,2.198,933,3.77,959,4.445,1260,4.276,1437,4.789,1460,5.369,1591,3.275,1592,3.275,1648,5.636,2340,4.276,2565,4.276]],["t/384",[4,1.03,5,0.959,7,0.568,9,2.252,14,1.119,36,2.499,40,1.043,46,4.43,47,1.02,51,1.398,53,1.81,54,1.155,55,1.324,56,2.926,57,3.702,58,2.752,59,4.88,60,4.88,61,4.456,74,1.221,83,4.11,97,1.569,101,2.636,102,2.467,103,2.87,106,3.702,194,4.533,223,3.613,224,5.17,225,4.858,226,2.752,237,3.613,258,2.752,266,2.88,296,2.752,336,3.189,337,3.613,341,5.054,343,4.019,357,4.147,360,3.613,556,3.314,602,3.024,754,1.903,884,4.019,933,3.523,959,2.836,996,4.019,1023,4.88,1108,3.454,1172,4.456,1412,3.798,1676,4.88,1703,4.147,1704,4.147,1750,6.784,2549,3.903,2656,6.147,2657,5.558,2658,5.558,2659,6.147,2660,6.147,2661,5.17,2662,5.17]],["t/387",[7,0.491,14,1.561,15,1.391,19,1.659,25,1.914,34,0.843,47,1.223,51,1.049,74,1.871,108,1.626,137,1.971,145,1.694,146,2.49,602,3.326,656,2.301,933,3.355,959,3.956,1591,3.118,1592,3.118,1832,5.673,2340,4.071,2549,5.446,2563,7.213,2564,5.685,2565,4.071]],["t/389",[14,1.587,15,1.428,19,1.687,25,1.965,32,3.251,34,0.865,47,1.223,51,1.077,74,1.378,108,1.646,137,2.023,145,1.739,146,2.556,602,3.414,959,4.022,1591,3.201,1592,3.201,2340,4.179,2563,7.333,2565,4.179,2648,6.273,2663,6.938,2664,6.938,2665,6.938,2666,6.938,2667,6.938]],["t/391",[4,0.812,7,0.406,14,1.292,15,1.461,19,1.374,31,1.654,34,0.885,47,1.205,51,1.102,74,1.41,84,3.549,108,1.226,145,1.779,165,3.684,186,2.291,222,3.554,231,2.365,251,3.088,602,3.493,655,4.652,656,2.416,682,2.824,933,3.461,959,3.275,990,3.493,1293,3.906,1295,5.971,1298,5.147,1591,3.275,1592,3.275,2340,4.276,2565,4.276,2668,7.099]],["t/393",[7,0.522,19,1.447,34,1.28,51,1.161,105,2.889,108,1.291,112,3.559,124,2.471,225,5.5,238,4.62,241,4.201,243,3.617,251,3.252,282,3.559,396,3.559,400,1.981,655,3.449,656,3.356,657,2.787,763,2.856,900,4.888,933,3.858,1235,4.738,2137,6.288,2374,5.219,2538,6.76,2590,5.935,2669,7.476,2670,7.476]],["t/395",[4,1.018,7,0.509,14,1.093,15,1.236,16,1.425,19,1.537,32,2.814,34,0.749,47,1.217,51,1.233,54,0.86,55,0.884,74,1.882,108,1.537,111,2.612,124,2.231,137,1.751,145,1.505,146,2.212,225,3.617,243,2.906,282,2.859,337,4.67,351,2.65,396,2.859,602,2.955,611,3.304,655,4.106,656,2.704,657,2.239,682,1.918,702,4.784,933,3.854,1235,3.116,1260,3.617,1437,4.052,1460,4.542,1591,2.771,1592,2.771,1647,4.354,1648,4.768,2340,3.617,2374,4.193,2565,3.617,2590,4.768,2671,4.768,2672,6.681]],["t/397",[7,0.518,21,3.477,47,1.165,70,2.342,72,2.74,85,1.811,112,2.956,186,3.406,219,1.776,243,5.108,262,3.184,265,3.837,282,4.307,590,6.829,683,2.909,1222,5.478,1235,4.213,1265,5.222,2310,4.93,2374,6.952,2672,6.829,2673,6.209,2674,6.209,2675,6.209,2676,9.048,2677,9.048,2678,6.209,2679,6.209,2680,9.048,2681,6.209,2682,6.209]],["t/399",[5,0.815,19,1.327,34,0.855,47,1.213,103,2.441,108,1.184,110,4.973,115,4.485,124,1.719,135,2.753,136,1.784,145,1.719,146,2.527,240,4.668,243,4.589,246,2.942,262,1.981,282,4.121,337,4.033,655,4.595,656,2.335,657,2.557,1235,4.921,1591,3.165,1592,3.165,1647,4.973,2374,4.789,2551,5.77,2672,7.281,2683,8.657,2684,8.657]],["t/402",[7,0.414,19,1.401,21,2.464,28,3.26,47,1.205,51,1.124,124,1.814,243,4.703,282,4.627,337,4.256,655,4.484,656,3.047,927,4.597,970,4.884,1235,3.756,1357,7.53,1437,4.884,2586,8.095,2587,8.095,2685,8.095,2686,7.24,2687,7.24,2688,7.24]],["t/404",[19,1.618,47,1.137,51,1.298,124,2.096,396,4.648,400,2.216,655,4.504,657,3.639,1235,4.339,1990,6.64]],["t/406",[19,1.85,47,1.206,51,1.253,124,2.396,220,5.275,281,3.56,655,4.41,1357,8.041,1372,6.406]],["t/408",[19,1.618,47,1.173,51,1.298,124,2.096,243,4.047,282,3.981,656,2.847,2689,9.764,2690,8.363,2691,8.363]],["t/410",[19,1.626,47,1.185,51,1.304,124,2.105,243,4.065,282,4,656,2.86,657,3.131,2590,6.67]],["t/412",[7,0.355,16,2.277,19,1.201,45,4.784,47,1.158,51,0.964,54,0.889,81,2.004,85,1.811,124,1.556,159,2.46,162,1.6,178,3.74,243,4.643,251,2.701,259,3.567,262,2.613,269,2.701,282,3.865,394,2.909,427,2.956,458,6.829,464,5.084,472,3.283,547,3.65,656,3.754,677,3.489,833,4.696,944,3.837,1200,6.843,1232,5.668,1553,4.335,1832,5.449,1878,8.071,2028,4.335,2685,5.614,2692,9.048,2693,9.048,2694,6.209,2695,6.209,2696,6.209,2697,6.209,2698,6.209]],["t/415",[5,0.911,7,0.438,54,1.097,55,1.127,83,3.905,119,2.727,157,5.17,273,3.333,319,2.109,331,4.217,356,5.35,527,3.333,529,4.736,533,3.431,564,4.866,574,3.242,650,2.962,699,3.431,817,3.771,1116,4.306,1117,4.132,1203,6.084,1220,5.17,1788,8.382,1789,8.382,2699,7.664,2700,6.929,2701,7.664,2702,7.664,2703,6.084,2704,7.664,2705,7.664]],["t/417",[0,3.605,7,0.516,28,3.558,31,1.707,35,4.117,37,4.307,47,0.963,54,1.049,55,1.078,64,5.017,69,6.821,70,2.764,143,1.576,145,1.836,236,5.311,261,3.058,396,4.294,422,4.117,763,2.292,789,3.517,837,3.017,892,3.874,1463,6.162,1765,4.943,2251,5.541,2706,7.327,2707,5.817,2708,8.155,2709,8.155,2710,7.16,2711,6.162,2712,6.162,2713,6.624]],["t/419",[4,0.869,7,0.568,26,4.826,28,3.358,33,2.427,42,4.826,64,4.538,69,5.748,76,3.479,143,1.634,228,2.071,283,3.804,374,3.618,390,4.468,422,5.183,552,5.748,637,2.937,707,2.674,892,4.877,961,6.872,1076,6.03,2120,5.306,2708,8.979,2714,9.223,2715,7.6,2716,7.6,2717,7.6]],["t/421",[4,0.855,5,0.889,6,1.291,66,2.854,83,4.652,113,2.601,205,4.113,223,5.368,229,5.42,241,5.131,252,4.031,427,4.347,464,4.201,490,3.042,610,6.16,677,4.201,742,3.739,853,5.935,1101,4.295,1179,4.201,1185,6.906,1403,5.043,1923,4.395,2550,6.76,2700,6.76,2718,6.76,2719,5.97,2720,5.935,2721,6.76,2722,7.476,2723,7.476]],["t/423",[4,0.828,7,0.414,31,2.086,34,1.212,44,4.36,47,0.955,76,2.731,85,2.111,108,1.25,122,1.936,143,1.557,145,2.436,185,6.089,222,3.624,258,3.241,262,2.09,265,5.532,266,3.392,271,2.905,319,1.992,326,2.242,503,6.089,574,3.063,610,4.884,615,3.983,684,3.828,688,4.884,742,3.539,747,2.731,788,2.731,853,5.748,857,4.733,1116,4.068,1774,5.748,1923,5.263,2724,6.546,2725,6.546,2726,7.24,2727,7.24,2728,7.24]],["t/425",[1,2.165,4,0.401,5,0.416,7,0.309,14,1.452,15,1.354,17,1.877,18,3.527,22,1.354,31,2.047,34,1.051,38,2.079,45,2.852,51,1.021,53,1.937,70,1.321,74,1.072,75,1.179,76,2.035,91,1.856,94,1.785,96,1.074,98,1.13,103,1.247,111,1.524,119,1.247,122,1.76,124,2.112,136,0.911,140,2.363,141,1.388,143,1.415,151,1.818,162,1.39,165,3.835,184,1.922,198,2.445,202,2.035,205,3.62,208,1.705,216,1.668,219,2.113,222,1.753,229,2.539,244,3.426,255,1.785,262,1.011,268,5.159,271,1.406,286,3.047,288,3.031,295,1.424,315,3.479,321,2.314,325,3.62,331,4.989,334,3.518,336,2.799,347,0.982,357,2.363,366,1.424,374,1.668,385,2.346,390,2.059,394,1.641,457,1.462,464,1.968,484,3.426,492,2.363,493,4.769,519,2.224,529,2.165,553,2.649,556,1.889,557,5.357,574,2.282,583,4.321,610,2.363,646,2.539,670,3.099,683,1.641,685,1.695,692,2.165,698,1.085,699,2.415,701,1.668,714,1.321,742,3.572,747,1.321,751,2.84,775,2.315,817,2.654,831,4.769,837,1.443,854,2.165,857,3.527,884,2.29,900,2.29,933,4.164,957,3.697,1076,2.29,1092,2.059,1114,2.649,1116,1.968,1119,2.224,1145,1.968,1179,3.031,1199,2.363,1212,3.167,1260,2.11,1292,3.334,1403,2.363,1482,2.11,1536,3.167,1767,2.781,1775,6.712,1780,4.08,1803,2.445,2248,4.537,2560,2.781,2719,5.928,2720,2.781,2721,3.167,2729,3.167,2730,3.503,2731,3.503,2732,3.167,2733,6.579,2734,3.503,2735,2.649,2736,3.167,2737,3.167,2738,6.579,2739,3.503,2740,3.503,2741,3.503,2742,3.503,2743,3.503,2744,3.503,2745,3.503,2746,3.167,2747,3.167,2748,3.167,2749,3.503,2750,3.503,2751,2.781,2752,3.503,2753,3.503,2754,3.503,2755,4.878,2756,3.503,2757,3.167,2758,5.395,2759,3.167,2760,2.781,2761,3.167]],["t/427",[5,0.78,6,1.133,7,0.532,12,3.878,17,1.544,31,1.53,34,1.263,40,1.114,44,3.954,53,1.933,66,2.506,81,2.118,83,3.345,99,4.583,113,2.284,120,2.479,122,1.756,145,1.645,146,2.418,173,3.612,205,3.612,223,3.859,266,3.944,325,4.632,342,3.54,400,2.597,402,2.816,490,2.187,533,2.939,650,3.253,656,2.235,657,2.447,682,3.41,742,2.39,831,4.759,1101,3.771,1117,3.54,1178,4.169,1183,3.884,1382,4.429,1412,4.057,1613,5.936,1902,4.583,1923,3.859,2304,5.212,2348,4.965,2762,7.105,2763,5.936,2764,5.522,2765,6.565]],["t/429",[5,1.037,6,1.506,892,5.289,2766,10.004,2767,8.721]],["t/431",[7,0.539,28,3.669,38,2.484,324,5.488,374,3.742,613,5.533,618,5.699,789,2.829,877,5.699,964,4.079,1032,5.303,1763,5.303,2409,7.108,2768,7.861,2769,9.413,2770,7.108,2771,7.861,2772,7.861,2773,7.861,2774,7.861,2775,7.861,2776,7.861,2777,7.108,2778,7.861,2779,7.861]],["t/435",[1,3.465,3,2.391,4,0.708,5,0.963,7,0.42,8,1.495,10,1.446,28,2.253,30,3.097,34,0.524,38,1.328,47,0.922,51,0.652,53,1.822,54,1.444,55,1.484,66,1.604,75,2.083,82,2.297,85,1.225,91,1.446,108,1.268,112,2,119,2.883,122,2.166,143,0.904,157,2.835,205,3.404,209,4.679,222,2.103,237,2.47,269,1.828,271,3.845,273,3.524,274,2.596,295,2.515,296,3.288,297,3.046,319,2.021,321,1.802,334,3.496,366,1.708,374,2.945,385,3.194,394,2.899,401,4.552,402,3.15,404,2.312,418,2.103,432,2.222,444,1.708,484,2.668,517,4.045,519,2.668,526,3.178,529,5.336,532,2.77,533,1.881,535,5.581,541,3.336,574,2.617,670,2.414,672,3.178,685,2.033,707,1.478,714,1.585,731,2.668,732,4.319,733,2.222,763,1.314,803,4.317,957,3.477,979,2.361,984,3.726,1058,5.594,1101,2.414,1112,2.668,1200,3.178,1232,4.319,1412,4.538,1634,3.336,1755,3.554,1812,3.046,1871,4.319,1892,5.594,1893,5.594,1896,5.594,1923,2.47,1929,2.747,1946,3.336,2032,2.668,2069,3.799,2120,4.319,2406,3.534,2594,5.594,2780,3.534,2781,6.187,2782,4.202,2783,5.594,2784,6.187,2785,5.204,2786,7.344,2787,6.187,2788,6.187,2789,6.187,2790,4.202,2791,3.799,2792,3.799,2793,3.799,2794,4.202,2795,4.202,2796,4.202,2797,4.202,2798,4.202,2799,4.202,2800,4.202,2801,4.202,2802,4.202,2803,4.202]],["t/437",[4,0.831,6,1.255,7,0.514,28,2.646,44,4.378,47,0.776,53,2.14,54,1.285,55,1.32,82,2.807,85,2.119,98,2.345,120,2.14,122,2.4,248,3.771,250,4.903,261,3.034,286,2.775,533,4.359,670,4.175,673,6.113,685,3.517,714,3.385,732,6.797,763,2.274,803,4.273,964,4.657,1116,4.084,1118,6.572,1923,5.724,1929,4.752,2053,5.771,2804,7.268,2805,7.268,2806,7.268,2807,7.268]],["t/439",[1,3.154,3,3.637,17,1.848,22,3.037,28,2.151,30,4.711,53,3.028,80,1.99,83,3.011,101,2.534,119,2.797,208,1.867,261,2.466,278,3.752,288,3.32,295,2.402,316,4.416,334,4.203,347,1.657,385,3.418,427,2.813,538,3.124,539,3.124,546,5.343,618,4.284,637,2.284,659,3.986,677,3.32,692,4.856,733,4.669,776,1.927,838,4.125,844,3.752,882,3.752,943,4.125,957,4.962,1195,3.251,1284,4.469,1377,4.469,1382,3.986,1416,7.619,1427,4.97,1656,6.164,1971,9.109,2328,5.343,2352,5.343,2413,4.691,2748,5.343,2808,7.859,2809,5.909,2810,5.909,2811,7.859,2812,7.859,2813,7.859,2814,5.909,2815,5.909,2816,5.909,2817,5.343,2818,5.343,2819,5.909,2820,7.859,2821,5.909,2822,5.909,2823,5.909,2824,5.909]],["t/441",[6,0.988,7,0.593,17,2.043,53,1.686,54,1.244,55,1.278,72,2.526,75,1.927,76,2.159,98,1.847,124,1.435,143,1.231,148,3.288,150,3.635,151,2.97,208,2.431,231,1.907,261,2.389,286,3.959,334,2.725,336,2.97,347,1.606,366,2.327,394,2.682,403,3.635,416,3.635,460,4.329,466,3.996,524,5.176,527,2.49,533,2.563,538,3.027,547,3.365,556,3.086,659,3.862,670,3.288,695,2.97,701,2.725,707,2.014,714,2.902,777,2.159,819,5.518,829,2.77,832,4.545,840,2.725,861,2.97,882,3.635,889,3.217,931,3.365,956,2.917,964,4.509,1059,3.448,1114,4.329,1156,5.578,1378,4.815,1445,4.545,1490,7.332,1501,4.329,1545,4.815,1652,4.15,1674,4.545,1812,4.15,1871,3.996,1965,4.545,2220,7.309,2248,4.815,2289,4.545,2435,8.154,2437,6.471,2438,6.956,2442,5.176,2485,5.176,2761,5.176,2763,5.176,2825,7.694,2826,5.176,2827,5.724]],["t/444",[4,1.026,13,2.421,14,1.323,15,1.847,18,5.867,30,3.638,47,1.039,75,2.447,101,3.118,137,2.119,170,4.378,208,3.301,234,4.378,271,2.917,273,4.423,281,3.207,708,2.421,751,2.587,777,2.742,842,6.572,969,5.771,1112,4.615,1871,5.074,2792,8.804,2793,8.804,2828,9.737,2829,9.737,2830,7.268,2831,7.268]],["t/447",[4,0.869,5,0.903,6,1.312,40,1.684,42,4.826,43,3.089,54,1.088,55,1.118,81,2.452,107,6.034,223,4.468,251,3.306,255,3.872,283,3.804,344,4.969,345,5.169,390,4.468,490,2.532,539,4.018,653,4.577,662,4.271,668,5.127,685,3.677,837,3.13,926,6.392,1220,5.127,1391,4.826,1672,6.034,1765,5.127,2022,6.392,2832,7.6,2833,7.6,2834,6.034]],["t/449",[16,1.881,40,1.345,54,1.355,55,1.166,82,2.48,87,3.815,183,3.223,240,4.275,261,3.949,262,2.289,288,4.455,319,2.182,394,3.715,400,2.101,656,3.565,682,2.532,794,4.555,829,3.837,1059,4.775,1070,4.899,2791,7.169]],["t/451",[3,3.386,5,0.831,7,0.4,12,2.918,17,1.644,28,3.19,34,1.092,54,1.001,55,1.028,81,2.256,82,2.187,97,1.785,183,2.842,228,1.905,240,5.158,266,3.276,271,3.839,315,3.697,402,2.999,412,4.881,427,4.17,442,3.769,457,2.918,519,4.439,583,3.44,599,5.88,677,3.929,794,4.016,830,5.15,837,2.879,876,6.321,1114,5.287,1178,5.563,1412,4.32,1459,4.881,1514,5.88,1617,6.116,1618,7.488,1965,5.55,1996,5.88,2117,6.321,2835,6.991,2836,6.991,2837,6.991]],["t/453",[17,1.744,19,2.033,51,1.411,102,3.646,223,5.341,271,2.976,273,3.225,400,1.965,470,4.068,601,2.732,656,3.093,682,3.355,698,2.296,766,2.732,830,4.359,839,5.608,1112,5.77,1481,6.285,1618,5.376,1812,6.587,1992,5.887,2043,5.003,2838,7.415,2839,7.415]],["t/455",[3,3.292,4,0.974,17,2.003,66,3.252,75,2.868,271,3.418,342,4.593,470,3.814,517,5.569,1101,4.893,1628,6.89]],["t/457",[1,2.56,3,3.194,4,0.382,5,0.928,6,0.576,7,0.365,9,0.757,14,0.607,15,1.313,17,1.5,19,1.005,29,1.732,34,0.795,38,1.642,40,1.514,47,1.105,54,1.031,55,1.059,66,1.274,70,1.259,88,1.306,91,1.148,105,3.016,108,1.243,112,1.589,134,1.875,141,3.419,143,0.718,145,1.956,148,1.917,151,1.732,178,3.129,184,1.659,217,4.454,218,2.33,228,1.416,266,1.564,271,3.761,321,1.431,345,1.67,357,2.251,366,2.112,368,2.807,397,3.755,398,2.182,400,0.884,403,2.119,404,1.836,415,1.732,429,4.137,458,2.807,459,2.33,464,2.92,470,2.326,472,2.747,475,2.419,477,5.066,479,4.304,509,2.807,517,4.171,525,2.033,526,2.524,537,1.962,547,1.962,585,2.649,601,1.914,639,5.479,650,3.016,654,2.33,656,1.136,657,1.244,662,4.047,674,2.33,677,2.92,682,2.037,684,2.747,685,2.514,692,4.45,699,1.494,701,1.589,707,2.534,714,1.259,750,1.259,761,1.174,763,1.044,771,1.229,772,1.274,773,1.244,776,1.088,796,3.129,838,2.33,840,1.589,844,3.299,864,2.524,882,2.119,931,1.962,945,1.962,981,2.807,1029,5.446,1071,2.419,1083,2.119,1084,2.649,1092,1.962,1117,1.799,1153,2.251,1178,3.299,1208,3.017,1209,2.649,1211,4.625,1235,1.732,1388,3.906,1404,2.524,1433,2.807,1445,2.649,1464,2.524,1534,2.807,1539,2.807,1560,2.251,1567,2.807,1571,2.33,1609,5.066,1850,2.807,1871,2.33,1907,2.807,2023,2.807,2211,2.524,2219,2.419,2221,3.017,2271,2.524,2304,2.649,2435,8.155,2436,6.057,2443,3.017,2444,6.057,2445,5.769,2826,4.698,2840,3.337,2841,3.337,2842,3.337,2843,3.337,2844,3.337,2845,3.337,2846,3.337,2847,3.337,2848,3.017,2849,3.337,2850,3.337,2851,3.337,2852,3.337,2853,3.337,2854,3.337,2855,3.337,2856,3.337,2857,3.337,2858,3.337,2859,4.125,2860,3.337,2861,3.337,2862,3.337,2863,3.337,2864,3.337,2865,3.337,2866,3.337,2867,3.337,2868,3.337,2869,3.337,2870,3.017,2871,3.337,2872,3.337,2873,3.017,2874,3.337,2875,3.337,2876,2.649,2877,5.196,2878,3.337,2879,3.337,2880,3.337,2881,3.017,2882,4.698,2883,5.196]],["t/459",[0,3.439,4,0.569,5,0.831,7,0.462,9,1.586,14,0.906,21,2.749,34,1.225,40,0.844,43,2.023,50,1.792,53,2.058,54,1.001,55,1.028,76,1.878,81,3.087,84,1.998,101,2.135,103,1.771,113,1.732,124,1.247,143,1.071,147,3.496,149,2.998,151,3.627,183,2.023,184,1.294,206,3.254,221,3.609,225,4.21,255,2.536,261,2.078,267,2.926,281,2.196,283,2.492,295,2.023,316,3.928,319,1.37,320,2.926,323,4.187,327,3.609,342,2.684,347,1.396,358,3.475,377,4.015,392,4.191,400,2.14,402,2.135,407,3.609,408,5.449,409,3.952,415,2.583,429,2.86,584,3.952,588,3.254,595,3.254,601,2.975,613,2.926,647,3.952,652,3.254,656,3.256,657,1.855,660,4.187,682,1.59,709,3.161,763,1.557,768,1.878,806,3.952,887,3.475,929,2.926,933,3.16,970,3.358,975,3.952,1083,3.161,1092,2.926,1117,2.684,1183,2.297,1204,3.952,1379,2.998,1402,3.609,1410,3.254,1510,3.254,1762,4.187,2456,3.765,2637,3.952,2876,5.549,2884,4.978,2885,4.501,2886,4.978,2887,6.32,2888,4.501,2889,7.303,2890,4.501,2891,4.501,2892,4.501,2893,4.501,2894,4.501,2895,4.501,2896,4.501,2897,4.501,2898,4.501,2899,4.501,2900,3.765,2901,4.187,2902,4.501,2903,4.501,2904,6.32,2905,4.501,2906,4.187,2907,4.501,2908,4.501,2909,4.501,2910,4.501,2911,3.952]],["t/461",[34,0.899,50,2.596,53,2.124,76,2.72,81,2.882,101,3.093,103,2.566,124,1.807,147,2.566,149,4.343,206,4.714,392,4.634,408,6.025,415,3.742,584,5.725,588,4.714,595,4.714,601,3.29,647,5.725,656,3.04,657,2.688,682,2.303,768,2.72,887,5.034,1092,4.239,1204,5.725,2876,5.725,2887,6.52,2888,6.52,2889,8.773,2890,6.52,2891,6.52,2892,6.52,2893,6.52,2894,6.52,2895,6.52,2896,6.52,2897,6.52,2898,6.52,2899,6.52,2900,5.454,2901,6.065,2902,6.52,2903,6.52]],["t/463",[34,1.158,53,2.266,81,3.222,113,2.678,147,2.739,151,3.993,183,3.128,184,2.001,221,5.579,225,5.597,255,3.921,261,3.212,295,3.128,408,5.192,409,6.11,429,4.421,656,3.398,709,4.887,975,6.11,1117,4.149,2637,6.11,2876,6.11,2904,6.958,2905,6.958,2906,6.473,2907,6.958,2908,6.958,2909,6.958,2910,6.958]],["t/466",[4,0.865,7,0.526,14,1.016,16,1.325,19,1.464,25,1.582,31,1.301,34,1.07,38,1.765,47,1.21,51,0.867,54,1.083,55,1.113,74,1.109,76,2.107,81,1.802,108,1.306,111,3.733,119,3.607,122,2.571,124,1.896,128,2.464,137,2.206,143,1.201,146,2.787,147,3.669,222,4.296,319,2.645,320,3.283,340,3.011,344,3.651,377,3.208,432,2.953,752,2.107,933,2.185,1059,3.364,1308,5.05,1744,4.224,1754,4.252,1755,4.93,1756,5.61,1898,4.697,2912,5.585,2913,5.585,2914,5.585,2915,5.585,2916,5.585,2917,4.697,2918,7.567,2919,5.585]],["t/468",[4,1.047,19,1.453,21,2.555,34,0.936,47,1.209,51,1.165,74,1.819,102,3.012,108,1.296,137,2.189,146,2.765,147,3.258,159,2.974,184,1.952,219,2.147,319,2.065,829,3.632,933,2.937,1754,4.218,1755,4.312,1756,4.908,1757,5.064,2920,6.787]],["t/470",[4,0.569,5,0.592,6,0.859,7,0.285,19,1.563,34,1.15,40,0.844,47,1.226,51,1.085,72,3.084,74,1.605,103,2.487,108,1.651,143,1.071,145,2.024,146,1.834,147,3.117,165,2.583,184,1.818,219,1.999,240,2.684,264,1.855,298,4.715,326,1.541,337,2.926,341,4.271,397,3.67,400,2.14,525,3.16,607,4.715,655,3.224,656,2.379,657,2.605,707,1.752,742,1.812,927,3.161,928,2.536,929,2.926,933,3.16,1070,3.076,1591,3.726,1592,3.726,1747,3.161,1754,4.539,1757,3.358,2340,4.865,2549,4.438,2565,4.865,2570,4.187,2572,3.475,2921,4.978,2922,4.187,2923,3.952]],["t/472",[4,1.061,5,0.777,7,0.547,9,2.104,14,0.825,16,1.552,21,2.226,22,1.752,29,2.353,36,1.843,40,1.109,46,3.775,47,1.094,51,1.191,53,1.335,54,0.936,55,1.129,56,2.159,57,2.731,58,2.03,59,3.6,60,3.6,61,3.287,74,1.668,81,1.463,82,1.418,83,3.332,94,3.332,97,1.157,101,1.945,102,1.82,103,2.327,106,2.731,120,1.926,141,1.797,147,1.614,162,1.168,194,3.675,223,2.666,224,3.814,225,3.939,226,2.03,228,1.236,237,2.666,239,2.226,240,3.526,258,2.03,259,2.605,266,2.125,282,3.652,296,2.03,326,1.404,336,2.353,337,2.666,340,2.445,341,5.056,343,2.964,357,4.412,360,2.666,429,2.605,518,2.251,525,3.286,556,2.445,602,2.231,637,1.752,652,2.964,654,3.166,656,2.611,688,3.059,754,1.404,787,1.578,795,3.059,884,2.964,890,3.429,928,3.332,933,3.286,944,2.802,959,3.539,996,2.964,1023,3.6,1070,2.802,1108,2.548,1145,2.548,1172,3.287,1291,3.287,1293,2.495,1412,2.802,1676,3.6,1703,3.059,1704,3.059,1743,5.501,1745,5.175,1746,6.091,1747,5.89,1748,4.276,1749,3.6,1750,5.501,1832,2.731,2319,3.6,2320,3.6,2549,2.879,2657,4.1,2658,4.1,2661,3.814,2662,3.814,2900,3.429,2923,3.6,2924,7.488,2925,4.534,2926,4.534,2927,4.534,2928,4.534,2929,4.1,2930,4.534,2931,4.534,2932,3.814]],["t/474",[4,0.869,7,0.435,21,3.38,34,0.947,40,1.289,74,1.51,84,3.05,102,3.701,135,3.05,145,1.905,147,3.282,159,3.011,219,2.173,223,4.468,241,4.271,255,4.699,282,3.618,400,2.014,418,4.617,421,5.306,464,4.271,490,2.532,660,6.392,787,2.644,791,2.937,945,4.468,1501,5.748,1745,5.127,2639,6.392,2933,7.6,2934,7.6,2935,7.6]],["t/476",[0,0.955,1,0.779,4,0.966,5,0.231,7,0.575,12,0.81,16,1.386,17,0.783,19,0.847,21,2.449,22,0.75,26,2.115,28,1.593,29,4.474,30,0.972,31,1.209,34,1.112,38,0.613,40,1.275,44,1.169,47,1.174,51,1.339,54,0.976,55,1.003,66,1.272,72,0.856,74,1.744,75,0.654,76,2.571,82,0.607,91,0.668,94,2.229,96,1.79,97,0.495,101,1.429,108,0.335,109,1.199,111,1.903,120,0.572,128,1.47,135,0.779,136,0.505,140,1.309,141,1.32,143,0.716,145,1.096,147,2.862,148,1.913,150,1.232,152,1.667,157,1.309,159,1.733,165,1.007,170,1.169,173,1.833,183,0.789,184,0.505,186,1.674,222,0.972,226,1.491,231,0.647,237,1.141,238,1.199,239,2.449,240,3.436,241,1.091,255,2.643,262,2.17,267,2.572,269,1.449,281,0.856,282,4.944,283,2.19,288,1.872,295,1.354,319,0.534,320,1.141,321,1.429,326,0.601,372,1.115,392,1.007,394,1.561,397,0.882,400,0.514,407,2.415,415,1.728,418,0.972,421,1.355,427,2.47,484,1.232,493,1.407,518,2.193,547,1.141,583,2.153,589,1.232,590,1.632,601,1.227,618,1.407,623,0.909,650,1.287,652,1.269,655,4.321,656,3.489,657,3.455,659,1.309,668,1.309,682,1.397,691,1.169,699,2.614,709,1.232,795,1.309,807,1.407,837,0.799,839,1.468,848,1.632,890,3.924,928,2.975,929,4.419,933,3.539,959,3.597,970,1.309,1130,1.199,1136,1.541,1201,1.115,1235,1.007,1291,1.407,1292,1.199,1293,4.544,1298,4.233,1339,1.755,1372,1.541,1379,1.169,1410,1.269,1431,1.407,1496,1.309,1560,1.309,1654,1.755,1656,3.622,1667,1.199,1726,1.541,1741,2.801,1747,5.475,1748,4.457,1761,4.076,1762,1.632,1763,1.309,1806,1.468,1832,2.635,1994,1.755,2211,1.468,2319,3.473,2320,2.644,2348,1.468,2561,1.755,2578,1.632,2637,3.473,2640,4.911,2641,6.05,2642,5.734,2643,5.734,2644,4.363,2645,4.363,2646,4.363,2755,1.755,2859,1.541,2922,1.632,2923,2.644,2936,1.941,2937,1.941,2938,3.331,2939,1.941,2940,1.941,2941,1.941,2942,1.941,2943,1.941,2944,1.941,2945,1.941,2946,4.375,2947,1.941,2948,3.331,2949,1.941,2950,1.941,2951,1.941,2952,1.941,2953,1.941,2954,4.375,2955,6.817,2956,1.941,2957,1.941,2958,1.941,2959,1.941,2960,1.941,2961,1.941,2962,1.941,2963,1.941]],["t/479",[4,0.887,21,3.411,47,1.136,74,1.542,76,2.927,103,2.762,143,2.009,147,2.762,282,3.695,583,3.819,652,6.956,659,5.236,1083,4.928,1657,6.527,2707,6.162,2724,7.017,2964,7.761,2965,6.527,2966,7.761,2967,10.021]],["t/481",[4,0.544,7,0.539,12,1.986,14,0.866,17,1.119,19,1.31,21,3.209,34,0.593,47,1.076,74,0.945,84,2.717,85,1.974,103,2.409,108,0.821,143,1.023,147,1.693,148,2.733,151,2.469,184,1.76,219,1.361,225,2.866,226,2.13,228,1.845,266,4.022,299,3.58,326,1.473,328,3.322,400,1.261,402,2.041,405,4.183,492,3.21,538,3.58,547,2.797,653,2.866,657,3.514,678,3.21,682,1.519,689,3.599,698,2.808,763,1.488,787,1.656,806,3.778,829,4.154,866,3.449,928,5.568,981,4.002,1145,2.674,1156,3.449,1205,3.322,1235,2.469,1294,3.804,1391,3.021,1410,3.111,1434,3.599,1496,3.21,1510,4.426,1515,5.612,1583,4.726,1647,3.449,1656,6.332,1760,3.449,2028,4.726,2044,5.375,2208,3.778,2222,6.121,2310,3.778,2519,7.762,2560,3.778,2901,4.002,2917,4.002,2920,6.121,2965,4.002,2968,8.202,2969,4.758,2970,6.77,2971,4.758,2972,4.758,2973,8.585,2974,4.758,2975,4.758,2976,4.758,2977,4.758,2978,4.758,2979,4.758,2980,4.302,2981,4.758,2982,4.758,2983,4.758,2984,4.758,2985,4.758,2986,4.302,2987,4.758,2988,4.758,2989,4.758,2990,4.758,2991,4.758]],["t/483",[4,0.636,7,0.538,16,1.599,21,3.41,32,1.707,38,2.13,40,1.279,47,1.08,51,0.565,74,0.724,81,2.175,82,1.139,84,2.23,85,1.621,96,1.116,97,1.925,103,1.978,108,1.402,128,2.452,134,2.047,136,0.947,143,0.783,147,2.399,149,3.348,159,1.443,178,3.348,183,1.481,204,2.755,206,2.381,219,2.157,222,1.823,231,1.213,234,2.194,239,2.294,240,3.634,244,2.313,251,1.584,255,1.856,261,1.52,269,1.584,326,1.128,347,1.559,377,2.092,394,1.707,429,4.666,442,1.964,495,3.788,525,2.175,537,3.267,586,4.204,612,3.267,652,6.549,654,5.265,655,3.11,656,2.914,657,3.637,659,2.457,670,3.872,675,1.253,682,1.775,688,2.457,699,1.631,763,1.739,795,2.457,807,2.64,829,2.69,837,1.5,853,2.892,928,5.205,933,1.425,956,1.856,1070,3.435,1145,4.238,1195,2.004,1235,1.89,1294,3.123,1325,3.293,1337,6.094,1363,3.293,1367,3.293,1377,4.204,1382,2.457,1501,2.755,1510,3.634,1515,5.597,1522,3.063,1547,3.293,1555,3.063,1656,4.705,1675,3.293,1746,7.069,1752,5.026,1757,3.75,1758,2.64,1806,2.755,1867,3.063,2707,2.892,2780,3.063,2870,3.293,2900,2.755,2922,3.063,2968,6.82,2980,5.026,2992,3.642,2993,3.642,2994,6.74,2995,3.642,2996,8.122,2997,3.642,2998,3.642,2999,6.74,3000,3.642,3001,3.642,3002,5.558,3003,3.642,3004,3.642,3005,3.642,3006,3.642,3007,3.642,3008,3.642,3009,5.558,3010,6.094,3011,5.026,3012,6.74,3013,6.094,3014,3.293,3015,3.642,3016,3.642]],["t/486",[7,0.483,43,3.431,146,3.109,316,4.743,317,6.622,319,2.322,320,4.962,324,5.892,342,4.551,615,4.644,933,3.302,1084,6.701,1763,5.694]],["t/488",[4,0.657,5,0.683,7,0.532,21,2.963,22,2.219,32,2.691,34,0.961,47,1.143,53,1.691,75,1.933,81,1.853,93,2.429,94,2.926,108,0.991,128,2.534,145,1.439,147,2.043,149,4.644,255,2.926,272,3.548,282,3.67,288,3.227,377,3.299,400,1.521,472,3.036,518,1.976,537,3.376,575,3.754,589,4.896,601,2.84,652,3.754,655,2.649,656,3.401,657,3.468,763,1.796,829,4.502,837,2.365,928,4.74,933,2.247,959,3.557,975,4.559,1083,3.646,1292,3.548,1293,4.242,1294,5.228,1377,5.831,1404,4.343,1410,3.754,1425,4.83,1510,6.082,1583,6.495,1740,4.009,1747,3.646,1748,3.754,1757,5.201,1758,5.589,1759,5.831,1760,5.589,1761,4.009,2211,4.343,2456,4.343,2885,5.192,2986,6.971,3017,5.742,3018,4.83]],["t/490",[5,1.061,6,0.789,7,0.511,16,1.084,21,3.165,22,1.766,29,4.972,30,2.287,34,1.222,38,2.663,40,1.72,44,2.751,46,2.248,47,0.953,51,0.709,66,1.744,76,2.48,80,1.538,81,2.719,87,3.508,93,1.933,96,2.361,98,1.474,101,1.959,120,1.936,128,2.016,147,2.741,151,2.37,183,1.857,240,5.014,255,2.328,262,1.319,269,1.987,282,4.012,295,1.857,340,2.463,344,2.987,392,2.37,398,2.987,416,2.901,427,2.175,442,2.463,444,1.857,456,3.627,464,2.567,495,3.695,508,3.189,521,3.842,525,1.787,583,3.79,602,2.248,611,3.618,655,4.119,656,3.338,657,1.703,689,3.455,738,1.626,749,1.744,847,3.627,856,2.37,929,3.865,930,2.37,945,2.686,1070,2.823,1108,2.567,1117,3.545,1201,2.624,1291,3.312,1292,2.823,1298,3.312,1379,2.751,1391,2.901,1392,3.842,1402,3.312,1424,4.131,1510,2.987,1560,5.197,1656,3.189,1748,2.987,1907,3.842,1990,3.627,2137,3.842,2319,5.22,2320,5.22,2348,3.455,2436,3.842,2640,5.53,2641,5.53,2642,5.53,2643,5.53,2644,5.53,2645,5.53,2646,5.53,2818,4.131,2900,3.455,2917,3.842,3019,4.568,3020,4.568,3021,4.568,3022,4.568,3023,4.131,3024,4.568,3025,4.568,3026,4.568,3027,4.568,3028,4.131]],["t/492",[7,0.416,19,1.406,21,3.556,22,2.809,23,5.074,34,1.214,98,2.345,147,2.587,149,5.405,228,1.981,234,4.378,400,1.926,493,5.269,652,4.752,698,2.779,763,2.274,837,2.993,928,4.573,1083,4.615,1210,5.771,1402,5.269,1510,5.867,1515,6.648,1638,6.113,1746,7.125,1753,6.572,1867,7.548,1902,5.074,2037,6.572,2208,5.771,2462,6.572,2707,5.771,3029,7.268,3030,7.268]],["t/494",[6,1.463,7,0.485,19,1.284,21,2.885,32,3.972,34,1.227,47,1.194,48,3.265,51,1.03,84,2.663,93,2.808,108,1.463,145,1.663,147,3.324,165,5.106,184,1.726,266,3.11,288,3.729,327,4.811,337,3.901,341,4.482,397,3.016,444,2.698,498,4.633,601,2.445,643,4.101,655,3.062,656,2.259,657,2.474,787,2.309,929,3.901,1201,3.812,1472,5.269,1591,3.062,1592,3.062,1740,4.633,1741,5.582,1754,3.729,2340,3.997,2565,3.997,2571,5.269,2572,5.918,3031,6.637]],["t/496",[3,3.555,7,0.368,14,1.17,15,1.323,19,1.244,21,2.826,33,2.052,34,0.801,40,1.408,47,1.19,51,0.998,54,0.92,55,0.946,66,2.454,75,2.164,91,2.858,97,2.348,103,2.287,108,1.434,128,2.836,145,1.611,147,3.274,225,3.871,228,1.752,255,3.275,271,4.04,319,1.768,343,5.429,400,1.703,401,4.666,403,4.081,417,5.103,517,4.202,518,2.212,583,3.162,602,3.162,677,3.612,776,2.096,933,3.599,1437,5.602,1591,2.965,1592,2.965,1754,3.612,1996,5.406,2211,4.861,2340,3.871,2565,3.871,3028,5.811]],["t/499",[14,1.602,15,1.45,19,1.703,25,1.995,34,1.097,47,1.225,51,1.094,108,1.657,137,2.054,145,1.765,146,2.595,147,3.132,319,1.938,602,3.466,1591,3.25,1592,3.25,1754,4.946,1755,4.047,1756,4.606,2340,4.243,2565,4.243]],["t/501",[7,0.365,9,1.448,14,1.828,15,1.313,19,1.6,25,1.807,34,1.03,47,1.22,51,0.991,74,1.642,94,3.252,108,1.583,137,1.861,145,1.599,146,2.351,147,2.942,269,2.776,319,1.756,602,3.14,656,2.172,657,2.379,690,3.512,754,1.976,829,3.088,959,2.944,1294,3.586,1583,4.456,1591,2.944,1592,2.944,1745,4.306,1747,4.053,1748,4.173,1754,4.645,1755,3.666,1756,4.173,1757,4.306,1758,4.627,1759,4.827,1760,4.627,1761,4.456,2340,3.844,2565,3.844]],["t/503",[6,1.03,7,0.341,14,1.439,15,1.228,19,1.53,21,2.692,25,1.69,32,2.796,34,1.106,40,1.603,46,2.936,47,1.217,48,2.936,51,0.926,72,2.633,74,1.571,84,3.174,108,1.532,114,4.513,137,1.74,145,1.495,146,2.198,147,3.157,165,4.902,184,1.552,319,1.642,327,4.326,337,3.508,342,3.217,405,3.687,617,4.445,643,3.687,655,2.753,656,2.031,657,2.224,929,3.508,990,2.936,1472,4.737,1591,2.753,1592,2.753,1645,4.737,1742,5.395,1745,4.025,1754,4.445,1755,3.428,1756,3.901,1871,4.165,2571,4.737,2572,5.522,3032,5.967,3033,5.395]],["t/505",[4,0.663,7,0.332,14,1.412,15,1.193,19,1.692,21,2.641,25,1.642,28,3.184,34,0.967,46,2.852,47,1.217,51,0.9,74,1.737,101,2.486,108,1.51,114,4.384,137,1.69,145,1.453,146,2.135,147,3.566,148,3.33,282,2.76,319,1.595,484,3.681,556,3.125,656,2.641,657,2.161,829,2.805,854,3.582,933,3.036,947,4.384,959,4.622,1130,3.582,1293,3.189,1294,3.257,1583,4.047,1591,2.674,1592,2.674,1645,4.602,1745,3.911,1747,3.681,1754,4.36,1755,3.33,1756,3.79,1757,3.911,1758,4.202,1759,4.384,1760,4.202,1761,4.047,2486,4.602,2577,5.241,2578,6.526,3034,5.241]],["t/507",[4,0.798,5,0.829,7,0.527,19,1.561,21,2.375,34,1.091,40,0.842,47,1.22,51,0.771,72,2.19,74,1.386,81,1.602,84,2.799,87,2.631,94,3.554,103,1.767,105,1.919,108,1.591,115,3.246,120,2.054,137,1.448,145,1.748,146,1.829,147,2.87,183,2.836,239,2.375,244,3.152,246,2.129,282,4.55,298,3.349,319,1.366,394,2.326,429,4.007,457,2.072,607,3.349,654,3.466,656,1.69,659,3.349,684,2.625,712,3.068,715,3.599,742,1.808,763,1.553,929,2.918,933,2.73,947,3.755,959,2.29,1117,2.677,1591,3.218,1592,3.218,1659,4.489,1716,3.941,1745,4.706,1747,4.43,1748,5.273,1754,4.532,1755,2.852,1756,3.246,1761,3.466,1902,3.466,1965,3.941,2296,4.489,2923,3.941,2929,4.489,3010,4.489,3011,4.489,3013,7.293,3014,4.489,3023,4.489,3033,4.489,3035,4.964,3036,4.964]],["t/509",[4,0.537,5,0.558,6,1.158,7,0.384,9,1.522,14,1.424,15,1.38,17,1.577,19,1.747,25,2.216,34,1.125,36,1.909,40,0.797,47,1.224,51,0.729,56,2.236,58,2.103,74,1.695,76,1.772,108,1.473,120,1.383,137,1.956,145,1.681,146,2.471,147,3.34,226,2.103,240,2.533,252,2.533,267,2.761,319,1.846,525,1.838,641,4.199,646,3.405,656,2.283,657,2.916,683,2.201,829,3.246,887,3.279,888,4.683,911,3.951,928,2.393,929,2.761,933,1.838,959,3.095,1294,3.769,1583,4.683,1591,3.095,1592,3.61,1743,3.951,1745,4.525,1747,4.259,1754,3.769,1755,3.853,1756,4.385,1757,4.525,1758,4.863,1759,5.073,1760,4.863,1761,4.683,2549,2.983,3034,6.065,3037,4.697,3038,4.697,3039,4.697,3040,4.697]],["t/513",[3,3.503,17,1.737,23,5.156,33,2.358,36,3.002,54,1.057,66,2.82,82,2.31,96,2.264,101,3.168,105,2.854,228,2.47,271,4.286,272,5.601,295,3.002,366,3.002,401,4.15,403,5.755,527,3.942,611,4.064,675,2.542,685,3.574,692,5.601,754,2.287,769,2.514,776,2.408,878,6.678,909,4.342,1515,4.828,2304,5.864,2817,6.678,3041,7.386,3042,7.386,3043,7.386]],["t/515",[3,3.078,34,0.993,41,5.372,81,2.57,96,2.441,97,2.033,222,3.986,271,4.066,321,3.416,372,4.574,401,5.33,404,4.381,408,5.372,495,4.475,517,6.202,518,3.487,522,7.2,1740,5.559,2413,6.322,3044,7.2,3045,7.2]],["t/517",[3,3.783,5,0.778,6,1.129,7,0.374,13,2.179,15,1.346,33,2.089,34,1.291,40,1.11,47,1.08,83,4.279,103,2.328,113,2.276,132,4.947,141,2.592,228,2.289,239,2.859,364,4.277,366,2.659,374,3.114,400,2.225,401,5.213,412,4.567,430,5.194,472,4.441,527,2.845,539,4.441,606,3.94,623,3.935,632,4.154,706,4.567,708,3.09,756,2.302,760,2.156,889,3.676,901,5.194,969,6.668,1156,4.742,1439,4.742,1553,4.567,1653,5.502,2209,5.194,2777,5.915,2881,5.915,3045,5.915,3046,6.542,3047,6.542,3048,6.542,3049,6.542,3050,6.542,3051,6.542,3052,6.542,3053,6.542]],["t/520",[1,3.311,2,6.762,3,4.1,54,1.181,55,1.214,75,2.778,151,4.281,228,2.249,403,5.239,404,4.539,427,3.928,900,5.394,1112,5.239,3054,8.25,3055,8.25]],["t/522",[3,3.804,54,1.214,55,1.247,75,2.855,281,3.741,282,4.037,283,4.244,422,4.765,632,5.384,860,6.732,2518,7.132,3056,8.479]],["t/524",[3,4.065,7,0.499,22,2.681,23,4.844,33,2.215,34,0.865,54,0.993,55,1.021,66,2.649,70,2.617,81,2.239,83,4.442,84,3.499,96,2.126,226,3.106,228,1.891,269,3.018,271,3.499,274,4.287,315,3.669,334,4.539,341,3.669,374,3.303,400,1.838,401,4.899,470,3.903,517,4.536,518,2.388,683,3.251,707,3.519,776,3.109,779,2.556,1083,5.536,1653,5.835,1964,7.883,2212,5.835,2518,5.835,3044,6.273,3057,6.938,3058,6.938,3059,6.938]],["t/528",[22,3.292,31,1.985,64,4.856,789,3.066,2524,7.702,3060,7.88,3061,7.702,3062,8.519,3063,8.519]],["t/530",[5,1.027,7,0.494,17,2.031,102,3.467,143,1.858,235,6.859,575,5.648,3064,6.534,3065,7.811]],["t/533",[5,1.064,7,0.556,22,3.46,28,2.636,29,3.756,37,5.263,47,1.037,71,4.474,99,5.054,105,2.798,111,3.149,143,1.557,273,3.149,281,3.194,372,4.159,454,5.475,718,3.983,762,2.576,837,2.982,983,6.089,1102,6.546,1260,4.36,1280,7.108,1460,5.475,2531,6.546,2770,6.546,2873,8.095,2882,6.546,3060,7.351,3066,6.546,3067,7.24,3068,7.24,3069,6.089,3070,7.24,3071,7.24,3072,7.24,3073,6.546,3074,7.24,3075,7.24]],["t/535",[5,1.063,7,0.512,17,1.426,22,4.146,37,4.7,55,1.399,64,3.934,69,6.047,99,5.582,100,6.348,124,1.52,162,2.06,205,3.337,226,2.715,243,2.935,273,3.478,321,2.602,325,3.337,394,2.842,454,4.587,490,2.02,789,3.22,826,3.965,839,4.587,840,2.887,861,3.147,863,5.797,979,3.408,1029,6.047,1199,4.092,1260,4.816,1544,3.965,1647,4.397,1652,4.397,1976,5.101,2534,5.484,3060,7.943,3061,5.484,3065,5.484,3069,5.101,3073,5.484,3076,6.065,3077,7.996,3078,6.065,3079,7.996,3080,7.996,3081,7.996,3082,8.945,3083,6.065,3084,6.065,3085,6.065,3086,7.996,3087,6.065,3088,6.065,3089,6.065,3090,6.065,3091,6.065]],["t/537",[7,0.56,17,1.976,28,3.565,64,4.134,74,1.669,124,2.105,640,3.876,863,6.091,1179,4.721,3060,6.354,3069,7.066,3092,7.596,3093,8.401]],["t/539",[0,4.231,4,0.983,9,1.951,15,1.769,19,1.664,51,1.335,75,2.895,457,3.589,677,4.832,1101,4.939]],["t/541",[45,4.285,56,4.563,152,4.057,422,5.386,539,5.068,632,5.146,973,7.328,991,8.062,1178,5.146,1179,4.554,1976,6.816,3094,8.104,3095,8.104,3096,8.104,3097,8.104,3098,8.104,3099,8.104,3100,8.104,3101,8.104]],["t/543",[4,0.662,5,0.688,6,0.663,7,0.573,8,2.059,9,0.871,10,1.991,14,0.699,15,1.711,16,0.911,17,1.637,28,2.107,34,0.868,35,2.158,36,3.955,37,4.887,38,1.829,43,1.561,47,1.149,52,5.209,53,2.812,54,1.298,55,1.405,56,3.314,57,3.485,58,3.469,64,1.89,72,3.072,74,1.15,76,3.42,77,2.591,108,0.663,111,1.671,120,1.704,122,1.548,124,1.45,143,1.667,145,1.745,159,1.522,184,0.999,222,1.922,266,1.8,285,2.439,296,3.117,297,2.784,299,2.031,316,4.355,317,2.591,318,2.511,319,1.057,320,2.258,323,3.23,324,2.681,325,2.113,328,2.681,344,2.511,348,3.473,356,2.681,358,4.04,360,4.556,373,1.858,378,2.905,379,3.473,380,3.23,381,3.23,382,3.23,383,3.23,392,3.613,412,2.681,457,1.603,460,2.905,493,2.784,525,1.503,527,3.028,532,3.722,535,2.373,565,3.473,574,1.625,615,2.113,617,2.158,623,1.8,699,1.719,712,2.373,714,1.449,731,3.674,775,2.036,803,3.402,818,4.195,857,2.511,863,2.784,909,3.402,945,2.258,957,3.912,964,1.993,967,3.23,984,3.485,1128,2.313,1650,2.784,1681,5.265,1682,4.376,1683,2.905,1703,3.904,1704,2.591,1763,2.591,1765,2.591,2190,3.473,2191,3.473,2194,5.232,2247,3.473,2499,4.867,2671,3.049,3092,3.473,3102,3.841,3103,3.841,3104,3.841,3105,3.841,3106,3.841,3107,3.841,3108,3.841,3109,5.786,3110,3.841,3111,5.232,3112,3.841,3113,3.841,3114,5.786,3115,3.841,3116,3.841,3117,3.841,3118,3.473]],["t/545",[0,2.843,5,0.687,6,0.998,7,0.443,23,4.034,35,3.247,36,3.953,37,4.551,38,1.826,46,2.843,47,1.109,51,1.202,52,5.016,53,1.702,54,1.109,55,1.285,56,3.686,57,3.48,58,2.587,61,4.189,70,2.18,71,3.571,72,2.55,75,2.607,76,2.18,81,1.865,108,0.998,122,1.545,145,1.94,159,2.29,162,1.489,194,3.247,226,2.587,251,2.513,252,3.116,273,2.513,296,3.466,297,4.189,316,4.351,336,2.998,358,6.096,360,5.133,380,4.86,381,4.86,382,4.86,383,4.86,392,2.998,419,4.37,457,2.412,532,2.587,556,3.116,623,2.708,731,3.669,758,2.694,803,3.397,984,3.48,996,3.778,1108,3.247,1136,6.147,1200,4.37,1667,3.571,1680,4.37,1681,4.37,1682,4.37,1683,4.37,1703,3.898,1704,3.898,2703,4.588,2785,4.86,2911,4.588,3118,5.225,3119,5.779,3120,5.779,3121,5.779,3122,5.779,3123,5.225,3124,5.225,3125,5.225,3126,5.225,3127,5.779,3128,5.779,3129,5.779,3130,5.779,3131,5.779]],["t/547",[4,0.988,28,3.146,54,1.237,55,1.271,64,4.251,75,2.909,351,3.812,1513,7.811,3132,8.639]],["t/549",[0,2.017,3,1.584,4,0.469,5,0.487,6,1.049,7,0.53,8,2.575,9,1.642,10,2.491,14,1.555,15,1.647,17,1.702,18,2.679,19,1.175,28,2.914,34,1.186,37,5.713,46,2.017,47,1.181,51,0.943,54,0.587,55,1.363,61,2.971,64,2.989,69,6.463,70,2.291,72,1.808,75,1.38,81,1.322,93,1.734,108,1.049,114,3.1,122,1.625,124,1.027,126,3.275,137,1.195,139,2.319,143,1.838,145,1.027,183,1.666,185,5.109,189,2.679,194,2.303,196,3.254,197,3.254,208,1.92,236,4.403,243,1.983,261,3.021,266,2.846,296,2.719,297,2.971,298,4.098,316,2.303,319,1.671,373,1.983,392,2.127,396,1.951,422,2.303,472,2.167,492,2.765,533,2.719,575,2.679,615,2.255,693,2.533,756,1.442,763,1.282,789,2.881,801,3.254,959,1.891,984,2.468,990,2.989,1027,2.861,1031,3.706,1032,2.765,1070,2.533,1087,2.971,1114,3.1,1178,2.602,1183,1.891,1260,4.82,1292,2.533,1463,3.447,1844,3.254,1961,3.447,1995,3.447,2703,3.254,2709,3.706,2710,4.822,2711,3.447,2712,3.447,2713,3.706,3064,3.1,3066,3.706,3124,3.706,3125,3.706,3133,4.098,3134,4.098,3135,4.098,3136,6.074,3137,4.098,3138,4.098,3139,4.098,3140,4.098,3141,4.098,3142,4.098,3143,4.098,3144,4.098,3145,4.098,3146,4.098,3147,4.098,3148,4.098,3149,4.098,3150,4.098,3151,8.003,3152,6.074,3153,3.706,3154,4.098,3155,4.098,3156,4.098,3157,4.822,3158,4.098,3159,4.098,3160,4.098,3161,4.098,3162,4.098,3163,4.098,3164,4.098]],["t/551",[5,0.994,17,1.967,32,3.919,64,4.115,75,2.816,81,2.699,93,3.538,273,3.638,365,5.838,402,3.587,1260,5.037,1983,7.562,3060,7.384,3165,8.363,3166,8.363]],["t/553",[7,0.393,15,1.412,28,2.498,34,0.855,36,3.855,37,4.033,40,1.164,45,3.627,46,3.375,48,3.375,52,3.941,54,1.426,55,1.465,76,2.588,82,2.708,87,2.588,90,2.651,135,2.753,162,1.767,183,2.789,194,3.855,243,3.319,252,3.699,287,4.239,291,6.203,296,3.071,297,4.973,347,1.924,364,4.485,527,3.765,528,4.763,532,3.071,540,2.441,612,4.033,615,4.763,650,2.651,731,4.356,758,3.012,803,5.089,909,4.033,930,3.56,1195,3.775,1235,3.56,1571,4.789,1677,4.239,1929,5.66,2703,5.446,2785,7.281]],["t/555",[8,2.597,10,2.511,33,2.873,34,0.91,36,2.966,47,0.96,51,1.133,52,5.168,53,2.149,54,1.397,55,1.498,56,3.474,57,4.395,58,3.267,72,3.22,108,1.26,159,2.891,162,1.88,296,3.267,336,3.786,360,4.29,392,3.786,556,3.935,623,4.215,707,2.568,891,4.395,996,4.771,1108,4.101,1382,4.923,1553,5.094,1680,5.519,1681,5.519,1682,5.519,1683,5.519,1703,4.923,1704,4.923,2271,5.519,2500,5.094,3126,6.598]],["t/557",[4,0.604,5,1.096,6,1.116,7,0.539,9,1.197,14,0.62,16,0.808,29,1.767,33,3.152,36,3.534,40,1.565,43,2.627,46,3.582,47,0.841,52,5.512,54,1.349,55,1.387,58,3.731,59,2.704,60,2.704,61,2.469,62,3.079,64,2.597,70,1.991,75,1.147,78,2.051,79,2.554,81,1.703,84,1.366,87,3.143,88,2.848,90,2.498,93,2.233,97,0.869,98,1.703,101,1.461,102,3.344,105,1.316,112,1.621,122,1.728,124,1.62,128,1.502,135,2.118,136,1.893,141,1.349,143,1.39,145,1.323,162,0.877,183,3.202,202,2.971,215,1.676,223,3.103,237,2.002,248,1.767,258,2.893,269,1.481,273,1.481,283,1.705,285,3.352,286,1.3,294,1.956,296,1.525,319,2.003,321,3.123,336,2.739,347,0.955,351,2.329,357,3.561,385,1.481,397,2.398,418,1.705,432,2.791,444,3.388,525,3.082,527,2.296,540,2.3,564,3.352,574,2.734,588,2.226,589,2.162,595,2.226,602,2.597,637,1.316,650,1.316,656,1.159,665,1.705,683,1.596,693,2.104,707,1.857,714,1.284,746,1.212,751,1.212,760,1.739,836,3.079,840,3.077,861,3.353,894,2.469,930,3.777,931,2.002,944,2.104,983,2.864,990,1.676,1071,2.469,1115,2.864,1116,1.914,1119,3.352,1120,4.19,1122,2.575,1128,3.179,1326,3.079,1390,2.704,1425,2.864,1482,4.385,1496,3.561,1559,2.575,1668,3.826,1677,5.372,1832,2.051,2066,2.864,2068,2.864,2074,3.079,2075,3.079,2259,3.079,2289,4.19,2500,5.499,2556,4.439,3167,3.405,3168,3.405,3169,3.405,3170,3.405,3171,3.405,3172,3.405,3173,3.405,3174,3.405,3175,3.405,3176,3.405,3177,3.405,3178,3.405,3179,3.405,3180,3.405,3181,3.405,3182,3.405,3183,3.405,3184,3.405,3185,3.405,3186,3.405]],["t/559",[4,0.544,5,1.153,6,0.821,7,0.451,15,0.979,19,0.921,21,2.304,33,3.01,34,0.982,36,3.687,39,2.94,40,0.807,43,2.752,46,2.341,47,1.152,51,0.739,52,5.876,54,0.681,55,0.7,58,4.061,66,1.817,78,2.866,84,1.909,87,1.795,90,1.839,91,1.637,94,2.424,97,2.012,102,3.892,103,1.693,105,1.839,108,0.821,115,3.111,126,2.565,128,2.099,135,1.909,136,2.359,145,1.697,147,3.64,151,2.469,159,1.885,162,1.744,183,1.934,192,2.565,239,1.62,240,2.565,246,2.041,248,2.469,267,2.797,281,2.099,282,2.265,295,2.752,319,1.309,415,2.469,418,3.945,525,3.688,537,2.797,623,2.229,656,1.62,699,2.13,767,1.602,787,1.656,835,3.449,840,2.265,861,2.469,930,2.469,944,2.94,990,2.341,1122,3.599,1153,3.21,1293,2.618,1379,2.866,1390,3.778,1591,2.195,1592,2.195,1677,2.94,1744,3.599,1748,3.111,1749,3.778,1751,4.002,1755,3.889,1763,3.21,2116,4.002,2315,4.002,2456,3.599,2500,6.332,2593,5.694,2924,4.002,2932,4.002,3187,4.758,3188,4.302,3189,4.302,3190,4.302,3191,4.302,3192,4.302]],["t/561",[5,0.854,7,0.51,21,2.445,33,2.294,36,2.92,39,4.439,47,1.111,52,5.118,58,3.216,84,2.882,91,2.472,94,3.66,102,2.882,105,2.776,135,2.882,136,1.868,147,3.604,151,3.727,159,2.846,239,2.445,240,3.873,282,3.419,295,3.622,415,3.727,418,3.595,525,2.81,623,3.366,656,2.445,787,2.499,835,5.207,1153,4.846,1293,3.952,1379,4.326,1744,5.432,1748,4.696,1749,5.703,1755,5.118,1763,4.846,2500,5.014,2924,6.041,3188,6.495]],["t/563",[5,1.127,15,1.24,19,1.166,33,3.149,34,0.751,36,3.855,43,2.449,46,2.965,47,1.16,51,0.935,52,6.025,58,4.246,78,3.629,87,2.273,97,2.032,102,4.065,103,2.144,108,1.04,115,3.939,126,3.249,128,2.659,136,2.466,145,1.51,147,2.833,162,1.552,183,2.449,192,3.249,246,2.584,248,3.126,418,3.016,525,3.859,537,3.542,767,2.029,840,2.868,930,3.126,944,3.723,990,2.965,1122,4.557,1390,4.784,1591,2.78,1592,2.78,1677,3.723,1751,5.068,2116,5.068,2315,5.068,2500,6.621,2593,6.696,2932,5.068,3189,5.448,3190,5.448,3191,5.448,3192,5.448]],["t/565",[0,2.116,4,0.72,5,0.511,6,1.086,7,0.563,10,1.48,22,1.662,33,2.908,36,3.543,40,1.067,43,3.026,47,0.794,48,4.842,51,0.977,52,5.541,53,1.266,54,1.248,55,1.282,58,3.903,70,1.622,76,1.622,79,2.081,80,1.448,81,1.388,85,1.835,87,2.374,88,2.462,90,1.662,102,2.987,108,0.742,112,2.047,119,2.649,122,2.331,135,1.726,136,2.267,143,1.762,162,1.621,194,4.182,205,2.366,215,2.116,216,2.047,226,1.925,243,2.081,252,2.319,258,4.318,281,1.897,283,3.15,319,2.254,325,2.366,347,1.206,396,2.047,402,1.844,525,3.205,527,3.237,623,2.015,632,2.731,650,1.662,670,2.47,685,2.081,702,3.79,703,3.328,704,3.414,705,3.118,706,4.393,707,2.214,708,2.479,709,3.996,710,3.888,711,3.888,712,2.657,714,2.807,715,3.118,716,4.393,728,3.888,729,3.888,730,3.888,731,2.731,732,3.002,733,2.274,734,3.888,735,3.888,746,1.53,752,1.622,786,4.246,840,2.047,884,2.811,894,3.118,909,2.528,1071,5.396,1115,3.617,1116,2.417,1122,3.252,1133,3.888,1134,3.888,1135,3.888,1136,3.414,1137,3.888,1138,3.888,1139,3.252,1140,3.617,1141,3.888,1142,3.888,1143,3.617,1145,2.417,1696,3.617,1961,3.617,2500,5.196,2661,3.617,2662,3.617,3193,4.3,3194,4.3,3195,4.3,3196,4.3,3197,4.3,3198,4.3,3199,4.3,3200,4.3,3201,4.3,3202,4.3]],["t/567",[0,3.375,4,0.99,5,0.815,6,1.184,15,1.412,28,3.152,33,2.191,36,3.519,37,4.033,40,1.164,52,3.941,54,1.358,55,1.274,70,2.588,75,2.915,76,3.265,82,2.146,90,2.651,106,4.132,143,1.862,145,1.719,252,3.699,271,2.753,286,2.619,347,2.428,366,2.789,373,3.319,400,1.818,527,2.984,532,3.071,538,4.577,540,2.441,640,3.994,682,2.191,702,4.132,746,2.441,764,3.046,769,2.335,818,4.973,861,3.56,984,4.132,1071,4.973,1119,4.356,1120,5.446,1139,5.188,1258,4.628,2654,6.203,3203,6.86,3204,6.86,3205,6.203,3206,6.86]],["t/569",[1,2.753,2,4.789,4,1.085,5,0.815,6,1.184,7,0.393,15,1.412,29,3.56,36,2.789,40,1.468,43,3.519,51,1.344,54,0.982,55,1.009,64,4.259,75,2.915,79,4.189,81,2.793,83,3.495,92,4.973,104,6.203,143,1.475,145,1.719,147,2.441,152,3.434,198,4.789,234,4.132,251,2.984,267,4.033,288,3.855,316,3.855,317,4.628,324,4.789,328,4.789,343,4.485,347,1.924,351,3.027,358,4.789,402,2.942,427,3.266,460,5.188,552,5.188,615,3.775,669,6.547,682,2.191,763,2.146,1427,5.77,1763,4.628,2456,5.188,2576,5.446,2633,6.203,3207,6.203,3208,6.86,3209,5.446]],["t/571",[7,0.47,28,2.99,33,2.623,43,3.339,53,2.845,124,2.058,228,2.238,859,4.828,974,7.426,984,4.947,1765,5.541,2251,6.211,3210,8.213,3211,8.213,3212,8.213,3213,8.213,3214,8.213,3215,8.213,3216,8.213]],["t/573",[14,1.383,15,1.898,28,2.767,33,2.945,53,2.716,54,1.321,55,1.357,64,3.739,70,2.867,134,4.271,162,1.958,239,2.587,476,6.392,525,2.974,707,2.674,768,2.867,1553,5.306,1844,6.034,2276,6.872,3217,7.6,3218,7.6,3219,7.6,3220,7.6,3221,8.34,3222,7.6,3223,7.6,3224,7.6,3225,7.6,3226,7.6,3227,7.6,3228,7.6,3229,7.6]],["t/575",[15,1.604,28,3.41,53,3.067,54,1.437,55,1.147,70,3.532,97,2.39,124,2.516,351,3.439,364,5.095,640,3.596,707,2.742,859,4.582,1530,6.555,1625,5.894,3221,8.467,3230,10.039,3231,7.794,3232,7.794]],["t/577",[53,2.544,54,1.237,55,1.271,143,1.858,347,2.423,374,4.113,1101,4.963,2251,6.534,3233,7.811]],["t/579",[5,1.133,7,0.546,17,1.889,33,2.565,38,2.539,53,2.366,66,3.067,91,2.764,105,3.104,229,5.824,315,4.247,418,4.773,427,3.824,443,7.263,707,2.827,758,2.795,892,4.247,1101,5.477,2576,6.378,2718,7.263,3207,7.263]],["t/581",[5,0.952,7,0.348,17,2.107,22,2.352,28,2.216,31,1.418,34,0.759,38,1.923,39,3.76,40,1.032,53,2.36,74,1.209,90,2.352,112,2.897,124,1.525,141,2.411,186,3.192,198,4.248,202,2.295,266,2.851,286,2.323,296,2.724,319,2.62,320,3.577,334,2.897,373,2.945,400,2.123,402,3.437,415,3.158,416,5.088,529,3.76,532,3.587,533,2.724,554,3.979,574,4.028,581,5.118,583,3.943,584,4.832,591,5.502,651,3.979,665,5.261,682,2.861,707,2.141,714,3.023,775,2.141,826,3.979,841,4.248,892,3.218,962,4.248,1481,3.577,1482,3.665,1535,4.248,1578,4.412,1923,3.577,2331,4.832,2650,5.502,2746,5.502,2780,5.118,3234,6.086,3235,6.086,3236,6.086,3237,6.086,3238,6.086,3239,6.086,3240,6.086,3241,6.086,3242,5.502,3243,5.502,3244,6.086]],["t/584",[5,0.974,7,0.426,14,1.586,15,0.885,16,1.02,17,1.011,19,1.687,22,1.662,29,2.231,31,1.734,33,2.616,34,1.021,47,1.211,51,0.977,65,5.973,79,2.081,124,1.865,137,1.254,141,2.493,143,0.925,146,1.584,183,2.558,186,2.643,202,2.807,219,1.23,262,1.817,292,3.414,296,1.925,315,3.935,331,3.463,340,4.013,373,2.081,400,1.139,427,2.996,525,2.462,528,2.366,532,2.817,623,2.015,640,2.903,665,4.363,682,2.01,683,2.015,707,2.882,751,2.649,767,2.758,826,2.811,856,2.231,891,2.59,892,2.274,933,2.462,937,3.414,1076,2.811,1145,2.417,1260,2.59,1923,5.53,2043,2.901,2720,3.414,2725,5.69,2729,3.888,2762,3.118,3123,3.888,3243,3.888,3245,4.3,3246,6.293,3247,4.3,3248,6.293,3249,4.3,3250,6.293,3251,5.196,3252,4.3,3253,4.3,3254,4.3,3255,4.3,3256,4.3,3257,6.889,3258,7.443,3259,6.26,3260,4.3,3261,4.3,3262,4.3,3263,4.3,3264,4.3,3265,4.3,3266,4.3,3267,4.3,3268,4.3,3269,4.3,3270,6.73,3271,3.002,3272,4.3]],["t/586",[5,1.067,7,0.349,14,1.802,17,1.436,19,1.554,31,1.871,33,1.95,38,2.538,43,2.482,47,1.184,65,3.877,72,2.694,74,1.213,90,2.36,95,3.589,108,1.054,124,1.53,165,3.168,184,2.088,186,1.97,237,3.589,261,2.548,286,2.331,289,5.521,319,1.68,320,3.589,331,4.419,394,2.861,540,2.173,554,3.992,588,5.25,665,3.056,684,3.228,707,2.148,767,3.022,831,4.426,856,3.168,1201,3.507,2043,4.119,2719,5.867,2751,4.848,2764,5.135,3251,4.263,3257,7.548,3273,5.606,3274,6.106,3275,6.106,3276,6.506,3277,6.106,3278,8.031,3279,4.848,3280,6.106,3281,6.106,3282,8.031,3283,6.106,3284,6.106,3285,6.106,3286,6.106,3287,6.106]],["t/588",[5,0.96,9,1.586,14,1.594,17,1.171,19,1.695,31,1.16,33,1.59,34,0.621,38,1.573,47,1.22,65,3.161,70,1.878,74,1.74,91,1.713,108,0.859,145,1.247,159,2.769,167,4.501,202,1.878,246,2.135,259,5.3,292,3.952,477,3.952,518,1.713,525,2.735,588,3.254,623,2.332,685,2.409,707,2.459,767,1.676,772,2.668,775,1.752,971,6.254,990,2.449,1179,2.797,1260,4.21,1294,2.797,1626,5.286,2043,3.358,2719,3.254,2735,5.286,2859,3.952,3257,4.187,3259,7.76,3270,7.303,3271,4.879,3273,6.441,3288,4.978,3289,4.978,3290,6.989,3291,4.978,3292,4.978,3293,4.978,3294,4.978,3295,6.989,3296,4.978,3297,6.989,3298,4.978,3299,4.978,3300,4.978,3301,4.978,3302,4.501,3303,4.978,3304,4.978,3305,4.978,3306,6.989,3307,4.501,3308,3.952,3309,4.978,3310,4.978,3311,4.978]],["t/590",[5,0.702,6,1.02,7,0.45,33,1.887,34,1.101,47,1.206,65,3.752,74,1.174,145,1.481,173,4.324,186,2.536,319,2.162,432,4.155,473,4.125,509,4.97,583,4.344,640,2.726,651,3.863,656,2.011,657,2.202,682,2.82,683,2.769,712,3.651,767,2.973,769,2.011,1183,2.726,1260,3.559,1650,4.284,1923,4.62,2572,4.125,2719,3.863,2762,6.401,2764,4.97,2965,4.97,3251,4.125,3259,6.61,3271,4.125,3273,4.125,3276,4.284,3279,4.691,3312,7.106,3313,7.859,3314,4.469,3315,7.859,3316,7.859,3317,5.343,3318,7.859,3319,5.909,3320,5.909,3321,7.859,3322,7.859,3323,7.859,3324,7.859,3325,5.909,3326,5.909,3327,5.909]],["t/592",[1,2.659,13,1.18,18,4.332,28,1.29,31,0.826,34,0.678,47,1.222,65,4.208,74,1.477,105,1.369,111,2.367,122,2.265,124,1.364,165,1.839,184,1.933,186,1.756,202,3.194,205,2.995,208,2.094,219,1.013,262,2.445,268,5.912,269,1.541,292,7.564,295,2.694,315,3.931,319,0.975,331,2.995,334,3.155,385,2.367,394,1.66,396,3.155,473,2.474,525,1.387,563,2.98,581,2.98,583,4.478,598,2.474,611,2.995,612,2.083,665,2.724,707,2.823,767,2.701,775,1.247,844,2.25,883,2.813,933,2.909,1076,3.558,1145,1.991,1260,3.278,1667,2.19,2719,4.332,2732,5.992,2735,5.012,2737,3.204,2747,3.204,2757,3.204,2760,5.261,2834,4.321,2859,5.903,3157,4.321,3242,3.204,3251,4.626,3271,5.601,3273,5.19,3276,4.804,3308,4.321,3312,3.204,3314,5.012,3328,3.544,3329,3.544,3330,3.544,3331,3.544,3332,3.544,3333,3.544,3334,6.627,3335,5.443,3336,5.443,3337,3.544,3338,5.443,3339,3.544,3340,3.544,3341,3.544,3342,3.544,3343,3.544,3344,3.544,3345,7.123,3346,3.544,3347,3.544,3348,3.544,3349,5.443,3350,5.443,3351,4.578,3352,3.544,3353,3.544,3354,3.204,3355,2.98,3356,2.98,3357,2.98]],["t/594",[1,2.22,5,1.056,6,0.955,7,0.384,17,1.579,34,0.937,38,1.144,40,1.374,45,1.914,47,1.191,53,2.214,54,0.518,55,0.533,65,2.299,66,1.382,74,0.719,75,1.219,81,1.168,87,1.366,91,1.904,95,2.128,141,1.435,146,1.334,149,2.181,173,1.992,186,1.168,202,1.366,205,1.992,231,1.206,261,1.511,263,2.299,268,2.528,295,1.472,315,3.976,334,2.634,352,4.868,366,1.472,373,3.249,390,2.128,397,3.051,400,2.651,402,2.373,411,3.274,428,3.045,444,1.472,470,1.621,473,2.528,508,2.528,528,1.992,540,1.969,551,3.274,554,2.367,556,1.952,583,4.372,601,2.77,606,2.181,610,3.733,612,2.128,613,2.128,639,2.299,640,1.67,650,2.138,651,2.367,653,2.181,665,4.878,682,2.926,683,1.696,684,1.914,685,2.677,691,2.181,693,2.237,699,1.621,707,1.274,712,3.419,767,1.863,803,4.42,826,6.371,834,3.045,903,2.875,967,4.654,1027,3.863,1145,2.035,1183,1.67,1195,1.992,1211,2.625,1222,2.443,1388,2.77,1391,2.299,1410,3.617,1578,4.868,1639,3.274,2219,2.625,2244,3.274,2331,2.875,2460,3.274,2671,2.875,2719,2.367,2720,2.875,2735,2.738,2760,2.875,2762,4.011,2834,2.875,3018,3.045,3157,2.875,3251,2.528,3271,5.655,3273,4.688,3276,5.451,3279,2.875,3308,2.875,3314,2.738,3345,4.654,3351,4.654,3355,3.045,3356,3.045,3357,3.045,3358,3.621,3359,3.621,3360,3.621,3361,5.003,3362,5.533,3363,6.072,3364,3.621,3365,3.621,3366,5.533,3367,5.533,3368,5.533,3369,3.621,3370,3.274,3371,3.274,3372,3.621,3373,3.621,3374,3.621,3375,3.621,3376,3.621,3377,3.621,3378,3.621,3379,3.621,3380,3.621,3381,6.716,3382,3.621,3383,3.621]],["t/597",[5,0.896,17,1.772,40,0.942,47,1.213,53,1.635,65,3.525,70,2.094,74,1.103,102,2.227,105,2.145,141,2.199,143,1.621,145,1.391,146,2.045,184,1.443,202,2.094,205,3.054,237,3.263,265,3.43,267,3.263,268,3.875,295,3.477,315,3.984,330,5.019,334,3.587,347,1.557,400,2.267,402,2.381,432,2.935,583,3.708,651,3.629,682,3.063,691,3.343,692,3.43,707,1.953,767,2.537,841,3.875,844,3.525,943,3.875,1387,6.338,1403,3.745,1435,4.669,1674,4.407,2043,3.745,2719,3.629,2735,4.198,2751,5.983,2760,4.407,2762,4.024,2834,4.407,3157,4.407,3251,3.875,3271,5.261,3273,3.875,3276,4.024,3279,4.407,3308,4.407,3314,4.198,3345,6.338,3351,6.338,3354,5.019,3355,4.669,3356,4.669,3357,6.338,3370,5.019,3371,5.019,3384,7.535,3385,5.551,3386,5.551,3387,5.551,3388,5.551]],["t/599",[1,2.056,4,0.375,5,1.19,6,1.231,7,0.469,14,0.596,15,0.674,17,1.677,19,0.634,32,2.4,34,0.965,40,1.772,41,2.211,45,1.733,46,2.521,47,1.149,53,2.524,65,4.005,66,1.251,74,1.253,75,2.124,87,1.932,91,1.128,94,1.67,99,2.288,102,1.315,124,0.821,135,1.315,140,2.211,141,2.03,143,0.705,205,1.803,220,2.143,223,1.927,231,1.092,251,1.426,269,1.426,278,2.081,281,1.446,283,3.157,315,4.091,326,2.208,345,2.564,351,1.446,357,2.211,400,2.558,442,1.767,444,2.083,459,3.577,498,2.288,527,1.426,528,1.803,529,2.025,535,3.166,539,1.733,547,1.927,553,5.393,554,5.059,574,1.387,583,3.509,585,2.602,588,2.143,601,2.323,606,5.616,612,1.927,650,1.267,651,2.143,653,3.086,661,2.602,665,1.641,682,2.911,683,3.341,685,3.451,691,3.086,698,1.015,702,1.974,707,2.723,709,2.081,712,2.025,751,1.823,767,1.104,803,3.708,826,4.123,837,1.35,841,3.577,851,2.479,903,2.602,930,2.658,943,2.288,956,2.61,970,2.211,1060,2.963,1108,1.842,1177,2.376,1201,1.883,1211,2.376,1220,4.811,1321,3.349,1338,2.211,1377,3.875,1379,1.974,1388,2.564,1396,2.963,1412,3.897,1416,4.77,1435,2.757,1486,2.376,1497,2.602,1510,2.143,1652,2.376,1667,2.025,1723,2.602,1755,2.943,2043,2.211,2219,5.61,2243,2.757,2348,2.479,2639,2.757,2719,4.662,2751,4.067,2762,5.17,2848,2.963,3018,2.757,3251,4.403,3271,3.577,3273,3.577,3276,3.714,3307,5.703,3314,2.479,3317,2.963,3361,4.632,3363,2.963,3389,5.123,3390,3.277,3391,3.277,3392,3.277,3393,3.277,3394,3.277,3395,3.277,3396,3.277,3397,3.277,3398,3.277,3399,2.963,3400,3.277,3401,5.123,3402,3.277,3403,5.123,3404,5.123,3405,6.307,3406,3.277,3407,3.277,3408,3.277,3409,3.277]],["t/602",[1,2.964,31,1.721,54,1.057,55,1.087,66,3.46,76,3.419,79,3.574,95,4.342,98,2.383,102,2.964,135,3.637,288,4.15,372,4.243,395,6.685,396,4.668,399,4.983,402,3.168,617,5.093,632,4.69,718,4.064,758,2.57,837,3.042,851,5.586,928,4.618,971,4.828,1344,5.586,1379,4.448,1391,4.69,1544,4.828,3209,5.864,3410,7.386,3411,6.212,3412,6.678,3413,7.386,3414,6.212]],["t/604",[0,3.59,15,1.851,28,2.657,31,1.701,33,2.873,37,4.29,54,1.045,55,1.074,66,2.786,73,5.519,82,2.283,84,2.928,108,1.26,321,4.184,325,4.015,347,2.047,351,3.22,390,4.29,391,6.598,392,5.283,393,8.819,394,3.419,395,4.771,396,3.474,398,4.771,399,6.07,463,6.138,617,4.101,692,4.509,708,2.431,1344,5.519,1426,8.204,1544,4.771,2473,6.598,3415,7.297,3416,7.297]],["t/606",[4,0.965,66,3.222,135,3.387,395,6.417,396,4.018,397,3.835,632,5.359,718,4.644,928,4.3,971,5.518,1344,6.383,1382,5.694,3209,6.701]],["t/608",[1,2.952,7,0.421,12,3.07,35,4.134,36,3.979,54,1.053,55,1.082,64,3.619,76,2.775,79,3.559,98,2.374,135,3.628,235,5.84,236,6.554,252,5.278,336,3.817,347,2.063,395,5.911,396,4.304,399,4.962,418,3.682,422,4.134,432,4.781,617,4.134,668,4.962,718,4.047,928,4.606,1087,5.333,1139,5.563,1202,7.096,1780,5.563,2710,5.84,3411,6.187,3417,7.356]],["t/610",[1,2.917,7,0.416,31,1.694,47,0.958,54,1.041,55,1.069,135,2.917,228,1.981,395,4.752,396,4.973,397,4.424,399,4.903,418,3.638,632,4.615,640,3.353,677,4.084,684,4.745,707,3.158,837,2.993,928,3.703,971,6.366,1112,4.615,1344,6.788,1391,5.699,1568,7.548,2212,6.113,3411,6.113,3412,6.572,3418,6.572,3419,8.115,3420,5.771,3421,7.268,3422,7.268,3423,7.268]],["t/612",[7,0.452,74,1.568,85,2.302,236,6.841,334,3.758,442,4.257,575,5.161,683,4.422,892,4.99,928,4.022,1087,5.723,1202,5.723,1206,7.138,1422,6.64,1519,6.268,2710,6.268,2711,6.64,2712,6.64,3064,7.634,3420,6.268,3424,6.64,3425,7.937,3426,7.895]],["t/614",[1,2.849,7,0.506,36,3.595,45,3.754,56,4.587,66,2.71,85,2.07,238,4.387,326,2.198,334,3.38,351,3.132,396,4.211,397,3.226,575,6.299,612,4.173,707,2.498,851,5.369,928,5.138,971,4.641,1076,4.641,1087,7.669,1179,3.989,1202,6.412,1519,5.636,1568,5.971,2576,5.636,3064,5.369,3233,6.419,3418,6.419,3419,6.419,3420,7.022,3424,5.971,3425,7.439,3427,5.971,3428,8.845,3429,7.099]],["t/616",[0,3.129,1,2.552,5,0.756,7,0.364,17,1.496,28,3.526,32,2.98,36,3.353,47,0.679,54,1.181,55,1.213,56,3.028,76,3.453,85,2.405,108,1.098,159,2.52,205,3.499,226,2.847,235,5.05,236,4.611,262,1.837,271,2.552,278,4.039,334,3.028,373,3.078,374,3.028,396,5.051,397,2.89,402,2.728,442,3.429,527,2.766,533,2.847,537,3.739,575,4.158,673,5.349,681,5.05,705,4.611,707,2.238,746,2.263,754,1.969,866,4.611,1098,4.81,1143,5.349,1202,5.979,1347,5.349,1403,4.291,1519,5.05,1525,5.05,1559,4.81,1652,4.611,1667,3.93,2631,5.751,2783,5.751,3064,6.238,3111,5.751,3420,5.05,3424,5.349,3427,5.349,3430,6.36,3431,6.36,3432,6.36,3433,6.36,3434,6.36,3435,6.36,3436,6.36,3437,6.36,3438,6.36]],["t/618",[12,2.79,19,1.294,31,2.184,34,0.833,66,2.552,76,2.522,81,2.157,82,2.091,103,3.031,128,2.95,135,3.761,145,1.675,226,2.993,228,1.822,335,4.245,395,7.13,396,4.851,397,4.258,399,4.51,472,4.955,537,3.93,539,3.535,617,3.757,623,3.132,632,5.408,683,3.132,718,3.678,754,2.637,928,4.775,970,4.51,971,5.567,1092,3.93,1391,4.245,1902,4.667,2736,6.044,3209,5.307,3414,5.623,3439,6.685,3440,6.685,3441,6.685,3442,6.685,3443,6.685,3444,6.685,3445,6.685]],["t/621",[4,0.841,5,0.874,6,1.561,7,0.517,14,1.339,17,2.126,19,1.423,31,1.714,34,0.917,45,3.889,48,3.619,83,5.202,91,2.531,106,4.43,120,3.087,144,2.648,321,3.155,335,4.671,340,3.966,372,4.226,392,4.691,405,5.587,464,4.134,490,2.45,495,4.134,500,6.187,640,3.394,674,5.135,738,3.217,3446,5.563,3447,6.651,3448,7.356,3449,6.651]],["t/623",[4,0.957,5,1.124,7,0.419,8,1.895,9,1.208,10,1.833,14,1.524,15,1.096,19,1.03,25,1.508,31,1.241,34,1.124,47,1.173,48,4.437,53,1.568,54,1.049,55,1.078,58,2.384,74,1.058,81,2.363,82,1.666,83,4.817,85,1.553,103,2.979,108,1.632,116,4.815,120,3.113,122,1.959,136,1.385,137,1.553,202,2.763,208,1.683,215,3.604,231,1.774,246,3.142,258,2.384,272,4.526,351,2.35,361,3.481,405,3.291,525,3.699,527,2.316,537,4.306,699,2.384,716,5.113,754,1.649,781,5.113,782,5.113,783,5.113,784,5.113,785,5.113,786,4.941,1431,3.86,1584,4.228,1667,4.526,1821,4.479,2556,4.479,3446,4.027,3449,6.623,3450,5.325,3451,4.815,3452,4.815,3453,5.325,3454,4.815,3455,5.325,3456,5.325,3457,5.325]],["t/625",[0,2.723,6,1.746,7,0.43,9,1.255,11,5.687,14,1.368,15,1.139,17,2.324,26,3.514,28,2.015,32,2.593,33,1.767,34,0.69,38,1.749,40,1.769,66,2.113,70,3.222,73,4.185,75,1.863,85,1.614,97,2.446,101,2.374,102,2.221,108,1.475,135,2.221,184,1.439,219,1.583,271,2.221,286,2.113,316,5.682,321,2.374,325,3.045,335,3.514,351,3.318,366,2.25,392,3.902,395,4.916,397,2.515,399,6.465,405,3.42,407,4.012,454,4.185,484,4.775,500,4.655,527,2.407,557,4.012,609,4.185,613,5.387,674,3.863,681,4.394,690,3.045,692,3.42,699,2.478,764,1.947,767,1.863,979,3.11,1092,3.253,1201,3.179,1292,4.647,1403,3.734,1464,4.185,1515,3.618,1571,5.25,1667,3.42,2486,4.394,2574,5.004,2575,5.004,2671,4.394,2759,5.004,3446,6.46,3447,5.004,3458,7.52,3459,5.534,3460,5.004,3461,5.534,3462,5.534]],["t/627",[0,2.546,4,0.943,7,0.568,9,2.021,14,1.894,15,1.478,25,2.523,31,1.206,40,1.218,47,1.111,70,1.952,72,2.283,73,3.914,74,1.028,76,1.952,82,2.58,84,2.077,100,4.108,102,2.077,105,3.187,111,2.251,124,1.297,137,1.509,145,1.297,157,3.491,219,1.48,226,2.317,243,2.504,258,2.317,262,2.074,265,5.096,316,5.91,331,5.464,341,2.736,342,4.803,358,7.267,365,3.613,384,8.054,385,4.07,392,2.685,408,3.491,525,2.81,617,2.908,707,2.527,956,2.636,1235,5.401,1555,6.04,1571,3.613,3399,8.461,3446,3.914,3463,5.175,3464,5.175,3465,5.175,3466,5.175,3467,5.175,3468,7.181,3469,5.175,3470,5.175]],["t/629",[9,2.233,47,1.05,100,6.732,258,3.796,1172,6.147,1183,3.912,2056,7.667,2082,7.667,2906,7.132,3471,8.479,3472,8.479]],["t/631",[4,1.009,7,0.405,9,2.002,11,6.673,14,1.606,17,1.663,22,2.733,28,2.575,40,1.497,47,1.128,48,3.48,51,1.098,53,2.083,54,1.013,55,1.04,58,3.166,66,2.7,108,1.66,316,4.958,321,3.033,326,2.19,361,4.623,377,4.062,395,4.623,399,4.771,527,3.076,593,6.394,640,3.263,693,4.37,767,2.381,979,3.974,1584,5.615,1821,5.948,3302,6.394,3446,5.348,3451,6.394,3452,6.394,3454,6.394,3460,6.394,3473,7.072,3474,7.072,3475,7.072,3476,7.072]],["t/633",[4,0.637,5,1.092,6,1.538,7,0.49,9,0.828,12,1.523,13,1.216,16,0.866,21,1.242,32,1.71,34,1.013,35,2.051,36,2.743,39,2.255,40,1.748,43,2.263,46,1.796,48,2.739,53,1.075,54,0.966,55,1.111,56,2.65,64,1.796,70,2.1,71,2.255,75,1.229,78,2.198,81,1.178,87,3.066,90,2.608,91,1.256,93,3.194,94,1.859,95,3.272,96,1.119,119,1.299,124,0.915,128,1.61,147,1.981,148,2.096,149,2.198,151,1.894,152,1.827,183,1.483,194,3.128,198,2.548,200,3.069,210,3.069,231,1.854,234,3.353,238,2.255,241,2.051,271,1.464,273,3.284,282,1.737,283,1.827,295,2.263,319,1.532,327,2.646,335,2.317,345,1.827,373,1.766,374,1.737,392,2.888,400,2.154,415,3.502,444,3.069,472,1.93,528,2.008,532,1.634,533,1.634,535,2.255,538,1.93,540,2.402,555,2.897,557,2.646,571,3.3,574,2.855,586,2.76,601,3.282,602,1.796,640,3.113,641,1.796,642,3.639,643,3.44,644,3.755,650,2.151,665,1.827,670,2.096,675,1.256,682,1.778,693,4.17,703,1.93,707,1.959,756,1.284,758,1.27,763,1.741,773,1.36,792,2.317,796,2.198,806,2.897,817,1.796,833,2.76,837,2.293,857,2.386,877,2.646,884,2.386,928,1.859,930,1.894,932,2.76,945,2.145,956,1.859,957,2.051,962,2.548,964,1.894,984,2.198,1046,3.069,1087,2.646,1178,3.535,1179,2.051,1183,1.684,1195,3.063,1201,2.096,1220,5.093,1231,2.897,1232,2.548,1284,2.76,1294,2.051,1319,3.3,1379,3.353,1409,2.897,1413,3.3,1452,6.827,1457,3.069,1480,2.548,1482,2.198,1610,2.897,1611,2.897,1614,2.897,1615,2.646,1616,2.548,1617,2.548,1618,2.646,1619,2.897,1620,2.76,1621,2.76,1622,2.76,1623,2.646,1624,2.76,1625,2.76,1626,2.76,1627,2.646,1628,2.548,1629,3.3,1630,2.897,1631,2.897,1676,2.897,1677,2.255,1870,4.42,1875,3.3,1923,2.145,1984,3.3,2076,3.3,2120,2.548,2185,3.069,2250,5.033,2251,2.76,2554,3.3,2557,3.3,2911,2.897,3414,3.069,3425,3.069,3427,3.069,3477,3.649,3478,3.649,3479,3.649,3480,3.649,3481,3.649,3482,3.649,3483,3.649,3484,3.649,3485,3.649,3486,3.649,3487,3.649,3488,3.649,3489,3.649,3490,3.649,3491,3.649]],["t/635",[4,1.159,5,1.247,6,1.638,16,2.251,17,2.231,40,1.351,81,3.061,143,1.713,347,2.234,400,2.11,402,3.416,416,5.057,540,2.834,682,2.543,707,2.802,1232,5.559,1517,7.2,3492,7.963]],["t/637",[4,1.034,5,1.268,6,1.561,34,1.127,40,1.534,44,4.43,46,3.619,51,1.142,53,2.166,76,2.775,91,2.531,108,1.561,141,2.914,145,1.843,183,2.99,266,3.447,286,2.808,400,1.949,402,3.155,533,3.293,601,3.761,650,2.843,665,4.526,796,4.43,808,5.84,817,3.619,930,3.817,1117,3.966,1610,5.84,1648,5.84,1677,4.545,3493,6.651]],["t/639",[4,0.931,6,1.765,34,1.015,40,1.381,48,4.005,51,1.264,87,3.07,91,2.801,108,1.405,286,3.108,325,4.479,400,2.157,402,3.491,444,3.309,601,2.999,637,3.146,638,7.36,817,4.005,1117,4.389,3493,7.36]],["t/641",[70,3.337,75,2.979,758,3.079,2911,7.024]],["t/643",[64,4.374,75,2.993,1101,5.107]],["t/645",[4,1.017,75,2.993,1101,5.107]],["t/647",[4,1.055,15,1.564,72,3.353,87,2.867,91,2.615,101,3.26,105,2.937,122,2.033,145,1.905,159,3.011,183,3.089,226,3.402,271,3.05,288,4.271,290,6.392,394,3.561,519,4.826,528,4.182,538,5.251,539,5.251,637,2.937,714,2.867,832,6.034,841,5.306,889,4.271,1116,4.271,1119,5.857,1403,5.127,1482,4.577,3205,6.872,3494,7.6,3495,7.6]],["t/649",[1,3.467,2,6.031,3,3.845,4,0.988,33,2.759,66,3.298,385,3.758,459,6.031]],["t/651",[106,5.303,472,4.656,758,3.064,892,4.656,3153,7.961]],["t/653",[3496,8.978]]],"invertedIndex":[["",{"_index":47,"t":{"4":{"position":[[705,1],[990,1],[992,3],[996,1],[998,3],[1297,1],[1339,1],[2586,1],[2588,1],[2640,1],[2737,1],[2739,1],[2741,1],[2789,1],[2791,1],[2843,1],[2940,1],[2942,2],[2945,1],[2997,1],[3095,1],[3097,1],[3099,1],[3473,1],[3515,1],[4522,1],[4583,1],[4681,1],[4713,2],[4784,2],[4805,1],[4854,2],[4868,1],[4870,1],[4990,1],[5140,1],[5142,1],[5144,2],[5158,1],[5160,1],[5247,1],[5306,1],[5308,1],[5310,2],[5325,1],[5327,1],[5448,1],[5484,1],[5486,2],[5489,1],[5672,1],[5707,1],[5709,1],[5711,1],[5713,1],[5888,1],[5901,1],[5903,1],[5974,1],[6071,1],[6073,1],[6075,1],[6077,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]]},"10":{"position":[[161,2]]},"12":{"position":[[1468,1],[1470,3],[1507,1],[1509,3],[1525,1],[1536,1],[1546,1],[1569,1],[1571,2],[1574,2],[1577,3],[1581,1]]},"14":{"position":[[619,1],[621,3],[763,1],[765,3],[1082,1],[1084,3],[1143,1],[1145,3],[1169,1],[1180,1],[1221,2],[1224,2],[1227,3],[1231,1]]},"18":{"position":[[2357,1],[2787,1],[2848,1],[2912,1],[3090,1],[3104,1],[3119,1],[3158,1],[3181,1],[3183,1],[3185,1],[3187,1],[3311,1],[3325,1],[3340,1],[3358,1],[3425,2],[3439,1],[3449,1],[3451,1],[3453,1],[3455,1],[4332,1],[4706,1],[4768,1],[4919,1],[4933,1],[4948,1],[4974,1],[4976,1],[4978,1],[5068,1],[5082,1],[5097,1],[5114,1],[5181,2],[5184,1],[5186,1],[5188,1]]},"20":{"position":[[468,1],[500,6],[507,2],[510,3],[514,1]]},"27":{"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]]},"31":{"position":[[275,1],[620,1],[622,1],[652,1]]},"35":{"position":[[25,1],[35,1],[46,1],[61,1],[69,1],[78,1],[88,1],[98,1]]},"42":{"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]]},"44":{"position":[[248,2],[659,2]]},"46":{"position":[[477,1],[710,3],[1696,1],[1698,1],[1782,1],[1890,1],[1892,1],[1894,1],[2192,3],[3093,1],[3106,1],[3108,1],[3192,1],[3300,2],[3319,1],[3321,1],[3323,1]]},"60":{"position":[[878,1],[880,1],[920,1],[1087,1],[1089,1],[1091,1],[1974,1],[1976,1],[2016,1],[2179,1],[2181,1],[2183,1]]},"62":{"position":[[439,2],[486,2]]},"64":{"position":[[1263,2],[1366,2],[1412,2],[1551,1],[1606,1],[1710,1],[1797,1],[1866,1],[1977,1],[2126,1],[2193,1],[2248,1],[2300,1],[2400,1],[2467,1],[2522,1],[2630,1],[3895,2],[3969,2]]},"66":{"position":[[970,1],[1205,3],[2203,1],[2205,1],[2275,1],[2399,1],[2401,1],[2403,1],[2703,3],[3608,1],[3621,1],[3623,1],[3693,1],[3817,2],[3838,1],[3840,1],[3842,1]]},"71":{"position":[[292,2],[339,2]]},"73":{"position":[[1902,1],[1904,3],[1942,1],[2011,1],[2013,3],[2017,1],[2050,1],[2052,3],[2056,1],[2058,2],[2159,1],[2232,1],[2439,2],[2486,2],[2542,2],[2898,1],[2917,1],[2935,1],[4133,1],[4155,1],[4177,1],[4183,1],[4316,1],[4322,1],[4539,1],[4561,1],[4583,1],[4589,1],[4722,1],[4728,1],[6058,1],[6296,1],[6298,3],[6528,1],[6530,3],[7615,1],[7946,1],[8176,1],[8178,3],[8408,1],[8410,3],[9979,1],[9981,3]]},"77":{"position":[[501,1],[503,3],[541,1],[610,1],[612,3],[616,1],[649,1],[651,3],[655,1],[657,2],[758,1],[831,1],[1038,2],[1085,2],[1141,2]]},"79":{"position":[[122,1],[141,1],[159,1]]},"83":{"position":[[1122,2],[1225,2],[1271,2],[1410,1],[1465,1],[1569,1],[1656,1],[1725,1],[1836,1],[1985,1],[2052,1],[2107,1],[2159,1],[2259,1],[2326,1],[2381,1],[2489,1],[3687,2],[3761,2]]},"85":{"position":[[729,1],[964,3],[1962,1],[1964,1],[2033,1],[2091,1],[2114,1],[2116,1],[2118,1],[2120,1],[2420,3],[3325,1],[3338,1],[3340,1],[3409,1],[3467,1],[3490,1],[3492,2],[3513,1],[3515,1],[3517,1]]},"91":{"position":[[640,1],[874,3],[1866,1],[1868,1],[1970,1],[2119,1],[2121,1],[2123,1],[2422,3],[3325,1],[3338,1],[3340,1],[3442,1],[3591,2],[3611,1],[3613,1],[3615,1]]},"93":{"position":[[382,1]]},"95":{"position":[[413,1],[647,3],[1639,1],[1641,1],[1741,1],[1800,1],[1802,1],[1804,1],[2103,3],[3006,1],[3019,1],[3021,1],[3121,1],[3180,2],[3200,1],[3202,1],[3204,1]]},"103":{"position":[[736,1],[971,3],[1969,1],[1971,1],[2076,1],[2178,1],[2180,1],[2182,1],[2482,3],[3387,1],[3400,1],[3402,1],[3507,1],[3609,2],[3630,1],[3632,1],[3634,1]]},"110":{"position":[[461,1],[827,3],[1661,1],[1896,3],[2894,1],[2896,1],[2989,1],[3113,1],[3115,1],[3117,1],[3417,3],[4322,1],[4335,1],[4337,1],[4430,1],[4554,2],[4575,1],[4577,1],[4579,1]]},"114":{"position":[[519,1],[759,3],[1787,1],[1789,1],[1888,1],[2000,1],[2002,1],[2004,1],[2309,3],[3224,1],[3237,1],[3239,1],[3338,1],[3450,2],[3476,1],[3478,1],[3480,1]]},"118":{"position":[[410,2],[461,2],[512,2],[549,2],[567,2],[782,2],[827,2],[885,2],[935,2],[1539,1],[1723,1],[3041,2],[3067,1],[3830,1],[3858,1],[3891,1],[3946,1],[3974,1],[4264,1],[4330,1],[4385,1],[4431,1],[4457,1],[4464,1],[4490,1],[4509,1],[4515,1],[4538,1],[4544,1],[4563,2],[4619,1],[4646,1],[4676,1],[4710,2]]},"120":{"position":[[830,1]]},"123":{"position":[[157,1],[401,1]]},"125":{"position":[[205,1],[391,1]]},"140":{"position":[[259,1],[283,1]]},"143":{"position":[[1026,1],[1260,3],[2252,1],[2254,1],[2339,1],[2413,1],[2415,1],[2417,1],[2716,3],[3619,1],[3632,1],[3634,1],[3719,1],[3793,2],[3813,1],[3815,1],[3817,1]]},"147":{"position":[[231,1],[233,1],[235,1],[237,1]]},"149":{"position":[[236,1],[1044,1],[1130,1],[1132,1],[1134,1],[1136,1],[1138,1],[1734,2],[1737,1],[1739,3],[1913,1],[2442,1],[2452,1],[2592,1],[2594,1],[3317,1],[3484,1],[3494,1],[3503,1],[3555,1],[3637,1],[3639,2],[3689,1],[3691,1]]},"151":{"position":[[771,1],[2579,1],[2581,2],[2584,3],[2604,1],[2606,1],[2662,1],[2673,1],[2675,2],[2696,1],[2698,1],[2700,1],[2702,1],[2704,1],[2722,1],[2724,1],[2782,1],[2784,2],[2787,3],[2791,2],[2805,1],[2831,1],[2833,1],[2835,1],[2849,1],[2851,1],[2953,1],[3102,2],[3116,1],[3135,1],[3151,1],[3153,1],[3197,1],[3199,1],[3201,1],[3203,1],[3205,1],[3207,1]]},"153":{"position":[[774,1],[1012,3],[2028,1],[2030,1],[2107,3],[2119,1],[2128,1],[2180,1],[2262,1],[2264,2],[2399,2],[2413,1],[2491,1],[2493,1],[2495,1],[2798,3],[3709,1],[3722,1],[3724,1],[3801,3],[3813,1],[3822,1],[3874,1],[3956,1],[3958,2],[4093,2],[4107,1],[4185,2],[4209,1],[4211,1],[4213,1]]},"157":{"position":[[122,1],[124,1],[126,1],[128,1],[156,1],[158,1],[160,1],[162,2],[187,1],[189,1],[191,1],[193,1],[236,1],[238,1],[240,1],[242,1],[268,1],[270,1],[272,1],[274,2],[302,1],[304,1],[306,1],[308,1],[333,1],[335,1],[337,1],[339,1],[362,1],[364,1],[366,1],[368,1],[391,1],[393,1],[395,1],[397,1],[422,1],[424,1],[426,1],[428,1],[454,1],[456,1],[458,1],[460,1],[497,1],[499,1],[501,1],[503,1],[533,1],[535,1],[537,1],[539,1],[581,1],[583,1],[585,1],[587,1],[611,1],[613,1],[615,1],[617,1],[642,1],[644,1],[646,1],[648,1],[692,1],[694,1],[696,1],[698,1],[726,1],[728,1],[730,1],[732,1],[755,1],[757,1],[759,1],[761,1],[786,1],[788,1],[790,1],[792,1],[816,1],[818,1],[820,1],[822,1],[848,1],[850,1],[852,1],[854,1],[897,1],[899,1],[901,1],[903,1],[928,1],[930,1],[932,1],[934,1],[965,1],[967,1],[969,1],[971,1],[993,1],[995,1],[997,1],[999,1],[1034,1],[1036,1],[1038,1],[1040,1],[1071,1],[1073,1],[1075,1],[1106,1],[1108,1],[1110,1],[1112,1]]},"164":{"position":[[197,1],[280,1],[282,2],[285,3],[289,2],[292,1],[331,3]]},"166":{"position":[[1452,1],[1462,1],[1464,2],[1467,3],[1471,2],[1485,1],[1509,1],[1527,2],[1593,2],[1660,1],[1662,1],[1664,1]]},"168":{"position":[[690,1],[700,1],[702,2],[705,3],[709,2],[723,1],[725,2],[773,2],[841,1],[843,1]]},"174":{"position":[[613,1],[726,1],[938,1],[1015,1],[1160,1],[1311,1],[1564,1],[1566,1],[1621,1],[1787,1],[1789,1],[1791,1],[1820,1],[1822,1],[1883,1],[1904,1],[1906,1],[1908,1],[1931,1],[1933,1],[1982,1],[2101,1],[2103,1],[2105,1],[2130,1],[2132,1],[2204,1],[2305,1],[2307,1],[2309,1],[2333,1],[2335,1],[2409,1],[2517,1],[2519,1],[2521,1],[2563,1],[2576,1],[2578,1],[2652,1],[2818,1],[2820,2],[2823,1],[2906,1],[2927,1],[2929,2],[2932,1],[2997,1],[3115,1],[3117,1],[3119,2],[3133,1],[3135,1],[3225,1],[3326,1],[3328,2],[3331,1],[3422,1],[3530,1],[3532,1],[3534,1],[3536,1]]},"176":{"position":[[588,1],[590,1],[666,1],[765,1],[767,2],[770,1],[846,1],[945,1],[947,1],[949,1],[972,1],[974,1],[1047,1],[1111,1],[1113,1],[1115,1],[1140,1],[1142,1],[1218,1],[1323,1],[1325,2],[1328,1],[1404,1],[1509,1],[1511,1],[1513,1],[1537,1],[1539,1],[1613,1],[1721,1],[1723,1],[1725,1],[1767,1],[1780,1],[1782,1],[1857,1],[1869,2],[1880,1],[1979,1],[1981,2],[1984,1],[2059,1],[2071,2],[2082,1],[2181,1],[2183,2],[2186,1],[2254,1],[2266,2],[2277,1],[2356,1],[2365,1],[2367,1],[2369,1],[2371,2],[2385,1],[2387,1],[2481,1],[2586,1],[2588,2],[2591,1],[2685,1],[2790,1],[2792,2],[2795,1],[2886,1],[2994,1],[2996,1],[2998,1],[3000,1]]},"178":{"position":[[746,1],[859,1],[926,1],[941,1],[1003,1],[1010,2],[1019,2],[1080,1],[1292,1],[1369,1],[1462,1],[1954,1],[1972,1],[1974,1],[2023,1],[2033,1],[2035,1],[2071,1],[2073,1],[2075,2],[2090,1],[2166,1],[2192,2],[2276,1],[2304,1],[2306,1],[2308,1],[2310,1],[2312,1],[2338,1],[2340,1],[2395,1],[2561,1],[2563,1],[2565,1],[2594,1],[2596,1],[2657,1],[2678,2],[2692,1],[2711,1],[2727,1],[2729,1],[2769,1],[2771,1],[2773,1],[2775,1],[2777,1],[2779,1],[2804,1],[2806,1],[2878,1],[2979,1],[2981,1],[2983,1],[3153,1],[3171,1],[3173,1],[3222,1],[3232,1],[3234,1],[3270,1],[3272,1],[3274,2],[3289,1],[3365,1],[3391,2],[3475,1],[3503,1],[3505,1],[3507,1],[3509,2],[3523,1],[3525,1],[3599,1],[3765,1],[3767,2],[3770,1],[3853,1],[3874,2],[3888,1],[3907,1],[3923,1],[3925,1],[3965,1],[3967,1],[3969,1],[3971,1],[3973,1],[3975,2],[3989,1],[3991,1],[4081,1],[4182,1],[4184,1],[4186,1],[4188,1]]},"180":{"position":[[319,1]]},"182":{"position":[[382,2],[414,2],[492,2],[590,2],[994,1],[1004,1],[1006,2],[1009,3],[1013,2],[1027,1],[1029,2],[1088,2],[1167,1],[1169,2]]},"184":{"position":[[404,4],[418,2],[741,1],[743,1],[910,3],[1181,1]]},"186":{"position":[[539,1],[776,3],[1786,1],[1788,1],[1876,1],[1988,1],[1990,1],[1992,1],[2294,3],[3203,1],[3216,1],[3218,1],[3306,1],[3418,1],[3420,1],[3422,1],[3424,1]]},"188":{"position":[[121,1],[139,1],[152,1],[225,1],[380,1],[3674,1],[3910,3],[4914,1],[4916,1],[4991,3],[5003,1],[5115,1],[5143,2],[5160,1],[5176,2],[5195,1],[5207,2],[5226,1],[5242,2],[5263,1],[5277,2],[5298,1],[5311,2],[5347,1],[5363,2],[5385,1],[5395,2],[5454,2],[5468,1],[5518,1],[5520,1],[5522,1],[5823,3],[6730,1],[6743,1],[6745,1],[6820,3],[6832,1],[6944,1],[6972,2],[6989,1],[7005,2],[7024,1],[7036,2],[7055,1],[7071,2],[7092,1],[7106,2],[7127,1],[7140,2],[7176,1],[7192,2],[7214,1],[7224,2],[7283,2],[7297,1],[7347,2],[7369,1],[7371,1],[7373,1]]},"192":{"position":[[402,4],[787,1]]},"194":{"position":[[291,1],[293,1],[323,1],[357,2],[371,1],[410,1],[412,1],[414,1]]},"196":{"position":[[343,1],[359,1],[386,1],[401,1],[430,1],[446,1],[476,1],[492,1],[698,1],[700,1],[750,3],[762,1],[825,1],[827,1],[829,1],[1210,1]]},"198":{"position":[[566,1],[800,3],[1792,1],[1794,1],[1869,3],[1881,1],[2013,1],[2015,1],[2017,1],[2316,3],[3219,1],[3232,1],[3234,1],[3309,3],[3321,1],[3453,2],[3473,1],[3475,1],[3477,1]]},"200":{"position":[[1092,1],[1102,1],[1104,2],[1107,3],[1111,2],[1125,1],[1127,2],[1186,2],[1265,1],[1267,2],[1913,1],[1915,1],[1958,1],[2036,1],[2038,1],[2040,1]]},"202":{"position":[[400,1],[635,3],[1633,1],[1635,1],[1705,1],[1743,1],[1745,1],[1747,1],[2047,3],[2952,1],[2965,1],[2967,1],[3037,1],[3075,2],[3096,1],[3098,1],[3100,1]]},"204":{"position":[[144,1],[155,1]]},"206":{"position":[[135,2],[184,2]]},"208":{"position":[[575,1],[809,3],[1801,1],[1803,1],[1874,1],[1939,1],[1941,1],[1943,1],[2242,3],[3145,1],[3158,1],[3160,1],[3231,1],[3296,2],[3316,1],[3318,1],[3320,1]]},"210":{"position":[[139,1],[151,1]]},"212":{"position":[[133,2],[182,2]]},"214":{"position":[[543,1],[775,3],[1755,1],[1757,1],[1825,1],[1914,1],[1916,1],[1918,1],[2215,3],[3114,1],[3127,1],[3129,1],[3197,1],[3286,2],[3304,1],[3306,1],[3308,1]]},"216":{"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]]},"218":{"position":[[887,1],[1125,3],[2141,1],[2143,1],[2188,1],[2212,3],[2238,3],[2261,3],[2284,2],[2287,1],[2289,1],[2291,1],[2594,3],[3505,1],[3518,1],[3520,1],[3565,1],[3589,3],[3615,3],[3638,3],[3661,2],[3664,2],[3688,1],[3690,1],[3692,1]]},"220":{"position":[[881,1],[1114,3],[2353,1],[2355,1],[2439,1],[2547,1],[2549,1],[2551,1],[2849,3],[3750,1],[3763,1],[3765,1],[3849,1],[3957,2],[3976,1],[3978,1],[3980,1]]},"226":{"position":[[149,2]]},"234":{"position":[[644,1],[883,3],[1905,1],[1907,1],[1974,1],[1993,1],[1995,1],[1997,1],[2301,3],[3214,1],[3227,1],[3229,1],[3296,1],[3315,2],[3340,1],[3342,1],[3344,1]]},"249":{"position":[[78,1]]},"253":{"position":[[719,1],[957,3],[1973,1],[1975,1],[2052,1],[2073,1],[2075,1],[2077,1],[2380,3],[3291,1],[3304,1],[3306,1],[3383,1],[3404,2],[3428,1],[3430,1],[3432,1]]},"257":{"position":[[799,1],[1034,3],[2291,1],[2293,1],[2398,1],[2500,1],[2502,1],[2504,1],[2804,3],[3709,1],[3722,1],[3724,1],[3829,1],[3931,2],[3952,1],[3954,1],[3956,1]]},"261":{"position":[[568,1],[808,3],[2110,1],[2112,1],[2211,1],[2323,1],[2325,1],[2327,1],[2632,3],[3547,1],[3560,1],[3562,1],[3661,1],[3773,2],[3799,1],[3801,1],[3803,1]]},"265":{"position":[[455,1],[689,3],[1937,1],[1939,1],[2039,1],[2098,1],[2100,1],[2102,1],[2401,3],[3304,1],[3317,1],[3319,1],[3419,1],[3478,2],[3498,1],[3500,1],[3502,1]]},"269":{"position":[[696,1],[930,3],[2178,1],[2180,1],[2282,1],[2431,1],[2433,1],[2435,1],[2734,3],[3637,1],[3650,1],[3652,1],[3754,1],[3903,2],[3923,1],[3925,1],[3927,1]]},"271":{"position":[[490,2],[539,2],[883,1],[900,1]]},"273":{"position":[[350,1],[383,1]]},"275":{"position":[[353,1],[400,1]]},"277":{"position":[[770,1],[1004,3],[1996,1],[1998,1],[2068,1],[2106,3],[2126,3],[2148,2],[2151,1],[2153,1],[2155,1],[2454,3],[3357,1],[3370,1],[3372,1],[3442,1],[3480,3],[3500,3],[3522,2],[3525,2],[3545,1],[3547,1],[3549,1]]},"279":{"position":[[151,1]]},"281":{"position":[[509,1],[740,3],[1714,1],[1716,1],[1776,1],[1833,2],[1847,1],[1875,1],[1877,1],[1879,1],[2175,3],[3072,1],[3085,1],[3087,1],[3147,1],[3204,2],[3218,1],[3246,2],[3263,1],[3265,1],[3267,1]]},"283":{"position":[[177,1],[191,1]]},"285":{"position":[[518,1],[755,3],[1765,1],[1767,1],[1854,1],[1912,1],[1914,1],[1916,1],[2218,3],[3127,1],[3140,1],[3142,1],[3229,1],[3287,1],[3289,1],[3291,1],[3293,1]]},"291":{"position":[[697,1],[932,3],[2189,1],[2191,1],[2284,1],[2408,1],[2410,1],[2412,1],[2712,3],[3617,1],[3630,1],[3632,1],[3725,1],[3849,2],[3870,1],[3872,1],[3874,1]]},"295":{"position":[[539,1],[772,3],[1758,1],[1760,1],[1828,1],[1843,1],[1858,2],[1874,1],[1886,1],[1888,1],[1890,1],[1892,1],[2190,3],[3091,1],[3104,1],[3106,1],[3174,1],[3189,1],[3204,2],[3220,1],[3232,1],[3234,2],[3253,1],[3255,1],[3257,1]]},"297":{"position":[[1373,1],[1375,1],[1420,1],[1446,2],[1460,1],[1509,1],[1511,1],[1513,1]]},"301":{"position":[[1010,1],[1243,3],[2229,1],[2231,1],[2292,1],[2335,1],[2352,2],[2371,1],[2380,2],[2398,1],[2409,2],[2427,1],[2439,1],[2441,1],[2443,1],[2445,1],[2743,3],[3644,1],[3657,1],[3659,1],[3720,1],[3763,1],[3780,2],[3799,1],[3808,2],[3826,1],[3837,2],[3855,1],[3867,1],[3869,2],[3888,1],[3890,1],[3892,1]]},"305":{"position":[[551,1],[786,3],[1784,1],[1786,1],[1858,3],[1870,1],[2036,1],[2038,1],[2040,1],[2340,3],[3245,1],[3258,1],[3260,1],[3332,3],[3344,1],[3510,2],[3531,1],[3533,1],[3535,1]]},"307":{"position":[[1059,1]]},"309":{"position":[[469,5]]},"311":{"position":[[544,1],[741,1],[743,2],[746,3],[766,1],[768,1],[817,1],[827,1],[829,1],[831,2],[946,1],[948,1],[950,1],[952,1],[954,1],[956,1],[989,1],[991,1],[1019,1],[1021,2],[1024,3],[1028,4],[1044,1],[1063,1],[1079,1],[1081,1],[1177,1],[1179,1],[1181,1],[1183,1],[1185,1],[1187,1],[1218,1],[1220,2],[1223,3],[1243,1],[1245,1],[1294,1],[1304,1],[1306,1],[1308,2],[1423,1],[1425,1],[1427,1],[1429,1],[1431,1],[1433,2],[1436,3],[1451,1],[1453,2],[1456,3],[1460,1],[1504,1],[1506,2],[1509,3],[1513,4],[1529,1],[1548,1],[1564,1],[1566,1],[1663,1],[1665,1],[1667,1],[1669,1],[1671,1],[1673,1],[1675,1]]},"317":{"position":[[528,1],[764,3],[1768,1],[1770,1],[1843,1],[1948,1],[1961,2],[2008,1],[2010,1],[2012,1],[2313,3],[3220,1],[3233,1],[3235,1],[3308,1],[3413,1],[3426,2],[3473,2],[3495,1],[3497,1],[3499,1]]},"325":{"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],[1941,1],[2175,3],[3423,1],[3425,1],[3510,1],[3601,1],[3610,2],[3628,1],[3640,1],[3642,1],[3644,1],[3646,1],[3945,3],[4848,1],[4861,1],[4863,1],[4948,1],[5039,1],[5048,2],[5066,1],[5078,1],[5080,2],[5100,1],[5102,1],[5104,1]]},"327":{"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]]},"329":{"position":[[428,1],[659,3],[1633,1],[1635,1],[1695,1],[1745,1],[1747,1],[1749,1],[2045,3],[2942,1],[2955,1],[2957,1],[3017,1],[3067,2],[3084,1],[3086,1],[3088,1]]},"333":{"position":[[399,1],[636,3],[1646,1],[1648,1],[1723,1],[1748,1],[1750,1],[1752,1],[2054,3],[2963,1],[2976,1],[2978,1],[3053,1],[3078,2],[3101,1],[3103,1],[3105,1]]},"337":{"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]]},"341":{"position":[[464,1],[704,3],[1732,1],[1734,1],[1794,1],[1835,3],[1852,2],[1855,1],[1857,1],[1859,1],[2164,3],[3079,1],[3092,1],[3094,1],[3154,1],[3195,3],[3212,2],[3215,2],[3241,1],[3243,1],[3245,1]]},"343":{"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]]},"345":{"position":[[646,1],[881,3],[1879,1],[1881,1],[1954,3],[1966,1],[2015,8],[2105,2],[2119,1],[2137,1],[2139,1],[2141,1],[2441,3],[3346,1],[3359,1],[3361,1],[3434,3],[3446,1],[3495,8],[3585,2],[3599,1],[3617,2],[3638,1],[3640,1],[3642,1]]},"347":{"position":[[357,1],[394,1]]},"349":{"position":[[502,1],[738,3],[1742,1],[1744,1],[1816,1],[1891,1],[1893,1],[1895,1],[2196,3],[3103,1],[3116,1],[3118,1],[3190,1],[3265,1],[3267,1],[3269,1],[3271,1]]},"355":{"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]]},"357":{"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]]},"359":{"position":[[655,1],[674,2],[715,1]]},"361":{"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]]},"363":{"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]]},"365":{"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]]},"367":{"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]]},"369":{"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]]},"376":{"position":[[384,1],[733,1],[813,1],[835,1],[867,1],[965,1]]},"378":{"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]]},"380":{"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]]},"382":{"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]]},"384":{"position":[[266,1],[572,1],[839,1],[937,1]]},"387":{"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]]},"389":{"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]]},"391":{"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]]},"395":{"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],[734,1],[736,2],[782,1],[784,1],[786,1],[788,1],[790,1],[792,1],[794,1]]},"397":{"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]]},"399":{"position":[[74,1],[76,1],[131,1],[133,2],[136,3],[140,2],[154,1],[173,1],[189,1],[191,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]]},"402":{"position":[[48,2],[81,2],[117,2],[170,2],[173,2],[218,1],[245,1],[247,1],[312,3],[324,1],[326,1],[355,1],[357,1],[359,2],[417,2],[420,1]]},"404":{"position":[[68,1],[95,1],[115,1],[117,1]]},"406":{"position":[[8,1],[21,1],[36,1],[63,1],[82,1],[84,2],[99,1],[126,1],[145,1],[147,2],[150,2],[153,1]]},"408":{"position":[[8,1],[37,1],[39,1],[89,1],[91,1],[93,1]]},"410":{"position":[[8,1],[35,1],[37,1],[79,2],[82,1],[84,1],[86,1]]},"412":{"position":[[176,1],[192,1],[270,3],[563,1],[579,1],[664,1],[693,1],[695,1],[758,1],[760,1],[762,1]]},"417":{"position":[[311,1],[340,1]]},"423":{"position":[[175,1],[221,1]]},"435":{"position":[[385,1],[640,1],[985,1],[992,1],[2101,1]]},"437":{"position":[[637,1]]},"444":{"position":[[76,1],[164,1],[231,1]]},"457":{"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]]},"466":{"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]]},"468":{"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]]},"470":{"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]]},"472":{"position":[[628,1],[644,1],[657,1],[1157,1],[1469,1],[1639,1],[1701,1],[1708,2],[1717,2],[1880,1],[1977,1]]},"476":{"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]]},"479":{"position":[[210,1],[212,2],[215,3],[231,2],[283,1]]},"481":{"position":[[1338,1],[1340,5],[1925,2],[1928,3],[1944,1],[1946,2],[1949,3],[1979,2],[2052,1]]},"483":{"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]]},"488":{"position":[[377,1],[379,2],[461,2],[561,2],[622,1],[790,1],[792,2],[874,2],[974,2],[1036,2],[1167,1]]},"490":{"position":[[636,1],[716,1],[738,1],[834,1],[932,1]]},"494":{"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]]},"496":{"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]]},"499":{"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]]},"501":{"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]]},"503":{"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]]},"505":{"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]]},"507":{"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]]},"509":{"position":[[500,1],[502,2],[505,3],[525,1],[527,1],[576,1],[586,1],[588,1],[624,1],[626,1],[628,2],[643,1],[645,2],[875,1],[877,1],[879,1],[881,1],[925,1],[927,1],[951,1],[953,2],[956,3],[960,4],[976,1],[995,1],[1011,1],[1013,1],[1038,1],[1040,1],[1042,1],[1044,1],[1046,1],[1048,1],[1079,1],[1081,2],[1084,3],[1104,1],[1106,1],[1155,1],[1165,1],[1167,1],[1203,1],[1205,1],[1207,2],[1222,1],[1224,2],[1454,1],[1456,1],[1458,2],[1472,1],[1474,1],[1517,1],[1519,2],[1522,3],[1526,4],[1542,1],[1561,1],[1577,1],[1579,1],[1604,1],[1606,1],[1608,1],[1610,1],[1612,1],[1614,1],[1616,1]]},"517":{"position":[[701,1],[712,1],[744,1],[746,1],[748,3]]},"533":{"position":[[304,2],[362,2],[488,2]]},"543":{"position":[[293,1],[295,3],[571,1],[573,3],[590,1],[592,3],[645,1],[698,1],[992,1],[994,3],[1391,1],[1393,3],[1560,1],[1562,3],[1579,1],[2299,1],[2301,3],[2605,1],[2607,3],[2624,1],[2626,3],[2663,1],[2665,3]]},"545":{"position":[[586,1],[927,1],[997,1],[1113,1],[1136,1],[1147,1],[1178,1],[1192,1]]},"549":{"position":[[215,1],[288,2],[674,1],[725,2],[792,2],[987,2],[1057,2],[1132,2],[1178,2],[1234,2],[1275,2],[1602,1],[1628,1],[1658,1],[1668,1],[1711,1],[1713,1],[1965,1],[1978,1],[1980,1],[2063,1],[2164,1],[2166,1],[2168,2],[2182,1],[2184,1],[2232,1],[2291,1],[2293,1],[2295,2],[2298,1]]},"555":{"position":[[250,1],[400,1]]},"557":{"position":[[361,1],[427,1],[485,1],[2862,1],[2929,1]]},"559":{"position":[[543,1],[651,1],[698,1],[705,2],[737,2],[1779,1],[1781,1],[1842,1],[1975,2],[1989,1],[2008,1],[2024,1],[2048,1],[2050,1],[2052,1],[2054,1],[2056,1]]},"561":{"position":[[276,1],[384,1],[431,1],[438,2],[470,2]]},"563":{"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]]},"565":{"position":[[340,2],[747,2],[2140,1]]},"584":{"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]]},"586":{"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]]},"588":{"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]]},"590":{"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]]},"592":{"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]]},"594":{"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]]},"597":{"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]]},"599":{"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]]},"610":{"position":[[102,2],[197,2]]},"616":{"position":[[268,1]]},"623":{"position":[[160,1],[162,3],[197,1],[260,1],[402,1],[404,1],[482,1],[590,1],[592,1],[594,1],[687,1],[700,1],[702,1],[797,1],[905,1],[907,1],[909,1],[911,1]]},"627":{"position":[[835,1],[837,1],[885,1],[951,1],[953,1],[1438,1],[1440,1],[1483,1],[1545,1],[1547,1]]},"629":{"position":[[89,2],[122,2]]},"631":{"position":[[267,1],[269,3],[304,1],[306,3],[371,1],[373,2]]}}}],["0",{"_index":609,"t":{"31":{"position":[[277,1]]},"73":{"position":[[2000,1],[2391,3],[4389,1],[4451,1],[4795,1],[4857,1],[5097,1],[5105,1],[5240,1],[6140,1],[6573,1],[6632,1],[7697,1],[7933,1],[8019,2],[8449,1],[8508,1],[9799,2]]},"77":{"position":[[599,1],[990,3]]},"147":{"position":[[477,4]]},"625":{"position":[[49,1]]}}}],["0.0.0.0",{"_index":1930,"t":{"206":{"position":[[589,7]]},"208":{"position":[[1883,10],[3240,10]]},"212":{"position":[[581,7]]}}}],["0.05",{"_index":1364,"t":{"118":{"position":[[4484,5]]}}}],["0.1.7",{"_index":728,"t":{"44":{"position":[[1490,8]]},"565":{"position":[[1138,8]]}}}],["0.12.2",{"_index":3419,"t":{"610":{"position":[[94,7],[189,7]]},"614":{"position":[[382,7]]}}}],["0.12.3",{"_index":3421,"t":{"610":{"position":[[200,7]]}}}],["0.13.0",{"_index":3420,"t":{"610":{"position":[[105,7]]},"612":{"position":[[250,6]]},"614":{"position":[[111,6],[139,6]]},"616":{"position":[[286,6]]}}}],["0.14.0",{"_index":3446,"t":{"621":{"position":[[3,6]]},"623":{"position":[[927,7]]},"625":{"position":[[387,6],[481,7],[629,6]]},"627":{"position":[[3,6]]},"631":{"position":[[30,7]]}}}],["0.14.1",{"_index":1228,"t":{"110":{"position":[[463,7]]}}}],["0.16.0",{"_index":3456,"t":{"623":{"position":[[1228,7]]}}}],["0.29",{"_index":1365,"t":{"118":{"position":[[4492,4]]}}}],["0.3",{"_index":1363,"t":{"118":{"position":[[4459,4]]},"483":{"position":[[2135,3]]}}}],["0.30",{"_index":1359,"t":{"118":{"position":[[4425,5]]}}}],["0.33",{"_index":3013,"t":{"483":{"position":[[2544,5],[2607,5],[2672,4]]},"507":{"position":[[1235,5],[1256,5],[1278,4]]}}}],["0.4",{"_index":1367,"t":{"118":{"position":[[4511,3]]},"483":{"position":[[2111,3]]}}}],["0.40",{"_index":1368,"t":{"118":{"position":[[4517,4]]}}}],["0.5",{"_index":1369,"t":{"118":{"position":[[4540,3]]}}}],["0.50",{"_index":1370,"t":{"118":{"position":[[4546,4]]}}}],["0.52",{"_index":1362,"t":{"118":{"position":[[4451,5]]}}}],["02",{"_index":2793,"t":{"435":{"position":[[958,2]]},"444":{"position":[[50,2],[137,2],[204,2]]}}}],["029b081ba",{"_index":781,"t":{"46":{"position":[[1793,10],[3203,10]]},"114":{"position":[[1899,10],[3349,10]]},"174":{"position":[[2420,10],[3433,10]]},"176":{"position":[[1624,10],[2897,10]]},"220":{"position":[[2450,10],[3860,10]]},"261":{"position":[[2222,10],[3672,10]]},"623":{"position":[[493,10],[808,10]]}}}],["04",{"_index":3431,"t":{"616":{"position":[[237,2]]}}}],["0400",{"_index":2783,"t":{"435":{"position":[[374,5],[629,5]]},"616":{"position":[[257,5]]}}}],["04:00",{"_index":1350,"t":{"118":{"position":[[3852,5],[3968,5],[4286,5],[4407,5],[4585,5],[4613,5]]}}}],["04t13:01:48",{"_index":1353,"t":{"118":{"position":[[3956,11],[4395,11]]}}}],["04t13:01:51",{"_index":1349,"t":{"118":{"position":[[3840,11],[4274,11]]}}}],["05",{"_index":1348,"t":{"118":{"position":[[3837,2],[3953,2],[4271,2],[4392,2]]},"369":{"position":[[894,3],[949,3]]}}}],["0500",{"_index":2598,"t":{"369":{"position":[[654,5]]}}}],["05:00",{"_index":2795,"t":{"435":{"position":[[973,5]]}}}],["06:00",{"_index":2829,"t":{"444":{"position":[[65,5],[152,5],[219,5]]}}}],["07",{"_index":2781,"t":{"435":{"position":[[354,2],[609,2]]}}}],["0845bdc965b4",{"_index":3256,"t":{"584":{"position":[[724,12]]}}}],["08:53:10.467",{"_index":2597,"t":{"369":{"position":[[640,12]]}}}],["09:17:32.428",{"_index":3433,"t":{"616":{"position":[[243,12]]}}}],["0:/run/discord",{"_index":1068,"t":{"73":{"position":[[6613,14],[7914,14],[8489,14]]}}}],["0:48/3:56",{"_index":3376,"t":{"594":{"position":[[2187,9]]}}}],["1",{"_index":178,"t":{"4":{"position":[[4734,2],[4758,2],[4828,2]]},"73":{"position":[[1338,2]]},"87":{"position":[[455,3]]},"118":{"position":[[754,1],[1472,1],[2412,1],[4536,1]]},"149":{"position":[[1279,3],[2089,3]]},"151":{"position":[[697,2]]},"184":{"position":[[751,2]]},"186":{"position":[[1986,1],[3416,1]]},"202":{"position":[[1654,3],[2986,3]]},"412":{"position":[[753,4]]},"457":{"position":[[1776,2],[1949,1]]},"483":{"position":[[2744,2],[2807,2]]}}}],["1.00",{"_index":1366,"t":{"118":{"position":[[4504,4]]}}}],["1.19",{"_index":1376,"t":{"118":{"position":[[4705,4]]}}}],["1.5",{"_index":181,"t":{"4":{"position":[[4780,3],[4850,3]]}}}],["10",{"_index":209,"t":{"4":{"position":[[5481,2]]},"18":{"position":[[2359,2],[4334,2]]},"27":{"position":[[991,2]]},"118":{"position":[[2562,2],[4670,5]]},"435":{"position":[[357,2],[612,2]]}}}],["10'",{"_index":506,"t":{"18":{"position":[[3898,4]]}}}],["10,000",{"_index":2893,"t":{"459":{"position":[[733,7]]},"461":{"position":[[130,7]]}}}],["10.2mb",{"_index":441,"t":{"18":{"position":[[683,6]]}}}],["10.7",{"_index":1800,"t":{"188":{"position":[[23,4]]}}}],["100",{"_index":436,"t":{"18":{"position":[[660,3],[825,3],[1049,3]]},"105":{"position":[[2194,4]]}}}],["1000",{"_index":438,"t":{"18":{"position":[[670,4],[835,4],[1059,4],[4040,4]]},"293":{"position":[[1571,4]]}}}],["1000:1000",{"_index":3121,"t":{"545":{"position":[[321,9]]}}}],["10k",{"_index":440,"t":{"18":{"position":[[679,3],[844,3],[1071,3]]}}}],["11026149",{"_index":1038,"t":{"73":{"position":[[4202,8],[4608,8]]}}}],["11036791",{"_index":1041,"t":{"73":{"position":[[4341,8],[4747,8]]}}}],["12",{"_index":2595,"t":{"369":{"position":[[634,2],[824,3],[917,3],[972,3]]}}}],["12.38",{"_index":1313,"t":{"118":{"position":[[1695,5],[1796,5]]}}}],["123",{"_index":3052,"t":{"517":{"position":[[726,4]]}}}],["1234",{"_index":2136,"t":{"273":{"position":[[497,4]]}}}],["12345678",{"_index":896,"t":{"62":{"position":[[506,10]]},"71":{"position":[[359,10]]}}}],["127.0.0.1",{"_index":2261,"t":{"303":{"position":[[2302,9],[3065,10]]},"335":{"position":[[379,9]]}}}],["127.0.0.1:5079",{"_index":2280,"t":{"303":{"position":[[4318,14]]}}}],["127.0.0.1:5079:8080",{"_index":2277,"t":{"303":{"position":[[3903,19]]}}}],["128522478",{"_index":1879,"t":{"196":{"position":[[482,9]]}}}],["12:32:21.417",{"_index":2782,"t":{"435":{"position":[[360,12]]}}}],["12:32:21.418",{"_index":2790,"t":{"435":{"position":[[615,12]]}}}],["13:01:48",{"_index":1371,"t":{"118":{"position":[[4576,8]]}}}],["13:01:51",{"_index":1373,"t":{"118":{"position":[[4604,8]]}}}],["13b0",{"_index":2309,"t":{"309":{"position":[[576,10]]}}}],["16",{"_index":3432,"t":{"616":{"position":[[240,2]]}}}],["160kb",{"_index":437,"t":{"18":{"position":[[664,5]]}}}],["1641787/discord",{"_index":1039,"t":{"73":{"position":[[4211,15],[4617,15]]}}}],["1642030/ex",{"_index":1042,"t":{"73":{"position":[[4350,11],[4756,11]]}}}],["166276334",{"_index":1874,"t":{"196":{"position":[[349,9]]}}}],["1673e4d57ce7",{"_index":2628,"t":{"369":{"position":[[1205,12]]}}}],["17",{"_index":2596,"t":{"369":{"position":[[637,2]]}}}],["192.168.0.100",{"_index":2785,"t":{"435":{"position":[[510,15],[721,15]]},"545":{"position":[[192,15]]},"553":{"position":[[203,13],[635,13]]}}}],["192.168.0.100:6600",{"_index":2164,"t":{"281":{"position":[[1785,21],[3156,21]]}}}],["192.168.0.100:6655",{"_index":1090,"t":{"73":{"position":[[9808,20]]}}}],["192.168.0.101",{"_index":301,"t":{"10":{"position":[[635,13]]},"333":{"position":[[1732,15],[3062,15]]}}}],["192.168.0.101:3456",{"_index":1933,"t":{"206":{"position":[[863,18]]},"212":{"position":[[845,18]]},"271":{"position":[[1161,18]]}}}],["192.168.0.101:4000/my/subfold",{"_index":311,"t":{"10":{"position":[[993,31]]}}}],["192.168.0.105:6655",{"_index":1095,"t":{"85":{"position":[[2093,20],[3469,20]]}}}],["192.168.0.150",{"_index":2216,"t":{"297":{"position":[[1430,15]]},"301":{"position":[[2302,16],[3730,16]]}}}],["192.168.0.233:32400",{"_index":1713,"t":{"174":{"position":[[2024,22],[3039,22]]},"176":{"position":[[1089,21],[2319,22]]}}}],["192.168.0.xxx",{"_index":2262,"t":{"303":{"position":[[2345,15]]}}}],["19t10:05:42",{"_index":2828,"t":{"444":{"position":[[53,11],[140,11],[207,11]]}}}],["1:1",{"_index":2311,"t":{"311":{"position":[[238,3]]}}}],["1:50/2:40",{"_index":1640,"t":{"160":{"position":[[803,11]]}}}],["1c78da79",{"_index":3437,"t":{"616":{"position":[[553,8]]}}}],["1gb",{"_index":976,"t":{"73":{"position":[[893,6]]}}}],["1m:20",{"_index":1641,"t":{"160":{"position":[[862,7]]}}}],["1mb",{"_index":439,"t":{"18":{"position":[[675,3]]}}}],["1psidts=sidt",{"_index":2447,"t":{"343":{"position":[[1108,13]]},"345":{"position":[[1988,13],[3468,13]]}}}],["2",{"_index":479,"t":{"18":{"position":[[2444,1],[4419,1]]},"73":{"position":[[2756,2],[4175,1],[4314,1],[4581,1],[4720,1]]},"87":{"position":[[312,1],[459,3]]},"118":{"position":[[854,1],[1674,1]]},"149":{"position":[[1352,3],[2116,3]]},"301":{"position":[[2280,3],[3708,3]]},"303":{"position":[[5075,2]]},"457":{"position":[[1861,2],[2049,1],[3304,1]]}}}],["2.7",{"_index":2890,"t":{"459":{"position":[[674,3]]},"461":{"position":[[71,3]]}}}],["20",{"_index":1661,"t":{"166":{"position":[[1590,2],[1626,3]]}}}],["200",{"_index":584,"t":{"29":{"position":[[128,3]]},"459":{"position":[[703,3]]},"461":{"position":[[100,3]]},"581":{"position":[[268,3]]}}}],["2023",{"_index":2792,"t":{"435":{"position":[[953,4]]},"444":{"position":[[45,4],[132,4],[199,4]]}}}],["2025",{"_index":2594,"t":{"369":{"position":[[628,5]]},"435":{"position":[[348,5],[603,5]]}}}],["2026",{"_index":1347,"t":{"118":{"position":[[3832,4],[3948,4],[4266,4],[4387,4]]},"303":{"position":[[546,4]]},"616":{"position":[[231,5]]}}}],["21",{"_index":1314,"t":{"118":{"position":[[1708,2],[1765,2]]}}}],["22t11:16:12",{"_index":2794,"t":{"435":{"position":[[961,11]]}}}],["25",{"_index":2451,"t":{"343":{"position":[[1365,3]]}}}],["25th",{"_index":3004,"t":{"483":{"position":[[1758,4]]}}}],["26fe9c5dc6374542adc4f4d5e8352838",{"_index":1734,"t":{"176":{"position":[[910,34],[2146,34]]}}}],["28c1b7b7",{"_index":2613,"t":{"369":{"position":[[1064,8]]}}}],["29.6mb",{"_index":447,"t":{"18":{"position":[[848,6]]}}}],["2hpsnjz88n",{"_index":1549,"t":{"149":{"position":[[3511,13]]},"153":{"position":[[2136,13],[3830,13]]}}}],["2x",{"_index":86,"t":{"4":{"position":[[1609,2]]}}}],["3",{"_index":217,"t":{"4":{"position":[[5682,2]]},"18":{"position":[[2220,1],[2874,1],[3137,2],[3243,1],[3396,2],[3416,2],[4731,1],[4899,1],[4965,2],[4997,1],[5152,2],[5172,2]]},"27":{"position":[[1366,2]]},"87":{"position":[[463,3]]},"149":{"position":[[1379,3],[2183,3]]},"349":{"position":[[1889,1],[3263,1]]},"457":{"position":[[1951,2],[2132,1],[3306,1]]}}}],["3.7",{"_index":3062,"t":{"528":{"position":[[80,5]]}}}],["30",{"_index":174,"t":{"4":{"position":[[4695,3]]},"18":{"position":[[2425,2],[2957,2],[3288,2],[3373,3],[4400,2],[4813,2],[5045,2],[5129,3]]},"31":{"position":[[699,3]]}}}],["343b",{"_index":2626,"t":{"369":{"position":[[1195,4]]}}}],["35",{"_index":1543,"t":{"149":{"position":[[2850,2]]}}}],["355a",{"_index":2614,"t":{"369":{"position":[[1073,4]]}}}],["356kb",{"_index":445,"t":{"18":{"position":[[829,5]]}}}],["3600",{"_index":474,"t":{"18":{"position":[[2352,4],[4327,4]]}}}],["36759a8a",{"_index":2608,"t":{"369":{"position":[[1008,8]]}}}],["37",{"_index":2888,"t":{"459":{"position":[[637,2]]},"461":{"position":[[34,2]]}}}],["3be671f5ea2b",{"_index":785,"t":{"46":{"position":[[1819,14],[3229,14]]},"114":{"position":[[1925,14],[3375,14]]},"174":{"position":[[1377,12],[2446,14],[3459,14]]},"176":{"position":[[1650,14],[2923,14]]},"220":{"position":[[2476,14],[3886,14]]},"261":{"position":[[2248,14],[3698,14]]},"623":{"position":[[519,14],[834,14]]}}}],["3mb",{"_index":446,"t":{"18":{"position":[[840,3]]}}}],["3rd",{"_index":1208,"t":{"105":{"position":[[1800,3]]},"457":{"position":[[2759,3]]}}}],["3s",{"_index":1374,"t":{"118":{"position":[[4659,2]]}}}],["3x",{"_index":89,"t":{"4":{"position":[[1630,2]]}}}],["4",{"_index":218,"t":{"4":{"position":[[5693,2]]},"27":{"position":[[1377,2]]},"118":{"position":[[3809,1],[3925,1],[4243,1],[4364,1]]},"149":{"position":[[1461,3],[2332,3]]},"166":{"position":[[1278,2]]},"303":{"position":[[1072,1],[4152,1]]},"457":{"position":[[2051,2]]}}}],["40",{"_index":1660,"t":{"166":{"position":[[1523,3],[1560,2]]}}}],["400",{"_index":1380,"t":{"118":{"position":[[4905,4]]}}}],["401",{"_index":2825,"t":{"441":{"position":[[58,3],[142,3]]}}}],["403",{"_index":2248,"t":{"303":{"position":[[751,3]]},"425":{"position":[[3282,3],[3294,3]]},"441":{"position":[[65,3]]}}}],["4303",{"_index":2951,"t":{"476":{"position":[[3129,4]]}}}],["4676",{"_index":2620,"t":{"369":{"position":[[1133,4]]}}}],["47da",{"_index":2610,"t":{"369":{"position":[[1022,4]]}}}],["48",{"_index":3375,"t":{"594":{"position":[[2179,2]]}}}],["48475231",{"_index":1876,"t":{"196":{"position":[[392,8]]}}}],["48b1",{"_index":2615,"t":{"369":{"position":[[1078,4]]}}}],["49d7",{"_index":3254,"t":{"584":{"position":[[714,4]]}}}],["4ac0dfa2348f",{"_index":2953,"t":{"476":{"position":[[3139,14]]}}}],["4dhe",{"_index":1478,"t":{"143":{"position":[[2402,4],[3782,4]]},"325":{"position":[[955,4],[1164,4],[1394,4],[3573,4],[5011,4]]}}}],["4pe7",{"_index":783,"t":{"46":{"position":[[1809,4],[3219,4]]},"114":{"position":[[1915,4],[3365,4]]},"174":{"position":[[1367,4],[2436,4],[3449,4]]},"176":{"position":[[1640,4],[2913,4]]},"220":{"position":[[2466,4],[3876,4]]},"261":{"position":[[2238,4],[3688,4]]},"623":{"position":[[509,4],[824,4]]}}}],["4rft5",{"_index":633,"t":{"31":{"position":[[817,5]]}}}],["5",{"_index":206,"t":{"4":{"position":[[5458,2],[5705,1]]},"18":{"position":[[2436,1],[4411,1]]},"27":{"position":[[968,2],[1389,1]]},"40":{"position":[[126,1]]},"149":{"position":[[1625,3]]},"303":{"position":[[1077,3]]},"459":{"position":[[656,1]]},"461":{"position":[[53,1]]},"483":{"position":[[2065,24]]}}}],["50",{"_index":176,"t":{"4":{"position":[[4710,2]]},"120":{"position":[[1151,2]]},"166":{"position":[[1213,4]]}}}],["500",{"_index":587,"t":{"29":{"position":[[165,3],[335,3],[467,3],[629,3],[732,3]]}}}],["512m",{"_index":1000,"t":{"73":{"position":[[2214,4]]},"77":{"position":[[813,4]]}}}],["52",{"_index":1346,"t":{"118":{"position":[[3827,2],[3943,2],[4261,2],[4382,2]]}}}],["521",{"_index":3429,"t":{"614":{"position":[[470,4]]}}}],["5353/udp",{"_index":1968,"t":{"216":{"position":[[955,9]]}}}],["6",{"_index":2860,"t":{"457":{"position":[[1859,1]]}}}],["6.28mb",{"_index":450,"t":{"18":{"position":[[1064,6]]}}}],["60",{"_index":1329,"t":{"118":{"position":[[2629,2],[2693,2]]},"151":{"position":[[495,2]]},"153":{"position":[[2396,2],[4090,2]]},"174":{"position":[[1784,2],[2815,2]]},"178":{"position":[[2558,2],[3762,2]]},"305":{"position":[[2033,2],[3507,2]]}}}],["60f84fdc0cab",{"_index":2612,"t":{"369":{"position":[[1032,12]]}}}],["61.3mb",{"_index":451,"t":{"18":{"position":[[1075,6]]}}}],["6600",{"_index":2153,"t":{"279":{"position":[[188,6]]}}}],["6644",{"_index":2195,"t":{"293":{"position":[[1594,5]]}}}],["6655:6655",{"_index":1073,"t":{"73":{"position":[[7864,11]]}}}],["6680",{"_index":2124,"t":{"271":{"position":[[902,4]]}}}],["684kb",{"_index":449,"t":{"18":{"position":[[1053,5]]}}}],["6901:6901",{"_index":998,"t":{"73":{"position":[[2194,9]]},"77":{"position":[[793,9]]}}}],["6969",{"_index":3242,"t":{"581":{"position":[[673,4]]},"592":{"position":[[653,7]]}}}],["7",{"_index":207,"t":{"4":{"position":[[5469,2]]},"18":{"position":[[4197,1]]},"27":{"position":[[979,2]]}}}],["70",{"_index":1381,"t":{"118":{"position":[[4922,3]]}}}],["700",{"_index":1012,"t":{"73":{"position":[[2420,3]]},"77":{"position":[[1019,3]]}}}],["75b8eb8080ef",{"_index":2617,"t":{"369":{"position":[[1088,12]]}}}],["7905",{"_index":2169,"t":{"283":{"position":[[416,5]]}}}],["7ef1",{"_index":2619,"t":{"369":{"position":[[1128,4]]}}}],["8190211179716453570",{"_index":873,"t":{"60":{"position":[[1022,22],[2118,22]]},"66":{"position":[[2377,21],[3795,21]]},"85":{"position":[[2052,22],[3428,22]]}}}],["846b",{"_index":3255,"t":{"584":{"position":[[719,4]]}}}],["882e",{"_index":2621,"t":{"369":{"position":[[1138,4]]}}}],["88e5",{"_index":784,"t":{"46":{"position":[[1814,4],[3224,4]]},"114":{"position":[[1920,4],[3370,4]]},"174":{"position":[[1372,4],[2441,4],[3454,4]]},"176":{"position":[[1645,4],[2918,4]]},"220":{"position":[[2471,4],[3881,4]]},"261":{"position":[[2243,4],[3693,4]]},"623":{"position":[[514,4],[829,4]]}}}],["8910....6jqupl.apps.googleusercontent.com",{"_index":2463,"t":{"343":{"position":[[2647,44],[3876,44]]}}}],["891098404....apps.googleusercontent.com",{"_index":2497,"t":{"345":{"position":[[2036,42],[3516,42]]}}}],["896225281",{"_index":1877,"t":{"196":{"position":[[436,9],[813,11]]}}}],["8dcc73a59",{"_index":2799,"t":{"435":{"position":[[1082,10]]}}}],["90",{"_index":2967,"t":{"479":{"position":[[206,3],[228,2],[253,2]]}}}],["9078",{"_index":297,"t":{"10":{"position":[[316,4]]},"435":{"position":[[2259,4]]},"543":{"position":[[940,5]]},"545":{"position":[[144,4]]},"549":{"position":[[2355,5]]},"553":{"position":[[161,4]]}}}],["9078:9078",{"_index":1704,"t":{"174":{"position":[[1486,11]]},"178":{"position":[[1652,11]]},"347":{"position":[[532,11]]},"384":{"position":[[1052,11]]},"472":{"position":[[2132,11]]},"543":{"position":[[1007,11]]},"545":{"position":[[1070,9]]},"555":{"position":[[496,11]]}}}],["9156",{"_index":782,"t":{"46":{"position":[[1804,4],[3214,4]]},"114":{"position":[[1910,4],[3360,4]]},"174":{"position":[[1362,4],[2431,4],[3444,4]]},"176":{"position":[[1635,4],[2908,4]]},"220":{"position":[[2461,4],[3871,4]]},"261":{"position":[[2233,4],[3683,4]]},"623":{"position":[[504,4],[819,4]]}}}],["9390",{"_index":2627,"t":{"369":{"position":[[1200,4]]}}}],["984e",{"_index":2950,"t":{"476":{"position":[[3124,4]]}}}],["99",{"_index":1502,"t":{"149":{"position":[[261,3]]}}}],["99/year",{"_index":1507,"t":{"149":{"position":[[511,11],[3027,10]]}}}],["9980:9980",{"_index":2515,"t":{"347":{"position":[[852,11]]}}}],["9a51",{"_index":2952,"t":{"476":{"position":[[3134,4]]}}}],["9c5bb56bd6540c756fbf481ebd9c5c40",{"_index":133,"t":{"4":{"position":[[3060,34]]}}}],["9th",{"_index":2246,"t":{"303":{"position":[[542,3]]}}}],["__secur",{"_index":2446,"t":{"343":{"position":[[1098,9]]},"345":{"position":[[1978,9],[3458,9]]}}}],["_id",{"_index":3450,"t":{"623":{"position":[[95,3]]}}}],["_name",{"_index":3473,"t":{"631":{"position":[[204,5]]}}}],["_transforms=musicbrainz",{"_index":2930,"t":{"472":{"position":[[1001,24]]}}}],["_transforms=n",{"_index":2656,"t":{"384":{"position":[[115,19]]}}}],["a0d51240",{"_index":2618,"t":{"369":{"position":[[1119,8]]}}}],["a236",{"_index":2611,"t":{"369":{"position":[[1027,4]]}}}],["a89cba1569901a0671d5a9875fed4be1",{"_index":189,"t":{"4":{"position":[[5004,35]]},"8":{"position":[[1033,35]]},"91":{"position":[[1982,35],[3454,35]]},"151":{"position":[[2965,35]]},"174":{"position":[[1635,35],[2666,35]]},"178":{"position":[[2409,35],[3613,35]]},"269":{"position":[[2294,35],[3766,35]]},"305":{"position":[[1884,35],[3358,35]]},"549":{"position":[[2075,35]]}}}],["abcc",{"_index":2625,"t":{"369":{"position":[[1190,4]]}}}],["abcd",{"_index":559,"t":{"27":{"position":[[510,6]]}}}],["abil",{"_index":2243,"t":{"303":{"position":[[355,7]]},"351":{"position":[[36,7]]},"599":{"position":[[2008,7]]}}}],["abov",{"_index":226,"t":{"6":{"position":[[28,5]]},"31":{"position":[[889,6]]},"57":{"position":[[528,5]]},"110":{"position":[[680,6]]},"118":{"position":[[1956,5],[2040,7],[3290,5],[3388,6],[3522,5],[3696,5],[4733,5]]},"134":{"position":[[20,5]]},"149":{"position":[[2787,6]]},"200":{"position":[[1325,5]]},"212":{"position":[[487,6]]},"230":{"position":[[1007,5]]},"283":{"position":[[330,6]]},"297":{"position":[[1659,5]]},"311":{"position":[[18,5]]},"355":{"position":[[33,5]]},"365":{"position":[[824,5]]},"384":{"position":[[32,5]]},"472":{"position":[[32,5]]},"476":{"position":[[728,5],[2712,5]]},"481":{"position":[[1164,5]]},"509":{"position":[[312,6]]},"524":{"position":[[398,5]]},"535":{"position":[[1036,5]]},"545":{"position":[[412,5]]},"565":{"position":[[868,5]]},"616":{"position":[[576,5]]},"618":{"position":[[759,6]]},"627":{"position":[[231,5]]},"647":{"position":[[377,5]]}}}],["above...aft",{"_index":3168,"t":{"557":{"position":[[796,13]]}}}],["absolut",{"_index":3072,"t":{"533":{"position":[[369,8]]}}}],["abstract",{"_index":2721,"t":{"421":{"position":[[325,8]]},"425":{"position":[[27,8]]}}}],["abstractcompon",{"_index":2729,"t":{"425":{"position":[[48,18]]},"584":{"position":[[1924,17]]}}}],["abstractsourc",{"_index":3307,"t":{"588":{"position":[[1230,15]]},"599":{"position":[[2702,14],[2844,14],[3522,14]]}}}],["abstractsource'",{"_index":3397,"t":{"599":{"position":[[1970,16]]}}}],["abuse/spam",{"_index":850,"t":{"57":{"position":[[393,10]]}}}],["acc",{"_index":1037,"t":{"73":{"position":[[4179,3],[4318,3],[4585,3],[4724,3]]}}}],["accept",{"_index":856,"t":{"57":{"position":[[564,10]]},"87":{"position":[[112,6],[260,6]]},"112":{"position":[[110,6]]},"136":{"position":[[21,6]]},"222":{"position":[[39,6]]},"224":{"position":[[1315,6],[2095,6],[2643,6]]},"226":{"position":[[176,7]]},"236":{"position":[[39,6],[258,6]]},"238":{"position":[[1292,6],[2078,6],[2501,6],[2623,6]]},"240":{"position":[[246,6]]},"244":{"position":[[635,6]]},"259":{"position":[[209,6]]},"267":{"position":[[177,6]]},"283":{"position":[[42,6]]},"303":{"position":[[1825,6]]},"327":{"position":[[1453,7]]},"490":{"position":[[1514,6]]},"584":{"position":[[1948,7]]},"586":{"position":[[82,6]]}}}],["access",{"_index":714,"t":{"44":{"position":[[523,6],[570,10],[1675,6]]},"50":{"position":[[118,6]]},"57":{"position":[[697,6]]},"64":{"position":[[133,11],[850,10],[4056,10]]},"73":{"position":[[2257,6],[5335,10]]},"77":{"position":[[856,6]]},"83":{"position":[[133,11],[709,10],[3848,10]]},"97":{"position":[[409,6]]},"105":{"position":[[1316,9]]},"107":{"position":[[145,6]]},"110":{"position":[[694,6],[923,6],[1477,6]]},"138":{"position":[[1310,9]]},"145":{"position":[[348,8]]},"147":{"position":[[34,6]]},"149":{"position":[[17,7]]},"160":{"position":[[461,10]]},"182":{"position":[[291,6]]},"184":{"position":[[332,6],[969,7],[1350,6]]},"186":{"position":[[447,6]]},"188":{"position":[[1525,10],[1856,10],[3501,6]]},"190":{"position":[[47,6]]},"232":{"position":[[735,8],[917,10]]},"251":{"position":[[740,8],[922,10]]},"289":{"position":[[66,6]]},"293":{"position":[[201,6],[429,6],[1056,6],[1377,6]]},"303":{"position":[[1349,6],[1565,6],[1662,6],[2206,6],[2977,10]]},"307":{"position":[[327,9]]},"321":{"position":[[66,6]]},"327":{"position":[[521,10],[607,11]]},"335":{"position":[[607,10],[698,9]]},"343":{"position":[[1420,6],[4516,6]]},"425":{"position":[[1869,10]]},"435":{"position":[[2012,6]]},"437":{"position":[[155,6],[222,10]]},"441":{"position":[[784,6],[827,6]]},"457":{"position":[[506,6]]},"543":{"position":[[826,6]]},"557":{"position":[[540,6]]},"565":{"position":[[611,6],[658,10],[1323,6]]},"581":{"position":[[656,8],[770,8]]},"647":{"position":[[323,8]]}}}],["accident",{"_index":1325,"t":{"118":{"position":[[1903,12]]},"483":{"position":[[485,12]]}}}],["account",{"_index":88,"t":{"4":{"position":[[1620,9],[1642,8]]},"44":{"position":[[60,7]]},"57":{"position":[[47,7]]},"87":{"position":[[75,7],[1218,7],[1270,8],[1299,7],[1341,7],[1504,7]]},"91":{"position":[[375,7],[443,7]]},"97":{"position":[[67,7],[156,8],[236,8],[426,7]]},"103":{"position":[[369,7],[428,7]]},"105":{"position":[[185,8],[230,7],[878,7],[994,7]]},"107":{"position":[[28,7],[115,7]]},"110":{"position":[[68,7],[119,7],[176,8],[217,7],[1448,7],[1559,7],[1641,7]]},"112":{"position":[[68,7],[296,7]]},"120":{"position":[[231,7],[271,7]]},"130":{"position":[[197,7],[265,7],[368,7],[495,7],[570,7]]},"138":{"position":[[183,8],[228,7],[876,7],[992,7]]},"140":{"position":[[51,8],[158,8]]},"143":{"position":[[142,7],[219,7],[276,8],[316,7],[927,7],[1006,7]]},"145":{"position":[[295,8]]},"149":{"position":[[383,8],[436,9],[673,8],[727,8],[2130,7],[2921,7],[3086,8],[3405,7]]},"174":{"position":[[165,7],[407,7]]},"176":{"position":[[490,8]]},"178":{"position":[[338,7],[566,7]]},"190":{"position":[[286,8]]},"196":{"position":[[50,8],[85,8],[156,8],[193,8],[323,9],[512,7],[880,8],[1014,7],[1072,7],[1101,9],[1156,7],[1186,7]]},"198":{"position":[[429,7],[1812,9],[3252,9]]},"222":{"position":[[228,8]]},"224":{"position":[[245,7],[295,7],[2596,7],[2751,7]]},"236":{"position":[[471,8]]},"257":{"position":[[404,7],[470,7]]},"259":{"position":[[395,7]]},"269":{"position":[[410,7],[485,7]]},"291":{"position":[[588,7],[677,7]]},"303":{"position":[[510,7],[668,8],[717,7],[834,7],[1023,7],[1161,7],[1185,7],[1371,8],[1588,7],[1813,7]]},"325":{"position":[[1835,7],[1921,7]]},"335":{"position":[[88,8]]},"343":{"position":[[1810,8]]},"457":{"position":[[2633,7]]},"557":{"position":[[1290,8],[3409,7],[3513,7],[4077,8]]},"565":{"position":[[1386,7],[1490,7]]}}}],["account'",{"_index":2011,"t":{"220":{"position":[[29,9]]},"259":{"position":[[36,9]]}}}],["account/us",{"_index":2079,"t":{"251":{"position":[[1036,13]]}}}],["account?meta",{"_index":1532,"t":{"149":{"position":[[1440,13]]}}}],["accountid",{"_index":1881,"t":{"196":{"position":[[659,9],[800,12],[1138,9],[1218,10]]}}}],["accumul",{"_index":3015,"t":{"483":{"position":[[2899,11]]}}}],["accur",{"_index":1560,"t":{"151":{"position":[[369,8]]},"166":{"position":[[976,10]]},"303":{"position":[[122,10]]},"313":{"position":[[548,8]]},"315":{"position":[[100,8],[443,8]]},"457":{"position":[[59,10]]},"476":{"position":[[6588,8]]},"490":{"position":[[18,9],[1079,8],[1390,8]]}}}],["accuraci",{"_index":2244,"t":{"303":{"position":[[411,8]]},"594":{"position":[[479,8]]}}}],["achiev",{"_index":825,"t":{"54":{"position":[[676,7]]},"365":{"position":[[424,7]]}}}],["achiv",{"_index":899,"t":{"64":{"position":[[405,6]]},"83":{"position":[[314,6]]}}}],["acquir",{"_index":941,"t":{"66":{"position":[[290,8]]},"347":{"position":[[905,7]]}}}],["act",{"_index":926,"t":{"64":{"position":[[2810,4]]},"83":{"position":[[2635,4]]},"447":{"position":[[296,6]]}}}],["action",{"_index":322,"t":{"12":{"position":[[78,7]]},"168":{"position":[[392,6]]},"182":{"position":[[719,6]]},"200":{"position":[[819,6]]}}}],["activ",{"_index":90,"t":{"4":{"position":[[1660,8]]},"42":{"position":[[606,7],[723,6]]},"44":{"position":[[38,8]]},"50":{"position":[[207,6]]},"52":{"position":[[268,6]]},"54":{"position":[[544,7],[850,10],[900,6],[1522,6],[1551,6]]},"60":{"position":[[268,6],[503,10],[1159,11],[1280,10],[1335,8],[1380,8],[1421,8],[1479,8],[1565,8],[1659,9],[1684,8],[1790,10],[1951,9]]},"66":{"position":[[307,6],[886,8]]},"81":{"position":[[73,8]]},"87":{"position":[[39,8]]},"97":{"position":[[39,8]]},"105":{"position":[[38,8]]},"112":{"position":[[39,8]]},"128":{"position":[[205,9]]},"130":{"position":[[281,8]]},"138":{"position":[[38,8]]},"145":{"position":[[107,8]]},"157":{"position":[[107,6],[140,6],[147,8],[172,6],[220,6],[227,8],[252,6],[259,8],[286,6],[293,8],[317,6],[324,8],[346,6],[353,8],[376,6],[407,6],[439,6],[518,6],[596,6],[626,6],[633,8],[676,6],[683,8],[710,6],[717,8],[739,6],[746,8],[771,6],[800,6],[807,8],[832,6],[839,8],[881,6],[888,8],[913,6],[977,6],[984,8],[1018,6],[1025,8],[1055,6],[1062,8],[1091,6]]},"160":{"position":[[168,6],[302,8],[644,8],[948,8]]},"162":{"position":[[164,8]]},"166":{"position":[[349,8],[596,9],[627,6],[663,8],[801,6],[866,8],[1089,8]]},"168":{"position":[[204,8],[377,9]]},"216":{"position":[[1635,8]]},"222":{"position":[[201,8]]},"236":{"position":[[439,8]]},"255":{"position":[[73,8]]},"267":{"position":[[72,8]]},"279":{"position":[[270,9]]},"297":{"position":[[476,8],[507,8],[783,9],[1923,8]]},"315":{"position":[[224,6],[299,6]]},"347":{"position":[[36,8]]},"553":{"position":[[373,8]]},"557":{"position":[[86,9],[560,8],[3206,8]]},"559":{"position":[[45,8]]},"565":{"position":[[87,8]]},"567":{"position":[[624,8]]},"581":{"position":[[848,8]]},"586":{"position":[[969,8]]},"633":{"position":[[52,8],[124,8],[2080,8]]}}}],["activity/scrobbl",{"_index":1418,"t":{"128":{"position":[[130,18]]}}}],["actual",{"_index":547,"t":{"25":{"position":[[197,6]]},"54":{"position":[[891,8]]},"118":{"position":[[1858,6]]},"151":{"position":[[1644,8]]},"303":{"position":[[251,6]]},"325":{"position":[[244,6]]},"363":{"position":[[681,6]]},"412":{"position":[[34,8]]},"441":{"position":[[658,6]]},"457":{"position":[[3142,8]]},"476":{"position":[[6792,8]]},"481":{"position":[[1716,6]]},"599":{"position":[[3940,8]]}}}],["ad",{"_index":377,"t":{"14":{"position":[[429,6],[498,5]]},"136":{"position":[[316,6]]},"168":{"position":[[603,6]]},"182":{"position":[[907,6]]},"200":{"position":[[1007,6]]},"275":{"position":[[196,6]]},"335":{"position":[[271,6]]},"357":{"position":[[485,6]]},"365":{"position":[[192,5]]},"459":{"position":[[438,6],[508,6]]},"466":{"position":[[442,5]]},"483":{"position":[[2880,5]]},"488":{"position":[[633,6]]},"631":{"position":[[531,6]]}}}],["add",{"_index":525,"t":{"20":{"position":[[430,3]]},"31":{"position":[[554,3]]},"62":{"position":[[385,3]]},"71":{"position":[[238,3]]},"73":{"position":[[1341,3],[1422,3],[1638,3],[1944,3],[2019,3],[2061,3],[6173,3],[6440,3],[8053,3],[8320,3],[9860,3]]},"77":{"position":[[21,3],[237,3],[543,3],[618,3],[660,3]]},"93":{"position":[[209,3],[503,3]]},"149":{"position":[[2362,3],[3434,3]]},"182":{"position":[[104,3]]},"196":{"position":[[652,3]]},"249":{"position":[[94,3],[107,3],[529,3]]},"293":{"position":[[1675,3]]},"297":{"position":[[697,3],[968,3]]},"303":{"position":[[1138,3],[5284,3]]},"311":{"position":[[441,3]]},"335":{"position":[[97,3]]},"343":{"position":[[959,3],[2082,3],[3228,3],[3712,3]]},"347":{"position":[[396,3]]},"351":{"position":[[501,4]]},"353":{"position":[[385,4],[804,4]]},"457":{"position":[[1166,4],[1487,3]]},"470":{"position":[[0,3],[769,4],[1204,3]]},"472":{"position":[[470,4],[566,4],[674,4],[749,4]]},"483":{"position":[[2363,3],[2797,3]]},"490":{"position":[[1249,3]]},"509":{"position":[[319,3]]},"543":{"position":[[2366,3]]},"557":{"position":[[216,3],[837,3],[2288,4],[2660,3],[3586,3]]},"559":{"position":[[433,3],[1015,3],[1158,3],[1300,3],[1438,3],[1646,3]]},"561":{"position":[[166,3]]},"563":{"position":[[153,3],[296,3],[438,3],[576,3],[784,3]]},"565":{"position":[[905,3],[1541,3],[1967,3],[2264,3]]},"573":{"position":[[172,3]]},"584":{"position":[[1152,3],[1633,3]]},"588":{"position":[[220,3],[578,3]]},"592":{"position":[[257,3]]},"623":{"position":[[69,3],[312,3],[596,3],[949,3],[1097,3]]},"627":{"position":[[735,3],[1288,3]]}}}],["add/substitut",{"_index":3194,"t":{"565":{"position":[[846,14]]}}}],["addit",{"_index":222,"t":{"4":{"position":[[5850,10]]},"50":{"position":[[292,11],[356,10]]},"60":{"position":[[304,10],[1183,10]]},"105":{"position":[[2239,10]]},"130":{"position":[[349,10]]},"168":{"position":[[288,10]]},"188":{"position":[[721,10]]},"200":{"position":[[1663,10]]},"216":{"position":[[1449,10],[1523,10]]},"293":{"position":[[1118,10]]},"297":{"position":[[1515,10],[1976,10]]},"378":{"position":[[144,8],[734,10]]},"391":{"position":[[160,10]]},"423":{"position":[[496,10]]},"425":{"position":[[859,10]]},"435":{"position":[[1572,10]]},"466":{"position":[[354,10],[395,11],[975,10]]},"476":{"position":[[5331,10]]},"483":{"position":[[665,10]]},"515":{"position":[[111,10]]},"543":{"position":[[416,10]]}}}],["addition",{"_index":612,"t":{"31":{"position":[[349,13]]},"54":{"position":[[699,13]]},"60":{"position":[[211,13]]},"73":{"position":[[5730,13],[7116,13],[9375,13]]},"168":{"position":[[509,13]]},"182":{"position":[[836,13]]},"200":{"position":[[936,13]]},"483":{"position":[[1077,12],[1834,13]]},"553":{"position":[[604,13]]},"592":{"position":[[213,13]]},"594":{"position":[[984,12]]},"599":{"position":[[3106,12]]},"614":{"position":[[390,13]]}}}],["additionalallowedlibrarytyp",{"_index":1805,"t":{"188":{"position":[[906,29],[5314,32],[7143,32]]}}}],["additionalconfig",{"_index":3294,"t":{"588":{"position":[[452,19]]}}}],["additon",{"_index":2480,"t":{"343":{"position":[[5044,7]]}}}],["address",{"_index":732,"t":{"44":{"position":[[1636,7]]},"279":{"position":[[175,7]]},"301":{"position":[[23,7],[455,7]]},"303":{"position":[[2291,7]]},"435":{"position":[[484,8],[1830,7]]},"437":{"position":[[130,7],[388,9],[458,7]]},"565":{"position":[[1284,7]]}}}],["address/ip",{"_index":2281,"t":{"303":{"position":[[4342,10]]}}}],["addsourc",{"_index":3304,"t":{"588":{"position":[[1125,9]]}}}],["adgaurd",{"_index":2822,"t":{"439":{"position":[[1048,8]]}}}],["adher",{"_index":753,"t":{"46":{"position":[[808,7],[1448,7],[2326,7],[2844,7]]},"66":{"position":[[1305,7],[1953,7],[2839,7],[3359,7]]},"85":{"position":[[1064,7],[1712,7],[2556,7],[3076,7]]},"91":{"position":[[973,7],[1617,7],[2557,7],[3076,7]]},"95":{"position":[[746,7],[1390,7],[2238,7],[2757,7]]},"103":{"position":[[1071,7],[1719,7],[2618,7],[3138,7]]},"110":{"position":[[1996,7],[2644,7],[3553,7],[4073,7]]},"114":{"position":[[864,7],[1532,7],[2450,7],[2975,7]]},"143":{"position":[[1359,7],[2003,7],[2851,7],[3370,7]]},"153":{"position":[[1115,7],[1775,7],[2937,7],[3460,7]]},"186":{"position":[[878,7],[1534,7],[2432,7],[2954,7]]},"188":{"position":[[4011,7],[4663,7],[5960,7],[6481,7]]},"198":{"position":[[899,7],[1543,7],[2451,7],[2970,7]]},"202":{"position":[[735,7],[1383,7],[2183,7],[2703,7]]},"208":{"position":[[908,7],[1552,7],[2377,7],[2896,7]]},"214":{"position":[[872,7],[1508,7],[2348,7],[2865,7]]},"218":{"position":[[1228,7],[1888,7],[2733,7],[3256,7]]},"220":{"position":[[1212,7],[2105,7],[2983,7],[3501,7]]},"234":{"position":[[987,7],[1651,7],[2441,7],[2965,7]]},"253":{"position":[[1060,7],[1720,7],[2519,7],[3042,7]]},"257":{"position":[[1134,7],[2041,7],[2940,7],[3460,7]]},"261":{"position":[[913,7],[1855,7],[2773,7],[3298,7]]},"265":{"position":[[788,7],[1688,7],[2536,7],[3055,7]]},"269":{"position":[[1029,7],[1929,7],[2869,7],[3388,7]]},"277":{"position":[[1103,7],[1747,7],[2589,7],[3108,7]]},"281":{"position":[[836,7],[1468,7],[2307,7],[2823,7]]},"285":{"position":[[857,7],[1513,7],[2356,7],[2878,7]]},"291":{"position":[[1032,7],[1939,7],[2848,7],[3368,7]]},"295":{"position":[[870,7],[1510,7],[2324,7],[2842,7]]},"301":{"position":[[1341,7],[1981,7],[2877,7],[3395,7]]},"305":{"position":[[886,7],[1534,7],[2476,7],[2996,7]]},"317":{"position":[[865,7],[1517,7],[2450,7],[2971,7]]},"325":{"position":[[2274,7],[3174,7],[4080,7],[4599,7]]},"329":{"position":[[755,7],[1387,7],[2177,7],[2693,7]]},"333":{"position":[[738,7],[1394,7],[2192,7],[2714,7]]},"341":{"position":[[809,7],[1477,7],[2305,7],[2830,7]]},"345":{"position":[[981,7],[1629,7],[2577,7],[3097,7]]},"349":{"position":[[839,7],[1491,7],[2333,7],[2854,7]]}}}],["admin",{"_index":786,"t":{"46":{"position":[[1846,8],[3256,8]]},"93":{"position":[[255,5],[341,5]]},"174":{"position":[[2473,8],[3486,8]]},"176":{"position":[[1677,8],[2950,8]]},"188":{"position":[[413,5]]},"220":{"position":[[2503,8],[3913,8]]},"565":{"position":[[2013,5],[2099,5]]},"623":{"position":[[546,8],[861,8]]}}}],["administr",{"_index":1764,"t":{"180":{"position":[[303,14]]},"184":{"position":[[1310,14]]},"188":{"position":[[123,14]]}}}],["advanc",{"_index":92,"t":{"4":{"position":[[1746,8]]},"149":{"position":[[1759,8]]},"206":{"position":[[455,8]]},"249":{"position":[[237,8]]},"313":{"position":[[248,8]]},"569":{"position":[[9,8]]}}}],["advantag",{"_index":967,"t":{"73":{"position":[[586,10]]},"543":{"position":[[2431,9]]},"594":{"position":[[932,9],[1253,9]]}}}],["adventur",{"_index":1077,"t":{"73":{"position":[[8865,12]]}}}],["affect",{"_index":688,"t":{"42":{"position":[[400,7]]},"303":{"position":[[343,6],[400,6]]},"339":{"position":[[192,7],[232,6]]},"343":{"position":[[4220,7]]},"357":{"position":[[642,6]]},"423":{"position":[[476,6]]},"472":{"position":[[541,6]]},"483":{"position":[[2936,6]]}}}],["after=network.target",{"_index":3223,"t":{"573":{"position":[[276,20]]}}}],["afterward",{"_index":524,"t":{"20":{"position":[[393,11]]},"441":{"position":[[1117,11]]}}}],["again",{"_index":1464,"t":{"140":{"position":[[369,5]]},"151":{"position":[[844,6],[983,5],[1294,5],[1558,6]]},"343":{"position":[[4663,5]]},"457":{"position":[[3198,6]]},"625":{"position":[[884,6]]}}}],["against",{"_index":653,"t":{"38":{"position":[[293,7],[566,7]]},"57":{"position":[[216,7],[998,7]]},"105":{"position":[[2006,7]]},"118":{"position":[[92,7],[3614,7],[4024,7]]},"123":{"position":[[309,8]]},"125":{"position":[[631,8]]},"134":{"position":[[335,7]]},"357":{"position":[[1590,7]]},"447":{"position":[[218,7]]},"481":{"position":[[228,7]]},"594":{"position":[[802,7]]},"599":{"position":[[2446,7],[4001,7]]}}}],["agent",{"_index":1898,"t":{"198":{"position":[[548,5]]},"309":{"position":[[27,5]]},"466":{"position":[[89,5]]}}}],["aggreg",{"_index":592,"t":{"29":{"position":[[238,10],[396,10]]}}}],["aggress",{"_index":1291,"t":{"118":{"position":[[1139,11]]},"134":{"position":[[72,12]]},"194":{"position":[[246,12],[397,12],[464,12]]},"472":{"position":[[736,10]]},"476":{"position":[[4166,10]]},"490":{"position":[[1567,12]]}}}],["aggressive/broad",{"_index":3023,"t":{"490":{"position":[[1348,16]]},"507":{"position":[[873,16]]}}}],["agnost",{"_index":1461,"t":{"140":{"position":[[115,8]]}}}],["agress",{"_index":3020,"t":{"490":{"position":[[148,11]]}}}],["aio",{"_index":25,"t":{"4":{"position":[[302,3],[1898,3],[2003,3],[3269,3],[3651,3],[3969,3],[4071,3],[4079,3],[4112,3],[5729,3],[5835,3],[6150,3]]},"8":{"position":[[19,3]]},"12":{"position":[[1424,3]]},"14":{"position":[[1038,3]]},"18":{"position":[[2455,3],[4430,3]]},"20":{"position":[[440,3]]},"27":{"position":[[218,3]]},"42":{"position":[[891,3],[984,3]]},"46":{"position":[[9,3]]},"66":{"position":[[9,3]]},"85":{"position":[[9,3]]},"91":{"position":[[9,3]]},"95":{"position":[[9,3]]},"103":{"position":[[9,3]]},"110":{"position":[[1061,3]]},"114":{"position":[[9,3]]},"143":{"position":[[585,3]]},"153":{"position":[[9,3]]},"166":{"position":[[1427,3]]},"168":{"position":[[663,3]]},"174":{"position":[[464,3],[2529,3]]},"176":{"position":[[123,3],[542,3],[1733,3]]},"178":{"position":[[597,3],[1774,3],[2991,3]]},"182":{"position":[[967,3]]},"186":{"position":[[9,3]]},"188":{"position":[[2119,3]]},"196":{"position":[[570,3]]},"198":{"position":[[9,3]]},"200":{"position":[[1067,3]]},"202":{"position":[[9,3]]},"208":{"position":[[9,3]]},"214":{"position":[[9,3]]},"218":{"position":[[9,3]]},"220":{"position":[[364,3],[1974,3]]},"234":{"position":[[9,3]]},"253":{"position":[[9,3]]},"257":{"position":[[9,3],[1906,3]]},"261":{"position":[[9,3],[1710,3]]},"265":{"position":[[9,3],[1555,3]]},"269":{"position":[[9,3],[1796,3]]},"277":{"position":[[9,3]]},"281":{"position":[[9,3]]},"285":{"position":[[9,3]]},"291":{"position":[[166,3],[1804,3]]},"295":{"position":[[9,3]]},"297":{"position":[[1355,3]]},"301":{"position":[[134,3]]},"305":{"position":[[9,3]]},"311":{"position":[[437,3],[717,3],[1194,3]]},"313":{"position":[[685,3]]},"317":{"position":[[9,3]]},"325":{"position":[[1458,3],[3041,3]]},"329":{"position":[[9,3]]},"333":{"position":[[9,3]]},"341":{"position":[[9,3]]},"345":{"position":[[9,3]]},"349":{"position":[[9,3]]},"361":{"position":[[40,3],[457,3],[1137,3],[1972,3]]},"387":{"position":[[13,3]]},"389":{"position":[[13,3]]},"466":{"position":[[193,3]]},"499":{"position":[[13,3]]},"501":{"position":[[101,3]]},"503":{"position":[[290,3]]},"505":{"position":[[198,3]]},"509":{"position":[[275,3],[476,3],[1055,3]]},"623":{"position":[[9,3]]},"627":{"position":[[146,3],[470,3],[640,3],[1261,3]]}}}],["airson",{"_index":1611,"t":{"155":{"position":[[167,9]]},"313":{"position":[[126,8],[239,8]]},"317":{"position":[[1800,9],[3265,9]]},"633":{"position":[[459,8]]}}}],["aka",{"_index":2987,"t":{"481":{"position":[[1104,3]]}}}],["album",{"_index":657,"t":{"38":{"position":[[354,5]]},"62":{"position":[[49,5]]},"64":{"position":[[28,5],[2753,5],[2949,5],[3095,7],[3567,5]]},"66":{"position":[[392,5],[625,5]]},"83":{"position":[[28,5],[2578,5],[2774,5],[2920,7],[3359,5]]},"85":{"position":[[652,5]]},"118":{"position":[[185,10]]},"136":{"position":[[229,5],[795,6],[1070,6]]},"151":{"position":[[1845,5],[1923,5],[2012,5],[2664,8]]},"153":{"position":[[751,5]]},"178":{"position":[[2168,8],[3367,8]]},"188":{"position":[[1472,5],[2084,5]]},"275":{"position":[[69,7],[118,5],[182,5],[212,5],[437,6]]},"277":{"position":[[674,5]]},"311":{"position":[[119,6]]},"327":{"position":[[1136,5],[1443,6]]},"351":{"position":[[150,5],[549,6]]},"363":{"position":[[148,5],[434,5],[448,8],[500,5]]},"367":{"position":[[580,8],[626,5],[758,8],[804,5],[923,8],[958,5],[1040,5]]},"369":{"position":[[853,5],[877,5],[932,5],[1001,6]]},"380":{"position":[[326,8],[377,5]]},"393":{"position":[[243,6]]},"395":{"position":[[282,7]]},"399":{"position":[[437,6]]},"404":{"position":[[19,6],[97,7]]},"410":{"position":[[26,8]]},"427":{"position":[[200,6]]},"457":{"position":[[2910,5]]},"459":{"position":[[667,6]]},"461":{"position":[[64,6]]},"470":{"position":[[696,8],[747,5]]},"476":{"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]]},"481":{"position":[[302,7],[365,5],[408,6],[473,5],[530,5],[796,6]]},"483":{"position":[[952,7],[1030,9],[1484,5],[1566,8],[1674,9],[1725,5],[1827,6],[1869,5],[2178,5],[2498,5],[3103,5]]},"488":{"position":[[471,6],[534,9],[884,6],[947,9]]},"490":{"position":[[179,6]]},"494":{"position":[[567,8]]},"501":{"position":[[344,9]]},"503":{"position":[[721,8]]},"505":{"position":[[441,9]]},"509":{"position":[[29,5],[740,9],[1319,9]]},"590":{"position":[[795,6]]}}}],["album/artist/titl",{"_index":2947,"t":{"476":{"position":[[2647,18]]}}}],["album/track",{"_index":2303,"t":{"309":{"position":[[317,11]]}}}],["albumartist",{"_index":2571,"t":{"363":{"position":[[375,15]]},"367":{"position":[[1046,11]]},"494":{"position":[[583,15]]},"503":{"position":[[737,15]]}}}],["albumblacklist",{"_index":2138,"t":{"275":{"position":[[355,17]]},"277":{"position":[[2130,17],[3504,17]]}}}],["albummbid",{"_index":2948,"t":{"476":{"position":[[3101,12],[3247,9]]}}}],["albumnam",{"_index":3323,"t":{"590":{"position":[[715,10],[802,10]]}}}],["albumweight",{"_index":3010,"t":{"483":{"position":[[2096,14],[2529,14],[2860,11]]},"507":{"position":[[1220,14]]}}}],["algorithm",{"_index":1289,"t":{"118":{"position":[[1057,9]]}}}],["alice.bsky.soci",{"_index":1223,"t":{"110":{"position":[[146,17],[3093,19],[4534,19]]},"143":{"position":[[246,17],[2355,20],[3735,20]]},"291":{"position":[[2388,19],[3829,19]]},"325":{"position":[[908,20],[1117,20],[1347,20],[3526,20],[4964,20]]}}}],["allow",{"_index":698,"t":{"42":{"position":[[1220,7]]},"46":{"position":[[1207,7]]},"60":{"position":[[579,7],[726,7],[781,5],[1812,7],[1874,5]]},"64":{"position":[[1559,8],[1614,8],[1714,8],[1801,8],[1874,8],[1985,8],[2130,8],[2201,8],[2252,8],[2304,8],[2404,8],[2475,8],[2530,8],[2634,8]]},"66":{"position":[[517,7],[782,7],[907,7],[1708,7]]},"83":{"position":[[1418,8],[1473,8],[1573,8],[1660,8],[1733,8],[1844,8],[1989,8],[2060,8],[2111,8],[2163,8],[2263,8],[2334,8],[2389,8],[2493,8]]},"85":{"position":[[544,7],[1467,7]]},"91":{"position":[[1374,7]]},"95":{"position":[[1147,7]]},"97":{"position":[[400,8]]},"103":{"position":[[1474,7]]},"110":{"position":[[2399,7]]},"114":{"position":[[1277,7]]},"116":{"position":[[47,6]]},"143":{"position":[[1760,7]]},"153":{"position":[[1524,7]]},"166":{"position":[[901,6]]},"186":{"position":[[1285,7]]},"188":{"position":[[623,7],[939,5],[1089,5],[3597,5],[4416,7]]},"198":{"position":[[1300,7]]},"202":{"position":[[1138,7]]},"208":{"position":[[1309,7]]},"210":{"position":[[167,5]]},"214":{"position":[[1269,7]]},"216":{"position":[[928,5],[1974,5],[2061,7],[2175,5],[2351,5]]},"218":{"position":[[1637,7]]},"220":{"position":[[1611,7]]},"224":{"position":[[3326,5]]},"234":{"position":[[1398,7]]},"238":{"position":[[3285,5]]},"253":{"position":[[1469,7]]},"257":{"position":[[1537,7]]},"261":{"position":[[1326,7]]},"265":{"position":[[1189,7]]},"269":{"position":[[1430,7]]},"273":{"position":[[32,5]]},"277":{"position":[[1504,7]]},"281":{"position":[[1231,7]]},"285":{"position":[[1264,7]]},"291":{"position":[[1435,7]]},"295":{"position":[[1269,7]]},"301":{"position":[[1740,7]]},"303":{"position":[[2238,6]]},"305":{"position":[[1289,7]]},"307":{"position":[[94,7],[398,5],[1338,7]]},"317":{"position":[[1270,7]]},"325":{"position":[[781,8],[1207,5],[2675,7]]},"329":{"position":[[1150,7]]},"333":{"position":[[1145,7]]},"341":{"position":[[397,5],[1222,7]]},"345":{"position":[[1384,7]]},"349":{"position":[[1244,7]]},"359":{"position":[[166,6]]},"361":{"position":[[1067,8]]},"425":{"position":[[351,5]]},"453":{"position":[[280,5]]},"481":{"position":[[482,7],[1217,5],[1384,5],[1800,5],[1866,5]]},"492":{"position":[[55,5],[106,5]]},"599":{"position":[[2587,8]]}}}],["allowed/deni",{"_index":2350,"t":{"325":{"position":[[469,14]]}}}],["allowmediatyp",{"_index":1810,"t":{"188":{"position":[[1133,15],[5366,18],[7195,18]]}}}],["allowunknownmedia",{"_index":1987,"t":{"216":{"position":[[2080,20],[2407,20]]}}}],["allowunknownmedia=fals",{"_index":2838,"t":{"453":{"position":[[231,24]]}}}],["along",{"_index":419,"t":{"18":{"position":[[338,5]]},"118":{"position":[[4148,5]]},"149":{"position":[[2396,5]]},"359":{"position":[[605,5]]},"545":{"position":[[939,5]]}}}],["alongsid",{"_index":2576,"t":{"365":{"position":[[230,9]]},"569":{"position":[[348,9]]},"579":{"position":[[90,9]]},"614":{"position":[[360,9]]}}}],["alphabet",{"_index":694,"t":{"42":{"position":[[835,14]]}}}],["alpin",{"_index":1974,"t":{"216":{"position":[[1120,7]]}}}],["alpine/socat",{"_index":1072,"t":{"73":{"position":[[7842,12]]}}}],["alreadi",{"_index":283,"t":{"8":{"position":[[1893,7]]},"38":{"position":[[113,7]]},"44":{"position":[[129,7]]},"93":{"position":[[38,7]]},"110":{"position":[[295,7]]},"140":{"position":[[180,7]]},"143":{"position":[[398,7]]},"224":{"position":[[3010,7]]},"238":{"position":[[2962,7]]},"303":{"position":[[2680,7]]},"353":{"position":[[271,7],[414,8],[652,7],[838,7]]},"357":{"position":[[153,7],[389,7],[495,7]]},"419":{"position":[[201,7]]},"447":{"position":[[200,7]]},"459":{"position":[[393,7]]},"476":{"position":[[77,7],[169,7],[4357,7]]},"522":{"position":[[140,7]]},"557":{"position":[[3141,7]]},"565":{"position":[[221,7],[1796,7]]},"599":{"position":[[472,7],[2366,7],[2454,7]]},"633":{"position":[[2515,7]]}}}],["altern",{"_index":807,"t":{"50":{"position":[[525,11]]},"222":{"position":[[275,11]]},"303":{"position":[[2936,14]]},"313":{"position":[[325,11]]},"476":{"position":[[6461,11]]},"483":{"position":[[239,11]]}}}],["although",{"_index":1194,"t":{"105":{"position":[[707,8]]},"138":{"position":[[705,8]]}}}],["alway",{"_index":326,"t":{"12":{"position":[[146,6]]},"46":{"position":[[959,6],[2477,6]]},"64":{"position":[[205,6],[1266,6],[2844,6]]},"66":{"position":[[1456,6],[2990,6]]},"83":{"position":[[1125,6],[2669,6]]},"85":{"position":[[1215,6],[2707,6]]},"91":{"position":[[1124,6],[2708,6]]},"95":{"position":[[897,6],[2389,6]]},"103":{"position":[[1222,6],[2769,6]]},"110":{"position":[[2147,6],[3704,6]]},"114":{"position":[[1015,6],[2601,6]]},"120":{"position":[[567,6],[587,6]]},"143":{"position":[[1510,6],[3002,6]]},"153":{"position":[[1266,6],[3088,6]]},"168":{"position":[[743,6]]},"182":{"position":[[1047,6]]},"186":{"position":[[1029,6],[2583,6]]},"188":{"position":[[4162,6],[6111,6]]},"198":{"position":[[1050,6],[2602,6]]},"200":{"position":[[1145,6]]},"202":{"position":[[886,6],[2334,6]]},"208":{"position":[[1059,6],[2528,6]]},"214":{"position":[[1023,6],[2499,6]]},"216":{"position":[[479,6],[1875,6],[2778,6],[2935,6]]},"218":{"position":[[1379,6],[2884,6]]},"220":{"position":[[1363,6],[3134,6]]},"234":{"position":[[1138,6],[2592,6]]},"253":{"position":[[1211,6],[2670,6]]},"257":{"position":[[1285,6],[3091,6]]},"261":{"position":[[1064,6],[2924,6]]},"265":{"position":[[939,6],[2687,6]]},"269":{"position":[[1180,6],[3020,6]]},"277":{"position":[[1254,6],[2740,6]]},"281":{"position":[[987,6],[2458,6]]},"285":{"position":[[1008,6],[2507,6]]},"291":{"position":[[1183,6],[2999,6]]},"295":{"position":[[1021,6],[2475,6]]},"301":{"position":[[1492,6],[3028,6]]},"303":{"position":[[4917,6]]},"305":{"position":[[1037,6],[2627,6]]},"317":{"position":[[1016,6],[2601,6]]},"325":{"position":[[2425,6],[4231,6]]},"329":{"position":[[906,6],[2328,6]]},"333":{"position":[[889,6],[2343,6]]},"341":{"position":[[960,6],[2456,6]]},"345":{"position":[[1132,6],[2728,6]]},"349":{"position":[[990,6],[2484,6]]},"363":{"position":[[405,6],[471,6],[532,6],[610,6]]},"367":{"position":[[1417,6]]},"380":{"position":[[348,6]]},"423":{"position":[[41,6]]},"470":{"position":[[718,6]]},"472":{"position":[[147,6]]},"476":{"position":[[705,6]]},"481":{"position":[[334,6]]},"483":{"position":[[461,6]]},"599":{"position":[[231,6],[445,6],[695,6],[2619,8]]},"614":{"position":[[159,6]]},"631":{"position":[[83,6]]}}}],["ambplayobject",{"_index":2765,"t":{"427":{"position":[[750,13]]}}}],["amount",{"_index":409,"t":{"18":{"position":[[44,6],[593,6],[731,6],[905,6],[1192,6]]},"166":{"position":[[1230,6]]},"459":{"position":[[1463,6]]},"463":{"position":[[367,6]]}}}],["and/or",{"_index":528,"t":{"22":{"position":[[33,6]]},"105":{"position":[[2028,6]]},"132":{"position":[[234,6]]},"162":{"position":[[50,6]]},"230":{"position":[[203,6]]},"232":{"position":[[565,6]]},"251":{"position":[[570,6]]},"327":{"position":[[1436,6]]},"363":{"position":[[141,6]]},"378":{"position":[[394,6]]},"553":{"position":[[344,6],[428,6]]},"584":{"position":[[2133,6]]},"594":{"position":[[1078,6]]},"599":{"position":[[39,6]]},"633":{"position":[[1743,6]]},"647":{"position":[[260,6]]}}}],["anecdot",{"_index":3017,"t":{"488":{"position":[[164,12]]}}}],["anniversari",{"_index":3005,"t":{"483":{"position":[[1763,11]]}}}],["annot",{"_index":3123,"t":{"545":{"position":[[439,12]]},"584":{"position":[[554,10]]}}}],["anoth",{"_index":1200,"t":{"105":{"position":[[1338,7]]},"138":{"position":[[1332,7]]},"412":{"position":[[194,7],[581,7],[644,7]]},"435":{"position":[[2288,7]]},"545":{"position":[[34,7]]}}}],["anotherbadterm",{"_index":2676,"t":{"397":{"position":[[463,17],[507,16],[595,14]]}}}],["anotherus",{"_index":1841,"t":{"188":{"position":[[5162,13],[6991,13]]}}}],["any/al",{"_index":1994,"t":{"216":{"position":[[3099,7]]},"476":{"position":[[2398,7]]}}}],["anyon",{"_index":860,"t":{"57":{"position":[[667,6]]},"303":{"position":[[1342,6]]},"307":{"position":[[311,6]]},"522":{"position":[[95,6]]}}}],["anyth",{"_index":589,"t":{"29":{"position":[[194,8]]},"54":{"position":[[1405,9]]},"103":{"position":[[2088,11],[2110,11],[3519,11],[3541,11]]},"151":{"position":[[1433,8]]},"230":{"position":[[297,8],[382,8]]},"242":{"position":[[105,8]]},"257":{"position":[[2410,11],[2432,11],[3841,11],[3863,11]]},"476":{"position":[[5385,8]]},"488":{"position":[[408,8],[821,8]]},"557":{"position":[[2007,9]]}}}],["anywher",{"_index":2557,"t":{"357":{"position":[[783,8]]},"633":{"position":[[94,9]]}}}],["apassword",{"_index":1945,"t":{"208":{"position":[[1927,11],[3284,11]]}}}],["apeen",{"_index":1035,"t":{"73":{"position":[[4149,5],[4555,5]]}}}],["api",{"_index":319,"t":{"12":{"position":[[54,3],[317,3],[647,3]]},"22":{"position":[[161,3]]},"25":{"position":[[204,4],[299,3],[315,3],[335,3],[347,3]]},"38":{"position":[[86,3]]},"44":{"position":[[167,3],[251,3],[1034,3]]},"52":{"position":[[158,4]]},"54":{"position":[[344,3],[411,3],[669,3]]},"57":{"position":[[516,3]]},"81":{"position":[[49,3]]},"87":{"position":[[1245,4],[1295,3],[1337,3],[1479,3]]},"91":{"position":[[335,3]]},"93":{"position":[[384,3],[533,3]]},"95":{"position":[[375,3]]},"97":{"position":[[232,3],[245,3],[304,4],[337,3]]},"110":{"position":[[430,3],[501,3],[516,4],[575,3],[737,3],[1388,3],[1411,3]]},"136":{"position":[[399,3]]},"145":{"position":[[85,3],[175,3],[344,3]]},"149":{"position":[[13,3],[114,3],[3226,3]]},"151":{"position":[[38,3],[557,3],[855,3],[1887,3]]},"153":{"position":[[542,3],[651,3]]},"157":{"position":[[876,4]]},"178":{"position":[[2025,7],[3224,7]]},"184":{"position":[[1279,4]]},"186":{"position":[[431,3]]},"188":{"position":[[49,3],[154,3],[302,3],[372,3],[618,4],[2613,3]]},"192":{"position":[[153,3]]},"226":{"position":[[192,3],[254,4]]},"228":{"position":[[553,3]]},"230":{"position":[[210,3]]},"234":{"position":[[586,3]]},"265":{"position":[[417,3]]},"269":{"position":[[370,3]]},"285":{"position":[[488,3]]},"291":{"position":[[528,3],[551,3]]},"297":{"position":[[40,3]]},"303":{"position":[[324,4]]},"311":{"position":[[819,7],[1296,7]]},"313":{"position":[[73,3],[630,4]]},"331":{"position":[[396,3]]},"335":{"position":[[109,3],[407,3],[500,3]]},"337":{"position":[[103,3],[376,3],[458,3]]},"343":{"position":[[1860,4],[3054,4],[3524,3]]},"349":{"position":[[450,3],[468,3]]},"361":{"position":[[407,3]]},"372":{"position":[[40,3]]},"415":{"position":[[317,3]]},"423":{"position":[[322,3]]},"435":{"position":[[393,5],[648,5],[832,3]]},"449":{"position":[[36,3]]},"459":{"position":[[1666,3]]},"466":{"position":[[45,3],[295,7],[455,3],[560,3],[864,7]]},"468":{"position":[[215,7]]},"476":{"position":[[1282,3]]},"486":{"position":[[44,3]]},"496":{"position":[[230,3]]},"499":{"position":[[115,7]]},"501":{"position":[[203,7]]},"503":{"position":[[392,7]]},"505":{"position":[[300,7]]},"507":{"position":[[524,7]]},"509":{"position":[[578,7],[1157,7]]},"543":{"position":[[2497,3]]},"549":{"position":[[1617,3],[2333,3]]},"557":{"position":[[201,3],[429,3],[3405,3],[3547,3]]},"559":{"position":[[263,3]]},"565":{"position":[[259,3],[343,3],[1382,3],[2142,3]]},"581":{"position":[[187,4],[196,4],[763,3],[832,3]]},"586":{"position":[[996,3]]},"590":{"position":[[101,3],[596,3]]},"592":{"position":[[706,8]]},"633":{"position":[[448,4],[1855,4]]}}}],["api.music.apple.com/v1/me/account",{"_index":1524,"t":{"149":{"position":[[1238,33],[2048,33]]}}}],["api/health",{"_index":591,"t":{"29":{"position":[[224,13],[605,11],[715,11]]},"581":{"position":[[243,11]]}}}],["api/health?name=mymaloja",{"_index":597,"t":{"29":{"position":[[438,25]]}}}],["api/health?type=spotifi",{"_index":596,"t":{"29":{"position":[[410,24]]}}}],["api/live/nowplaying/websocket",{"_index":1768,"t":{"182":{"position":[[142,31]]}}}],["api/metr",{"_index":627,"t":{"31":{"position":[[717,14]]}}}],["api/now",{"_index":3241,"t":{"581":{"position":[[492,8]]}}}],["api/rec",{"_index":3240,"t":{"581":{"position":[[414,11]]}}}],["apikey",{"_index":126,"t":{"4":{"position":[[2692,9],[2895,9],[3050,9],[5282,9],[6026,9]]},"8":{"position":[[587,9],[1023,9]]},"91":{"position":[[1972,9],[3444,9]]},"95":{"position":[[1776,9],[3156,9]]},"103":{"position":[[2078,9],[3509,9]]},"151":{"position":[[2955,9]]},"174":{"position":[[2206,9],[3227,9]]},"176":{"position":[[720,9],[900,9],[1220,9],[1406,9],[1934,9],[2136,9],[2483,9],[2687,9]]},"178":{"position":[[2880,9],[4083,9]]},"188":{"position":[[5055,9],[6884,9]]},"257":{"position":[[2400,9],[3831,9]]},"265":{"position":[[2074,9],[3454,9]]},"269":{"position":[[2284,9],[3756,9]]},"349":{"position":[[1854,9],[3228,9]]},"549":{"position":[[2065,9],[2267,9]]},"559":{"position":[[1844,9]]},"563":{"position":[[982,9]]}}}],["apikey/us",{"_index":2025,"t":{"224":{"position":[[511,12],[551,11],[926,11],[972,11],[1324,11],[1637,12],[1664,11],[2105,11],[2519,12],[2653,14],[2712,12],[2824,12]]},"232":{"position":[[1026,12]]},"234":{"position":[[353,12]]}}}],["apis/listenbrainz",{"_index":719,"t":{"44":{"position":[[742,18]]}}}],["app",{"_index":273,"t":{"8":{"position":[[1598,5]]},"50":{"position":[[4,3],[572,3]]},"52":{"position":[[252,3]]},"54":{"position":[[306,3],[1668,3]]},"60":{"position":[[190,4],[471,4],[1248,4]]},"62":{"position":[[19,3],[121,3]]},"68":{"position":[[287,3]]},"71":{"position":[[26,3],[76,3]]},"105":{"position":[[501,4],[566,4],[894,4],[1441,3]]},"138":{"position":[[139,3],[499,4],[564,4],[892,4],[1435,3]]},"140":{"position":[[285,3],[312,3]]},"143":{"position":[[972,3]]},"147":{"position":[[124,4]]},"188":{"position":[[260,3]]},"196":{"position":[[280,5]]},"216":{"position":[[640,3],[2368,3]]},"234":{"position":[[1926,5],[3248,5]]},"303":{"position":[[685,3],[1053,3],[1134,3],[1324,3],[1654,4],[1716,3],[1914,3],[1987,3],[2842,4],[5209,4]]},"325":{"position":[[1887,3]]},"369":{"position":[[668,5]]},"415":{"position":[[291,3]]},"435":{"position":[[105,3],[387,5],[642,5],[987,4]]},"444":{"position":[[78,5],[84,3],[166,5],[233,5]]},"453":{"position":[[17,3]]},"533":{"position":[[105,3]]},"535":{"position":[[95,4],[1062,3]]},"545":{"position":[[132,3]]},"551":{"position":[[98,3]]},"557":{"position":[[595,3]]},"633":{"position":[[13,3],[1216,4],[1757,3],[1947,4]]}}}],["app'",{"_index":2287,"t":{"303":{"position":[[5254,5]]}}}],["app.rockski",{"_index":1198,"t":{"105":{"position":[[1238,14]]}}}],["appdata%\\multi",{"_index":3147,"t":{"549":{"position":[[1237,15]]}}}],["appear",{"_index":1539,"t":{"149":{"position":[[2151,7]]},"151":{"position":[[1038,7]]},"457":{"position":[[831,6]]}}}],["append",{"_index":1199,"t":{"105":{"position":[[1271,8]]},"110":{"position":[[388,6]]},"138":{"position":[[1265,8]]},"143":{"position":[[534,6]]},"151":{"position":[[1891,7]]},"331":{"position":[[367,6]]},"425":{"position":[[615,6]]},"535":{"position":[[1005,6]]}}}],["appic",{"_index":1230,"t":{"110":{"position":[[505,10]]}}}],["appl",{"_index":1480,"t":{"145":{"position":[[26,5],[73,5],[163,5]]},"147":{"position":[[108,5]]},"149":{"position":[[102,5],[325,5],[367,5],[420,5],[487,5],[826,5],[2664,5],[2905,5],[3003,5],[3214,5],[3245,5],[3389,5]]},"151":{"position":[[26,5],[537,5],[1875,5],[2760,5]]},"153":{"position":[[530,5],[629,5],[2066,5],[3760,5]]},"157":{"position":[[95,5]]},"633":{"position":[[151,5]]}}}],["applealbumstip",{"_index":1588,"t":{"151":{"position":[[2632,17],[3179,17]]}}}],["applemus",{"_index":1607,"t":{"153":{"position":[[862,10],[1073,10],[1417,10],[1501,10],[1733,10],[2718,10],[2914,10],[3437,10],[4196,12]]}}}],["applemusic.json",{"_index":1540,"t":{"149":{"position":[[2426,15],[3468,15]]},"151":{"position":[[2706,15]]}}}],["applemusic_en",{"_index":1595,"t":{"153":{"position":[[267,17]]}}}],["applemusic_id",{"_index":1593,"t":{"153":{"position":[[127,13],[218,13]]}}}],["applemusic_interv",{"_index":1562,"t":{"151":{"position":[[453,21]]}}}],["applemusic_key_id",{"_index":1596,"t":{"153":{"position":[[329,17]]}}}],["applemusic_key_p8",{"_index":1598,"t":{"153":{"position":[[380,17]]}}}],["applemusic_media_user_token",{"_index":1599,"t":{"153":{"position":[[405,27]]}}}],["applemusic_nam",{"_index":1594,"t":{"153":{"position":[[186,15]]}}}],["applemusic_normalize_album",{"_index":1605,"t":{"153":{"position":[[678,26]]}}}],["applemusic_normalize_album=fals",{"_index":1586,"t":{"151":{"position":[[2232,32]]}}}],["applemusic_origin_head",{"_index":1601,"t":{"153":{"position":[[464,24]]}}}],["applemusic_recover_unchanged_top_histori",{"_index":1602,"t":{"153":{"position":[[555,40]]}}}],["applemusic_recover_unchanged_top_history=fals",{"_index":1581,"t":{"151":{"position":[[1789,46]]}}}],["applemusic_team_id",{"_index":1597,"t":{"153":{"position":[[354,18]]}}}],["applemusic_token",{"_index":1600,"t":{"153":{"position":[[440,16]]}}}],["appli",{"_index":341,"t":{"12":{"position":[[638,8]]},"151":{"position":[[2426,7]]},"178":{"position":[[1371,7]]},"220":{"position":[[1965,5]]},"257":{"position":[[1897,5]]},"261":{"position":[[1701,5]]},"265":{"position":[[1546,5]]},"269":{"position":[[1787,5]]},"291":{"position":[[1795,5]]},"325":{"position":[[3032,5]]},"363":{"position":[[41,5],[230,5],[309,5],[412,5],[478,5],[539,5],[617,5]]},"380":{"position":[[181,5],[260,5],[355,5]]},"384":{"position":[[50,7],[169,5],[195,7],[841,7]]},"470":{"position":[[551,5],[630,5],[725,5]]},"472":{"position":[[337,6],[372,8],[806,7],[920,7],[1060,5],[1086,7],[1882,7]]},"494":{"position":[[13,5],[234,8]]},"524":{"position":[[404,5]]},"627":{"position":[[105,7]]}}}],["applic",{"_index":637,"t":{"33":{"position":[[15,11]]},"38":{"position":[[481,11]]},"50":{"position":[[45,11],[241,11]]},"52":{"position":[[126,11],[290,11]]},"54":{"position":[[217,11]]},"62":{"position":[[235,11],[296,12],[337,11]]},"64":{"position":[[156,11],[444,11],[2681,11],[3465,11],[4096,11]]},"66":{"position":[[361,11]]},"68":{"position":[[186,11]]},"71":{"position":[[149,12],[190,11]]},"73":{"position":[[51,11],[175,12],[448,12],[551,11],[3468,11],[3841,12]]},"85":{"position":[[288,11]]},"87":{"position":[[142,12]]},"105":{"position":[[1346,11]]},"110":{"position":[[434,12],[1415,12]]},"112":{"position":[[140,12]]},"138":{"position":[[1340,11]]},"147":{"position":[[259,11]]},"166":{"position":[[441,11]]},"188":{"position":[[2986,11],[3110,11]]},"192":{"position":[[374,12]]},"216":{"position":[[1715,11],[1834,11],[2214,12],[2246,11],[2539,11],[2598,11],[2748,11],[2889,12]]},"218":{"position":[[687,11],[805,11]]},"222":{"position":[[69,12],[643,11]]},"228":{"position":[[287,11]]},"236":{"position":[[69,12]]},"259":{"position":[[239,12]]},"267":{"position":[[207,12]]},"291":{"position":[[555,12]]},"303":{"position":[[555,12]]},"313":{"position":[[32,11]]},"335":{"position":[[206,11]]},"343":{"position":[[2188,11],[2212,11]]},"419":{"position":[[128,11]]},"439":{"position":[[1151,11]]},"472":{"position":[[198,12]]},"557":{"position":[[814,11]]},"639":{"position":[[15,11]]},"647":{"position":[[395,10]]}}}],["applicationid",{"_index":872,"t":{"60":{"position":[[1005,16],[2101,16]]},"62":{"position":[[489,16]]},"66":{"position":[[2360,16],[3778,16]]},"71":{"position":[[342,16]]},"85":{"position":[[2035,16],[3411,16]]}}}],["apppassword",{"_index":1475,"t":{"143":{"position":[[2376,14],[3756,14]]},"325":{"position":[[929,14],[1138,14],[1368,14],[3547,14],[4985,14]]}}}],["appriori",{"_index":1785,"t":{"184":{"position":[[236,11]]}}}],["appris",{"_index":571,"t":{"27":{"position":[[1395,8],[1564,10]]},"633":{"position":[[839,8]]}}}],["appriseconfig",{"_index":572,"t":{"27":{"position":[[1435,13]]}}}],["approach",{"_index":966,"t":{"73":{"position":[[480,8]]},"149":{"position":[[793,9]]},"303":{"position":[[4600,8],[5046,9]]}}}],["appropri",{"_index":2462,"t":{"343":{"position":[[2553,11]]},"492":{"position":[[280,11]]}}}],["aproperti",{"_index":3051,"t":{"517":{"position":[[714,11]]}}}],["aqzi58fa.rfszbm",{"_index":567,"t":{"27":{"position":[[925,18]]}}}],["arch",{"_index":974,"t":{"73":{"position":[[858,4]]},"571":{"position":[[128,5]]}}}],["architectur",{"_index":3153,"t":{"549":{"position":[[1414,12]]},"651":{"position":[[9,12]]}}}],["archiv",{"_index":911,"t":{"64":{"position":[[1184,7],[2738,7],[2899,7],[3199,7],[3592,7]]},"83":{"position":[[1043,7],[2563,7],[2724,7],[3024,7],[3384,7]]},"509":{"position":[[61,7]]}}}],["archivetun",{"_index":2026,"t":{"224":{"position":[[675,11],[1105,11],[1872,11]]}}}],["aren't",{"_index":1045,"t":{"73":{"position":[[4899,6]]},"184":{"position":[[1303,6]]}}}],["arg",{"_index":2770,"t":{"431":{"position":[[21,4]]},"533":{"position":[[295,5]]}}}],["arl",{"_index":1853,"t":{"192":{"position":[[4,3],[103,3],[270,3],[505,4],[718,3]]},"194":{"position":[[325,6]]},"196":{"position":[[139,3],[764,6],[985,3],[1040,3],[1152,3]]},"198":{"position":[[331,3],[1883,6],[3323,6]]}}}],["arm64",{"_index":3096,"t":{"541":{"position":[[56,5]]}}}],["around",{"_index":1355,"t":{"118":{"position":[[4087,6]]}}}],["arrang",{"_index":1279,"t":{"118":{"position":[[656,8]]}}}],["array",{"_index":110,"t":{"4":{"position":[[2412,5]]},"29":{"position":[[521,5]]},"200":{"position":[[1823,5]]},"367":{"position":[[1137,5]]},"369":{"position":[[210,5],[351,5]]},"399":{"position":[[21,5]]}}}],["arriv",{"_index":1408,"t":{"123":{"position":[[207,6]]}}}],["art",{"_index":888,"t":{"62":{"position":[[61,3]]},"64":{"position":[[34,3],[196,3],[401,3],[1180,3],[2734,3],[2759,4],[2895,3],[2955,3],[2967,3],[3159,4],[3195,3],[3573,3],[3588,3]]},"66":{"position":[[398,3],[631,3]]},"83":{"position":[[34,3],[310,3],[1039,3],[2559,3],[2584,4],[2720,3],[2780,3],[2792,3],[2984,4],[3020,3],[3365,3],[3380,3]]},"85":{"position":[[658,3]]},"188":{"position":[[1478,3],[2090,4]]},"509":{"position":[[35,3],[57,3]]}}}],["artist",{"_index":656,"t":{"38":{"position":[[341,8]]},"118":{"position":[[177,7],[1155,8],[1207,7],[1253,6],[1301,6],[1390,7],[1845,7],[4417,7],[4958,6]]},"136":{"position":[[210,8],[622,6],[634,6],[753,6],[784,6],[829,6],[841,6],[1028,6],[1059,6],[1216,6]]},"178":{"position":[[1022,6],[2295,8],[3494,8]]},"222":{"position":[[430,7],[467,6],[495,7]]},"275":{"position":[[478,7],[493,6],[565,7],[580,6]]},"297":{"position":[[290,6],[439,8]]},"313":{"position":[[172,7],[596,8]]},"327":{"position":[[1117,7],[1423,6],[1701,6],[1755,6]]},"351":{"position":[[137,8],[446,6],[531,6],[607,6]]},"359":{"position":[[296,7],[318,6]]},"361":{"position":[[728,11],[1291,11],[1391,7],[2243,11],[2508,11]]},"363":{"position":[[133,7],[262,10],[331,7],[440,7]]},"367":{"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]]},"369":{"position":[[833,7],[859,8],[1056,7]]},"376":{"position":[[60,7],[188,7],[259,7],[270,6],[315,7],[371,7],[442,6],[496,7],[561,7],[783,10],[901,10]]},"378":{"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]]},"380":{"position":[[213,10],[282,7]]},"387":{"position":[[284,11]]},"391":{"position":[[42,7]]},"393":{"position":[[292,7],[305,6],[361,6]]},"395":{"position":[[303,10],[325,8]]},"399":{"position":[[429,7]]},"402":{"position":[[87,6],[328,9]]},"408":{"position":[[26,10]]},"410":{"position":[[58,9]]},"412":{"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],[682,10]]},"427":{"position":[[191,8]]},"449":{"position":[[50,6],[141,8],[263,6],[281,6]]},"453":{"position":[[179,6],[328,6]]},"457":{"position":[[3008,7]]},"459":{"position":[[687,7],[1064,8],[1080,6],[1247,6],[1324,8],[1345,6]]},"461":{"position":[[84,7],[461,8]]},"463":{"position":[[151,6],[228,8],[249,6]]},"470":{"position":[[583,10],[652,7]]},"472":{"position":[[689,7],[697,8],[1720,6]]},"476":{"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]]},"483":{"position":[[1500,6],[1533,10],[1852,7],[2194,6],[2624,6],[3050,6]]},"488":{"position":[[258,6],[640,6],[658,8],[729,7],[1062,6],[1125,10]]},"490":{"position":[[171,7],[485,6],[574,6],[611,7],[686,10],[788,7],[813,6],[868,10]]},"494":{"position":[[549,10]]},"501":{"position":[[469,9]]},"503":{"position":[[703,10]]},"505":{"position":[[73,6],[566,9]]},"507":{"position":[[924,9]]},"509":{"position":[[865,9],[1444,9]]},"557":{"position":[[1551,7]]},"559":{"position":[[761,7]]},"561":{"position":[[494,7]]},"590":{"position":[[772,8]]}}}],["artist(",{"_index":2946,"t":{"476":{"position":[[2599,10],[2957,10],[3341,10]]}}}],["artist/album/titl",{"_index":2963,"t":{"476":{"position":[[6952,18]]}}}],["artist/album/track",{"_index":1904,"t":{"200":{"position":[[329,18]]}}}],["artist/title/album",{"_index":2561,"t":{"359":{"position":[[219,18],[432,18]]},"476":{"position":[[5998,19]]}}}],["artist/track",{"_index":1296,"t":{"118":{"position":[[1361,12]]},"376":{"position":[[78,12]]}}}],["artist/track/album",{"_index":1330,"t":{"118":{"position":[[2876,18]]}}}],["artistnam",{"_index":3322,"t":{"590":{"position":[[703,11],[781,13]]}}}],["artists(",{"_index":2944,"t":{"476":{"position":[[2455,11]]}}}],["artists/album",{"_index":2019,"t":{"222":{"position":[[416,13]]}}}],["artists/album/titl",{"_index":1742,"t":{"178":{"position":[[257,19]]},"503":{"position":[[53,21]]}}}],["artists/title/album",{"_index":3031,"t":{"494":{"position":[[146,19]]}}}],["artistsignor",{"_index":2648,"t":{"378":{"position":[[360,13]]},"389":{"position":[[129,16]]}}}],["artistsparsefrom",{"_index":2564,"t":{"361":{"position":[[708,19],[1271,19],[1421,19],[2223,19],[2488,19]]},"378":{"position":[[500,16],[916,16],[1424,16],[1516,19],[1586,19],[1640,19],[1679,19]]},"387":{"position":[[264,19]]}}}],["artistsparsemonolithiconli",{"_index":2651,"t":{"378":{"position":[[1001,26]]}}}],["artistweight",{"_index":3011,"t":{"483":{"position":[[2119,15],[2656,15]]},"507":{"position":[[1262,15]]}}}],["artwork",{"_index":897,"t":{"64":{"position":[[350,7],[502,8],[793,7],[1110,7],[1132,7],[1195,7],[1229,7],[1332,7],[1415,10],[3626,7],[3650,7],[3689,7],[3736,7],[4172,7],[4266,7]]},"66":{"position":[[459,7]]},"83":{"position":[[259,7],[361,8],[652,7],[969,7],[991,7],[1054,7],[1088,7],[1191,7],[1274,10],[3418,7],[3442,7],[3481,7],[3528,7]]},"85":{"position":[[486,7]]}}}],["artworkdefaulturl",{"_index":935,"t":{"64":{"position":[[3972,20]]},"83":{"position":[[3764,20]]}}}],["ascii",{"_index":1270,"t":{"118":{"position":[[324,5],[364,5]]}}}],["asid",{"_index":820,"t":{"54":{"position":[[552,5]]}}}],["ask",{"_index":2475,"t":{"343":{"position":[[4471,4]]}}}],["aspect",{"_index":2718,"t":{"421":{"position":[[41,7]]},"579":{"position":[[116,7]]}}}],["asset",{"_index":1815,"t":{"188":{"position":[[1371,5],[1482,6]]}}}],["assist",{"_index":2076,"t":{"249":{"position":[[14,9],[43,9],[481,10],[519,9]]},"633":{"position":[[391,9]]}}}],["associ",{"_index":405,"t":{"16":{"position":[[398,10]]},"196":{"position":[[202,10]]},"224":{"position":[[1709,10]]},"238":{"position":[[1689,10]]},"253":{"position":[[680,9]]},"325":{"position":[[434,10]]},"481":{"position":[[29,10],[1587,10]]},"503":{"position":[[106,11]]},"621":{"position":[[87,10],[133,11]]},"623":{"position":[[1192,10]]},"625":{"position":[[355,10]]}}}],["assum",{"_index":432,"t":{"18":{"position":[[556,8],[690,8],[855,8]]},"151":{"position":[[231,7]]},"220":{"position":[[1891,6]]},"249":{"position":[[453,8]]},"257":{"position":[[1821,6]]},"261":{"position":[[1620,6]]},"265":{"position":[[1471,6]]},"269":{"position":[[1712,6]]},"291":{"position":[[1719,6]]},"307":{"position":[[1071,9]]},"325":{"position":[[2957,6]]},"363":{"position":[[987,7]]},"435":{"position":[[1674,6]]},"466":{"position":[[674,7]]},"557":{"position":[[717,8],[2218,8]]},"590":{"position":[[834,8],[864,8]]},"597":{"position":[[862,8]]},"608":{"position":[[0,9],[289,8]]}}}],["assumpt",{"_index":2581,"t":{"365":{"position":[[830,11]]}}}],["assur",{"_index":2255,"t":{"303":{"position":[[1275,6]]}}}],["async",{"_index":2735,"t":{"425":{"position":[[880,5]]},"588":{"position":[[446,5],[1137,5]]},"592":{"position":[[741,5],[1695,5],[2342,5]]},"594":{"position":[[1762,5]]},"597":{"position":[[675,5]]}}}],["asynchron",{"_index":1212,"t":{"105":{"position":[[1964,14]]},"425":{"position":[[335,12]]}}}],["atlu",{"_index":3001,"t":{"483":{"position":[[1544,7]]}}}],["atmospher",{"_index":1180,"t":{"105":{"position":[[174,10],[219,10],[867,10]]},"107":{"position":[[17,10],[104,10]]},"110":{"position":[[57,10]]},"138":{"position":[[172,10],[217,10],[865,10]]},"140":{"position":[[40,10]]},"143":{"position":[[131,10]]}}}],["atom",{"_index":3448,"t":{"621":{"position":[[145,6]]}}}],["atproto",{"_index":1444,"t":{"138":{"position":[[54,7]]},"143":{"position":[[4,7],[150,7]]},"319":{"position":[[29,7],[160,7]]}}}],["atproto.at",{"_index":1458,"t":{"138":{"position":[[1986,10]]},"325":{"position":[[612,10]]}}}],["atproto/blueski",{"_index":1244,"t":{"110":{"position":[[1625,15]]},"291":{"position":[[661,15]]}}}],["attach",{"_index":2777,"t":{"431":{"position":[[171,6]]},"517":{"position":[[435,9]]}}}],["attempt",{"_index":1292,"t":{"118":{"position":[[1180,8]]},"134":{"position":[[499,7]]},"309":{"position":[[69,8]]},"327":{"position":[[1098,7]]},"378":{"position":[[1101,7]]},"425":{"position":[[2835,7],[3302,7]]},"476":{"position":[[3708,7]]},"488":{"position":[[1084,7]]},"490":{"position":[[1580,7]]},"549":{"position":[[916,7]]},"625":{"position":[[644,7],[847,7]]}}}],["attribut",{"_index":2968,"t":{"481":{"position":[[18,10],[164,10],[564,11],[582,10],[1170,10]]},"483":{"position":[[116,9],[622,11],[647,9],[2922,10]]}}}],["attribute_nam",{"_index":2974,"t":{"481":{"position":[[593,15]]}}}],["attribute_name]allow",{"_index":2988,"t":{"481":{"position":[[1316,21]]}}}],["attribute_name]deni",{"_index":2989,"t":{"481":{"position":[[1346,20]]}}}],["attribute_name]prior",{"_index":2997,"t":{"483":{"position":[[814,24]]}}}],["audio",{"_index":1809,"t":{"188":{"position":[[1079,6],[1241,6],[1312,6],[5387,7],[7216,7]]},"200":{"position":[[1656,6]]},"297":{"position":[[940,5]]}}}],["audiobook",{"_index":1808,"t":{"188":{"position":[[1006,11]]}}}],["auser",{"_index":1944,"t":{"208":{"position":[[1906,8],[3263,8]]}}}],["auserw",{"_index":2415,"t":{"337":{"position":[[191,10],[357,7]]}}}],["auth",{"_index":331,"t":{"12":{"position":[[277,4],[821,4],[846,4],[1033,4],[1217,4],[1387,4],[1538,7]]},"73":{"position":[[2906,4]]},"79":{"position":[[130,4]]},"91":{"position":[[618,4]]},"103":{"position":[[606,4]]},"228":{"position":[[224,4],[299,4],[443,4],[605,4]]},"257":{"position":[[662,4]]},"269":{"position":[[674,4]]},"303":{"position":[[1523,4],[1539,4],[5503,4]]},"343":{"position":[[4329,4],[5360,4]]},"415":{"position":[[179,4]]},"425":{"position":[[1946,5],[1969,4],[2192,4],[2314,4],[2602,4],[2626,4],[3095,4],[3334,4]]},"584":{"position":[[397,4],[629,4]]},"586":{"position":[[112,4],[877,4]]},"592":{"position":[[2057,5],[2090,4]]},"627":{"position":[[955,4],[979,4],[1071,4],[1211,4],[1363,4],[1401,4],[1475,7]]}}}],["auth.cach",{"_index":350,"t":{"12":{"position":[[954,11]]}}}],["authent",{"_index":286,"t":{"10":{"position":[[67,14]]},"12":{"position":[[327,14]]},"29":{"position":[[590,14],[649,13]]},"57":{"position":[[67,12]]},"64":{"position":[[1060,14]]},"73":{"position":[[3144,14],[5580,14],[6966,14],[9225,14]]},"79":{"position":[[368,14]]},"83":{"position":[[919,14]]},"89":{"position":[[86,14]]},"97":{"position":[[374,14]]},"99":{"position":[[86,14]]},"105":{"position":[[453,12]]},"138":{"position":[[451,12]]},"145":{"position":[[311,14]]},"147":{"position":[[573,14]]},"149":{"position":[[53,14]]},"184":{"position":[[1006,14]]},"188":{"position":[[459,12],[595,13],[2480,12],[2573,12],[2624,12]]},"204":{"position":[[232,14]]},"208":{"position":[[446,15],[526,15]]},"224":{"position":[[1339,12],[2120,12]]},"228":{"position":[[351,14]]},"232":{"position":[[999,14]]},"238":{"position":[[1310,12],[2096,12]]},"242":{"position":[[37,14]]},"251":{"position":[[1004,14]]},"303":{"position":[[459,12],[1384,14],[2463,14],[3348,15],[3597,15],[4061,12],[4501,15]]},"307":{"position":[[202,13],[602,13],[776,13],[978,13],[1090,13],[1268,13]]},"335":{"position":[[770,14]]},"343":{"position":[[489,15],[750,14],[1225,14],[4650,12],[4777,14],[4881,14],[4926,12],[5002,14],[5145,14],[5225,14]]},"425":{"position":[[2383,14],[2538,14],[2671,14],[2849,13],[2954,14]]},"437":{"position":[[269,14]]},"441":{"position":[[176,15],[234,15],[267,14],[440,15],[469,14],[563,15],[841,13],[1135,12]]},"557":{"position":[[676,14]]},"567":{"position":[[485,14]]},"581":{"position":[[311,13]]},"586":{"position":[[791,14]]},"625":{"position":[[1388,15]]},"637":{"position":[[326,12]]},"639":{"position":[[242,12]]}}}],["authentication/configur",{"_index":2254,"t":{"303":{"position":[[1229,28]]}}}],["author",{"_index":1482,"t":{"145":{"position":[[332,11]]},"149":{"position":[[3,9],[1543,13],[2250,13]]},"192":{"position":[[121,10]]},"253":{"position":[[551,13]]},"303":{"position":[[1426,13],[1554,10],[2114,14]]},"343":{"position":[[2015,10],[2101,10],[2257,13],[2296,10],[3199,10],[3739,10],[4121,10]]},"345":{"position":[[367,10]]},"425":{"position":[[3205,13]]},"557":{"position":[[1252,9],[1341,13],[4039,9],[4128,13]]},"581":{"position":[[385,13]]},"633":{"position":[[1194,13]]},"647":{"position":[[242,9]]}}}],["auto",{"_index":1614,"t":{"157":{"position":[[79,4]]},"182":{"position":[[628,4]]},"200":{"position":[[728,4]]},"633":{"position":[[1139,4]]}}}],["autom",{"_index":2531,"t":{"351":{"position":[[75,9]]},"533":{"position":[[43,9]]}}}],["automat",{"_index":351,"t":{"12":{"position":[[980,9]]},"16":{"position":[[217,13]]},"40":{"position":[[193,13]]},"54":{"position":[[1349,13]]},"64":{"position":[[3284,13]]},"73":{"position":[[3070,13],[3495,13],[3637,14],[6679,13],[8555,13],[10071,13]]},"79":{"position":[[294,13]]},"83":{"position":[[3109,13]]},"110":{"position":[[374,13]]},"143":{"position":[[520,13]]},"149":{"position":[[556,13],[2955,14],[3154,13]]},"168":{"position":[[213,14],[759,13],[807,13]]},"182":{"position":[[90,13],[1466,13],[1553,9]]},"200":{"position":[[518,13],[588,9],[708,9],[1762,9],[2197,13]]},"216":{"position":[[812,13]]},"307":{"position":[[142,13]]},"331":{"position":[[353,13]]},"343":{"position":[[4609,14]]},"382":{"position":[[96,13]]},"395":{"position":[[453,13]]},"547":{"position":[[70,13]]},"557":{"position":[[1321,13],[4108,13]]},"569":{"position":[[505,13]]},"575":{"position":[[254,13]]},"599":{"position":[[2122,13]]},"604":{"position":[[188,13]]},"614":{"position":[[290,13]]},"623":{"position":[[985,13]]},"625":{"position":[[655,13],[1193,13]]}}}],["automix",{"_index":2241,"t":{"303":{"position":[[12,7],[47,7]]}}}],["automonitor",{"_index":1670,"t":{"168":{"position":[[821,14]]},"182":{"position":[[1147,14],[1177,11]]},"200":{"position":[[1245,14]]}}}],["avahi",{"_index":1969,"t":{"216":{"position":[[1038,5],[1167,5],[1205,5],[1250,5]]}}}],["avail",{"_index":152,"t":{"4":{"position":[[4032,9],[4058,9]]},"6":{"position":[[146,9],[204,9]]},"25":{"position":[[97,9]]},"29":{"position":[[60,9]]},"31":{"position":[[32,9]]},"64":{"position":[[2851,9]]},"73":{"position":[[840,9]]},"81":{"position":[[151,9]]},"83":{"position":[[2676,9]]},"125":{"position":[[549,12]]},"168":{"position":[[31,9]]},"218":{"position":[[137,9]]},"293":{"position":[[1576,9]]},"315":{"position":[[488,10]]},"343":{"position":[[5061,9],[5287,9]]},"347":{"position":[[1384,9]]},"378":{"position":[[0,9]]},"476":{"position":[[1811,9],[2406,9]]},"541":{"position":[[80,9]]},"569":{"position":[[318,9]]},"633":{"position":[[1389,9]]}}}],["averag",{"_index":425,"t":{"18":{"position":[[464,7]]}}}],["avoid",{"_index":344,"t":{"12":{"position":[[760,5]]},"38":{"position":[[792,6]]},"73":{"position":[[1010,5]]},"149":{"position":[[3172,5]]},"297":{"position":[[464,5]]},"447":{"position":[[412,5]]},"466":{"position":[[3,5]]},"490":{"position":[[1871,5]]},"543":{"position":[[1893,5]]}}}],["await",{"_index":3308,"t":{"588":{"position":[[1332,5]]},"592":{"position":[[1778,5],[2375,5]]},"594":{"position":[[1945,5]]},"597":{"position":[[761,5]]}}}],["awar",{"_index":521,"t":{"20":{"position":[[231,5]]},"303":{"position":[[4695,6]]},"490":{"position":[[1332,5]]}}}],["azura_en",{"_index":1795,"t":{"186":{"position":[[252,12]]}}}],["azura_id",{"_index":1793,"t":{"186":{"position":[[127,8],[208,8]]}}}],["azura_key",{"_index":1797,"t":{"186":{"position":[[414,9]]}}}],["azura_l",{"_index":1776,"t":{"182":{"position":[[1333,11]]},"186":{"position":[[508,10]]}}}],["azura_listeners_num",{"_index":1778,"t":{"182":{"position":[[1383,20]]},"186":{"position":[[481,19]]}}}],["azura_nam",{"_index":1794,"t":{"186":{"position":[[181,10]]}}}],["azura_st",{"_index":1782,"t":{"184":{"position":[[69,13]]},"186":{"position":[[309,13]]}}}],["azura_url",{"_index":1796,"t":{"186":{"position":[[362,9]]}}}],["azuracast",{"_index":1615,"t":{"157":{"position":[[130,9]]},"180":{"position":[[21,9],[222,9]]},"182":{"position":[[33,9]]},"184":{"position":[[159,9],[1041,10],[1328,10]]},"186":{"position":[[395,9],[627,9],[837,9],[1180,9],[1263,9],[1493,9],[1798,12],[2215,9],[2410,9],[2932,9],[3228,12]]},"633":{"position":[[163,9]]}}}],["azuracast.json",{"_index":1669,"t":{"168":{"position":[[675,14]]},"182":{"position":[[979,14]]}}}],["b",{"_index":1280,"t":{"118":{"position":[[808,2],[913,2]]},"151":{"position":[[778,2],[803,2],[881,2],[1269,3]]},"220":{"position":[[2379,3],[3789,3]]},"533":{"position":[[266,1],[360,1]]}}}],["b2c4",{"_index":2616,"t":{"369":{"position":[[1083,4]]}}}],["back",{"_index":398,"t":{"16":{"position":[[231,6]]},"125":{"position":[[439,6]]},"151":{"position":[[685,4],[1007,4]]},"303":{"position":[[3854,4]]},"309":{"position":[[187,4]]},"343":{"position":[[4402,4]]},"457":{"position":[[3026,4]]},"490":{"position":[[2041,4]]},"604":{"position":[[202,6]]}}}],["backend",{"_index":1789,"t":{"184":{"position":[[885,10]]},"271":{"position":[[204,7]]},"415":{"position":[[68,7],[94,7],[328,7]]}}}],["background",{"_index":1513,"t":{"149":{"position":[[861,10]]},"547":{"position":[[91,11]]}}}],["backlog",{"_index":1387,"t":{"118":{"position":[[5124,11]]},"120":{"position":[[1092,10]]},"597":{"position":[[266,11],[582,10]]}}}],["backslash",{"_index":2697,"t":{"412":{"position":[[511,9]]}}}],["backup",{"_index":1426,"t":{"132":{"position":[[461,8]]},"174":{"position":[[434,6]]},"604":{"position":[[241,6],[311,6],[467,6]]}}}],["backward",{"_index":1558,"t":{"151":{"position":[[195,10]]}}}],["bad",{"_index":2137,"t":{"275":{"position":[[178,3],[301,3]]},"393":{"position":[[172,3]]},"490":{"position":[[537,3]]}}}],["bad/incomplet",{"_index":1997,"t":{"216":{"position":[[3218,14]]}}}],["bad\\w+/i",{"_index":2674,"t":{"397":{"position":[[246,11]]}}}],["badmus",{"_index":1847,"t":{"188":{"position":[[5300,10],[7129,10]]}}}],["badsometh",{"_index":2675,"t":{"397":{"position":[[267,12]]}}}],["badterm",{"_index":2672,"t":{"395":{"position":[[747,7],[772,9]]},"397":{"position":[[107,9],[126,7]]},"399":{"position":[[231,9],[252,10]]}}}],["bais",{"_index":2928,"t":{"472":{"position":[[862,6]]}}}],["balanc",{"_index":2916,"t":{"466":{"position":[[552,7]]}}}],["ballad",{"_index":1342,"t":{"118":{"position":[[3797,7],[3913,7],[4231,7],[4352,7]]}}}],["band",{"_index":2637,"t":{"376":{"position":[[336,4]]},"459":{"position":[[1409,4]]},"463":{"position":[[313,4]]},"476":{"position":[[4595,6],[4656,4],[4930,6]]}}}],["bandcamp",{"_index":2118,"t":{"271":{"position":[[123,9]]}}}],["bar",{"_index":1439,"t":{"136":{"position":[[641,3],[791,3],[848,3],[1066,3]]},"149":{"position":[[1982,3]]},"192":{"position":[[496,3]]},"376":{"position":[[323,3]]},"378":{"position":[[1455,4],[1574,5],[1635,4]]},"517":{"position":[[738,5]]}}}],["barterm",{"_index":2684,"t":{"399":{"position":[[318,9],[360,9]]}}}],["base",{"_index":38,"t":{"4":{"position":[[530,5],[1468,5],[3655,5]]},"16":{"position":[[446,5]]},"18":{"position":[[96,5]]},"22":{"position":[[202,5]]},"38":{"position":[[310,5]]},"42":{"position":[[799,5]]},"44":{"position":[[714,4],[856,4],[904,4],[968,4],[1008,4]]},"60":{"position":[[606,5]]},"64":{"position":[[93,5]]},"73":{"position":[[409,5]]},"83":{"position":[[93,5]]},"89":{"position":[[124,4],[590,4]]},"99":{"position":[[124,4],[584,4]]},"118":{"position":[[2238,5],[3410,5]]},"166":{"position":[[62,5],[220,5],[1159,5],[1323,5]]},"182":{"position":[[246,5],[1269,5],[1488,5]]},"186":{"position":[[379,4]]},"194":{"position":[[188,5]]},"200":{"position":[[426,5],[1481,5],[1696,5],[1780,5]]},"216":{"position":[[789,5],[2118,5],[2715,5]]},"218":{"position":[[160,5]]},"224":{"position":[[47,5],[472,4],[877,4],[1787,4],[2875,4],[2904,4],[3067,4],[3234,4]]},"226":{"position":[[220,4]]},"230":{"position":[[695,4],[843,4],[927,4],[1017,4]]},"232":{"position":[[61,4],[133,4]]},"234":{"position":[[392,4],[418,4]]},"238":{"position":[[47,5],[463,4],[866,4],[1772,4],[2831,4],[2860,4],[3020,4],[3188,4]]},"240":{"position":[[61,4]]},"244":{"position":[[101,5],[155,4],[453,4],[585,4]]},"249":{"position":[[255,4]]},"251":{"position":[[61,4],[133,4]]},"253":{"position":[[385,4],[411,4]]},"297":{"position":[[143,5],[1209,5]]},"309":{"position":[[204,5]]},"325":{"position":[[129,4]]},"327":{"position":[[1567,5]]},"331":{"position":[[515,4]]},"335":{"position":[[458,5]]},"337":{"position":[[139,5]]},"343":{"position":[[1730,5],[3316,4]]},"365":{"position":[[109,5]]},"425":{"position":[[36,4],[1165,4],[2002,5]]},"431":{"position":[[153,5]]},"435":{"position":[[26,5]]},"457":{"position":[[625,5],[2557,6]]},"466":{"position":[[593,4]]},"476":{"position":[[1426,5]]},"483":{"position":[[719,5],[1107,5],[1348,5]]},"490":{"position":[[1175,5],[1264,5],[2012,5],[2052,5]]},"543":{"position":[[19,4],[1239,4]]},"545":{"position":[[215,4]]},"579":{"position":[[161,5]]},"581":{"position":[[54,5]]},"586":{"position":[[398,4],[538,4]]},"588":{"position":[[73,5]]},"594":{"position":[[1207,5]]},"625":{"position":[[180,5]]}}}],["base_url",{"_index":291,"t":{"10":{"position":[[199,8],[613,8],[847,8]]},"553":{"position":[[582,8]]}}}],["base_url:port/lastfm/callback",{"_index":300,"t":{"10":{"position":[[517,29]]}}}],["base_url=http://192.168.0.100:9078",{"_index":3126,"t":{"545":{"position":[[809,34]]},"555":{"position":[[365,34]]}}}],["base_url=http://hostmachineip",{"_index":3106,"t":{"543":{"position":[[1412,29]]}}}],["baseurl",{"_index":292,"t":{"10":{"position":[[211,7]]},"584":{"position":[[852,8]]},"588":{"position":[[743,8]]},"592":{"position":[[162,7],[245,7],[418,9],[818,7],[991,8],[1012,7],[1045,7],[1257,8],[1266,12],[1327,10]]}}}],["baseurl.trim",{"_index":3341,"t":{"592":{"position":[[1069,14]]}}}],["bash",{"_index":3066,"t":{"533":{"position":[[14,4]]},"549":{"position":[[653,4]]}}}],["basic",{"_index":94,"t":{"4":{"position":[[1822,5]]},"64":{"position":[[3108,10]]},"73":{"position":[[1241,9],[2900,5]]},"75":{"position":[[9,9]]},"79":{"position":[[124,5]]},"83":{"position":[[2933,10]]},"178":{"position":[[1013,5],[2286,8],[3485,8]]},"216":{"position":[[423,5]]},"303":{"position":[[5260,5]]},"311":{"position":[[1168,8],[1654,8]]},"425":{"position":[[3089,5]]},"472":{"position":[[659,5],[1711,5]]},"476":{"position":[[1797,5],[2360,7],[2635,9]]},"488":{"position":[[1116,8]]},"501":{"position":[[460,8]]},"507":{"position":[[914,9],[1159,8]]},"559":{"position":[[719,5]]},"561":{"position":[[452,5]]},"599":{"position":[[1916,5]]},"633":{"position":[[1038,5]]}}}],["basic\",\"freetext",{"_index":2943,"t":{"476":{"position":[[1671,19]]}}}],["basicorid",{"_index":2320,"t":{"311":{"position":[[1154,13],[1640,13]]},"472":{"position":[[646,10]]},"476":{"position":[[2675,12],[2993,14]]},"490":{"position":[[1030,11],[1901,10]]}}}],["baz",{"_index":2636,"t":{"376":{"position":[[332,3]]}}}],["be",{"_index":956,"t":{"73":{"position":[[198,5],[1211,5]]},"87":{"position":[[1032,5]]},"105":{"position":[[950,5]]},"118":{"position":[[1916,5]]},"136":{"position":[[494,5]]},"138":{"position":[[948,5]]},"151":{"position":[[1612,5]]},"162":{"position":[[85,5]]},"194":{"position":[[629,5]]},"255":{"position":[[302,5]]},"267":{"position":[[416,5]]},"325":{"position":[[555,5]]},"327":{"position":[[1014,5]]},"343":{"position":[[259,5],[5055,5]]},"357":{"position":[[119,5],[357,5],[1479,5],[1575,5]]},"441":{"position":[[1002,5]]},"483":{"position":[[2330,5]]},"599":{"position":[[209,5],[2176,5]]},"627":{"position":[[76,5]]},"633":{"position":[[2054,5]]}}}],["be9f354075cb",{"_index":2622,"t":{"369":{"position":[[1143,12]]}}}],["beam",{"_index":2236,"t":{"301":{"position":[[2345,6],[3773,6]]}}}],["bearer",{"_index":1536,"t":{"149":{"position":[[1604,6],[2311,6]]},"425":{"position":[[3072,6]]}}}],["becom",{"_index":1310,"t":{"118":{"position":[[1572,7],[1739,7]]},"166":{"position":[[815,7]]}}}],["bedroom",{"_index":2240,"t":{"301":{"position":[[2429,9],[3857,9]]}}}],["befor",{"_index":66,"t":{"4":{"position":[[1049,6]]},"38":{"position":[[0,6]]},"40":{"position":[[158,6]]},"87":{"position":[[750,6],[1164,6]]},"134":{"position":[[560,6]]},"149":{"position":[[1636,6]]},"151":{"position":[[331,6]]},"166":{"position":[[840,6]]},"178":{"position":[[491,6]]},"224":{"position":[[3168,6]]},"232":{"position":[[111,6]]},"238":{"position":[[3122,6]]},"251":{"position":[[111,6]]},"327":{"position":[[2230,6]]},"343":{"position":[[3046,7]]},"351":{"position":[[282,6],[823,6]]},"355":{"position":[[61,6]]},"357":{"position":[[203,6],[438,6]]},"421":{"position":[[461,6]]},"427":{"position":[[659,6]]},"435":{"position":[[1386,6]]},"455":{"position":[[0,6]]},"457":{"position":[[3288,6]]},"476":{"position":[[19,6],[4436,6]]},"490":{"position":[[2026,6]]},"496":{"position":[[260,6]]},"513":{"position":[[380,6]]},"524":{"position":[[0,6]]},"559":{"position":[[142,6]]},"579":{"position":[[191,6]]},"594":{"position":[[2908,6]]},"599":{"position":[[2930,6]]},"602":{"position":[[202,6],[437,6]]},"604":{"position":[[212,6]]},"606":{"position":[[118,6]]},"614":{"position":[[189,6]]},"618":{"position":[[333,6]]},"625":{"position":[[4,6]]},"631":{"position":[[524,6]]},"649":{"position":[[63,6]]}}}],["begin",{"_index":1496,"t":{"147":{"position":[[557,6]]},"149":{"position":[[3561,5]]},"153":{"position":[[2186,5],[3880,5]]},"343":{"position":[[3016,9],[5468,5]]},"353":{"position":[[83,9]]},"476":{"position":[[29,6]]},"481":{"position":[[1851,5]]},"557":{"position":[[1315,5],[4102,5]]}}}],["behalf",{"_index":823,"t":{"54":{"position":[[634,8]]}}}],["behav",{"_index":2817,"t":{"439":{"position":[[557,8]]},"513":{"position":[[458,8]]}}}],["behavior",{"_index":684,"t":{"42":{"position":[[214,8],[432,8],[948,8]]},"136":{"position":[[1362,8]]},"151":{"position":[[1698,8],[2195,8]]},"166":{"position":[[401,8]]},"168":{"position":[[554,8]]},"182":{"position":[[644,8],[873,8],[1260,8],[1663,9]]},"200":{"position":[[663,8],[744,8],[973,8],[1306,9]]},"216":{"position":[[3272,8]]},"339":{"position":[[210,8],[261,8]]},"361":{"position":[[1114,9]]},"365":{"position":[[610,9]]},"378":{"position":[[1411,8]]},"423":{"position":[[483,9]]},"457":{"position":[[2182,9],[3078,8]]},"507":{"position":[[380,8]]},"586":{"position":[[117,9]]},"594":{"position":[[259,8]]},"610":{"position":[[160,8],[221,8]]}}}],["behind",{"_index":1191,"t":{"105":{"position":[[683,6]]},"138":{"position":[[681,6]]},"149":{"position":[[803,6]]},"232":{"position":[[638,6]]},"251":{"position":[[643,6]]},"303":{"position":[[2712,6],[2988,6]]},"331":{"position":[[442,6]]}}}],["bell",{"_index":3236,"t":{"581":{"position":[[136,5]]}}}],["belong",{"_index":2044,"t":{"230":{"position":[[531,7]]},"244":{"position":[[299,7]]},"301":{"position":[[796,7],[939,7]]},"481":{"position":[[93,7],[448,7]]}}}],["below",{"_index":162,"t":{"4":{"position":[[4478,5]]},"14":{"position":[[899,6]]},"18":{"position":[[2309,5],[4284,5]]},"42":{"position":[[458,7]]},"44":{"position":[[450,5],[948,5]]},"46":{"position":[[2161,6]]},"64":{"position":[[343,6],[1468,5]]},"66":{"position":[[2672,6]]},"73":{"position":[[1948,5],[2023,5],[2081,5],[3681,6],[3708,5],[7276,5]]},"77":{"position":[[547,5],[622,5],[680,5]]},"83":{"position":[[252,6],[1327,5]]},"85":{"position":[[2389,6]]},"89":{"position":[[560,6]]},"91":{"position":[[2391,6]]},"93":{"position":[[586,6]]},"95":{"position":[[2072,6]]},"99":{"position":[[554,6]]},"103":{"position":[[2451,6]]},"110":{"position":[[3386,6]]},"114":{"position":[[2278,6]]},"118":{"position":[[5298,5]]},"140":{"position":[[96,5]]},"143":{"position":[[2685,6]]},"149":{"position":[[626,6],[1024,6]]},"153":{"position":[[2767,6]]},"184":{"position":[[219,5]]},"186":{"position":[[2263,6]]},"188":{"position":[[341,5],[5792,6]]},"192":{"position":[[248,5]]},"198":{"position":[[2285,6]]},"202":{"position":[[2016,6]]},"204":{"position":[[336,6]]},"208":{"position":[[2211,6]]},"210":{"position":[[302,6]]},"214":{"position":[[2184,6]]},"216":{"position":[[3420,5]]},"218":{"position":[[2563,6]]},"220":{"position":[[2818,6]]},"224":{"position":[[41,5]]},"234":{"position":[[2270,6]]},"238":{"position":[[41,5]]},"253":{"position":[[2349,6]]},"255":{"position":[[370,6]]},"257":{"position":[[2773,6]]},"261":{"position":[[2601,6]]},"265":{"position":[[2370,6]]},"267":{"position":[[484,6]]},"269":{"position":[[2703,6]]},"277":{"position":[[2423,6]]},"281":{"position":[[2144,6]]},"285":{"position":[[2187,6]]},"291":{"position":[[2681,6]]},"295":{"position":[[2159,6]]},"299":{"position":[[71,5]]},"301":{"position":[[2712,6]]},"303":{"position":[[984,5],[5385,5]]},"305":{"position":[[2309,6]]},"307":{"position":[[485,5]]},"311":{"position":[[416,6]]},"317":{"position":[[2282,6]]},"325":{"position":[[3914,6]]},"329":{"position":[[2014,6]]},"333":{"position":[[2023,6]]},"341":{"position":[[2133,6]]},"345":{"position":[[2410,6]]},"349":{"position":[[2165,6]]},"412":{"position":[[287,6]]},"425":{"position":[[281,5],[445,6]]},"472":{"position":[[453,6]]},"535":{"position":[[38,5],[639,5]]},"545":{"position":[[972,5]]},"553":{"position":[[597,6]]},"555":{"position":[[433,5]]},"557":{"position":[[3382,6]]},"559":{"position":[[180,6],[1689,6]]},"563":{"position":[[827,6]]},"565":{"position":[[542,5],[764,5]]},"573":{"position":[[185,5]]}}}],["benchmark",{"_index":423,"t":{"18":{"position":[[440,9]]}}}],["benefici",{"_index":370,"t":{"14":{"position":[[226,10]]}}}],["benefit",{"_index":327,"t":{"12":{"position":[[153,7]]},"14":{"position":[[200,8]]},"459":{"position":[[495,7]]},"494":{"position":[[205,7]]},"503":{"position":[[93,7]]},"633":{"position":[[2792,7]]}}}],["best",{"_index":1501,"t":{"149":{"position":[[252,4]]},"200":{"position":[[315,4]]},"441":{"position":[[713,4]]},"474":{"position":[[122,4]]},"483":{"position":[[425,4]]}}}],["better",{"_index":23,"t":{"4":{"position":[[259,6]]},"134":{"position":[[467,6]]},"297":{"position":[[205,6]]},"492":{"position":[[422,6]]},"513":{"position":[[179,6]]},"524":{"position":[[533,7]]},"545":{"position":[[982,6]]}}}],["between",{"_index":677,"t":{"40":{"position":[[304,7]]},"54":{"position":[[298,7]]},"68":{"position":[[279,7]]},"151":{"position":[[1450,8]]},"230":{"position":[[338,7]]},"351":{"position":[[655,7]]},"369":{"position":[[506,7]]},"412":{"position":[[432,7]]},"421":{"position":[[88,7]]},"439":{"position":[[56,7]]},"451":{"position":[[230,7]]},"457":{"position":[[677,7],[934,7]]},"496":{"position":[[452,7]]},"539":{"position":[[23,7]]},"610":{"position":[[412,7]]}}}],["bia",{"_index":3036,"t":{"507":{"position":[[1171,4]]}}}],["bidirection",{"_index":1062,"t":{"73":{"position":[[5880,15],[7437,15]]},"293":{"position":[[1451,15]]}}}],["bind",{"_index":379,"t":{"14":{"position":[[562,4]]},"543":{"position":[[77,4]]}}}],["bind_to_address",{"_index":2151,"t":{"279":{"position":[[129,15]]}}}],["blackheart",{"_index":1307,"t":{"118":{"position":[[1545,12],[1640,12]]}}}],["blacklist",{"_index":1966,"t":{"216":{"position":[[626,9]]},"273":{"position":[[286,9]]},"295":{"position":[[1861,12],[3207,12]]},"341":{"position":[[1839,12],[3199,12]]}}}],["blacklistedapp",{"_index":2009,"t":{"218":{"position":[[2242,18],[3619,18]]}}}],["blacklisteddevic",{"_index":2007,"t":{"218":{"position":[[2190,21],[3567,21]]}}}],["blank",{"_index":2459,"t":{"343":{"position":[[2290,5],[2396,5]]}}}],["bleed",{"_index":3426,"t":{"612":{"position":[[78,8]]}}}],["block",{"_index":2209,"t":{"297":{"position":[[985,7]]},"341":{"position":[[317,5]]},"361":{"position":[[98,6]]},"517":{"position":[[533,6]]}}}],["blueski",{"_index":1196,"t":{"105":{"position":[[958,8],[1477,7]]},"110":{"position":[[111,7],[168,7],[267,7]]},"138":{"position":[[956,8],[1471,7]]},"140":{"position":[[69,8],[132,8],[150,7]]},"143":{"position":[[211,7],[268,7],[366,7]]},"287":{"position":[[135,10]]},"289":{"position":[[81,7]]},"321":{"position":[[81,7]]}}}],["bodi",{"_index":3357,"t":{"592":{"position":[[2573,4]]},"594":{"position":[[2056,5]]},"597":{"position":[[881,4],[973,4]]}}}],["body.map(x",{"_index":3386,"t":{"597":{"position":[[1000,10]]}}}],["bold/ital",{"_index":745,"t":{"46":{"position":[[465,11]]},"66":{"position":[[958,11]]},"85":{"position":[[717,11]]},"91":{"position":[[628,11]]},"95":{"position":[[401,11]]},"103":{"position":[[724,11]]},"110":{"position":[[1649,11]]},"114":{"position":[[507,11]]},"143":{"position":[[1014,11]]},"153":{"position":[[762,11]]},"186":{"position":[[527,11]]},"188":{"position":[[3662,11]]},"198":{"position":[[554,11]]},"202":{"position":[[388,11]]},"208":{"position":[[563,11]]},"214":{"position":[[531,11]]},"218":{"position":[[875,11]]},"220":{"position":[[869,11]]},"234":{"position":[[632,11]]},"253":{"position":[[707,11]]},"257":{"position":[[787,11]]},"261":{"position":[[556,11]]},"265":{"position":[[443,11]]},"269":{"position":[[684,11]]},"277":{"position":[[758,11]]},"281":{"position":[[497,11]]},"285":{"position":[[506,11]]},"291":{"position":[[685,11]]},"295":{"position":[[527,11]]},"301":{"position":[[998,11]]},"305":{"position":[[539,11]]},"317":{"position":[[516,11]]},"325":{"position":[[1929,11]]},"329":{"position":[[416,11]]},"333":{"position":[[387,11]]},"341":{"position":[[452,11]]},"345":{"position":[[634,11]]},"349":{"position":[[490,11]]}}}],["bonet",{"_index":1318,"t":{"118":{"position":[[1732,6],[1788,5]]}}}],["bonu",{"_index":1361,"t":{"118":{"position":[[4445,5],[4478,5]]}}}],["book",{"_index":1807,"t":{"188":{"position":[[997,4],[1255,4]]}}}],["boolean",{"_index":264,"t":{"8":{"position":[[1332,9]]},"46":{"position":[[265,7]]},"66":{"position":[[418,7],[428,7],[571,7]]},"85":{"position":[[445,7],[455,7],[598,7]]},"91":{"position":[[269,7]]},"95":{"position":[[269,7]]},"103":{"position":[[273,7]]},"110":{"position":[[1325,7]]},"114":{"position":[[253,7]]},"143":{"position":[[845,7]]},"153":{"position":[[285,7],[596,7],[705,7]]},"186":{"position":[[265,7],[519,7]]},"188":{"position":[[2387,7]]},"198":{"position":[[269,7]]},"202":{"position":[[273,7],[380,7]]},"208":{"position":[[269,7]]},"214":{"position":[[261,7]]},"218":{"position":[[348,7]]},"220":{"position":[[648,7]]},"234":{"position":[[257,7]]},"253":{"position":[[257,7]]},"257":{"position":[[301,7]]},"261":{"position":[[281,7]]},"265":{"position":[[297,7]]},"269":{"position":[[297,7]]},"277":{"position":[[269,7]]},"281":{"position":[[257,7]]},"285":{"position":[[253,7]]},"291":{"position":[[458,7]]},"295":{"position":[[265,7]]},"301":{"position":[[390,7]]},"305":{"position":[[273,7]]},"317":{"position":[[277,7]]},"325":{"position":[[1746,7]]},"329":{"position":[[257,7]]},"333":{"position":[[265,7]]},"341":{"position":[[253,7]]},"345":{"position":[[257,7]]},"349":{"position":[[277,7]]},"378":{"position":[[1030,7]]},"380":{"position":[[29,8]]},"470":{"position":[[262,8]]}}}],["boom",{"_index":2235,"t":{"301":{"position":[[2274,5],[3702,5]]}}}],["bootleg",{"_index":2970,"t":{"481":{"position":[[387,7],[706,8]]}}}],["both",{"_index":490,"t":{"18":{"position":[[3052,4]]},"46":{"position":[[995,4],[1166,4],[2513,4]]},"66":{"position":[[1492,4],[1665,4],[3026,4]]},"85":{"position":[[1251,4],[1424,4],[2743,4]]},"91":{"position":[[1160,4],[1332,4],[2744,4]]},"95":{"position":[[933,4],[1105,4],[2425,4]]},"103":{"position":[[1258,4],[1431,4],[2805,4]]},"110":{"position":[[2183,4],[2356,4],[3740,4]]},"114":{"position":[[1051,4],[1229,4],[2637,4]]},"123":{"position":[[352,4]]},"143":{"position":[[1546,4],[1718,4],[3038,4]]},"153":{"position":[[1302,4],[1478,4],[3124,4]]},"186":{"position":[[1065,4],[1240,4],[2619,4]]},"188":{"position":[[4198,4],[4372,4],[6147,4]]},"198":{"position":[[1086,4],[1258,4],[2638,4]]},"202":{"position":[[922,4],[1095,4],[2370,4]]},"208":{"position":[[1095,4],[1267,4],[2564,4]]},"214":{"position":[[1059,4],[1229,4],[2535,4]]},"218":{"position":[[1415,4],[1591,4],[2920,4]]},"220":{"position":[[1399,4],[1570,4],[3170,4]]},"232":{"position":[[376,4]]},"234":{"position":[[1174,4],[1351,4],[2628,4]]},"238":{"position":[[3006,4]]},"251":{"position":[[376,4]]},"253":{"position":[[1247,4],[1423,4],[2706,4]]},"257":{"position":[[1321,4],[1494,4],[3127,4]]},"261":{"position":[[1100,4],[1278,4],[2960,4]]},"265":{"position":[[975,4],[1147,4],[2723,4]]},"269":{"position":[[1216,4],[1388,4],[3056,4]]},"277":{"position":[[1290,4],[1462,4],[2776,4]]},"281":{"position":[[1023,4],[1192,4],[2494,4]]},"283":{"position":[[130,4]]},"285":{"position":[[1044,4],[1219,4],[2543,4]]},"291":{"position":[[1219,4],[1392,4],[3035,4]]},"295":{"position":[[1057,4],[1228,4],[2511,4]]},"301":{"position":[[1528,4],[1699,4],[3064,4]]},"305":{"position":[[1073,4],[1246,4],[2663,4]]},"317":{"position":[[1052,4],[1226,4],[2637,4]]},"325":{"position":[[2461,4],[2633,4],[4267,4]]},"329":{"position":[[942,4],[1111,4],[2364,4]]},"333":{"position":[[925,4],[1100,4],[2379,4]]},"341":{"position":[[996,4],[1174,4],[2492,4]]},"345":{"position":[[1168,4],[1341,4],[2764,4]]},"349":{"position":[[1026,4],[1200,4],[2520,4]]},"355":{"position":[[146,4]]},"378":{"position":[[613,5],[631,4]]},"421":{"position":[[96,5],[397,4]]},"427":{"position":[[490,4]]},"447":{"position":[[306,4]]},"474":{"position":[[362,4]]},"535":{"position":[[215,4]]},"621":{"position":[[404,4]]}}}],["bottom",{"_index":704,"t":{"44":{"position":[[229,7]]},"149":{"position":[[1830,7]]},"327":{"position":[[129,6],[449,6]]},"565":{"position":[[321,7]]}}}],["bowl",{"_index":2642,"t":{"376":{"position":[[794,9],[912,9]]},"476":{"position":[[3080,9],[4547,9],[4613,7],[4879,9],[5497,9],[5593,8],[5717,9]]},"490":{"position":[[697,9],[879,9]]}}}],["box",{"_index":1522,"t":{"149":{"position":[[1190,3]]},"327":{"position":[[427,3]]},"483":{"position":[[1788,3]]}}}],["boz",{"_index":2689,"t":{"408":{"position":[[51,4],[76,4]]}}}],["brainz",{"_index":2607,"t":{"369":{"position":[[994,6],[1049,6],[1105,6],[1160,6]]}}}],["brainzclient",{"_index":1257,"t":{"114":{"position":[[1823,15],[3273,15]]}}}],["brainzsourc",{"_index":2102,"t":{"261":{"position":[[2146,15],[3596,15]]}}}],["branch",{"_index":3064,"t":{"530":{"position":[[8,6]]},"549":{"position":[[114,6]]},"612":{"position":[[19,6],[173,9],[243,6]]},"614":{"position":[[320,6]]},"616":{"position":[[468,7],[509,6]]}}}],["brand",{"_index":2457,"t":{"343":{"position":[[1996,8]]}}}],["break",{"_index":971,"t":{"73":{"position":[[797,5]]},"149":{"position":[[3786,6]]},"190":{"position":[[167,8]]},"588":{"position":[[704,6],[1009,6],[1025,6],[1294,6],[1433,6],[1449,6]]},"602":{"position":[[280,8]]},"606":{"position":[[24,8]]},"610":{"position":[[122,8],[255,8],[349,8]]},"614":{"position":[[257,8]]},"618":{"position":[[77,8],[517,10]]}}}],["breakdown",{"_index":666,"t":{"38":{"position":[[555,10]]},"118":{"position":[[4169,9]]}}}],["bridg",{"_index":2499,"t":{"347":{"position":[[158,7],[207,6],[581,7],[962,6],[1073,6]]},"349":{"position":[[365,7],[483,6]]},"543":{"position":[[739,6],[1136,6]]}}}],["bridge:9980",{"_index":2502,"t":{"347":{"position":[[452,11]]},"349":{"position":[[405,11]]}}}],["bridge:latest",{"_index":2505,"t":{"347":{"position":[[628,13]]}}}],["broadcast",{"_index":870,"t":{"60":{"position":[[480,12],[1257,12],[1823,9],[1926,12]]},"66":{"position":[[918,9]]},"184":{"position":[[832,10]]},"200":{"position":[[451,11]]},"353":{"position":[[427,10]]}}}],["broken",{"_index":1632,"t":{"160":{"position":[[50,6]]}}}],["brother",{"_index":1304,"t":{"118":{"position":[[1509,8],[1615,9]]}}}],["brows",{"_index":1445,"t":{"138":{"position":[[130,8]]},"343":{"position":[[949,9]]},"441":{"position":[[121,7]]},"457":{"position":[[2971,7]]}}}],["browser",{"_index":964,"t":{"73":{"position":[[401,7],[2184,7],[2793,7]]},"77":{"position":[[783,7]]},"79":{"position":[[17,7]]},"89":{"position":[[53,7],[348,10]]},"99":{"position":[[53,7],[348,10]]},"147":{"position":[[159,7]]},"149":{"position":[[216,7],[633,7],[1016,7],[2655,8],[2800,7],[3103,7]]},"184":{"position":[[567,8]]},"188":{"position":[[3477,7]]},"192":{"position":[[13,7]]},"303":{"position":[[2084,7],[3160,7],[3538,7],[3750,7]]},"327":{"position":[[579,7]]},"335":{"position":[[464,8],[518,8]]},"343":{"position":[[207,8],[804,8],[3117,7]]},"431":{"position":[[159,7]]},"437":{"position":[[242,7],[349,7]]},"441":{"position":[[665,7],[692,8],[1109,7]]},"543":{"position":[[1336,8]]},"633":{"position":[[1725,7]]}}}],["browser'",{"_index":1485,"t":{"147":{"position":[[189,9]]}}}],["bsky.soci",{"_index":1226,"t":{"110":{"position":[[395,12]]},"143":{"position":[[541,12]]}}}],["bu",{"_index":1977,"t":{"216":{"position":[[1238,3]]}}}],["bug",{"_index":2212,"t":{"297":{"position":[[1147,3],[2008,3]]},"524":{"position":[[435,3]]},"610":{"position":[[237,5]]}}}],["bug/error",{"_index":3059,"t":{"524":{"position":[[107,9]]}}}],["buggi",{"_index":1079,"t":{"73":{"position":[[9009,5]]}}}],["build",{"_index":1260,"t":{"116":{"position":[[61,5]]},"382":{"position":[[110,6]]},"395":{"position":[[467,6]]},"425":{"position":[[779,5]]},"533":{"position":[[84,8]]},"535":{"position":[[77,5],[617,5]]},"549":{"position":[[299,5],[1321,5],[1341,8],[1487,6]]},"551":{"position":[[76,5]]},"584":{"position":[[377,5]]},"588":{"position":[[67,5],[123,5]]},"590":{"position":[[528,5]]},"592":{"position":[[76,5],[111,5]]}}}],["build/artifact",{"_index":3073,"t":{"533":{"position":[[432,16]]},"535":{"position":[[744,16]]}}}],["builder",{"_index":3061,"t":{"528":{"position":[[32,7]]},"535":{"position":[[789,7]]}}}],["buildsourcesfromconfig",{"_index":3293,"t":{"588":{"position":[[421,22]]}}}],["built",{"_index":1179,"t":{"105":{"position":[[135,5]]},"174":{"position":[[224,5]]},"178":{"position":[[397,5]]},"216":{"position":[[1190,5]]},"287":{"position":[[110,5]]},"343":{"position":[[4758,5]]},"359":{"position":[[265,5]]},"376":{"position":[[22,5]]},"421":{"position":[[375,5]]},"425":{"position":[[121,5],[2470,5]]},"537":{"position":[[3,5]]},"541":{"position":[[26,5]]},"588":{"position":[[549,5]]},"614":{"position":[[284,5]]},"633":{"position":[[721,5]]}}}],["bukem",{"_index":2604,"t":{"369":{"position":[[847,5]]}}}],["bump",{"_index":1568,"t":{"151":{"position":[[659,5],[896,6],[1000,6]]},"610":{"position":[[88,5],[183,5]]},"614":{"position":[[248,4]]}}}],["buserw",{"_index":2418,"t":{"337":{"position":[[275,10],[439,7]]}}}],["busi",{"_index":2876,"t":{"457":{"position":[[2243,4]]},"459":{"position":[[968,8],[1431,8]]},"461":{"position":[[365,8]]},"463":{"position":[[335,8]]}}}],["button",{"_index":1527,"t":{"149":{"position":[[1310,6]]},"188":{"position":[[227,6]]},"216":{"position":[[47,6]]}}}],["bvki",{"_index":2483,"t":{"343":{"position":[[5129,5]]}}}],["c",{"_index":1010,"t":{"73":{"position":[[2411,1],[2559,1]]},"77":{"position":[[1010,1],[1158,1]]}}}],["c9f91cdc",{"_index":2949,"t":{"476":{"position":[[3114,9]]}}}],["c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":127,"t":{"4":{"position":[[2702,34],[2905,34],[6036,34]]},"176":{"position":[[730,34],[1944,34]]},"188":{"position":[[5065,35],[6894,35]]}}}],["cach",{"_index":316,"t":{"12":{"position":[[27,7],[114,5],[171,8],[239,7],[269,7],[369,6],[469,6],[606,6],[750,6],[826,5],[851,7],[1209,7],[1527,8]]},"14":{"position":[[48,6],[147,7],[1171,8]]},"31":{"position":[[333,7]]},"38":{"position":[[163,8]]},"372":{"position":[[8,7],[119,7],[167,7],[197,5],[322,7],[346,5],[373,6]]},"439":{"position":[[881,7],[1096,5]]},"459":{"position":[[1637,7],[1648,5]]},"486":{"position":[[26,7]]},"543":{"position":[[58,7],[386,6],[2415,7],[2490,6]]},"545":{"position":[[340,7],[989,7]]},"549":{"position":[[447,6]]},"569":{"position":[[107,7]]},"625":{"position":[[138,6],[366,6],[530,5],[697,5],[790,7],[924,6],[1050,5]]},"627":{"position":[[10,5],[131,5],[237,5],[308,7],[334,7],[518,7],[608,7],[770,5],[826,8],[984,7],[1429,8]]},"631":{"position":[[452,6],[498,6]]}}}],["cache.metadata",{"_index":3469,"t":{"627":{"position":[[716,14]]}}}],["cache.scrobbl",{"_index":3465,"t":{"627":{"position":[[446,14]]}}}],["cache_",{"_index":3463,"t":{"627":{"position":[[182,7]]}}}],["cache_auth=valkey",{"_index":362,"t":{"12":{"position":[[1489,17]]}}}],["cache_auth_conn",{"_index":3470,"t":{"627":{"position":[[1272,15]]}}}],["cache_metadata",{"_index":3466,"t":{"627":{"position":[[651,14]]}}}],["cache_metadata_conn",{"_index":3467,"t":{"627":{"position":[[673,19]]}}}],["cache_scrobbl",{"_index":3464,"t":{"627":{"position":[[424,14]]}}}],["cache_valkey",{"_index":3468,"t":{"627":{"position":[[696,12],[1292,12]]}}}],["cache_valkey=redis://192.168.0.120:6379",{"_index":388,"t":{"14":{"position":[[1103,39]]}}}],["cache_valkey=redis://valkey:6379",{"_index":3118,"t":{"543":{"position":[[2630,32]]},"545":{"position":[[1000,32]]}}}],["call",{"_index":320,"t":{"12":{"position":[[58,5],[321,5],[651,5],[721,5],[776,5]]},"73":{"position":[[3872,6]]},"226":{"position":[[196,5]]},"228":{"position":[[557,5]]},"230":{"position":[[1046,5]]},"372":{"position":[[44,5]]},"459":{"position":[[1670,5]]},"466":{"position":[[564,6]]},"476":{"position":[[1286,5]]},"486":{"position":[[48,6]]},"543":{"position":[[2501,5]]},"581":{"position":[[73,6]]},"586":{"position":[[29,6]]}}}],["callback",{"_index":1116,"t":{"87":{"position":[[1317,8]]},"89":{"position":[[13,10]]},"91":{"position":[[540,9]]},"99":{"position":[[13,10]]},"103":{"position":[[527,9]]},"257":{"position":[[576,9]]},"269":{"position":[[589,9]]},"303":{"position":[[3571,8]]},"415":{"position":[[184,9]]},"423":{"position":[[307,8]]},"425":{"position":[[2344,8]]},"437":{"position":[[580,8]]},"557":{"position":[[3451,8]]},"565":{"position":[[1428,8]]},"647":{"position":[[291,8]]}}}],["callback/redirect",{"_index":1118,"t":{"87":{"position":[[1430,17]]},"437":{"position":[[71,17]]}}}],["callout",{"_index":3445,"t":{"618":{"position":[[745,7]]}}}],["canari",{"_index":1053,"t":{"73":{"position":[[5168,7]]}}}],["cancel",{"_index":2971,"t":{"481":{"position":[[398,9]]}}}],["candid",{"_index":1372,"t":{"118":{"position":[[4593,10]]},"357":{"position":[[1428,12]]},"406":{"position":[[23,12]]},"476":{"position":[[896,11]]}}}],["capabl",{"_index":330,"t":{"12":{"position":[[247,13]]},"597":{"position":[[278,13]]}}}],["captur",{"_index":833,"t":{"54":{"position":[[1072,7]]},"105":{"position":[[2199,8]]},"327":{"position":[[1344,7]]},"412":{"position":[[328,7]]},"633":{"position":[[2803,9]]}}}],["card",{"_index":1668,"t":{"168":{"position":[[503,5]]},"182":{"position":[[830,5]]},"200":{"position":[[930,5]]},"303":{"position":[[5485,4]]},"343":{"position":[[4309,4],[5400,4]]},"557":{"position":[[1244,4],[4031,4]]}}}],["care",{"_index":903,"t":{"64":{"position":[[734,5]]},"83":{"position":[[593,5]]},"594":{"position":[[1170,4]]},"599":{"position":[[2742,4]]}}}],["case",{"_index":259,"t":{"8":{"position":[[1226,4]]},"180":{"position":[[97,4]]},"232":{"position":[[600,4]]},"251":{"position":[[605,4]]},"273":{"position":[[324,4]]},"275":{"position":[[327,4]]},"277":{"position":[[500,4],[610,4],[702,4]]},"299":{"position":[[141,4]]},"311":{"position":[[602,4],[890,4],[1367,4]]},"327":{"position":[[2223,6]]},"331":{"position":[[163,4]]},"412":{"position":[[374,5]]},"472":{"position":[[390,4]]},"588":{"position":[[590,4],[679,4],[711,4],[1269,4],[1301,4]]}}}],["cast",{"_index":1618,"t":{"157":{"position":[[202,4]]},"216":{"position":[[28,4],[162,4],[456,4],[654,5],[697,4],[738,4],[1584,4],[1773,4],[3062,4]]},"218":{"position":[[105,4],[445,4],[567,4],[2157,6],[3534,6]]},"451":{"position":[[11,4],[92,7],[132,4],[463,4],[576,4]]},"453":{"position":[[36,4]]},"633":{"position":[[187,4]]}}}],["catalog",{"_index":1215,"t":{"105":{"position":[[2045,9]]}}}],["catch",{"_index":2760,"t":{"425":{"position":[[3286,5]]},"592":{"position":[[1212,5],[2025,5],[2488,5]]},"594":{"position":[[2546,5]]},"597":{"position":[[1052,5]]}}}],["categori",{"_index":1393,"t":{"120":{"position":[[355,11]]},"160":{"position":[[71,11]]}}}],["caus",{"_index":844,"t":{"54":{"position":[[1627,5]]},"151":{"position":[[2026,5]]},"194":{"position":[[49,5]]},"315":{"position":[[978,6]]},"343":{"position":[[332,5]]},"351":{"position":[[691,6]]},"439":{"position":[[867,6]]},"457":{"position":[[1676,5],[2476,5]]},"592":{"position":[[1279,7]]},"597":{"position":[[1128,7]]}}}],["caveat",{"_index":256,"t":{"8":{"position":[[1176,7]]}}}],["cc_blacklist_app",{"_index":2004,"t":{"218":{"position":[[637,17]]}}}],["cc_blacklist_devic",{"_index":2002,"t":{"218":{"position":[[392,20]]}}}],["cc_enabl",{"_index":2001,"t":{"218":{"position":[[338,9]]}}}],["cc_id",{"_index":1999,"t":{"218":{"position":[[222,5],[297,5]]}}}],["cc_name",{"_index":2000,"t":{"218":{"position":[[273,7]]}}}],["cc_whitelist_app",{"_index":2005,"t":{"218":{"position":[[757,17]]}}}],["cc_whitelist_devic",{"_index":2003,"t":{"218":{"position":[[516,20]]}}}],["cd",{"_index":2713,"t":{"417":{"position":[[313,2]]},"549":{"position":[[188,2]]}}}],["certain",{"_index":456,"t":{"18":{"position":[[1184,7]]},"160":{"position":[[994,7]]},"275":{"position":[[4,7]]},"490":{"position":[[57,7]]}}}],["certificates/http",{"_index":2265,"t":{"303":{"position":[[2596,18]]}}}],["cf5b",{"_index":3253,"t":{"584":{"position":[[709,4]]}}}],["chanc",{"_index":1378,"t":{"118":{"position":[[4796,6]]},"343":{"position":[[903,6]]},"441":{"position":[[979,6]]}}}],["chang",{"_index":397,"t":{"16":{"position":[[187,7],[586,8]]},"54":{"position":[[1565,6]]},"87":{"position":[[856,8]]},"118":{"position":[[772,6],[791,6],[820,6],[836,6],[2679,7]]},"151":{"position":[[1501,7]]},"166":{"position":[[786,7]]},"190":{"position":[[123,6]]},"230":{"position":[[912,6]]},"297":{"position":[[1665,8]]},"303":{"position":[[3649,8]]},"327":{"position":[[141,6],[472,7]]},"343":{"position":[[174,6],[4108,8]]},"349":{"position":[[1864,7],[3238,7]]},"363":{"position":[[240,7],[315,7],[418,7],[484,7],[545,7],[623,7]]},"380":{"position":[[191,7],[266,7],[361,7]]},"457":{"position":[[646,7],[927,6],[1428,6],[1704,7],[1747,7],[2789,7]]},"470":{"position":[[561,7],[636,7],[731,7]]},"476":{"position":[[1266,6]]},"494":{"position":[[135,6]]},"557":{"position":[[2061,7],[2403,7]]},"594":{"position":[[1230,7],[2631,7],[2655,7]]},"606":{"position":[[33,7]]},"610":{"position":[[131,7],[264,8],[358,8]]},"614":{"position":[[266,8]]},"616":{"position":[[725,6]]},"618":{"position":[[16,7],[86,8],[528,7]]},"625":{"position":[[214,8]]}}}],["changelog",{"_index":3412,"t":{"602":{"position":[[253,10]]},"610":{"position":[[367,11]]}}}],["changem",{"_index":2390,"t":{"329":{"position":[[1734,10],[3056,10]]}}}],["changes/notic",{"_index":3413,"t":{"602":{"position":[[289,16]]}}}],["channel",{"_index":978,"t":{"73":{"position":[[960,7],[998,8]]}}}],["charact",{"_index":1265,"t":{"118":{"position":[[196,9],[281,10],[330,10]]},"378":{"position":[[81,10],[226,10]]},"397":{"position":[[983,11]]}}}],["check",{"_index":1,"t":{"2":{"position":[[4,5]]},"25":{"position":[[176,6],[278,7]]},"38":{"position":[[42,6]]},"54":{"position":[[248,5]]},"68":{"position":[[229,5]]},"123":{"position":[[303,5]]},"149":{"position":[[1777,5]]},"164":{"position":[[499,5]]},"168":{"position":[[64,5]]},"204":{"position":[[171,5],[247,7]]},"210":{"position":[[161,5]]},"224":{"position":[[3130,5]]},"230":{"position":[[402,8]]},"232":{"position":[[292,5],[937,5]]},"238":{"position":[[3084,5]]},"251":{"position":[[292,5],[942,5]]},"273":{"position":[[183,5]]},"297":{"position":[[793,5]]},"325":{"position":[[593,5],[714,5]]},"363":{"position":[[744,5]]},"425":{"position":[[1407,5],[1912,5]]},"435":{"position":[[1357,5],[1547,5],[1596,5],[2146,5],[2398,5]]},"439":{"position":[[654,5],[1131,5]]},"457":{"position":[[697,7],[792,7],[946,6]]},"476":{"position":[[48,6]]},"520":{"position":[[0,5]]},"569":{"position":[[423,5]]},"592":{"position":[[137,5],[1398,5],[1445,5]]},"594":{"position":[[794,7],[2857,6]]},"599":{"position":[[2341,7],[3986,5]]},"602":{"position":[[418,5]]},"608":{"position":[[113,7]]},"610":{"position":[[314,5]]},"614":{"position":[[227,5]]},"616":{"position":[[293,8]]},"649":{"position":[[49,5]]}}}],["check/test",{"_index":2753,"t":{"425":{"position":[[2181,10]]}}}],["child",{"_index":2738,"t":{"425":{"position":[[1036,5],[1771,5],[3018,5]]}}}],["childish",{"_index":1311,"t":{"118":{"position":[[1676,8],[1747,8]]}}}],["chmod",{"_index":1011,"t":{"73":{"position":[[2413,6]]},"77":{"position":[[1012,6]]}}}],["choic",{"_index":2994,"t":{"483":{"position":[[430,6],[516,7],[606,7]]}}}],["choos",{"_index":795,"t":{"48":{"position":[[191,6]]},"93":{"position":[[571,6]]},"149":{"position":[[597,6]]},"200":{"position":[[463,7]]},"343":{"position":[[2163,6]]},"472":{"position":[[418,6]]},"476":{"position":[[1215,7]]},"483":{"position":[[3153,6]]}}}],["chopin",{"_index":1341,"t":{"118":{"position":[[3788,6],[3884,6],[4222,6],[4323,6]]}}}],["chosen",{"_index":3009,"t":{"483":{"position":[[2032,7],[2336,6]]}}}],["chown",{"_index":1013,"t":{"73":{"position":[[2442,5],[2489,5]]},"77":{"position":[[1041,5],[1088,5]]}}}],["chrome",{"_index":1518,"t":{"149":{"position":[[1031,7]]},"192":{"position":[[288,6]]}}}],["chrome/edg",{"_index":1488,"t":{"147":{"position":[[275,13]]}}}],["chrome://inspect",{"_index":2776,"t":{"431":{"position":[[120,16]]}}}],["chromecast",{"_index":1619,"t":{"157":{"position":[[207,12]]},"216":{"position":[[2319,13],[2851,13],[3510,13]]},"218":{"position":[[975,10],[1186,10],[1530,10],[1614,10],[1846,10],[2514,10],[2710,10],[3233,10],[3675,12]]},"633":{"position":[[192,12]]}}}],["chromecast.j",{"_index":3263,"t":{"584":{"position":[[1344,18]]}}}],["chromecast.json",{"_index":1988,"t":{"216":{"position":[[2273,15],[2805,15],[3464,15]]}}}],["chromecastsourceaioconfig",{"_index":3261,"t":{"584":{"position":[[1287,26]]}}}],["chromecastsourceconfig",{"_index":3262,"t":{"584":{"position":[[1314,22]]}}}],["chromium",{"_index":2409,"t":{"335":{"position":[[449,8]]},"431":{"position":[[144,8]]}}}],["circular",{"_index":2833,"t":{"447":{"position":[[165,8]]}}}],["circumst",{"_index":1884,"t":{"196":{"position":[[966,14]]}}}],["circumv",{"_index":1970,"t":{"216":{"position":[[1062,10]]}}}],["cjeb3egaevcd",{"_index":2448,"t":{"343":{"position":[[1122,12]]},"345":{"position":[[2002,12],[3482,12]]}}}],["class",{"_index":2719,"t":{"421":{"position":[[284,5],[334,5]]},"425":{"position":[[41,6],[1042,5],[1230,5],[1777,5],[2015,5],[2118,6],[3024,5],[3148,5]]},"586":{"position":[[403,5],[454,5],[543,5]]},"588":{"position":[[390,5]]},"590":{"position":[[351,5]]},"592":{"position":[[372,5],[1632,5],[2270,5]]},"594":{"position":[[1699,5]]},"597":{"position":[[454,5]]},"599":{"position":[[897,5],[1760,6],[2816,5],[3488,5]]}}}],["classic",{"_index":2327,"t":{"315":{"position":[[429,8]]}}}],["classif",{"_index":1332,"t":{"118":{"position":[[3296,14]]}}}],["classifi",{"_index":1327,"t":{"118":{"position":[[2350,10],[2968,10]]},"216":{"position":[[1882,10]]}}}],["claus",{"_index":2584,"t":{"367":{"position":[[327,6],[375,7]]}}}],["clean",{"_index":2534,"t":{"351":{"position":[[249,6]]},"535":{"position":[[994,5]]}}}],["cleanup",{"_index":2330,"t":{"315":{"position":[[650,7]]}}}],["cleanup/match",{"_index":1400,"t":{"120":{"position":[[703,16]]}}}],["click",{"_index":760,"t":{"46":{"position":[[929,5],[2447,5]]},"60":{"position":[[1718,8]]},"62":{"position":[[282,5]]},"66":{"position":[[1426,5],[2960,5]]},"71":{"position":[[135,5]]},"85":{"position":[[1185,5],[2677,5]]},"91":{"position":[[1094,5],[2678,5]]},"95":{"position":[[867,5],[2359,5]]},"103":{"position":[[1192,5],[2739,5]]},"110":{"position":[[2117,5],[3674,5]]},"114":{"position":[[985,5],[2571,5]]},"143":{"position":[[1480,5],[2972,5]]},"149":{"position":[[1283,5],[1408,5],[2120,5]]},"153":{"position":[[1236,5],[3058,5]]},"168":{"position":[[436,8]]},"182":{"position":[[763,8]]},"186":{"position":[[999,5],[2553,5]]},"188":{"position":[[219,5],[4132,5],[6081,5]]},"192":{"position":[[464,5],[747,5],[780,5]]},"198":{"position":[[1020,5],[2572,5]]},"200":{"position":[[863,8]]},"202":{"position":[[856,5],[2304,5]]},"208":{"position":[[1029,5],[2498,5]]},"214":{"position":[[993,5],[2469,5]]},"218":{"position":[[1349,5],[2854,5]]},"220":{"position":[[1333,5],[3104,5]]},"234":{"position":[[1108,5],[2562,5]]},"249":{"position":[[88,5]]},"253":{"position":[[1181,5],[2640,5]]},"257":{"position":[[1255,5],[3061,5]]},"261":{"position":[[1034,5],[2894,5]]},"265":{"position":[[909,5],[2657,5]]},"269":{"position":[[1150,5],[2990,5]]},"277":{"position":[[1224,5],[2710,5]]},"281":{"position":[[957,5],[2428,5]]},"285":{"position":[[978,5],[2477,5]]},"291":{"position":[[1153,5],[2969,5]]},"295":{"position":[[991,5],[2445,5]]},"301":{"position":[[1462,5],[2998,5]]},"303":{"position":[[1462,8],[5447,5]]},"305":{"position":[[1007,5],[2597,5]]},"309":{"position":[[435,8]]},"317":{"position":[[986,5],[2571,5]]},"325":{"position":[[2395,5],[4201,5]]},"327":{"position":[[431,5]]},"329":{"position":[[876,5],[2298,5]]},"333":{"position":[[859,5],[2313,5]]},"341":{"position":[[930,5],[2426,5]]},"343":{"position":[[4264,5],[5444,5]]},"345":{"position":[[1102,5],[2698,5]]},"349":{"position":[[960,5],[2454,5]]},"517":{"position":[[204,5]]},"557":{"position":[[1206,5],[3984,5]]}}}],["client",{"_index":6,"t":{"4":{"position":[[12,7],[670,6],[1715,7],[4907,10],[5147,10]]},"6":{"position":[[75,6],[175,7],[192,7]]},"8":{"position":[[567,9],[1003,9]]},"18":{"position":[[170,7],[236,6],[3605,8],[3718,8]]},"27":{"position":[[163,6],[380,10]]},"31":{"position":[[206,6]]},"33":{"position":[[2,6]]},"38":{"position":[[32,6],[191,6]]},"40":{"position":[[55,6]]},"42":{"position":[[90,7],[185,7],[408,7],[515,7],[756,6],[910,7],[1072,9]]},"46":{"position":[[576,6],[777,6],[1103,6],[1182,6],[1417,6],[1715,6],[1764,9],[2148,7],[2314,6],[2832,6],[3095,10],[3125,6],[3174,9]]},"62":{"position":[[352,7]]},"66":{"position":[[1071,6],[1274,6],[1600,6],[1681,6],[1922,6],[2659,7],[2827,6],[3347,6],[3610,10]]},"71":{"position":[[205,7]]},"73":{"position":[[930,7],[975,6],[1203,7]]},"85":{"position":[[830,6],[1033,6],[1359,6],[1440,6],[1681,6],[2376,7],[2544,6],[3064,6],[3327,10]]},"87":{"position":[[736,6]]},"91":{"position":[[740,6],[942,6],[1268,6],[1348,6],[1586,6],[1888,8],[1952,9],[2378,7],[2545,6],[3064,6],[3327,10],[3360,8],[3424,9]]},"95":{"position":[[513,6],[715,6],[1041,6],[1121,6],[1359,6],[1659,8],[1723,9],[2059,7],[2226,6],[2745,6],[3008,10],[3039,8],[3103,9]]},"103":{"position":[[837,6],[1040,6],[1366,6],[1447,6],[1688,6],[1993,8],[2058,9],[2438,7],[2606,6],[3126,6],[3389,10],[3424,8],[3489,9]]},"105":{"position":[[2259,7]]},"110":{"position":[[1762,6],[1965,6],[2291,6],[2372,6],[2613,6],[2947,8],[2971,9],[3373,7],[3541,6],[4061,6],[4324,10],[4388,8],[4412,9]]},"114":{"position":[[625,6],[833,6],[1159,6],[1245,6],[1501,6],[1808,8],[1870,9],[2265,7],[2438,6],[2963,6],[3226,10],[3258,8],[3320,9]]},"118":{"position":[[2545,8],[4001,6],[4064,7]]},"120":{"position":[[71,6],[224,6],[653,7],[1000,7]]},"125":{"position":[[29,6],[110,6],[196,8],[426,6]]},"130":{"position":[[587,7]]},"132":{"position":[[60,8],[381,7],[476,7]]},"136":{"position":[[942,6]]},"143":{"position":[[1126,6],[1328,6],[1654,6],[1734,6],[1972,6],[2297,8],[2321,9],[2672,7],[2839,6],[3358,6],[3621,10],[3677,8],[3701,9]]},"145":{"position":[[135,8]]},"151":{"position":[[2551,7],[2871,8],[2935,9]]},"153":{"position":[[1494,6],[2096,10],[3790,10]]},"164":{"position":[[15,7],[57,7],[147,7],[221,10],[302,7],[319,11],[414,8],[433,6],[579,6],[647,6]]},"166":{"position":[[171,8],[286,6],[499,6],[572,8]]},"174":{"position":[[2186,9],[2391,9],[3122,10],[3207,9],[3404,9]]},"176":{"position":[[634,10],[814,10],[1015,10],[1200,9],[1386,9],[1595,9],[1846,10],[2048,10],[2243,10],[2374,10],[2463,9],[2667,9],[2868,9]]},"178":{"position":[[521,7],[2860,9],[3978,10],[4063,9]]},"186":{"position":[[1256,6]]},"188":{"position":[[4388,6],[4980,10],[6809,10]]},"196":{"position":[[739,10]]},"198":{"position":[[1274,6],[1858,10],[3298,10]]},"202":{"position":[[1111,6]]},"208":{"position":[[1283,6]]},"214":{"position":[[1245,6]]},"218":{"position":[[1607,6]]},"220":{"position":[[110,8],[176,8],[199,8],[1586,6],[1924,6]]},"222":{"position":[[165,8],[365,8]]},"224":{"position":[[813,8],[1218,8],[1985,8]]},"226":{"position":[[29,6]]},"228":{"position":[[150,6],[318,6],[405,6]]},"230":{"position":[[269,7],[358,7],[774,7]]},"234":{"position":[[1367,6]]},"236":{"position":[[403,8]]},"238":{"position":[[796,8],[1195,8],[1968,8]]},"242":{"position":[[18,7]]},"253":{"position":[[1439,6]]},"255":{"position":[[96,8],[159,8],[273,8]]},"257":{"position":[[1510,6],[1856,6]]},"259":{"position":[[117,8],[197,8]]},"261":{"position":[[1294,6],[1660,6]]},"263":{"position":[[59,8],[83,8]]},"265":{"position":[[1163,6],[1505,6]]},"267":{"position":[[95,8],[165,8],[387,8]]},"269":{"position":[[1404,6],[1746,6]]},"277":{"position":[[1478,6]]},"279":{"position":[[39,6]]},"281":{"position":[[1208,6]]},"285":{"position":[[1235,6]]},"287":{"position":[[52,8],[255,8],[323,8]]},"289":{"position":[[45,8]]},"291":{"position":[[16,8],[1408,6],[1754,6]]},"295":{"position":[[1244,6]]},"301":{"position":[[1715,6]]},"303":{"position":[[1729,6],[4882,6],[5228,6],[5292,6]]},"305":{"position":[[350,6],[397,6],[1262,6],[1847,10],[3321,10]]},"315":{"position":[[240,6]]},"317":{"position":[[1242,6]]},"319":{"position":[[59,8],[334,8],[402,8]]},"321":{"position":[[45,8]]},"323":{"position":[[16,8]]},"325":{"position":[[2649,6],[2991,6]]},"329":{"position":[[1127,6]]},"333":{"position":[[1116,6]]},"337":{"position":[[202,10],[286,10]]},"341":{"position":[[1190,6]]},"343":{"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]]},"345":{"position":[[360,6],[447,6],[517,6],[1357,6],[1943,10],[3423,10]]},"349":{"position":[[1216,6]]},"351":{"position":[[311,6],[678,6]]},"353":{"position":[[474,7],[491,7],[551,6],[592,6],[739,6]]},"355":{"position":[[162,6],[358,8]]},"357":{"position":[[230,7],[242,8]]},"421":{"position":[[64,7]]},"427":{"position":[[507,7]]},"429":{"position":[[32,6]]},"437":{"position":[[11,6]]},"441":{"position":[[433,6]]},"447":{"position":[[313,6]]},"457":{"position":[[2769,7]]},"470":{"position":[[30,6]]},"490":{"position":[[1654,6]]},"494":{"position":[[183,7],[272,6]]},"503":{"position":[[170,7]]},"509":{"position":[[12,6],[181,6]]},"517":{"position":[[193,10]]},"543":{"position":[[1054,6]]},"545":{"position":[[117,6]]},"549":{"position":[[2002,10],[2171,10]]},"557":{"position":[[608,6],[3236,8],[3366,7]]},"559":{"position":[[172,7]]},"565":{"position":[[0,7],[135,7]]},"567":{"position":[[355,7]]},"569":{"position":[[340,7]]},"590":{"position":[[480,6]]},"594":{"position":[[903,7],[2929,7]]},"599":{"position":[[3014,7],[3373,7],[3669,7],[3973,7]]},"621":{"position":[[339,6],[389,7]]},"625":{"position":[[82,7],[596,6],[1113,7],[1181,7],[1314,6],[1342,6],[1442,7]]},"633":{"position":[[580,7],[801,7],[906,7],[1092,6],[2157,6],[2340,7],[2710,7]]},"635":{"position":[[66,8],[224,7]]},"637":{"position":[[376,6],[480,8]]},"639":{"position":[[2,6],[157,6],[264,7]]}}}],["client'",{"_index":645,"t":{"38":{"position":[[77,8]]}}}],["client/secret",{"_index":233,"t":{"8":{"position":[[184,14]]}}}],["client/sourc",{"_index":11,"t":{"4":{"position":[[72,13],[2372,14],[2464,14]]},"29":{"position":[[297,13],[381,14]]},"130":{"position":[[323,15]]},"625":{"position":[[161,13],[237,13]]},"631":{"position":[[41,14],[547,15]]}}}],["client1maloja",{"_index":2416,"t":{"337":{"position":[[215,15]]}}}],["client2maloja",{"_index":2419,"t":{"337":{"position":[[299,15]]}}}],["clientconfig",{"_index":3305,"t":{"588":{"position":[[1143,14]]}}}],["clientdefault",{"_index":182,"t":{"4":{"position":[[4787,17]]}}}],["clientid",{"_index":188,"t":{"4":{"position":[[4992,11]]},"174":{"position":[[1623,11],[2654,11]]},"178":{"position":[[2397,11],[3601,11]]},"305":{"position":[[1872,11],[3346,11]]},"343":{"position":[[2635,11],[3864,11]]},"345":{"position":[[2024,11],[3504,11]]}}}],["clients/sourc",{"_index":593,"t":{"29":{"position":[[263,15],[561,15]]},"631":{"position":[[141,15]]}}}],["clientsecret",{"_index":190,"t":{"4":{"position":[[5040,15]]},"174":{"position":[[1671,15],[2702,15]]},"178":{"position":[[2445,15],[3649,15]]},"305":{"position":[[1920,15],[3394,15]]},"343":{"position":[[2692,15],[3921,15]]},"345":{"position":[[2079,15],[3559,15]]}}}],["clone",{"_index":2710,"t":{"417":{"position":[[179,5],[259,5]]},"549":{"position":[[0,5],[106,5]]},"608":{"position":[[356,6]]},"612":{"position":[[235,5]]}}}],["close",{"_index":659,"t":{"38":{"position":[[369,9]]},"118":{"position":[[701,5],[2315,9],[2431,5],[4528,7],[4640,5]]},"439":{"position":[[142,6]]},"441":{"position":[[1097,7]]},"476":{"position":[[6829,6]]},"479":{"position":[[77,5]]},"483":{"position":[[1255,7]]},"507":{"position":[[150,5]]}}}],["closest",{"_index":1358,"t":{"118":{"position":[[4296,7]]}}}],["cloud",{"_index":808,"t":{"52":{"position":[[38,5],[152,5]]},"343":{"position":[[1785,5],[4156,5]]},"345":{"position":[[332,5],[419,5],[489,5]]},"637":{"position":[[149,5]]}}}],["clv",{"_index":2481,"t":{"343":{"position":[[5120,4]]}}}],["code",{"_index":1156,"t":{"97":{"position":[[223,5]]},"303":{"position":[[2154,4],[4824,4]]},"343":{"position":[[5115,4],[5258,4]]},"441":{"position":[[136,5],[302,5]]},"481":{"position":[[1061,4]]},"517":{"position":[[528,4]]}}}],["codebas",{"_index":3442,"t":{"618":{"position":[[388,8]]}}}],["coeffici",{"_index":1288,"t":{"118":{"position":[[1040,12]]}}}],["cog",{"_index":1141,"t":{"93":{"position":[[353,4]]},"565":{"position":[[2111,4]]}}}],["collect",{"_index":1740,"t":{"178":{"position":[[74,10],[213,10]]},"303":{"position":[[4711,7]]},"325":{"position":[[679,10]]},"351":{"position":[[371,10]]},"488":{"position":[[751,10]]},"494":{"position":[[83,10]]},"515":{"position":[[239,10]]}}}],["collid",{"_index":280,"t":{"8":{"position":[[1774,7]]}}}],["collis",{"_index":277,"t":{"8":{"position":[[1683,10]]}}}],["color",{"_index":3444,"t":{"618":{"position":[[737,7]]}}}],["column",{"_index":1531,"t":{"149":{"position":[[1400,7]]},"192":{"position":[[763,6]]}}}],["combin",{"_index":1070,"t":{"73":{"position":[[7742,11]]},"118":{"position":[[3568,8]]},"222":{"position":[[503,8]]},"315":{"position":[[567,12]]},"363":{"position":[[881,9]]},"449":{"position":[[130,10]]},"470":{"position":[[1222,8]]},"472":{"position":[[400,8]]},"483":{"position":[[2825,8],[3066,8]]},"490":{"position":[[598,8]]},"549":{"position":[[1433,11]]}}}],["come",{"_index":1402,"t":{"120":{"position":[[926,6]]},"194":{"position":[[428,5]]},"357":{"position":[[987,6]]},"459":{"position":[[305,6]]},"490":{"position":[[1472,5]]},"492":{"position":[[70,4]]}}}],["comfort",{"_index":49,"t":{"4":{"position":[[729,11],[1502,11]]}}}],["comma",{"_index":944,"t":{"66":{"position":[[493,5],[745,5]]},"85":{"position":[[520,5]]},"188":{"position":[[2789,5],[2908,5],[3030,5],[3154,5],[3263,5],[3375,5],[3625,5]]},"218":{"position":[[466,5],[587,5],[707,5],[825,5]]},"295":{"position":[[398,5],[506,5]]},"301":{"position":[[587,5],[693,5],[834,5],[977,5]]},"412":{"position":[[605,5]]},"472":{"position":[[293,5]]},"557":{"position":[[2907,5]]},"559":{"position":[[1700,5]]},"563":{"position":[[838,5]]}}}],["command",{"_index":863,"t":{"57":{"position":[[780,9],[853,8]]},"73":{"position":[[4124,8],[4530,8],[6040,7],[7396,7],[7597,7],[7935,8],[9742,7]]},"327":{"position":[[755,7],[945,7]]},"535":{"position":[[645,7],[1042,7]]},"537":{"position":[[90,7]]},"543":{"position":[[2058,8]]}}}],["comment",{"_index":3487,"t":{"633":{"position":[[1687,8]]}}}],["comment/issu",{"_index":3050,"t":{"517":{"position":[[608,13]]}}}],["commera",{"_index":952,"t":{"66":{"position":[[850,7]]},"85":{"position":[[334,7]]}}}],["commerci",{"_index":2897,"t":{"459":{"position":[[855,10]]},"461":{"position":[[252,10]]}}}],["commit",{"_index":235,"t":{"8":{"position":[[251,9]]},"530":{"position":[[22,6]]},"608":{"position":[[392,7]]},"616":{"position":[[531,6]]}}}],["common",{"_index":427,"t":{"18":{"position":[[495,6],[2382,6],[4357,6]]},"105":{"position":[[935,6]]},"118":{"position":[[1220,6],[1294,6],[1317,6],[1424,6],[3252,6]]},"120":{"position":[[1057,6]]},"138":{"position":[[933,6]]},"149":{"position":[[243,8]]},"171":{"position":[[398,7]]},"216":{"position":[[415,7]]},"224":{"position":[[2171,6],[3113,6]]},"230":{"position":[[573,6]]},"238":{"position":[[2152,6],[3067,6]]},"244":{"position":[[341,6]]},"327":{"position":[[2178,6]]},"376":{"position":[[290,6],[507,6]]},"412":{"position":[[390,6]]},"421":{"position":[[308,6],[434,6]]},"439":{"position":[[582,6]]},"451":{"position":[[44,6],[353,6]]},"476":{"position":[[4236,6],[4258,6],[5170,6],[5566,6]]},"490":{"position":[[391,6]]},"520":{"position":[[169,6]]},"569":{"position":[[617,6]]},"579":{"position":[[236,6]]},"584":{"position":[[64,6],[415,6]]}}}],["common.j",{"_index":3247,"t":{"584":{"position":[[258,15]]}}}],["common/errors/upstreamerror.j",{"_index":3350,"t":{"592":{"position":[[1573,36],[2211,36]]}}}],["common/infrastructure/atomic.j",{"_index":3279,"t":{"586":{"position":[[337,37]]},"590":{"position":[[247,37]]},"594":{"position":[[1639,37]]},"597":{"position":[[394,37]]}}}],["common/infrastructure/config/source/coolplayer.j",{"_index":3275,"t":{"586":{"position":[[203,55]]}}}],["commonclientconfig",{"_index":2726,"t":{"423":{"position":[[136,19]]}}}],["commonli",{"_index":3054,"t":{"520":{"position":[[57,8]]}}}],["commonsourceconfig",{"_index":2725,"t":{"423":{"position":[[113,18]]},"584":{"position":[[283,19],[918,18]]}}}],["commonsourcedata",{"_index":3248,"t":{"584":{"position":[[303,16],[504,17]]}}}],["commun",{"_index":817,"t":{"54":{"position":[[415,13]]},"73":{"position":[[66,11],[146,11],[3818,11],[3963,11],[5503,13],[5902,13],[6889,13],[7459,13],[9148,13]]},"105":{"position":[[571,14]]},"110":{"position":[[530,13]]},"138":{"position":[[569,14]]},"160":{"position":[[86,13]]},"166":{"position":[[206,13],[634,13]]},"184":{"position":[[1024,11]]},"204":{"position":[[32,11]]},"210":{"position":[[32,11]]},"226":{"position":[[39,11]]},"230":{"position":[[867,14]]},"279":{"position":[[3,12]]},"293":{"position":[[34,13],[315,12],[382,13],[1473,13]]},"327":{"position":[[3,12]]},"343":{"position":[[8,13]]},"347":{"position":[[114,11]]},"415":{"position":[[300,12]]},"425":{"position":[[1468,11],[2410,11]]},"633":{"position":[[1820,12]]},"637":{"position":[[311,11]]},"639":{"position":[[227,11]]}}}],["compact",{"_index":433,"t":{"18":{"position":[[620,9],[795,10],[1020,9],[1312,10],[1336,10],[1656,9],[2090,7],[2159,7],[2239,10],[2500,7],[2599,7],[2670,7],[2737,7],[2812,10],[2850,7],[2927,7],[3013,10],[3147,10],[3214,10],[3225,7],[3273,8],[3428,10]]}}}],["compact_properti",{"_index":480,"t":{"18":{"position":[[2459,18]]}}}],["compact_properties=input",{"_index":487,"t":{"18":{"position":[[2823,24]]}}}],["compactaft",{"_index":491,"t":{"18":{"position":[[3121,15],[3342,15]]}}}],["compar",{"_index":220,"t":{"4":{"position":[[5767,8]]},"50":{"position":[[181,8]]},"118":{"position":[[993,8],[2194,8],[2285,9],[3582,9],[4014,9]]},"313":{"position":[[605,8]]},"353":{"position":[[218,8],[599,8]]},"355":{"position":[[76,8],[93,8],[116,8],[523,10]]},"357":{"position":[[69,7],[125,8],[307,7],[363,8],[718,7],[1050,7],[1067,7],[1413,10],[1485,8],[1581,8]]},"406":{"position":[[10,10]]},"599":{"position":[[2395,9]]}}}],["comparison",{"_index":813,"t":{"54":{"position":[[287,10]]},"68":{"position":[[268,10]]},"118":{"position":[[3642,10],[4684,10]]},"357":{"position":[[1198,10],[1326,11]]}}}],["comparison/norm",{"_index":1336,"t":{"118":{"position":[[3528,24]]}}}],["compat",{"_index":1231,"t":{"110":{"position":[[564,10]]},"157":{"position":[[865,10]]},"315":{"position":[[824,10]]},"633":{"position":[[437,10]]}}}],["compens",{"_index":2844,"t":{"457":{"position":[[532,10]]}}}],["compet",{"_index":881,"t":{"60":{"position":[[1596,10]]}}}],["compil",{"_index":2973,"t":{"481":{"position":[[461,11],[899,12],[1470,12],[1516,15]]}}}],["complet",{"_index":98,"t":{"4":{"position":[[1910,8],[3912,8],[3987,10]]},"18":{"position":[[2055,8],[2612,9],[2935,9],[3257,9],[3360,12],[4535,9],[4791,9],[5011,9],[5116,12]]},"46":{"position":[[1318,9],[2678,9]]},"66":{"position":[[1821,9],[3191,9]]},"73":{"position":[[3043,8]]},"79":{"position":[[267,8]]},"85":{"position":[[1580,9],[2908,9]]},"89":{"position":[[105,10]]},"91":{"position":[[608,9],[1486,9],[2909,9]]},"95":{"position":[[1259,9],[2590,9]]},"99":{"position":[[105,10]]},"103":{"position":[[596,9],[1587,9],[2970,9]]},"105":{"position":[[1790,9]]},"110":{"position":[[2512,9],[3905,9]]},"114":{"position":[[1395,9],[2802,9]]},"143":{"position":[[1872,9],[3203,9]]},"153":{"position":[[1640,9],[3289,9]]},"186":{"position":[[1400,9],[2784,9]]},"188":{"position":[[4530,9],[6312,9]]},"198":{"position":[[1412,9],[2803,9]]},"202":{"position":[[1251,9],[2535,9]]},"208":{"position":[[1421,9],[2729,9]]},"214":{"position":[[1379,9],[2700,9]]},"218":{"position":[[1753,9],[3085,9]]},"220":{"position":[[1722,9],[3335,9]]},"234":{"position":[[1515,9],[2793,9]]},"253":{"position":[[1585,9],[2871,9]]},"257":{"position":[[652,9],[1650,9],[3292,9]]},"261":{"position":[[1444,9],[3125,9]]},"265":{"position":[[1301,9],[2888,9]]},"269":{"position":[[664,9],[1542,9],[3221,9]]},"277":{"position":[[1616,9],[2941,9]]},"281":{"position":[[1340,9],[2659,9]]},"285":{"position":[[1379,9],[2708,9]]},"291":{"position":[[1548,9],[3200,9]]},"295":{"position":[[1380,9],[2676,9]]},"301":{"position":[[1851,9],[3229,9]]},"303":{"position":[[1042,10],[1204,8],[2105,8],[2446,8],[3337,10],[4492,8]]},"305":{"position":[[1402,9],[2828,9]]},"317":{"position":[[1384,9],[2802,9]]},"325":{"position":[[2787,9],[4432,9]]},"329":{"position":[[1259,9],[2529,9]]},"333":{"position":[[1260,9],[2544,9]]},"341":{"position":[[1340,9],[2657,9]]},"343":{"position":[[5322,10]]},"345":{"position":[[1497,9],[2929,9]]},"349":{"position":[[1358,9],[2685,9]]},"425":{"position":[[2305,8]]},"437":{"position":[[258,10]]},"441":{"position":[[257,9]]},"490":{"position":[[4,9]]},"492":{"position":[[481,10]]},"557":{"position":[[1358,9],[4145,9]]},"602":{"position":[[47,9]]},"608":{"position":[[164,9]]}}}],["complex",{"_index":107,"t":{"4":{"position":[[2301,7],[4265,7]]},"116":{"position":[[72,7]]},"171":{"position":[[33,7]]},"447":{"position":[[263,7]]}}}],["complic",{"_index":3208,"t":{"569":{"position":[[274,11]]}}}],["compon",{"_index":742,"t":{"46":{"position":[[242,9],[290,9]]},"66":{"position":[[248,9]]},"85":{"position":[[248,9]]},"91":{"position":[[245,9],[294,9]]},"95":{"position":[[245,9],[294,9]]},"103":{"position":[[248,9],[298,9]]},"110":{"position":[[1300,9],[1350,9]]},"114":{"position":[[233,9],[278,9]]},"143":{"position":[[821,9],[870,9]]},"153":{"position":[[257,9],[310,9]]},"186":{"position":[[242,9],[290,9]]},"188":{"position":[[2361,9],[2412,9]]},"198":{"position":[[245,9],[294,9]]},"202":{"position":[[248,9],[298,9]]},"208":{"position":[[245,9],[294,9]]},"214":{"position":[[239,9],[286,9]]},"218":{"position":[[328,9],[373,9]]},"220":{"position":[[618,9],[673,9]]},"234":{"position":[[236,9],[282,9]]},"253":{"position":[[236,9],[282,9]]},"257":{"position":[[269,9],[326,9]]},"261":{"position":[[254,9],[306,9]]},"265":{"position":[[266,9],[322,9]]},"269":{"position":[[266,9],[322,9]]},"277":{"position":[[245,9],[294,9]]},"281":{"position":[[236,9],[282,9]]},"285":{"position":[[233,9],[278,9]]},"291":{"position":[[426,9],[483,9]]},"295":{"position":[[242,9],[290,9]]},"301":{"position":[[367,9],[415,9]]},"305":{"position":[[248,9],[298,9]]},"317":{"position":[[251,9],[302,9]]},"325":{"position":[[1715,9],[1771,9]]},"329":{"position":[[236,9],[282,9]]},"333":{"position":[[242,9],[290,9]]},"341":{"position":[[233,9],[278,9]]},"345":{"position":[[236,9],[282,9]]},"349":{"position":[[251,9],[302,9]]},"421":{"position":[[145,10],[158,9],[263,9],[362,9]]},"423":{"position":[[24,9],[265,9],[427,9]]},"425":{"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]]},"427":{"position":[[552,9]]},"470":{"position":[[825,9]]},"507":{"position":[[281,9]]}}}],["component'",{"_index":1909,"t":{"200":{"position":[[1275,11]]}}}],["compos",{"_index":252,"t":{"8":{"position":[[792,7]]},"12":{"position":[[1156,9]]},"14":{"position":[[534,7]]},"73":{"position":[[1387,7],[1462,7],[6160,7],[6371,7],[8040,7],[8251,7],[9847,7]]},"77":{"position":[[61,7]]},"93":{"position":[[311,7]]},"196":{"position":[[593,7]]},"293":{"position":[[1093,7]]},"311":{"position":[[476,7]]},"347":{"position":[[181,7]]},"421":{"position":[[171,8]]},"509":{"position":[[351,7]]},"545":{"position":[[56,7]]},"553":{"position":[[84,8]]},"565":{"position":[[2069,7]]},"567":{"position":[[237,7]]},"608":{"position":[[234,7],[255,7],[275,7]]}}}],["compose.yaml",{"_index":361,"t":{"12":{"position":[[1428,12]]},"14":{"position":[[1042,12]]},"73":{"position":[[1723,12],[1783,13],[1812,12],[6270,12],[6502,12],[7805,12],[8150,12],[8382,12],[9953,12]]},"77":{"position":[[322,12],[382,13],[411,12]]},"174":{"position":[[485,12]]},"178":{"position":[[618,12]]},"293":{"position":[[1144,12]]},"623":{"position":[[120,12]]},"631":{"position":[[227,12]]}}}],["compose.yml",{"_index":52,"t":{"4":{"position":[[782,11]]},"14":{"position":[[580,11],[724,11]]},"93":{"position":[[112,12],[145,11]]},"347":{"position":[[230,11]]},"543":{"position":[[254,11],[532,11],[953,11],[1352,11],[1521,11],[2230,11],[2536,11]]},"545":{"position":[[292,11],[393,11],[459,11]]},"553":{"position":[[264,11]]},"555":{"position":[[76,11],[123,11]]},"557":{"position":[[274,11],[315,11],[895,11],[936,11],[1892,11],[1933,11],[2300,11],[2718,11],[2759,11],[3644,11],[3685,11]]},"559":{"position":[[490,11],[531,11],[1071,11],[1112,11],[1214,11],[1255,11],[1356,11],[1397,11],[1494,11],[1535,11]]},"561":{"position":[[223,11],[264,11]]},"563":{"position":[[209,11],[250,11],[352,11],[393,11],[494,11],[535,11],[632,11],[673,11]]},"565":{"position":[[955,11],[1024,11],[1599,11],[1668,11],[1870,12],[1903,11],[2322,11],[2391,11]]},"567":{"position":[[168,11]]}}}],["compositeconfig",{"_index":3310,"t":{"588":{"position":[[1365,15]]}}}],["compris",{"_index":2933,"t":{"474":{"position":[[215,9]]}}}],["comput",{"_index":797,"t":{"50":{"position":[[70,8]]}}}],["concern",{"_index":531,"t":{"22":{"position":[[74,8]]}}}],["concret",{"_index":2550,"t":{"355":{"position":[[259,8]]},"421":{"position":[[275,8]]}}}],["condit",{"_index":927,"t":{"64":{"position":[[3032,9],[3504,10]]},"83":{"position":[[2857,9],[3296,10]]},"123":{"position":[[169,10]]},"182":{"position":[[1508,10]]},"363":{"position":[[898,9]]},"365":{"position":[[583,10]]},"367":{"position":[[1097,10],[1150,10],[1188,9],[1402,9]]},"380":{"position":[[114,11]]},"402":{"position":[[15,11]]},"470":{"position":[[347,10]]}}}],["confid",{"_index":1399,"t":{"120":{"position":[[679,9]]}}}],["config",{"_index":14,"t":{"4":{"position":[[100,6],[132,6],[426,6],[760,6],[1303,6],[1341,7],[2007,6],[2029,7],[2329,6],[2557,6],[2760,6],[3273,8],[3479,6],[3809,6],[3973,6],[4296,6],[4336,6],[4484,6],[5733,7],[6280,6]]},"8":{"position":[[502,7]]},"12":{"position":[[1126,8]]},"27":{"position":[[662,6],[1017,6],[1417,6]]},"42":{"position":[[902,7],[995,8],[1190,8]]},"46":{"position":[[66,6],[488,6],[694,7],[714,6],[754,6],[829,6],[1116,7],[1195,7],[1328,7],[1336,6],[1394,6],[1469,6],[1499,6],[1896,6],[2098,7],[2196,6],[2236,6],[2347,6],[2688,7],[2696,6],[2754,6],[2865,6],[2895,6]]},"62":{"position":[[421,6],[432,6],[479,6]]},"64":{"position":[[1405,6],[3888,6],[3962,6]]},"66":{"position":[[66,6],[981,6],[1189,7],[1209,6],[1249,6],[1326,6],[1615,7],[1696,7],[1831,7],[1839,6],[1897,6],[1974,6],[2004,6],[2405,6],[2607,7],[2707,6],[2747,6],[2860,6],[3201,7],[3209,6],[3267,6],[3380,6],[3410,6]]},"71":{"position":[[274,6],[285,6],[332,6]]},"73":{"position":[[3385,6]]},"83":{"position":[[1264,6],[3680,6],[3754,6]]},"85":{"position":[[66,6],[740,6],[948,7],[968,6],[1008,6],[1085,6],[1374,7],[1455,7],[1590,7],[1598,6],[1656,6],[1733,6],[1763,6],[2122,6],[2324,7],[2424,6],[2464,6],[2577,6],[2918,7],[2926,6],[2984,6],[3097,6],[3127,6]]},"89":{"position":[[434,7]]},"91":{"position":[[66,6],[651,6],[858,7],[878,6],[918,6],[994,6],[1282,7],[1362,7],[1496,7],[1504,6],[1562,6],[1638,6],[1668,6],[2125,6],[2327,7],[2426,6],[2466,6],[2578,6],[2919,7],[2927,6],[2985,6],[3097,6],[3127,6]]},"95":{"position":[[66,6],[424,6],[631,7],[651,6],[691,6],[767,6],[1055,7],[1135,7],[1269,7],[1277,6],[1335,6],[1411,6],[1441,6],[1806,6],[2008,7],[2107,6],[2147,6],[2259,6],[2600,7],[2608,6],[2666,6],[2778,6],[2808,6]]},"99":{"position":[[427,7]]},"101":{"position":[[164,7]]},"103":{"position":[[66,6],[747,6],[955,7],[975,6],[1015,6],[1092,6],[1381,7],[1462,7],[1597,7],[1605,6],[1663,6],[1740,6],[1770,6],[2184,6],[2386,7],[2486,6],[2526,6],[2639,6],[2980,7],[2988,6],[3046,6],[3159,6],[3189,6]]},"110":{"position":[[1118,6],[1672,6],[1880,7],[1900,6],[1940,6],[2017,6],[2306,7],[2387,7],[2522,7],[2530,6],[2588,6],[2665,6],[2695,6],[3119,6],[3321,7],[3421,6],[3461,6],[3574,6],[3915,7],[3923,6],[3981,6],[4094,6],[4124,6]]},"114":{"position":[[66,6],[530,6],[743,7],[763,6],[803,6],[885,6],[1179,7],[1265,7],[1405,7],[1413,6],[1471,6],[1553,6],[1583,6],[2006,6],[2208,7],[2313,6],[2353,6],[2471,6],[2812,7],[2820,6],[2878,6],[2996,6],[3026,6]]},"140":{"position":[[124,7]]},"143":{"position":[[642,6],[1037,6],[1244,7],[1264,6],[1304,6],[1380,6],[1668,7],[1748,7],[1882,7],[1890,6],[1948,6],[2024,6],[2054,6],[2419,6],[2621,7],[2720,6],[2760,6],[2872,6],[3213,7],[3221,6],[3279,6],[3391,6],[3421,6]]},"149":{"position":[[2771,6],[3460,7]]},"151":{"position":[[1756,6]]},"153":{"position":[[66,6],[785,6],[996,7],[1016,6],[1056,6],[1136,6],[1428,7],[1512,7],[1650,7],[1658,6],[1716,6],[1796,6],[1826,6],[2497,6],[2699,7],[2802,6],[2842,6],[2958,6],[3299,7],[3307,6],[3365,6],[3481,6],[3511,6]]},"164":{"position":[[671,7]]},"166":{"position":[[1431,7]]},"168":{"position":[[667,7]]},"174":{"position":[[478,6],[1533,6],[2533,6]]},"176":{"position":[[4,6],[557,6],[1737,6]]},"178":{"position":[[611,6],[1699,6],[1718,7],[1778,6],[2995,6]]},"182":{"position":[[375,6],[971,7]]},"184":{"position":[[106,7]]},"186":{"position":[[66,6],[550,6],[760,7],[780,6],[820,6],[899,6],[1190,7],[1273,7],[1410,7],[1418,6],[1476,6],[1555,6],[1585,6],[1994,6],[2196,7],[2298,6],[2338,6],[2453,6],[2794,7],[2802,6],[2860,6],[2975,6],[3005,6]]},"188":{"position":[[2176,6],[3685,6],[3894,7],[3914,6],[3954,6],[4032,6],[4322,7],[4404,7],[4540,7],[4548,6],[4606,6],[4684,6],[4714,6],[5524,6],[5726,7],[5827,6],[5867,6],[5981,6],[6322,7],[6330,6],[6388,6],[6502,6],[6532,6]]},"194":{"position":[[175,6]]},"198":{"position":[[66,6],[577,6],[784,7],[804,6],[844,6],[920,6],[1208,7],[1288,7],[1422,7],[1430,6],[1488,6],[1564,6],[1594,6],[2019,6],[2221,7],[2320,6],[2360,6],[2472,6],[2813,7],[2821,6],[2879,6],[2991,6],[3021,6]]},"200":{"position":[[1071,7],[1837,6]]},"202":{"position":[[66,6],[411,6],[619,7],[639,6],[679,6],[756,6],[1045,7],[1126,7],[1261,7],[1269,6],[1327,6],[1404,6],[1434,6],[1749,6],[1951,7],[2051,6],[2091,6],[2204,6],[2545,7],[2553,6],[2611,6],[2724,6],[2754,6]]},"206":{"position":[[52,6],[666,6]]},"208":{"position":[[66,6],[586,6],[793,7],[813,6],[853,6],[929,6],[1217,7],[1297,7],[1431,7],[1439,6],[1497,6],[1573,6],[1603,6],[1945,6],[2147,7],[2246,6],[2286,6],[2398,6],[2739,7],[2747,6],[2805,6],[2917,6],[2947,6]]},"212":{"position":[[50,6],[658,6]]},"214":{"position":[[66,6],[554,6],[759,7],[779,6],[819,6],[893,6],[1179,7],[1257,7],[1389,7],[1397,6],[1455,6],[1529,6],[1559,6],[1920,6],[2122,7],[2219,6],[2259,6],[2369,6],[2710,7],[2718,6],[2776,6],[2886,6],[2916,6]]},"216":{"position":[[3403,6]]},"218":{"position":[[66,6],[166,7],[898,6],[1109,7],[1129,6],[1169,6],[1249,6],[1541,7],[1625,7],[1763,7],[1771,6],[1829,6],[1909,6],[1939,6],[2293,6],[2495,7],[2598,6],[2638,6],[2754,6],[3095,7],[3103,6],[3161,6],[3277,6],[3307,6]]},"220":{"position":[[296,6],[421,6],[892,6],[1098,7],[1118,6],[1158,6],[1233,6],[1520,7],[1599,7],[1732,7],[1803,6],[1902,6],[1931,7],[1984,8],[1993,6],[2051,6],[2126,6],[2156,6],[2553,6],[2755,7],[2853,6],[2893,6],[3004,6],[3345,7],[3353,6],[3411,6],[3522,6],[3552,6]]},"230":{"position":[[900,6]]},"234":{"position":[[66,6],[655,6],[867,7],[887,6],[927,6],[1008,6],[1301,7],[1386,7],[1525,7],[1533,6],[1591,6],[1672,6],[1702,6],[1999,6],[2201,7],[2305,6],[2345,6],[2462,6],[2803,7],[2811,6],[2869,6],[2986,6],[3016,6]]},"244":{"position":[[500,6]]},"253":{"position":[[66,6],[730,6],[941,7],[961,6],[1001,6],[1081,6],[1373,7],[1457,7],[1595,7],[1603,6],[1661,6],[1741,6],[1771,6],[2079,6],[2281,7],[2384,6],[2424,6],[2540,6],[2881,7],[2889,6],[2947,6],[3063,6],[3093,6]]},"257":{"position":[[66,6],[810,6],[1018,7],[1038,6],[1078,6],[1155,6],[1444,7],[1525,7],[1660,7],[1733,6],[1832,6],[1863,7],[1918,8],[1927,6],[1985,6],[2062,6],[2092,6],[2506,6],[2708,7],[2808,6],[2848,6],[2961,6],[3302,7],[3310,6],[3368,6],[3481,6],[3511,6]]},"261":{"position":[[66,6],[579,6],[792,7],[812,6],[852,6],[934,6],[1228,7],[1314,7],[1454,7],[1532,6],[1631,6],[1667,7],[1727,8],[1736,6],[1794,6],[1876,6],[1906,6],[2329,6],[2531,7],[2636,6],[2676,6],[2794,6],[3135,7],[3143,6],[3201,6],[3319,6],[3349,6]]},"263":{"position":[[180,6]]},"265":{"position":[[66,6],[466,6],[673,7],[693,6],[733,6],[809,6],[1097,7],[1177,7],[1311,7],[1383,6],[1482,6],[1512,7],[1566,8],[1575,6],[1633,6],[1709,6],[1739,6],[2104,6],[2306,7],[2405,6],[2445,6],[2557,6],[2898,7],[2906,6],[2964,6],[3076,6],[3106,6]]},"269":{"position":[[66,6],[707,6],[914,7],[934,6],[974,6],[1050,6],[1338,7],[1418,7],[1552,7],[1624,6],[1723,6],[1753,7],[1807,8],[1816,6],[1874,6],[1950,6],[1980,6],[2437,6],[2639,7],[2738,6],[2778,6],[2890,6],[3231,7],[3239,6],[3297,6],[3409,6],[3439,6]]},"271":{"position":[[407,6],[967,6]]},"273":{"position":[[154,7]]},"277":{"position":[[66,6],[781,6],[988,7],[1008,6],[1048,6],[1124,6],[1412,7],[1492,7],[1626,7],[1634,6],[1692,6],[1768,6],[1798,6],[2157,6],[2359,7],[2458,6],[2498,6],[2610,6],[2951,7],[2959,6],[3017,6],[3129,6],[3159,6]]},"279":{"position":[[121,7]]},"281":{"position":[[66,6],[520,6],[724,7],[744,6],[784,6],[857,6],[1142,7],[1219,7],[1350,7],[1358,6],[1416,6],[1489,6],[1519,6],[1881,6],[2083,7],[2179,6],[2219,6],[2328,6],[2669,7],[2677,6],[2735,6],[2844,6],[2874,6]]},"285":{"position":[[66,6],[529,6],[739,7],[759,6],[799,6],[878,6],[1169,7],[1252,7],[1389,7],[1397,6],[1455,6],[1534,6],[1564,6],[1918,6],[2120,7],[2222,6],[2262,6],[2377,6],[2718,7],[2726,6],[2784,6],[2899,6],[2929,6]]},"291":{"position":[[113,6],[223,6],[708,6],[916,7],[936,6],[976,6],[1053,6],[1342,7],[1423,7],[1558,7],[1631,6],[1730,6],[1761,7],[1816,8],[1825,6],[1883,6],[1960,6],[1990,6],[2414,6],[2616,7],[2716,6],[2756,6],[2869,6],[3210,7],[3218,6],[3276,6],[3389,6],[3419,6]]},"295":{"position":[[66,6],[550,6],[756,7],[776,6],[816,6],[891,6],[1178,7],[1257,7],[1390,7],[1398,6],[1456,6],[1531,6],[1561,6],[1894,6],[2096,7],[2194,6],[2234,6],[2345,6],[2686,7],[2694,6],[2752,6],[2863,6],[2893,6]]},"297":{"position":[[1222,6],[1365,7],[1627,6]]},"299":{"position":[[64,6]]},"301":{"position":[[191,6],[1021,6],[1227,7],[1247,6],[1287,6],[1362,6],[1649,7],[1728,7],[1861,7],[1869,6],[1927,6],[2002,6],[2032,6],[2447,6],[2649,7],[2747,6],[2787,6],[2898,6],[3239,7],[3247,6],[3305,6],[3416,6],[3446,6]]},"305":{"position":[[66,6],[562,6],[770,7],[790,6],[830,6],[907,6],[1196,7],[1277,7],[1412,7],[1420,6],[1478,6],[1555,6],[1585,6],[2042,6],[2244,7],[2344,6],[2384,6],[2497,6],[2838,7],[2846,6],[2904,6],[3017,6],[3047,6]]},"311":{"position":[[721,7],[971,7],[1198,7]]},"315":{"position":[[1106,7]]},"317":{"position":[[66,6],[539,6],[748,7],[768,6],[808,6],[886,6],[1176,7],[1258,7],[1394,7],[1402,6],[1460,6],[1538,6],[1568,6],[2014,6],[2216,7],[2317,6],[2357,6],[2471,6],[2812,7],[2820,6],[2878,6],[2992,6],[3022,6]]},"323":{"position":[[114,6]]},"325":{"position":[[1515,6],[1952,6],[2159,7],[2179,6],[2219,6],[2295,6],[2583,7],[2663,7],[2797,7],[2869,6],[2968,6],[2998,7],[3052,8],[3061,6],[3119,6],[3195,6],[3225,6],[3648,6],[3850,7],[3949,6],[3989,6],[4101,6],[4442,7],[4450,6],[4508,6],[4620,6],[4650,6]]},"327":{"position":[[1573,7]]},"329":{"position":[[66,6],[439,6],[643,7],[663,6],[703,6],[776,6],[1061,7],[1138,7],[1269,7],[1277,6],[1335,6],[1408,6],[1438,6],[1751,6],[1953,7],[2049,6],[2089,6],[2198,6],[2539,7],[2547,6],[2605,6],[2714,6],[2744,6]]},"333":{"position":[[66,6],[410,6],[620,7],[640,6],[680,6],[759,6],[1050,7],[1133,7],[1270,7],[1278,6],[1336,6],[1415,6],[1445,6],[1754,6],[1956,7],[2058,6],[2098,6],[2213,6],[2554,7],[2562,6],[2620,6],[2735,6],[2765,6]]},"337":{"position":[[145,7]]},"341":{"position":[[66,6],[475,6],[688,7],[708,6],[748,6],[830,6],[1124,7],[1210,7],[1350,7],[1358,6],[1416,6],[1498,6],[1528,6],[1861,6],[2063,7],[2168,6],[2208,6],[2326,6],[2667,7],[2675,6],[2733,6],[2851,6],[2881,6]]},"343":{"position":[[995,6],[4724,7]]},"345":{"position":[[66,6],[657,6],[865,7],[885,6],[925,6],[1002,6],[1291,7],[1372,7],[1507,7],[1515,6],[1573,6],[1650,6],[1680,6],[2143,6],[2345,7],[2445,6],[2485,6],[2598,6],[2939,7],[2947,6],[3005,6],[3118,6],[3148,6]]},"349":{"position":[[66,6],[513,6],[722,7],[742,6],[782,6],[860,6],[1150,7],[1232,7],[1368,7],[1376,6],[1434,6],[1512,6],[1542,6],[1897,6],[2099,7],[2200,6],[2240,6],[2354,6],[2695,7],[2703,6],[2761,6],[2875,6],[2905,6]]},"351":{"position":[[16,7]]},"361":{"position":[[44,6],[461,7],[767,7],[1141,7],[1478,7],[1666,7],[1976,7],[2282,7]]},"369":{"position":[[110,6]]},"378":{"position":[[1488,6]]},"382":{"position":[[257,7]]},"384":{"position":[[68,6]]},"387":{"position":[[17,7],[323,7]]},"389":{"position":[[17,7],[222,7]]},"391":{"position":[[255,7]]},"395":{"position":[[589,7]]},"425":{"position":[[1145,6],[1236,6],[1257,6],[3128,6],[3376,6]]},"444":{"position":[[88,6]]},"457":{"position":[[2344,6]]},"459":{"position":[[1527,6]]},"466":{"position":[[197,7]]},"472":{"position":[[99,6]]},"481":{"position":[[612,7]]},"496":{"position":[[557,7]]},"499":{"position":[[17,7],[193,7]]},"501":{"position":[[10,6],[57,7],[80,7],[105,7],[506,7]]},"503":{"position":[[294,7],[528,7]]},"505":{"position":[[202,7],[603,7]]},"509":{"position":[[480,7],[904,7],[1059,7]]},"543":{"position":[[656,6]]},"549":{"position":[[319,6],[754,6],[980,6],[1125,6],[1227,6]]},"557":{"position":[[1848,6]]},"573":{"position":[[62,7]]},"584":{"position":[[21,6],[71,6],[104,6],[156,7],[1960,6]]},"586":{"position":[[93,6],[549,6],[575,7],[630,7],[739,7]]},"588":{"position":[[28,7],[86,7],[166,6],[1097,6]]},"599":{"position":[[3428,7]]},"621":{"position":[[258,6]]},"623":{"position":[[213,6],[278,6],[1217,7]]},"625":{"position":[[1164,6],[1321,7]]},"627":{"position":[[150,6],[194,6],[403,6],[474,6],[490,6],[551,6],[628,7],[960,6],[1017,6],[1237,6]]},"631":{"position":[[76,6],[134,6]]}}}],["config.json",{"_index":137,"t":{"4":{"position":[[3329,13],[5876,11]]},"12":{"position":[[1513,11]]},"14":{"position":[[1157,11]]},"18":{"position":[[3078,11],[3299,11],[4907,11],[5056,11]]},"20":{"position":[[444,11],[456,11]]},"27":{"position":[[222,11],[344,11],[809,11],[1162,11],[1542,11]]},"46":{"position":[[1959,13],[2264,13],[2782,13]]},"66":{"position":[[2468,13],[2775,13],[3295,13]]},"85":{"position":[[2185,13],[2492,13],[3012,13]]},"91":{"position":[[2188,13],[2494,13],[3013,13]]},"95":{"position":[[1869,13],[2175,13],[2694,13]]},"103":{"position":[[2247,13],[2554,13],[3074,13]]},"110":{"position":[[3182,13],[3489,13],[4009,13]]},"114":{"position":[[2069,13],[2381,13],[2906,13]]},"143":{"position":[[2482,13],[2788,13],[3307,13]]},"151":{"position":[[2567,11]]},"153":{"position":[[2560,13],[2870,13],[3393,13]]},"178":{"position":[[1785,11]]},"186":{"position":[[2057,13],[2366,13],[2888,13]]},"188":{"position":[[5587,13],[5895,13],[6416,13]]},"198":{"position":[[2082,13],[2388,13],[2907,13]]},"200":{"position":[[1901,11]]},"202":{"position":[[1812,13],[2119,13],[2639,13]]},"208":{"position":[[2008,13],[2314,13],[2833,13]]},"214":{"position":[[1983,13],[2287,13],[2804,13]]},"218":{"position":[[2356,13],[2666,13],[3189,13]]},"220":{"position":[[2616,13],[2921,13],[3439,13]]},"234":{"position":[[2062,13],[2373,13],[2897,13]]},"253":{"position":[[2142,13],[2452,13],[2975,13]]},"257":{"position":[[2569,13],[2876,13],[3396,13]]},"261":{"position":[[2392,13],[2704,13],[3229,13]]},"265":{"position":[[2167,13],[2473,13],[2992,13]]},"269":{"position":[[2500,13],[2806,13],[3325,13]]},"277":{"position":[[2220,13],[2526,13],[3045,13]]},"281":{"position":[[1944,13],[2247,13],[2763,13]]},"285":{"position":[[1981,13],[2290,13],[2812,13]]},"291":{"position":[[2477,13],[2784,13],[3304,13]]},"295":{"position":[[1957,13],[2262,13],[2780,13]]},"301":{"position":[[2510,13],[2815,13],[3333,13]]},"305":{"position":[[2105,13],[2412,13],[2932,13]]},"311":{"position":[[729,11],[1206,11]]},"317":{"position":[[2077,13],[2385,13],[2906,13]]},"325":{"position":[[3711,13],[4017,13],[4536,13]]},"329":{"position":[[1814,13],[2117,13],[2633,13]]},"333":{"position":[[1817,13],[2126,13],[2648,13]]},"341":{"position":[[1924,13],[2236,13],[2761,13]]},"345":{"position":[[2206,13],[2513,13],[3033,13]]},"349":{"position":[[1960,13],[2268,13],[2789,13]]},"361":{"position":[[51,11],[469,11],[1149,11],[1984,11]]},"387":{"position":[[25,11]]},"389":{"position":[[25,11]]},"395":{"position":[[178,11]]},"444":{"position":[[246,11]]},"466":{"position":[[205,11],[774,11]]},"468":{"position":[[125,11]]},"499":{"position":[[25,11]]},"501":{"position":[[113,11]]},"503":{"position":[[302,11]]},"505":{"position":[[210,11]]},"507":{"position":[[434,11]]},"509":{"position":[[488,11],[1067,11]]},"549":{"position":[[390,13]]},"584":{"position":[[1073,13]]},"623":{"position":[[675,11]]},"627":{"position":[[157,11]]}}}],["config/applemusic.json",{"_index":1608,"t":{"153":{"position":[[1544,22],[2005,22]]}}}],["config/azuracast.json",{"_index":1798,"t":{"186":{"position":[[1305,21],[1764,21]]}}}],["config/chromecast.json",{"_index":2006,"t":{"218":{"position":[[1657,22],[2118,22]]}}}],["config/config.json",{"_index":139,"t":{"4":{"position":[[3517,19]]},"46":{"position":[[3074,18]]},"66":{"position":[[3589,18]]},"85":{"position":[[3306,18]]},"91":{"position":[[3306,18]]},"95":{"position":[[2987,18]]},"103":{"position":[[3368,18]]},"110":{"position":[[4303,18]]},"114":{"position":[[3205,18]]},"143":{"position":[[3600,18]]},"153":{"position":[[3690,18]]},"186":{"position":[[3184,18]]},"188":{"position":[[6711,18]]},"198":{"position":[[3200,18]]},"202":{"position":[[2933,18]]},"208":{"position":[[3126,18]]},"214":{"position":[[3095,18]]},"218":{"position":[[3486,18]]},"220":{"position":[[3731,18]]},"234":{"position":[[3195,18]]},"253":{"position":[[3272,18]]},"257":{"position":[[3690,18]]},"261":{"position":[[3528,18]]},"265":{"position":[[3285,18]]},"269":{"position":[[3618,18]]},"277":{"position":[[3338,18]]},"281":{"position":[[3053,18]]},"285":{"position":[[3108,18]]},"291":{"position":[[3598,18]]},"295":{"position":[[3072,18]]},"301":{"position":[[3625,18]]},"305":{"position":[[3226,18]]},"317":{"position":[[3201,18]]},"325":{"position":[[4829,18]]},"329":{"position":[[2923,18]]},"333":{"position":[[2944,18]]},"341":{"position":[[3060,18]]},"345":{"position":[[3327,18]]},"349":{"position":[[3084,18]]},"549":{"position":[[1923,20],[1944,20]]}}}],["config/config.json.exampl",{"_index":161,"t":{"4":{"position":[[4435,27]]}}}],["config/data",{"_index":3119,"t":{"545":{"position":[[224,11]]}}}],["config/deezer.json",{"_index":1899,"t":{"198":{"position":[[1320,18],[1773,18]]}}}],["config/discord.json",{"_index":954,"t":{"66":{"position":[[1728,19],[2183,19]]},"85":{"position":[[1487,19],[1942,19]]}}}],["config/endpointlfm.json",{"_index":2061,"t":{"234":{"position":[[1418,23],[1881,23]]}}}],["config/endpointlz.json",{"_index":2085,"t":{"253":{"position":[[1489,22],[1950,22]]}}}],["config/icecast.json",{"_index":1921,"t":{"202":{"position":[[1158,19],[1613,19]]}}}],["config/jellyfin.json",{"_index":1838,"t":{"188":{"position":[[4436,20],[4893,20]]}}}],["config/jriver.json",{"_index":1942,"t":{"208":{"position":[[1329,18],[1782,18]]}}}],["config/kodi.json",{"_index":1959,"t":{"214":{"position":[[1289,16],[1738,16]]}}}],["config/koito.json",{"_index":770,"t":{"46":{"position":[[1227,17],[1678,17]]},"220":{"position":[[1631,17],[2335,17]]}}}],["config/lastfm.json",{"_index":1131,"t":{"91":{"position":[[1394,18],[1847,18]]},"269":{"position":[[1450,18],[2159,18]]}}}],["config/librefm.json",{"_index":1174,"t":{"103":{"position":[[1494,19],[1949,19]]},"257":{"position":[[1557,19],[2271,19]]}}}],["config/listenbrainz.json",{"_index":1255,"t":{"114":{"position":[[1297,24],[1762,24]]},"261":{"position":[[1346,24],[2085,24]]}}}],["config/maloja.json",{"_index":1151,"t":{"95":{"position":[[1167,18],[1620,18]]},"265":{"position":[[1209,18],[1918,18]]}}}],["config/mopidy.json",{"_index":2148,"t":{"277":{"position":[[1524,18],[1977,18]]}}}],["config/mpd.json",{"_index":2162,"t":{"281":{"position":[[1251,15],[1698,15]]}}}],["config/mpris.json",{"_index":2204,"t":{"295":{"position":[[1289,17],[1740,17]]}}}],["config/multi",{"_index":3141,"t":{"549":{"position":[[1026,15]]}}}],["config/musiccast.json",{"_index":2401,"t":{"333":{"position":[[1165,21],[1624,21]]}}}],["config/musikcube.json",{"_index":2177,"t":{"285":{"position":[[1284,21],[1743,21]]}}}],["config/rocksky.json",{"_index":1245,"t":{"110":{"position":[[2419,19],[2874,19]]},"291":{"position":[[1455,19],[2169,19]]}}}],["config/sonos.json",{"_index":2234,"t":{"301":{"position":[[1760,17],[2211,17]]}}}],["config/spotify.json",{"_index":2295,"t":{"305":{"position":[[1309,19],[1764,19]]}}}],["config/subsonic.json",{"_index":2339,"t":{"317":{"position":[[1290,20],[1747,20]]}}}],["config/systemd/us",{"_index":3218,"t":{"573":{"position":[[79,22]]}}}],["config/systemd/user/multi",{"_index":3220,"t":{"573":{"position":[[108,28]]}}}],["config/tealfm.json",{"_index":1473,"t":{"143":{"position":[[1780,18],[2233,18]]},"325":{"position":[[2695,18],[3404,18]]}}}],["config/vlc.json",{"_index":2376,"t":{"327":{"position":[[1581,15],[2376,15]]},"329":{"position":[[1170,15],[1617,15]]}}}],["config/webscrobbler.json",{"_index":2430,"t":{"341":{"position":[[1242,24],[1707,24]]}}}],["config/ymbridge.json",{"_index":2528,"t":{"349":{"position":[[1264,20],[1721,20]]}}}],["config/ytmusic.json",{"_index":2495,"t":{"345":{"position":[[1404,19],[1859,19]]}}}],["config:/config",{"_index":1703,"t":{"174":{"position":[[1458,18]]},"178":{"position":[[1624,18]]},"347":{"position":[[504,18]]},"384":{"position":[[1024,18]]},"472":{"position":[[2104,18]]},"543":{"position":[[310,18],[626,18]]},"545":{"position":[[1044,16]]},"555":{"position":[[468,18]]}}}],["config_dir",{"_index":73,"t":{"4":{"position":[[1215,10],[2508,11],[3385,10]]},"16":{"position":[[100,11]]},"604":{"position":[[100,11]]},"625":{"position":[[553,10]]},"627":{"position":[[1158,11]]}}}],["config_dir/config.json",{"_index":163,"t":{"4":{"position":[[4499,22]]},"174":{"position":[[2540,22]]},"176":{"position":[[1744,22]]},"178":{"position":[[1931,22],[3130,22]]}}}],["config_dir/endpointlz.json",{"_index":1707,"t":{"174":{"position":[[1793,26]]},"178":{"position":[[2567,26]]}}}],["config_dir/jellyin.json",{"_index":1727,"t":{"176":{"position":[[564,23]]}}}],["config_dir/koito.json",{"_index":1719,"t":{"174":{"position":[[2311,21]]},"176":{"position":[[1515,21]]}}}],["config_dir/lastfm.json",{"_index":696,"t":{"42":{"position":[[1004,22]]},"174":{"position":[[2107,22]]},"176":{"position":[[1117,22]]},"178":{"position":[[2781,22]]}}}],["config_dir/plex.json",{"_index":1710,"t":{"174":{"position":[[1910,20]]},"176":{"position":[[951,20]]}}}],["config_dir/spotify.json",{"_index":1705,"t":{"174":{"position":[[1540,23]]},"178":{"position":[[2314,23]]}}}],["config_dir=/my/absolute/path",{"_index":3138,"t":{"549":{"position":[[696,28]]}}}],["configs.push",{"_index":3301,"t":{"588":{"position":[[860,14]]}}}],["configur",{"_index":4,"t":{"2":{"position":[[47,14]]},"4":{"position":[[24,10],[158,13],[181,13],[224,14],[536,13],[1153,13],[1434,9],[1474,13],[1755,13],[1828,13],[1860,13],[1919,14],[1956,14],[2164,13],[2309,14],[3177,13],[3310,13],[3622,9],[3661,13],[3951,13],[4005,9],[4124,11],[4273,14],[5818,10],[6182,13]]},"6":{"position":[[8,13],[82,15],[256,13],[300,9],[321,13]]},"8":{"position":[[23,14],[211,13]]},"10":{"position":[[230,13],[468,14],[598,14]]},"12":{"position":[[216,10],[832,13],[1067,10],[1112,13],[1242,9],[1377,9]]},"14":{"position":[[884,14]]},"16":{"position":[[460,14],[569,13]]},"18":{"position":[[1108,10],[1214,13],[1554,14],[2098,13],[2227,11],[2284,13],[4113,13],[4204,11],[4259,13]]},"20":{"position":[[89,13]]},"27":{"position":[[42,10],[200,10],[302,10]]},"31":{"position":[[499,13]]},"38":{"position":[[778,13]]},"42":{"position":[[535,10],[815,13]]},"46":{"position":[[13,13],[40,13],[545,13],[789,13],[1024,13],[1429,13],[1973,13],[2278,13],[2796,13]]},"60":{"position":[[113,13],[315,14],[560,9],[1194,14],[1751,9]]},"64":{"position":[[174,10],[462,10],[2699,10],[3381,9],[3483,10],[3767,14],[4118,10],[4200,14]]},"66":{"position":[[13,13],[40,13],[1038,13],[1286,13],[1521,13],[1934,13],[2482,13],[2789,13],[3309,13]]},"73":{"position":[[512,11],[669,13],[1547,9],[3558,13],[3717,9],[6637,13],[8513,13],[10029,13]]},"77":{"position":[[146,9]]},"83":{"position":[[3206,9],[3559,14]]},"85":{"position":[[13,13],[40,13],[797,13],[1045,13],[1280,13],[1693,13],[2199,13],[2506,13],[3026,13]]},"89":{"position":[[546,13]]},"91":{"position":[[13,13],[40,13],[708,13],[954,13],[1189,13],[1598,13],[2202,13],[2508,13],[3027,13]]},"93":{"position":[[548,13]]},"95":{"position":[[13,13],[40,13],[481,13],[727,13],[962,13],[1371,13],[1883,13],[2189,13],[2708,13]]},"97":{"position":[[359,14]]},"99":{"position":[[540,13]]},"103":{"position":[[13,13],[40,13],[804,13],[1052,13],[1287,13],[1700,13],[2261,13],[2568,13],[3088,13]]},"110":{"position":[[779,13],[899,13],[1065,13],[1092,13],[1729,13],[1977,13],[2212,13],[2625,13],[3196,13],[3503,13],[4023,13]]},"112":{"position":[[385,14]]},"114":{"position":[[13,13],[40,13],[587,13],[845,13],[1080,13],[1513,13],[2083,13],[2395,13],[2920,13]]},"116":{"position":[[33,13]]},"118":{"position":[[2124,10],[5093,14],[5274,15]]},"120":{"position":[[18,13],[138,13],[324,14]]},"123":{"position":[[46,10]]},"128":{"position":[[6,13],[33,14]]},"132":{"position":[[103,13]]},"134":{"position":[[513,9]]},"140":{"position":[[82,13]]},"143":{"position":[[589,13],[616,13],[1094,13],[1340,13],[1575,13],[1984,13],[2496,13],[2802,13],[3321,13]]},"145":{"position":[[124,10]]},"147":{"position":[[648,9]]},"149":{"position":[[2377,13]]},"153":{"position":[[13,13],[40,13],[842,13],[1096,13],[1331,13],[1756,13],[2574,13],[2884,13],[3407,13]]},"162":{"position":[[134,13]]},"164":{"position":[[97,13],[403,10],[443,10]]},"166":{"position":[[1684,10]]},"168":{"position":[[299,14]]},"171":{"position":[[106,13],[291,13],[338,13],[369,13]]},"174":{"position":[[441,13]]},"176":{"position":[[127,13],[172,13],[523,13]]},"178":{"position":[[574,13],[1808,13],[3007,13]]},"182":{"position":[[1309,11],[1442,10],[1542,10]]},"186":{"position":[[13,13],[40,13],[607,13],[859,13],[1094,13],[1515,13],[2071,13],[2380,13],[2902,13]]},"188":{"position":[[327,13],[2095,14],[2123,13],[2150,13],[3742,13],[3992,13],[4227,13],[4644,13],[5601,13],[5909,13],[6430,13]]},"198":{"position":[[13,13],[40,13],[634,13],[880,13],[1115,13],[1524,13],[2096,13],[2402,13],[2921,13]]},"200":{"position":[[698,9],[2158,10]]},"202":{"position":[[13,13],[40,13],[468,13],[716,13],[951,13],[1364,13],[1826,13],[2133,13],[2653,13]]},"204":{"position":[[322,13]]},"208":{"position":[[13,13],[40,13],[643,13],[889,13],[1124,13],[1533,13],[2022,13],[2328,13],[2847,13]]},"210":{"position":[[288,13]]},"214":{"position":[[13,13],[40,13],[611,13],[853,13],[1088,13],[1489,13],[1997,13],[2301,13],[2818,13]]},"216":{"position":[[605,9],[767,10],[795,13],[914,10],[2124,14],[2156,10],[2721,13]]},"218":{"position":[[13,13],[40,13],[93,11],[955,13],[1209,13],[1444,13],[1869,13],[2370,13],[2680,13],[3203,13]]},"220":{"position":[[99,10],[208,13],[272,14],[340,14],[368,13],[395,13],[949,13],[1193,13],[1428,13],[1766,11],[2086,13],[2630,13],[2935,13],[3453,13]]},"224":{"position":[[416,9],[484,9],[822,9],[889,9],[916,9],[1013,9],[1376,9],[1615,9],[1681,11],[2273,9],[2682,9]]},"228":{"position":[[78,9]]},"230":{"position":[[12,9],[75,9],[222,9],[434,9],[632,13]]},"234":{"position":[[13,13],[40,13],[712,13],[968,13],[1203,13],[1632,13],[2076,13],[2387,13],[2911,13]]},"238":{"position":[[402,9],[475,9],[805,9],[878,9],[905,9],[992,9],[1352,9],[1602,9],[1656,11],[2254,9],[2655,9]]},"240":{"position":[[75,11]]},"242":{"position":[[191,13],[327,9]]},"244":{"position":[[12,9],[203,9],[390,13]]},"249":{"position":[[164,13],[214,10],[283,11],[377,13]]},"253":{"position":[[13,13],[40,13],[787,13],[1041,13],[1276,13],[1701,13],[2156,13],[2466,13],[2989,13]]},"255":{"position":[[85,10],[171,9],[236,13],[356,13]]},"257":{"position":[[13,13],[40,13],[867,13],[1115,13],[1350,13],[1694,11],[2022,13],[2583,13],[2890,13],[3410,13]]},"259":{"position":[[106,10],[485,14]]},"261":{"position":[[13,13],[40,13],[636,13],[894,13],[1129,13],[1488,11],[1836,13],[2406,13],[2718,13],[3243,13]]},"263":{"position":[[92,13],[156,14]]},"265":{"position":[[13,13],[40,13],[523,13],[769,13],[1004,13],[1345,11],[1669,13],[2181,13],[2487,13],[3006,13]]},"267":{"position":[[84,10],[286,9],[351,13],[470,13]]},"269":{"position":[[13,13],[40,13],[764,13],[1010,13],[1245,13],[1586,11],[1910,13],[2514,13],[2820,13],[3339,13]]},"271":{"position":[[748,13],[835,13]]},"277":{"position":[[13,13],[40,13],[838,13],[1084,13],[1319,13],[1728,13],[2234,13],[2540,13],[3059,13]]},"281":{"position":[[13,13],[40,13],[577,13],[817,13],[1052,13],[1449,13],[1958,13],[2261,13],[2777,13]]},"283":{"position":[[26,9]]},"285":{"position":[[13,13],[40,13],[586,13],[838,13],[1073,13],[1494,13],[1995,13],[2304,13],[2826,13]]},"287":{"position":[[244,10]]},"291":{"position":[[25,13],[89,14],[170,13],[197,13],[765,13],[1013,13],[1248,13],[1592,11],[1920,13],[2491,13],[2798,13],[3318,13]]},"293":{"position":[[1009,10]]},"295":{"position":[[13,13],[40,13],[607,13],[851,13],[1086,13],[1491,13],[1971,13],[2276,13],[2794,13]]},"297":{"position":[[616,10],[858,9]]},"301":{"position":[[138,13],[165,13],[1078,13],[1322,13],[1557,13],[1962,13],[2524,13],[2829,13],[3347,13]]},"303":{"position":[[3097,10],[3409,13],[5363,13]]},"305":{"position":[[13,13],[40,13],[619,13],[867,13],[1102,13],[1515,13],[2119,13],[2426,13],[2946,13]]},"307":{"position":[[491,13]]},"311":{"position":[[337,9],[529,14]]},"313":{"position":[[689,13]]},"317":{"position":[[13,13],[40,13],[596,13],[846,13],[1081,13],[1498,13],[2091,13],[2399,13],[2920,13]]},"319":{"position":[[323,10]]},"323":{"position":[[25,13],[90,14]]},"325":{"position":[[362,10],[1462,13],[1489,13],[2009,13],[2255,13],[2490,13],[2831,11],[3155,13],[3725,13],[4031,13],[4550,13]]},"327":{"position":[[869,13],[2362,13]]},"329":{"position":[[13,13],[40,13],[496,13],[736,13],[971,13],[1368,13],[1828,13],[2131,13],[2647,13]]},"333":{"position":[[13,13],[40,13],[467,13],[719,13],[954,13],[1375,13],[1831,13],[2140,13],[2662,13]]},"339":{"position":[[10,10],[279,10]]},"341":{"position":[[13,13],[40,13],[532,13],[790,13],[1025,13],[1458,13],[1938,13],[2250,13],[2775,13]]},"343":{"position":[[1879,9],[4984,14]]},"345":{"position":[[13,13],[40,13],[714,13],[962,13],[1197,13],[1610,13],[2220,13],[2527,13],[3047,13]]},"349":{"position":[[13,13],[40,13],[570,13],[820,13],[1055,13],[1472,13],[1974,13],[2282,13],[2803,13]]},"355":{"position":[[314,13]]},"361":{"position":[[23,10],[260,13],[370,9],[1055,11],[1836,14],[1863,13]]},"363":{"position":[[1079,11]]},"365":{"position":[[25,10]]},"372":{"position":[[302,9]]},"378":{"position":[[31,14]]},"382":{"position":[[60,14],[149,14]]},"384":{"position":[[12,13],[368,13],[543,13]]},"391":{"position":[[177,13]]},"395":{"position":[[10,13],[102,13],[417,14]]},"419":{"position":[[105,14]]},"421":{"position":[[240,13]]},"423":{"position":[[4,13]]},"425":{"position":[[834,14]]},"435":{"position":[[1646,13],[1929,11]]},"437":{"position":[[52,14]]},"444":{"position":[[304,13],[357,13]]},"447":{"position":[[420,13]]},"455":{"position":[[65,14]]},"457":{"position":[[1458,13]]},"459":{"position":[[1604,14]]},"466":{"position":[[171,13],[459,14]]},"468":{"position":[[69,10],[89,13]]},"470":{"position":[[874,13]]},"472":{"position":[[12,13],[50,10],[246,9],[949,13],[1259,13],[1440,13]]},"474":{"position":[[387,14]]},"476":{"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]]},"479":{"position":[[129,13]]},"481":{"position":[[1910,14]]},"483":{"position":[[799,14],[2420,13]]},"488":{"position":[[73,13]]},"505":{"position":[[18,10]]},"507":{"position":[[338,13],[420,13]]},"509":{"position":[[293,13]]},"539":{"position":[[74,13]]},"543":{"position":[[130,15],[1843,13]]},"547":{"position":[[37,9]]},"549":{"position":[[376,13]]},"557":{"position":[[156,13],[2069,9]]},"559":{"position":[[241,9]]},"565":{"position":[[117,10],[147,9]]},"567":{"position":[[328,10],[434,10]]},"569":{"position":[[189,13],[227,9],[358,13]]},"599":{"position":[[3391,10]]},"606":{"position":[[52,14]]},"621":{"position":[[178,13]]},"623":{"position":[[362,14],[646,14],[1272,13]]},"627":{"position":[[62,13],[243,13],[1089,13]]},"631":{"position":[[56,10],[168,10]]},"633":{"position":[[923,11],[1226,13]]},"635":{"position":[[11,14],[99,10],[247,10]]},"637":{"position":[[248,14],[469,10]]},"639":{"position":[[164,14]]},"645":{"position":[[8,13]]},"647":{"position":[[61,13],[194,14]]},"649":{"position":[[34,14]]}}}],["configuraion",{"_index":791,"t":{"46":{"position":[[2542,12]]},"66":{"position":[[3055,12]]},"85":{"position":[[2772,12]]},"91":{"position":[[2773,12]]},"95":{"position":[[2454,12]]},"103":{"position":[[2834,12]]},"110":{"position":[[3769,12]]},"114":{"position":[[2666,12]]},"143":{"position":[[3067,12]]},"153":{"position":[[3153,12]]},"186":{"position":[[2648,12]]},"188":{"position":[[6176,12]]},"198":{"position":[[2667,12]]},"202":{"position":[[2399,12]]},"208":{"position":[[2593,12]]},"214":{"position":[[2564,12]]},"218":{"position":[[2949,12]]},"220":{"position":[[3199,12]]},"234":{"position":[[2657,12]]},"253":{"position":[[2735,12]]},"257":{"position":[[3156,12]]},"261":{"position":[[2989,12]]},"265":{"position":[[2752,12]]},"269":{"position":[[3085,12]]},"277":{"position":[[2805,12]]},"281":{"position":[[2523,12]]},"285":{"position":[[2572,12]]},"291":{"position":[[3064,12]]},"295":{"position":[[2540,12]]},"301":{"position":[[3093,12]]},"305":{"position":[[2692,12]]},"317":{"position":[[2666,12]]},"325":{"position":[[4296,12]]},"329":{"position":[[2393,12]]},"333":{"position":[[2408,12]]},"341":{"position":[[2521,12]]},"345":{"position":[[2793,12]]},"349":{"position":[[2549,12]]},"474":{"position":[[96,12]]}}}],["configuration/data",{"_index":2736,"t":{"425":{"position":[[941,18]]},"618":{"position":[[539,18]]}}}],["configurea",{"_index":246,"t":{"8":{"position":[[552,14],[988,14]]},"42":{"position":[[1057,14]]},"46":{"position":[[1749,14],[3159,14]]},"91":{"position":[[1937,14],[3409,14]]},"95":{"position":[[1708,14],[3088,14]]},"103":{"position":[[2043,14],[3474,14]]},"110":{"position":[[2956,14],[4397,14]]},"114":{"position":[[1855,14],[3305,14]]},"143":{"position":[[2306,14],[3686,14]]},"151":{"position":[[2920,14]]},"174":{"position":[[2171,14],[2376,14],[3192,14],[3389,14]]},"176":{"position":[[1185,14],[1371,14],[1580,14],[2448,14],[2652,14],[2853,14]]},"178":{"position":[[2845,14],[4048,14]]},"220":{"position":[[316,14],[1740,11],[1823,14],[2406,14],[3816,14]]},"255":{"position":[[308,14]]},"257":{"position":[[1668,11],[1753,14],[2365,14],[3796,14]]},"261":{"position":[[1462,11],[1552,14],[2178,14],[3628,14]]},"263":{"position":[[200,14]]},"265":{"position":[[1319,11],[1403,14],[2006,14],[3386,14]]},"267":{"position":[[422,14]]},"269":{"position":[[1560,11],[1644,14],[2249,14],[3721,14]]},"291":{"position":[[133,14],[1566,11],[1651,14],[2251,14],[3692,14]]},"323":{"position":[[134,14]]},"325":{"position":[[859,14],[1068,14],[1298,14],[2805,11],[2889,14],[3477,14],[4915,14]]},"355":{"position":[[419,14]]},"399":{"position":[[98,14]]},"507":{"position":[[655,14]]},"559":{"position":[[1809,14]]},"563":{"position":[[947,14]]},"588":{"position":[[943,12]]},"623":{"position":[[430,14],[728,14]]}}}],["confirm",{"_index":1102,"t":{"87":{"position":[[390,9]]},"533":{"position":[[507,10]]}}}],["conflict",{"_index":828,"t":{"54":{"position":[[808,8]]},"60":{"position":[[170,8]]}}}],["confus",{"_index":1514,"t":{"149":{"position":[[921,10]]},"151":{"position":[[1083,8]]},"451":{"position":[[269,7]]}}}],["congratul",{"_index":3383,"t":{"594":{"position":[[2985,16]]}}}],["conjunct",{"_index":2995,"t":{"483":{"position":[[570,11]]}}}],["connect",{"_index":385,"t":{"14":{"position":[[859,10],[910,10],[955,7]]},"50":{"position":[[412,10]]},"73":{"position":[[722,10],[3062,7],[3298,7],[3770,11],[5294,10],[9529,7]]},"79":{"position":[[286,7]]},"182":{"position":[[22,7]]},"188":{"position":[[2699,7]]},"206":{"position":[[16,7],[83,7],[561,7],[719,7]]},"208":{"position":[[396,7]]},"212":{"position":[[16,7],[81,7],[553,7],[711,7]]},"214":{"position":[[382,7]]},"216":{"position":[[718,10]]},"218":{"position":[[117,11]]},"232":{"position":[[862,10]]},"251":{"position":[[867,10]]},"271":{"position":[[360,7],[438,7],[1020,7]]},"277":{"position":[[395,7]]},"279":{"position":[[46,11]]},"281":{"position":[[361,7]]},"283":{"position":[[59,11]]},"285":{"position":[[383,7]]},"301":{"position":[[95,7],[470,9]]},"307":{"position":[[63,7]]},"329":{"position":[[361,7]]},"425":{"position":[[1413,11],[1897,10]]},"435":{"position":[[271,8],[908,7],[1200,7]]},"439":{"position":[[153,10],[485,10]]},"557":{"position":[[2629,7]]},"592":{"position":[[1404,11],[1451,10]]},"627":{"position":[[807,10],[913,13],[1049,10],[1334,10],[1509,13]]},"649":{"position":[[19,11]]}}}],["connect:/run/discord",{"_index":1074,"t":{"73":{"position":[[7994,20]]}}}],["connect:/run/user/1000/bu",{"_index":2197,"t":{"293":{"position":[[1642,26]]}}}],["connect:/run/user/1000/discord",{"_index":1065,"t":{"73":{"position":[[6105,30],[7662,30]]}}}],["connector",{"_index":2424,"t":{"339":{"position":[[69,11],[149,10],[251,9]]},"341":{"position":[[361,10],[441,10]]}}}],["consecut",{"_index":2846,"t":{"457":{"position":[[685,11]]}}}],["consent",{"_index":2454,"t":{"343":{"position":[[1899,7]]}}}],["conserv",{"_index":827,"t":{"54":{"position":[[753,14]]},"60":{"position":[[130,12]]}}}],["consid",{"_index":1083,"t":{"73":{"position":[[9083,8]]},"297":{"position":[[1843,9]]},"313":{"position":[[418,11]]},"378":{"position":[[107,10],[252,10]]},"457":{"position":[[583,9]]},"459":{"position":[[429,8]]},"479":{"position":[[272,10]]},"488":{"position":[[624,8]]},"492":{"position":[[28,9]]},"524":{"position":[[33,9],[145,8]]}}}],["consider",{"_index":2942,"t":{"476":{"position":[[1370,14]]}}}],["consist",{"_index":1117,"t":{"87":{"position":[[1382,10]]},"105":{"position":[[238,8]]},"125":{"position":[[393,11]]},"138":{"position":[[236,8]]},"200":{"position":[[395,11]]},"357":{"position":[[1138,8]]},"359":{"position":[[557,8]]},"361":{"position":[[116,8]]},"415":{"position":[[54,8]]},"427":{"position":[[127,8]]},"457":{"position":[[968,11]]},"459":{"position":[[1144,10]]},"463":{"position":[[48,10]]},"490":{"position":[[1223,12],[1746,12]]},"507":{"position":[[62,10]]},"637":{"position":[[263,7]]},"639":{"position":[[179,7]]}}}],["consistu",{"_index":1356,"t":{"118":{"position":[[4186,11]]}}}],["consol",{"_index":2453,"t":{"343":{"position":[[1791,7],[4162,7]]},"345":{"position":[[338,7],[425,7],[495,7]]}}}],["const",{"_index":3271,"t":{"584":{"position":[[1806,5]]},"588":{"position":[[614,6],[730,5]]},"590":{"position":[[684,5]]},"592":{"position":[[481,5],[569,5],[803,5],[1765,5],[2362,5]]},"594":{"position":[[1848,5],[1932,5],[2048,5],[2295,5],[2769,5]]},"597":{"position":[[748,5],[965,5]]},"599":{"position":[[3037,5],[3570,5]]}}}],["constraint",{"_index":2957,"t":{"476":{"position":[[6026,11]]}}}],["constructor",{"_index":2751,"t":{"425":{"position":[[2072,11]]},"586":{"position":[[67,11]]},"597":{"position":[[236,11],[500,14]]},"599":{"position":[[659,12],[943,14]]}}}],["constructor(nam",{"_index":3281,"t":{"586":{"position":[[607,17]]}}}],["consult",{"_index":3209,"t":{"569":{"position":[[584,7]]},"602":{"position":[[169,7]]},"606":{"position":[[67,7]]},"618":{"position":[[106,7]]}}}],["consum",{"_index":1186,"t":{"105":{"position":[[516,7]]},"138":{"position":[[514,7]]}}}],["contact",{"_index":1755,"t":{"178":{"position":[[2037,10],[3236,10]]},"311":{"position":[[587,7],[875,7],[905,10],[1352,7],[1382,10]]},"435":{"position":[[140,7],[195,10]]},"466":{"position":[[307,10],[876,10],[995,10]]},"468":{"position":[[227,10]]},"499":{"position":[[127,10]]},"501":{"position":[[215,10]]},"503":{"position":[[404,10]]},"505":{"position":[[312,10]]},"507":{"position":[[536,10]]},"509":{"position":[[590,10],[1169,10]]},"559":{"position":[[420,7],[597,7]]},"561":{"position":[[153,7],[330,7]]},"599":{"position":[[1280,8],[1331,10]]}}}],["contact@mydomain.com",{"_index":1756,"t":{"178":{"position":[[2048,22],[3247,22]]},"466":{"position":[[318,22],[887,22],[1006,23]]},"468":{"position":[[238,22]]},"499":{"position":[[138,22]]},"501":{"position":[[226,22]]},"503":{"position":[[415,22]]},"505":{"position":[[323,22]]},"507":{"position":[[547,22]]},"509":{"position":[[601,22],[1180,22]]}}}],["contain",{"_index":76,"t":{"4":{"position":[[1357,10],[3545,10]]},"14":{"position":[[443,9],[481,9]]},"18":{"position":[[429,8]]},"50":{"position":[[504,9]]},"64":{"position":[[1351,7],[2561,7],[2656,8],[2938,7],[3064,8],[3618,7]]},"73":{"position":[[329,9],[873,9],[1037,9],[1496,10],[1628,9],[7729,9],[8842,11]]},"77":{"position":[[95,10],[227,9]]},"83":{"position":[[1210,7],[2420,7],[2515,8],[2763,7],[2889,8],[3410,7]]},"93":{"position":[[280,10]]},"155":{"position":[[31,8]]},"188":{"position":[[3003,8],[3127,8],[3237,8],[3348,8]]},"216":{"position":[[1278,9],[2377,8],[2907,8]]},"253":{"position":[[524,8]]},"293":{"position":[[735,9],[847,9],[965,10],[1027,9]]},"301":{"position":[[560,8],[666,8],[807,8],[950,8]]},"303":{"position":[[2142,7],[3503,9],[3712,9],[3807,9],[4576,9]]},"347":{"position":[[101,9],[1095,10]]},"359":{"position":[[62,10]]},"361":{"position":[[328,10]]},"419":{"position":[[16,8],[422,9]]},"423":{"position":[[228,8]]},"425":{"position":[[1152,10],[1269,8]]},"441":{"position":[[50,7]]},"459":{"position":[[628,8]]},"461":{"position":[[25,8]]},"466":{"position":[[100,8]]},"476":{"position":[[85,9],[387,10],[1863,8],[2112,8],[2790,8],[3323,8],[3651,8]]},"479":{"position":[[35,8]]},"490":{"position":[[258,8],[1071,7]]},"509":{"position":[[90,8]]},"543":{"position":[[108,9],[225,9],[514,10],[804,9],[922,9],[1467,9],[1738,9]]},"545":{"position":[[156,9]]},"553":{"position":[[469,9]]},"565":{"position":[[2038,10]]},"567":{"position":[[44,9],[210,10]]},"602":{"position":[[241,7],[328,7]]},"608":{"position":[[74,7]]},"616":{"position":[[321,9],[664,9],[801,9]]},"618":{"position":[[397,10]]},"627":{"position":[[784,10]]},"637":{"position":[[31,8]]}}}],["container",{"_index":958,"t":{"73":{"position":[[243,13],[466,13]]}}}],["container_nam",{"_index":996,"t":{"73":{"position":[[2097,15]]},"77":{"position":[[696,15]]},"174":{"position":[[555,15]]},"178":{"position":[[688,15]]},"347":{"position":[[299,15]]},"384":{"position":[[663,15]]},"472":{"position":[[1560,15]]},"545":{"position":[[528,15]]},"555":{"position":[[192,15]]}}}],["content",{"_index":1553,"t":{"149":{"position":[[3714,8]]},"192":{"position":[[523,8]]},"303":{"position":[[3373,8]]},"412":{"position":[[306,8]]},"517":{"position":[[593,8]]},"555":{"position":[[98,8]]},"573":{"position":[[176,8]]}}}],["context",{"_index":2304,"t":{"309":{"position":[[329,7],[456,7]]},"427":{"position":[[374,7]]},"457":{"position":[[2605,8]]},"513":{"position":[[311,7]]}}}],["contextu",{"_index":2326,"t":{"315":{"position":[[341,10]]}}}],["continu",{"_index":854,"t":{"57":{"position":[[473,9]]},"105":{"position":[[1290,8]]},"130":{"position":[[545,8]]},"138":{"position":[[1284,8]]},"151":{"position":[[1394,12]]},"303":{"position":[[612,8],[4158,8]]},"315":{"position":[[848,8]]},"343":{"position":[[1619,8],[4388,8]]},"365":{"position":[[39,8],[266,9],[474,9],[1451,10]]},"425":{"position":[[747,8]]},"505":{"position":[[919,10]]}}}],["contribut",{"_index":2892,"t":{"459":{"position":[[718,11]]},"461":{"position":[[115,11]]}}}],["contriv",{"_index":1671,"t":{"171":{"position":[[22,10]]}}}],["control",{"_index":148,"t":{"4":{"position":[[3921,7]]},"22":{"position":[[108,7]]},"151":{"position":[[2403,7]]},"210":{"position":[[153,7],[180,7]]},"212":{"position":[[461,7]]},"214":{"position":[[438,7],[509,7]]},"303":{"position":[[2578,8],[4662,7],[4973,8]]},"365":{"position":[[629,7],[791,7],[887,7],[1168,7]]},"441":{"position":[[947,8]]},"457":{"position":[[434,7]]},"476":{"position":[[1003,8],[7119,8]]},"481":{"position":[[134,12]]},"505":{"position":[[122,7]]},"633":{"position":[[1044,8]]}}}],["conveni",{"_index":1460,"t":{"138":{"position":[[2018,12]]},"303":{"position":[[4526,12]]},"382":{"position":[[9,12]]},"395":{"position":[[368,12]]},"533":{"position":[[2,11]]}}}],["convert",{"_index":1268,"t":{"118":{"position":[[296,9],[345,9]]}}}],["cooki",{"_index":1490,"t":{"147":{"position":[[329,7],[402,6]]},"192":{"position":[[21,6],[274,6],[448,7],[545,6],[655,7]]},"343":{"position":[[549,7],[672,6],[784,6],[849,6],[967,6],[1088,9],[1337,8],[1721,8]]},"345":{"position":[[553,6],[1968,9],[3448,9]]},"441":{"position":[[391,7],[555,7],[640,7],[1035,6],[1204,7]]}}}],["cool",{"_index":186,"t":{"4":{"position":[[4940,5]]},"46":{"position":[[237,4]]},"66":{"position":[[243,4]]},"85":{"position":[[243,4]]},"91":{"position":[[240,4]]},"95":{"position":[[240,4]]},"103":{"position":[[243,4]]},"110":{"position":[[1295,4]]},"114":{"position":[[228,4]]},"136":{"position":[[650,4],[769,4],[857,4],[1044,4]]},"143":{"position":[[816,4]]},"153":{"position":[[252,4]]},"184":{"position":[[391,4],[428,4],[766,4],[798,4],[849,4],[921,4]]},"186":{"position":[[237,4],[1835,5],[3265,5]]},"188":{"position":[[2356,4],[4926,5],[6755,5]]},"196":{"position":[[467,4]]},"198":{"position":[[240,4]]},"202":{"position":[[243,4]]},"208":{"position":[[240,4]]},"214":{"position":[[234,4]]},"218":{"position":[[323,4]]},"220":{"position":[[613,4]]},"234":{"position":[[231,4]]},"253":{"position":[[231,4]]},"257":{"position":[[264,4]]},"261":{"position":[[249,4]]},"265":{"position":[[261,4]]},"269":{"position":[[261,4]]},"275":{"position":[[466,4],[488,4],[553,4],[575,4]]},"277":{"position":[[240,4]]},"281":{"position":[[231,4]]},"285":{"position":[[228,4]]},"291":{"position":[[421,4]]},"295":{"position":[[237,4]]},"301":{"position":[[362,4]]},"305":{"position":[[243,4]]},"317":{"position":[[246,4]]},"325":{"position":[[1710,4]]},"327":{"position":[[1767,4]]},"329":{"position":[[231,4]]},"333":{"position":[[237,4]]},"341":{"position":[[228,4]]},"345":{"position":[[231,4]]},"349":{"position":[[246,4]]},"376":{"position":[[346,4],[612,4]]},"378":{"position":[[1465,4]]},"391":{"position":[[89,4]]},"397":{"position":[[134,4],[161,4],[280,4],[307,4],[610,4],[644,4],[838,4],[878,4]]},"476":{"position":[[3167,4],[4590,4],[4651,4],[4925,4]]},"581":{"position":[[80,4],[93,4],[630,4],[704,4],[919,4]]},"584":{"position":[[42,4],[617,4],[645,4],[786,4]]},"586":{"position":[[770,4]]},"590":{"position":[[87,4],[582,4]]},"592":{"position":[[1978,5],[2506,4]]},"594":{"position":[[2432,4]]}}}],["coolplay",{"_index":3259,"t":{"584":{"position":[[1137,12],[1785,13],[1860,12]]},"588":{"position":[[155,10],[716,13],[881,13],[1112,12],[1306,13]]},"590":{"position":[[457,10],[951,12]]}}}],["coolplayer'",{"_index":3272,"t":{"584":{"position":[[2012,12]]}}}],["coolplayer.j",{"_index":3264,"t":{"584":{"position":[[1436,18]]}}}],["coolplayerdata",{"_index":3290,"t":{"588":{"position":[[328,14],[988,14]]}}}],["coolplayersourc",{"_index":3273,"t":{"586":{"position":[[36,16],[460,16]]},"588":{"position":[[131,16],[224,16],[310,17],[511,16],[1070,16]]},"590":{"position":[[357,16]]},"592":{"position":[[50,16],[378,16],[1638,16],[2276,16]]},"594":{"position":[[607,16],[1705,16],[3007,16]]},"597":{"position":[[460,16]]},"599":{"position":[[903,16],[2088,16]]}}}],["coolplayersource(nam",{"_index":3309,"t":{"588":{"position":[[1342,22]]}}}],["coolplayersource.formatplayobj(play",{"_index":3379,"t":{"594":{"position":[[2376,37]]}}}],["coolplayersource.formatplayobj(x",{"_index":3387,"t":{"597":{"position":[[1014,35]]}}}],["coolplayersource.j",{"_index":3291,"t":{"588":{"position":[[350,24]]}}}],["coolplayersource.parseconnectionurl(baseurl",{"_index":3344,"t":{"592":{"position":[[1164,45]]}}}],["coolplayersourceaioconfig",{"_index":3258,"t":{"584":{"position":[[985,25],[1379,26],[1597,26]]}}}],["coolplayersourceconfig",{"_index":3257,"t":{"584":{"position":[[887,22],[1019,22],[1406,22],[1511,23]]},"586":{"position":[[173,22],[583,23],[638,23]]},"588":{"position":[[1384,23]]}}}],["coolplayersourcedata",{"_index":3250,"t":{"584":{"position":[[475,20],[945,20]]}}}],["coordin",{"_index":2249,"t":{"303":{"position":[[903,10]]}}}],["copi",{"_index":708,"t":{"44":{"position":[[302,4],[325,4]]},"46":{"position":[[1295,4],[2655,4]]},"62":{"position":[[328,4]]},"66":{"position":[[1798,4],[3168,4]]},"71":{"position":[[181,4]]},"73":{"position":[[686,4]]},"85":{"position":[[1557,4],[2885,4]]},"91":{"position":[[1463,4],[2886,4]]},"93":{"position":[[465,4]]},"95":{"position":[[1236,4],[2567,4]]},"103":{"position":[[1564,4],[2947,4]]},"110":{"position":[[2489,4],[3882,4]]},"114":{"position":[[1372,4],[2779,4]]},"143":{"position":[[1849,4],[3180,4]]},"147":{"position":[[436,4]]},"149":{"position":[[1565,4],[2272,4]]},"153":{"position":[[1617,4],[3266,4]]},"186":{"position":[[1377,4],[2761,4]]},"188":{"position":[[285,4],[4507,4],[6289,4]]},"192":{"position":[[510,4],[789,4]]},"198":{"position":[[1389,4],[2780,4]]},"202":{"position":[[1228,4],[2512,4]]},"208":{"position":[[1398,4],[2706,4]]},"214":{"position":[[1356,4],[2677,4]]},"218":{"position":[[1730,4],[3062,4]]},"220":{"position":[[1699,4],[3312,4]]},"234":{"position":[[1492,4],[2770,4]]},"253":{"position":[[1562,4],[2848,4]]},"257":{"position":[[1627,4],[3269,4]]},"261":{"position":[[1421,4],[3102,4]]},"265":{"position":[[1278,4],[2865,4]]},"269":{"position":[[1519,4],[3198,4]]},"277":{"position":[[1593,4],[2918,4]]},"281":{"position":[[1317,4],[2636,4]]},"285":{"position":[[1356,4],[2685,4]]},"291":{"position":[[1525,4],[3177,4]]},"295":{"position":[[1357,4],[2653,4]]},"301":{"position":[[1828,4],[3206,4]]},"303":{"position":[[3364,4],[5219,4]]},"305":{"position":[[1379,4],[2805,4]]},"317":{"position":[[1361,4],[2779,4]]},"325":{"position":[[2764,4],[4409,4]]},"329":{"position":[[1236,4],[2506,4]]},"333":{"position":[[1237,4],[2521,4]]},"341":{"position":[[1317,4],[2634,4]]},"343":{"position":[[2522,4]]},"345":{"position":[[1474,4],[2906,4]]},"349":{"position":[[1335,4],[2662,4]]},"444":{"position":[[337,4]]},"517":{"position":[[231,4],[378,6],[481,6]]},"565":{"position":[[394,4],[417,4],[2226,4]]},"604":{"position":[[347,4]]}}}],["core",{"_index":3396,"t":{"599":{"position":[[1937,4]]}}}],["core/atomic.j",{"_index":3317,"t":{"590":{"position":[[312,23]]},"599":{"position":[[851,23]]}}}],["corner",{"_index":1143,"t":{"93":{"position":[[373,7]]},"565":{"position":[[2131,7]]},"616":{"position":[[166,6]]}}}],["corpor",{"_index":2909,"t":{"459":{"position":[[1421,9]]},"463":{"position":[[325,9]]}}}],["correct",{"_index":763,"t":{"46":{"position":[[1041,8],[2558,8]]},"66":{"position":[[1538,8],[3071,8]]},"73":{"position":[[3520,7]]},"85":{"position":[[1297,8],[2788,8]]},"91":{"position":[[1206,8],[2789,8]]},"95":{"position":[[979,8],[2470,8]]},"103":{"position":[[1304,8],[2850,8]]},"110":{"position":[[2229,8],[3785,8]]},"114":{"position":[[1097,8],[2682,8]]},"136":{"position":[[345,7]]},"143":{"position":[[1592,8],[3083,8]]},"153":{"position":[[1348,8],[3169,8]]},"186":{"position":[[1111,8],[2664,8]]},"188":{"position":[[4244,8],[6192,8]]},"196":{"position":[[928,7]]},"198":{"position":[[1132,8],[2683,8]]},"202":{"position":[[968,8],[2415,8]]},"208":{"position":[[1141,8],[2609,8]]},"214":{"position":[[1105,8],[2580,8]]},"218":{"position":[[1461,8],[2965,8]]},"220":{"position":[[1445,8],[3215,8]]},"222":{"position":[[589,11]]},"234":{"position":[[1220,8],[2673,8]]},"253":{"position":[[1293,8],[2751,8]]},"257":{"position":[[1367,8],[3172,8]]},"261":{"position":[[1146,8],[3005,8]]},"265":{"position":[[1021,8],[2768,8]]},"269":{"position":[[1262,8],[3101,8]]},"277":{"position":[[1336,8],[2821,8]]},"281":{"position":[[1069,8],[2539,8]]},"285":{"position":[[1090,8],[2588,8]]},"291":{"position":[[1265,8],[3080,8]]},"295":{"position":[[1103,8],[2556,8]]},"297":{"position":[[404,7]]},"301":{"position":[[1574,8],[3109,8]]},"303":{"position":[[1940,7]]},"305":{"position":[[1119,8],[2708,8]]},"317":{"position":[[1098,8],[2682,8]]},"325":{"position":[[2507,8],[4312,8]]},"329":{"position":[[988,8],[2409,8]]},"333":{"position":[[971,8],[2424,8]]},"341":{"position":[[1042,8],[2537,8]]},"345":{"position":[[1214,8],[2809,8]]},"349":{"position":[[1072,8],[2565,8]]},"393":{"position":[[137,10],[317,10]]},"417":{"position":[[357,7]]},"435":{"position":[[2381,7]]},"437":{"position":[[36,7]]},"457":{"position":[[327,7]]},"459":{"position":[[149,7]]},"481":{"position":[[1273,7]]},"483":{"position":[[1332,9],[2283,7]]},"488":{"position":[[193,10]]},"492":{"position":[[183,8]]},"507":{"position":[[247,10]]},"549":{"position":[[234,7]]},"569":{"position":[[519,7]]},"633":{"position":[[730,12],[2479,7]]}}}],["correct/norm",{"_index":3187,"t":{"559":{"position":[[109,17]]}}}],["correctli",{"_index":80,"t":{"4":{"position":[[1449,9],[3637,9]]},"44":{"position":[[1562,9]]},"46":{"position":[[1138,9]]},"50":{"position":[[331,9]]},"66":{"position":[[1637,9]]},"73":{"position":[[3983,10]]},"85":{"position":[[1396,9]]},"91":{"position":[[1304,9]]},"95":{"position":[[1077,9]]},"103":{"position":[[1403,9]]},"110":{"position":[[2328,9]]},"114":{"position":[[1201,9]]},"143":{"position":[[1690,9]]},"151":{"position":[[1162,9]]},"153":{"position":[[1450,9]]},"180":{"position":[[39,9],[207,10]]},"182":{"position":[[318,9]]},"186":{"position":[[1212,9]]},"188":{"position":[[4344,9]]},"198":{"position":[[1230,9]]},"202":{"position":[[1067,9]]},"208":{"position":[[1239,9]]},"214":{"position":[[1201,9]]},"216":{"position":[[1748,9]]},"218":{"position":[[1563,9]]},"220":{"position":[[1542,9]]},"234":{"position":[[1323,9]]},"253":{"position":[[1395,9]]},"257":{"position":[[1466,9]]},"261":{"position":[[1250,9]]},"265":{"position":[[1119,9]]},"269":{"position":[[1360,9]]},"277":{"position":[[1434,9]]},"281":{"position":[[1164,9]]},"285":{"position":[[1191,9]]},"291":{"position":[[1364,9]]},"295":{"position":[[1200,9]]},"301":{"position":[[1671,9]]},"305":{"position":[[1218,9]]},"317":{"position":[[1198,9]]},"325":{"position":[[2605,9]]},"327":{"position":[[2080,9]]},"329":{"position":[[1083,9]]},"331":{"position":[[117,9],[273,10]]},"333":{"position":[[1072,9]]},"341":{"position":[[1146,9]]},"345":{"position":[[1313,9]]},"349":{"position":[[1172,9]]},"439":{"position":[[1174,10]]},"490":{"position":[[1767,9]]},"565":{"position":[[1210,9]]}}}],["correspond",{"_index":2348,"t":{"325":{"position":[[111,10]]},"427":{"position":[[591,13]]},"476":{"position":[[2803,13]]},"490":{"position":[[744,13]]},"599":{"position":[[1445,13]]}}}],["count",{"_index":434,"t":{"18":{"position":[[646,5],[811,5],[1035,5]]},"31":{"position":[[118,5],[155,5]]},"182":{"position":[[1377,5]]}}}],["counterpart",{"_index":1271,"t":{"118":{"position":[[370,13]]}}}],["countri",{"_index":2519,"t":{"347":{"position":[[1401,7]]},"481":{"position":[[505,7],[946,7],[983,7],[1144,7]]}}}],["cover",{"_index":887,"t":{"62":{"position":[[55,5]]},"64":{"position":[[2728,5],[2889,5],[3189,5],[3582,5]]},"83":{"position":[[2553,5],[2714,5],[3014,5],[3374,5]]},"327":{"position":[[2209,5]]},"459":{"position":[[810,6]]},"461":{"position":[[207,6]]},"509":{"position":[[51,5]]}}}],["coverartarch",{"_index":550,"t":{"25":{"position":[[319,15]]}}}],["cp",{"_index":3297,"t":{"588":{"position":[[736,2],[982,2]]}}}],["cpu",{"_index":614,"t":{"31":{"position":[[392,3]]}}}],["crash",{"_index":1081,"t":{"73":{"position":[[9028,8]]},"216":{"position":[[211,7]]}}}],["creat",{"_index":33,"t":{"4":{"position":[[457,6]]},"6":{"position":[[55,8]]},"16":{"position":[[61,7]]},"18":{"position":[[3665,6]]},"31":{"position":[[823,7]]},"44":{"position":[[68,6],[148,6],[260,6]]},"62":{"position":[[0,8],[109,8],[225,6]]},"71":{"position":[[9,6],[64,8]]},"87":{"position":[[83,6],[190,6],[1099,6],[1256,8]]},"93":{"position":[[439,6]]},"97":{"position":[[75,6]]},"105":{"position":[[60,6],[841,6]]},"107":{"position":[[197,6]]},"112":{"position":[[76,6],[202,6]]},"130":{"position":[[339,6]]},"138":{"position":[[70,6],[839,6]]},"140":{"position":[[141,6],[299,6]]},"143":{"position":[[989,7]]},"149":{"position":[[3042,6],[3272,6]]},"151":{"position":[[2482,8]]},"188":{"position":[[39,6],[238,6],[294,7]]},"220":{"position":[[161,6]]},"222":{"position":[[148,6],[237,6]]},"236":{"position":[[381,6],[480,6]]},"255":{"position":[[141,6]]},"259":{"position":[[175,6],[301,6]]},"263":{"position":[[43,6]]},"267":{"position":[[148,6],[255,6]]},"287":{"position":[[35,6]]},"297":{"position":[[1138,6],[1997,8]]},"303":{"position":[[696,7],[1126,7],[1295,8],[1699,6],[1907,6],[2627,6],[3703,6]]},"319":{"position":[[42,6]]},"325":{"position":[[1904,7]]},"343":{"position":[[1799,7],[1833,6],[2141,6],[2438,6],[2458,7]]},"419":{"position":[[435,8]]},"496":{"position":[[267,8]]},"513":{"position":[[216,8]]},"517":{"position":[[320,7]]},"524":{"position":[[422,6]]},"555":{"position":[[0,6],[62,6]]},"557":{"position":[[290,8],[437,7],[578,6],[829,7],[911,8],[1697,6],[1734,6],[1798,8],[1908,8],[2535,7],[2734,8],[2991,6],[3660,8]]},"559":{"position":[[506,8],[1087,8],[1230,8],[1372,8],[1510,8],[1609,7]]},"561":{"position":[[239,8]]},"563":{"position":[[225,8],[368,8],[510,8],[648,8],[747,7]]},"565":{"position":[[240,6],[352,6],[971,7],[1615,7],[2200,6],[2338,7]]},"567":{"position":[[184,7]]},"571":{"position":[[150,6]]},"573":{"position":[[0,6],[207,8]]},"579":{"position":[[52,8]]},"584":{"position":[[8,6],[129,6],[634,7],[1888,6]]},"586":{"position":[[9,6]]},"588":{"position":[[1059,6]]},"590":{"position":[[12,6]]},"604":{"position":[[61,7],[256,7]]},"625":{"position":[[606,7]]},"649":{"position":[[70,8]]}}}],["creation",{"_index":894,"t":{"62":{"position":[[376,8]]},"71":{"position":[[229,8]]},"87":{"position":[[1512,9]]},"303":{"position":[[1057,8]]},"557":{"position":[[3521,8]]},"565":{"position":[[1498,8]]}}}],["creator",{"_index":1324,"t":{"118":{"position":[[1889,8]]}}}],["credenti",{"_index":857,"t":{"57":{"position":[[609,10],[655,11]]},"228":{"position":[[172,11]]},"303":{"position":[[3184,12]]},"313":{"position":[[282,12]]},"343":{"position":[[1555,11],[2129,11],[2148,11],[4579,11],[4705,11]]},"423":{"position":[[294,12]]},"425":{"position":[[1329,11],[3235,11]]},"543":{"position":[[146,12]]},"633":{"position":[[1169,11]]}}}],["critic",{"_index":1187,"t":{"105":{"position":[[528,11]]},"138":{"position":[[526,11]]},"216":{"position":[[3175,8]]}}}],["crosbi",{"_index":2663,"t":{"389":{"position":[[148,8]]}}}],["cross",{"_index":3094,"t":{"541":{"position":[[0,5]]}}}],["ctrl+shift+i",{"_index":1521,"t":{"149":{"position":[[1117,12]]},"192":{"position":[[583,12]]}}}],["current",{"_index":373,"t":{"14":{"position":[[328,10]]},"42":{"position":[[31,9]]},"48":{"position":[[101,9]]},"54":{"position":[[101,9]]},"68":{"position":[[101,9]]},"87":{"position":[[329,7]]},"97":{"position":[[267,9]]},"125":{"position":[[465,9]]},"151":{"position":[[150,7]]},"160":{"position":[[815,7]]},"168":{"position":[[21,9]]},"216":{"position":[[1627,7]]},"228":{"position":[[235,10]]},"365":{"position":[[137,9],[746,7]]},"369":{"position":[[560,7]]},"543":{"position":[[2035,7]]},"549":{"position":[[1387,7]]},"567":{"position":[[466,7]]},"581":{"position":[[578,7]]},"584":{"position":[[2112,7]]},"594":{"position":[[397,10],[1889,9],[2670,9]]},"616":{"position":[[4,7]]},"633":{"position":[[2745,7]]}}}],["custom",{"_index":695,"t":{"42":{"position":[[922,9]]},"50":{"position":[[167,13]]},"52":{"position":[[233,13]]},"54":{"position":[[1613,6]]},"62":{"position":[[42,6]]},"64":{"position":[[1296,6],[3872,11],[4165,6]]},"81":{"position":[[110,14]]},"83":{"position":[[1155,6],[3664,11]]},"101":{"position":[[70,6]]},"166":{"position":[[1381,10]]},"182":{"position":[[276,6]]},"224":{"position":[[3291,7]]},"232":{"position":[[490,6]]},"238":{"position":[[3245,7]]},"251":{"position":[[490,6]]},"331":{"position":[[451,6]]},"343":{"position":[[2886,6],[3353,8],[3435,6],[3721,6]]},"365":{"position":[[1152,10]]},"441":{"position":[[402,6]]}}}],["cwd/build",{"_index":3074,"t":{"533":{"position":[[473,11]]}}}],["d",{"_index":1139,"t":{"93":{"position":[[323,1]]},"216":{"position":[[1236,1]]},"565":{"position":[[2081,1]]},"567":{"position":[[249,1]]},"608":{"position":[[287,1]]}}}],["d3df",{"_index":2609,"t":{"369":{"position":[[1017,4]]}}}],["daemon",{"_index":1625,"t":{"157":{"position":[[668,7]]},"216":{"position":[[1044,6],[1256,6]]},"293":{"position":[[455,7]]},"575":{"position":[[34,6]]},"633":{"position":[[345,7]]}}}],["daemon/socket",{"_index":1981,"t":{"216":{"position":[[1390,13]]}}}],["daemon/socket:/var/run/avahi",{"_index":1980,"t":{"216":{"position":[[1361,28]]}}}],["dashboard",{"_index":527,"t":{"22":{"position":[[23,9]]},"31":{"position":[[795,9],[841,9],[914,9]]},"40":{"position":[[270,10]]},"42":{"position":[[686,9]]},"44":{"position":[[198,9],[541,9],[620,9]]},"64":{"position":[[2974,10],[3667,10]]},"83":{"position":[[2799,10],[3459,10]]},"89":{"position":[[227,10],[283,9]]},"99":{"position":[[227,10],[283,9]]},"164":{"position":[[525,9]]},"168":{"position":[[423,9]]},"182":{"position":[[750,9]]},"188":{"position":[[141,9],[1731,9],[2008,9]]},"200":{"position":[[850,9]]},"303":{"position":[[1488,9],[1883,9],[5433,9]]},"343":{"position":[[3097,9],[4254,9],[5080,10],[5172,9],[5304,11],[5390,9]]},"415":{"position":[[359,10]]},"441":{"position":[[533,10]]},"513":{"position":[[50,10],[123,10]]},"517":{"position":[[9,10]]},"543":{"position":[[837,9],[1221,9],[1321,9]]},"553":{"position":[[136,9],[526,9]]},"557":{"position":[[1163,9],[3941,9]]},"565":{"position":[[290,9],[629,9],[708,9]]},"567":{"position":[[418,9]]},"599":{"position":[[3155,9]]},"616":{"position":[[84,10]]},"623":{"position":[[1069,10]]},"625":{"position":[[33,9]]},"631":{"position":[[10,10]]}}}],["dashboard.json",{"_index":636,"t":{"31":{"position":[[945,14]]}}}],["data",{"_index":34,"t":{"4":{"position":[[472,4],[506,4],[1314,4],[2632,7],[2835,7],[2989,7],[3490,4],[4982,7],[5239,7],[5966,7]]},"8":{"position":[[165,4],[577,7],[1013,7]]},"12":{"position":[[282,4],[513,4],[1347,4]]},"14":{"position":[[55,4],[97,4],[155,4]]},"18":{"position":[[54,4],[129,4],[379,4],[603,4],[747,4],[921,4],[1152,5],[1407,4],[1610,5],[1639,4],[1721,4],[2196,4],[3649,4]]},"38":{"position":[[532,5],[651,4]]},"42":{"position":[[1082,7]]},"46":{"position":[[1774,7],[3184,7]]},"54":{"position":[[488,4]]},"60":{"position":[[912,7],[2008,7]]},"64":{"position":[[2924,4],[3059,4]]},"66":{"position":[[2267,7],[3685,7]]},"83":{"position":[[2749,4],[2884,4]]},"85":{"position":[[2025,7],[3401,7]]},"87":{"position":[[939,4]]},"91":{"position":[[1962,7],[3434,7]]},"95":{"position":[[1733,7],[3113,7]]},"101":{"position":[[139,4]]},"103":{"position":[[2068,7],[3499,7]]},"105":{"position":[[257,4],[330,4],[429,4],[551,5],[652,4],[1135,4],[1175,4],[1233,4],[1390,4],[1450,4],[1928,4],[2001,4]]},"110":{"position":[[2981,7],[4422,7]]},"114":{"position":[[1880,7],[3330,7]]},"118":{"position":[[109,5],[2004,4],[2071,4],[3631,5]]},"120":{"position":[[499,4],[559,4],[640,4],[737,4]]},"123":{"position":[[422,5],[480,5]]},"125":{"position":[[226,5],[264,5]]},"134":{"position":[[108,4],[406,5]]},"136":{"position":[[48,4],[157,4],[741,4],[1476,4],[1530,5]]},"138":{"position":[[255,4],[328,4],[427,4],[549,5],[650,4],[1133,4],[1173,4],[1231,4],[1384,4],[1444,4],[1773,4],[2013,4]]},"143":{"position":[[2331,7],[3711,7]]},"149":{"position":[[2444,7],[3486,7]]},"151":{"position":[[2774,7],[2945,7]]},"153":{"position":[[757,4],[2111,7],[3805,7]]},"155":{"position":[[14,4]]},"160":{"position":[[133,4],[265,4],[381,4],[540,4],[725,4],[1275,4]]},"164":{"position":[[272,7]]},"166":{"position":[[301,4],[1454,7]]},"168":{"position":[[692,7]]},"174":{"position":[[1613,7],[1875,7],[1974,7],[2196,7],[2401,7],[2644,7],[2898,7],[2989,7],[3217,7],[3414,7]]},"176":{"position":[[658,7],[838,7],[1039,7],[1210,7],[1396,7],[1605,7],[1872,7],[2074,7],[2269,7],[2473,7],[2677,7],[2878,7]]},"178":{"position":[[2015,7],[2387,7],[2649,7],[2870,7],[3214,7],[3591,7],[3845,7],[4073,7]]},"182":{"position":[[996,7]]},"184":{"position":[[650,4]]},"186":{"position":[[454,4],[1868,7],[3298,7]]},"188":{"position":[[4995,7],[6824,7]]},"190":{"position":[[61,4]]},"194":{"position":[[315,7]]},"196":{"position":[[685,4],[754,7]]},"198":{"position":[[1873,7],[3313,7]]},"200":{"position":[[370,4],[1094,7],[1950,7]]},"202":{"position":[[1697,7],[3029,7]]},"208":{"position":[[1866,7],[3223,7]]},"214":{"position":[[1817,7],[3189,7]]},"216":{"position":[[435,4],[510,4],[2333,7],[2865,7],[3524,7]]},"218":{"position":[[2180,7],[3557,7]]},"220":{"position":[[2431,7],[3841,7]]},"222":{"position":[[312,4]]},"228":{"position":[[610,4]]},"234":{"position":[[1966,7],[3288,7]]},"253":{"position":[[2044,7],[3375,7]]},"255":{"position":[[250,4]]},"257":{"position":[[2390,7],[3821,7]]},"261":{"position":[[2203,7],[3653,7]]},"265":{"position":[[2031,7],[3411,7]]},"267":{"position":[[365,4]]},"269":{"position":[[2274,7],[3746,7]]},"275":{"position":[[188,4],[305,5]]},"277":{"position":[[680,4],[2060,7],[3434,7]]},"281":{"position":[[1768,7],[3139,7]]},"285":{"position":[[1846,7],[3221,7]]},"289":{"position":[[117,5]]},"291":{"position":[[2276,7],[3717,7]]},"295":{"position":[[1820,7],[3166,7]]},"297":{"position":[[1107,4],[1412,7],[1714,4]]},"301":{"position":[[2284,7],[3712,7]]},"303":{"position":[[4728,4]]},"305":{"position":[[1862,7],[3336,7]]},"311":{"position":[[809,7],[1011,7],[1286,7],[1496,7]]},"315":{"position":[[162,5]]},"317":{"position":[[1835,7],[3300,7]]},"319":{"position":[[211,4]]},"321":{"position":[[117,5]]},"325":{"position":[[662,4],[884,7],[1093,7],[1323,7],[3502,7],[4940,7]]},"327":{"position":[[1634,7],[1876,4],[2429,7]]},"329":{"position":[[1687,7],[3009,7]]},"333":{"position":[[1715,7],[3045,7]]},"337":{"position":[[234,7],[318,7]]},"341":{"position":[[1786,7],[3146,7]]},"343":{"position":[[1005,4],[1078,7],[2625,7],[3854,7]]},"345":{"position":[[1958,7],[3438,7]]},"349":{"position":[[1808,7],[3182,7]]},"351":{"position":[[64,4],[260,4],[506,4],[780,4],[834,4]]},"355":{"position":[[68,4],[85,4],[108,4],[444,7]]},"357":{"position":[[38,4],[103,4],[198,4],[276,4],[341,4],[433,4],[607,4],[654,4],[931,4],[1264,5]]},"359":{"position":[[119,5],[374,4],[451,4],[491,4],[626,4],[702,4]]},"361":{"position":[[311,4],[343,4],[815,7],[1526,7],[1704,7],[2330,7]]},"363":{"position":[[107,4],[1011,4],[1202,5]]},"365":{"position":[[224,5],[525,4]]},"367":{"position":[[289,5],[1537,4]]},"369":{"position":[[378,7]]},"376":{"position":[[91,5],[155,4],[699,5]]},"378":{"position":[[1144,4],[1298,4]]},"380":{"position":[[68,4]]},"382":{"position":[[305,7]]},"387":{"position":[[371,7]]},"389":{"position":[[270,7]]},"391":{"position":[[303,7]]},"393":{"position":[[101,5],[176,5],[209,5],[312,4]]},"395":{"position":[[637,7]]},"399":{"position":[[123,7]]},"423":{"position":[[190,6],[223,4],[237,4]]},"425":{"position":[[785,5],[870,4],[1264,4],[2455,4],[2553,4],[2686,4]]},"427":{"position":[[31,4],[94,4],[146,4],[303,4],[636,4]]},"435":{"position":[[823,4]]},"451":{"position":[[65,4],[554,4]]},"457":{"position":[[219,4],[1562,7],[2397,7]]},"459":{"position":[[40,4],[202,5],[268,5],[598,4],[1021,4],[1158,4],[1201,4]]},"461":{"position":[[418,4]]},"463":{"position":[[62,4],[105,4]]},"466":{"position":[[151,4],[285,7],[854,7]]},"468":{"position":[[205,7]]},"470":{"position":[[105,7],[301,4],[406,7],[804,4],[991,7]]},"474":{"position":[[176,4]]},"476":{"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]]},"481":{"position":[[246,4]]},"488":{"position":[[238,4],[345,4]]},"490":{"position":[[42,4],[253,4],[439,4],[492,5],[541,4],[1088,4],[1312,4],[1829,4]]},"492":{"position":[[192,4],[242,4],[476,4]]},"494":{"position":[[37,4],[305,4],[368,5],[422,7]]},"496":{"position":[[605,7]]},"499":{"position":[[105,7],[241,7]]},"501":{"position":[[193,7],[554,7]]},"503":{"position":[[33,4],[382,7],[576,7]]},"505":{"position":[[290,7],[651,7]]},"507":{"position":[[514,7],[679,7],[996,7],[1215,4]]},"509":{"position":[[85,4],[568,7],[943,7],[1147,7],[1509,7]]},"515":{"position":[[122,4]]},"517":{"position":[[246,4],[279,4],[344,4],[385,4],[488,4],[687,5]]},"524":{"position":[[486,4]]},"543":{"position":[[370,4],[709,4],[1861,4]]},"549":{"position":[[330,4],[431,4],[844,4],[1052,4],[1173,4],[1270,4],[2055,7],[2224,7]]},"553":{"position":[[217,4]]},"555":{"position":[[48,4]]},"559":{"position":[[100,5],[136,5],[1834,7]]},"563":{"position":[[972,7]]},"581":{"position":[[1057,4]]},"584":{"position":[[364,4],[383,4],[939,5],[2031,4]]},"588":{"position":[[976,5]]},"590":{"position":[[68,4],[572,4],[764,5]]},"592":{"position":[[82,5],[117,4]]},"594":{"position":[[1225,4],[1927,4],[2229,4],[2290,4]]},"599":{"position":[[116,4],[204,4],[1796,4],[2541,4],[2641,4]]},"618":{"position":[[444,4]]},"621":{"position":[[82,4]]},"623":{"position":[[385,5],[474,7],[669,5],[789,7]]},"625":{"position":[[466,5]]},"633":{"position":[[694,4],[2046,4],[2389,4],[2468,4],[2818,4]]},"637":{"position":[[14,4],[296,4]]},"639":{"position":[[212,4]]}}}],["data.baseurl",{"_index":2740,"t":{"425":{"position":[[1179,13]]}}}],["data/credenti",{"_index":354,"t":{"12":{"position":[[1038,16]]}}}],["data_dir",{"_index":348,"t":{"12":{"position":[[900,8]]},"543":{"position":[[453,8]]}}}],["data_dir=./relative/data",{"_index":3139,"t":{"549":{"position":[[767,24]]}}}],["data_dir=/msdata",{"_index":3103,"t":{"543":{"position":[[598,16]]}}}],["databas",{"_index":392,"t":{"16":{"position":[[36,8],[178,8],[205,8],[259,8],[437,8],[527,8]]},"18":{"position":[[26,8],[472,8],[1167,8],[3092,11],[3313,11],[3558,9],[4921,11],[5070,11]]},"134":{"position":[[358,8]]},"174":{"position":[[640,8]]},"178":{"position":[[773,8]]},"359":{"position":[[400,8]]},"459":{"position":[[66,9],[619,8],[801,8]]},"461":{"position":[[16,8],[198,8]]},"476":{"position":[[863,8]]},"490":{"position":[[210,8]]},"543":{"position":[[159,9],[375,10],[1606,8]]},"545":{"position":[[613,8]]},"549":{"position":[[436,10]]},"555":{"position":[[277,8]]},"604":{"position":[[36,8],[119,8],[176,8],[326,8]]},"621":{"position":[[23,8],[295,9]]},"625":{"position":[[407,8],[712,9]]},"627":{"position":[[378,9]]},"633":{"position":[[762,8],[2439,8]]}}}],["date",{"_index":2763,"t":{"427":{"position":[[227,4]]},"441":{"position":[[738,4]]}}}],["datetim",{"_index":2546,"t":{"353":{"position":[[336,9],[717,9]]}}}],["day",{"_index":471,"t":{"18":{"position":[[2222,4],[2446,4],[2876,4],[2907,4],[3140,6],[3245,4],[3399,6],[3419,5],[4199,4],[4421,4],[4733,4],[4763,4],[4901,5],[4968,5],[4999,4],[5155,6],[5175,5]]},"149":{"position":[[2853,4]]}}}],["dayj",{"_index":3315,"t":{"590":{"position":[[186,5],[197,8]]}}}],["dayjs(playedat",{"_index":3327,"t":{"590":{"position":[[916,15]]}}}],["db",{"_index":435,"t":{"18":{"position":[[652,2],[817,2],[1041,2]]}}}],["dbu",{"_index":2188,"t":{"293":{"position":[[450,4],[939,4],[1350,4],[1503,4],[1548,4]]}}}],["dbus_session_bus_address=tcp:host=yourhostip,port=6644",{"_index":2198,"t":{"293":{"position":[[1726,54]]}}}],["dbus_session_bus_address=unix:path=/run/user/uid/bu",{"_index":2192,"t":{"293":{"position":[[1172,52]]}}}],["dead",{"_index":676,"t":{"40":{"position":[[281,4]]}}}],["debian",{"_index":3216,"t":{"571":{"position":[[116,7]]}}}],["debug",{"_index":401,"t":{"16":{"position":[[334,9]]},"18":{"position":[[545,5],[1146,5],[1401,5]]},"20":{"position":[[11,5],[60,11],[121,5],[279,5],[412,5]]},"38":{"position":[[645,5]]},"188":{"position":[[5510,7],[7339,7]]},"216":{"position":[[370,5],[3444,5]]},"297":{"position":[[1187,5],[1260,5]]},"327":{"position":[[1845,5]]},"369":{"position":[[660,5]]},"435":{"position":[[979,5],[1422,5],[1452,5],[2443,9]]},"496":{"position":[[170,5],[365,6]]},"513":{"position":[[287,7]]},"515":{"position":[[21,5],[58,5]]},"517":{"position":[[217,5],[236,9],[681,5]]},"524":{"position":[[480,5],[579,5]]}}}],["debug=sono",{"_index":2217,"t":{"297":{"position":[[1641,13]]}}}],["debug_mode=tru",{"_index":526,"t":{"20":{"position":[[531,15]]},"297":{"position":[[1277,15]]},"369":{"position":[[250,15]]},"435":{"position":[[1524,16]]},"457":{"position":[[1650,15]]}}}],["debugdata.json",{"_index":3046,"t":{"517":{"position":[[419,15]]}}}],["debugmod",{"_index":164,"t":{"4":{"position":[[4524,12]]},"20":{"position":[[470,12]]}}}],["decad",{"_index":1679,"t":{"174":{"position":[[387,7]]}}}],["decid",{"_index":1431,"t":{"136":{"position":[[82,7],[1265,7]]},"232":{"position":[[1084,6]]},"251":{"position":[[1095,6]]},"343":{"position":[[163,7]]},"476":{"position":[[1408,6]]},"623":{"position":[[1087,6]]}}}],["declar",{"_index":3280,"t":{"586":{"position":[[567,7]]}}}],["decod",{"_index":2322,"t":{"313":{"position":[[303,9]]}}}],["dedupl",{"_index":1566,"t":{"151":{"position":[[570,12],[1345,14]]}}}],["deezer",{"_index":1616,"t":{"157":{"position":[[165,6]]},"190":{"position":[[54,6],[112,6],[279,6]]},"192":{"position":[[33,6],[217,7]]},"194":{"position":[[30,6],[55,6],[161,6]]},"196":{"position":[[71,6],[222,6],[296,7],[902,6]]},"198":{"position":[[350,6],[654,6],[861,6],[1201,6],[1281,6],[1505,6],[2240,6],[2432,6],[2951,6],[3464,8]]},"633":{"position":[[173,6]]}}}],["deezer'",{"_index":1851,"t":{"190":{"position":[[98,8]]},"192":{"position":[[144,8]]}}}],["deezer.com",{"_index":1854,"t":{"192":{"position":[[306,11],[470,11],[567,11],[689,10]]}}}],["deezer.json",{"_index":1862,"t":{"194":{"position":[[259,11],[279,11]]}}}],["deezer_account_id",{"_index":1889,"t":{"198":{"position":[[373,17]]}}}],["deezer_account_id=896225281",{"_index":1880,"t":{"196":{"position":[[624,27]]}}}],["deezer_arl",{"_index":1888,"t":{"198":{"position":[[313,10]]}}}],["deezer_en",{"_index":1887,"t":{"198":{"position":[[255,13]]}}}],["deezer_id",{"_index":1885,"t":{"198":{"position":[[127,9],[210,9]]}}}],["deezer_nam",{"_index":1886,"t":{"198":{"position":[[182,11]]}}}],["deezer_user_ag",{"_index":1891,"t":{"198":{"position":[[449,17]]}}}],["deezerarl",{"_index":1882,"t":{"196":{"position":[[710,12]]}}}],["default",{"_index":74,"t":{"4":{"position":[[1264,8],[3440,8],[3757,7],[4136,7]]},"10":{"position":[[41,7],[153,7]]},"12":{"position":[[96,7],[859,8]]},"18":{"position":[[1247,7],[2073,8],[2534,7],[4080,8],[4459,7]]},"42":{"position":[[161,7],[768,7]]},"46":{"position":[[107,7]]},"54":{"position":[[788,7]]},"60":{"position":[[105,7]]},"64":{"position":[[227,8],[415,7],[431,7],[580,8],[3151,7],[3708,7],[3786,7],[3851,7]]},"66":{"position":[[107,7],[681,8]]},"73":{"position":[[5198,7]]},"83":{"position":[[324,7],[439,8],[2976,7],[3500,7],[3578,7],[3643,7]]},"85":{"position":[[107,7],[708,8]]},"91":{"position":[[107,7]]},"95":{"position":[[107,7]]},"103":{"position":[[107,7]]},"105":{"position":[[1469,7]]},"110":{"position":[[1159,7]]},"114":{"position":[[107,7],[391,7]]},"132":{"position":[[23,8]]},"138":{"position":[[1463,7]]},"143":{"position":[[683,7]]},"151":{"position":[[484,7],[1150,8],[2085,8],[2650,11]]},"153":{"position":[[107,7]]},"164":{"position":[[358,7]]},"166":{"position":[[1304,7]]},"168":{"position":[[546,7]]},"178":{"position":[[1840,8],[1856,8],[2078,11],[3039,8],[3055,8],[3277,11]]},"182":{"position":[[854,7],[1241,7],[1574,8],[1655,7]]},"186":{"position":[[107,7]]},"188":{"position":[[524,8],[536,10],[1354,7],[2217,7]]},"198":{"position":[[107,7]]},"200":{"position":[[639,8],[954,7],[1287,7]]},"202":{"position":[[107,7]]},"206":{"position":[[176,7],[281,7]]},"208":{"position":[[107,7]]},"212":{"position":[[174,7],[277,7]]},"214":{"position":[[107,7]]},"216":{"position":[[1908,8],[2442,8],[3029,8]]},"218":{"position":[[202,7]]},"220":{"position":[[462,7]]},"224":{"position":[[2773,9]]},"234":{"position":[[107,7]]},"238":{"position":[[2736,9]]},"240":{"position":[[197,7]]},"253":{"position":[[107,7]]},"257":{"position":[[107,7]]},"261":{"position":[[107,7],[426,7]]},"265":{"position":[[107,7]]},"269":{"position":[[107,7]]},"271":{"position":[[531,7],[634,7]]},"277":{"position":[[107,7]]},"281":{"position":[[107,7]]},"283":{"position":[[405,7]]},"285":{"position":[[107,7]]},"291":{"position":[[264,7]]},"295":{"position":[[107,7]]},"301":{"position":[[232,7]]},"305":{"position":[[107,7],[519,7]]},"307":{"position":[[112,8],[184,8],[551,7],[695,9],[1061,9],[1360,8],[1372,7]]},"317":{"position":[[107,7]]},"325":{"position":[[1556,7]]},"329":{"position":[[107,7]]},"331":{"position":[[378,7]]},"333":{"position":[[107,7]]},"341":{"position":[[107,7]]},"345":{"position":[[107,7]]},"349":{"position":[[107,7]]},"361":{"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]]},"365":{"position":[[257,8],[334,8],[465,8],[602,7],[874,7]]},"372":{"position":[[159,7]]},"378":{"position":[[174,7],[327,9],[619,8],[1045,8]]},"380":{"position":[[431,8]]},"382":{"position":[[131,8],[423,7]]},"384":{"position":[[4,7]]},"387":{"position":[[115,11],[132,7],[211,7]]},"389":{"position":[[115,11]]},"391":{"position":[[221,7]]},"395":{"position":[[94,7],[160,9],[257,11],[344,7]]},"425":{"position":[[2140,8],[2242,8]]},"466":{"position":[[918,7]]},"468":{"position":[[106,9],[266,11]]},"470":{"position":[[848,8],[1164,8],[1236,8]]},"472":{"position":[[262,8],[460,7],[479,7],[941,7]]},"474":{"position":[[84,7]]},"476":{"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]]},"479":{"position":[[195,7]]},"481":{"position":[[1932,11]]},"483":{"position":[[2466,11]]},"501":{"position":[[35,7],[256,11]]},"503":{"position":[[445,11],[492,8]]},"505":{"position":[[43,8],[91,7],[353,11]]},"507":{"position":[[310,7],[575,11]]},"509":{"position":[[631,11],[657,8],[1210,11],[1236,8]]},"537":{"position":[[31,8]]},"543":{"position":[[754,8],[914,7]]},"581":{"position":[[648,7]]},"586":{"position":[[446,7]]},"588":{"position":[[382,7],[1016,8],[1172,9],[1440,8]]},"590":{"position":[[343,7]]},"592":{"position":[[261,7],[364,7],[1624,7],[2262,7]]},"594":{"position":[[1691,7]]},"597":{"position":[[446,7]]},"599":{"position":[[889,7],[2808,7],[3480,7]]},"612":{"position":[[4,7]]},"623":{"position":[[913,7]]},"627":{"position":[[1143,9]]}}}],["default/exampl",{"_index":2804,"t":{"437":{"position":[[372,15]]}}}],["defaultconfigurea",{"_index":3303,"t":{"588":{"position":[[956,19]]}}}],["defaults/filt",{"_index":3182,"t":{"557":{"position":[[3060,18]]}}}],["defin",{"_index":111,"t":{"4":{"position":[[2418,7]]},"10":{"position":[[0,7]]},"12":{"position":[[933,7]]},"42":{"position":[[1166,6]]},"60":{"position":[[658,7]]},"105":{"position":[[412,7]]},"138":{"position":[[410,7]]},"206":{"position":[[377,6]]},"212":{"position":[[373,6]]},"244":{"position":[[480,7]]},"255":{"position":[[332,7]]},"267":{"position":[[446,7]]},"271":{"position":[[730,6]]},"301":{"position":[[9,6]]},"307":{"position":[[748,7]]},"313":{"position":[[739,7]]},"337":{"position":[[621,8]]},"357":{"position":[[1170,6]]},"359":{"position":[[183,6]]},"361":{"position":[[243,8],[956,8],[1083,6]]},"365":{"position":[[726,7]]},"382":{"position":[[36,6]]},"395":{"position":[[395,6]]},"425":{"position":[[72,7]]},"466":{"position":[[501,7],[582,6],[650,7]]},"476":{"position":[[298,6],[1146,7],[7014,7]]},"533":{"position":[[456,7]]},"543":{"position":[[1116,7]]},"592":{"position":[[975,10],[1130,10]]},"627":{"position":[[257,7]]}}}],["definit",{"_index":1644,"t":{"160":{"position":[[1166,12]]}}}],["degre",{"_index":3360,"t":{"594":{"position":[[468,7]]}}}],["delet",{"_index":454,"t":{"18":{"position":[[1122,6],[1323,8],[1375,6],[1666,8],[2167,8],[2794,6],[3043,8],[3189,6],[3461,8],[3498,6],[3582,6],[3624,8],[3996,8],[4097,8],[4174,6],[4216,8],[4523,6],[4592,6],[4657,6],[4708,6],[4784,6],[4869,8],[4980,6],[5031,7]]},"343":{"position":[[2042,6]]},"533":{"position":[[307,6]]},"535":{"position":[[194,7]]},"625":{"position":[[949,7]]}}}],["deleteaft",{"_index":516,"t":{"18":{"position":[[4950,14],[5099,14]]}}}],["delim",{"_index":2693,"t":{"412":{"position":[[322,5],[408,13],[593,11]]}}}],["delim>\\\\s*\\\\/\\\\",{"_index":2698,"t":{"412":{"position":[[707,34]]}}}],["delim>\\\\s*\\\\\\\\\\",{"_index":2696,"t":{"412":{"position":[[489,21]]}}}],["delimit",{"_index":1832,"t":{"188":{"position":[[2795,9],[2914,9],[3036,9],[3160,9],[3269,9],[3381,9],[3631,9]]},"218":{"position":[[472,9],[593,9],[713,9],[831,9]]},"295":{"position":[[404,9],[512,9]]},"301":{"position":[[593,9],[699,9],[840,9],[983,9]]},"361":{"position":[[584,10],[629,13],[663,10],[1248,13],[2099,10],[2144,13],[2178,10]]},"376":{"position":[[297,10],[404,10],[468,9]]},"378":{"position":[[118,10],[196,10],[263,10],[300,10]]},"387":{"position":[[140,10],[185,13],[219,10]]},"412":{"position":[[59,9],[232,9],[351,9]]},"472":{"position":[[299,9]]},"476":{"position":[[4243,10],[5177,9],[5573,10]]},"557":{"position":[[2913,9]]}}}],["delimitersextra",{"_index":2647,"t":{"378":{"position":[[46,15]]}}}],["deliv",{"_index":982,"t":{"73":{"position":[[1130,7]]}}}],["delux",{"_index":3006,"t":{"483":{"position":[[1775,6]]}}}],["demon",{"_index":2600,"t":{"369":{"position":[[793,6]]}}}],["deni",{"_index":2208,"t":{"297":{"position":[[714,6]]},"325":{"position":[[999,4]]},"481":{"position":[[1247,4]]},"492":{"position":[[45,4]]}}}],["depend",{"_index":390,"t":{"16":{"position":[[16,7]]},"54":{"position":[[186,6]]},"73":{"position":[[1188,7]]},"130":{"position":[[313,9]]},"132":{"position":[[138,9],[280,9],[363,9],[402,9]]},"134":{"position":[[184,9]]},"149":{"position":[[187,9]]},"216":{"position":[[1698,9]]},"419":{"position":[[188,12]]},"425":{"position":[[1653,7]]},"447":{"position":[[174,12]]},"594":{"position":[[488,9]]},"604":{"position":[[16,7]]}}}],["deploy",{"_index":1023,"t":{"73":{"position":[[2737,6]]},"77":{"position":[[1336,6]]},"384":{"position":[[527,6]]},"472":{"position":[[1424,6]]}}}],["deprec",{"_index":1227,"t":{"110":{"position":[[447,10],[958,10]]}}}],["depth",{"_index":3414,"t":{"602":{"position":[[394,5]]},"618":{"position":[[272,5]]},"633":{"position":[[1467,5]]}}}],["deriv",{"_index":3364,"t":{"594":{"position":[[1178,8]]}}}],["descend",{"_index":1334,"t":{"118":{"position":[[3356,10]]}}}],["describ",{"_index":229,"t":{"6":{"position":[[283,9]]},"29":{"position":[[532,9]]},"44":{"position":[[772,8]]},"421":{"position":[[216,10]]},"425":{"position":[[420,10]]},"579":{"position":[[100,10]]}}}],["descript",{"_index":736,"t":{"46":{"position":[[115,11]]},"66":{"position":[[115,11]]},"85":{"position":[[115,11]]},"91":{"position":[[115,11]]},"95":{"position":[[115,11]]},"103":{"position":[[115,11]]},"110":{"position":[[1167,11]]},"114":{"position":[[115,11]]},"143":{"position":[[691,11]]},"153":{"position":[[115,11]]},"184":{"position":[[813,14]]},"186":{"position":[[115,11]]},"188":{"position":[[2225,11]]},"198":{"position":[[115,11]]},"202":{"position":[[115,11]]},"208":{"position":[[115,11]]},"214":{"position":[[115,11]]},"218":{"position":[[210,11]]},"220":{"position":[[470,11]]},"234":{"position":[[115,11]]},"253":{"position":[[115,11]]},"257":{"position":[[115,11]]},"261":{"position":[[115,11]]},"265":{"position":[[115,11]]},"269":{"position":[[115,11]]},"277":{"position":[[115,11]]},"281":{"position":[[115,11]]},"285":{"position":[[115,11]]},"291":{"position":[[272,11]]},"295":{"position":[[115,11]]},"301":{"position":[[240,11]]},"305":{"position":[[115,11]]},"317":{"position":[[115,11]]},"325":{"position":[[1564,11]]},"329":{"position":[[115,11]]},"333":{"position":[[115,11]]},"341":{"position":[[115,11]]},"345":{"position":[[115,11]]},"349":{"position":[[115,11]]}}}],["description=multi",{"_index":3222,"t":{"573":{"position":[[248,17]]}}}],["descriptions/typ",{"_index":748,"t":{"46":{"position":[[630,19],[2034,19]]},"66":{"position":[[1125,19],[2543,19]]},"85":{"position":[[884,19],[2260,19]]},"91":{"position":[[794,19],[2263,19]]},"95":{"position":[[567,19],[1944,19]]},"103":{"position":[[891,19],[2322,19]]},"110":{"position":[[1816,19],[3257,19]]},"114":{"position":[[679,19],[2144,19]]},"143":{"position":[[1180,19],[2557,19]]},"153":{"position":[[932,19],[2635,19]]},"186":{"position":[[696,19],[2132,19]]},"188":{"position":[[3830,19],[5662,19]]},"198":{"position":[[720,19],[2157,19]]},"202":{"position":[[555,19],[1887,19]]},"208":{"position":[[729,19],[2083,19]]},"214":{"position":[[695,19],[2058,19]]},"218":{"position":[[1045,19],[2431,19]]},"220":{"position":[[1034,19],[2691,19]]},"234":{"position":[[803,19],[2137,19]]},"253":{"position":[[877,19],[2217,19]]},"257":{"position":[[954,19],[2644,19]]},"261":{"position":[[728,19],[2467,19]]},"265":{"position":[[609,19],[2242,19]]},"269":{"position":[[850,19],[2575,19]]},"277":{"position":[[924,19],[2295,19]]},"281":{"position":[[660,19],[2019,19]]},"285":{"position":[[675,19],[2056,19]]},"291":{"position":[[852,19],[2552,19]]},"295":{"position":[[692,19],[2032,19]]},"301":{"position":[[1163,19],[2585,19]]},"305":{"position":[[706,19],[2180,19]]},"317":{"position":[[684,19],[2152,19]]},"325":{"position":[[2095,19],[3786,19]]},"329":{"position":[[579,19],[1889,19]]},"333":{"position":[[556,19],[1892,19]]},"341":{"position":[[624,19],[1999,19]]},"345":{"position":[[801,19],[2281,19]]},"349":{"position":[[658,19],[2035,19]]}}}],["design",{"_index":499,"t":{"18":{"position":[[3776,8]]},"105":{"position":[[1743,6]]},"149":{"position":[[121,8]]},"335":{"position":[[583,8]]}}}],["desir",{"_index":1753,"t":{"178":{"position":[[1922,8],[3121,8]]},"492":{"position":[[148,7]]}}}],["desired/allow",{"_index":2935,"t":{"474":{"position":[[340,15]]}}}],["desktop",{"_index":796,"t":{"50":{"position":[[62,7]]},"73":{"position":[[368,7],[3342,8]]},"85":{"position":[[1974,10],[3350,10]]},"188":{"position":[[93,7]]},"277":{"position":[[2016,9],[3390,9]]},"281":{"position":[[1757,10],[3128,10]]},"285":{"position":[[1814,10],[3189,10]]},"295":{"position":[[1770,10],[3116,10]]},"329":{"position":[[1676,10],[2998,10]]},"457":{"position":[[2741,9],[2825,7]]},"633":{"position":[[366,8]]},"637":{"position":[[112,7]]}}}],["destin",{"_index":1423,"t":{"132":{"position":[[90,12],[180,12]]},"157":{"position":[[56,11]]}}}],["deta",{"_index":431,"t":{"18":{"position":[[551,4]]}}}],["detail",{"_index":472,"t":{"18":{"position":[[2258,7],[4233,7]]},"38":{"position":[[538,8]]},"73":{"position":[[1401,8],[3915,7]]},"77":{"position":[[0,8]]},"118":{"position":[[4556,6]]},"149":{"position":[[2194,7],[3424,9],[3444,7]]},"216":{"position":[[331,8]]},"247":{"position":[[0,7]]},"249":{"position":[[0,7]]},"343":{"position":[[374,8],[412,7]]},"412":{"position":[[0,7]]},"457":{"position":[[2594,6],[2624,8]]},"488":{"position":[[782,7]]},"517":{"position":[[49,7],[81,7]]},"549":{"position":[[1739,7]]},"618":{"position":[[28,8],[218,8],[576,6]]},"633":{"position":[[1057,8]]},"651":{"position":[[0,8]]}}}],["detect",{"_index":662,"t":{"38":{"position":[[451,8],[741,8]]},"44":{"position":[[999,8]]},"73":{"position":[[3509,6]]},"81":{"position":[[82,9]]},"118":{"position":[[1349,8],[4806,9],[5031,9]]},"123":{"position":[[582,8]]},"125":{"position":[[366,8]]},"134":{"position":[[273,9]]},"151":{"position":[[1172,7]]},"188":{"position":[[1068,7]]},"194":{"position":[[477,6]]},"315":{"position":[[1012,9]]},"343":{"position":[[431,9]]},"447":{"position":[[48,9]]},"457":{"position":[[7,7],[731,8],[1259,9],[1435,10]]}}}],["detectstalenowplayingfromminutesago",{"_index":2332,"t":{"315":{"position":[[1049,35]]},"317":{"position":[[1964,38],[3429,38]]}}}],["determin",{"_index":685,"t":{"42":{"position":[[248,11],[1271,10]]},"44":{"position":[[471,9]]},"54":{"position":[[1103,9]]},"60":{"position":[[61,9],[1406,9]]},"64":{"position":[[271,10]]},"73":{"position":[[3622,9],[3900,9]]},"83":{"position":[[180,10]]},"160":{"position":[[574,9]]},"166":{"position":[[333,10],[847,11],[987,9],[1125,9]]},"168":{"position":[[159,9]]},"200":{"position":[[532,9],[1449,9]]},"303":{"position":[[133,9],[1926,9]]},"363":{"position":[[1113,9]]},"425":{"position":[[1955,10]]},"435":{"position":[[1813,9]]},"437":{"position":[[444,9]]},"447":{"position":[[391,9]]},"457":{"position":[[70,9],[339,9]]},"513":{"position":[[438,9]]},"565":{"position":[[559,9]]},"588":{"position":[[40,10]]},"594":{"position":[[863,9],[1439,9]]},"599":{"position":[[92,11],[339,13],[1861,10],[2275,10]]}}}],["devcontain",{"_index":2708,"t":{"417":{"position":[[111,13],[399,12]]},"419":{"position":[[150,12],[278,12],[337,13]]}}}],["develop",{"_index":892,"t":{"62":{"position":[[265,9]]},"71":{"position":[[118,9]]},"73":{"position":[[9066,9]]},"138":{"position":[[1648,11],[1680,12]]},"147":{"position":[[199,9]]},"149":{"position":[[134,11],[373,9],[426,9],[493,9],[717,9],[1093,9],[1696,9],[1806,11],[1905,7],[2911,9],[3009,9],[3251,9],[3395,9]]},"192":{"position":[[340,9],[604,9]]},"303":{"position":[[583,9],[1314,9],[1644,9],[1832,9],[1873,9],[4644,9]]},"343":{"position":[[1484,9]]},"347":{"position":[[1437,9]]},"417":{"position":[[0,11]]},"419":{"position":[[48,11],[167,11]]},"429":{"position":[[7,11],[39,11]]},"579":{"position":[[243,12]]},"581":{"position":[[12,9]]},"584":{"position":[[422,11]]},"612":{"position":[[92,11],[125,11]]},"651":{"position":[[26,11]]}}}],["devic",{"_index":830,"t":{"54":{"position":[[912,7],[1495,6],[1558,6]]},"60":{"position":[[258,6],[395,6]]},"123":{"position":[[22,6]]},"130":{"position":[[402,6],[461,6]]},"162":{"position":[[65,6],[186,7]]},"188":{"position":[[2976,6],[3100,6]]},"216":{"position":[[14,6],[461,6],[729,8],[743,7],[1589,7],[1778,6]]},"218":{"position":[[110,6],[450,7],[572,6]]},"299":{"position":[[13,7]]},"301":{"position":[[497,6],[548,6],[654,6],[789,6],[932,6]]},"331":{"position":[[424,6]]},"451":{"position":[[100,7],[581,6]]},"453":{"position":[[41,6]]}}}],["device/play",{"_index":1419,"t":{"130":{"position":[[36,13]]}}}],["device/receiv",{"_index":2391,"t":{"331":{"position":[[18,16]]}}}],["device/us",{"_index":1613,"t":{"157":{"position":[[35,11]]},"427":{"position":[[444,11]]}}}],["devices/group",{"_index":2223,"t":{"299":{"position":[[117,14]]}}}],["devices/sourc",{"_index":1420,"t":{"130":{"position":[[117,15]]}}}],["devicesallow",{"_index":1842,"t":{"188":{"position":[[5179,15],[7008,15]]},"301":{"position":[[2319,15],[3747,15]]}}}],["devicesblock",{"_index":1843,"t":{"188":{"position":[[5210,15],[7039,15]]},"301":{"position":[[2355,15],[3783,15]]}}}],["devot",{"_index":2905,"t":{"459":{"position":[[1296,6]]},"463":{"position":[[200,6]]}}}],["devtool",{"_index":2779,"t":{"431":{"position":[[241,8]]}}}],["diagnos",{"_index":1996,"t":{"216":{"position":[[3187,10],[3209,8],[3365,8]]},"451":{"position":[[393,8]]},"496":{"position":[[189,8]]}}}],["diagram",{"_index":3492,"t":{"635":{"position":[[273,7]]}}}],["dice'",{"_index":1287,"t":{"118":{"position":[[1033,6]]}}}],["dictat",{"_index":3019,"t":{"490":{"position":[[79,7]]}}}],["did/handl",{"_index":2353,"t":{"325":{"position":[[638,10]]}}}],["did:plc",{"_index":1465,"t":{"143":{"position":[[94,11]]}}}],["did:web",{"_index":1466,"t":{"143":{"position":[[109,11]]}}}],["didn't",{"_index":1579,"t":{"151":{"position":[[1637,6]]}}}],["diff",{"_index":417,"t":{"18":{"position":[[309,4],[1979,4]]},"118":{"position":[[4653,5]]},"369":{"position":[[13,4],[501,4],[615,4],[750,4]]},"496":{"position":[[433,4]]}}}],["differ",{"_index":457,"t":{"18":{"position":[[1382,9],[3505,9]]},"54":{"position":[[1658,9]]},"64":{"position":[[85,7]]},"73":{"position":[[5127,9],[5425,9],[6811,9]]},"83":{"position":[[85,7]]},"105":{"position":[[1567,9]]},"118":{"position":[[2206,9],[2402,6],[2448,6],[3324,9]]},"123":{"position":[[403,9],[544,9]]},"125":{"position":[[100,9],[207,9],[328,9]]},"136":{"position":[[1240,9]]},"138":{"position":[[1561,9]]},"145":{"position":[[220,9]]},"171":{"position":[[359,9]]},"220":{"position":[[250,10]]},"224":{"position":[[1179,9],[1208,9],[1251,11],[1450,12],[1627,9],[1946,9],[1975,9],[2018,11],[2347,12],[2894,9],[3224,9]]},"230":{"position":[[681,9],[725,9],[829,9]]},"238":{"position":[[1156,9],[1185,9],[1228,11],[1431,12],[1614,9],[1929,9],[1958,9],[2001,11],[2333,12],[2850,9],[3178,9]]},"244":{"position":[[439,9]]},"255":{"position":[[291,10]]},"263":{"position":[[134,10]]},"267":{"position":[[405,10]]},"291":{"position":[[67,10]]},"297":{"position":[[127,9]]},"323":{"position":[[67,11]]},"351":{"position":[[164,9],[645,9]]},"357":{"position":[[1092,9]]},"363":{"position":[[79,9],[718,9]]},"425":{"position":[[80,9]]},"451":{"position":[[218,11]]},"507":{"position":[[363,9]]},"539":{"position":[[12,10]]},"543":{"position":[[1173,9]]},"545":{"position":[[179,9]]}}}],["differenti",{"_index":2031,"t":{"224":{"position":[[2244,13]]},"230":{"position":[[140,13],[796,13]]},"234":{"position":[[525,13],[597,13]]},"238":{"position":[[2225,13]]},"244":{"position":[[77,13]]}}}],["difficult",{"_index":2020,"t":{"222":{"position":[[624,10]]}}}],["dina",{"_index":1272,"t":{"118":{"position":[[539,4],[552,4]]}}}],["dir=/home/youruser/multi",{"_index":3089,"t":{"535":{"position":[[856,24]]}}}],["direct",{"_index":1390,"t":{"120":{"position":[[185,9]]},"557":{"position":[[2428,10]]},"559":{"position":[[922,10]]},"563":{"position":[[60,10]]}}}],["directli",{"_index":756,"t":{"46":{"position":[[880,9],[2398,9]]},"52":{"position":[[57,9]]},"66":{"position":[[1377,9],[2911,9]]},"73":{"position":[[8768,8]]},"85":{"position":[[1136,9],[2628,9]]},"91":{"position":[[1045,9],[2629,9]]},"95":{"position":[[818,9],[2310,9]]},"103":{"position":[[1143,9],[2690,9]]},"110":{"position":[[2068,9],[3625,9]]},"114":{"position":[[936,9],[2522,9]]},"143":{"position":[[1431,9],[2923,9]]},"147":{"position":[[90,8]]},"153":{"position":[[1187,9],[3009,9]]},"186":{"position":[[950,9],[2504,9]]},"188":{"position":[[4083,9],[6032,9]]},"198":{"position":[[971,9],[2523,9]]},"202":{"position":[[807,9],[2255,9]]},"208":{"position":[[980,9],[2449,9]]},"214":{"position":[[944,9],[2420,9]]},"218":{"position":[[1300,9],[2805,9]]},"220":{"position":[[1284,9],[3055,9]]},"228":{"position":[[498,8]]},"234":{"position":[[1059,9],[2513,9]]},"253":{"position":[[1132,9],[2591,9]]},"257":{"position":[[1206,9],[3012,9]]},"261":{"position":[[985,9],[2845,9]]},"265":{"position":[[860,9],[2608,9]]},"269":{"position":[[1101,9],[2941,9]]},"277":{"position":[[1175,9],[2661,9]]},"281":{"position":[[908,9],[2379,9]]},"285":{"position":[[929,9],[2428,9]]},"291":{"position":[[1104,9],[2920,9]]},"293":{"position":[[531,8]]},"295":{"position":[[942,9],[2396,9]]},"301":{"position":[[1413,9],[2949,9]]},"305":{"position":[[958,9],[2548,9]]},"307":{"position":[[318,8]]},"317":{"position":[[937,9],[2522,9]]},"325":{"position":[[2346,9],[4152,9]]},"329":{"position":[[827,9],[2249,9]]},"333":{"position":[[810,9],[2264,9]]},"341":{"position":[[881,9],[2377,9]]},"345":{"position":[[1053,9],[2649,9]]},"349":{"position":[[911,9],[2405,9]]},"517":{"position":[[462,8]]},"549":{"position":[[513,8]]},"633":{"position":[[1833,8]]}}}],["directori",{"_index":37,"t":{"4":{"position":[[511,10],[1188,9],[1319,11],[2037,9],[2487,9],[3358,9],[3495,11],[4422,9]]},"12":{"position":[[909,9],[1352,10]]},"73":{"position":[[1486,9]]},"77":{"position":[[85,9]]},"417":{"position":[[245,9]]},"533":{"position":[[223,9],[390,9]]},"535":{"position":[[244,12],[707,9]]},"543":{"position":[[89,9],[356,9],[427,9],[473,9],[1866,11]]},"545":{"position":[[236,9],[267,9]]},"549":{"position":[[91,10],[335,12],[352,11],[573,10],[633,11],[733,9],[800,9],[830,9],[947,12]]},"553":{"position":[[240,9]]},"567":{"position":[[144,9]]},"604":{"position":[[276,10]]}}}],["dirti",{"_index":2535,"t":{"351":{"position":[[386,5]]}}}],["disabl",{"_index":534,"t":{"22":{"position":[[172,9],[267,9],[277,7]]},"42":{"position":[[324,8],[1118,7]]},"64":{"position":[[568,8]]},"83":{"position":[[427,8]]},"151":{"position":[[1676,7],[2214,8]]},"315":{"position":[[1029,8]]}}}],["disable_web=tru",{"_index":536,"t":{"22":{"position":[[303,16]]}}}],["disablediscoveri",{"_index":2166,"t":{"281":{"position":[[1849,19],[3220,19]]}}}],["disableweb",{"_index":166,"t":{"4":{"position":[[4544,13]]},"22":{"position":[[366,13]]}}}],["disadvantag",{"_index":972,"t":{"73":{"position":[[815,13]]}}}],["disallow",{"_index":2130,"t":{"273":{"position":[[15,8]]}}}],["discord",{"_index":641,"t":{"35":{"position":[[17,7]]},"48":{"position":[[58,7],[167,7]]},"50":{"position":[[37,7],[128,8],[233,7],[404,7],[491,7]]},"52":{"position":[[30,7],[118,7],[144,7],[183,7],[282,7]]},"54":{"position":[[58,7],[209,7],[263,7],[336,7],[1012,7],[1482,7],[1537,7]]},"57":{"position":[[19,7],[85,8],[120,7],[180,7],[337,7],[508,7],[704,7],[1086,7]]},"60":{"position":[[41,7],[278,8],[372,7],[1351,7]]},"62":{"position":[[11,7],[257,7]]},"64":{"position":[[46,7],[219,7],[423,7],[630,7],[3427,7],[4129,7],[4238,7]]},"66":{"position":[[314,7],[1058,7],[1266,7],[1607,7],[1688,7],[1914,7],[2215,10],[2626,7],[2819,7],[3339,7],[3633,10],[3828,9]]},"68":{"position":[[58,7],[178,7],[244,7]]},"71":{"position":[[18,7],[110,7]]},"73":{"position":[[43,7],[83,7],[167,7],[257,7],[272,7],[321,7],[440,7],[543,7],[619,7],[714,7],[803,7],[900,7],[1047,7],[1113,7],[1290,7],[1345,7],[2065,7],[2768,7],[3010,7],[3192,9],[3312,7],[3460,7],[3782,7],[3994,7],[4011,7],[4028,7],[4057,7],[4098,7],[4162,7],[4463,7],[4504,7],[4568,7],[5149,7],[5206,7],[5228,7],[5366,7],[5383,7],[5400,7],[5541,7],[6927,7],[7763,7],[9186,7],[9544,7],[9702,8]]},"75":{"position":[[58,7]]},"77":{"position":[[664,7]]},"79":{"position":[[234,7],[416,9]]},"81":{"position":[[35,7]]},"83":{"position":[[46,7],[489,7],[3252,7]]},"85":{"position":[[421,7],[817,7],[1025,7],[1366,7],[1447,7],[1673,7],[2343,7],[2536,7],[3056,7],[3503,9]]},"188":{"position":[[1511,7]]},"509":{"position":[[4,7],[173,7],[891,7],[1498,10]]},"633":{"position":[[588,7]]}}}],["discord'",{"_index":845,"t":{"57":{"position":[[224,9],[1006,9]]},"66":{"position":[[671,9]]},"73":{"position":[[1507,9],[1567,9],[5039,9],[5921,9],[6402,9],[7478,9],[8282,9]]},"77":{"position":[[106,9],[166,9]]},"85":{"position":[[698,9]]}}}],["discord.json",{"_index":3040,"t":{"509":{"position":[[912,12]]}}}],["discord/oth",{"_index":908,"t":{"64":{"position":[[995,13]]},"83":{"position":[[854,13]]}}}],["discord/socat",{"_index":1066,"t":{"73":{"position":[[6211,13],[8091,13]]}}}],["discord_application_id",{"_index":942,"t":{"66":{"position":[[331,22]]},"85":{"position":[[258,22]]}}}],["discord_application_id=12345678",{"_index":895,"t":{"62":{"position":[[442,31]]},"71":{"position":[[295,31]]},"73":{"position":[[1910,31]]},"77":{"position":[[509,31]]}}}],["discord_artwork",{"_index":912,"t":{"64":{"position":[[1237,17],[1637,15],[1920,15],[2031,15]]},"66":{"position":[[402,15]]},"83":{"position":[[1096,17],[1496,15],[1779,15],[1890,15]]},"85":{"position":[[429,15]]}}}],["discord_artwork=mycdn,jellyfin",{"_index":914,"t":{"64":{"position":[[1369,30],[2330,30]]},"83":{"position":[[1228,30],[2189,30]]}}}],["discord_artwork=tru",{"_index":922,"t":{"64":{"position":[[2066,20]]},"83":{"position":[[1925,20]]}}}],["discord_artwork_default_url",{"_index":946,"t":{"66":{"position":[[533,27]]},"85":{"position":[[560,27]]}}}],["discord_artwork_default_url=https://cooldomain.com/art.png",{"_index":934,"t":{"64":{"position":[[3898,58]]},"83":{"position":[[3690,58]]}}}],["discord_id",{"_index":938,"t":{"66":{"position":[[127,10],[212,10]]},"85":{"position":[[127,10],[212,10]]}}}],["discord_ipc_loc",{"_index":989,"t":{"73":{"position":[[1646,21],[6228,21],[6457,21],[6761,21],[8108,21],[8337,21],[8637,21],[9911,21],[10141,21]]},"77":{"position":[[245,21]]},"85":{"position":[[303,21]]}}}],["discord_ipc_locations=/discord",{"_index":1075,"t":{"73":{"position":[[8414,30]]}}}],["discord_ipc_locations=/run/discord",{"_index":992,"t":{"73":{"position":[[1961,34],[6534,34]]},"77":{"position":[[560,34]]}}}],["discord_ipc_locations=192.168.0.100:6655",{"_index":1091,"t":{"73":{"position":[[9985,40]]}}}],["discord_ipc_locations=192.168.discord_host.ip:6655",{"_index":1067,"t":{"73":{"position":[[6302,50],[8182,50]]}}}],["discord_listening_activity_allow",{"_index":951,"t":{"66":{"position":[[808,32]]}}}],["discord_listening_activity_allow=spotifi",{"_index":886,"t":{"60":{"position":[[2193,40]]}}}],["discord_nam",{"_index":939,"t":{"66":{"position":[[183,12]]},"85":{"position":[[183,12]]}}}],["discord_status_override_allow",{"_index":948,"t":{"66":{"position":[[690,29]]}}}],["discord_status_override_allow=online,idl",{"_index":875,"t":{"60":{"position":[[1101,41]]}}}],["discord_token",{"_index":940,"t":{"66":{"position":[[258,13]]}}}],["discord_transforms=musicbrainz",{"_index":3039,"t":{"509":{"position":[[440,30]]}}}],["discov",{"_index":606,"t":{"31":{"position":[[127,10]]},"166":{"position":[[115,10]]},"216":{"position":[[826,10]]},"220":{"position":[[78,10]]},"259":{"position":[[85,10]]},"287":{"position":[[223,10]]},"319":{"position":[[302,10]]},"353":{"position":[[365,9],[510,10]]},"357":{"position":[[161,10]]},"517":{"position":[[159,10]]},"594":{"position":[[821,12]]},"599":{"position":[[2019,8],[2379,12],[2462,10],[2721,10],[2959,10],[3043,11],[3180,11],[3241,10],[3576,11],[3800,10]]}}}],["discovered/scrobbl",{"_index":3206,"t":{"567":{"position":[[533,20]]}}}],["discoveri",{"_index":1177,"t":{"105":{"position":[[116,9],[1873,9]]},"138":{"position":[[116,9]]},"216":{"position":[[854,10]]},"287":{"position":[[91,9]]},"319":{"position":[[88,9]]},"599":{"position":[[2215,10]]}}}],["discuss",{"_index":2518,"t":{"347":{"position":[[1352,11]]},"522":{"position":[[73,11]]},"524":{"position":[[165,10]]}}}],["display",{"_index":746,"t":{"46":{"position":[[510,8],[734,8],[1374,8],[1918,8],[2216,8],[2734,8]]},"64":{"position":[[20,7],[4251,7]]},"66":{"position":[[384,7],[1003,8],[1229,8],[1877,8],[2427,8],[2727,8],[3247,8]]},"83":{"position":[[20,7]]},"85":{"position":[[762,8],[988,8],[1636,8],[2144,8],[2444,8],[2964,8]]},"91":{"position":[[673,8],[898,8],[1542,8],[2147,8],[2446,8],[2965,8]]},"95":{"position":[[446,8],[671,8],[1315,8],[1828,8],[2127,8],[2646,8]]},"103":{"position":[[769,8],[995,8],[1643,8],[2206,8],[2506,8],[3026,8]]},"110":{"position":[[1694,8],[1920,8],[2568,8],[3141,8],[3441,8],[3961,8]]},"114":{"position":[[552,8],[783,8],[1451,8],[2028,8],[2333,8],[2858,8]]},"143":{"position":[[1059,8],[1284,8],[1928,8],[2441,8],[2740,8],[3259,8]]},"153":{"position":[[807,8],[1036,8],[1696,8],[2519,8],[2822,8],[3345,8]]},"184":{"position":[[186,7]]},"186":{"position":[[572,8],[800,8],[1456,8],[2016,8],[2318,8],[2840,8]]},"188":{"position":[[3707,8],[3934,8],[4586,8],[5546,8],[5847,8],[6368,8]]},"198":{"position":[[599,8],[824,8],[1468,8],[2041,8],[2340,8],[2859,8]]},"202":{"position":[[433,8],[659,8],[1307,8],[1771,8],[2071,8],[2591,8]]},"208":{"position":[[608,8],[833,8],[1477,8],[1967,8],[2266,8],[2785,8]]},"214":{"position":[[576,8],[799,8],[1435,8],[1942,8],[2239,8],[2756,8]]},"218":{"position":[[920,8],[1149,8],[1809,8],[2315,8],[2618,8],[3141,8]]},"220":{"position":[[914,8],[1138,8],[2031,8],[2575,8],[2873,8],[3391,8]]},"234":{"position":[[677,8],[907,8],[1571,8],[2021,8],[2325,8],[2849,8]]},"253":{"position":[[752,8],[981,8],[1641,8],[2101,8],[2404,8],[2927,8]]},"257":{"position":[[832,8],[1058,8],[1965,8],[2528,8],[2828,8],[3348,8]]},"261":{"position":[[601,8],[832,8],[1774,8],[2351,8],[2656,8],[3181,8]]},"265":{"position":[[488,8],[713,8],[1613,8],[2126,8],[2425,8],[2944,8]]},"269":{"position":[[729,8],[954,8],[1854,8],[2459,8],[2758,8],[3277,8]]},"277":{"position":[[803,8],[1028,8],[1672,8],[2179,8],[2478,8],[2997,8]]},"281":{"position":[[542,8],[764,8],[1396,8],[1903,8],[2199,8],[2715,8]]},"285":{"position":[[551,8],[779,8],[1435,8],[1940,8],[2242,8],[2764,8]]},"291":{"position":[[730,8],[956,8],[1863,8],[2436,8],[2736,8],[3256,8]]},"295":{"position":[[572,8],[796,8],[1436,8],[1916,8],[2214,8],[2732,8]]},"301":{"position":[[1043,8],[1267,8],[1907,8],[2469,8],[2767,8],[3285,8]]},"305":{"position":[[584,8],[810,8],[1458,8],[2064,8],[2364,8],[2884,8]]},"317":{"position":[[561,8],[788,8],[1440,8],[2036,8],[2337,8],[2858,8]]},"325":{"position":[[1974,8],[2199,8],[3099,8],[3670,8],[3969,8],[4488,8]]},"329":{"position":[[461,8],[683,8],[1315,8],[1773,8],[2069,8],[2585,8]]},"333":{"position":[[432,8],[660,8],[1316,8],[1776,8],[2078,8],[2600,8]]},"341":{"position":[[497,8],[728,8],[1396,8],[1883,8],[2188,8],[2713,8]]},"343":{"position":[[2362,9],[3247,10],[5410,7]]},"345":{"position":[[679,8],[905,8],[1553,8],[2165,8],[2465,8],[2985,8]]},"349":{"position":[[535,8],[762,8],[1414,8],[1919,8],[2220,8],[2741,8]]},"557":{"position":[[3575,10]]},"565":{"position":[[1515,9]]},"567":{"position":[[508,7]]},"616":{"position":[[110,9]]}}}],["dissemin",{"_index":3407,"t":{"599":{"position":[[3344,12]]}}}],["distanc",{"_index":1286,"t":{"118":{"position":[[1020,8]]}}}],["distribut",{"_index":1975,"t":{"216":{"position":[[1145,13]]}}}],["distro",{"_index":3212,"t":{"571":{"position":[[73,7]]}}}],["diverg",{"_index":2723,"t":{"421":{"position":[[468,9]]}}}],["dn",{"_index":1971,"t":{"216":{"position":[[1090,3]]},"439":{"position":[[274,3],[347,3],[877,3],[920,3],[1066,3],[1147,3]]}}}],["dnd",{"_index":868,"t":{"60":{"position":[[442,3],[721,4],[754,3]]}}}],["do",{"_index":1283,"t":{"118":{"position":[[929,5],[942,5]]}}}],["doauthent",{"_index":2757,"t":{"425":{"position":[[2993,16]]},"592":{"position":[[2323,16]]}}}],["dobuildinitdata",{"_index":2737,"t":{"425":{"position":[[1012,15]]},"592":{"position":[[747,18]]}}}],["doc",{"_index":79,"t":{"4":{"position":[[1418,4],[3606,4]]},"8":{"position":[[1839,4]]},"44":{"position":[[767,4]]},"50":{"position":[[576,4]]},"52":{"position":[[321,4]]},"54":{"position":[[271,4]]},"68":{"position":[[252,4]]},"232":{"position":[[302,4]]},"249":{"position":[[24,4]]},"251":{"position":[[302,4]]},"287":{"position":[[332,5]]},"289":{"position":[[54,4]]},"307":{"position":[[505,5]]},"319":{"position":[[411,5]]},"321":{"position":[[54,4]]},"363":{"position":[[754,4]]},"374":{"position":[[40,4]]},"557":{"position":[[711,5],[3098,4]]},"565":{"position":[[841,4]]},"569":{"position":[[86,4],[203,4]]},"584":{"position":[[434,5]]},"602":{"position":[[323,4]]},"608":{"position":[[154,5]]}}}],["docheckconnect",{"_index":2747,"t":{"425":{"position":[[1745,17]]},"592":{"position":[[1701,20]]}}}],["docker",{"_index":36,"t":{"4":{"position":[[499,6],[775,6],[1331,6],[1398,6],[3507,6],[3586,6]]},"8":{"position":[[785,6]]},"10":{"position":[[403,6]]},"12":{"position":[[1149,6]]},"14":{"position":[[527,6],[573,6],[717,6]]},"73":{"position":[[1328,9],[1380,6],[1716,6],[1776,6],[1805,6],[3425,7],[5456,8],[5486,7],[6153,6],[6263,6],[6364,6],[6495,6],[6735,8],[6842,8],[6872,7],[7708,6],[7798,6],[8033,6],[8143,6],[8244,6],[8375,6],[8611,8],[8687,6],[8715,7],[8780,6],[9840,6],[9946,6],[10117,6]]},"75":{"position":[[96,9]]},"77":{"position":[[315,6],[375,6],[404,6]]},"93":{"position":[[105,6],[304,6]]},"196":{"position":[[586,6]]},"216":{"position":[[1004,6],[1297,6],[1480,6]]},"293":{"position":[[469,6],[681,6],[728,6],[1137,6]]},"303":{"position":[[3496,6],[3884,6]]},"311":{"position":[[469,6]]},"347":{"position":[[94,6],[174,6]]},"369":{"position":[[578,6]]},"384":{"position":[[520,6]]},"472":{"position":[[1417,6]]},"509":{"position":[[344,6]]},"513":{"position":[[103,6]]},"543":{"position":[[247,6],[525,6],[763,6],[946,6],[1345,6],[1514,6],[1753,6],[1899,6],[2223,6],[2529,6]]},"545":{"position":[[49,6],[149,6],[285,6],[386,6],[452,6]]},"553":{"position":[[66,6],[77,6],[257,6]]},"555":{"position":[[69,6]]},"557":{"position":[[267,6],[888,6],[1885,6],[2245,6],[2293,6],[2711,6],[3637,6]]},"559":{"position":[[483,6],[1064,6],[1207,6],[1349,6],[1487,6]]},"561":{"position":[[216,6]]},"563":{"position":[[202,6],[345,6],[487,6],[625,6]]},"565":{"position":[[948,6],[1592,6],[1863,6],[2062,6],[2315,6]]},"567":{"position":[[161,6],[230,6]]},"569":{"position":[[18,6]]},"608":{"position":[[227,6],[248,6],[268,6]]},"614":{"position":[[0,6],[427,6]]},"616":{"position":[[314,6],[657,6]]},"633":{"position":[[2,10],[1275,6],[1659,6]]}}}],["docker.io/foxxmd/multi",{"_index":3100,"t":{"541":{"position":[[139,22]]}}}],["dockerhub",{"_index":3099,"t":{"541":{"position":[[97,9]]}}}],["dockerstartup/kasm_default_profile.sh",{"_index":1018,"t":{"73":{"position":[[2561,39]]},"77":{"position":[[1160,39]]}}}],["dockerstartup/kasm_startup.sh",{"_index":1020,"t":{"73":{"position":[[2631,32]]},"77":{"position":[[1230,32]]}}}],["dockerstartup/vnc_startup.sh",{"_index":1019,"t":{"73":{"position":[[2601,29]]},"77":{"position":[[1200,29]]}}}],["docs:instal",{"_index":3134,"t":{"549":{"position":[[275,12]]}}}],["docsit",{"_index":3077,"t":{"535":{"position":[[236,7],[446,7]]}}}],["docsite/packag",{"_index":3084,"t":{"535":{"position":[[502,15]]}}}],["document",{"_index":1101,"t":{"87":{"position":[[366,10]]},"168":{"position":[[84,13]]},"285":{"position":[[492,13]]},"297":{"position":[[803,13]]},"309":{"position":[[352,13]]},"421":{"position":[[13,9]]},"427":{"position":[[718,13]]},"435":{"position":[[1660,13]]},"455":{"position":[[92,14]]},"539":{"position":[[61,8]]},"577":{"position":[[31,8]]},"579":{"position":[[5,8],[209,8]]},"643":{"position":[[21,13]]},"645":{"position":[[22,13]]}}}],["doin",{"_index":1281,"t":{"118":{"position":[[871,4],[892,4]]}}}],["domain",{"_index":733,"t":{"44":{"position":[[1647,6]]},"64":{"position":[[1303,7]]},"66":{"position":[[525,7]]},"83":{"position":[[1162,7]]},"85":{"position":[[552,7]]},"110":{"position":[[238,7]]},"143":{"position":[[300,6],[337,7]]},"149":{"position":[[2704,6]]},"226":{"position":[[92,6],[125,7]]},"232":{"position":[[544,6]]},"251":{"position":[[549,6]]},"303":{"position":[[2567,6],[3000,7],[3047,6],[3662,6],[4614,6]]},"325":{"position":[[134,6]]},"335":{"position":[[479,6]]},"343":{"position":[[2026,7],[3535,6]]},"435":{"position":[[1841,6]]},"439":{"position":[[293,6],[417,6],[1120,6]]},"565":{"position":[[1295,6]]}}}],["domain.tld",{"_index":2408,"t":{"335":{"position":[[350,13]]}}}],["domain/host",{"_index":2033,"t":{"224":{"position":[[3360,12]]},"238":{"position":[[3319,12]]}}}],["domain/ip:port",{"_index":2393,"t":{"331":{"position":[[299,14]]}}}],["don't",{"_index":689,"t":{"42":{"position":[[421,5]]},"140":{"position":[[174,5]]},"149":{"position":[[699,5],[3072,5]]},"481":{"position":[[1982,5]]},"490":{"position":[[462,5]]}}}],["done",{"_index":702,"t":{"44":{"position":[[137,4]]},"73":{"position":[[3227,4]]},"79":{"position":[[451,4]]},"93":{"position":[[46,4]]},"97":{"position":[[392,4]]},"118":{"position":[[1966,4]]},"136":{"position":[[448,4]]},"210":{"position":[[107,4]]},"395":{"position":[[27,4],[143,4]]},"565":{"position":[[229,4],[1804,4]]},"567":{"position":[[258,5]]},"599":{"position":[[2136,4]]}}}],["dottransform",{"_index":2566,"t":{"361":{"position":[[1216,17],[1623,16]]}}}],["doubl",{"_index":1859,"t":{"192":{"position":[[740,6]]}}}],["down",{"_index":1534,"t":{"149":{"position":[[1497,4]]},"160":{"position":[[57,4]]},"457":{"position":[[1136,4]]}}}],["download",{"_index":634,"t":{"31":{"position":[[896,8]]},"73":{"position":[[9592,8]]},"149":{"position":[[3295,8]]}}}],["downstream",{"_index":2540,"t":{"351":{"position":[[844,10]]},"353":{"position":[[765,10]]},"357":{"position":[[462,10],[1253,10]]}}}],["drastic",{"_index":2941,"t":{"476":{"position":[[1254,11]]}}}],["dream",{"_index":2588,"t":{"367":{"position":[[589,8],[641,8],[767,8],[819,8]]}}}],["drink",{"_index":2864,"t":{"457":{"position":[[1898,8]]}}}],["driver",{"_index":383,"t":{"14":{"position":[[703,7]]},"543":{"position":[[2747,7]]},"545":{"position":[[1194,7]]}}}],["drop",{"_index":3156,"t":{"549":{"position":[[1557,4]]}}}],["dropdown",{"_index":1219,"t":{"107":{"position":[[183,9]]}}}],["druidblack",{"_index":2517,"t":{"347":{"position":[[1302,10],[1313,13]]}}}],["due",{"_index":1092,"t":{"81":{"position":[[5,3]]},"216":{"position":[[1105,3]]},"327":{"position":[[2100,3]]},"335":{"position":[[415,3]]},"343":{"position":[[241,3],[4812,3]]},"351":{"position":[[318,3]]},"365":{"position":[[530,3]]},"425":{"position":[[227,3]]},"457":{"position":[[2248,3]]},"459":{"position":[[961,3]]},"461":{"position":[[358,3]]},"618":{"position":[[377,3]]},"625":{"position":[[1381,3]]}}}],["dumpvlcmetadata",{"_index":2383,"t":{"327":{"position":[[2462,18]]}}}],["dupe",{"_index":494,"t":{"18":{"position":[[3387,8],[5143,8]]},"118":{"position":[[5026,4]]}}}],["duped/discard",{"_index":486,"t":{"18":{"position":[[2750,13],[4669,13]]}}}],["duplic",{"_index":345,"t":{"12":{"position":[[766,9]]},"18":{"position":[[216,10]]},"38":{"position":[[680,9],[726,10],[808,11]]},"116":{"position":[[138,11]]},"118":{"position":[[3745,11],[4816,9]]},"120":{"position":[[434,10]]},"123":{"position":[[380,9],[596,10]]},"125":{"position":[[380,10]]},"128":{"position":[[54,10],[191,10]]},"130":{"position":[[522,11]]},"132":{"position":[[222,11]]},"134":{"position":[[263,9]]},"136":{"position":[[1284,9],[1347,9]]},"151":{"position":[[508,9]]},"153":{"position":[[661,9]]},"194":{"position":[[550,11]]},"351":{"position":[[698,9],[874,9]]},"447":{"position":[[29,9],[226,11],[355,9],[453,9]]},"457":{"position":[[885,9]]},"599":{"position":[[2494,9],[4056,11]]},"633":{"position":[[2186,11]]}}}],["durat",{"_index":173,"t":{"4":{"position":[[4683,11]]},"18":{"position":[[2389,8],[4364,8]]},"118":{"position":[[3075,9]]},"151":{"position":[[185,9],[314,8]]},"160":{"position":[[832,8]]},"166":{"position":[[1245,10],[1511,11]]},"180":{"position":[[138,8]]},"200":{"position":[[1553,8]]},"303":{"position":[[427,8]]},"331":{"position":[[204,8]]},"363":{"position":[[506,11],[561,8]]},"367":{"position":[[1058,8]]},"427":{"position":[[213,9]]},"476":{"position":[[154,8],[426,8]]},"590":{"position":[[726,9],[851,9]]},"594":{"position":[[1410,8]]}}}],["dure",{"_index":492,"t":{"18":{"position":[[3207,6]]},"118":{"position":[[2705,6],[2800,6],[2925,6],[2982,7]]},"242":{"position":[[73,6]]},"343":{"position":[[2817,6]]},"355":{"position":[[139,6]]},"425":{"position":[[2065,6]]},"481":{"position":[[2003,6]]},"549":{"position":[[1334,6]]}}}],["e",{"_index":3345,"t":{"592":{"position":[[1218,3],[1287,4],[2031,3],[2043,2],[2494,3],[2621,2]]},"594":{"position":[[2552,3],[2564,2]]},"597":{"position":[[1058,3],[1136,4]]}}}],["e.g",{"_index":734,"t":{"44":{"position":[[1693,4]]},"565":{"position":[[1341,4]]}}}],["e0cce74f",{"_index":2624,"t":{"369":{"position":[[1181,8]]}}}],["e90b20526808373353afad7fb98a201198c0c3e0555bea19f182df3388af7b17",{"_index":579,"t":{"27":{"position":[[1732,69]]}}}],["each",{"_index":103,"t":{"4":{"position":[[2189,4],[2324,4],[2394,4],[3195,4],[6161,4]]},"6":{"position":[[214,4]]},"10":{"position":[[463,4]]},"16":{"position":[[385,4],[496,4]]},"18":{"position":[[70,4],[178,4],[231,4],[317,4],[2266,4],[4241,4]]},"27":{"position":[[317,4]]},"38":{"position":[[141,4],[574,4]]},"73":{"position":[[5122,4]]},"105":{"position":[[540,4],[716,4]]},"118":{"position":[[3278,4],[3637,4]]},"120":{"position":[[604,4],[938,4],[969,4]]},"128":{"position":[[154,4]]},"138":{"position":[[538,4],[714,4]]},"151":{"position":[[269,4]]},"168":{"position":[[70,4],[482,4]]},"176":{"position":[[348,4],[462,4]]},"182":{"position":[[809,4]]},"200":{"position":[[909,4]]},"224":{"position":[[1586,4]]},"230":{"position":[[168,4]]},"238":{"position":[[1567,4]]},"297":{"position":[[157,4],[821,4]]},"325":{"position":[[760,4]]},"359":{"position":[[0,4],[456,4],[536,4]]},"361":{"position":[[105,4]]},"363":{"position":[[0,4],[697,4],[732,4],[809,5],[836,4]]},"367":{"position":[[39,4],[153,4]]},"369":{"position":[[333,4]]},"380":{"position":[[0,4]]},"384":{"position":[[138,4],[299,4]]},"399":{"position":[[0,4]]},"425":{"position":[[434,4]]},"459":{"position":[[749,4]]},"461":{"position":[[146,4]]},"470":{"position":[[227,4],[932,4]]},"472":{"position":[[1029,4],[1190,4]]},"479":{"position":[[0,4]]},"481":{"position":[[1152,4],[1299,4]]},"483":{"position":[[634,4],[2964,4]]},"496":{"position":[[460,4]]},"507":{"position":[[393,4]]},"517":{"position":[[20,4]]},"559":{"position":[[936,4]]},"563":{"position":[[74,4]]},"618":{"position":[[136,4],[713,4]]},"623":{"position":[[17,4],[343,4],[627,4]]}}}],["eai_again",{"_index":2813,"t":{"439":{"position":[[324,9],[843,9]]}}}],["earli",{"_index":2573,"t":{"365":{"position":[[79,6]]}}}],["earlier",{"_index":1071,"t":{"73":{"position":[[7789,8]]},"357":{"position":[[612,7]]},"457":{"position":[[1114,7]]},"557":{"position":[[2557,8]]},"565":{"position":[[999,8],[1643,8],[2366,8]]},"567":{"position":[[192,7]]}}}],["eas",{"_index":3489,"t":{"633":{"position":[[2169,4]]}}}],["easi",{"_index":806,"t":{"50":{"position":[[520,4]]},"459":{"position":[[1580,4]]},"481":{"position":[[258,4]]},"633":{"position":[[1221,4]]}}}],["easili",{"_index":1046,"t":{"73":{"position":[[4906,6]]},"149":{"position":[[283,6]]},"633":{"position":[[2308,6]]}}}],["ec42e09d5ae0ee0f0816ca151008412a",{"_index":191,"t":{"4":{"position":[[5056,35]]},"8":{"position":[[1079,35]]},"91":{"position":[[2028,35],[3500,35]]},"151":{"position":[[3011,35]]},"174":{"position":[[1687,35],[2718,35]]},"178":{"position":[[2461,35],[3665,35]]},"269":{"position":[[2340,35],[3812,35]]},"305":{"position":[[1936,35],[3410,35]]}}}],["echo",{"_index":2263,"t":{"303":{"position":[[2521,4],[2526,4],[3021,4],[3848,5],[4595,4],[5041,4]]}}}],["echo.multi",{"_index":2264,"t":{"303":{"position":[[2536,10]]}}}],["echo:36",{"_index":2274,"t":{"303":{"position":[[3787,7],[3942,7],[4568,7]]}}}],["econnreset",{"_index":2808,"t":{"439":{"position":[[91,10],[424,10]]}}}],["edg",{"_index":1519,"t":{"149":{"position":[[1039,4]]},"612":{"position":[[87,4]]},"614":{"position":[[275,5]]},"616":{"position":[[434,5]]}}}],["edit",{"_index":50,"t":{"4":{"position":[[741,7],[1514,7],[4358,8]]},"46":{"position":[[866,4],[935,7],[1262,8],[2384,4],[2453,7],[2622,8]]},"66":{"position":[[1363,4],[1432,7],[1765,8],[2897,4],[2966,7],[3135,8]]},"85":{"position":[[1122,4],[1191,7],[1524,8],[2614,4],[2683,7],[2852,8]]},"87":{"position":[[912,7]]},"91":{"position":[[1031,4],[1100,7],[1430,8],[2615,4],[2684,7],[2853,8]]},"95":{"position":[[804,4],[873,7],[1203,8],[2296,4],[2365,7],[2534,8]]},"103":{"position":[[1129,4],[1198,7],[1531,8],[2676,4],[2745,7],[2914,8]]},"110":{"position":[[2054,4],[2123,7],[2456,8],[3611,4],[3680,7],[3849,8]]},"114":{"position":[[922,4],[991,7],[1339,8],[2508,4],[2577,7],[2746,8]]},"143":{"position":[[1417,4],[1486,7],[1816,8],[2909,4],[2978,7],[3147,8]]},"153":{"position":[[1173,4],[1242,7],[1584,8],[2995,4],[3064,7],[3233,8]]},"184":{"position":[[1158,4]]},"186":{"position":[[936,4],[1005,7],[1344,8],[2490,4],[2559,7],[2728,8]]},"188":{"position":[[4069,4],[4138,7],[4474,8],[6018,4],[6087,7],[6256,8]]},"198":{"position":[[957,4],[1026,7],[1356,8],[2509,4],[2578,7],[2747,8]]},"202":{"position":[[793,4],[862,7],[1195,8],[2241,4],[2310,7],[2479,8]]},"208":{"position":[[966,4],[1035,7],[1365,8],[2435,4],[2504,7],[2673,8]]},"214":{"position":[[930,4],[999,7],[1323,8],[2406,4],[2475,7],[2644,8]]},"218":{"position":[[1286,4],[1355,7],[1697,8],[2791,4],[2860,7],[3029,8]]},"220":{"position":[[1270,4],[1339,7],[1666,8],[3041,4],[3110,7],[3279,8]]},"234":{"position":[[1045,4],[1114,7],[1459,8],[2499,4],[2568,7],[2737,8]]},"253":{"position":[[1118,4],[1187,7],[1529,8],[2577,4],[2646,7],[2815,8]]},"257":{"position":[[1192,4],[1261,7],[1594,8],[2998,4],[3067,7],[3236,8]]},"261":{"position":[[971,4],[1040,7],[1388,8],[2831,4],[2900,7],[3069,8]]},"265":{"position":[[846,4],[915,7],[1245,8],[2594,4],[2663,7],[2832,8]]},"269":{"position":[[1087,4],[1156,7],[1486,8],[2927,4],[2996,7],[3165,8]]},"277":{"position":[[1161,4],[1230,7],[1560,8],[2647,4],[2716,7],[2885,8]]},"281":{"position":[[894,4],[963,7],[1284,8],[2365,4],[2434,7],[2603,8]]},"285":{"position":[[915,4],[984,7],[1323,8],[2414,4],[2483,7],[2652,8]]},"291":{"position":[[1090,4],[1159,7],[1492,8],[2906,4],[2975,7],[3144,8]]},"295":{"position":[[928,4],[997,7],[1324,8],[2382,4],[2451,7],[2620,8]]},"301":{"position":[[1399,4],[1468,7],[1795,8],[2935,4],[3004,7],[3173,8]]},"305":{"position":[[944,4],[1013,7],[1346,8],[2534,4],[2603,7],[2772,8]]},"317":{"position":[[923,4],[992,7],[1328,8],[2508,4],[2577,7],[2746,8]]},"325":{"position":[[2332,4],[2401,7],[2731,8],[4138,4],[4207,7],[4376,8]]},"327":{"position":[[899,7]]},"329":{"position":[[813,4],[882,7],[1203,8],[2235,4],[2304,7],[2473,8]]},"333":{"position":[[796,4],[865,7],[1204,8],[2250,4],[2319,7],[2488,8]]},"341":{"position":[[867,4],[936,7],[1284,8],[2363,4],[2432,7],[2601,8]]},"343":{"position":[[3157,4]]},"345":{"position":[[1039,4],[1108,7],[1441,8],[2635,4],[2704,7],[2873,8]]},"349":{"position":[[897,4],[966,7],[1302,8],[2391,4],[2460,7],[2629,8]]},"459":{"position":[[790,6]]},"461":{"position":[[187,6]]}}}],["editor",{"_index":768,"t":{"46":{"position":[[1155,6],[1511,6],[1661,6],[2907,6],[3057,6]]},"66":{"position":[[1654,6],[2016,6],[2166,6],[3422,6],[3572,6]]},"85":{"position":[[1413,6],[1775,6],[1925,6],[3139,6],[3289,6]]},"91":{"position":[[1321,6],[1680,6],[1830,6],[3139,6],[3289,6]]},"95":{"position":[[1094,6],[1453,6],[1603,6],[2820,6],[2970,6]]},"103":{"position":[[1420,6],[1782,6],[1932,6],[3201,6],[3351,6]]},"110":{"position":[[2345,6],[2707,6],[2857,6],[4136,6],[4286,6]]},"114":{"position":[[1218,6],[1595,6],[1745,6],[3038,6],[3188,6]]},"143":{"position":[[1707,6],[2066,6],[2216,6],[3433,6],[3583,6]]},"153":{"position":[[1467,6],[1838,6],[1988,6],[3523,6],[3673,6]]},"186":{"position":[[1229,6],[1597,6],[1747,6],[3017,6],[3167,6]]},"188":{"position":[[4361,6],[4726,6],[4876,6],[6544,6],[6694,6]]},"198":{"position":[[1247,6],[1606,6],[1756,6],[3033,6],[3183,6]]},"202":{"position":[[1084,6],[1446,6],[1596,6],[2766,6],[2916,6]]},"208":{"position":[[1256,6],[1615,6],[1765,6],[2959,6],[3109,6]]},"214":{"position":[[1218,6],[1571,6],[1721,6],[2928,6],[3078,6]]},"218":{"position":[[1580,6],[1951,6],[2101,6],[3319,6],[3469,6]]},"220":{"position":[[1559,6],[2168,6],[2318,6],[3564,6],[3714,6]]},"234":{"position":[[1340,6],[1714,6],[1864,6],[3028,6],[3178,6]]},"253":{"position":[[1412,6],[1783,6],[1933,6],[3105,6],[3255,6]]},"257":{"position":[[1483,6],[2104,6],[2254,6],[3523,6],[3673,6]]},"261":{"position":[[1267,6],[1918,6],[2068,6],[3361,6],[3511,6]]},"265":{"position":[[1136,6],[1751,6],[1901,6],[3118,6],[3268,6]]},"269":{"position":[[1377,6],[1992,6],[2142,6],[3451,6],[3601,6]]},"277":{"position":[[1451,6],[1810,6],[1960,6],[3171,6],[3321,6]]},"281":{"position":[[1181,6],[1531,6],[1681,6],[2886,6],[3036,6]]},"285":{"position":[[1208,6],[1576,6],[1726,6],[2941,6],[3091,6]]},"291":{"position":[[1381,6],[2002,6],[2152,6],[3431,6],[3581,6]]},"295":{"position":[[1217,6],[1573,6],[1723,6],[2905,6],[3055,6]]},"301":{"position":[[1688,6],[2044,6],[2194,6],[3458,6],[3608,6]]},"305":{"position":[[1235,6],[1597,6],[1747,6],[3059,6],[3209,6]]},"317":{"position":[[1215,6],[1580,6],[1730,6],[3034,6],[3184,6]]},"325":{"position":[[2622,6],[3237,6],[3387,6],[4662,6],[4812,6]]},"329":{"position":[[1100,6],[1450,6],[1600,6],[2756,6],[2906,6]]},"333":{"position":[[1089,6],[1457,6],[1607,6],[2777,6],[2927,6]]},"341":{"position":[[1163,6],[1540,6],[1690,6],[2893,6],[3043,6]]},"345":{"position":[[1330,6],[1692,6],[1842,6],[3160,6],[3310,6]]},"349":{"position":[[1189,6],[1554,6],[1704,6],[2917,6],[3067,6]]},"459":{"position":[[741,7]]},"461":{"position":[[138,7]]},"573":{"position":[[165,6]]}}}],["effect",{"_index":2843,"t":{"457":{"position":[[458,6]]}}}],["effort",{"_index":2906,"t":{"459":{"position":[[1303,6]]},"463":{"position":[[207,6]]},"629":{"position":[[6,6]]}}}],["eleph",{"_index":2586,"t":{"367":{"position":[[506,9],[559,9],[684,9],[737,9],[1220,8],[1335,10],[1465,9],[1630,10]]},"402":{"position":[[102,9],[338,10]]}}}],["elimin",{"_index":1867,"t":{"194":{"position":[[536,9]]},"483":{"position":[[318,9]]},"492":{"position":[[381,9],[522,10]]}}}],["elsewher",{"_index":284,"t":{"8":{"position":[[1906,9]]}}}],["email",{"_index":1744,"t":{"178":{"position":[[935,5]]},"311":{"position":[[553,5],[841,5],[1318,5]]},"466":{"position":[[112,5]]},"559":{"position":[[548,5]]},"561":{"position":[[281,5]]}}}],["email/nam",{"_index":2252,"t":{"303":{"position":[[1193,10]]}}}],["emit",{"_index":3405,"t":{"599":{"position":[[3287,4],[3633,4],[3729,5]]}}}],["emitt",{"_index":3282,"t":{"586":{"position":[[688,8],[757,9]]}}}],["empti",{"_index":1647,"t":{"164":{"position":[[313,5]]},"343":{"position":[[2053,5],[4969,5]]},"395":{"position":[[477,5]]},"399":{"position":[[450,5]]},"481":{"position":[[1532,5]]},"535":{"position":[[205,5]]}}}],["emul",{"_index":3359,"t":{"594":{"position":[[246,8]]}}}],["enabl",{"_index":97,"t":{"4":{"position":[[1902,7],[4116,7],[4891,9],[5180,9]]},"14":{"position":[[24,8]]},"20":{"position":[[40,6],[154,8]]},"31":{"position":[[420,7]]},"42":{"position":[[169,7],[313,7],[1129,6]]},"46":{"position":[[1649,6],[3045,6]]},"60":{"position":[[896,9],[1992,9]]},"62":{"position":[[23,7]]},"66":{"position":[[2154,6],[2226,9],[3560,6],[3644,9]]},"85":{"position":[[1913,6],[1985,9],[3277,6],[3361,9]]},"87":{"position":[[905,6]]},"91":{"position":[[1818,6],[1921,9],[3277,6],[3393,9]]},"95":{"position":[[1591,6],[1692,9],[2958,6],[3072,9]]},"103":{"position":[[1920,6],[2027,9],[3339,6],[3458,9]]},"110":{"position":[[2845,6],[4274,6]]},"114":{"position":[[1733,6],[1839,9],[3176,6],[3289,9]]},"143":{"position":[[2204,6],[3571,6]]},"149":{"position":[[1689,6]]},"151":{"position":[[2904,9]]},"153":{"position":[[1976,6],[2080,9],[3661,6],[3774,9]]},"180":{"position":[[292,7]]},"184":{"position":[[1236,8],[1245,6],[1265,6]]},"186":{"position":[[1735,6],[1811,9],[3155,6],[3241,9]]},"188":{"position":[[4864,6],[4944,9],[6682,6],[6773,9]]},"196":{"position":[[723,9]]},"198":{"position":[[1744,6],[1842,9],[3171,6],[3282,9]]},"200":{"position":[[1934,9]]},"202":{"position":[[1584,6],[1658,9],[2904,6],[2990,9]]},"204":{"position":[[91,8]]},"208":{"position":[[438,7],[518,7],[1753,6],[1850,9],[3097,6],[3207,9]]},"210":{"position":[[86,8]]},"214":{"position":[[1709,6],[1801,9],[3066,6],[3173,9]]},"216":{"position":[[3393,6],[3437,6]]},"218":{"position":[[2089,6],[3457,6]]},"220":{"position":[[2306,6],[3702,6]]},"222":{"position":[[12,7]]},"230":{"position":[[126,7]]},"234":{"position":[[1852,6],[1932,9],[3166,6],[3254,9]]},"236":{"position":[[12,7]]},"253":{"position":[[1921,6],[2028,9],[3243,6],[3359,9]]},"257":{"position":[[2242,6],[2349,9],[3661,6],[3780,9]]},"261":{"position":[[2056,6],[2162,9],[3499,6],[3612,9]]},"265":{"position":[[1889,6],[1990,9],[3256,6],[3370,9]]},"269":{"position":[[2130,6],[2233,9],[3589,6],[3705,9]]},"271":{"position":[[301,7]]},"277":{"position":[[1948,6],[2044,9],[3309,6],[3418,9]]},"281":{"position":[[1669,6],[1718,9],[3024,6],[3089,9]]},"283":{"position":[[88,6],[359,8]]},"285":{"position":[[1714,6],[1790,9],[3079,6],[3165,9]]},"291":{"position":[[2140,6],[3569,6]]},"295":{"position":[[1711,6],[1804,9],[3043,6],[3150,9]]},"297":{"position":[[339,6],[1164,8],[1253,6],[1293,6],[1377,9],[1563,7]]},"301":{"position":[[2182,6],[2233,9],[3596,6],[3661,9]]},"303":{"position":[[55,7],[2615,8]]},"305":{"position":[[1735,6],[1831,9],[3197,6],[3305,9]]},"315":{"position":[[80,7]]},"317":{"position":[[1718,6],[1819,9],[3172,6],[3284,9]]},"325":{"position":[[3375,6],[4800,6]]},"327":{"position":[[63,6],[278,6],[1618,9],[2413,9]]},"329":{"position":[[1588,6],[1637,9],[2894,6],[2959,9]]},"333":{"position":[[1595,6],[1699,9],[2915,6],[3029,9]]},"341":{"position":[[1678,6],[3031,6]]},"343":{"position":[[1045,9],[2592,9],[3821,9]]},"345":{"position":[[1830,6],[1927,9],[3298,6],[3407,9]]},"349":{"position":[[1692,6],[3055,6]]},"355":{"position":[[403,9]]},"369":{"position":[[233,7]]},"384":{"position":[[253,8]]},"451":{"position":[[424,6]]},"472":{"position":[[1144,8]]},"476":{"position":[[6353,6]]},"483":{"position":[[2437,6],[2490,7],[2553,7],[2616,7]]},"496":{"position":[[141,6],[292,6],[472,6]]},"515":{"position":[[69,7]]},"557":{"position":[[2443,8]]},"559":{"position":[[830,6],[881,7],[948,6]]},"563":{"position":[[19,7],[86,6]]},"575":{"position":[[65,6],[219,6]]},"625":{"position":[[618,7],[1130,8],[1207,7],[1260,6],[1421,6]]}}}],["encount",{"_index":1995,"t":{"216":{"position":[[3152,11]]},"365":{"position":[[364,10]]},"549":{"position":[[1357,9]]}}}],["end",{"_index":1195,"t":{"105":{"position":[[829,3],[2119,3]]},"118":{"position":[[3156,3]]},"120":{"position":[[990,3]]},"130":{"position":[[167,3]]},"138":{"position":[[827,3]]},"149":{"position":[[3617,3]]},"153":{"position":[[2242,3],[3936,3]]},"303":{"position":[[161,4]]},"337":{"position":[[92,3]]},"343":{"position":[[3620,3]]},"365":{"position":[[74,4]]},"439":{"position":[[982,4]]},"483":{"position":[[498,6]]},"553":{"position":[[100,3]]},"594":{"position":[[206,4]]},"633":{"position":[[1517,3],[1524,4]]}}}],["endless",{"_index":2640,"t":{"376":{"position":[[744,8],[878,8]]},"476":{"position":[[3030,8],[4497,8],[4845,8],[5447,8],[5667,8]]},"490":{"position":[[647,8],[845,8]]}}}],["endors",{"_index":2434,"t":{"343":{"position":[[71,8]]}}}],["endpoint",{"_index":574,"t":{"27":{"position":[[1507,9],[1714,9],[1823,9]]},"29":{"position":[[3,8]]},"31":{"position":[[20,8]]},"87":{"position":[[207,10]]},"112":{"position":[[224,10]]},"136":{"position":[[900,8]]},"157":{"position":[[470,10],[554,10]]},"166":{"position":[[253,10],[479,10]]},"174":{"position":[[963,8]]},"178":{"position":[[1317,8]]},"200":{"position":[[2089,9]]},"222":{"position":[[727,10]]},"224":{"position":[[438,8],[843,8],[1398,8],[1598,8],[1741,8],[2295,8]]},"228":{"position":[[38,8],[473,8]]},"230":{"position":[[43,8]]},"234":{"position":[[543,8],[615,8]]},"238":{"position":[[429,8],[832,8],[1379,8],[1585,8],[1726,8],[2281,8]]},"242":{"position":[[227,8]]},"244":{"position":[[49,8]]},"259":{"position":[[323,10]]},"267":{"position":[[272,10]]},"313":{"position":[[108,8],[451,10]]},"333":{"position":[[371,8]]},"415":{"position":[[153,9]]},"423":{"position":[[332,10]]},"425":{"position":[[3191,8],[3339,8]]},"435":{"position":[[128,8],[1714,8]]},"543":{"position":[[898,11]]},"557":{"position":[[1717,8],[1760,8],[1831,8]]},"581":{"position":[[231,8],[325,9],[426,8],[509,8]]},"599":{"position":[[1409,9]]},"633":{"position":[[265,10],[302,10],[863,8]]}}}],["endpointlfm",{"_index":2060,"t":{"234":{"position":[[732,11],[944,11],[1289,11],[1374,11],[1608,11],[2220,11],[2417,11],[2941,11],[3326,13]]}}}],["endpointlz",{"_index":1721,"t":{"174":{"position":[[2833,13]]},"178":{"position":[[3780,13]]},"253":{"position":[[807,10],[1018,10],[1362,10],[1446,10],[1678,10],[2300,10],[2496,10],[3019,10],[3415,12]]}}}],["enforc",{"_index":853,"t":{"57":{"position":[[456,11]]},"421":{"position":[[345,8]]},"423":{"position":[[73,8]]},"483":{"position":[[2689,9]]}}}],["english",{"_index":2999,"t":{"483":{"position":[[1469,7],[1904,8],[2057,7]]}}}],["enhanc",{"_index":343,"t":{"12":{"position":[[697,7]]},"297":{"position":[[367,12]]},"315":{"position":[[368,8],[600,8]]},"351":{"position":[[47,7]]},"359":{"position":[[87,9]]},"384":{"position":[[955,8]]},"472":{"position":[[1995,8]]},"496":{"position":[[98,8],[247,12]]},"569":{"position":[[472,12]]}}}],["enhance/correct",{"_index":3477,"t":{"633":{"position":[[669,15]]}}}],["enotfound",{"_index":2812,"t":{"439":{"position":[[233,9],[829,9]]}}}],["enough",{"_index":1410,"t":{"123":{"position":[[554,6]]},"125":{"position":[[338,6]]},"136":{"position":[[1250,6]]},"353":{"position":[[149,6]]},"459":{"position":[[103,6]]},"476":{"position":[[6836,8]]},"481":{"position":[[1641,6]]},"488":{"position":[[182,6]]},"594":{"position":[[1476,6],[2719,6]]}}}],["enrich",{"_index":2312,"t":{"311":{"position":[[312,6]]}}}],["enrol",{"_index":1506,"t":{"149":{"position":[[466,8],[2982,8]]}}}],["ensur",{"_index":670,"t":{"38":{"position":[[766,6]]},"44":{"position":[[1609,6]]},"60":{"position":[[146,6]]},"130":{"position":[[429,7]]},"132":{"position":[[121,6]]},"210":{"position":[[197,6]]},"242":{"position":[[127,6]]},"425":{"position":[[1856,6],[2527,6]]},"435":{"position":[[2242,6]]},"437":{"position":[[0,6]]},"441":{"position":[[199,6]]},"483":{"position":[[356,6],[409,6],[2139,7]]},"565":{"position":[[1257,6]]},"633":{"position":[[2451,6]]}}}],["enter",{"_index":2485,"t":{"343":{"position":[[5248,5]]},"441":{"position":[[285,8]]}}}],["entir",{"_index":157,"t":{"4":{"position":[[4329,6]]},"151":{"position":[[1137,9]]},"224":{"position":[[1556,6],[2453,6]]},"238":{"position":[[1537,6],[2439,6]]},"415":{"position":[[27,8]]},"435":{"position":[[2304,8]]},"476":{"position":[[214,6]]},"627":{"position":[[1394,6]]}}}],["entiti",{"_index":1189,"t":{"105":{"position":[[635,8]]},"138":{"position":[[633,8]]}}}],["entri",{"_index":227,"t":{"6":{"position":[[219,5]]},"151":{"position":[[727,6]]},"160":{"position":[[1313,5]]}}}],["entrypoint",{"_index":1008,"t":{"73":{"position":[[2395,11]]},"77":{"position":[[994,11]]}}}],["env",{"_index":9,"t":{"4":{"position":[[56,5],[288,3],[526,3],[1850,4],[3898,4]]},"8":{"position":[[1184,3],[1366,4],[1674,3],[1796,3]]},"10":{"position":[[195,3]]},"12":{"position":[[1420,3]]},"14":{"position":[[1034,3]]},"18":{"position":[[2451,3],[4426,3]]},"20":{"position":[[527,3]]},"22":{"position":[[299,3]]},"31":{"position":[[437,3]]},"42":{"position":[[348,3]]},"46":{"position":[[0,3],[62,3]]},"60":{"position":[[1096,4],[2188,4]]},"62":{"position":[[428,3]]},"64":{"position":[[1362,3],[3884,3]]},"66":{"position":[[0,3],[62,3]]},"71":{"position":[[281,3]]},"73":{"position":[[1642,3],[2961,3]]},"77":{"position":[[241,3]]},"79":{"position":[[185,3]]},"83":{"position":[[1221,3],[3676,3]]},"85":{"position":[[0,3],[62,3]]},"89":{"position":[[368,3]]},"91":{"position":[[0,3],[62,3]]},"95":{"position":[[0,3],[62,3]]},"99":{"position":[[368,3]]},"101":{"position":[[92,3]]},"103":{"position":[[0,3],[62,3]]},"110":{"position":[[831,5],[1052,3],[1114,3]]},"114":{"position":[[0,3],[62,3]]},"143":{"position":[[576,3],[638,3]]},"151":{"position":[[1836,3],[2228,3]]},"153":{"position":[[0,3],[62,3]]},"164":{"position":[[460,3]]},"166":{"position":[[1726,5]]},"174":{"position":[[455,3],[474,3]]},"176":{"position":[[0,3],[168,3]]},"178":{"position":[[588,3],[607,3],[1714,3]]},"184":{"position":[[64,4]]},"186":{"position":[[0,3],[62,3]]},"188":{"position":[[1622,5],[2110,3],[2172,3]]},"196":{"position":[[558,3]]},"198":{"position":[[0,3],[62,3]]},"202":{"position":[[0,3],[62,3]]},"208":{"position":[[0,3],[62,3]]},"214":{"position":[[0,3],[62,3]]},"218":{"position":[[0,3],[62,3]]},"220":{"position":[[355,3],[417,3]]},"234":{"position":[[0,3],[62,3]]},"242":{"position":[[167,4]]},"247":{"position":[[37,4]]},"253":{"position":[[0,3],[62,3]]},"257":{"position":[[0,3],[62,3]]},"261":{"position":[[0,3],[62,3]]},"265":{"position":[[0,3],[62,3]]},"269":{"position":[[0,3],[62,3]]},"277":{"position":[[0,3],[62,3]]},"281":{"position":[[0,3],[62,3]]},"285":{"position":[[0,3],[62,3]]},"291":{"position":[[157,3],[219,3]]},"293":{"position":[[1000,4],[1720,5]]},"295":{"position":[[0,3],[62,3]]},"297":{"position":[[998,3],[1244,3]]},"301":{"position":[[125,3],[187,3]]},"303":{"position":[[2888,4],[3326,4],[4020,3],[5190,4]]},"305":{"position":[[0,3],[62,3]]},"307":{"position":[[470,5]]},"311":{"position":[[423,3],[525,3]]},"317":{"position":[[0,3],[62,3]]},"325":{"position":[[1449,3],[1511,3]]},"329":{"position":[[0,3],[62,3]]},"333":{"position":[[0,3],[62,3]]},"341":{"position":[[0,3],[62,3]]},"343":{"position":[[1019,4],[2565,5],[3422,4]]},"345":{"position":[[0,3],[62,3]]},"349":{"position":[[0,3],[62,3]]},"384":{"position":[[64,3],[111,3],[320,3],[433,4],[539,3]]},"457":{"position":[[1626,5]]},"459":{"position":[[1523,3],[1600,3]]},"472":{"position":[[95,3],[177,3],[997,3],[1211,3],[1325,4],[1436,3]]},"501":{"position":[[76,3]]},"509":{"position":[[266,3],[289,3]]},"539":{"position":[[31,3]]},"543":{"position":[[462,3]]},"549":{"position":[[548,4],[603,4],[1763,3]]},"557":{"position":[[1844,3],[2119,4]]},"588":{"position":[[560,4],[920,6]]},"623":{"position":[[0,3]]},"625":{"position":[[1156,3]]},"627":{"position":[[190,3],[399,3],[636,3],[1257,3]]},"629":{"position":[[25,3],[43,3]]},"631":{"position":[[72,3],[130,3]]},"633":{"position":[[1248,4]]}}}],["env/fil",{"_index":1925,"t":{"204":{"position":[[313,8]]},"210":{"position":[[279,8]]},"244":{"position":[[491,8]]}}}],["environ",{"_index":58,"t":{"4":{"position":[[851,12]]},"8":{"position":[[766,11]]},"12":{"position":[[1474,12]]},"14":{"position":[[1088,12]]},"22":{"position":[[129,12]]},"44":{"position":[[1517,11]]},"73":{"position":[[1889,12],[2219,12],[3748,12],[6250,12],[6283,12],[6482,12],[6515,12],[6783,11],[8130,12],[8163,12],[8362,12],[8395,12],[8659,11],[9933,12],[9966,12],[10163,11]]},"77":{"position":[[488,12],[818,12]]},"93":{"position":[[193,11]]},"174":{"position":[[587,12]]},"178":{"position":[[720,12]]},"196":{"position":[[601,11]]},"293":{"position":[[1157,12]]},"311":{"position":[[489,11]]},"347":{"position":[[331,12],[642,12]]},"384":{"position":[[695,12]]},"472":{"position":[[1592,12]]},"509":{"position":[[359,12]]},"543":{"position":[[577,12],[1397,12],[1566,12],[2611,12]]},"545":{"position":[[560,12]]},"555":{"position":[[224,12]]},"557":{"position":[[240,11],[861,11],[1858,11],[2273,11],[2684,11],[3610,11]]},"559":{"position":[[456,11],[1037,11],[1180,11],[1322,11],[1460,11]]},"561":{"position":[[189,11]]},"563":{"position":[[175,11],[318,11],[460,11],[598,11]]},"565":{"position":[[921,11],[1165,11],[1565,11],[1951,11],[2288,11]]},"623":{"position":[[166,12]]},"631":{"position":[[273,12]]}}}],["environment",{"_index":8,"t":{"4":{"position":[[42,13],[320,13],[1226,13],[3396,13]]},"8":{"position":[[70,13],[434,13],[712,13],[1418,13],[1553,13]]},"46":{"position":[[79,13]]},"66":{"position":[[79,13]]},"85":{"position":[[79,13]]},"91":{"position":[[79,13]]},"95":{"position":[[79,13]]},"103":{"position":[[79,13]]},"110":{"position":[[1131,13]]},"114":{"position":[[79,13]]},"143":{"position":[[655,13]]},"153":{"position":[[79,13]]},"186":{"position":[[79,13]]},"188":{"position":[[2189,13]]},"198":{"position":[[79,13]]},"202":{"position":[[79,13]]},"208":{"position":[[79,13]]},"214":{"position":[[79,13]]},"218":{"position":[[174,13]]},"220":{"position":[[434,13]]},"234":{"position":[[79,13]]},"253":{"position":[[79,13]]},"257":{"position":[[79,13]]},"261":{"position":[[79,13]]},"265":{"position":[[79,13]]},"269":{"position":[[79,13]]},"277":{"position":[[79,13]]},"281":{"position":[[79,13]]},"285":{"position":[[79,13]]},"291":{"position":[[236,13]]},"295":{"position":[[79,13]]},"297":{"position":[[1589,13]]},"301":{"position":[[204,13]]},"305":{"position":[[79,13]]},"317":{"position":[[79,13]]},"325":{"position":[[1528,13]]},"329":{"position":[[79,13]]},"333":{"position":[[79,13]]},"341":{"position":[[79,13]]},"345":{"position":[[79,13]]},"349":{"position":[[79,13]]},"435":{"position":[[1501,13]]},"543":{"position":[[1487,13],[1965,13]]},"549":{"position":[[482,13],[879,13],[2397,13]]},"555":{"position":[[406,13]]},"623":{"position":[[44,13]]}}}],["environment/contain",{"_index":730,"t":{"44":{"position":[[1586,22]]},"565":{"position":[[1234,22]]}}}],["eol",{"_index":3166,"t":{"551":{"position":[[150,4]]}}}],["ep",{"_index":1583,"t":{"151":{"position":[[1901,2],[1938,3]]},"178":{"position":[[2187,4],[3386,4]]},"481":{"position":[[322,4],[811,3]]},"488":{"position":[[496,2],[554,6],[909,2],[967,6]]},"501":{"position":[[364,6]]},"505":{"position":[[461,6]]},"509":{"position":[[760,6],[1339,6]]}}}],["ephemer",{"_index":359,"t":{"12":{"position":[[1298,9]]},"18":{"position":[[3743,9]]}}}],["ep|single)$/i",{"_index":1589,"t":{"151":{"position":[[2680,15]]}}}],["equival",{"_index":221,"t":{"4":{"position":[[5790,11]]},"171":{"position":[[95,10]]},"230":{"position":[[1025,10]]},"249":{"position":[[302,10]]},"459":{"position":[[1190,10]]},"463":{"position":[[94,10]]}}}],["error",{"_index":208,"t":{"4":{"position":[[5472,8],[5696,8]]},"8":{"position":[[1405,5]]},"27":{"position":[[148,5],[785,5],[982,8],[1138,5],[1380,8]]},"29":{"position":[[185,5]]},"46":{"position":[[1054,6],[2571,6]]},"66":{"position":[[1551,6],[3084,6]]},"85":{"position":[[1310,6],[2801,6]]},"91":{"position":[[1219,6],[2802,6]]},"95":{"position":[[992,6],[2483,6]]},"103":{"position":[[1317,6],[2863,6]]},"110":{"position":[[2242,6],[3798,6]]},"114":{"position":[[1110,6],[2695,6]]},"143":{"position":[[1605,6],[3096,6]]},"147":{"position":[[588,6]]},"153":{"position":[[1361,6],[3182,6]]},"186":{"position":[[1124,6],[2677,6]]},"188":{"position":[[4257,6],[6205,6]]},"198":{"position":[[1145,6],[2696,6]]},"202":{"position":[[981,6],[2428,6]]},"208":{"position":[[1154,6],[2622,6]]},"214":{"position":[[1118,6],[2593,6]]},"216":{"position":[[223,6],[3145,6]]},"218":{"position":[[1474,6],[2978,6]]},"220":{"position":[[1458,6],[3228,6]]},"234":{"position":[[1233,6],[2686,6]]},"249":{"position":[[441,7]]},"253":{"position":[[1306,6],[2764,6]]},"257":{"position":[[1380,6],[3185,6]]},"261":{"position":[[1159,6],[3018,6]]},"265":{"position":[[1034,6],[2781,6]]},"269":{"position":[[1275,6],[3114,6]]},"277":{"position":[[1349,6],[2834,6]]},"281":{"position":[[1082,6],[2552,6]]},"285":{"position":[[1103,6],[2601,6]]},"291":{"position":[[1278,6],[3093,6]]},"295":{"position":[[1116,6],[2569,6]]},"297":{"position":[[1084,6]]},"301":{"position":[[1587,6],[3122,6]]},"303":{"position":[[755,5]]},"305":{"position":[[1132,6],[2721,6]]},"317":{"position":[[1111,6],[2695,6]]},"325":{"position":[[2520,6],[4325,6]]},"329":{"position":[[1001,6],[2422,6]]},"333":{"position":[[984,6],[2437,6]]},"341":{"position":[[1055,6],[2550,6]]},"343":{"position":[[1240,6],[5091,6]]},"345":{"position":[[1227,6],[2822,6]]},"347":{"position":[[1080,7]]},"349":{"position":[[1085,6],[2578,6]]},"365":{"position":[[378,5]]},"425":{"position":[[2657,6],[2809,5]]},"439":{"position":[[10,6]]},"441":{"position":[[11,6],[74,6]]},"444":{"position":[[158,5],[193,5],[225,5],[239,6],[415,6]]},"549":{"position":[[1327,6],[1370,5]]},"592":{"position":[[2530,5],[2567,5],[2592,5]]},"623":{"position":[[1286,5]]}}}],["error('error",{"_index":3388,"t":{"597":{"position":[[1074,12]]}}}],["error(`'baseurl",{"_index":3342,"t":{"592":{"position":[[1105,16]]}}}],["error(`'token",{"_index":3340,"t":{"592":{"position":[[952,14]]}}}],["error(`could",{"_index":3346,"t":{"592":{"position":[[1234,12]]}}}],["error/network",{"_index":2730,"t":{"425":{"position":[[237,13]]}}}],["errors/warn",{"_index":3042,"t":{"513":{"position":[[194,16]]}}}],["essenti",{"_index":2221,"t":{"297":{"position":[[2029,9]]},"457":{"position":[[2148,9]]}}}],["estim",{"_index":1556,"t":{"151":{"position":[[10,11],[115,9],[289,9]]}}}],["etc",{"_index":266,"t":{"8":{"position":[[1351,6]]},"22":{"position":[[248,7]]},"54":{"position":[[1599,7],[1702,5]]},"60":{"position":[[537,7],[1607,7]]},"73":{"position":[[5185,8]]},"118":{"position":[[1457,6]]},"155":{"position":[[177,6]]},"166":{"position":[[738,6]]},"347":{"position":[[1158,7]]},"361":{"position":[[436,7]]},"363":{"position":[[667,7]]},"376":{"position":[[544,7]]},"378":{"position":[[842,6]]},"384":{"position":[[469,6]]},"423":{"position":[[343,6]]},"427":{"position":[[257,6],[483,6]]},"451":{"position":[[156,7]]},"457":{"position":[[2777,7]]},"472":{"position":[[1361,6]]},"481":{"position":[[715,6],[815,6],[931,6],[1025,6]]},"494":{"position":[[166,6]]},"543":{"position":[[393,7]]},"549":{"position":[[419,7],[454,7]]},"581":{"position":[[623,6]]},"637":{"position":[[234,6]]}}}],["etc/prometheus.yml",{"_index":619,"t":{"31":{"position":[[530,20]]}}}],["etimedout",{"_index":2810,"t":{"439":{"position":[[164,9]]}}}],["evalu",{"_index":1264,"t":{"118":{"position":[[45,10]]},"303":{"position":[[4982,8]]}}}],["even",{"_index":407,"t":{"16":{"position":[[555,4]]},"60":{"position":[[1902,4]]},"120":{"position":[[849,4]]},"459":{"position":[[318,4]]},"476":{"position":[[481,4],[720,4]]},"625":{"position":[[1329,4]]}}}],["event",{"_index":553,"t":{"27":{"position":[[70,7]]},"73":{"position":[[3103,5]]},"79":{"position":[[327,5]]},"425":{"position":[[212,5]]},"599":{"position":[[1309,6],[1620,6],[1655,6],[3738,5]]}}}],["eventemitt",{"_index":3283,"t":{"586":{"position":[[697,13]]}}}],["eventu",{"_index":497,"t":{"18":{"position":[[3694,10]]},"87":{"position":[[665,10]]},"147":{"position":[[519,10]]},"303":{"position":[[4184,11]]}}}],["everyth",{"_index":586,"t":{"29":{"position":[[140,10]]},"105":{"position":[[776,13],[906,10]]},"138":{"position":[[774,13],[904,10]]},"483":{"position":[[885,10],[979,10]]},"633":{"position":[[1877,10]]}}}],["everywher",{"_index":1413,"t":{"125":{"position":[[146,10]]},"633":{"position":[[66,10]]}}}],["ex",{"_index":85,"t":{"4":{"position":[[1606,2]]},"10":{"position":[[491,2]]},"18":{"position":[[2349,2],[2422,2],[4324,2],[4397,2]]},"44":{"position":[[359,2],[617,2]]},"46":{"position":[[164,2],[231,2]]},"60":{"position":[[1291,2]]},"64":{"position":[[1359,2]]},"66":{"position":[[166,2],[237,2]]},"83":{"position":[[1218,2]]},"85":{"position":[[166,2],[237,2]]},"91":{"position":[[165,2],[234,2]]},"95":{"position":[[165,2],[234,2]]},"101":{"position":[[225,3]]},"103":{"position":[[166,2],[237,2]]},"110":{"position":[[1218,2],[1289,2]]},"114":{"position":[[161,2],[222,2]]},"143":{"position":[[741,2],[810,2]]},"153":{"position":[[169,2],[246,2]]},"184":{"position":[[351,2]]},"186":{"position":[[164,2],[231,2]]},"188":{"position":[[2277,2],[2350,2]]},"198":{"position":[[165,2],[234,2]]},"202":{"position":[[166,2],[237,2]]},"208":{"position":[[165,2],[234,2]]},"214":{"position":[[163,2],[228,2]]},"218":{"position":[[256,2],[317,2]]},"220":{"position":[[526,2],[607,2]]},"234":{"position":[[162,2],[225,2]]},"253":{"position":[[162,2],[225,2]]},"257":{"position":[[173,2],[258,2]]},"261":{"position":[[168,2],[243,2]]},"265":{"position":[[172,2],[255,2]]},"269":{"position":[[172,2],[255,2]]},"277":{"position":[[165,2],[234,2]]},"281":{"position":[[162,2],[225,2]]},"285":{"position":[[161,2],[222,2]]},"291":{"position":[[330,2],[415,2]]},"295":{"position":[[164,2],[231,2]]},"297":{"position":[[1002,3]]},"301":{"position":[[289,2],[356,2]]},"305":{"position":[[166,2],[237,2]]},"317":{"position":[[167,2],[240,2]]},"325":{"position":[[1621,2],[1704,2]]},"329":{"position":[[162,2],[225,2]]},"331":{"position":[[533,2]]},"333":{"position":[[164,2],[231,2]]},"335":{"position":[[164,2]]},"341":{"position":[[161,2],[222,2]]},"343":{"position":[[3125,3]]},"345":{"position":[[162,2],[225,2]]},"349":{"position":[[167,2],[240,2]]},"376":{"position":[[308,2],[606,2]]},"397":{"position":[[726,2]]},"412":{"position":[[159,2]]},"423":{"position":[[493,2]]},"435":{"position":[[2058,2]]},"437":{"position":[[595,2]]},"481":{"position":[[1367,2],[1456,2]]},"483":{"position":[[847,2],[939,2]]},"565":{"position":[[451,2],[705,2]]},"612":{"position":[[227,3]]},"614":{"position":[[379,2]]},"616":{"position":[[227,3],[543,2]]},"623":{"position":[[117,2]]},"625":{"position":[[1377,3]]}}}],["exact",{"_index":1328,"t":{"118":{"position":[[2385,5],[3395,5]]},"149":{"position":[[969,5]]},"325":{"position":[[288,5]]}}}],["exactli",{"_index":1409,"t":{"123":{"position":[[236,7]]},"149":{"position":[[1217,8],[2027,8]]},"343":{"position":[[2334,7],[3062,7],[3271,7]]},"633":{"position":[[2020,7]]}}}],["exampl",{"_index":51,"t":{"4":{"position":[[767,7],[1948,7],[2134,8],[2236,7],[2258,8],[2479,7],[2564,7],[2767,7],[3117,7],[4200,7],[4222,8],[4367,7],[4379,7],[4470,7],[4491,7],[6095,7],[6204,8]]},"8":{"position":[[138,8],[470,7]]},"10":{"position":[[483,7]]},"14":{"position":[[1149,7]]},"18":{"position":[[2779,7],[4698,7]]},"27":{"position":[[336,7],[801,7],[1154,7],[1534,7]]},"31":{"position":[[462,7]]},"33":{"position":[[112,8]]},"44":{"position":[[958,9],[977,8],[1017,7]]},"46":{"position":[[721,7],[746,7],[1343,7],[1386,7],[1491,7],[1580,7],[2203,7],[2228,7],[2703,7],[2746,7],[2887,7],[2976,7]]},"60":{"position":[[768,7],[1854,7]]},"64":{"position":[[825,8],[1447,8]]},"66":{"position":[[1216,7],[1241,7],[1846,7],[1889,7],[1996,7],[2085,7],[2714,7],[2739,7],[3216,7],[3259,7],[3402,7],[3491,7]]},"73":{"position":[[1708,7],[1797,7]]},"77":{"position":[[307,7],[396,7]]},"83":{"position":[[684,8],[1306,8]]},"85":{"position":[[975,7],[1000,7],[1605,7],[1648,7],[1755,7],[1844,7],[2431,7],[2456,7],[2933,7],[2976,7],[3119,7],[3208,7]]},"89":{"position":[[238,7]]},"91":{"position":[[885,7],[910,7],[1511,7],[1554,7],[1660,7],[1749,7],[2433,7],[2458,7],[2934,7],[2977,7],[3119,7],[3208,7]]},"93":{"position":[[97,7]]},"95":{"position":[[658,7],[683,7],[1284,7],[1327,7],[1433,7],[1522,7],[2114,7],[2139,7],[2615,7],[2658,7],[2800,7],[2889,7]]},"99":{"position":[[238,7]]},"103":{"position":[[982,7],[1007,7],[1612,7],[1655,7],[1762,7],[1851,7],[2493,7],[2518,7],[2995,7],[3038,7],[3181,7],[3270,7]]},"105":{"position":[[942,7]]},"110":{"position":[[1907,7],[1932,7],[2537,7],[2580,7],[2687,7],[2776,7],[3428,7],[3453,7],[3930,7],[3973,7],[4116,7],[4205,7]]},"114":{"position":[[770,7],[795,7],[1420,7],[1463,7],[1575,7],[1664,7],[2320,7],[2345,7],[2827,7],[2870,7],[3018,7],[3107,7]]},"118":{"position":[[746,7],[846,7],[1413,7],[1464,7],[1666,7],[1947,8],[3771,7]]},"123":{"position":[[147,9]]},"132":{"position":[[318,7]]},"138":{"position":[[940,7]]},"143":{"position":[[1271,7],[1296,7],[1897,7],[1940,7],[2046,7],[2135,7],[2727,7],[2752,7],[3228,7],[3271,7],[3413,7],[3502,7]]},"151":{"position":[[738,8],[2471,7],[2559,7]]},"153":{"position":[[1023,7],[1048,7],[1665,7],[1708,7],[1818,7],[1907,7],[2809,7],[2834,7],[3314,7],[3357,7],[3503,7],[3592,7]]},"155":{"position":[[114,8]]},"164":{"position":[[592,8]]},"171":{"position":[[83,8],[157,7],[249,8],[318,7]]},"182":{"position":[[356,9]]},"184":{"position":[[733,7]]},"186":{"position":[[787,7],[812,7],[1425,7],[1468,7],[1577,7],[1666,7],[2305,7],[2330,7],[2809,7],[2852,7],[2997,7],[3086,7]]},"188":{"position":[[1764,8],[3921,7],[3946,7],[4555,7],[4598,7],[4706,7],[4795,7],[5834,7],[5859,7],[6337,7],[6380,7],[6524,7],[6613,7]]},"194":{"position":[[271,7]]},"198":{"position":[[811,7],[836,7],[1437,7],[1480,7],[1586,7],[1675,7],[2327,7],[2352,7],[2828,7],[2871,7],[3013,7],[3102,7]]},"200":{"position":[[1893,7]]},"202":{"position":[[646,7],[671,7],[1276,7],[1319,7],[1426,7],[1515,7],[2058,7],[2083,7],[2560,7],[2603,7],[2746,7],[2835,7]]},"206":{"position":[[620,8],[629,8]]},"208":{"position":[[820,7],[845,7],[1446,7],[1489,7],[1595,7],[1684,7],[2253,7],[2278,7],[2754,7],[2797,7],[2939,7],[3028,7]]},"212":{"position":[[612,8],[621,8]]},"214":{"position":[[786,7],[811,7],[1404,7],[1447,7],[1551,7],[1640,7],[2226,7],[2251,7],[2725,7],[2768,7],[2908,7],[2997,7]]},"216":{"position":[[2265,7],[2797,7],[3426,7],[3456,7]]},"218":{"position":[[1136,7],[1161,7],[1778,7],[1821,7],[1931,7],[2020,7],[2605,7],[2630,7],[3110,7],[3153,7],[3299,7],[3388,7]]},"220":{"position":[[1125,7],[1150,7],[2000,7],[2043,7],[2148,7],[2237,7],[2860,7],[2885,7],[3360,7],[3403,7],[3544,7],[3633,7]]},"232":{"position":[[363,8]]},"234":{"position":[[894,7],[919,7],[1540,7],[1583,7],[1694,7],[1783,7],[2312,7],[2337,7],[2818,7],[2861,7],[3008,7],[3097,7]]},"244":{"position":[[602,8]]},"251":{"position":[[363,8]]},"253":{"position":[[968,7],[993,7],[1610,7],[1653,7],[1763,7],[1852,7],[2391,7],[2416,7],[2896,7],[2939,7],[3085,7],[3174,7]]},"257":{"position":[[1045,7],[1070,7],[1934,7],[1977,7],[2084,7],[2173,7],[2815,7],[2840,7],[3317,7],[3360,7],[3503,7],[3592,7]]},"261":{"position":[[819,7],[844,7],[1743,7],[1786,7],[1898,7],[1987,7],[2643,7],[2668,7],[3150,7],[3193,7],[3341,7],[3430,7]]},"265":{"position":[[700,7],[725,7],[1582,7],[1625,7],[1731,7],[1820,7],[2412,7],[2437,7],[2913,7],[2956,7],[3098,7],[3187,7]]},"269":{"position":[[941,7],[966,7],[1823,7],[1866,7],[1972,7],[2061,7],[2745,7],[2770,7],[3246,7],[3289,7],[3431,7],[3520,7]]},"271":{"position":[[921,8],[930,8]]},"273":{"position":[[342,7]]},"275":{"position":[[345,7]]},"277":{"position":[[1015,7],[1040,7],[1641,7],[1684,7],[1790,7],[1879,7],[2465,7],[2490,7],[2966,7],[3009,7],[3151,7],[3240,7]]},"281":{"position":[[751,7],[776,7],[1365,7],[1408,7],[1511,7],[1600,7],[2186,7],[2211,7],[2684,7],[2727,7],[2866,7],[2955,7]]},"285":{"position":[[766,7],[791,7],[1404,7],[1447,7],[1556,7],[1645,7],[2229,7],[2254,7],[2733,7],[2776,7],[2921,7],[3010,7]]},"291":{"position":[[943,7],[968,7],[1832,7],[1875,7],[1982,7],[2071,7],[2723,7],[2748,7],[3225,7],[3268,7],[3411,7],[3500,7]]},"295":{"position":[[783,7],[808,7],[1405,7],[1448,7],[1553,7],[1642,7],[2201,7],[2226,7],[2701,7],[2744,7],[2885,7],[2974,7]]},"297":{"position":[[888,8]]},"301":{"position":[[1254,7],[1279,7],[1876,7],[1919,7],[2024,7],[2113,7],[2754,7],[2779,7],[3254,7],[3297,7],[3438,7],[3527,7]]},"303":{"position":[[2660,8]]},"305":{"position":[[797,7],[822,7],[1427,7],[1470,7],[1577,7],[1666,7],[2351,7],[2376,7],[2853,7],[2896,7],[3039,7],[3128,7]]},"307":{"position":[[686,8]]},"317":{"position":[[775,7],[800,7],[1409,7],[1452,7],[1560,7],[1649,7],[2324,7],[2349,7],[2827,7],[2870,7],[3014,7],[3103,7]]},"325":{"position":[[772,8],[2186,7],[2211,7],[3068,7],[3111,7],[3217,7],[3306,7],[3956,7],[3981,7],[4457,7],[4500,7],[4642,7],[4731,7]]},"327":{"position":[[1535,7],[1543,7]]},"329":{"position":[[670,7],[695,7],[1284,7],[1327,7],[1430,7],[1519,7],[2056,7],[2081,7],[2554,7],[2597,7],[2736,7],[2825,7]]},"333":{"position":[[647,7],[672,7],[1285,7],[1328,7],[1437,7],[1526,7],[2065,7],[2090,7],[2569,7],[2612,7],[2757,7],[2846,7]]},"337":{"position":[[153,7]]},"341":{"position":[[715,7],[740,7],[1365,7],[1408,7],[1520,7],[1609,7],[2175,7],[2200,7],[2682,7],[2725,7],[2873,7],[2962,7]]},"345":{"position":[[892,7],[917,7],[1522,7],[1565,7],[1672,7],[1761,7],[2452,7],[2477,7],[2954,7],[2997,7],[3140,7],[3229,7]]},"347":{"position":[[166,7]]},"349":{"position":[[377,7],[749,7],[774,7],[1383,7],[1426,7],[1534,7],[1623,7],[2207,7],[2232,7],[2710,7],[2753,7],[2897,7],[2986,7]]},"357":{"position":[[737,8]]},"359":{"position":[[130,8]]},"361":{"position":[[397,9],[444,7],[1124,7],[1959,7]]},"365":{"position":[[895,7],[1176,7]]},"367":{"position":[[1161,7],[1365,7]]},"369":{"position":[[472,7]]},"374":{"position":[[4,8]]},"376":{"position":[[650,7]]},"378":{"position":[[1396,7]]},"382":{"position":[[230,7]]},"384":{"position":[[405,7],[507,7],[581,7]]},"387":{"position":[[0,7]]},"389":{"position":[[0,7]]},"391":{"position":[[149,7]]},"393":{"position":[[215,7]]},"395":{"position":[[170,7],[562,7]]},"402":{"position":[[40,7]]},"404":{"position":[[60,7]]},"406":{"position":[[0,7]]},"408":{"position":[[0,7]]},"410":{"position":[[0,7]]},"412":{"position":[[656,7]]},"425":{"position":[[1070,8],[1805,8],[3052,8]]},"435":{"position":[[1630,8]]},"453":{"position":[[188,7],[337,7]]},"466":{"position":[[745,7]]},"468":{"position":[[116,8]]},"470":{"position":[[358,7],[943,7]]},"472":{"position":[[1296,8],[1404,7],[1478,7]]},"476":{"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]]},"483":{"position":[[1401,7]]},"490":{"position":[[525,8]]},"494":{"position":[[374,7]]},"496":{"position":[[530,7]]},"499":{"position":[[0,7]]},"501":{"position":[[88,7]]},"503":{"position":[[277,7]]},"505":{"position":[[185,7]]},"507":{"position":[[406,7]]},"509":{"position":[[258,7]]},"539":{"position":[[44,8]]},"545":{"position":[[64,7],[76,7]]},"549":{"position":[[686,9],[1753,9]]},"555":{"position":[[439,8]]},"559":{"position":[[1681,7]]},"563":{"position":[[819,7]]},"565":{"position":[[885,8],[1855,7]]},"569":{"position":[[372,8],[449,7]]},"584":{"position":[[691,8],[812,8]]},"631":{"position":[[218,8]]},"637":{"position":[[170,8]]},"639":{"position":[[112,8]]}}}],["example.com",{"_index":2051,"t":{"232":{"position":[[551,13]]},"251":{"position":[[556,13]]}}}],["except",{"_index":493,"t":{"18":{"position":[[3250,6],[5004,6]]},"357":{"position":[[695,7]]},"425":{"position":[[673,9],[2766,9],[2890,9]]},"476":{"position":[[2757,6]]},"492":{"position":[[197,6]]},"543":{"position":[[2211,11]]}}}],["exclud",{"_index":2222,"t":{"299":{"position":[[103,7]]},"481":{"position":[[1252,9],[1462,7]]}}}],["exclus",{"_index":154,"t":{"4":{"position":[[4092,9]]},"297":{"position":[[873,10]]}}}],["execstart=npm",{"_index":3227,"t":{"573":{"position":[[371,13]]}}}],["execut",{"_index":2940,"t":{"476":{"position":[[1083,8]]}}}],["exhaust",{"_index":1210,"t":{"105":{"position":[[1908,10]]},"216":{"position":[[494,10]]},"376":{"position":[[221,10]]},"492":{"position":[[320,13]]}}}],["exist",{"_index":281,"t":{"8":{"position":[[1787,8]]},"38":{"position":[[49,8],[274,8],[410,8],[579,8]]},"40":{"position":[[235,6]]},"44":{"position":[[288,9]]},"50":{"position":[[28,8],[224,8]]},"52":{"position":[[109,8]]},"64":{"position":[[2992,8]]},"68":{"position":[[169,8]]},"73":{"position":[[25,9],[1751,8]]},"77":{"position":[[350,8]]},"83":{"position":[[2817,8]]},"118":{"position":[[100,8],[2845,8],[3048,9],[3131,8],[3622,8],[3978,8],[4036,8],[4566,9]]},"120":{"position":[[792,8]]},"123":{"position":[[272,8]]},"125":{"position":[[588,8]]},"216":{"position":[[568,8]]},"303":{"position":[[1796,8]]},"343":{"position":[[1531,9]]},"357":{"position":[[1494,11],[1533,10]]},"363":{"position":[[1188,8]]},"406":{"position":[[87,11]]},"444":{"position":[[100,6]]},"459":{"position":[[375,8]]},"476":{"position":[[2500,8]]},"522":{"position":[[53,8]]},"533":{"position":[[332,8]]},"559":{"position":[[127,8]]},"565":{"position":[[380,9]]},"599":{"position":[[1474,8]]}}}],["exit",{"_index":842,"t":{"54":{"position":[[1532,4]]},"444":{"position":[[172,6]]}}}],["expand",{"_index":790,"t":{"46":{"position":[[2173,6]]},"66":{"position":[[2684,6]]},"85":{"position":[[2401,6]]},"91":{"position":[[2403,6]]},"95":{"position":[[2084,6]]},"103":{"position":[[2463,6]]},"110":{"position":[[3398,6]]},"114":{"position":[[2290,6]]},"143":{"position":[[2697,6]]},"147":{"position":[[322,6]]},"153":{"position":[[2779,6]]},"186":{"position":[[2275,6]]},"188":{"position":[[5804,6]]},"192":{"position":[[648,6]]},"198":{"position":[[2297,6]]},"202":{"position":[[2028,6]]},"208":{"position":[[2223,6]]},"214":{"position":[[2196,6]]},"218":{"position":[[2575,6]]},"220":{"position":[[2830,6]]},"234":{"position":[[2282,6]]},"253":{"position":[[2361,6]]},"257":{"position":[[2785,6]]},"261":{"position":[[2613,6]]},"265":{"position":[[2382,6]]},"269":{"position":[[2715,6]]},"277":{"position":[[2435,6]]},"281":{"position":[[2156,6]]},"285":{"position":[[2199,6]]},"291":{"position":[[2693,6]]},"295":{"position":[[2171,6]]},"301":{"position":[[2724,6]]},"305":{"position":[[2321,6]]},"317":{"position":[[2294,6]]},"325":{"position":[[3926,6]]},"329":{"position":[[2026,6]]},"333":{"position":[[2035,6]]},"341":{"position":[[2145,6]]},"345":{"position":[[2422,6]]},"349":{"position":[[2177,6]]}}}],["expans",{"_index":3137,"t":{"549":{"position":[[658,10]]}}}],["expect",{"_index":2211,"t":{"297":{"position":[[1122,8]]},"457":{"position":[[3069,8]]},"476":{"position":[[6721,6]]},"488":{"position":[[333,6]]},"496":{"position":[[132,8]]}}}],["experi",{"_index":761,"t":{"46":{"position":[[943,10],[1358,10],[1547,10],[2461,10],[2718,10],[2943,10]]},"50":{"position":[[561,10]]},"66":{"position":[[1440,10],[1861,10],[2052,10],[2974,10],[3231,10],[3458,10]]},"73":{"position":[[381,11],[767,10]]},"85":{"position":[[1199,10],[1620,10],[1811,10],[2691,10],[2948,10],[3175,10]]},"91":{"position":[[1108,10],[1526,10],[1716,10],[2692,10],[2949,10],[3175,10]]},"95":{"position":[[881,10],[1299,10],[1489,10],[2373,10],[2630,10],[2856,10]]},"103":{"position":[[1206,10],[1627,10],[1818,10],[2753,10],[3010,10],[3237,10]]},"105":{"position":[[661,10]]},"110":{"position":[[2131,10],[2552,10],[2743,10],[3688,10],[3945,10],[4172,10]]},"114":{"position":[[999,10],[1435,10],[1631,10],[2585,10],[2842,10],[3074,10]]},"138":{"position":[[659,10]]},"143":{"position":[[1494,10],[1912,10],[2102,10],[2986,10],[3243,10],[3469,10]]},"151":{"position":[[1577,10]]},"153":{"position":[[1250,10],[1680,10],[1874,10],[3072,10],[3329,10],[3559,10]]},"186":{"position":[[1013,10],[1440,10],[1633,10],[2567,10],[2824,10],[3053,10]]},"188":{"position":[[4146,10],[4570,10],[4762,10],[6095,10],[6352,10],[6580,10]]},"194":{"position":[[127,10]]},"198":{"position":[[1034,10],[1452,10],[1642,10],[2586,10],[2843,10],[3069,10]]},"202":{"position":[[870,10],[1291,10],[1482,10],[2318,10],[2575,10],[2802,10]]},"208":{"position":[[1043,10],[1461,10],[1651,10],[2512,10],[2769,10],[2995,10]]},"214":{"position":[[1007,10],[1419,10],[1607,10],[2483,10],[2740,10],[2964,10]]},"216":{"position":[[200,10],[283,10]]},"218":{"position":[[1363,10],[1793,10],[1987,10],[2868,10],[3125,10],[3355,10]]},"220":{"position":[[1347,10],[2015,10],[2204,10],[3118,10],[3375,10],[3600,10]]},"234":{"position":[[1122,10],[1555,10],[1750,10],[2576,10],[2833,10],[3064,10]]},"253":{"position":[[1195,10],[1625,10],[1819,10],[2654,10],[2911,10],[3141,10]]},"257":{"position":[[1269,10],[1949,10],[2140,10],[3075,10],[3332,10],[3559,10]]},"261":{"position":[[1048,10],[1758,10],[1954,10],[2908,10],[3165,10],[3397,10]]},"265":{"position":[[923,10],[1597,10],[1787,10],[2671,10],[2928,10],[3154,10]]},"269":{"position":[[1164,10],[1838,10],[2028,10],[3004,10],[3261,10],[3487,10]]},"277":{"position":[[1238,10],[1656,10],[1846,10],[2724,10],[2981,10],[3207,10]]},"281":{"position":[[971,10],[1380,10],[1567,10],[2442,10],[2699,10],[2922,10]]},"285":{"position":[[992,10],[1419,10],[1612,10],[2491,10],[2748,10],[2977,10]]},"291":{"position":[[1167,10],[1847,10],[2038,10],[2983,10],[3240,10],[3467,10]]},"295":{"position":[[1005,10],[1420,10],[1609,10],[2459,10],[2716,10],[2941,10]]},"301":{"position":[[1476,10],[1891,10],[2080,10],[3012,10],[3269,10],[3494,10]]},"305":{"position":[[1021,10],[1442,10],[1633,10],[2611,10],[2868,10],[3095,10]]},"317":{"position":[[1000,10],[1424,10],[1616,10],[2585,10],[2842,10],[3070,10]]},"325":{"position":[[2409,10],[3083,10],[3273,10],[4215,10],[4472,10],[4698,10]]},"329":{"position":[[890,10],[1299,10],[1486,10],[2312,10],[2569,10],[2792,10]]},"333":{"position":[[873,10],[1300,10],[1493,10],[2327,10],[2584,10],[2813,10]]},"341":{"position":[[944,10],[1380,10],[1576,10],[2440,10],[2697,10],[2929,10]]},"343":{"position":[[1926,10]]},"345":{"position":[[1116,10],[1537,10],[1728,10],[2712,10],[2969,10],[3196,10]]},"349":{"position":[[974,10],[1398,10],[1590,10],[2468,10],[2725,10],[2953,10]]},"457":{"position":[[1239,10]]}}}],["experienc",{"_index":3055,"t":{"520":{"position":[[66,11]]}}}],["experiment",{"_index":1078,"t":{"73":{"position":[[8985,12]]},"216":{"position":[[178,13]]}}}],["expir",{"_index":1495,"t":{"147":{"position":[[530,7]]},"149":{"position":[[2897,7]]}}}],["expiri",{"_index":1494,"t":{"147":{"position":[[488,6]]}}}],["explain",{"_index":2881,"t":{"457":{"position":[[3057,7]]},"517":{"position":[[643,10]]}}}],["explan",{"_index":985,"t":{"73":{"position":[[1410,11]]},"77":{"position":[[9,11]]},"343":{"position":[[383,12]]}}}],["explicit",{"_index":2037,"t":{"228":{"position":[[92,8]]},"492":{"position":[[115,8]]}}}],["explicitli",{"_index":299,"t":{"10":{"position":[[341,10]]},"12":{"position":[[1231,10],[1366,10]]},"42":{"position":[[302,10]]},"89":{"position":[[518,10]]},"99":{"position":[[512,10]]},"118":{"position":[[2113,10]]},"168":{"position":[[585,10]]},"182":{"position":[[333,10],[889,10],[1196,10],[1636,10]]},"188":{"position":[[1293,10]]},"200":{"position":[[989,10]]},"206":{"position":[[366,10]]},"212":{"position":[[362,10]]},"216":{"position":[[2050,10]]},"271":{"position":[[719,10]]},"307":{"position":[[582,10]]},"331":{"position":[[492,10]]},"481":{"position":[[1223,11],[1373,10]]},"543":{"position":[[1105,10]]}}}],["explor",{"_index":156,"t":{"4":{"position":[[4317,7]]}}}],["export",{"_index":65,"t":{"4":{"position":[[1032,6]]},"31":{"position":[[13,6]]},"584":{"position":[[458,6],[870,6],[968,6],[1455,6],[1535,6],[1741,6],[1799,6]]},"586":{"position":[[439,6]]},"588":{"position":[[375,6]]},"590":{"position":[[336,6]]},"592":{"position":[[357,6],[1617,6],[2255,6]]},"594":{"position":[[1684,6]]},"597":{"position":[[439,6]]},"599":{"position":[[882,6],[2801,6],[3473,6]]}}}],["expos",{"_index":414,"t":{"18":{"position":[[153,7]]},"64":{"position":[[968,6]]},"73":{"position":[[5532,8],[5827,6],[6918,8],[7213,6],[9177,8],[9472,6],[9567,6]]},"83":{"position":[[827,6]]},"160":{"position":[[685,6],[1036,6]]},"293":{"position":[[1343,6]]}}}],["express",{"_index":2374,"t":{"327":{"position":[[1190,12],[1367,10],[1470,12]]},"367":{"position":[[194,11],[906,10]]},"378":{"position":[[409,12]]},"393":{"position":[[39,12]]},"395":{"position":[[57,11]]},"397":{"position":[[21,10],[95,11],[187,10],[234,11],[410,11]]},"399":{"position":[[49,12]]}}}],["expressj",{"_index":2702,"t":{"415":{"position":[[219,10]]}}}],["extend",{"_index":3251,"t":{"584":{"position":[[496,7],[910,7],[1011,7]]},"586":{"position":[[477,7]]},"590":{"position":[[374,7]]},"592":{"position":[[395,7],[1655,7],[2293,7]]},"594":{"position":[[1722,7]]},"597":{"position":[[477,7]]},"599":{"position":[[920,7],[2836,7],[3514,7]]}}}],["extens",{"_index":2120,"t":{"271":{"position":[[291,9]]},"315":{"position":[[47,10],[206,9]]},"335":{"position":[[34,9],[255,9]]},"339":{"position":[[171,10],[314,10]]},"419":{"position":[[226,10]]},"435":{"position":[[92,9],[2457,9]]},"633":{"position":[[1733,9]]}}}],["extern",{"_index":318,"t":{"12":{"position":[[45,8],[660,8]]},"18":{"position":[[353,8]]},"64":{"position":[[369,8],[484,8],[511,8],[1323,8],[2823,8],[3019,8],[3539,8]]},"66":{"position":[[450,8]]},"73":{"position":[[4932,8]]},"83":{"position":[[278,8],[343,8],[370,8],[1182,8],[2648,8],[2844,8],[3331,8]]},"85":{"position":[[477,8]]},"188":{"position":[[1362,8],[1845,10]]},"543":{"position":[[2510,8]]}}}],["extra",{"_index":463,"t":{"18":{"position":[[1604,5]]},"327":{"position":[[246,5]]},"604":{"position":[[478,5]]}}}],["extract",{"_index":1293,"t":{"118":{"position":[[1192,7],[1402,10],[1936,10],[4965,11]]},"147":{"position":[[79,7]]},"149":{"position":[[290,7],[736,10],[1651,7],[2636,9]]},"151":{"position":[[1208,8]]},"327":{"position":[[1109,7],[1309,7],[1412,10],[1692,8],[1868,7]]},"359":{"position":[[288,7]]},"361":{"position":[[1366,8]]},"376":{"position":[[52,7],[552,8]]},"378":{"position":[[572,7],[726,7],[807,7],[1112,7],[1361,7],[1498,9]]},"391":{"position":[[34,7]]},"472":{"position":[[679,9]]},"476":{"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]]},"488":{"position":[[647,10],[1052,9]]},"505":{"position":[[80,10]]},"559":{"position":[[751,9]]},"561":{"position":[[484,9]]}}}],["extran",{"_index":1606,"t":{"153":{"position":[[726,10]]}}}],["eyj0exaioijkv1qilcjhbgcioijfuzi1niisim",{"_index":1541,"t":{"149":{"position":[[2463,44]]}}}],["eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjkawqioijkawq6cgxjong0njvwzmtyew5zadz",{"_index":1247,"t":{"110":{"position":[[3000,82],[4441,82]]},"291":{"position":[[2295,82],[3736,82]]}}}],["f",{"_index":1343,"t":{"118":{"position":[[3814,1],[3930,1],[4248,1],[4369,1]]}}}],["f12",{"_index":1487,"t":{"147":{"position":[[224,3]]},"149":{"position":[[1109,4]]},"192":{"position":[[324,3]]}}}],["f243331e",{"_index":3252,"t":{"584":{"position":[[700,8]]}}}],["face",{"_index":907,"t":{"64":{"position":[[938,6],[1040,6]]},"83":{"position":[[797,6],[899,6]]},"335":{"position":[[547,6]]}}}],["factor",{"_index":413,"t":{"18":{"position":[[111,8]]}}}],["factori",{"_index":2646,"t":{"376":{"position":[[825,9],[944,9]]},"476":{"position":[[4578,8],[4640,7],[4911,9],[5527,7]]},"490":{"position":[[728,9],[911,9]]}}}],["fail",{"_index":484,"t":{"18":{"position":[[2683,6],[3406,9],[4604,6],[5162,9]]},"29":{"position":[[289,7]]},"64":{"position":[[3009,6]]},"83":{"position":[[2834,6]]},"365":{"position":[[415,5],[769,5],[1037,6],[1345,5]]},"425":{"position":[[696,6],[2631,6]]},"435":{"position":[[2515,6]]},"476":{"position":[[7091,6]]},"505":{"position":[[813,5]]},"625":{"position":[[833,5],[866,6]]}}}],["failur",{"_index":557,"t":{"27":{"position":[[179,7]]},"73":{"position":[[3159,7]]},"79":{"position":[[383,7]]},"425":{"position":[[1627,8],[2749,7],[2787,7],[2969,8]]},"625":{"position":[[982,7]]},"633":{"position":[[1099,7]]}}}],["failure/etc",{"_index":2731,"t":{"425":{"position":[[251,14]]}}}],["fake",{"_index":2039,"t":{"228":{"position":[[192,4],[600,4]]},"234":{"position":[[508,4],[581,4]]},"275":{"position":[[207,4]]}}}],["fall",{"_index":1392,"t":{"120":{"position":[[339,4]]},"309":{"position":[[181,5]]},"490":{"position":[[2033,7]]}}}],["fallback",{"_index":947,"t":{"66":{"position":[[609,8]]},"85":{"position":[[636,8]]},"315":{"position":[[417,8]]},"505":{"position":[[52,8]]},"507":{"position":[[856,8]]}}}],["fals",{"_index":165,"t":{"4":{"position":[[4537,6],[4558,6],[4599,6],[4652,6]]},"66":{"position":[[658,5]]},"85":{"position":[[685,5]]},"151":{"position":[[1588,5],[1742,5],[2302,6],[2825,5]]},"168":{"position":[[783,5]]},"182":{"position":[[1098,5]]},"200":{"position":[[1196,5]]},"281":{"position":[[1869,5],[3240,5]]},"315":{"position":[[1088,5]]},"363":{"position":[[211,6]]},"380":{"position":[[162,6]]},"391":{"position":[[402,5]]},"425":{"position":[[2149,6],[2251,6],[2617,5],[2910,5]]},"470":{"position":[[532,6]]},"476":{"position":[[456,6]]},"494":{"position":[[542,6],[560,6],[576,6],[599,6]]},"503":{"position":[[696,6],[714,6],[730,6],[753,6]]},"586":{"position":[[921,6]]},"592":{"position":[[536,6]]}}}],["famili",{"_index":1870,"t":{"196":{"position":[[78,6],[1131,6]]},"198":{"position":[[1804,7],[3244,7]]},"301":{"position":[[2400,8],[3828,8]]},"633":{"position":[[997,8],[2268,6]]}}}],["fan",{"_index":2907,"t":{"459":{"position":[[1335,3]]},"463":{"position":[[239,3]]}}}],["fanci",{"_index":3234,"t":{"581":{"position":[[27,6]]}}}],["faq",{"_index":2,"t":{"2":{"position":[[14,3]]},"232":{"position":[[818,3]]},"251":{"position":[[823,3]]},"343":{"position":[[364,3]]},"520":{"position":[[10,3],[110,3]]},"569":{"position":[[596,3]]},"649":{"position":[[59,3]]}}}],["fashion",{"_index":2532,"t":{"351":{"position":[[85,7]]}}}],["faster",{"_index":323,"t":{"12":{"position":[[86,7]]},"459":{"position":[[1680,6]]},"543":{"position":[[2444,6]]}}}],["favorit",{"_index":2908,"t":{"459":{"position":[[1400,8]]},"463":{"position":[[304,8]]}}}],["feasibl",{"_index":3443,"t":{"618":{"position":[[605,8]]}}}],["feat",{"_index":1298,"t":{"118":{"position":[[1448,4],[1701,6]]},"376":{"position":[[534,5],[622,6],[765,6]]},"378":{"position":[[832,5]]},"391":{"position":[[100,6]]},"476":{"position":[[3051,6],[4518,6],[4723,6],[5468,6],[5688,6]]},"490":{"position":[[668,6]]}}}],["featur",{"_index":779,"t":{"46":{"position":[[1668,9],[3064,9]]},"66":{"position":[[2173,9],[3579,9]]},"85":{"position":[[1932,9],[3296,9]]},"91":{"position":[[1837,9],[3296,9]]},"95":{"position":[[1610,9],[2977,9]]},"103":{"position":[[1939,9],[3358,9]]},"110":{"position":[[2864,9],[4293,9]]},"114":{"position":[[1752,9],[3195,9]]},"118":{"position":[[1518,10]]},"143":{"position":[[2223,9],[3590,9]]},"149":{"position":[[1789,8]]},"153":{"position":[[1995,9],[3680,9]]},"168":{"position":[[10,7]]},"186":{"position":[[1754,9],[3174,9]]},"188":{"position":[[4883,9],[6701,9]]},"198":{"position":[[1763,9],[3190,9]]},"202":{"position":[[1603,9],[2923,9]]},"208":{"position":[[1772,9],[3116,9]]},"214":{"position":[[1728,9],[3085,9]]},"218":{"position":[[2108,9],[3476,9]]},"220":{"position":[[2325,9],[3721,9]]},"234":{"position":[[1871,9],[3185,9]]},"236":{"position":[[174,7]]},"253":{"position":[[1940,9],[3262,9]]},"257":{"position":[[2261,9],[3680,9]]},"261":{"position":[[2075,9],[3518,9]]},"265":{"position":[[1908,9],[3275,9]]},"269":{"position":[[2149,9],[3608,9]]},"277":{"position":[[1967,9],[3328,9]]},"281":{"position":[[1688,9],[3043,9]]},"285":{"position":[[1733,9],[3098,9]]},"291":{"position":[[2159,9],[3588,9]]},"295":{"position":[[1730,9],[3062,9]]},"301":{"position":[[2201,9],[3615,9]]},"305":{"position":[[1754,9],[3216,9]]},"317":{"position":[[1737,9],[3191,9]]},"325":{"position":[[3394,9],[4819,9]]},"329":{"position":[[1607,9],[2913,9]]},"333":{"position":[[1614,9],[2934,9]]},"341":{"position":[[1697,9],[3050,9]]},"345":{"position":[[1849,9],[3317,9]]},"349":{"position":[[1711,9],[3074,9]]},"524":{"position":[[253,7]]}}}],["fedora",{"_index":3214,"t":{"571":{"position":[[99,7]]}}}],["feed",{"_index":1411,"t":{"125":{"position":[[77,7]]}}}],["feedback",{"_index":2853,"t":{"457":{"position":[[1339,8]]}}}],["fenc",{"_index":3048,"t":{"517":{"position":[[521,6]]}}}],["fetch",{"_index":646,"t":{"38":{"position":[[155,7]]},"64":{"position":[[4288,8]]},"118":{"position":[[5178,8]]},"120":{"position":[[1134,7]]},"425":{"position":[[357,8]]},"509":{"position":[[23,5]]}}}],["fetch/xhr",{"_index":1526,"t":{"149":{"position":[[1293,9]]}}}],["fetchabl",{"_index":367,"t":{"14":{"position":[[163,9]]}}}],["few",{"_index":412,"t":{"18":{"position":[[107,3],[491,3]]},"25":{"position":[[353,3]]},"118":{"position":[[3029,3]]},"343":{"position":[[4193,3]]},"451":{"position":[[40,3]]},"517":{"position":[[45,3]]},"543":{"position":[[2207,3]]}}}],["ffff:127.0.0.1",{"_index":2784,"t":{"435":{"position":[[493,16],[704,16]]}}}],["ffff:192.168.0.100",{"_index":2797,"t":{"435":{"position":[[1028,20]]}}}],["field",{"_index":240,"t":{"8":{"position":[[316,6],[376,5]]},"149":{"position":[[2757,5]]},"222":{"position":[[438,6]]},"327":{"position":[[1298,7],[1391,5],[2123,6],[2185,5]]},"351":{"position":[[519,5]]},"380":{"position":[[97,6]]},"399":{"position":[[412,5],[491,5]]},"449":{"position":[[57,5]]},"451":{"position":[[51,6],[181,6],[360,6]]},"470":{"position":[[330,6]]},"472":{"position":[[797,6],[814,5]]},"476":{"position":[[2353,6],[2421,6],[2743,6],[2867,6],[3376,7],[6183,7]]},"483":{"position":[[1050,5],[1134,6],[2444,5]]},"490":{"position":[[196,6],[298,6],[1169,5],[1258,5],[1534,6],[2006,5]]},"509":{"position":[[329,6]]},"559":{"position":[[730,6]]},"561":{"position":[[463,6]]}}}],["field/env",{"_index":2288,"t":{"303":{"position":[[5346,9]]}}}],["file",{"_index":15,"t":{"4":{"position":[[107,5],[139,4],[292,4],[297,4],[433,5],[477,5],[754,5],[1167,5],[1463,4],[1527,5],[1892,5],[2336,4],[2399,5],[3132,4],[3172,4],[3324,4],[3713,4],[5785,4],[6275,4],[6287,6]]},"8":{"position":[[11,4],[109,6],[225,5],[347,6],[497,4]]},"12":{"position":[[873,4],[941,4]]},"22":{"position":[[334,4]]},"27":{"position":[[234,4]]},"31":{"position":[[513,4]]},"42":{"position":[[883,4],[976,4]]},"46":{"position":[[4,4],[540,4],[761,4],[784,4],[1401,4],[1424,4],[1506,4],[1656,4],[2243,4],[2761,4],[2902,4],[3052,4]]},"62":{"position":[[474,4]]},"64":{"position":[[1400,4],[3957,4]]},"66":{"position":[[4,4],[1033,4],[1256,4],[1281,4],[1904,4],[1929,4],[2011,4],[2161,4],[2754,4],[3274,4],[3417,4],[3567,4]]},"71":{"position":[[327,4]]},"73":{"position":[[6168,4],[6379,5],[8048,4],[8259,5],[9855,4]]},"83":{"position":[[1259,4],[3749,4]]},"85":{"position":[[4,4],[391,4],[792,4],[1015,4],[1040,4],[1663,4],[1688,4],[1770,4],[1920,4],[2471,4],[2991,4],[3134,4],[3284,4]]},"91":{"position":[[4,4],[703,4],[925,4],[949,4],[1569,4],[1593,4],[1675,4],[1825,4],[2473,4],[2992,4],[3134,4],[3284,4]]},"95":{"position":[[4,4],[476,4],[698,4],[722,4],[1342,4],[1366,4],[1448,4],[1598,4],[2154,4],[2673,4],[2815,4],[2965,4]]},"103":{"position":[[4,4],[799,4],[1022,4],[1047,4],[1670,4],[1695,4],[1777,4],[1927,4],[2533,4],[3053,4],[3196,4],[3346,4]]},"110":{"position":[[1056,4],[1724,4],[1947,4],[1972,4],[2595,4],[2620,4],[2702,4],[2852,4],[3468,4],[3988,4],[4131,4],[4281,4]]},"114":{"position":[[4,4],[582,4],[810,4],[840,4],[1478,4],[1508,4],[1590,4],[1740,4],[2360,4],[2885,4],[3033,4],[3183,4]]},"143":{"position":[[580,4],[1089,4],[1311,4],[1335,4],[1955,4],[1979,4],[2061,4],[2211,4],[2767,4],[3286,4],[3428,4],[3578,4]]},"149":{"position":[[2391,4],[3312,4],[3735,4]]},"153":{"position":[[4,4],[837,4],[1063,4],[1091,4],[1723,4],[1751,4],[1833,4],[1983,4],[2849,4],[3372,4],[3518,4],[3668,4]]},"166":{"position":[[1419,4]]},"168":{"position":[[655,4]]},"174":{"position":[[459,4],[1528,4]]},"176":{"position":[[115,4],[537,4],[552,4]]},"178":{"position":[[592,4],[1694,4],[1797,5]]},"182":{"position":[[959,4]]},"186":{"position":[[4,4],[602,4],[827,4],[854,4],[1483,4],[1510,4],[1592,4],[1742,4],[2345,4],[2867,4],[3012,4],[3162,4]]},"188":{"position":[[1592,6],[2114,4],[3737,4],[3961,4],[3987,4],[4613,4],[4639,4],[4721,4],[4871,4],[5874,4],[6395,4],[6539,4],[6689,4]]},"194":{"position":[[182,5]]},"196":{"position":[[562,4]]},"198":{"position":[[4,4],[629,4],[851,4],[875,4],[1495,4],[1519,4],[1601,4],[1751,4],[2367,4],[2886,4],[3028,4],[3178,4]]},"200":{"position":[[1059,4]]},"202":{"position":[[4,4],[463,4],[686,4],[711,4],[1334,4],[1359,4],[1441,4],[1591,4],[2098,4],[2618,4],[2761,4],[2911,4]]},"206":{"position":[[47,4],[661,4]]},"208":{"position":[[4,4],[638,4],[860,4],[884,4],[1504,4],[1528,4],[1610,4],[1760,4],[2293,4],[2812,4],[2954,4],[3104,4]]},"212":{"position":[[45,4],[653,4]]},"214":{"position":[[4,4],[606,4],[826,4],[848,4],[1462,4],[1484,4],[1566,4],[1716,4],[2266,4],[2783,4],[2923,4],[3073,4]]},"216":{"position":[[784,4],[2113,4],[2710,4]]},"218":{"position":[[4,4],[155,4],[950,4],[1176,4],[1204,4],[1836,4],[1864,4],[1946,4],[2096,4],[2645,4],[3168,4],[3314,4],[3464,4]]},"220":{"position":[[359,4],[944,4],[1165,4],[1188,4],[1798,4],[2058,4],[2081,4],[2163,4],[2313,4],[2900,4],[3418,4],[3559,4],[3709,4]]},"234":{"position":[[4,4],[707,4],[934,4],[963,4],[1598,4],[1627,4],[1709,4],[1859,4],[2352,4],[2876,4],[3023,4],[3173,4]]},"253":{"position":[[4,4],[782,4],[1008,4],[1036,4],[1668,4],[1696,4],[1778,4],[1928,4],[2431,4],[2954,4],[3100,4],[3250,4]]},"257":{"position":[[4,4],[862,4],[1085,4],[1110,4],[1728,4],[1992,4],[2017,4],[2099,4],[2249,4],[2855,4],[3375,4],[3518,4],[3668,4]]},"261":{"position":[[4,4],[631,4],[859,4],[889,4],[1527,4],[1801,4],[1831,4],[1913,4],[2063,4],[2683,4],[3208,4],[3356,4],[3506,4]]},"265":{"position":[[4,4],[518,4],[740,4],[764,4],[1378,4],[1640,4],[1664,4],[1746,4],[1896,4],[2452,4],[2971,4],[3113,4],[3263,4]]},"269":{"position":[[4,4],[759,4],[981,4],[1005,4],[1619,4],[1881,4],[1905,4],[1987,4],[2137,4],[2785,4],[3304,4],[3446,4],[3596,4]]},"271":{"position":[[402,4],[849,4],[962,4]]},"277":{"position":[[4,4],[833,4],[1055,4],[1079,4],[1699,4],[1723,4],[1805,4],[1955,4],[2505,4],[3024,4],[3166,4],[3316,4]]},"281":{"position":[[4,4],[572,4],[791,4],[812,4],[1423,4],[1444,4],[1526,4],[1676,4],[2226,4],[2742,4],[2881,4],[3031,4]]},"285":{"position":[[4,4],[581,4],[806,4],[833,4],[1462,4],[1489,4],[1571,4],[1721,4],[2269,4],[2791,4],[2936,4],[3086,4]]},"291":{"position":[[161,4],[760,4],[983,4],[1008,4],[1626,4],[1890,4],[1915,4],[1997,4],[2147,4],[2763,4],[3283,4],[3426,4],[3576,4]]},"295":{"position":[[4,4],[602,4],[823,4],[846,4],[1463,4],[1486,4],[1568,4],[1718,4],[2241,4],[2759,4],[2900,4],[3050,4]]},"297":{"position":[[1248,4],[1359,5]]},"301":{"position":[[129,4],[1073,4],[1294,4],[1317,4],[1934,4],[1957,4],[2039,4],[2189,4],[2794,4],[3312,4],[3453,4],[3603,4]]},"305":{"position":[[4,4],[614,4],[837,4],[862,4],[1485,4],[1510,4],[1592,4],[1742,4],[2391,4],[2911,4],[3054,4],[3204,4]]},"309":{"position":[[213,4]]},"311":{"position":[[427,4],[432,4],[484,4],[966,4]]},"313":{"position":[[677,4]]},"317":{"position":[[4,4],[591,4],[815,4],[841,4],[1467,4],[1493,4],[1575,4],[1725,4],[2364,4],[2885,4],[3029,4],[3179,4]]},"325":{"position":[[1453,4],[2004,4],[2226,4],[2250,4],[2864,4],[3126,4],[3150,4],[3232,4],[3382,4],[3996,4],[4515,4],[4657,4],[4807,4]]},"327":{"position":[[883,4],[1009,4],[1562,4]]},"329":{"position":[[4,4],[491,4],[710,4],[731,4],[1342,4],[1363,4],[1445,4],[1595,4],[2096,4],[2612,4],[2751,4],[2901,4]]},"333":{"position":[[4,4],[462,4],[687,4],[714,4],[1343,4],[1370,4],[1452,4],[1602,4],[2105,4],[2627,4],[2772,4],[2922,4]]},"337":{"position":[[134,4]]},"341":{"position":[[4,4],[527,4],[755,4],[785,4],[1423,4],[1453,4],[1535,4],[1685,4],[2215,4],[2740,4],[2888,4],[3038,4]]},"345":{"position":[[4,4],[709,4],[932,4],[957,4],[1580,4],[1605,4],[1687,4],[1837,4],[2492,4],[3012,4],[3155,4],[3305,4]]},"349":{"position":[[4,4],[565,4],[789,4],[815,4],[1441,4],[1467,4],[1549,4],[1699,4],[2247,4],[2768,4],[2912,4],[3062,4]]},"361":{"position":[[63,4],[762,4],[1473,4],[1661,4],[2277,4]]},"382":{"position":[[252,4]]},"387":{"position":[[318,4]]},"389":{"position":[[217,4]]},"391":{"position":[[250,4]]},"395":{"position":[[584,4]]},"425":{"position":[[394,6],[894,6],[3247,4]]},"444":{"position":[[95,4],[318,4]]},"457":{"position":[[2200,4],[2306,5],[2508,4]]},"496":{"position":[[552,4]]},"499":{"position":[[188,4]]},"501":{"position":[[501,4]]},"503":{"position":[[523,4]]},"505":{"position":[[598,4]]},"509":{"position":[[270,4],[899,4]]},"517":{"position":[[402,4]]},"539":{"position":[[39,4]]},"543":{"position":[[179,6],[663,5],[714,5],[1906,4],[2159,4]]},"549":{"position":[[553,4],[761,5],[849,5],[1767,4]]},"553":{"position":[[276,4]]},"559":{"position":[[1600,4]]},"563":{"position":[[738,4]]},"567":{"position":[[112,4]]},"569":{"position":[[259,5]]},"573":{"position":[[21,4],[198,4]]},"575":{"position":[[9,4]]},"584":{"position":[[142,4]]},"599":{"position":[[1459,6]]},"604":{"position":[[248,4],[385,5]]},"623":{"position":[[4,4]]},"625":{"position":[[536,4]]},"627":{"position":[[1138,4],[1385,4]]},"647":{"position":[[173,4]]}}}],["file'",{"_index":138,"t":{"4":{"position":[[3424,6]]}}}],["file/aio",{"_index":690,"t":{"42":{"position":[[449,8]]},"60":{"position":[[868,9],[1964,9]]},"101":{"position":[[155,8]]},"110":{"position":[[809,10]]},"151":{"position":[[2268,8]]},"164":{"position":[[88,8],[662,8]]},"184":{"position":[[97,8]]},"220":{"position":[[287,8]]},"255":{"position":[[347,8]]},"263":{"position":[[171,8]]},"267":{"position":[[461,8]]},"291":{"position":[[104,8]]},"315":{"position":[[1097,8]]},"323":{"position":[[105,8]]},"501":{"position":[[48,8]]},"625":{"position":[[1232,8]]}}}],["file/env",{"_index":153,"t":{"4":{"position":[[4045,8]]}}}],["filenam",{"_index":2371,"t":{"327":{"position":[[984,8],[1167,8],[1512,8],[1723,9],[1888,8]]}}}],["filenamepattern",{"_index":2378,"t":{"327":{"position":[[1667,19]]}}}],["filesystem",{"_index":1739,"t":{"178":{"position":[[57,10]]}}}],["fill",{"_index":2456,"t":{"343":{"position":[[1983,4]]},"459":{"position":[[161,4]]},"488":{"position":[[208,7]]},"559":{"position":[[84,4]]},"569":{"position":[[531,4]]}}}],["filter",{"_index":1515,"t":{"149":{"position":[[935,6],[1183,6],[1303,6],[1975,6]]},"162":{"position":[[120,8]]},"192":{"position":[[456,7]]},"325":{"position":[[59,6],[313,6]]},"481":{"position":[[178,6],[1196,6],[1748,6],[2010,9]]},"483":{"position":[[24,9],[254,10],[270,7],[306,7],[555,8],[587,8]]},"492":{"position":[[20,7],[132,6],[354,9],[512,9]]},"513":{"position":[[146,8]]},"625":{"position":[[771,9]]}}}],["final",{"_index":1145,"t":{"93":{"position":[[494,8]]},"118":{"position":[[3502,8]]},"206":{"position":[[681,5]]},"212":{"position":[[673,5]]},"271":{"position":[[982,5]]},"303":{"position":[[3437,5]]},"369":{"position":[[164,5],[305,5]]},"425":{"position":[[915,8]]},"472":{"position":[[984,8]]},"481":{"position":[[194,5]]},"483":{"position":[[1222,5],[2350,5],[2947,5],[3007,5]]},"565":{"position":[[2255,8]]},"584":{"position":[[1624,8]]},"592":{"position":[[2063,8]]},"594":{"position":[[2821,8]]}}}],["find",{"_index":101,"t":{"4":{"position":[[2152,4],[3109,4],[6087,4]]},"57":{"position":[[725,7]]},"73":{"position":[[3761,4],[5277,7],[8940,8]]},"112":{"position":[[350,4]]},"118":{"position":[[4115,5]]},"136":{"position":[[1018,5]]},"147":{"position":[[393,4]]},"149":{"position":[[897,7],[1534,4]]},"164":{"position":[[538,4]]},"171":{"position":[[17,4]]},"184":{"position":[[228,4],[616,4]]},"192":{"position":[[700,4]]},"259":{"position":[[450,4]]},"307":{"position":[[0,4]]},"309":{"position":[[254,4]]},"327":{"position":[[1966,4]]},"353":{"position":[[184,5]]},"365":{"position":[[1354,4]]},"384":{"position":[[394,4]]},"439":{"position":[[267,4]]},"444":{"position":[[400,4]]},"459":{"position":[[1016,4]]},"461":{"position":[[413,4]]},"472":{"position":[[1285,4]]},"476":{"position":[[5215,5],[5549,5]]},"490":{"position":[[358,4]]},"505":{"position":[[822,4]]},"513":{"position":[[95,4]]},"557":{"position":[[2566,4]]},"625":{"position":[[346,4]]},"647":{"position":[[386,4]]}}}],["fine",{"_index":503,"t":{"18":{"position":[[3840,4]]},"120":{"position":[[542,4]]},"423":{"position":[[400,4]]}}}],["finish",{"_index":771,"t":{"46":{"position":[[1255,6],[2615,6]]},"66":{"position":[[1758,6],[3128,6]]},"85":{"position":[[1517,6],[2845,6]]},"91":{"position":[[1423,6],[2846,6]]},"95":{"position":[[1196,6],[2527,6]]},"103":{"position":[[1524,6],[2907,6]]},"110":{"position":[[2449,6],[3842,6]]},"114":{"position":[[1332,6],[2739,6]]},"143":{"position":[[1809,6],[3140,6]]},"151":{"position":[[247,8]]},"153":{"position":[[1577,6],[3226,6]]},"186":{"position":[[1337,6],[2721,6]]},"188":{"position":[[4467,6],[6249,6]]},"198":{"position":[[1349,6],[2740,6]]},"202":{"position":[[1188,6],[2472,6]]},"208":{"position":[[1358,6],[2666,6]]},"214":{"position":[[1316,6],[2637,6]]},"218":{"position":[[1690,6],[3022,6]]},"220":{"position":[[1659,6],[3272,6]]},"234":{"position":[[1452,6],[2730,6]]},"253":{"position":[[1522,6],[2808,6]]},"257":{"position":[[1587,6],[3229,6]]},"261":{"position":[[1381,6],[3062,6]]},"265":{"position":[[1238,6],[2825,6]]},"269":{"position":[[1479,6],[3158,6]]},"277":{"position":[[1553,6],[2878,6]]},"281":{"position":[[1277,6],[2596,6]]},"285":{"position":[[1316,6],[2645,6]]},"291":{"position":[[1485,6],[3137,6]]},"295":{"position":[[1317,6],[2613,6]]},"301":{"position":[[1788,6],[3166,6]]},"303":{"position":[[3627,6]]},"305":{"position":[[1339,6],[2765,6]]},"317":{"position":[[1321,6],[2739,6]]},"325":{"position":[[2724,6],[4369,6]]},"329":{"position":[[1196,6],[2466,6]]},"333":{"position":[[1197,6],[2481,6]]},"341":{"position":[[1277,6],[2594,6]]},"343":{"position":[[4554,8]]},"345":{"position":[[1434,6],[2866,6]]},"349":{"position":[[1295,6],[2622,6]]},"365":{"position":[[304,8]]},"457":{"position":[[2925,6]]}}}],["firefox",{"_index":1520,"t":{"149":{"position":[[1046,7]]},"188":{"position":[[5197,9],[7026,9]]},"192":{"position":[[295,7]]},"335":{"position":[[330,7],[422,7]]},"341":{"position":[[1768,8],[3128,8]]}}}],["firefox/135.0",{"_index":1897,"t":{"198":{"position":[[529,13]]}}}],["firefox/139.0",{"_index":2789,"t":{"435":{"position":[[588,14],[799,14]]}}}],["firewal",{"_index":1058,"t":{"73":{"position":[[5753,8],[7139,8],[9398,8]]},"435":{"position":[[2152,8],[2233,8]]}}}],["first",{"_index":394,"t":{"16":{"position":[[72,5]]},"60":{"position":[[1439,7]]},"64":{"position":[[3172,5]]},"83":{"position":[[2997,5]]},"134":{"position":[[286,5]]},"297":{"position":[[284,5],[1787,5]]},"309":{"position":[[126,5]]},"327":{"position":[[1487,5]]},"337":{"position":[[577,5]]},"343":{"position":[[1682,5],[1704,5],[2432,5]]},"353":{"position":[[0,6]]},"361":{"position":[[970,5]]},"412":{"position":[[139,5]]},"425":{"position":[[151,5]]},"435":{"position":[[862,5],[1437,6]]},"441":{"position":[[192,6]]},"449":{"position":[[257,5]]},"476":{"position":[[5158,5],[5560,5]]},"483":{"position":[[1688,5]]},"507":{"position":[[1122,5]]},"535":{"position":[[161,6]]},"586":{"position":[[0,5]]},"592":{"position":[[88,5]]},"604":{"position":[[72,5]]},"647":{"position":[[212,5]]}}}],["firstgotifyserv",{"_index":199,"t":{"4":{"position":[[5337,20]]},"27":{"position":[[426,20]]}}}],["fit",{"_index":2029,"t":{"224":{"position":[[2197,4]]},"238":{"position":[[2178,4]]}}}],["fix",{"_index":1112,"t":{"87":{"position":[[1071,3]]},"153":{"position":[[609,5]]},"178":{"position":[[155,3],[470,5]]},"309":{"position":[[277,5],[293,3]]},"351":{"position":[[816,3]]},"435":{"position":[[1291,3]]},"444":{"position":[[435,3]]},"453":{"position":[[316,3],[433,3]]},"520":{"position":[[128,5]]},"610":{"position":[[233,3]]}}}],["flatpak",{"_index":3060,"t":{"528":{"position":[[8,7],[24,7],[40,7]]},"533":{"position":[[97,7],[215,7],[424,7]]},"535":{"position":[[87,7],[117,7],[297,7],[475,7],[623,8],[692,7],[736,7],[781,7]]},"537":{"position":[[98,7]]},"551":{"position":[[90,7],[142,7]]}}}],["flatpak/build",{"_index":3091,"t":{"535":{"position":[[936,13]]}}}],["flatpak/flathub",{"_index":3165,"t":{"551":{"position":[[12,15]]}}}],["flatpak/nodej",{"_index":1982,"t":{"216":{"position":[[1431,14]]}}}],["flatpak/repo",{"_index":3088,"t":{"535":{"position":[[835,12]]}}}],["flatpak/setup.sh",{"_index":3068,"t":{"533":{"position":[[181,17]]}}}],["flatpak/st",{"_index":3090,"t":{"535":{"position":[[891,13]]}}}],["flexibl",{"_index":1259,"t":{"116":{"position":[[18,11]]}}}],["flight",{"_index":496,"t":{"18":{"position":[[3641,7]]}}}],["flow",{"_index":1130,"t":{"91":{"position":[[623,4]]},"103":{"position":[[611,4]]},"120":{"position":[[173,4]]},"228":{"position":[[304,5],[366,5]]},"257":{"position":[[667,4]]},"269":{"position":[[679,4]]},"303":{"position":[[1528,5],[1544,4],[1608,5]]},"343":{"position":[[4334,5],[4546,4],[5343,4]]},"365":{"position":[[624,4],[786,4],[882,4],[1163,4]]},"476":{"position":[[7114,4]]},"505":{"position":[[117,4]]}}}],["flush",{"_index":2823,"t":{"439":{"position":[[1083,8]]}}}],["fm",{"_index":1155,"t":{"97":{"position":[[194,2]]}}}],["fm.teal",{"_index":1447,"t":{"138":{"position":[[1236,10]]}}}],["fm.teal.alpha.feed.play",{"_index":2354,"t":{"325":{"position":[[690,23]]}}}],["folder",{"_index":2271,"t":{"303":{"position":[[3423,6]]},"309":{"position":[[227,6]]},"343":{"position":[[4732,7]]},"457":{"position":[[2526,6]]},"555":{"position":[[13,6]]}}}],["follow",{"_index":840,"t":{"54":{"position":[[1466,10]]},"57":{"position":[[793,6]]},"73":{"position":[[3652,6],[3688,6],[5055,6]]},"149":{"position":[[990,6]]},"168":{"position":[[614,9]]},"182":{"position":[[918,9]]},"200":{"position":[[1018,9]]},"232":{"position":[[92,6]]},"240":{"position":[[44,9]]},"251":{"position":[[92,6]]},"279":{"position":[[90,9]]},"289":{"position":[[0,6]]},"293":{"position":[[1683,9]]},"297":{"position":[[1177,9]]},"303":{"position":[[967,6],[1502,9],[2392,9]]},"321":{"position":[[0,6]]},"343":{"position":[[1297,6],[4318,6]]},"441":{"position":[[1151,6]]},"457":{"position":[[1375,9]]},"535":{"position":[[27,6]]},"557":{"position":[[136,6],[2417,6],[3437,9]]},"559":{"position":[[911,6]]},"563":{"position":[[49,6]]},"565":{"position":[[1414,9]]}}}],["foo",{"_index":132,"t":{"4":{"position":[[3043,6]]},"136":{"position":[[629,4],[760,3],[836,4],[1035,3]]},"376":{"position":[[311,3]]},"378":{"position":[[1445,5],[1564,5],[1625,5]]},"517":{"position":[[731,6]]}}}],["foo'",{"_index":129,"t":{"4":{"position":[[2955,6]]}}}],["foo.com",{"_index":2681,"t":{"397":{"position":[[817,10]]}}}],["foobar",{"_index":2668,"t":{"391":{"position":[[107,7]]}}}],["foojf",{"_index":130,"t":{"4":{"position":[[2980,8]]}}}],["footerm",{"_index":2683,"t":{"399":{"position":[[276,9],[338,10]]}}}],["footgun",{"_index":1262,"t":{"116":{"position":[[126,7]]}}}],["forc",{"_index":839,"t":{"54":{"position":[[1430,5]]},"216":{"position":[[2475,7],[2509,6]]},"453":{"position":[[401,5]]},"476":{"position":[[465,5]]},"535":{"position":[[988,5]]}}}],["forcemediarecognitionon",{"_index":1993,"t":{"216":{"position":[[2677,25],[2988,26]]}}}],["forcesearch",{"_index":2938,"t":{"476":{"position":[[435,11],[750,14]]}}}],["forev",{"_index":507,"t":{"18":{"position":[[3929,8]]}}}],["fork",{"_index":375,"t":{"14":{"position":[[392,4]]}}}],["form",{"_index":386,"t":{"14":{"position":[[1002,5]]},"87":{"position":[[1349,4]]},"184":{"position":[[1087,4]]},"206":{"position":[[110,6]]},"212":{"position":[[108,6]]},"271":{"position":[[465,6]]}}}],["format",{"_index":1902,"t":{"200":{"position":[[99,6],[474,6]]},"232":{"position":[[159,7],[214,6]]},"251":{"position":[[159,7],[214,6]]},"427":{"position":[[165,6]]},"492":{"position":[[91,8]]},"507":{"position":[[73,11]]},"618":{"position":[[586,10]]}}}],["formatplayobj(obj",{"_index":3320,"t":{"590":{"position":[[607,18]]}}}],["formatplayobjectopt",{"_index":3316,"t":{"590":{"position":[[215,24],[640,23]]}}}],["forum",{"_index":1104,"t":{"87":{"position":[[447,7]]}}}],["forward",{"_index":1232,"t":{"110":{"position":[[599,8]]},"136":{"position":[[919,8],[1297,8]]},"166":{"position":[[149,9],[548,8]]},"412":{"position":[[256,7],[532,7]]},"435":{"position":[[2170,11],[2338,10]]},"633":{"position":[[2661,7]]},"635":{"position":[[261,7]]}}}],["found",{"_index":159,"t":{"4":{"position":[[4404,5]]},"8":{"position":[[1445,6]]},"20":{"position":[[80,5]]},"73":{"position":[[7783,5]]},"81":{"position":[[125,5]]},"149":{"position":[[3374,6]]},"168":{"position":[[473,5]]},"171":{"position":[[439,5]]},"174":{"position":[[654,5]]},"178":{"position":[[787,5]]},"182":{"position":[[800,5]]},"184":{"position":[[489,5]]},"188":{"position":[[780,5]]},"200":{"position":[[900,5],[1711,5],[2107,5]]},"204":{"position":[[112,5]]},"206":{"position":[[446,5]]},"212":{"position":[[440,5]]},"271":{"position":[[815,5]]},"283":{"position":[[157,5]]},"299":{"position":[[51,5]]},"307":{"position":[[1421,5]]},"351":{"position":[[767,5]]},"361":{"position":[[976,5],[1399,5]]},"378":{"position":[[849,5]]},"412":{"position":[[152,6]]},"468":{"position":[[22,5]]},"474":{"position":[[20,5]]},"476":{"position":[[4768,5],[5164,5],[6217,6]]},"483":{"position":[[1631,5]]},"543":{"position":[[1620,5]]},"545":{"position":[[627,5]]},"555":{"position":[[291,5]]},"559":{"position":[[818,5]]},"561":{"position":[[551,5]]},"588":{"position":[[94,6],[181,6]]},"616":{"position":[[46,5]]},"647":{"position":[[90,5]]}}}],["foxx",{"_index":117,"t":{"4":{"position":[[2598,5],[2801,5],[5204,5],[5913,5]]},"91":{"position":[[1878,5],[3350,5]]},"103":{"position":[[1981,5],[3412,5]]},"114":{"position":[[1799,5],[3249,5]]},"143":{"position":[[2286,5],[3666,5]]},"151":{"position":[[2861,5]]},"174":{"position":[[1597,5],[1961,5],[2061,9],[2362,5],[2628,5],[2976,5],[3076,9],[3375,5]]},"176":{"position":[[268,7],[1002,5],[1566,5],[2230,5],[2358,6],[2839,5]]},"178":{"position":[[2371,5],[3575,5]]},"257":{"position":[[2303,5],[3734,5]]},"261":{"position":[[2122,5],[3572,5]]},"269":{"position":[[2190,5],[3662,5]]},"305":{"position":[[1815,5],[3289,5]]},"325":{"position":[[3457,5],[4895,5]]},"345":{"position":[[1910,5],[3390,5]]}}}],["foxxjf",{"_index":121,"t":{"4":{"position":[[2622,9],[2825,9],[5956,9]]}}}],["foxxkoi",{"_index":1720,"t":{"174":{"position":[[2343,10],[3356,10]]},"176":{"position":[[1026,12],[1547,10],[2256,9],[2820,10]]}}}],["foxxmd",{"_index":125,"t":{"4":{"position":[[2682,9],[2885,9],[6016,9]]},"110":{"position":[[2931,7],[4372,7]]},"114":{"position":[[1952,9],[3402,9]]},"188":{"position":[[5045,9],[5117,9],[6874,9],[6946,9]]},"196":{"position":[[423,6]]},"261":{"position":[[2275,9],[3725,9]]},"291":{"position":[[2226,7],[3667,7]]},"303":{"position":[[4654,7]]},"307":{"position":[[1112,7],[1134,10],[1287,8]]},"347":{"position":[[1447,8]]}}}],["foxxmd,plex_local_user,someus",{"_index":2300,"t":{"307":{"position":[[1197,31]]}}}],["foxxmd/multi",{"_index":57,"t":{"4":{"position":[[828,12]]},"73":{"position":[[1859,12]]},"77":{"position":[[458,12]]},"174":{"position":[[532,12]]},"178":{"position":[[665,12]]},"216":{"position":[[1408,12]]},"347":{"position":[[276,12]]},"384":{"position":[[640,12]]},"472":{"position":[[1537,12]]},"543":{"position":[[2276,12],[2582,12]]},"545":{"position":[[505,12]]},"555":{"position":[[169,12]]}}}],["foxxplex",{"_index":1711,"t":{"174":{"position":[[1941,11],[2956,11]]},"176":{"position":[[982,11],[2210,11]]}}}],["foxxspotifi",{"_index":1706,"t":{"174":{"position":[[1574,14],[2605,14]]},"178":{"position":[[2348,14],[3552,14]]}}}],["fqn",{"_index":2407,"t":{"335":{"position":[[345,4]]}}}],["frank",{"_index":2655,"t":{"378":{"position":[[1481,6],[1580,5],[1673,5]]}}}],["fred",{"_index":1724,"t":{"176":{"position":[[276,5],[334,4],[448,4],[616,6],[712,7],[1355,6],[1828,6],[1926,7],[2636,6]]}}}],["fredapikey",{"_index":1737,"t":{"176":{"position":[[1416,13],[2697,13]]}}}],["fredjf",{"_index":1728,"t":{"176":{"position":[[598,9],[1810,9]]}}}],["fredlfm",{"_index":1729,"t":{"176":{"position":[[645,12],[1336,10],[1859,9],[2617,10]]}}}],["fredsecret",{"_index":1738,"t":{"176":{"position":[[1440,13],[2721,13]]}}}],["free",{"_index":890,"t":{"62":{"position":[[128,4]]},"71":{"position":[[83,4]]},"149":{"position":[[230,5],[647,6],[3117,6]]},"472":{"position":[[754,4]]},"476":{"position":[[5913,4],[6046,4],[6366,4],[6928,4]]}}}],["freetext",{"_index":2923,"t":{"470":{"position":[[1188,12]]},"472":{"position":[[771,10]]},"476":{"position":[[5923,10],[6986,13]]},"507":{"position":[[934,11]]}}}],["fresh",{"_index":1498,"t":{"147":{"position":[[660,5]]}}}],["friend",{"_index":2250,"t":{"303":{"position":[[921,9],[1287,7]]},"633":{"position":[[985,7],[2256,7]]}}}],["friendli",{"_index":3493,"t":{"637":{"position":[[277,8]]},"639":{"position":[[193,8]]}}}],["frontend",{"_index":1788,"t":{"184":{"position":[[862,11]]},"188":{"position":[[3517,8]]},"415":{"position":[[80,9],[245,9],[259,8]]}}}],["frontendurloverrid",{"_index":1817,"t":{"188":{"position":[[1599,19],[5398,22],[7227,22]]}}}],["frédéric",{"_index":1340,"t":{"118":{"position":[[3779,8],[3875,8],[4213,8],[4314,8]]}}}],["ft",{"_index":1297,"t":{"118":{"position":[[1444,3]]},"136":{"position":[[780,3],[1055,3]]},"376":{"position":[[529,4]]},"378":{"position":[[828,3],[1476,4]]}}}],["fulfil",{"_index":1673,"t":{"171":{"position":[[129,7]]}}}],["full",{"_index":884,"t":{"60":{"position":[[1737,4]]},"110":{"position":[[52,4]]},"143":{"position":[[126,4]]},"216":{"position":[[527,4]]},"384":{"position":[[515,4]]},"425":{"position":[[1087,4]]},"472":{"position":[[1412,4]]},"565":{"position":[[836,4]]},"633":{"position":[[1359,4]]}}}],["fulli",{"_index":1242,"t":{"110":{"position":[[1593,5]]},"224":{"position":[[3284,6]]},"238":{"position":[[3238,6]]},"291":{"position":[[629,5]]}}}],["function",{"_index":683,"t":{"42":{"position":[[131,14]]},"48":{"position":[[32,13]]},"54":{"position":[[32,13]]},"57":{"position":[[137,13]]},"62":{"position":[[191,13]]},"68":{"position":[[32,13]]},"110":{"position":[[756,14],[973,13]]},"145":{"position":[[240,9]]},"151":{"position":[[1046,12],[2375,13]]},"174":{"position":[[255,8]]},"178":{"position":[[428,8]]},"190":{"position":[[176,14]]},"232":{"position":[[677,14]]},"251":{"position":[[682,14]]},"397":{"position":[[940,8]]},"425":{"position":[[411,8]]},"509":{"position":[[243,14]]},"524":{"position":[[231,13]]},"557":{"position":[[1509,13]]},"584":{"position":[[1990,8]]},"590":{"position":[[28,8]]},"594":{"position":[[700,9]]},"599":{"position":[[1736,8],[1987,13],[2054,9],[2156,13]]},"612":{"position":[[67,10],[113,11]]},"618":{"position":[[408,13]]}}}],["further",{"_index":2850,"t":{"457":{"position":[[1127,8]]}}}],["futur",{"_index":1109,"t":{"87":{"position":[[867,6]]},"110":{"position":[[1017,6]]},"343":{"position":[[1290,6]]}}}],["fuzz",{"_index":1383,"t":{"118":{"position":[[4981,7]]}}}],["fuzzi",{"_index":1331,"t":{"118":{"position":[[2990,5]]}}}],["fuzzydiscoveryignor",{"_index":1861,"t":{"194":{"position":[[222,23],[373,23]]}}}],["g",{"_index":3112,"t":{"543":{"position":[[2108,1]]}}}],["gambino",{"_index":1312,"t":{"118":{"position":[[1685,7],[1756,8]]}}}],["garbag",{"_index":2536,"t":{"351":{"position":[[410,7]]}}}],["garden",{"_index":1193,"t":{"105":{"position":[[699,7]]},"138":{"position":[[697,7]]}}}],["gateway",{"_index":816,"t":{"54":{"position":[[403,7]]}}}],["gateway/api",{"_index":809,"t":{"52":{"position":[[44,12]]}}}],["gather",{"_index":523,"t":{"20":{"position":[[337,9]]}}}],["gaug",{"_index":855,"t":{"57":{"position":[[537,5]]}}}],["gaurante",{"_index":1386,"t":{"118":{"position":[[5073,10],[5226,9]]},"134":{"position":[[432,9]]},"311":{"position":[[180,9]]},"343":{"position":[[1599,9]]}}}],["gave",{"_index":1651,"t":{"164":{"position":[[638,4]]}}}],["gb",{"_index":2984,"t":{"481":{"position":[[1017,3]]}}}],["gecko/20100101",{"_index":1896,"t":{"198":{"position":[[514,14]]},"435":{"position":[[573,14],[784,14]]}}}],["gener",{"_index":22,"t":{"4":{"position":[[249,9]]},"10":{"position":[[32,8]]},"18":{"position":[[1783,8],[1950,9]]},"31":{"position":[[363,7]]},"91":{"position":[[343,9],[411,9]]},"93":{"position":[[474,9]]},"110":{"position":[[1396,9],[1490,9]]},"138":{"position":[[2040,9]]},"149":{"position":[[570,8],[2808,9],[2941,8],[3140,8]]},"160":{"position":[[488,9]]},"164":{"position":[[483,9]]},"188":{"position":[[1880,8]]},"216":{"position":[[2022,9]]},"220":{"position":[[226,7]]},"224":{"position":[[1230,9],[1997,9]]},"238":{"position":[[1207,9],[1980,9]]},"263":{"position":[[110,7]]},"269":{"position":[[378,9],[453,9]]},"291":{"position":[[43,7],[536,9]]},"323":{"position":[[43,7]]},"339":{"position":[[243,7]]},"343":{"position":[[2412,8]]},"347":{"position":[[1126,7],[1494,7]]},"363":{"position":[[815,12]]},"425":{"position":[[3061,8]]},"439":{"position":[[543,9],[857,9]]},"472":{"position":[[4,7]]},"476":{"position":[[6611,10]]},"488":{"position":[[0,10]]},"490":{"position":[[937,8]]},"492":{"position":[[411,10]]},"524":{"position":[[91,9]]},"528":{"position":[[53,10]]},"533":{"position":[[53,10],[341,9]]},"535":{"position":[[56,8],[130,9],[143,8],[310,9],[347,9],[406,9],[437,8],[488,9],[533,9],[592,9]]},"565":{"position":[[2235,9]]},"581":{"position":[[355,9]]},"584":{"position":[[597,9]]},"631":{"position":[[94,9]]}}}],["get",{"_index":1674,"t":{"171":{"position":[[181,7]]},"351":{"position":[[839,4]]},"441":{"position":[[1023,7]]},"597":{"position":[[1102,7]]}}}],["get(`${this.baseurl}/now",{"_index":3373,"t":{"594":{"position":[[1959,25]]}}}],["get(`${this.baseurl}/rec",{"_index":3354,"t":{"592":{"position":[[2389,30]]},"597":{"position":[[775,30]]}}}],["getbackloggedplay",{"_index":3384,"t":{"597":{"position":[[198,18],[654,18]]}}}],["getnowplay",{"_index":2321,"t":{"313":{"position":[[94,13]]}}}],["getrecentlyplay",{"_index":3361,"t":{"594":{"position":[[710,18],[1045,18]]},"599":{"position":[[1690,17],[2196,18]]}}}],["getrecentlyplayed(opt",{"_index":3369,"t":{"594":{"position":[[1768,26]]}}}],["ghcr.io/druidblack/yandex",{"_index":2504,"t":{"347":{"position":[[596,25]]}}}],["ghcr.io/foxxmd/multi",{"_index":3101,"t":{"541":{"position":[[195,20]]}}}],["gid",{"_index":3109,"t":{"543":{"position":[[2023,3],[2120,3]]}}}],["git",{"_index":236,"t":{"8":{"position":[[264,4]]},"417":{"position":[[255,3]]},"549":{"position":[[49,3],[102,3]]},"608":{"position":[[352,3],[400,3]]},"612":{"position":[[219,3],[231,3]]},"616":{"position":[[464,3]]}}}],["github",{"_index":632,"t":{"31":{"position":[[805,6]]},"93":{"position":[[176,6]]},"517":{"position":[[630,7]]},"522":{"position":[[7,6]]},"541":{"position":[[107,6]]},"565":{"position":[[1934,6]]},"602":{"position":[[181,6]]},"606":{"position":[[79,6]]},"610":{"position":[[324,6]]},"618":{"position":[[40,6],[617,6]]}}}],["give",{"_index":675,"t":{"40":{"position":[[168,5]]},"46":{"position":[[900,5],[2418,5]]},"57":{"position":[[891,4]]},"62":{"position":[[313,4]]},"66":{"position":[[1397,5],[2931,5]]},"71":{"position":[[166,4]]},"85":{"position":[[1156,5],[2648,5]]},"91":{"position":[[1065,5],[2649,5]]},"95":{"position":[[838,5],[2330,5]]},"103":{"position":[[1163,5],[2710,5]]},"110":{"position":[[2088,5],[3645,5]]},"114":{"position":[[956,5],[2542,5]]},"118":{"position":[[1072,5],[4762,5]]},"143":{"position":[[1451,5],[2943,5]]},"153":{"position":[[1207,5],[3029,5]]},"186":{"position":[[970,5],[2524,5]]},"188":{"position":[[4103,5],[6052,5]]},"198":{"position":[[991,5],[2543,5]]},"202":{"position":[[827,5],[2275,5]]},"208":{"position":[[1000,5],[2469,5]]},"214":{"position":[[964,5],[2440,5]]},"218":{"position":[[1320,5],[2825,5]]},"220":{"position":[[1304,5],[3075,5]]},"234":{"position":[[1079,5],[2533,5]]},"253":{"position":[[1152,5],[2611,5]]},"257":{"position":[[1226,5],[3032,5]]},"261":{"position":[[1005,5],[2865,5]]},"265":{"position":[[880,5],[2628,5]]},"269":{"position":[[1121,5],[2961,5]]},"277":{"position":[[1195,5],[2681,5]]},"281":{"position":[[928,5],[2399,5]]},"285":{"position":[[949,5],[2448,5]]},"291":{"position":[[1124,5],[2940,5]]},"295":{"position":[[962,5],[2416,5]]},"301":{"position":[[1433,5],[2969,5]]},"303":{"position":[[1337,4]]},"305":{"position":[[978,5],[2568,5]]},"317":{"position":[[957,5],[2542,5]]},"325":{"position":[[2366,5],[4172,5]]},"329":{"position":[[847,5],[2269,5]]},"333":{"position":[[830,5],[2284,5]]},"341":{"position":[[901,5],[2397,5]]},"343":{"position":[[1215,5]]},"345":{"position":[[1073,5],[2669,5]]},"349":{"position":[[931,5],[2425,5]]},"378":{"position":[[351,4]]},"483":{"position":[[756,4]]},"513":{"position":[[168,4]]},"633":{"position":[[1454,5]]}}}],["given",{"_index":244,"t":{"8":{"position":[[478,5]]},"118":{"position":[[3382,5],[3656,5]]},"164":{"position":[[475,5]]},"206":{"position":[[643,5]]},"212":{"position":[[635,5]]},"271":{"position":[[944,5]]},"303":{"position":[[1443,6]]},"425":{"position":[[3119,5],[3367,5]]},"483":{"position":[[450,5]]},"507":{"position":[[261,5]]}}}],["global",{"_index":144,"t":{"4":{"position":[[3802,6]]},"42":{"position":[[333,8]]},"46":{"position":[[145,8]]},"66":{"position":[[147,8]]},"85":{"position":[[147,8]]},"89":{"position":[[583,6]]},"91":{"position":[[146,8]]},"95":{"position":[[146,8]]},"99":{"position":[[577,6]]},"103":{"position":[[147,8]]},"110":{"position":[[1199,8]]},"114":{"position":[[142,8]]},"143":{"position":[[722,8]]},"153":{"position":[[150,8]]},"166":{"position":[[1695,8]]},"186":{"position":[[145,8]]},"188":{"position":[[2258,8]]},"198":{"position":[[146,8]]},"202":{"position":[[147,8]]},"208":{"position":[[146,8]]},"214":{"position":[[144,8]]},"218":{"position":[[237,8]]},"220":{"position":[[507,8]]},"234":{"position":[[143,8]]},"253":{"position":[[143,8]]},"257":{"position":[[154,8]]},"261":{"position":[[149,8]]},"265":{"position":[[153,8]]},"269":{"position":[[153,8]]},"277":{"position":[[146,8]]},"281":{"position":[[143,8]]},"285":{"position":[[142,8]]},"291":{"position":[[311,8]]},"295":{"position":[[145,8]]},"301":{"position":[[270,8]]},"305":{"position":[[147,8]]},"317":{"position":[[148,8]]},"325":{"position":[[1602,8]]},"329":{"position":[[143,8]]},"333":{"position":[[145,8]]},"341":{"position":[[142,8]]},"345":{"position":[[143,8]]},"349":{"position":[[148,8]]},"361":{"position":[[14,8]]},"621":{"position":[[464,8]]}}}],["gnu",{"_index":1154,"t":{"97":{"position":[[190,3]]}}}],["go",{"_index":891,"t":{"62":{"position":[[247,2]]},"71":{"position":[[100,2]]},"110":{"position":[[593,5]]},"149":{"position":[[3235,2]]},"178":{"position":[[498,5]]},"192":{"position":[[364,2],[620,2]]},"224":{"position":[[798,2]]},"238":{"position":[[781,2]]},"303":{"position":[[4141,2]]},"343":{"position":[[1854,2]]},"555":{"position":[[448,2]]},"584":{"position":[[450,2]]}}}],["goal",{"_index":1206,"t":{"105":{"position":[[1750,4]]},"612":{"position":[[45,4]]}}}],["goc",{"_index":2498,"t":{"345":{"position":[[2095,9],[3575,9]]}}}],["gocspx",{"_index":2464,"t":{"343":{"position":[[2708,7],[3937,7]]}}}],["gon",{"_index":1273,"t":{"118":{"position":[[544,4]]}}}],["good",{"_index":1377,"t":{"118":{"position":[[4791,4],[5047,4]]},"439":{"position":[[778,4]]},"483":{"position":[[234,4],[2706,4]]},"488":{"position":[[112,4],[177,4]]},"599":{"position":[[3821,4],[3868,4]]}}}],["goodmus",{"_index":1845,"t":{"188":{"position":[[5265,11],[7094,11]]}}}],["goodterm",{"_index":2677,"t":{"397":{"position":[[535,10],[573,10],[635,8]]}}}],["googl",{"_index":1617,"t":{"157":{"position":[[195,6]]},"188":{"position":[[5228,7],[7057,7]]},"216":{"position":[[155,6],[647,6],[690,6]]},"343":{"position":[[83,7],[156,6],[1778,6],[3167,6],[3779,6],[4149,6],[4819,6]]},"345":{"position":[[325,6],[412,6],[482,6]]},"451":{"position":[[4,6],[456,6]]},"633":{"position":[[180,6]]}}}],["gorillaz",{"_index":2872,"t":{"457":{"position":[[2068,8]]}}}],["gotifi",{"_index":200,"t":{"4":{"position":[[5366,9]]},"27":{"position":[[455,9],[560,9],[641,7],[831,9]]},"633":{"position":[[824,8]]}}}],["gotify://192.168.0.101:8070/mytoken",{"_index":578,"t":{"27":{"position":[[1660,40]]}}}],["gotifyconfig",{"_index":562,"t":{"27":{"position":[[680,12]]}}}],["grab",{"_index":1517,"t":{"149":{"position":[[960,4]]},"635":{"position":[[161,5]]}}}],["grace",{"_index":3479,"t":{"633":{"position":[[1071,8]]}}}],["grafana",{"_index":631,"t":{"31":{"position":[[787,7],[833,7]]}}}],["granular",{"_index":1326,"t":{"118":{"position":[[2226,11],[2478,11],[2614,11]]},"557":{"position":[[3114,8]]}}}],["great",{"_index":1436,"t":{"136":{"position":[[485,5]]}}}],["greater",{"_index":329,"t":{"12":{"position":[[231,7]]},"188":{"position":[[31,7]]}}}],["green",{"_index":2874,"t":{"457":{"position":[[2081,5]]}}}],["grep",{"_index":1036,"t":{"73":{"position":[[4157,4],[4563,4]]}}}],["group",{"_index":2028,"t":{"224":{"position":[[1563,5],[2460,5],[2487,6],[2612,6],[2803,6],[2844,6]]},"238":{"position":[[1544,5],[2446,5],[2473,6],[2592,6],[2766,6],[2800,6]]},"299":{"position":[[25,6]]},"301":{"position":[[771,5],[914,5]]},"327":{"position":[[1352,6]]},"412":{"position":[[336,5]]},"481":{"position":[[730,5],[830,5]]}}}],["group/zon",{"_index":2207,"t":{"297":{"position":[[162,10]]}}}],["groupsallow",{"_index":2238,"t":{"301":{"position":[[2383,14],[3811,14]]}}}],["groupsblock",{"_index":2239,"t":{"301":{"position":[[2412,14],[3840,14]]}}}],["guarante",{"_index":851,"t":{"57":{"position":[[433,9]]},"105":{"position":[[1648,9],[1675,9]]},"599":{"position":[[3919,9]]},"602":{"position":[[98,10]]},"614":{"position":[[489,10]]}}}],["gui",{"_index":1924,"t":{"204":{"position":[[132,4]]},"210":{"position":[[124,4]]}}}],["guid",{"_index":758,"t":{"46":{"position":[[912,6],[2430,6]]},"66":{"position":[[1409,6],[2943,6]]},"85":{"position":[[1168,6],[2660,6]]},"91":{"position":[[1077,6],[2661,6]]},"95":{"position":[[850,6],[2342,6]]},"103":{"position":[[1175,6],[2722,6]]},"110":{"position":[[2100,6],[3657,6]]},"114":{"position":[[968,6],[2554,6]]},"143":{"position":[[1463,6],[2955,6]]},"153":{"position":[[1219,6],[3041,6]]},"171":{"position":[[463,6]]},"186":{"position":[[982,6],[2536,6]]},"188":{"position":[[4115,6],[6064,6]]},"198":{"position":[[1003,6],[2555,6]]},"202":{"position":[[839,6],[2287,6]]},"208":{"position":[[1012,6],[2481,6]]},"214":{"position":[[976,6],[2452,6]]},"218":{"position":[[1332,6],[2837,6]]},"220":{"position":[[1316,6],[3087,6]]},"234":{"position":[[1091,6],[2545,6]]},"253":{"position":[[1164,6],[2623,6]]},"257":{"position":[[1238,6],[3044,6]]},"261":{"position":[[1017,6],[2877,6]]},"265":{"position":[[892,6],[2640,6]]},"269":{"position":[[1133,6],[2973,6]]},"277":{"position":[[1207,6],[2693,6]]},"281":{"position":[[940,6],[2411,6]]},"285":{"position":[[961,6],[2460,6]]},"291":{"position":[[1136,6],[2952,6]]},"295":{"position":[[974,6],[2428,6]]},"301":{"position":[[1445,6],[2981,6]]},"305":{"position":[[990,6],[2580,6]]},"309":{"position":[[550,5]]},"311":{"position":[[24,6]]},"317":{"position":[[969,6],[2554,6]]},"325":{"position":[[2378,6],[4184,6]]},"329":{"position":[[859,6],[2281,6]]},"333":{"position":[[842,6],[2296,6]]},"341":{"position":[[913,6],[2409,6]]},"345":{"position":[[1085,6],[2681,6]]},"349":{"position":[[943,6],[2437,6]]},"545":{"position":[[24,5],[42,6]]},"553":{"position":[[5,5],[111,5]]},"579":{"position":[[42,5]]},"602":{"position":[[410,7]]},"633":{"position":[[1336,5]]},"641":{"position":[[20,5]]},"651":{"position":[[38,6]]}}}],["guidanc",{"_index":668,"t":{"38":{"position":[[699,8]]},"110":{"position":[[650,8]]},"166":{"position":[[1351,9]]},"232":{"position":[[826,8]]},"251":{"position":[[831,8]]},"447":{"position":[[374,8]]},"476":{"position":[[1389,8]]},"608":{"position":[[92,8]]}}}],["guidelin",{"_index":2030,"t":{"224":{"position":[[2230,10]]},"238":{"position":[[2211,10]]}}}],["guy",{"_index":1878,"t":{"196":{"position":[[472,3]]},"376":{"position":[[327,4]]},"412":{"position":[[202,3],[485,3],[589,3],[652,3]]}}}],["gym",{"_index":2587,"t":{"367":{"position":[[516,5],[569,4],[694,5],[747,4],[1229,3],[1346,5],[1475,4],[1641,5]]},"402":{"position":[[112,4],[349,5]]}}}],["handl",{"_index":1220,"t":{"110":{"position":[[4,6],[76,7],[313,6],[416,6],[1609,6],[3083,9],[4524,9]]},"120":{"position":[[473,6]]},"143":{"position":[[158,7],[191,7],[416,6],[562,6]]},"291":{"position":[[645,6],[2378,9],[3819,9]]},"415":{"position":[[102,7]]},"447":{"position":[[77,6]]},"599":{"position":[[85,6],[161,7],[319,6],[1772,9]]},"633":{"position":[[1107,8],[1157,8],[1509,7],[2060,8]]}}}],["handle(someplay",{"_index":3403,"t":{"599":{"position":[[2861,16],[3539,16]]}}}],["happen",{"_index":838,"t":{"54":{"position":[[1342,6]]},"73":{"position":[[3109,8]]},"79":{"position":[[333,8]]},"136":{"position":[[1160,6]]},"149":{"position":[[453,6]]},"439":{"position":[[949,6]]},"457":{"position":[[3151,8]]}}}],["happili",{"_index":1430,"t":{"136":{"position":[[13,7]]}}}],["hard",{"_index":2841,"t":{"457":{"position":[[280,4]]}}}],["hardend",{"_index":3113,"t":{"543":{"position":[[2134,9]]}}}],["hash",{"_index":3436,"t":{"616":{"position":[[538,4]]}}}],["hasn't",{"_index":680,"t":{"40":{"position":[[359,6]]}}}],["have",{"_index":459,"t":{"18":{"position":[[1503,6]]},"42":{"position":[[716,6]]},"130":{"position":[[306,6]]},"303":{"position":[[4870,6]]},"457":{"position":[[468,6]]},"599":{"position":[[1224,6],[2654,6]]},"649":{"position":[[0,6]]}}}],["header",{"_index":1535,"t":{"149":{"position":[[1517,7],[1557,7],[2264,7],[2418,7],[2603,6]]},"153":{"position":[[503,6]]},"198":{"position":[[366,6]]},"253":{"position":[[565,6]]},"343":{"position":[[765,7]]},"345":{"position":[[587,7]]},"581":{"position":[[378,6]]}}}],["headless",{"_index":800,"t":{"50":{"position":[[193,8],[474,8],[547,8]]},"52":{"position":[[4,8],[312,8]]},"54":{"position":[[164,9],[314,9]]},"68":{"position":[[295,9]]},"73":{"position":[[753,8]]},"81":{"position":[[134,8]]},"271":{"position":[[12,8]]}}}],["health",{"_index":581,"t":{"29":{"position":[[31,6]]},"581":{"position":[[224,6]]},"592":{"position":[[1842,7]]}}}],["healthcheck",{"_index":3478,"t":{"633":{"position":[[851,11]]}}}],["heap",{"_index":2773,"t":{"431":{"position":[[85,4]]}}}],["help",{"_index":403,"t":{"16":{"position":[[359,4]]},"73":{"position":[[9092,7]]},"216":{"position":[[365,4],[3360,4]]},"347":{"position":[[1013,5],[1473,4]]},"351":{"position":[[861,4],[916,4]]},"441":{"position":[[964,4]]},"457":{"position":[[1284,4]]},"496":{"position":[[184,4]]},"513":{"position":[[298,4],[433,4]]},"520":{"position":[[145,4]]}}}],["here",{"_index":623,"t":{"31":{"position":[[647,4],[924,5]]},"87":{"position":[[1307,5]]},"132":{"position":[[307,4]]},"149":{"position":[[2549,6],[3683,5]]},"151":{"position":[[2460,4]]},"153":{"position":[[2292,6],[2340,6],[3986,6],[4034,6]]},"174":{"position":[[660,4]]},"178":{"position":[[793,4]]},"216":{"position":[[1670,6]]},"303":{"position":[[1169,4]]},"305":{"position":[[533,5]]},"343":{"position":[[1761,7]]},"347":{"position":[[389,4]]},"359":{"position":[[707,7]]},"476":{"position":[[1625,4]]},"517":{"position":[[663,5],[669,4]]},"543":{"position":[[1626,4]]},"545":{"position":[[633,4]]},"555":{"position":[[297,4],[451,5]]},"559":{"position":[[824,5]]},"561":{"position":[[557,5]]},"565":{"position":[[157,5]]},"584":{"position":[[453,4]]},"588":{"position":[[605,4]]},"618":{"position":[[227,5]]}}}],["heureist",{"_index":2851,"t":{"457":{"position":[[1306,10]]}}}],["heurist",{"_index":1320,"t":{"118":{"position":[[1823,10]]},"359":{"position":[[274,10]]},"376":{"position":[[31,10],[240,11]]}}}],["hidden",{"_index":1856,"t":{"192":{"position":[[430,7]]}}}],["hide",{"_index":1528,"t":{"149":{"position":[[1320,4]]},"153":{"position":[[655,5]]}}}],["high",{"_index":1762,"t":{"180":{"position":[[255,4]]},"459":{"position":[[98,4]]},"476":{"position":[[6640,4]]}}}],["higher",{"_index":2707,"t":{"417":{"position":[[38,6]]},"479":{"position":[[259,6]]},"483":{"position":[[2258,7]]},"492":{"position":[[253,6]]}}}],["highest",{"_index":1290,"t":{"118":{"position":[[1082,7]]}}}],["highli",{"_index":1561,"t":{"151":{"position":[[405,6]]},"343":{"position":[[819,6]]}}}],["highlight",{"_index":2593,"t":{"369":{"position":[[598,11]]},"559":{"position":[[1654,11],[1717,11]]},"563":{"position":[[792,11],[855,11]]}}}],["hint",{"_index":289,"t":{"10":{"position":[[146,6]]},"586":{"position":[[508,5]]}}}],["histor",{"_index":638,"t":{"33":{"position":[[43,10]]},"639":{"position":[[43,10]]}}}],["histori",{"_index":1388,"t":{"118":{"position":[[5187,8]]},"136":{"position":[[391,7]]},"145":{"position":[[48,7]]},"147":{"position":[[62,8]]},"151":{"position":[[549,7],[786,7],[1482,7]]},"153":{"position":[[643,7]]},"157":{"position":[[114,7],[179,7],[383,7],[414,7],[446,7],[489,7],[525,7],[573,7],[603,7],[778,7],[920,7],[957,7],[1098,7]]},"160":{"position":[[663,7],[1179,9],[1267,7]]},"166":{"position":[[15,8],[38,7],[126,7]]},"192":{"position":[[189,8]]},"194":{"position":[[111,8]]},"196":{"position":[[38,7],[946,7]]},"220":{"position":[[48,7]]},"255":{"position":[[44,7]]},"259":{"position":[[55,7]]},"267":{"position":[[43,7]]},"303":{"position":[[1682,7]]},"343":{"position":[[287,7]]},"457":{"position":[[19,7],[155,9],[1149,8],[1192,8],[1696,7]]},"594":{"position":[[121,8],[189,8]]},"599":{"position":[[368,7],[518,7]]}}}],["hit",{"_index":1858,"t":{"192":{"position":[[579,3]]},"343":{"position":[[4384,3]]}}}],["home",{"_index":1844,"t":{"188":{"position":[[5236,5],[7065,5]]},"249":{"position":[[476,4]]},"549":{"position":[[680,5]]},"573":{"position":[[57,4]]}}}],["home/foxx/.var/app/com.discordapp.discord/cache/scoped_dirnnxnin/singletonsocket",{"_index":1040,"t":{"73":{"position":[[4227,81],[4633,81]]}}}],["home/kasm",{"_index":1016,"t":{"73":{"position":[[2518,10]]},"77":{"position":[[1117,10]]}}}],["home/youruser/multi",{"_index":3086,"t":{"535":{"position":[[661,20],[905,20]]}}}],["homebrew",{"_index":1069,"t":{"73":{"position":[[7365,8]]}}}],["hook",{"_index":2549,"t":{"355":{"position":[[197,4],[299,5]]},"357":{"position":[[726,6],[881,4],[1038,5],[1058,4],[1075,4]]},"359":{"position":[[5,4],[472,4],[530,5]]},"361":{"position":[[216,5],[305,5],[624,4],[703,4],[1953,5],[2139,4],[2218,4]]},"367":{"position":[[16,5]]},"384":{"position":[[233,4]]},"387":{"position":[[180,4],[259,4]]},"470":{"position":[[59,5],[937,5]]},"472":{"position":[[1124,4]]},"509":{"position":[[159,4]]}}}],["host",{"_index":532,"t":{"22":{"position":[[121,7]]},"25":{"position":[[360,6]]},"27":{"position":[[1615,7]]},"64":{"position":[[647,4]]},"73":{"position":[[1323,4],[3866,5],[5435,4],[5451,4],[5476,4],[5979,5],[6198,4],[6730,4],[6821,4],[6837,4],[6862,4],[7412,5],[7536,5],[8078,4],[8606,4],[8705,4],[9885,4]]},"75":{"position":[[91,4]]},"83":{"position":[[506,4]]},"103":{"position":[[676,4]]},"105":{"position":[[771,4]]},"138":{"position":[[769,4]]},"216":{"position":[[869,4],[1015,4]]},"232":{"position":[[778,4]]},"251":{"position":[[783,4]]},"257":{"position":[[739,4]]},"293":{"position":[[364,4],[567,4],[869,4]]},"297":{"position":[[1422,7]]},"301":{"position":[[2294,7],[3722,7]]},"303":{"position":[[4679,5]]},"327":{"position":[[802,4],[964,4]]},"333":{"position":[[330,4]]},"435":{"position":[[1602,4],[1980,4]]},"543":{"position":[[43,4],[84,4],[1265,4],[1771,4],[1885,4]]},"545":{"position":[[249,4]]},"553":{"position":[[171,4]]},"567":{"position":[[65,4]]},"581":{"position":[[43,6],[719,6]]},"584":{"position":[[766,4],[801,6]]},"633":{"position":[[2833,6]]}}}],["host'",{"_index":2187,"t":{"293":{"position":[[443,6],[1496,6]]}}}],["host/ip",{"_index":1089,"t":{"73":{"position":[[9654,7]]}}}],["host:port",{"_index":720,"t":{"44":{"position":[[923,10]]},"73":{"position":[[6181,9],[8061,9],[9868,9]]},"85":{"position":[[360,9]]},"188":{"position":[[2663,9],[3434,9]]}}}],["hostabl",{"_index":963,"t":{"73":{"position":[[312,8]]}}}],["hostnam",{"_index":2122,"t":{"271":{"position":[[776,8],[874,8]]}}}],["hour",{"_index":478,"t":{"18":{"position":[[2438,5],[4413,5]]}}}],["http",{"_index":294,"t":{"10":{"position":[[259,4],[372,5]]},"64":{"position":[[1219,5],[1518,5],[1572,4],[1627,4],[1726,5],[1813,5],[1886,5],[1997,5],[2142,5],[2214,4],[2264,5],[2316,5],[2416,5],[2488,4],[2542,5],[2646,5]]},"83":{"position":[[1078,5],[1377,5],[1431,4],[1486,4],[1585,5],[1672,5],[1745,5],[1856,5],[2001,5],[2073,4],[2123,5],[2175,5],[2275,5],[2347,4],[2401,5],[2505,5]]},"208":{"position":[[381,4]]},"210":{"position":[[192,4]]},"214":{"position":[[367,4]]},"232":{"position":[[447,5],[580,11]]},"251":{"position":[[447,5],[585,11]]},"271":{"position":[[286,4],[867,6]]},"277":{"position":[[380,4]]},"303":{"position":[[2271,8],[2500,5],[3781,5],[3831,4],[3936,5],[4562,5]]},"327":{"position":[[39,6],[70,4],[305,4],[384,4],[503,4],[797,4],[836,4],[958,5],[973,4]]},"335":{"position":[[440,5]]},"557":{"position":[[739,5]]}}}],["http/http",{"_index":2048,"t":{"232":{"position":[[192,10]]},"251":{"position":[[192,10]]}}}],["http://127.0.0.1:5079/callback",{"_index":2278,"t":{"303":{"position":[[4027,30]]}}}],["http://127.0.0.1:5079/callback?code=xxxxxx",{"_index":2279,"t":{"303":{"position":[[4252,45]]}}}],["http://127.0.0.1:9078/callback",{"_index":2270,"t":{"303":{"position":[[3226,30]]}}}],["http://192.168.0.100:4110",{"_index":716,"t":{"44":{"position":[[633,25],[682,25],[1042,25],[1068,25],[1285,25]]},"46":{"position":[[1862,27],[3272,27]]},"174":{"position":[[2489,27],[3502,27]]},"176":{"position":[[1693,27],[2966,27]]},"220":{"position":[[2519,27],[3929,27]]},"565":{"position":[[721,25],[775,25]]},"623":{"position":[[562,27],[877,27]]}}}],["http://192.168.0.100:4110/apis/listenbrainz",{"_index":725,"t":{"44":{"position":[[1241,43]]}}}],["http://192.168.0.100:4110/apis/listenbrainz/1",{"_index":722,"t":{"44":{"position":[[1094,45],[1311,45]]}}}],["http://192.168.0.100:42010/admin_apikey",{"_index":3201,"t":{"565":{"position":[[2158,41]]}}}],["http://192.168.0.100:6969",{"_index":3243,"t":{"581":{"position":[[729,25]]},"584":{"position":[[821,25]]}}}],["http://192.168.0.100:6969/api",{"_index":3244,"t":{"581":{"position":[[782,29]]}}}],["http://192.168.0.100:80/koito",{"_index":726,"t":{"44":{"position":[[1357,29],[1387,29]]}}}],["http://192.168.0.100:80/koito/apis/listenbrainz/1",{"_index":727,"t":{"44":{"position":[[1417,49]]}}}],["http://192.168.0.100:8070",{"_index":558,"t":{"27":{"position":[[472,28],[887,28]]}}}],["http://192.168.0.100:8080",{"_index":577,"t":{"27":{"position":[[1623,28]]}}}],["http://192.168.0.100:9078",{"_index":1120,"t":{"89":{"position":[[310,25]]},"99":{"position":[[310,25]]},"557":{"position":[[1176,25],[3954,25]]},"567":{"position":[[381,25]]}}}],["http://192.168.0.100:9078/lastfm/callback",{"_index":1122,"t":{"89":{"position":[[452,41]]},"557":{"position":[[3465,41]]},"559":{"position":[[1931,43]]},"563":{"position":[[1069,43]]},"565":{"position":[[1442,41]]}}}],["http://192.168.0.100:9078/librefm/callback",{"_index":1159,"t":{"99":{"position":[[445,42]]}}}],["http://192.168.0.100:9991",{"_index":569,"t":{"27":{"position":[[1236,28]]}}}],["http://192.168.0.101",{"_index":905,"t":{"64":{"position":[[891,21]]},"83":{"position":[[750,21]]},"331":{"position":[[556,20]]}}}],["http://192.168.0.101/my/subfold",{"_index":305,"t":{"10":{"position":[[758,33]]}}}],["http://192.168.0.101/yamahaextendedcontrol/v1",{"_index":2394,"t":{"331":{"position":[[577,45]]}}}],["http://192.168.0.101:3456/jsonprc",{"_index":1950,"t":{"212":{"position":[[864,33]]}}}],["http://192.168.0.101:3456/mcws/v1",{"_index":1934,"t":{"206":{"position":[[882,34]]}}}],["http://192.168.0.101:4000/my/subfolder/lastfm/callback",{"_index":312,"t":{"10":{"position":[[1025,54]]}}}],["http://192.168.0.101:80/lastfm/callback",{"_index":308,"t":{"10":{"position":[[888,39]]}}}],["http://192.168.0.101:8096",{"_index":3164,"t":{"549":{"position":[[2118,28]]}}}],["http://192.168.0.101:9078/callback?code=xxxxxx",{"_index":2282,"t":{"303":{"position":[[4412,50]]}}}],["http://192.168.0.101:9078/lastfm/callback",{"_index":302,"t":{"10":{"position":[[649,41]]}}}],["http://192.168.0.101:9078/my/subfolder/lastfm/callback",{"_index":306,"t":{"10":{"position":[[792,54]]}}}],["http://192.168.0.112/fun.png",{"_index":917,"t":{"64":{"position":[[1577,28]]},"83":{"position":[[1436,28]]}}}],["http://192.168.0.140:9078",{"_index":2806,"t":{"437":{"position":[[510,26]]}}}],["http://192.168.0.140:9078/api/webscrobbl",{"_index":2802,"t":{"435":{"position":[[2103,42]]}}}],["http://192.168.0.150:8096",{"_index":131,"t":{"4":{"position":[[3006,28]]}}}],["http://192.168.0.220:9078/lastfm/callback",{"_index":2807,"t":{"437":{"position":[[639,41]]}}}],["http://192.168.1.161:9980",{"_index":2530,"t":{"349":{"position":[[1825,28],[3199,28]]}}}],["http://foobar.com/cool.jpg",{"_index":916,"t":{"64":{"position":[[1524,26],[2166,26],[2440,26]]},"83":{"position":[[1383,26],[2025,26],[2299,26]]}}}],["http://jellyfin:8096",{"_index":1822,"t":{"188":{"position":[[1794,20]]}}}],["http://jriver.mydomain.com:52199/mcws/v1",{"_index":1932,"t":{"206":{"position":[[821,41]]}}}],["http://kodi.mydomain.com:8080/jsonrpc",{"_index":1949,"t":{"212":{"position":[[807,37]]}}}],["http://localhost",{"_index":2805,"t":{"437":{"position":[[398,21]]}}}],["http://localhost:4040/airson",{"_index":2341,"t":{"317":{"position":[[1852,33],[3317,33]]}}}],["http://localhost:42010",{"_index":196,"t":{"4":{"position":[[5256,25]]},"95":{"position":[[1750,25],[3130,25]]},"265":{"position":[[2048,25],[3428,25]]},"549":{"position":[[2241,25]]}}}],["http://localhost:52199/mcws/v1",{"_index":1928,"t":{"206":{"position":[[187,31],[769,31]]},"208":{"position":[[331,31]]}}}],["http://localhost:8070",{"_index":201,"t":{"4":{"position":[[5383,24]]}}}],["http://localhost:8080",{"_index":2368,"t":{"327":{"position":[[549,21]]}}}],["http://localhost:8080/jsonrpc",{"_index":1947,"t":{"212":{"position":[[185,29],[759,29]]},"214":{"position":[[321,29],[1834,32],[3206,32]]}}}],["http://localhost:8096",{"_index":123,"t":{"4":{"position":[[2649,24],[2852,24],[5983,24]]},"188":{"position":[[5012,24],[6841,24]]}}}],["http://localhost:9078",{"_index":290,"t":{"10":{"position":[[164,21]]},"343":{"position":[[3129,22]]},"647":{"position":[[99,21]]}}}],["http://localhost:9078/api/webscrobbl",{"_index":2406,"t":{"335":{"position":[[167,38]]},"337":{"position":[[518,38]]},"435":{"position":[[2061,38]]}}}],["http://localhost:9078/api/webscrobbler/usera",{"_index":2421,"t":{"337":{"position":[[387,44]]}}}],["http://localhost:9078/api/webscrobbler/userb",{"_index":2422,"t":{"337":{"position":[[469,44]]}}}],["http://localhost:9078/api/ytmusic/callback?name=myytm",{"_index":2466,"t":{"343":{"position":[[2955,53]]}}}],["http://localhost:9078/callback",{"_index":193,"t":{"4":{"position":[[5107,32]]},"174":{"position":[[1738,33],[2769,33]]},"178":{"position":[[2512,33],[3716,33]]},"305":{"position":[[439,30],[1987,33],[3461,33]]}}}],["http://localhost:9078/lastfm/callback",{"_index":250,"t":{"8":{"position":[[656,39],[1130,39]]},"91":{"position":[[478,37],[2079,39],[3551,39]]},"151":{"position":[[3062,39]]},"174":{"position":[[2265,39],[3286,39]]},"176":{"position":[[1283,39],[1469,39],[2546,39],[2750,39]]},"178":{"position":[[2939,39],[4142,39]]},"269":{"position":[[527,37],[2391,39],[3863,39]]},"437":{"position":[[598,37]]}}}],["http://localhost:9078/librefm/callback",{"_index":1169,"t":{"103":{"position":[[464,38],[2137,40],[3568,40]]},"257":{"position":[[513,38],[2459,40],[3890,40]]}}}],["http://localhost:9991",{"_index":212,"t":{"4":{"position":[[5551,24]]}}}],["http://my.custom.domain/api/ytmusic/callback?name=myytm",{"_index":2472,"t":{"343":{"position":[[3978,57]]}}}],["http://my.domain.loc",{"_index":303,"t":{"10":{"position":[[691,22]]}}}],["http://my.domain.local:9000/lastfm/callback",{"_index":310,"t":{"10":{"position":[[949,43]]}}}],["http://my.domain.local:9078/lastfm/callback",{"_index":304,"t":{"10":{"position":[[714,43]]}}}],["http://mydomain.com/reverseproxy/cast",{"_index":2395,"t":{"331":{"position":[[623,37],[661,37]]}}}],["http://mydomain.com:80/kodireverse/jsonrpc",{"_index":1952,"t":{"212":{"position":[[934,42]]}}}],["http://myicecast.com/radio",{"_index":1912,"t":{"200":{"position":[[1967,29]]},"202":{"position":[[1714,28],[3046,28]]}}}],["http://mymalojaserverip/admin_apikey",{"_index":1144,"t":{"93":{"position":[[400,38]]}}}],["http://mymsdomainorip:9078",{"_index":2049,"t":{"232":{"position":[[221,28]]},"251":{"position":[[221,28]]}}}],["http://mymultiscrobblerip:9078",{"_index":2065,"t":{"240":{"position":[[132,30]]},"249":{"position":[[316,30]]}}}],["http://mymultiscrobblerip:9078/1",{"_index":2066,"t":{"240":{"position":[[163,33]]},"247":{"position":[[70,33]]},"557":{"position":[[2152,33]]}}}],["http://mymultiscrobblerip:9078/1/submit",{"_index":2067,"t":{"240":{"position":[[279,39]]}}}],["http://mymultiscrobblerip:9078/api/listenbrainz/foobar",{"_index":2072,"t":{"244":{"position":[[712,54]]}}}],["http://mymultiscrobblerip:9078/api/listenbrainz/foobar/submit",{"_index":2073,"t":{"244":{"position":[[767,61]]}}}],["http://some_ip:7000/subfolder/api",{"_index":2739,"t":{"425":{"position":[[1101,33]]}}}],["http://yandex",{"_index":2525,"t":{"349":{"position":[[385,13]]}}}],["http://your_jellyin_url/web/index.html#!/apikeys.html",{"_index":1801,"t":{"188":{"position":[[163,55]]}}}],["http://yourmsdomain/2.0",{"_index":2036,"t":{"226":{"position":[[262,24]]},"228":{"position":[[566,24]]},"230":{"position":[[1055,24]]}}}],["http://yourmsdomain/api/lastfm/myslug",{"_index":2047,"t":{"230":{"position":[[965,37]]}}}],["http://yourmsdomain:9078/next",{"_index":3485,"t":{"633":{"position":[[1579,29]]}}}],["http://yourmultiscrobblerdomain/api/health",{"_index":582,"t":{"29":{"position":[[77,42]]}}}],["http://yourmultiscrobblerdomain/api/metr",{"_index":604,"t":{"31":{"position":[[49,43]]}}}],["https://192.168.0.101",{"_index":313,"t":{"10":{"position":[[1080,21]]}}}],["https://192.168.0.101:443/lastfm/callback",{"_index":314,"t":{"10":{"position":[[1102,41]]}}}],["https://192.168.my.host:6901",{"_index":1028,"t":{"73":{"position":[[2972,28]]},"79":{"position":[[196,28]]}}}],["https://amp",{"_index":1523,"t":{"149":{"position":[[1226,11],[2036,11]]}}}],["https://anything.com/neat.jpg",{"_index":921,"t":{"64":{"position":[[1947,29],[2270,29]]},"83":{"position":[[1806,29],[2129,29]]}}}],["https://api.listenbrainz.org",{"_index":1252,"t":{"114":{"position":[[311,29],[1969,30],[3419,30]]},"261":{"position":[[346,29],[2292,30],[3742,30]]}}}],["https://archive.org/download/dir/myimage.jpg",{"_index":918,"t":{"64":{"position":[[1665,44]]},"83":{"position":[[1524,44]]}}}],["https://archive.org/my/dir/myimage.jpg",{"_index":923,"t":{"64":{"position":[[2087,38],[2361,38]]},"83":{"position":[[1946,38],[2220,38]]}}}],["https://azura.mydomain.com/api/st",{"_index":1787,"t":{"184":{"position":[[576,39]]}}}],["https://azura.mydomain.com/public/mi",{"_index":1786,"t":{"184":{"position":[[354,36]]}}}],["https://azura.mydomain.com/public/xxxxxx",{"_index":1792,"t":{"184":{"position":[[1375,40]]}}}],["https://bsky.app/settings/app",{"_index":1462,"t":{"140":{"position":[[209,29]]}}}],["https://cooldomain.com/art.png",{"_index":936,"t":{"64":{"position":[[3993,32]]},"83":{"position":[[3785,32]]}}}],["https://developer.spotify.com",{"_index":2260,"t":{"303":{"position":[[1756,29]]}}}],["https://echo.multi",{"_index":2285,"t":{"303":{"position":[[5083,18]]}}}],["https://en.wikipedia.org/wiki/list_of_tz_database_time_zon",{"_index":1683,"t":{"174":{"position":[[665,60]]},"178":{"position":[[798,60]]},"543":{"position":[[1631,60]]},"545":{"position":[[638,60]]},"555":{"position":[[302,60]]}}}],["https://example.com/cool.jpg",{"_index":920,"t":{"64":{"position":[[1837,28],[2219,28],[2493,28]]},"83":{"position":[[1696,28],[2078,28],[2352,28]]}}}],["https://github.com/clangen/musikcube/wiki/remot",{"_index":2176,"t":{"285":{"position":[[439,48]]}}}],["https://github.com/foxxmd/multi",{"_index":2711,"t":{"417":{"position":[[265,31]]},"549":{"position":[[142,31]]},"612":{"position":[[257,31]]}}}],["https://github.com/patrickkfkan/volumio",{"_index":2439,"t":{"343":{"position":[[602,39]]}}}],["https://jellyfin.fred.com",{"_index":1730,"t":{"176":{"position":[[675,28],[1889,28]]}}}],["https://jellyfin.mary.com",{"_index":1733,"t":{"176":{"position":[[855,28],[2091,28]]}}}],["https://jellyfin.mydomain.com",{"_index":1823,"t":{"188":{"position":[[1892,30]]}}}],["https://jellyfin.mydomain.com/art/1234.jpg",{"_index":1825,"t":{"188":{"position":[[2025,42]]}}}],["https://jellyfin.mydomain.com/neat.jpg",{"_index":925,"t":{"64":{"position":[[2591,38]]},"83":{"position":[[2450,38]]}}}],["https://koito.mydomain.com",{"_index":723,"t":{"44":{"position":[[1140,26],[1167,26]]}}}],["https://koito.mydomain.com/apis/listenbrainz/1",{"_index":724,"t":{"44":{"position":[[1194,46]]}}}],["https://last.fm",{"_index":2034,"t":{"226":{"position":[[133,15]]}}}],["https://libre.fm/2.0",{"_index":1171,"t":{"103":{"position":[[639,21]]},"257":{"position":[[702,21]]}}}],["https://mpd.readthedocs.io/en/stable/user.html#permiss",{"_index":2161,"t":{"281":{"position":[[424,58]]}}}],["https://music.apple.com",{"_index":1492,"t":{"147":{"position":[[368,24]]},"149":{"position":[[2566,25]]},"153":{"position":[[2357,26],[4051,26]]}}}],["https://musicbrainz.org",{"_index":2918,"t":{"466":{"position":[[720,24],[945,23]]}}}],["https://my.cool.libre.com/2.0",{"_index":1163,"t":{"101":{"position":[[229,30]]}}}],["https://my.mb.mirror.domain.com",{"_index":2919,"t":{"466":{"position":[[1037,33]]}}}],["https://myjellyfinexternal.tld",{"_index":1849,"t":{"188":{"position":[[5421,32],[7250,32]]}}}],["https://rocksky.app/access",{"_index":1240,"t":{"110":{"position":[[1505,26]]}}}],["https://scrobbler.mydomain.com",{"_index":2267,"t":{"303":{"position":[[2760,30]]}}}],["https://scrobbler.mydomain.com/callback",{"_index":2269,"t":{"303":{"position":[[2896,39]]}}}],["https://spotify.com/assets/cover.png?size=1000",{"_index":919,"t":{"64":{"position":[[1750,46]]},"83":{"position":[[1609,46]]}}}],["https://status.multi",{"_index":543,"t":{"25":{"position":[[110,20]]}}}],["https://www.google.com/devic",{"_index":2484,"t":{"343":{"position":[[5185,29]]}}}],["https://yourmsdomain",{"_index":2035,"t":{"226":{"position":[[152,20]]}}}],["https://ytmusicapi.readthedocs.io/en/stable/setup/browser.html#copi",{"_index":2441,"t":{"343":{"position":[[682,67]]}}}],["hunter2",{"_index":1002,"t":{"73":{"position":[[2272,7]]},"77":{"position":[[871,7]]}}}],["hwat",{"_index":1282,"t":{"118":{"position":[[876,4],[897,4]]}}}],["i686",{"_index":1894,"t":{"198":{"position":[[498,5]]}}}],["icecast",{"_index":1620,"t":{"157":{"position":[[244,7]]},"184":{"position":[[874,10]]},"200":{"position":[[24,7],[145,7],[443,7],[613,7],[1385,7],[1720,7],[1869,7],[2116,7]]},"202":{"position":[[340,7],[488,7],[696,7],[1037,7],[1118,7],[1344,7],[1970,7],[2163,7],[2683,7],[3086,9]]},"633":{"position":[[205,7]]}}}],["icecast.json",{"_index":1908,"t":{"200":{"position":[[1079,12]]}}}],["icecast_auto_monitor",{"_index":1920,"t":{"202":{"position":[[359,20]]}}}],["icecast_en",{"_index":1918,"t":{"202":{"position":[[258,14]]}}}],["icecast_id",{"_index":1916,"t":{"202":{"position":[[127,10],[212,10]]}}}],["icecast_nam",{"_index":1917,"t":{"202":{"position":[[183,12]]}}}],["icecast_url",{"_index":1919,"t":{"202":{"position":[[317,11]]}}}],["ici",{"_index":1913,"t":{"200":{"position":[[2008,7],[2222,3]]}}}],["icon",{"_index":706,"t":{"44":{"position":[[242,5],[330,4]]},"64":{"position":[[3804,4]]},"83":{"position":[[3596,4]]},"192":{"position":[[417,4]]},"315":{"position":[[352,6]]},"517":{"position":[[223,4]]},"565":{"position":[[334,5],[422,4]]}}}],["id",{"_index":120,"t":{"4":{"position":[[2616,5],[2819,5],[2974,5],[4961,5],[5219,5],[5950,5]]},"16":{"position":[[488,3]]},"46":{"position":[[161,2],[1726,5],[3136,5]]},"62":{"position":[[349,2],[360,3],[394,2]]},"64":{"position":[[168,2],[456,2],[2693,2],[3311,2],[3477,2],[4108,2]]},"66":{"position":[[163,2],[373,2],[2242,5],[3660,5]]},"71":{"position":[[202,2],[213,3],[247,2]]},"83":{"position":[[3136,2]]},"85":{"position":[[163,2],[300,2],[2001,5],[3377,5]]},"91":{"position":[[162,2],[589,2],[1897,5],[3369,5]]},"95":{"position":[[162,2],[1668,5],[3048,5]]},"103":{"position":[[163,2],[577,2],[2002,5],[3433,5]]},"110":{"position":[[1215,2],[2898,5],[4339,5]]},"114":{"position":[[158,2],[1817,5],[3267,5]]},"143":{"position":[[738,2],[2256,5],[3636,5]]},"149":{"position":[[3359,2],[3371,2],[3505,5]]},"151":{"position":[[2726,5],[2880,5]]},"153":{"position":[[166,2],[2032,5],[2130,5],[3726,5],[3824,5]]},"174":{"position":[[1568,5],[1824,5],[1935,5],[2134,5],[2337,5],[2599,5],[2875,5],[2950,5],[3155,5],[3350,5]]},"176":{"position":[[592,5],[772,5],[976,5],[1144,5],[1330,5],[1541,5],[1804,5],[2006,5],[2204,5],[2407,5],[2611,5],[2814,5]]},"178":{"position":[[2342,5],[2598,5],[2808,5],[3546,5],[3822,5],[4011,5]]},"184":{"position":[[745,5]]},"186":{"position":[[161,2],[1851,5],[3281,5]]},"188":{"position":[[2274,2],[4960,5],[6789,5]]},"196":{"position":[[345,3],[388,3],[432,3],[478,3],[520,2]]},"198":{"position":[[162,2],[402,2],[1822,5],[3262,5]]},"202":{"position":[[163,2],[1674,5],[3006,5]]},"208":{"position":[[162,2],[1833,5],[3190,5]]},"214":{"position":[[160,2],[1785,5],[3157,5]]},"218":{"position":[[253,2],[2164,5],[3541,5]]},"220":{"position":[[523,2],[2383,5],[3793,5]]},"234":{"position":[[159,2],[1948,5],[3270,5]]},"253":{"position":[[159,2],[2005,5],[3336,5]]},"257":{"position":[[170,2],[633,2],[2324,5],[3755,5]]},"261":{"position":[[165,2],[2140,5],[3590,5]]},"265":{"position":[[169,2],[1966,5],[3346,5]]},"269":{"position":[[169,2],[645,2],[2209,5],[3681,5]]},"277":{"position":[[162,2],[2026,5],[3400,5]]},"281":{"position":[[159,2],[1734,5],[3105,5]]},"285":{"position":[[158,2],[1825,5],[3200,5]]},"291":{"position":[[327,2],[2193,5],[3634,5]]},"295":{"position":[[161,2],[1781,5],[3127,5]]},"301":{"position":[[286,2],[2249,5],[3677,5]]},"303":{"position":[[5299,3]]},"305":{"position":[[163,2],[357,2],[1788,5],[3262,5]]},"311":{"position":[[66,2]]},"317":{"position":[[164,2],[1772,5],[3237,5]]},"325":{"position":[[1618,2],[3427,5],[4865,5]]},"329":{"position":[[159,2],[1653,5],[2975,5]]},"333":{"position":[[161,2],[1681,5],[3011,5]]},"341":{"position":[[158,2],[1736,5],[3096,5]]},"343":{"position":[[2184,3],[2495,2],[2914,3]]},"345":{"position":[[159,2],[454,2],[1883,5],[3363,5]]},"349":{"position":[[164,2],[1746,5],[3120,5]]},"427":{"position":[[422,3],[456,2]]},"437":{"position":[[18,2]]},"472":{"position":[[561,2],[619,3]]},"476":{"position":[[1946,3]]},"490":{"position":[[1219,3],[2049,2]]},"507":{"position":[[117,2],[841,2]]},"509":{"position":[[216,3]]},"543":{"position":[[2084,2],[2104,2]]},"621":{"position":[[168,2],[197,2],[310,2],[418,2],[458,2]]},"623":{"position":[[107,2],[319,2],[455,5],[603,2],[770,5],[921,2],[956,2],[1040,3],[1104,2],[1157,2],[1264,2]]}}}],["id/secret",{"_index":2259,"t":{"303":{"position":[[1736,10],[4889,9],[5235,9]]},"557":{"position":[[615,9]]}}}],["id3",{"_index":2372,"t":{"327":{"position":[[1048,3]]},"351":{"position":[[348,3]]}}}],["id3/metdata",{"_index":2302,"t":{"309":{"position":[[152,11]]}}}],["id=\"mbid://4e631558",{"_index":2308,"t":{"309":{"position":[[556,19]]}}}],["idea",{"_index":1675,"t":{"171":{"position":[[192,4]]},"483":{"position":[[2711,4]]}}}],["ideal",{"_index":509,"t":{"18":{"position":[[4066,7]]},"457":{"position":[[3295,8]]},"590":{"position":[[420,7]]}}}],["ident",{"_index":338,"t":{"12":{"position":[[503,9]]}}}],["identifi",{"_index":340,"t":{"12":{"position":[[543,10]]},"16":{"position":[[540,8]]},"136":{"position":[[301,11],[430,10],[1510,10]]},"143":{"position":[[12,10],[431,10],[914,8],[2341,13],[3721,13]]},"145":{"position":[[269,11]]},"184":{"position":[[8,11],[32,10],[256,11],[456,11],[949,11]]},"234":{"position":[[451,8]]},"253":{"position":[[444,8]]},"307":{"position":[[300,10]]},"311":{"position":[[87,10]]},"325":{"position":[[894,13],[1103,13],[1333,13],[1822,8],[3512,13],[4950,13]]},"359":{"position":[[579,8]]},"466":{"position":[[58,8]]},"472":{"position":[[184,8]]},"490":{"position":[[998,11]]},"584":{"position":[[1110,8],[1653,10],[1685,11]]},"621":{"position":[[223,8]]}}}],["idl",{"_index":843,"t":{"54":{"position":[[1593,5]]},"60":{"position":[[433,5],[712,5],[749,4],[859,5],[1079,7]]},"343":{"position":[[5421,4]]}}}],["ie",{"_index":45,"t":{"4":{"position":[[692,2]]},"29":{"position":[[407,2]]},"42":{"position":[[603,2]]},"120":{"position":[[195,2],[811,2],[1117,2]]},"224":{"position":[[3315,2]]},"226":{"position":[[259,2]]},"238":{"position":[[3274,2]]},"343":{"position":[[3558,2]]},"351":{"position":[[418,2],[525,2]]},"365":{"position":[[699,2]]},"412":{"position":[[446,2],[546,2],[611,2]]},"425":{"position":[[2319,2],[2664,2]]},"541":{"position":[[62,3]]},"553":{"position":[[541,3]]},"594":{"position":[[2164,2]]},"599":{"position":[[485,2]]},"614":{"position":[[73,2]]},"621":{"position":[[375,3]]}}}],["if/when",{"_index":1636,"t":{"160":{"position":[[584,7]]},"369":{"position":[[43,7]]}}}],["ignor",{"_index":1571,"t":{"151":{"position":[[1117,8]]},"273":{"position":[[299,8]]},"325":{"position":[[398,8]]},"457":{"position":[[876,8]]},"553":{"position":[[575,6]]},"625":{"position":[[103,6],[1039,6]]},"627":{"position":[[278,6]]}}}],["ii",{"_index":2602,"t":{"369":{"position":[[811,2]]}}}],["imag",{"_index":56,"t":{"4":{"position":[[821,6]]},"14":{"position":[[633,6],[777,6]]},"62":{"position":[[86,6]]},"64":{"position":[[66,5],[109,5],[287,5],[652,7],[1087,5],[3859,5],[4155,6],[4232,5]]},"66":{"position":[[591,5]]},"73":{"position":[[339,6],[351,5],[829,5],[863,5],[1852,6],[2122,6],[7835,6]]},"77":{"position":[[451,6],[721,6]]},"83":{"position":[[66,5],[109,5],[196,5],[511,7],[946,5],[3651,5]]},"85":{"position":[[618,5]]},"174":{"position":[[525,6]]},"178":{"position":[[658,6]]},"188":{"position":[[3541,6]]},"303":{"position":[[3795,6]]},"347":{"position":[[269,6],[589,6]]},"384":{"position":[[633,6]]},"472":{"position":[[1530,6]]},"509":{"position":[[39,6]]},"541":{"position":[[15,6],[90,6]]},"543":{"position":[[2269,6],[2575,6],[2677,6]]},"545":{"position":[[498,6],[1115,6]]},"555":{"position":[[162,6]]},"614":{"position":[[7,5],[210,5],[434,6]]},"616":{"position":[[334,5]]},"633":{"position":[[1282,6],[1666,5]]}}}],["imagin",{"_index":1415,"t":{"125":{"position":[[486,8]]},"130":{"position":[[0,7]]}}}],["imit",{"_index":2064,"t":{"236":{"position":[[303,9]]}}}],["immedi",{"_index":1652,"t":{"166":{"position":[[137,11],[536,11]]},"357":{"position":[[43,11],[281,11]]},"441":{"position":[[1085,11]]},"535":{"position":[[1076,12]]},"599":{"position":[[1014,11]]},"616":{"position":[[199,11]]}}}],["implement",{"_index":315,"t":{"12":{"position":[[16,10]]},"54":{"position":[[383,10]]},"73":{"position":[[9123,15]]},"105":{"position":[[734,11]]},"138":{"position":[[732,11]]},"160":{"position":[[12,11]]},"166":{"position":[[414,14]]},"228":{"position":[[429,9]]},"313":{"position":[[49,10],[516,15]]},"425":{"position":[[1002,9],[1735,9],[2983,9]]},"451":{"position":[[244,15]]},"524":{"position":[[327,14]]},"579":{"position":[[149,11]]},"584":{"position":[[1977,10],[2054,10],[2081,10]]},"592":{"position":[[13,9],[97,9],[1431,9],[2080,9]]},"594":{"position":[[214,10],[569,11],[688,9],[3043,11]]},"597":{"position":[[188,9],[923,10]]},"599":{"position":[[1399,9],[1677,12],[1717,9],[1959,10],[2601,14]]}}}],["import",{"_index":767,"t":{"46":{"position":[[1088,9]]},"66":{"position":[[1585,9]]},"85":{"position":[[1344,9]]},"91":{"position":[[1253,9]]},"95":{"position":[[1026,9]]},"103":{"position":[[1351,9]]},"110":{"position":[[2276,9]]},"114":{"position":[[1144,9]]},"143":{"position":[[1639,9]]},"153":{"position":[[1395,9]]},"186":{"position":[[1158,9]]},"188":{"position":[[514,9],[4291,9]]},"198":{"position":[[1179,9]]},"202":{"position":[[1015,9]]},"208":{"position":[[1188,9]]},"214":{"position":[[1152,9]]},"218":{"position":[[1508,9]]},"220":{"position":[[1492,9]]},"234":{"position":[[1267,9]]},"253":{"position":[[1340,9]]},"257":{"position":[[1414,9]]},"261":{"position":[[1193,9]]},"265":{"position":[[1068,9]]},"269":{"position":[[1309,9]]},"277":{"position":[[1383,9]]},"281":{"position":[[1116,9]]},"285":{"position":[[1137,9]]},"291":{"position":[[1312,9]]},"295":{"position":[[1150,9]]},"301":{"position":[[1621,9]]},"305":{"position":[[1166,9]]},"309":{"position":[[132,9]]},"317":{"position":[[1145,9]]},"325":{"position":[[2554,9]]},"329":{"position":[[1035,9]]},"333":{"position":[[1018,9]]},"341":{"position":[[1089,9]]},"345":{"position":[[1261,9]]},"349":{"position":[[1119,9]]},"559":{"position":[[1740,10]]},"563":{"position":[[878,10]]},"584":{"position":[[227,6],[274,6],[1278,6],[1370,6]]},"586":{"position":[[164,6],[259,6],[305,6]]},"588":{"position":[[301,6]]},"590":{"position":[[179,6],[206,6],[285,6]]},"592":{"position":[[323,6],[1509,6],[1543,6],[2147,6],[2181,6]]},"594":{"position":[[1536,6],[1570,6]]},"597":{"position":[[332,6],[366,6]]},"599":{"position":[[824,6]]},"625":{"position":[[124,9]]},"631":{"position":[[430,9]]}}}],["importantli",{"_index":2650,"t":{"378":{"position":[[874,12]]},"581":{"position":[[165,11]]}}}],["imposs",{"_index":2837,"t":{"451":{"position":[[606,10]]}}}],["improv",{"_index":1084,"t":{"73":{"position":[[9100,7]]},"134":{"position":[[255,7]]},"457":{"position":[[1289,7]]},"486":{"position":[[55,7]]}}}],["inaccess",{"_index":1816,"t":{"188":{"position":[[1436,12]]}}}],["inaccur",{"_index":3022,"t":{"490":{"position":[[1287,10]]}}}],["incentiv",{"_index":2899,"t":{"459":{"position":[[917,12]]},"461":{"position":[[314,12]]}}}],["includ",{"_index":228,"t":{"6":{"position":[[245,8]]},"18":{"position":[[992,7]]},"31":{"position":[[96,8]]},"44":{"position":[[871,7]]},"46":{"position":[[2297,8],[2815,8]]},"66":{"position":[[2808,8],[3328,8]]},"85":{"position":[[2525,8],[3045,8]]},"91":{"position":[[2527,8],[3046,8]]},"95":{"position":[[2208,8],[2727,8]]},"103":{"position":[[2587,8],[3107,8]]},"105":{"position":[[1156,8]]},"110":{"position":[[84,9],[334,7],[3522,8],[4042,8]]},"114":{"position":[[2414,8],[2939,8]]},"138":{"position":[[1154,8]]},"143":{"position":[[166,9],[480,7],[2821,8],[3340,8]]},"149":{"position":[[2738,7]]},"153":{"position":[[513,7],[2903,8],[3426,8]]},"186":{"position":[[2399,8],[2921,8]]},"188":{"position":[[5928,8],[6449,8]]},"194":{"position":[[203,7]]},"198":{"position":[[2421,8],[2940,8]]},"200":{"position":[[196,7],[1805,7],[2072,7]]},"202":{"position":[[2152,8],[2672,8]]},"208":{"position":[[2347,8],[2866,8]]},"214":{"position":[[2320,8],[2837,8]]},"216":{"position":[[307,7],[3091,7],[3316,7]]},"218":{"position":[[2699,8],[3222,8]]},"220":{"position":[[308,7],[2954,8],[3472,8]]},"232":{"position":[[1120,7]]},"234":{"position":[[2406,8],[2930,8]]},"249":{"position":[[545,7]]},"251":{"position":[[1131,7]]},"253":{"position":[[2485,8],[3008,8]]},"257":{"position":[[2909,8],[3429,8]]},"261":{"position":[[2737,8],[3262,8]]},"263":{"position":[[192,7]]},"265":{"position":[[2506,8],[3025,8]]},"269":{"position":[[2839,8],[3358,8]]},"277":{"position":[[2559,8],[3078,8]]},"281":{"position":[[2280,8],[2796,8]]},"285":{"position":[[2323,8],[2845,8]]},"291":{"position":[[125,7],[2817,8],[3337,8]]},"295":{"position":[[2295,8],[2813,8]]},"297":{"position":[[242,9],[425,9],[1574,9],[1962,7]]},"299":{"position":[[92,7]]},"301":{"position":[[2848,8],[3366,8]]},"305":{"position":[[2445,8],[2965,8]]},"317":{"position":[[2418,8],[2939,8]]},"323":{"position":[[126,7]]},"325":{"position":[[4050,8],[4569,8]]},"327":{"position":[[2292,7]]},"329":{"position":[[2150,8],[2666,8]]},"333":{"position":[[2159,8],[2681,8]]},"341":{"position":[[2269,8],[2794,8]]},"343":{"position":[[3652,7]]},"345":{"position":[[2546,8],[3066,8]]},"349":{"position":[[2301,8],[2822,8]]},"382":{"position":[[405,7]]},"419":{"position":[[79,8]]},"451":{"position":[[493,7]]},"457":{"position":[[2692,9],[3268,9]]},"472":{"position":[[154,7]]},"481":{"position":[[1235,8],[1701,8]]},"492":{"position":[[308,7]]},"496":{"position":[[311,7]]},"513":{"position":[[241,7],[353,7]]},"517":{"position":[[294,8],[331,7]]},"520":{"position":[[119,8]]},"524":{"position":[[454,7]]},"571":{"position":[[81,9]]},"610":{"position":[[142,7]]},"618":{"position":[[62,9]]}}}],["inclus",{"_index":648,"t":{"38":{"position":[[214,9]]}}}],["incognito/priv",{"_index":2442,"t":{"343":{"position":[[864,17]]},"441":{"position":[[1050,17]]}}}],["incom",{"_index":1060,"t":{"73":{"position":[[5786,8],[7172,8],[9431,8]]},"599":{"position":[[107,8]]}}}],["inconsist",{"_index":2436,"t":{"343":{"position":[[311,12]]},"457":{"position":[[252,12],[383,13],[660,12],[855,12]]},"490":{"position":[[1451,12]]}}}],["incorrectli",{"_index":1992,"t":{"216":{"position":[[2610,11]]},"327":{"position":[[1983,11]]},"351":{"position":[[489,11]]},"453":{"position":[[51,11]]}}}],["increas",{"_index":2633,"t":{"372":{"position":[[333,8]]},"569":{"position":[[131,9]]}}}],["increment",{"_index":1052,"t":{"73":{"position":[[5107,10]]}}}],["indefinit",{"_index":501,"t":{"18":{"position":[[3810,13]]}}}],["indentical/similar",{"_index":1401,"t":{"120":{"position":[[760,18]]}}}],["independ",{"_index":1284,"t":{"118":{"position":[[979,13]]},"120":{"position":[[954,11]]},"128":{"position":[[113,12]]},"439":{"position":[[697,13]]},"633":{"position":[[1781,11]]}}}],["index.j",{"_index":3249,"t":{"584":{"position":[[327,13]]}}}],["indi",{"_index":2903,"t":{"459":{"position":[[1039,6]]},"461":{"position":[[436,6]]}}}],["indic",{"_index":943,"t":{"66":{"position":[[436,10]]},"85":{"position":[[463,10]]},"168":{"position":[[325,8]]},"315":{"position":[[318,8]]},"439":{"position":[[17,10]]},"597":{"position":[[248,10]]},"599":{"position":[[598,8]]}}}],["individu",{"_index":225,"t":{"4":{"position":[[6264,10]]},"42":{"position":[[108,10],[957,12]]},"297":{"position":[[826,10]]},"367":{"position":[[311,10],[1376,10]]},"384":{"position":[[79,10],[343,10]]},"393":{"position":[[148,10],[350,10]]},"395":{"position":[[76,10]]},"459":{"position":[[1280,11],[1313,10]]},"463":{"position":[[184,11],[217,10]]},"472":{"position":[[110,10],[1234,10]]},"481":{"position":[[69,11]]},"496":{"position":[[499,10]]}}}],["indpend",{"_index":1184,"t":{"105":{"position":[[490,10],[624,10]]},"138":{"position":[[488,10],[622,10]]}}}],["info",{"_index":205,"t":{"4":{"position":[[5450,7],[5674,7]]},"27":{"position":[[771,4],[960,7],[1124,4],[1358,7]]},"190":{"position":[[225,4]]},"275":{"position":[[64,4]]},"309":{"position":[[479,4]]},"421":{"position":[[0,4]]},"425":{"position":[[997,4],[1730,4],[2978,4]]},"427":{"position":[[577,4]]},"435":{"position":[[380,4],[635,4]]},"535":{"position":[[1000,4]]},"565":{"position":[[806,4]]},"592":{"position":[[1867,4],[1936,4]]},"594":{"position":[[1399,4]]},"597":{"position":[[903,4]]},"599":{"position":[[2415,4]]},"616":{"position":[[263,4]]}}}],["inform",{"_index":402,"t":{"16":{"position":[[344,11]]},"33":{"position":[[54,11]]},"64":{"position":[[980,11],[3634,11]]},"83":{"position":[[839,11],[3426,11]]},"105":{"position":[[1827,11]]},"155":{"position":[[40,11]]},"192":{"position":[[65,12]]},"194":{"position":[[671,11]]},"200":{"position":[[127,11],[348,11]]},"216":{"position":[[319,11],[3239,11]]},"297":{"position":[[412,12]]},"303":{"position":[[5266,11]]},"309":{"position":[[375,12]]},"313":{"position":[[574,11]]},"327":{"position":[[1066,11],[1142,11],[1258,11],[1322,11],[1936,11],[2011,11]]},"427":{"position":[[78,11]]},"435":{"position":[[237,11],[1583,12],[2497,11]]},"451":{"position":[[334,11]]},"459":{"position":[[177,11]]},"481":{"position":[[1648,11]]},"551":{"position":[[124,11]]},"565":{"position":[[1525,11]]},"569":{"position":[[553,11]]},"581":{"position":[[531,11],[947,11]]},"594":{"position":[[506,11],[1363,11]]},"597":{"position":[[122,11]]},"602":{"position":[[336,11]]},"616":{"position":[[582,11]]},"635":{"position":[[172,11]]},"637":{"position":[[40,11]]},"639":{"position":[[54,11]]}}}],["ingest",{"_index":3400,"t":{"599":{"position":[[2628,6]]}}}],["ingress",{"_index":529,"t":{"22":{"position":[[40,7],[89,7],[194,7]]},"157":{"position":[[481,7],[565,7],[949,7]]},"160":{"position":[[175,7]]},"166":{"position":[[185,8],[198,7]]},"232":{"position":[[854,7]]},"251":{"position":[[859,7]]},"415":{"position":[[205,7]]},"425":{"position":[[1664,7]]},"435":{"position":[[18,7],[399,9],[424,9],[654,9],[679,9]]},"581":{"position":[[979,7]]},"599":{"position":[[1155,7]]}}}],["inherit",{"_index":2720,"t":{"421":{"position":[[290,10]]},"425":{"position":[[11,7]]},"584":{"position":[[1908,10]]},"594":{"position":[[624,8]]}}}],["init",{"_index":3434,"t":{"616":{"position":[[270,6]]}}}],["initi",{"_index":1780,"t":{"182":{"position":[[1621,8]]},"200":{"position":[[675,8]]},"361":{"position":[[360,9]]},"425":{"position":[[131,11],[2084,14]]},"608":{"position":[[326,7]]}}}],["ink",{"_index":1316,"t":{"118":{"position":[[1719,3],[1776,4]]}}}],["innaccuraci",{"_index":3021,"t":{"490":{"position":[[273,13]]}}}],["input",{"_index":430,"t":{"18":{"position":[[535,5],[741,5],[915,5],[1691,5],[2176,5],[2801,5],[3057,5],[3160,8],[3201,5],[3441,7]]},"120":{"position":[[819,6],[837,6]]},"331":{"position":[[70,7]]},"517":{"position":[[703,8]]}}}],["insecur",{"_index":805,"t":{"50":{"position":[[443,9]]},"73":{"position":[[5494,8],[6880,8],[9139,8]]},"293":{"position":[[1318,9]]},"303":{"position":[[2245,8]]}}}],["insensit",{"_index":260,"t":{"8":{"position":[[1231,11]]},"273":{"position":[[329,12]]},"275":{"position":[[332,12]]},"277":{"position":[[505,11],[615,11],[707,11]]},"299":{"position":[[146,12]]}}}],["insid",{"_index":2671,"t":{"395":{"position":[[69,6]]},"543":{"position":[[503,6]]},"594":{"position":[[1038,6]]},"625":{"position":[[541,6]]}}}],["insight",{"_index":3484,"t":{"633":{"position":[[1473,7]]}}}],["inspect",{"_index":2769,"t":{"431":{"position":[[13,7],[75,7]]}}}],["inspector",{"_index":1538,"t":{"149":{"position":[[1885,9],[1924,10],[2010,10]]}}}],["instal",{"_index":64,"t":{"4":{"position":[[1019,12],[1283,12],[1405,12],[3459,12],[3593,12]]},"8":{"position":[[800,13]]},"73":{"position":[[3360,12],[3402,9],[7326,9],[7345,7]]},"206":{"position":[[510,12]]},"212":{"position":[[502,12]]},"293":{"position":[[517,13]]},"335":{"position":[[6,10]]},"417":{"position":[[48,9],[155,9],[220,7],[416,7]]},"419":{"position":[[209,9],[391,7]]},"528":{"position":[[0,7],[16,7]]},"535":{"position":[[1014,7],[1066,9]]},"537":{"position":[[16,7]]},"543":{"position":[[1154,10]]},"547":{"position":[[6,12]]},"549":{"position":[[66,7],[259,7]]},"551":{"position":[[28,8]]},"557":{"position":[[2204,13],[2252,13]]},"569":{"position":[[50,7],[73,12]]},"573":{"position":[[406,9]]},"608":{"position":[[334,12]]},"633":{"position":[[1261,7]]},"643":{"position":[[8,12]]}}}],["instanc",{"_index":112,"t":{"4":{"position":[[2437,9]]},"14":{"position":[[978,8]]},"44":{"position":[[607,9]]},"73":{"position":[[1055,8],[5137,8]]},"97":{"position":[[197,8]]},"101":{"position":[[43,8],[77,8]]},"103":{"position":[[715,8]]},"112":{"position":[[320,8]]},"174":{"position":[[185,8],[278,8]]},"178":{"position":[[358,8]]},"186":{"position":[[405,8]]},"188":{"position":[[437,8],[1833,8]]},"249":{"position":[[359,8]]},"257":{"position":[[778,8]]},"259":{"position":[[419,9]]},"303":{"position":[[3693,9],[4378,8]]},"307":{"position":[[84,9]]},"393":{"position":[[159,9]]},"397":{"position":[[494,9]]},"435":{"position":[[1232,8]]},"457":{"position":[[984,9]]},"557":{"position":[[2650,9]]},"565":{"position":[[695,9]]},"581":{"position":[[692,8]]}}}],["instead",{"_index":269,"t":{"8":{"position":[[1452,8]]},"57":{"position":[[1036,8]]},"64":{"position":[[3720,7]]},"73":{"position":[[501,7]]},"83":{"position":[[3512,7]]},"97":{"position":[[309,8]]},"110":{"position":[[936,8]]},"130":{"position":[[231,7]]},"149":{"position":[[3128,8]]},"151":{"position":[[591,7]]},"196":{"position":[[1120,7]]},"200":{"position":[[1517,7]]},"206":{"position":[[597,8]]},"212":{"position":[[589,8]]},"222":{"position":[[745,8]]},"275":{"position":[[86,7],[526,7]]},"303":{"position":[[3054,7]]},"313":{"position":[[469,7]]},"347":{"position":[[1206,7]]},"357":{"position":[[1270,8]]},"412":{"position":[[521,7]]},"435":{"position":[[1903,7]]},"476":{"position":[[2841,7],[4416,8]]},"483":{"position":[[544,7]]},"490":{"position":[[1983,8]]},"501":{"position":[[65,7]]},"524":{"position":[[176,7]]},"557":{"position":[[3266,8]]},"592":{"position":[[1881,7]]},"599":{"position":[[1666,7]]}}}],["instruct",{"_index":861,"t":{"57":{"position":[[733,12],[927,12]]},"73":{"position":[[733,13],[1273,12]]},"75":{"position":[[41,12]]},"196":{"position":[[94,12]]},"216":{"position":[[977,12]]},"224":{"position":[[2540,12]]},"238":{"position":[[2525,12]]},"255":{"position":[[219,12]]},"267":{"position":[[334,12]]},"289":{"position":[[17,12]]},"303":{"position":[[2013,12],[4127,13],[4171,12]]},"321":{"position":[[17,12]]},"343":{"position":[[584,12],[1313,12],[1743,12]]},"347":{"position":[[979,12],[1112,13]]},"441":{"position":[[1166,12]]},"535":{"position":[[100,12]]},"557":{"position":[[170,12],[691,12],[783,12]]},"559":{"position":[[228,12]]},"567":{"position":[[80,12]]}}}],["integr",{"_index":794,"t":{"48":{"position":[[175,12]]},"50":{"position":[[8,11]]},"52":{"position":[[13,11],[256,11]]},"54":{"position":[[149,11]]},"68":{"position":[[149,11]]},"71":{"position":[[51,12]]},"73":{"position":[[5,11]]},"81":{"position":[[175,12]]},"194":{"position":[[12,12]]},"216":{"position":[[539,13]]},"271":{"position":[[318,11]]},"343":{"position":[[112,11]]},"449":{"position":[[214,11]]},"451":{"position":[[16,11]]}}}],["intel/amd",{"_index":3095,"t":{"541":{"position":[[40,11]]}}}],["intend",{"_index":2904,"t":{"459":{"position":[[1087,8],[1265,8]]},"463":{"position":[[169,8]]}}}],["intent",{"_index":3026,"t":{"490":{"position":[[1631,11]]}}}],["intention",{"_index":1868,"t":{"194":{"position":[[594,13]]}}}],["interact",{"_index":831,"t":{"54":{"position":[[929,11]]},"224":{"position":[[151,8]]},"238":{"position":[[151,8]]},"425":{"position":[[1514,11],[2278,11],[2722,11]]},"427":{"position":[[676,10]]},"586":{"position":[[861,11]]}}}],["intercept",{"_index":2272,"t":{"303":{"position":[[3555,11]]}}}],["interest",{"_index":2901,"t":{"459":{"position":[[977,10]]},"461":{"position":[[374,10]]},"481":{"position":[[120,10]]}}}],["interfac",{"_index":1923,"t":{"204":{"position":[[81,9]]},"210":{"position":[[76,9]]},"293":{"position":[[20,9],[253,9]]},"327":{"position":[[46,9],[75,10],[210,9],[228,10],[252,9],[341,9],[359,10],[508,9],[594,9],[697,9],[2031,10]]},"421":{"position":[[205,10]]},"423":{"position":[[102,10],[156,9]]},"427":{"position":[[534,10]]},"435":{"position":[[2027,9]]},"437":{"position":[[186,9],[204,9],[488,9]]},"581":{"position":[[117,9]]},"584":{"position":[[28,9],[465,9],[877,9],[975,9],[1164,9],[1195,10],[1967,9]]},"590":{"position":[[441,9],[542,10]]},"633":{"position":[[1017,9]]}}}],["intermedi",{"_index":1573,"t":{"151":{"position":[[1221,12]]}}}],["intern",{"_index":588,"t":{"29":{"position":[[169,8]]},"188":{"position":[[1414,8],[1574,8]]},"303":{"position":[[2332,8]]},"459":{"position":[[1050,13]]},"461":{"position":[[447,13]]},"557":{"position":[[1489,8]]},"586":{"position":[[662,9],[747,9]]},"588":{"position":[[1408,9]]},"599":{"position":[[188,11]]}}}],["internalconfig",{"_index":3278,"t":{"586":{"position":[[314,15],[672,15]]}}}],["internet",{"_index":906,"t":{"64":{"position":[[929,8],[1031,8],[4081,9]]},"73":{"position":[[5858,8],[7244,8],[9503,8]]},"83":{"position":[[788,8],[890,8],[3873,9]]},"335":{"position":[[627,9]]}}}],["interpol",{"_index":230,"t":{"8":{"position":[[58,11],[1243,13],[1706,13]]}}}],["interv",{"_index":549,"t":{"25":{"position":[[266,8]]},"151":{"position":[[444,8]]},"153":{"position":[[2384,11],[4078,11]]},"174":{"position":[[1772,11],[2803,11]]},"178":{"position":[[2546,11],[3750,11]]},"305":{"position":[[2021,11],[3495,11]]},"349":{"position":[[1877,11],[3251,11]]}}}],["intervent",{"_index":3410,"t":{"602":{"position":[[76,13]]}}}],["introduc",{"_index":3447,"t":{"621":{"position":[[10,10]]},"625":{"position":[[394,10]]}}}],["intruct",{"_index":1133,"t":{"93":{"position":[[70,11]]},"565":{"position":[[1828,11]]}}}],["intuit",{"_index":2580,"t":{"365":{"position":[[663,11]]}}}],["invalid",{"_index":2220,"t":{"297":{"position":[[1874,7]]},"343":{"position":[[925,11],[1256,12]]},"441":{"position":[[159,11],[811,10],[1008,11]]}}}],["invari",{"_index":1278,"t":{"118":{"position":[[586,9]]}}}],["invis",{"_index":869,"t":{"60":{"position":[[451,10],[758,9]]}}}],["invok",{"_index":1775,"t":{"182":{"position":[[1079,8],[1138,8]]},"200":{"position":[[1177,8],[1236,8]]},"425":{"position":[[291,7],[1051,6],[1546,7],[1786,6],[3033,6]]}}}],["involv",{"_index":2284,"t":{"303":{"position":[[4929,8]]}}}],["io.github.foxxmd.multiscrobbl",{"_index":3093,"t":{"537":{"position":[[113,31]]}}}],["io.github.foxxmd.multiscrobbler.yml",{"_index":3065,"t":{"530":{"position":[[68,35]]},"535":{"position":[[950,35]]}}}],["ip",{"_index":731,"t":{"44":{"position":[[1633,2]]},"73":{"position":[[5778,4],[7164,4],[9423,4],[9676,2]]},"301":{"position":[[20,2],[452,2]]},"303":{"position":[[2341,3]]},"307":{"position":[[362,2]]},"435":{"position":[[1827,2]]},"543":{"position":[[1255,2],[1292,2]]},"545":{"position":[[189,2]]},"553":{"position":[[197,2]]},"565":{"position":[[1281,2]]}}}],["ip/host",{"_index":1024,"t":{"73":{"position":[[2808,7]]},"79":{"position":[[32,7]]}}}],["ipc",{"_index":993,"t":{"73":{"position":[[1996,3],[3766,3],[3879,4],[3933,3],[4088,4],[4385,3],[4447,3],[4494,4],[4791,3],[4853,3],[4888,4],[5093,3],[5236,3],[5247,3],[5290,3],[5549,3],[6136,3],[6569,3],[6609,3],[6628,3],[6935,3],[7693,3],[7910,3],[7929,3],[8015,3],[8445,3],[8485,3],[8504,3],[9194,3],[9795,3]]},"77":{"position":[[595,3]]}}}],["ipcloc",{"_index":1094,"t":{"85":{"position":[[2075,15],[3451,15]]}}}],["ipv4/v6",{"_index":2152,"t":{"279":{"position":[[167,7]]}}}],["irrelev",{"_index":1529,"t":{"149":{"position":[[1325,10]]}}}],["isn't",{"_index":1204,"t":{"105":{"position":[[1557,5]]},"138":{"position":[[1551,5]]},"459":{"position":[[884,5]]},"461":{"position":[[281,5]]}}}],["iso2",{"_index":2983,"t":{"481":{"position":[[978,4]]}}}],["iso8601",{"_index":3325,"t":{"590":{"position":[[888,7]]}}}],["isol",{"_index":1422,"t":{"130":{"position":[[472,8]]},"134":{"position":[[222,8]]},"612":{"position":[[137,8]]}}}],["isrc",{"_index":1748,"t":{"178":{"position":[[1005,4],[2278,7],[3477,7]]},"472":{"position":[[623,4],[1703,4]]},"476":{"position":[[1645,8],[1787,4],[1829,4],[1834,6],[1875,4],[2032,4],[2052,8]]},"488":{"position":[[1107,8]]},"490":{"position":[[1010,5]]},"501":{"position":[[451,8]]},"507":{"position":[[53,4],[1114,4],[1150,8]]},"559":{"position":[[700,4]]},"561":{"position":[[433,4]]}}}],["isrc\",\"bas",{"_index":3034,"t":{"505":{"position":[[549,16]]},"509":{"position":[[848,16],[1427,16]]}}}],["isrc+bas",{"_index":2927,"t":{"472":{"position":[[499,10]]}}}],["issu",{"_index":3,"t":{"2":{"position":[[34,6]]},"16":{"position":[[377,7]]},"18":{"position":[[1907,5]]},"20":{"position":[[211,5]]},"29":{"position":[[546,6]]},"31":{"position":[[223,6]]},"50":{"position":[[144,6]]},"73":{"position":[[8955,6]]},"87":{"position":[[568,5],[997,6],[1112,5]]},"125":{"position":[[405,7],[562,8]]},"149":{"position":[[2718,6]]},"151":{"position":[[2032,6]]},"194":{"position":[[143,5]]},"216":{"position":[[270,5],[347,5],[381,6],[3198,7],[3379,6]]},"228":{"position":[[387,6]]},"232":{"position":[[873,7],[1106,6],[1149,6]]},"249":{"position":[[580,6]]},"251":{"position":[[878,7],[1117,6],[1160,6]]},"297":{"position":[[1045,6],[2063,6]]},"311":{"position":[[610,6],[898,6],[1375,6]]},"313":{"position":[[156,6]]},"315":{"position":[[985,6]]},"327":{"position":[[2250,5]]},"343":{"position":[[482,6]]},"347":{"position":[[1027,5],[1181,5],[1248,6],[1343,5],[1505,6]]},"435":{"position":[[1317,5],[1407,6]]},"439":{"position":[[38,5],[447,6],[799,5],[1004,5]]},"451":{"position":[[408,6],[633,6]]},"455":{"position":[[20,5]]},"457":{"position":[[1224,7],[1269,6],[1354,6],[2676,5],[3253,5],[3339,6]]},"496":{"position":[[202,6],[279,5],[338,5]]},"513":{"position":[[228,5],[328,6]]},"515":{"position":[[51,6]]},"517":{"position":[[310,5],[355,5],[452,6],[657,5]]},"520":{"position":[[29,5],[46,5],[78,5],[176,7]]},"522":{"position":[[62,6],[120,5]]},"524":{"position":[[20,5],[198,5],[269,5],[368,5],[508,6],[568,5]]},"549":{"position":[[1724,5]]},"649":{"position":[[7,6],[82,6]]}}}],["issue/com",{"_index":3047,"t":{"517":{"position":[[501,13]]}}}],["issue/error",{"_index":3043,"t":{"513":{"position":[[402,11]]}}}],["it'",{"_index":495,"t":{"18":{"position":[[3614,4]]},"105":{"position":[[262,5]]},"118":{"position":[[5205,4]]},"136":{"position":[[470,4],[1273,4],[1393,4]]},"138":{"position":[[260,5]]},"151":{"position":[[995,4]]},"164":{"position":[[657,4]]},"192":{"position":[[425,4]]},"303":{"position":[[4788,4]]},"357":{"position":[[769,4]]},"363":{"position":[[982,4]]},"483":{"position":[[596,4],[1801,4],[2699,4]]},"490":{"position":[[326,4],[1708,4]]},"515":{"position":[[201,4]]},"621":{"position":[[511,4]]}}}],["item",{"_index":2306,"t":{"309":{"position":[[409,4],[451,4]]},"372":{"position":[[380,6]]}}}],["iter",{"_index":461,"t":{"18":{"position":[[1539,9]]}}}],["iterat",{"_index":1047,"t":{"73":{"position":[[4913,10]]}}}],["itself",{"_index":2562,"t":{"361":{"position":[[390,6]]}}}],["i’m",{"_index":2857,"t":{"457":{"position":[[1802,3]]}}}],["japanes",{"_index":3008,"t":{"483":{"position":[[1882,9]]}}}],["javascript",{"_index":2458,"t":{"343":{"position":[[2271,10]]}}}],["javascript'",{"_index":2682,"t":{"397":{"position":[[917,12]]}}}],["jelli",{"_index":3476,"t":{"631":{"position":[[424,5]]}}}],["jellyfin",{"_index":46,"t":{"4":{"position":[[695,8],[1633,8],[5938,11]]},"64":{"position":[[878,9],[2580,10],[2665,10],[3261,8]]},"83":{"position":[[737,9],[2439,10],[2524,10],[3086,8]]},"155":{"position":[[136,9]]},"157":{"position":[[277,8]]},"166":{"position":[[703,9]]},"176":{"position":[[368,8],[623,10],[803,10],[1792,11],[1835,10],[1994,11],[2037,10]]},"188":{"position":[[14,8],[84,8],[428,8],[482,8],[789,8],[1059,8],[1399,8],[1824,8],[2680,8],[3451,8],[3762,8],[3971,8],[4313,8],[4395,8],[4623,8],[5745,8],[5939,8],[6460,8],[7358,10]]},"384":{"position":[[563,8],[881,8],[978,8]]},"472":{"position":[[1460,8],[1927,8],[2018,8]]},"490":{"position":[[1122,9]]},"503":{"position":[[514,8]]},"505":{"position":[[589,8]]},"545":{"position":[[94,8]]},"549":{"position":[[1990,11]]},"553":{"position":[[317,9]]},"557":{"position":[[96,8],[147,8],[370,8],[504,8]]},"559":{"position":[[975,8]]},"563":{"position":[[113,8]]},"599":{"position":[[1207,9],[1603,9]]},"633":{"position":[[213,8]]},"637":{"position":[[192,9]]}}}],["jellyfin.json",{"_index":114,"t":{"4":{"position":[[2520,13],[2572,13],[2775,13]]},"164":{"position":[[183,13]]},"503":{"position":[[536,13]]},"505":{"position":[[611,13]]},"549":{"position":[[404,14]]}}}],["jellyfin/plex",{"_index":2746,"t":{"425":{"position":[[1678,13]]},"581":{"position":[[999,13]]}}}],["jellyfin_apikey",{"_index":1831,"t":{"188":{"position":[[2590,15]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56b",{"_index":60,"t":{"4":{"position":[[900,42]]},"384":{"position":[[744,42]]},"472":{"position":[[1814,42]]},"557":{"position":[[384,42]]}}}],["jellyfin_apikey=c9fae8756fbf481ebd9c5bb56bd6540c",{"_index":3124,"t":{"545":{"position":[[701,48]]},"549":{"position":[[1772,48]]}}}],["jellyfin_devices_allow",{"_index":1834,"t":{"188":{"position":[[2929,22]]}}}],["jellyfin_devices_block",{"_index":1835,"t":{"188":{"position":[[3051,22]]}}}],["jellyfin_en",{"_index":1828,"t":{"188":{"position":[[2371,15]]}}}],["jellyfin_frontend_url_overrid",{"_index":1818,"t":{"188":{"position":[[1628,30],[3396,30]]}}}],["jellyfin_frontend_url_override=https://jellyfin.mydomain.com",{"_index":1824,"t":{"188":{"position":[[1927,60]]}}}],["jellyfin_id",{"_index":1826,"t":{"188":{"position":[[2237,11],[2324,11]]}}}],["jellyfin_id=myjellyfinid",{"_index":3454,"t":{"623":{"position":[[287,24]]},"631":{"position":[[378,24]]}}}],["jellyfin_id=myjellyin",{"_index":62,"t":{"4":{"position":[[968,21]]},"557":{"position":[[515,21]]}}}],["jellyfin_libraries_allow",{"_index":1804,"t":{"188":{"position":[[855,24],[3175,24]]}}}],["jellyfin_libraries_block",{"_index":1836,"t":{"188":{"position":[[3284,24]]}}}],["jellyfin_mediatypes_allow",{"_index":1811,"t":{"188":{"position":[[1152,25],[3564,25]]}}}],["jellyfin_nam",{"_index":1827,"t":{"188":{"position":[[2294,13]]}}}],["jellyfin_name=foxx",{"_index":3475,"t":{"631":{"position":[[405,18]]}}}],["jellyfin_password",{"_index":1830,"t":{"188":{"position":[[2520,17]]}}}],["jellyfin_transforms=musicbrainz",{"_index":2932,"t":{"472":{"position":[[1945,31]]},"559":{"position":[[1126,31]]},"563":{"position":[[264,31]]}}}],["jellyfin_transforms=n",{"_index":2660,"t":{"384":{"position":[[812,26]]}}}],["jellyfin_url",{"_index":1821,"t":{"188":{"position":[[1778,12],[2643,12]]},"623":{"position":[[243,16]]},"631":{"position":[[354,16]]}}}],["jellyfin_url=192.168.0.101:8096",{"_index":3125,"t":{"545":{"position":[[752,31]]},"549":{"position":[[1821,31]]}}}],["jellyfin_url=192.168.0.110:8096",{"_index":59,"t":{"4":{"position":[[866,31]]},"384":{"position":[[710,31]]},"472":{"position":[[1780,31]]},"557":{"position":[[329,31]]}}}],["jellyfin_us",{"_index":1829,"t":{"188":{"position":[[2431,13]]}}}],["jellyfin_user=myus",{"_index":61,"t":{"4":{"position":[[945,20]]},"384":{"position":[[789,20]]},"472":{"position":[[1859,20]]},"545":{"position":[[786,20]]},"549":{"position":[[1853,20]]},"557":{"position":[[464,20]]}}}],["jellyfin_users_allow",{"_index":1802,"t":{"188":{"position":[[652,21],[2710,20]]}}}],["jellyfin_users_block",{"_index":1833,"t":{"188":{"position":[[2844,20]]}}}],["jellyin",{"_index":3453,"t":{"623":{"position":[[270,7]]}}}],["jett",{"_index":1306,"t":{"118":{"position":[[1534,4],[1630,5]]}}}],["jf",{"_index":118,"t":{"4":{"position":[[2604,2],[2807,2],[2962,2],[5919,2]]},"188":{"position":[[4932,2],[6761,2]]}}}],["joan",{"_index":1305,"t":{"118":{"position":[[1529,4],[1625,4]]}}}],["job",{"_index":620,"t":{"31":{"position":[[560,3],[638,4]]}}}],["job_nam",{"_index":624,"t":{"31":{"position":[[656,9]]}}}],["joe",{"_index":1873,"t":{"196":{"position":[[339,3]]}}}],["join",{"_index":2956,"t":{"476":{"position":[[4265,8]]}}}],["joiner",{"_index":1295,"t":{"118":{"position":[[1324,7],[1431,7]]},"376":{"position":[[514,6],[591,6]]},"391":{"position":[[73,7]]}}}],["journal",{"_index":3416,"t":{"604":{"position":[[402,8]]}}}],["journey",{"_index":2543,"t":{"353":{"position":[[100,7]]}}}],["jq0t1mbbkl",{"_index":711,"t":{"44":{"position":[[400,10]]},"565":{"position":[[492,10]]}}}],["jriver",{"_index":1621,"t":{"157":{"position":[[310,6]]},"204":{"position":[[49,6],[125,6]]},"206":{"position":[[27,7],[388,6],[730,7]]},"208":{"position":[[374,6],[663,6],[870,6],[1210,6],[1290,6],[1514,6],[1817,6],[2166,6],[2358,6],[2877,6],[3174,6],[3307,8]]},"633":{"position":[[222,6]]}}}],["jriver.mydomain.com",{"_index":1931,"t":{"206":{"position":[[801,19]]}}}],["jriver_en",{"_index":1938,"t":{"208":{"position":[[255,13]]}}}],["jriver_id",{"_index":1936,"t":{"208":{"position":[[127,9],[210,9]]}}}],["jriver_nam",{"_index":1937,"t":{"208":{"position":[[182,11]]}}}],["jriver_password",{"_index":1941,"t":{"208":{"position":[[483,15]]}}}],["jriver_url",{"_index":1939,"t":{"208":{"position":[[313,10]]}}}],["jriver_us",{"_index":1940,"t":{"208":{"position":[[407,11]]}}}],["json",{"_index":13,"t":{"4":{"position":[[95,4],[127,4],[749,4],[1522,4],[2108,6],[2407,4]]},"8":{"position":[[104,4],[342,4],[914,4],[1293,5]]},"29":{"position":[[494,4]]},"31":{"position":[[909,4]]},"46":{"position":[[875,4],[976,4],[2393,4],[2494,4]]},"66":{"position":[[1372,4],[1473,4],[2906,4],[3007,4]]},"85":{"position":[[1131,4],[1232,4],[2623,4],[2724,4]]},"89":{"position":[[429,4]]},"91":{"position":[[1040,4],[1141,4],[2624,4],[2725,4]]},"95":{"position":[[813,4],[914,4],[2305,4],[2406,4]]},"99":{"position":[[422,4]]},"103":{"position":[[1138,4],[1239,4],[2685,4],[2786,4]]},"105":{"position":[[273,5],[1130,4]]},"110":{"position":[[2063,4],[2164,4],[3620,4],[3721,4]]},"114":{"position":[[931,4],[1032,4],[2517,4],[2618,4]]},"138":{"position":[[271,5],[1128,4]]},"143":{"position":[[1426,4],[1527,4],[2918,4],[3019,4]]},"149":{"position":[[3745,5],[3836,4]]},"153":{"position":[[1182,4],[1283,4],[3004,4],[3105,4]]},"184":{"position":[[506,4]]},"186":{"position":[[945,4],[1046,4],[2499,4],[2600,4]]},"188":{"position":[[4078,4],[4179,4],[6027,4],[6128,4]]},"198":{"position":[[966,4],[1067,4],[2518,4],[2619,4]]},"202":{"position":[[802,4],[903,4],[2250,4],[2351,4]]},"208":{"position":[[975,4],[1076,4],[2444,4],[2545,4]]},"214":{"position":[[939,4],[1040,4],[2415,4],[2516,4]]},"218":{"position":[[1295,4],[1396,4],[2800,4],[2901,4]]},"220":{"position":[[1279,4],[1380,4],[3050,4],[3151,4]]},"234":{"position":[[1054,4],[1155,4],[2508,4],[2609,4]]},"253":{"position":[[1127,4],[1228,4],[2586,4],[2687,4]]},"257":{"position":[[1201,4],[1302,4],[3007,4],[3108,4]]},"261":{"position":[[980,4],[1081,4],[2840,4],[2941,4]]},"265":{"position":[[855,4],[956,4],[2603,4],[2704,4]]},"269":{"position":[[1096,4],[1197,4],[2936,4],[3037,4]]},"277":{"position":[[1170,4],[1271,4],[2656,4],[2757,4]]},"281":{"position":[[903,4],[1004,4],[2374,4],[2475,4]]},"285":{"position":[[924,4],[1025,4],[2423,4],[2524,4]]},"291":{"position":[[1099,4],[1200,4],[2915,4],[3016,4]]},"295":{"position":[[937,4],[1038,4],[2391,4],[2492,4]]},"301":{"position":[[1408,4],[1509,4],[2944,4],[3045,4]]},"305":{"position":[[953,4],[1054,4],[2543,4],[2644,4]]},"317":{"position":[[932,4],[1033,4],[2517,4],[2618,4]]},"325":{"position":[[2341,4],[2442,4],[4147,4],[4248,4]]},"329":{"position":[[822,4],[923,4],[2244,4],[2345,4]]},"333":{"position":[[805,4],[906,4],[2259,4],[2360,4]]},"341":{"position":[[876,4],[977,4],[2372,4],[2473,4]]},"345":{"position":[[1048,4],[1149,4],[2644,4],[2745,4]]},"349":{"position":[[906,4],[1007,4],[2400,4],[2501,4]]},"444":{"position":[[291,4]]},"517":{"position":[[693,7]]},"592":{"position":[[2539,4]]},"633":{"position":[[1256,4]]}}}],["jsonlint",{"_index":2831,"t":{"444":{"position":[[388,8]]}}}],["jtrnwqwd__xmjf8st3jc",{"_index":1712,"t":{"174":{"position":[[1993,23],[3008,23]]},"176":{"position":[[1058,23],[2288,23]]}}}],["jwt",{"_index":1499,"t":{"149":{"position":[[74,6],[2632,3],[2818,4],[2950,4],[3149,4]]},"153":{"position":[[2282,3],[3976,3]]}}}],["kadhja",{"_index":1317,"t":{"118":{"position":[[1725,6],[1781,6]]}}}],["kasm",{"_index":960,"t":{"73":{"position":[[280,4],[2451,4],[2498,4],[2548,4]]},"77":{"position":[[1050,4],[1097,4],[1147,4]]}}}],["kasm_config",{"_index":1022,"t":{"73":{"position":[[2698,12],[2717,11]]},"77":{"position":[[1297,12],[1316,11]]}}}],["kasm_config:/home/kasm",{"_index":1006,"t":{"73":{"position":[[2349,22]]},"77":{"position":[[948,22]]}}}],["kasm_run",{"_index":1021,"t":{"73":{"position":[[2673,9],[2689,8]]},"77":{"position":[[1272,9],[1288,8]]}}}],["kasm_run:/run",{"_index":994,"t":{"73":{"position":[[2036,13]]},"77":{"position":[[635,13]]}}}],["kasm_run:/run/user/1000",{"_index":1005,"t":{"73":{"position":[[2323,23]]},"77":{"position":[[922,23]]}}}],["kasm_us",{"_index":1026,"t":{"73":{"position":[[2925,9]]},"79":{"position":[[149,9]]}}}],["kasmcord",{"_index":995,"t":{"73":{"position":[[2087,9],[2113,8],[2880,8]]},"77":{"position":[[686,9],[712,8]]},"79":{"position":[[104,8]]}}}],["kasmweb/discord",{"_index":986,"t":{"73":{"position":[[1430,15]]},"77":{"position":[[29,15]]}}}],["kasmweb/discord:1.14.0",{"_index":997,"t":{"73":{"position":[[2129,22]]},"77":{"position":[[728,22]]}}}],["keep",{"_index":231,"t":{"8":{"position":[[150,4]]},"46":{"position":[[966,5],[2484,5]]},"66":{"position":[[1463,5],[2997,5]]},"85":{"position":[[1222,5],[2714,5]]},"87":{"position":[[1374,4]]},"91":{"position":[[1131,5],[2715,5]]},"95":{"position":[[904,5],[2396,5]]},"103":{"position":[[1229,5],[2776,5]]},"110":{"position":[[2154,5],[3711,5]]},"114":{"position":[[1022,5],[2608,5]]},"143":{"position":[[1517,5],[3009,5]]},"151":{"position":[[427,4]]},"153":{"position":[[1273,5],[3095,5]]},"160":{"position":[[905,5]]},"186":{"position":[[1036,5],[2590,5]]},"188":{"position":[[4169,5],[6118,5]]},"198":{"position":[[1057,5],[2609,5]]},"202":{"position":[[893,5],[2341,5]]},"208":{"position":[[1066,5],[2535,5]]},"214":{"position":[[1030,5],[2506,5]]},"218":{"position":[[1386,5],[2891,5]]},"220":{"position":[[1370,5],[3141,5]]},"234":{"position":[[1145,5],[2599,5]]},"253":{"position":[[1218,5],[2677,5]]},"257":{"position":[[1292,5],[3098,5]]},"261":{"position":[[1071,5],[2931,5]]},"265":{"position":[[946,5],[2694,5]]},"269":{"position":[[1187,5],[3027,5]]},"277":{"position":[[1261,5],[2747,5]]},"281":{"position":[[994,5],[2465,5]]},"285":{"position":[[1015,5],[2514,5]]},"291":{"position":[[1190,5],[3006,5]]},"295":{"position":[[1028,5],[2482,5]]},"301":{"position":[[1499,5],[3035,5]]},"305":{"position":[[1044,5],[2634,5]]},"317":{"position":[[1023,5],[2608,5]]},"325":{"position":[[2432,5],[4238,5]]},"329":{"position":[[913,5],[2335,5]]},"333":{"position":[[896,5],[2350,5]]},"341":{"position":[[967,5],[2463,5]]},"343":{"position":[[1567,4]]},"345":{"position":[[1139,5],[2735,5]]},"349":{"position":[[997,5],[2491,5]]},"357":{"position":[[565,4]]},"391":{"position":[[127,4]]},"441":{"position":[[721,4]]},"476":{"position":[[6629,4]]},"483":{"position":[[2719,4]]},"594":{"position":[[298,4]]},"599":{"position":[[2235,5]]},"623":{"position":[[1172,4]]},"633":{"position":[[2351,4],[2735,4]]}}}],["key",{"_index":258,"t":{"8":{"position":[[1217,4]]},"27":{"position":[[1724,7]]},"44":{"position":[[171,3],[255,4],[273,3],[311,3],[355,3]]},"87":{"position":[[1483,3]]},"91":{"position":[[339,3]]},"93":{"position":[[388,4],[452,3],[484,3],[537,3]]},"95":{"position":[[379,3]]},"97":{"position":[[249,4]]},"110":{"position":[[521,4],[820,6],[945,4],[1392,3]]},"149":{"position":[[401,3],[549,3],[663,3],[3060,4],[3230,4],[3290,4],[3340,4],[3355,3],[3496,6],[3575,3],[3629,3]]},"153":{"position":[[2121,6],[2200,3],[2254,3],[3815,6],[3894,3],[3948,3]]},"186":{"position":[[435,3]]},"188":{"position":[[53,3],[158,4],[251,3],[306,3],[376,3],[2617,3]]},"230":{"position":[[214,3]]},"234":{"position":[[590,3]]},"265":{"position":[[421,3]]},"269":{"position":[[374,3]]},"291":{"position":[[532,3]]},"327":{"position":[[907,4]]},"349":{"position":[[454,3],[472,3]]},"384":{"position":[[324,5]]},"423":{"position":[[326,5]]},"472":{"position":[[1215,5]]},"557":{"position":[[205,4],[433,3],[3551,3]]},"565":{"position":[[263,3],[347,4],[365,3],[403,3],[447,3],[2146,4],[2213,3],[2245,3]]},"623":{"position":[[75,3]]},"627":{"position":[[752,3]]},"629":{"position":[[47,4]]}}}],["key/secret",{"_index":1157,"t":{"97":{"position":[[341,10]]}}}],["keys/environment",{"_index":279,"t":{"8":{"position":[[1720,18]]}}}],["keyword",{"_index":913,"t":{"64":{"position":[[1311,8]]},"83":{"position":[[1170,8]]},"325":{"position":[[502,7]]}}}],["kfa",{"_index":2482,"t":{"343":{"position":[[5125,3]]}}}],["kind",{"_index":1638,"t":{"160":{"position":[[697,4]]},"335":{"position":[[762,4]]},"492":{"position":[[82,5]]}}}],["kitchensink",{"_index":104,"t":{"4":{"position":[[2224,11],[4188,11]]},"569":{"position":[[437,11]]}}}],["know",{"_index":1201,"t":{"105":{"position":[[1363,5]]},"110":{"position":[[303,4]]},"118":{"position":[[2779,5]]},"138":{"position":[[1357,5]]},"143":{"position":[[406,4]]},"151":{"position":[[1536,7]]},"216":{"position":[[1804,4]]},"476":{"position":[[6291,4]]},"490":{"position":[[1049,4]]},"494":{"position":[[62,4]]},"586":{"position":[[524,4]]},"599":{"position":[[2986,4]]},"625":{"position":[[1030,5]]},"633":{"position":[[2012,7]]}}}],["knower",{"_index":2856,"t":{"457":{"position":[[1793,6]]}}}],["known",{"_index":900,"t":{"64":{"position":[[543,5],[1154,5],[1736,5],[1823,5],[1902,5],[2013,5],[2152,5],[2426,5]]},"83":{"position":[[402,5],[1013,5],[1595,5],[1682,5],[1761,5],[1872,5],[2011,5],[2285,5]]},"105":{"position":[[1204,5]]},"118":{"position":[[2472,5],[2936,5]]},"138":{"position":[[1202,5]]},"313":{"position":[[150,5]]},"393":{"position":[[203,5]]},"425":{"position":[[3185,5]]},"520":{"position":[[40,5]]}}}],["kodi",{"_index":1622,"t":{"157":{"position":[[341,4]]},"210":{"position":[[49,4],[119,4]]},"212":{"position":[[27,5],[384,4],[722,5]]},"214":{"position":[[362,4],[631,4],[836,4],[1174,4],[1252,4],[1472,4],[1771,4],[2141,4],[2331,4],[2848,4],[3143,4],[3297,6]]},"633":{"position":[[229,4]]}}}],["kodi.mydomain.com",{"_index":1948,"t":{"212":{"position":[[789,17]]}}}],["kodi_en",{"_index":1955,"t":{"214":{"position":[[249,11]]}}}],["kodi_id",{"_index":1953,"t":{"214":{"position":[[127,7],[206,7]]}}}],["kodi_nam",{"_index":1954,"t":{"214":{"position":[[180,9]]}}}],["kodi_password",{"_index":1958,"t":{"214":{"position":[[460,13]]}}}],["kodi_url",{"_index":1956,"t":{"214":{"position":[[305,8]]}}}],["kodi_us",{"_index":1957,"t":{"214":{"position":[[393,9]]}}}],["koito",{"_index":48,"t":{"4":{"position":[[707,6]]},"35":{"position":[[63,5]]},"44":{"position":[[54,5],[77,5],[100,5],[185,5],[429,5],[486,5],[535,5],[708,5],[761,5],[802,5],[898,5],[1475,5],[1580,5],[1682,5]]},"46":{"position":[[338,5],[565,5],[771,5],[1110,5],[1189,5],[1411,5],[1708,6],[2117,5],[2308,5],[2826,5],[3118,6],[3311,7]]},"123":{"position":[[294,5],[360,6]]},"125":{"position":[[420,5]]},"132":{"position":[[470,5]]},"136":{"position":[[936,5],[1097,5],[1322,5]]},"157":{"position":[[370,5]]},"160":{"position":[[1111,6]]},"174":{"position":[[417,5],[1313,5],[2368,7],[3341,8],[3381,7]]},"176":{"position":[[510,5],[1572,7],[2805,8],[2845,7]]},"220":{"position":[[23,5],[147,5],[170,5],[193,5],[728,5],[969,5],[1175,5],[1514,5],[1593,5],[1780,5],[1918,5],[1978,5],[2068,5],[2365,6],[2774,5],[2965,5],[3483,5],[3775,6],[3968,7]]},"494":{"position":[[310,7]]},"503":{"position":[[204,7]]},"553":{"position":[[435,5]]},"565":{"position":[[163,5],[192,5],[277,5],[521,5],[574,5],[623,5],[1123,5],[1228,5],[1330,5]]},"621":{"position":[[383,5]]},"623":{"position":[[207,5],[414,6],[712,6],[761,8]]},"631":{"position":[[123,6]]},"633":{"position":[[234,5],[610,5]]},"639":{"position":[[125,6]]}}}],["koito.json",{"_index":116,"t":{"4":{"position":[[2546,10]]},"623":{"position":[[391,10]]}}}],["koito.mydomain.com",{"_index":735,"t":{"44":{"position":[[1698,19]]},"565":{"position":[[1346,19]]}}}],["koito_allowed_host",{"_index":729,"t":{"44":{"position":[[1538,19]]},"565":{"position":[[1186,19]]}}}],["koito_en",{"_index":743,"t":{"46":{"position":[[252,12]]}}}],["koito_id",{"_index":737,"t":{"46":{"position":[[127,8],[208,8]]}}}],["koito_id=foxxkoi",{"_index":1699,"t":{"174":{"position":[[1321,16]]}}}],["koito_id=mykoito",{"_index":3198,"t":{"565":{"position":[[1098,16]]}}}],["koito_id=mykoitoid",{"_index":3452,"t":{"623":{"position":[[222,18]]},"631":{"position":[[312,18]]}}}],["koito_nam",{"_index":740,"t":{"46":{"position":[[181,10]]}}}],["koito_name=koito",{"_index":3474,"t":{"631":{"position":[[333,16]]}}}],["koito_token",{"_index":744,"t":{"46":{"position":[[351,11]]}}}],["koito_token=029b081ba",{"_index":1700,"t":{"174":{"position":[[1340,21]]}}}],["koito_token=mytoken",{"_index":3195,"t":{"565":{"position":[[1038,19]]}}}],["koito_url",{"_index":717,"t":{"44":{"position":[[662,9],[986,9]]},"46":{"position":[[309,9]]}}}],["koito_url=http://192.168.0.100:4110",{"_index":1702,"t":{"174":{"position":[[1411,35]]}}}],["koito_url=myurl",{"_index":3197,"t":{"565":{"position":[[1080,15]]}}}],["koito_us",{"_index":713,"t":{"44":{"position":[[459,11]]},"46":{"position":[[410,10]]}}}],["koito_user=admin",{"_index":1701,"t":{"174":{"position":[[1392,16]]}}}],["koito_user=myus",{"_index":3196,"t":{"565":{"position":[[1060,17]]}}}],["kotio_token",{"_index":3451,"t":{"623":{"position":[[181,15]]},"631":{"position":[[288,15]]}}}],["krystian",{"_index":1351,"t":{"118":{"position":[[3893,8],[4332,8]]}}}],["label",{"_index":1525,"t":{"149":{"position":[[1272,6],[1345,6],[1372,6],[1454,6],[1618,6],[2082,6],[2109,6],[2176,6],[2325,6]]},"188":{"position":[[818,8],[976,8]]},"307":{"position":[[1454,8]]},"616":{"position":[[381,5]]}}}],["lack",{"_index":852,"t":{"57":{"position":[[448,4]]}}}],["lan",{"_index":904,"t":{"64":{"position":[[874,3]]},"83":{"position":[[733,3]]}}}],["land",{"_index":548,"t":{"25":{"position":[[238,7]]}}}],["languag",{"_index":2891,"t":{"459":{"position":[[707,10]]},"461":{"position":[[104,10]]}}}],["laptop",{"_index":2432,"t":{"341":{"position":[[1777,8],[3137,8]]}}}],["larg",{"_index":975,"t":{"73":{"position":[[887,5]]},"459":{"position":[[1107,5]]},"463":{"position":[[11,5]]},"488":{"position":[[355,5]]}}}],["larger",{"_index":363,"t":{"14":{"position":[[78,6]]},"46":{"position":[[1533,6],[2929,6]]},"66":{"position":[[2038,6],[3444,6]]},"85":{"position":[[1797,6],[3161,6]]},"91":{"position":[[1702,6],[3161,6]]},"95":{"position":[[1475,6],[2842,6]]},"103":{"position":[[1804,6],[3223,6]]},"110":{"position":[[2729,6],[4158,6]]},"114":{"position":[[1617,6],[3060,6]]},"143":{"position":[[2088,6],[3455,6]]},"153":{"position":[[1860,6],[3545,6]]},"186":{"position":[[1619,6],[3039,6]]},"188":{"position":[[4748,6],[6566,6]]},"198":{"position":[[1628,6],[3055,6]]},"202":{"position":[[1468,6],[2788,6]]},"208":{"position":[[1637,6],[2981,6]]},"214":{"position":[[1593,6],[2950,6]]},"218":{"position":[[1973,6],[3341,6]]},"220":{"position":[[2190,6],[3586,6]]},"234":{"position":[[1736,6],[3050,6]]},"253":{"position":[[1805,6],[3127,6]]},"257":{"position":[[2126,6],[3545,6]]},"261":{"position":[[1940,6],[3383,6]]},"265":{"position":[[1773,6],[3140,6]]},"269":{"position":[[2014,6],[3473,6]]},"277":{"position":[[1832,6],[3193,6]]},"281":{"position":[[1553,6],[2908,6]]},"285":{"position":[[1598,6],[2963,6]]},"291":{"position":[[2024,6],[3453,6]]},"295":{"position":[[1595,6],[2927,6]]},"301":{"position":[[2066,6],[3480,6]]},"305":{"position":[[1619,6],[3081,6]]},"317":{"position":[[1602,6],[3056,6]]},"325":{"position":[[3259,6],[4684,6]]},"329":{"position":[[1472,6],[2778,6]]},"333":{"position":[[1479,6],[2799,6]]},"341":{"position":[[1562,6],[2915,6]]},"345":{"position":[[1714,6],[3182,6]]},"349":{"position":[[1576,6],[2939,6]]}}}],["largest",{"_index":2910,"t":{"459":{"position":[[1486,7]]},"463":{"position":[[390,7]]}}}],["last",{"_index":1404,"t":{"120":{"position":[[1146,4]]},"325":{"position":[[1191,9]]},"369":{"position":[[192,4]]},"457":{"position":[[1760,4]]},"488":{"position":[[1072,4]]}}}],["last.fm",{"_index":87,"t":{"4":{"position":[[1612,7]]},"8":{"position":[[176,7],[489,7]]},"25":{"position":[[339,7]]},"33":{"position":[[133,8]]},"35":{"position":[[27,7]]},"87":{"position":[[92,7],[181,8],[199,7],[243,7],[431,7],[518,7],[684,7],[728,7],[1210,7],[1237,7]]},"105":{"position":[[1588,7]]},"120":{"position":[[216,7],[256,7]]},"123":{"position":[[112,7],[447,8],[521,7]]},"125":{"position":[[232,7],[305,7],[502,7]]},"130":{"position":[[71,8],[189,7],[257,7],[360,7]]},"132":{"position":[[373,7],[412,7]]},"136":{"position":[[0,7],[417,7],[664,7],[720,7],[981,7],[1384,8]]},"138":{"position":[[1582,7]]},"157":{"position":[[399,7],[462,7]]},"160":{"position":[[1122,7]]},"166":{"position":[[99,8]]},"174":{"position":[[399,7]]},"176":{"position":[[482,7]]},"178":{"position":[[558,7]]},"222":{"position":[[97,7],[139,8],[157,7],[220,7],[246,7],[336,7],[357,7],[380,7]]},"224":{"position":[[430,7],[1354,7],[1390,7],[1693,7],[1733,7],[2135,7],[2287,7],[3307,7]]},"226":{"position":[[21,7],[84,7],[184,7],[246,7]]},"228":{"position":[[142,7]]},"230":{"position":[[261,7],[766,7],[859,7]]},"232":{"position":[[497,7],[1018,7]]},"267":{"position":[[26,7],[157,7],[246,8],[264,7],[379,7]]},"325":{"position":[[1019,8],[3630,9],[5068,9]]},"449":{"position":[[28,7],[86,7],[206,7]]},"490":{"position":[[516,8],[546,7],[1432,7],[1440,7],[1675,7],[1805,7]]},"507":{"position":[[0,7],[186,8]]},"553":{"position":[[351,7]]},"557":{"position":[[128,7],[3163,7],[3320,7],[3341,7],[3420,8],[4014,7]]},"559":{"position":[[1007,7]]},"563":{"position":[[145,7]]},"565":{"position":[[169,7],[1397,8]]},"594":{"position":[[152,7]]},"599":{"position":[[296,8],[548,9]]},"633":{"position":[[240,7],[257,7],[616,7],[2610,7],[2858,7]]},"639":{"position":[[132,8]]},"647":{"position":[[267,7]]}}}],["last.fm'",{"_index":1658,"t":{"166":{"position":[[1332,9]]}}}],["last.fm/libre.fm",{"_index":1096,"t":{"87":{"position":[[58,16]]},"89":{"position":[[412,16]]},"91":{"position":[[358,16],[426,16]]},"267":{"position":[[130,17]]},"269":{"position":[[393,16],[468,16]]}}}],["last.fm/listenbrainz",{"_index":3491,"t":{"633":{"position":[[2544,21]]}}}],["lastfm",{"_index":287,"t":{"10":{"position":[[112,6],[494,6],[591,6]]},"91":{"position":[[728,6],[935,6],[1275,6],[1355,6],[1579,6],[2346,6],[2538,6],[3057,6],[3602,8]]},"174":{"position":[[1162,6],[2162,8],[3145,9],[3183,8]]},"176":{"position":[[1176,8],[1362,8],[2397,9],[2439,8],[2601,9],[2643,8]]},"178":{"position":[[1464,6],[2836,8],[4001,9],[4039,8]]},"224":{"position":[[836,6],[1591,6]]},"228":{"position":[[31,6],[466,6]]},"230":{"position":[[36,6]]},"269":{"position":[[784,6],[991,6],[1331,6],[1411,6],[1600,6],[1739,6],[1800,6],[1891,6],[2658,6],[2850,6],[3369,6],[3914,8]]},"369":{"position":[[684,7]]},"553":{"position":[[412,7]]}}}],["lastfm.json",{"_index":115,"t":{"4":{"position":[[2534,11]]},"8":{"position":[[510,11],[946,11]]},"151":{"position":[[2837,11]]},"355":{"position":[[367,11]]},"357":{"position":[[1338,11]]},"399":{"position":[[62,11]]},"507":{"position":[[622,11]]},"559":{"position":[[1588,11]]},"563":{"position":[[726,11]]}}}],["lastfm_api_key",{"_index":1126,"t":{"91":{"position":[[313,14]]}}}],["lastfm_api_key=myapikey",{"_index":1696,"t":{"174":{"position":[[1189,23]]},"178":{"position":[[1491,23]]},"565":{"position":[[1682,23]]}}}],["lastfm_en",{"_index":1125,"t":{"91":{"position":[[255,13]]}}}],["lastfm_id",{"_index":1123,"t":{"91":{"position":[[127,9],[210,9]]}}}],["lastfm_id=mylfm",{"_index":1695,"t":{"174":{"position":[[1171,15]]},"178":{"position":[[1473,15]]}}}],["lastfm_id=mylfmcli",{"_index":3200,"t":{"565":{"position":[[1736,21]]}}}],["lastfm_nam",{"_index":1124,"t":{"91":{"position":[[182,11]]}}}],["lastfm_redirect_uri",{"_index":1121,"t":{"89":{"position":[[372,20]]},"91":{"position":[[451,19]]}}}],["lastfm_redirect_uri=https://multiscrobbler.example.com/lastfm/callback",{"_index":1698,"t":{"174":{"position":[[1240,70]]},"178":{"position":[[1542,70]]}}}],["lastfm_secret",{"_index":1127,"t":{"91":{"position":[[383,13]]}}}],["lastfm_secret=myapisecret",{"_index":3199,"t":{"565":{"position":[[1708,25]]}}}],["lastfm_secret=mysecret",{"_index":1697,"t":{"174":{"position":[[1215,22]]},"178":{"position":[[1517,22]]}}}],["lastfm_sess",{"_index":1129,"t":{"91":{"position":[[550,14]]}}}],["later",{"_index":2556,"t":{"357":{"position":[[672,5],[898,5]]},"557":{"position":[[1114,6],[3892,6]]},"623":{"position":[[1107,6]]}}}],["latest",{"_index":1087,"t":{"73":{"position":[[9605,6]]},"549":{"position":[[42,6]]},"608":{"position":[[385,6]]},"612":{"position":[[212,6]]},"614":{"position":[[36,7],[51,6],[83,6],[123,7],[146,7],[173,6]]},"633":{"position":[[1627,6]]}}}],["latest_release_tag",{"_index":3133,"t":{"549":{"position":[[121,20]]}}}],["launch",{"_index":2716,"t":{"419":{"position":[[98,6]]}}}],["layer",{"_index":1188,"t":{"105":{"position":[[545,5],[721,5]]},"138":{"position":[[543,5],[719,5]]}}}],["lead",{"_index":2959,"t":{"476":{"position":[[6233,4]]}}}],["learn",{"_index":669,"t":{"38":{"position":[[716,5]]},"118":{"position":[[5316,5]]},"287":{"position":[[264,5]]},"319":{"position":[[343,5]]},"569":{"position":[[208,5],[381,5]]}}}],["leav",{"_index":270,"t":{"8":{"position":[[1469,5]]},"343":{"position":[[2251,5],[2387,5]]}}}],["left",{"_index":705,"t":{"44":{"position":[[237,4]]},"147":{"position":[[344,4]]},"149":{"position":[[1205,5],[1993,4]]},"327":{"position":[[136,4]]},"565":{"position":[[329,4]]},"616":{"position":[[161,4]]}}}],["length",{"_index":1663,"t":{"166":{"position":[[1653,6]]},"180":{"position":[[62,6]]},"200":{"position":[[1415,7]]},"303":{"position":[[258,6]]},"315":{"position":[[743,6],[756,6]]},"331":{"position":[[140,7]]},"363":{"position":[[570,7]]}}}],["less",{"_index":508,"t":{"18":{"position":[[4030,4],[4074,5]]},"50":{"position":[[456,4]]},"118":{"position":[[2425,5],[2458,4],[2576,5]]},"216":{"position":[[489,4]]},"315":{"position":[[438,4]]},"490":{"position":[[1385,4]]},"594":{"position":[[1434,4]]}}}],["let",{"_index":755,"t":{"46":{"position":[[857,4],[2375,4]]},"66":{"position":[[1354,4],[2888,4]]},"85":{"position":[[1113,4],[2605,4]]},"91":{"position":[[1022,4],[2606,4]]},"95":{"position":[[795,4],[2287,4]]},"103":{"position":[[1120,4],[2667,4]]},"110":{"position":[[2045,4],[3602,4]]},"114":{"position":[[913,4],[2499,4]]},"143":{"position":[[1408,4],[2900,4]]},"153":{"position":[[1164,4],[2986,4]]},"186":{"position":[[927,4],[2481,4]]},"188":{"position":[[4060,4],[6009,4]]},"198":{"position":[[948,4],[2500,4]]},"202":{"position":[[784,4],[2232,4]]},"208":{"position":[[957,4],[2426,4]]},"214":{"position":[[921,4],[2397,4]]},"218":{"position":[[1277,4],[2782,4]]},"220":{"position":[[1261,4],[3032,4]]},"234":{"position":[[1036,4],[2490,4]]},"253":{"position":[[1109,4],[2568,4]]},"257":{"position":[[1183,4],[2989,4]]},"261":{"position":[[962,4],[2822,4]]},"265":{"position":[[837,4],[2585,4]]},"269":{"position":[[1078,4],[2918,4]]},"277":{"position":[[1152,4],[2638,4]]},"281":{"position":[[885,4],[2356,4]]},"285":{"position":[[906,4],[2405,4]]},"291":{"position":[[1081,4],[2897,4]]},"295":{"position":[[919,4],[2373,4]]},"301":{"position":[[1390,4],[2926,4]]},"305":{"position":[[935,4],[2525,4]]},"317":{"position":[[914,4],[2499,4]]},"325":{"position":[[2323,4],[4129,4]]},"329":{"position":[[804,4],[2226,4]]},"333":{"position":[[787,4],[2241,4]]},"341":{"position":[[858,4],[2354,4]]},"345":{"position":[[1030,4],[2626,4]]},"349":{"position":[[888,4],[2382,4]]}}}],["let'",{"_index":2541,"t":{"353":{"position":[[7,5]]}}}],["level",{"_index":272,"t":{"8":{"position":[[1516,6]]},"22":{"position":[[351,5]]},"27":{"position":[[261,5]]},"38":{"position":[[629,5]]},"118":{"position":[[2216,6]]},"297":{"position":[[1917,5]]},"361":{"position":[[79,5]]},"365":{"position":[[543,5]]},"488":{"position":[[227,5]]},"513":{"position":[[158,6],[272,5]]},"623":{"position":[[333,5],[617,5]]}}}],["levenshtein",{"_index":1285,"t":{"118":{"position":[[1008,11]]}}}],["leverag",{"_index":2945,"t":{"476":{"position":[[2487,8]]}}}],["lewi",{"_index":1302,"t":{"118":{"position":[[1488,6],[1594,6]]}}}],["lfm",{"_index":1132,"t":{"91":{"position":[[1884,3],[3356,3]]},"136":{"position":[[896,3]]},"151":{"position":[[2867,3]]},"224":{"position":[[241,3],[291,3],[2592,3]]},"234":{"position":[[539,3],[611,3],[1917,4],[3239,4]]},"269":{"position":[[2196,3],[3668,3]]}}}],["lfm/lz",{"_index":3105,"t":{"543":{"position":[[891,6]]}}}],["lfm_api_key",{"_index":2059,"t":{"234":{"position":[[560,11]]}}}],["lfm_enabl",{"_index":2056,"t":{"234":{"position":[[246,10]]},"629":{"position":[[125,10]]}}}],["lfm_id",{"_index":2054,"t":{"234":{"position":[[127,6],[204,6]]}}}],["lfm_name",{"_index":2055,"t":{"234":{"position":[[179,8]]}}}],["lfm_slug",{"_index":2057,"t":{"234":{"position":[[301,8]]}}}],["lfm_usernam",{"_index":2058,"t":{"234":{"position":[[486,12]]}}}],["lfmendpoint_en",{"_index":3472,"t":{"629":{"position":[[103,18]]}}}],["libr",{"_index":1175,"t":{"103":{"position":[[1987,5],[3418,5]]},"257":{"position":[[2309,5],[3740,5]]}}}],["librari",{"_index":931,"t":{"64":{"position":[[3348,8]]},"83":{"position":[[3173,8]]},"174":{"position":[[334,7]]},"188":{"position":[[798,9],[950,7],[3224,7],[3335,7]]},"204":{"position":[[209,10]]},"297":{"position":[[1548,7],[1947,7]]},"307":{"position":[[1346,9],[1435,9]]},"309":{"position":[[51,7]]},"311":{"position":[[268,7]]},"343":{"position":[[1476,7]]},"441":{"position":[[583,7]]},"457":{"position":[[2997,7]]},"557":{"position":[[3052,7]]}}}],["librariesallow",{"_index":1715,"t":{"174":{"position":[[2071,17],[3086,17]]},"188":{"position":[[837,14],[5245,17],[7074,17]]},"307":{"position":[[1473,14]]}}}],["librariesblock",{"_index":1846,"t":{"188":{"position":[[5280,17],[7109,17]]}}}],["library/appl",{"_index":3145,"t":{"549":{"position":[[1181,21]]}}}],["library/preferences/multi",{"_index":3144,"t":{"549":{"position":[[1135,27]]}}}],["libre.fm",{"_index":642,"t":{"35":{"position":[[37,8]]},"97":{"position":[[58,8],[84,8],[122,8],[295,8]]},"99":{"position":[[413,8]]},"101":{"position":[[34,8]]},"103":{"position":[[360,8],[419,8],[706,8]]},"157":{"position":[[430,8]]},"255":{"position":[[26,8],[131,9],[150,8],[264,8]]},"257":{"position":[[395,8],[461,8],[769,8]]},"633":{"position":[[248,8],[624,8]]}}}],["librefm",{"_index":1173,"t":{"103":{"position":[[824,7],[1032,7],[1373,7],[1454,7],[1680,7],[2405,7],[2598,7],[3118,7],[3620,9]]},"257":{"position":[[887,7],[1095,7],[1436,7],[1517,7],[1708,7],[1848,7],[1910,7],[2002,7],[2727,7],[2920,7],[3440,7],[3942,9]]}}}],["librefm_api_key",{"_index":1167,"t":{"103":{"position":[[317,15]]}}}],["librefm_en",{"_index":1166,"t":{"103":{"position":[[258,14]]}}}],["librefm_id",{"_index":1164,"t":{"103":{"position":[[127,10],[212,10]]}}}],["librefm_nam",{"_index":1165,"t":{"103":{"position":[[183,12]]}}}],["librefm_redirect_uri",{"_index":1158,"t":{"99":{"position":[[372,21]]},"103":{"position":[[436,20]]}}}],["librefm_secret",{"_index":1168,"t":{"103":{"position":[[377,14]]}}}],["librefm_sess",{"_index":1170,"t":{"103":{"position":[[537,15]]}}}],["librefm_urlbas",{"_index":1160,"t":{"101":{"position":[[96,15]]},"103":{"position":[[616,15]]}}}],["licens",{"_index":2898,"t":{"459":{"position":[[904,9]]},"461":{"position":[[301,9]]}}}],["lifecycl",{"_index":2533,"t":{"351":{"position":[[201,10]]},"353":{"position":[[23,9]]},"355":{"position":[[220,9]]},"357":{"position":[[627,9],[685,9]]}}}],["lifetim",{"_index":2634,"t":{"372":{"position":[[361,8]]}}}],["limit",{"_index":1059,"t":{"73":{"position":[[5765,5],[7151,5],[9410,5]]},"81":{"position":[[16,11]]},"87":{"position":[[218,6]]},"132":{"position":[[75,5],[241,5]]},"164":{"position":[[3,5]]},"216":{"position":[[1073,11]]},"222":{"position":[[317,11]]},"343":{"position":[[893,5]]},"376":{"position":[[147,7]]},"441":{"position":[[969,5]]},"449":{"position":[[10,10]]},"466":{"position":[[14,9]]}}}],["line",{"_index":766,"t":{"46":{"position":[[1081,6],[2598,6]]},"66":{"position":[[1578,6],[3111,6]]},"73":{"position":[[1954,4],[2029,4],[9750,5]]},"77":{"position":[[553,4],[628,4]]},"85":{"position":[[1337,6],[2828,6]]},"91":{"position":[[1246,6],[2829,6]]},"95":{"position":[[1019,6],[2510,6]]},"103":{"position":[[1344,6],[2890,6]]},"110":{"position":[[2269,6],[3825,6]]},"114":{"position":[[1137,6],[2722,6]]},"143":{"position":[[1632,6],[3123,6]]},"149":{"position":[[3781,4],[3831,4]]},"153":{"position":[[1388,6],[3209,6]]},"186":{"position":[[1151,6],[2704,6]]},"188":{"position":[[4284,6],[6232,6]]},"198":{"position":[[1172,6],[2723,6]]},"202":{"position":[[1008,6],[2455,6]]},"208":{"position":[[1181,6],[2649,6]]},"214":{"position":[[1145,6],[2620,6]]},"218":{"position":[[1501,6],[3005,6]]},"220":{"position":[[1485,6],[3255,6]]},"234":{"position":[[1260,6],[2713,6]]},"253":{"position":[[1333,6],[2791,6]]},"257":{"position":[[1407,6],[3212,6]]},"261":{"position":[[1186,6],[3045,6]]},"265":{"position":[[1061,6],[2808,6]]},"269":{"position":[[1302,6],[3141,6]]},"277":{"position":[[1376,6],[2861,6]]},"281":{"position":[[1109,6],[2579,6]]},"285":{"position":[[1130,6],[2628,6]]},"291":{"position":[[1305,6],[3120,6]]},"295":{"position":[[1143,6],[2596,6]]},"301":{"position":[[1614,6],[3149,6]]},"305":{"position":[[1159,6],[2748,6]]},"317":{"position":[[1138,6],[2722,6]]},"325":{"position":[[2547,6],[4352,6]]},"327":{"position":[[763,4],[953,4]]},"329":{"position":[[1028,6],[2449,6]]},"333":{"position":[[1011,6],[2464,6]]},"341":{"position":[[1082,6],[2577,6]]},"345":{"position":[[1254,6],[2849,6]]},"349":{"position":[[1112,6],[2605,6]]},"453":{"position":[[164,5]]}}}],["link",{"_index":889,"t":{"62":{"position":[[102,6]]},"64":{"position":[[668,5]]},"83":{"position":[[527,5]]},"168":{"position":[[449,4]]},"182":{"position":[[776,4]]},"188":{"position":[[1717,5],[2073,7],[3552,5]]},"196":{"position":[[59,6],[186,6],[316,6],[1065,6],[1094,6],[1179,6]]},"198":{"position":[[422,6]]},"200":{"position":[[876,4]]},"303":{"position":[[1475,4]]},"343":{"position":[[5160,4],[5460,4]]},"363":{"position":[[660,6]]},"441":{"position":[[514,4]]},"517":{"position":[[62,6]]},"647":{"position":[[406,4]]}}}],["lint",{"_index":2717,"t":{"419":{"position":[[241,7]]}}}],["linux",{"_index":984,"t":{"73":{"position":[[1301,5],[4005,5],[4050,6],[5377,5]]},"75":{"position":[[69,5]]},"198":{"position":[[492,5]]},"216":{"position":[[990,5],[1139,5]]},"293":{"position":[[70,5],[106,5]]},"435":{"position":[[549,5],[760,5]]},"543":{"position":[[37,5],[1765,5]]},"545":{"position":[[304,5]]},"549":{"position":[[960,5]]},"567":{"position":[[59,5]]},"571":{"position":[[67,5]]},"633":{"position":[[359,6]]}}}],["liquidsoap",{"_index":1790,"t":{"184":{"position":[[896,13]]}}}],["list",{"_index":141,"t":{"4":{"position":[[3703,6]]},"42":{"position":[[1175,4],[1266,4]]},"64":{"position":[[1288,4]]},"66":{"position":[[509,4],[761,4],[868,4]]},"83":{"position":[[1147,4]]},"85":{"position":[[352,4],[536,4]]},"105":{"position":[[1258,4]]},"138":{"position":[[1252,4]]},"149":{"position":[[2171,4]]},"151":{"position":[[1490,4]]},"160":{"position":[[1326,5]]},"188":{"position":[[1185,4],[2805,5],[2924,4],[3046,4],[3170,4],[3279,4],[3391,4],[3641,4]]},"216":{"position":[[2238,4],[2740,4]]},"218":{"position":[[482,4],[603,4],[723,4],[841,4]]},"273":{"position":[[193,4]]},"275":{"position":[[231,5]]},"277":{"position":[[736,4]]},"295":{"position":[[414,4],[522,4]]},"297":{"position":[[721,4],[993,4]]},"301":{"position":[[603,4],[709,4],[850,4],[993,4]]},"307":{"position":[[593,4]]},"313":{"position":[[731,4]]},"325":{"position":[[33,5],[216,4]]},"376":{"position":[[232,4]]},"378":{"position":[[66,4],[182,4],[211,4],[378,4],[473,4],[519,4],[1272,5],[1311,4]]},"425":{"position":[[312,7]]},"457":{"position":[[165,4],[232,4],[598,4],[641,4],[750,4],[847,4],[1770,5]]},"472":{"position":[[309,4]]},"476":{"position":[[382,4],[1618,6]]},"517":{"position":[[126,5]]},"557":{"position":[[2899,4]]},"581":{"position":[[440,5]]},"584":{"position":[[1181,4],[1671,4]]},"594":{"position":[[2515,4]]},"597":{"position":[[871,4]]},"599":{"position":[[2970,4],[4040,4]]},"637":{"position":[[368,4]]}}}],["listen",{"_index":650,"t":{"38":{"position":[[238,9]]},"54":{"position":[[1672,10]]},"60":{"position":[[493,9],[514,10],[1149,9],[1270,9],[1294,10],[1469,9],[1649,9],[1674,9],[1780,9],[1941,9]]},"66":{"position":[[876,9]]},"73":{"position":[[4192,9],[4331,9],[4598,9],[4737,9],[5948,9],[7505,9]]},"81":{"position":[[63,9]]},"118":{"position":[[2826,8],[2942,9],[3177,8],[3227,9]]},"145":{"position":[[38,9]]},"151":{"position":[[754,6],[827,6],[1308,7],[1373,10],[1656,6]]},"160":{"position":[[292,9],[634,9],[653,9],[715,9],[823,8],[1257,9]]},"166":{"position":[[5,9],[28,9],[586,9],[653,9],[934,8],[1079,9],[1173,10],[1201,8],[1266,8],[1544,8],[1610,8]]},"168":{"position":[[182,9]]},"174":{"position":[[68,6]]},"180":{"position":[[124,9]]},"182":{"position":[[1368,8]]},"192":{"position":[[179,9]]},"194":{"position":[[101,9]]},"196":{"position":[[28,9],[936,9]]},"200":{"position":[[553,9],[1539,9]]},"240":{"position":[[319,7]]},"244":{"position":[[515,6],[546,7],[662,7],[829,7]]},"271":{"position":[[244,6]]},"293":{"position":[[171,9],[238,6],[1520,9]]},"331":{"position":[[190,9]]},"343":{"position":[[277,9]]},"347":{"position":[[26,9]]},"351":{"position":[[618,6]]},"353":{"position":[[132,8],[499,6]]},"415":{"position":[[168,6]]},"427":{"position":[[63,6],[264,6]]},"457":{"position":[[1001,6],[2728,9],[2836,9],[2874,9],[2934,8]]},"476":{"position":[[6506,6],[6801,8]]},"553":{"position":[[363,9]]},"557":{"position":[[76,9]]},"565":{"position":[[77,9]]},"594":{"position":[[332,9],[2702,8]]},"599":{"position":[[3405,6]]},"633":{"position":[[42,9],[2113,6]]},"637":{"position":[[88,8]]}}}],["listen:6644,reuseaddr,fork",{"_index":2196,"t":{"293":{"position":[[1610,26]]}}}],["listen:6655,reuseaddr,fork",{"_index":1064,"t":{"73":{"position":[[6073,26],[7630,26],[7958,27]]}}}],["listenbrainz",{"_index":444,"t":{"18":{"position":[[769,13],[943,13]]},"25":{"position":[[286,12]]},"33":{"position":[[142,15]]},"35":{"position":[[48,12]]},"105":{"position":[[1599,13]]},"110":{"position":[[551,12]]},"112":{"position":[[55,12],[85,12],[181,12],[211,12],[265,12]]},"114":{"position":[[353,12],[607,12],[820,12],[1166,12],[1252,12],[1488,12],[2227,12],[2425,12],[2950,12],[3461,14]]},"125":{"position":[[513,13]]},"138":{"position":[[1593,13]]},"157":{"position":[[505,12],[541,12]]},"160":{"position":[[1097,13]]},"166":{"position":[[82,12],[240,12]]},"174":{"position":[[233,12],[950,12]]},"178":{"position":[[406,12],[1304,12]]},"222":{"position":[[688,12],[714,12]]},"236":{"position":[[97,12],[160,13],[216,12],[320,12],[367,13],[390,12],[458,12],[489,12]]},"238":{"position":[[416,12],[819,12],[1325,12],[1366,12],[1572,12],[1668,12],[1713,12],[2111,12],[2268,12],[3261,12]]},"240":{"position":[[253,12],[349,12]]},"242":{"position":[[5,12],[214,12]]},"244":{"position":[[36,12],[526,12]]},"249":{"position":[[111,12],[141,12]]},"251":{"position":[[497,12],[1023,12]]},"253":{"position":[[653,12]]},"259":{"position":[[23,12],[154,12],[184,12],[280,12],[310,12],[364,12]]},"261":{"position":[[388,12],[656,12],[869,12],[1215,12],[1301,12],[1502,12],[1647,12],[1714,12],[1811,12],[2550,12],[2748,12],[3273,12],[3784,14]]},"313":{"position":[[384,12],[438,12]]},"435":{"position":[[115,12]]},"490":{"position":[[1142,12]]},"494":{"position":[[326,13]]},"557":{"position":[[1404,13],[1676,12],[1704,12],[1747,12],[2452,12],[2494,12]]},"594":{"position":[[135,12]]},"599":{"position":[[282,13],[533,14]]},"633":{"position":[[276,12],[289,12],[633,12],[2633,12]]},"639":{"position":[[141,15]]}}}],["listenbrainz.baseurl",{"_index":2074,"t":{"247":{"position":[[16,20]]},"557":{"position":[[2098,20]]}}}],["listenbrainz/musicbrainz",{"_index":2819,"t":{"439":{"position":[[604,24]]}}}],["listeningactivityallow",{"_index":885,"t":{"60":{"position":[[2141,25]]}}}],["liter",{"_index":2673,"t":{"397":{"position":[[69,8]]}}}],["live",{"_index":353,"t":{"12":{"position":[[1027,5]]},"14":{"position":[[129,4]]},"182":{"position":[[1321,4]]}}}],["live|remast",{"_index":2686,"t":{"402":{"position":[[180,15]]}}}],["livingroom",{"_index":2402,"t":{"333":{"position":[[1658,11],[2988,11]]}}}],["load",{"_index":752,"t":{"46":{"position":[[702,7],[2184,7]]},"66":{"position":[[1197,7],[2695,7]]},"85":{"position":[[956,7],[2412,7]]},"91":{"position":[[866,7],[2414,7]]},"93":{"position":[[157,10]]},"95":{"position":[[639,7],[2095,7]]},"103":{"position":[[963,7],[2474,7]]},"110":{"position":[[1888,7],[3409,7]]},"114":{"position":[[751,7],[2301,7]]},"143":{"position":[[1252,7],[2708,7]]},"153":{"position":[[1004,7],[2790,7]]},"186":{"position":[[768,7],[2286,7]]},"188":{"position":[[3536,4],[3902,7],[5815,7]]},"198":{"position":[[792,7],[2308,7]]},"202":{"position":[[627,7],[2039,7]]},"208":{"position":[[801,7],[2234,7]]},"214":{"position":[[767,7],[2207,7]]},"218":{"position":[[1117,7],[2586,7]]},"220":{"position":[[1106,7],[2841,7]]},"234":{"position":[[875,7],[2293,7]]},"253":{"position":[[949,7],[2372,7]]},"257":{"position":[[1026,7],[2796,7]]},"261":{"position":[[800,7],[2624,7]]},"265":{"position":[[681,7],[2393,7]]},"269":{"position":[[922,7],[2726,7]]},"277":{"position":[[996,7],[2446,7]]},"281":{"position":[[732,7],[2167,7]]},"285":{"position":[[747,7],[2210,7]]},"291":{"position":[[924,7],[2704,7]]},"295":{"position":[[764,7],[2182,7]]},"301":{"position":[[1235,7],[2735,7]]},"305":{"position":[[778,7],[2332,7]]},"317":{"position":[[756,7],[2305,7]]},"325":{"position":[[2167,7],[3937,7]]},"329":{"position":[[651,7],[2037,7]]},"333":{"position":[[628,7],[2046,7]]},"341":{"position":[[696,7],[2156,7]]},"345":{"position":[[873,7],[2433,7]]},"349":{"position":[[730,7],[2188,7]]},"466":{"position":[[547,4]]},"565":{"position":[[1915,10]]}}}],["local",{"_index":35,"t":{"4":{"position":[[490,5],[1277,5],[3453,5]]},"14":{"position":[[711,5]]},"73":{"position":[[3351,5],[3412,7]]},"81":{"position":[[43,5],[169,5]]},"293":{"position":[[463,5],[511,5],[780,5]]},"297":{"position":[[34,5]]},"303":{"position":[[2513,7],[3385,5]]},"307":{"position":[[244,5],[259,5],[356,5],[629,5],[799,5],[1005,5],[1304,5]]},"335":{"position":[[670,5]]},"349":{"position":[[352,5]]},"417":{"position":[[91,7]]},"543":{"position":[[2755,5]]},"545":{"position":[[1202,5]]},"608":{"position":[[242,5]]},"633":{"position":[[1304,7]]}}}],["local/nod",{"_index":63,"t":{"4":{"position":[[1008,10]]}}}],["local/share/multi",{"_index":3143,"t":{"549":{"position":[[1094,20]]}}}],["localappdata%\\multi",{"_index":3149,"t":{"549":{"position":[[1278,20]]}}}],["localhost",{"_index":1929,"t":{"206":{"position":[[575,9]]},"212":{"position":[[567,9]]},"271":{"position":[[885,9]]},"277":{"position":[[2077,12],[3451,12]]},"303":{"position":[[2318,9]]},"335":{"position":[[364,10]]},"435":{"position":[[1914,9]]},"437":{"position":[[563,9]]},"553":{"position":[[545,10],[654,10]]}}}],["localhost:6600",{"_index":2158,"t":{"281":{"position":[[316,14]]}}}],["localhost:8080",{"_index":2388,"t":{"329":{"position":[[316,14],[1704,17],[3026,17]]}}}],["localhost:9229",{"_index":2778,"t":{"431":{"position":[[210,14]]}}}],["locat",{"_index":71,"t":{"4":{"position":[[1173,7],[2014,7],[3343,7],[3431,8]]},"85":{"position":[[378,9]]},"105":{"position":[[1210,8]]},"138":{"position":[[1208,8]]},"178":{"position":[[227,8]]},"184":{"position":[[674,6]]},"303":{"position":[[3443,8]]},"331":{"position":[[434,7]]},"533":{"position":[[155,7]]},"545":{"position":[[166,7]]},"633":{"position":[[2840,9]]}}}],["lock",{"_index":1190,"t":{"105":{"position":[[676,6]]},"138":{"position":[[674,6]]}}}],["lock.json",{"_index":3080,"t":{"535":{"position":[[332,9],[518,9]]}}}],["log",{"_index":271,"t":{"8":{"position":[[1496,3]]},"10":{"position":[[138,7]]},"20":{"position":[[107,3],[242,4],[347,4]]},"38":{"position":[[601,6],[621,7]]},"118":{"position":[[4133,4]]},"147":{"position":[[171,3],[602,5]]},"149":{"position":[[1080,3],[1864,3]]},"192":{"position":[[204,7]]},"196":{"position":[[172,4]]},"216":{"position":[[3107,4],[3304,7],[3324,3]]},"232":{"position":[[889,8],[928,8],[1133,7]]},"249":{"position":[[501,4],[559,4]]},"251":{"position":[[894,8],[933,8],[1144,7]]},"297":{"position":[[1076,7],[1193,7],[1526,7],[1702,3],[1825,3],[1908,4],[1987,4]]},"303":{"position":[[990,6]]},"327":{"position":[[1837,4],[2280,7],[2317,4],[2354,7]]},"343":{"position":[[2852,3],[5034,6],[5356,3]]},"345":{"position":[[622,7]]},"369":{"position":[[7,3],[121,4],[126,6],[266,6],[454,6],[585,4]]},"423":{"position":[[507,7]]},"425":{"position":[[638,3]]},"435":{"position":[[233,3],[313,4],[882,4],[1164,4],[1428,8],[1458,7],[2419,5],[2474,4]]},"444":{"position":[[39,5]]},"451":{"position":[[439,7],[501,4],[559,6]]},"453":{"position":[[105,4]]},"455":{"position":[[43,7]]},"457":{"position":[[1688,3],[2205,8],[2234,4],[2283,3],[2296,4],[2498,4],[2521,4],[3225,4],[3278,4],[3319,5]]},"496":{"position":[[148,7],[299,7],[323,4],[479,6],[659,6]]},"513":{"position":[[33,3],[80,4],[110,5],[134,4],[253,4],[361,4]]},"515":{"position":[[87,7],[173,4],[250,5]]},"524":{"position":[[466,4],[524,4]]},"567":{"position":[[596,3]]},"616":{"position":[[222,4]]},"625":{"position":[[781,4]]},"633":{"position":[[1066,4]]},"647":{"position":[[38,5]]}}}],["logauthupdatechang",{"_index":2449,"t":{"343":{"position":[[1159,23],[2749,23],[4052,23]]}}}],["logdiff",{"_index":1609,"t":{"153":{"position":[[2415,10],[4109,10]]},"343":{"position":[[1189,10],[2779,10],[4082,10]]},"345":{"position":[[2121,10],[3601,10]]},"457":{"position":[[1491,7],[1592,10],[2427,10]]}}}],["logfilenamepattern",{"_index":2382,"t":{"327":{"position":[[1897,22]]}}}],["logfilterfailur",{"_index":169,"t":{"4":{"position":[[4606,19]]},"188":{"position":[[5490,19],[7319,19]]},"297":{"position":[[1462,19]]}}}],["logfitlerfailur",{"_index":2213,"t":{"297":{"position":[[1315,16]]}}}],["logic",{"_index":2701,"t":{"415":{"position":[[128,6]]}}}],["login",{"_index":859,"t":{"57":{"position":[[649,5]]},"73":{"position":[[2759,5],[2911,5],[3001,5],[3034,5],[6051,6],[7608,6]]},"79":{"position":[[135,5],[225,5],[258,5]]},"143":{"position":[[938,5]]},"192":{"position":[[59,5]]},"196":{"position":[[1080,6]]},"303":{"position":[[1747,5]]},"307":{"position":[[387,7]]},"317":{"position":[[354,5],[429,5]]},"325":{"position":[[1846,5]]},"343":{"position":[[1769,5]]},"571":{"position":[[185,6]]},"575":{"position":[[248,5]]}}}],["logo",{"_index":3430,"t":{"616":{"position":[[145,4]]}}}],["logpayload",{"_index":168,"t":{"4":{"position":[[4585,13]]},"188":{"position":[[5470,13],[7299,13]]},"216":{"position":[[3556,13]]},"297":{"position":[[1300,10],[1490,13]]}}}],["logplayerst",{"_index":171,"t":{"4":{"position":[[4634,17]]}}}],["logtofil",{"_index":2877,"t":{"457":{"position":[[2334,9],[2444,12]]}}}],["long",{"_index":352,"t":{"12":{"position":[[1022,4]]},"149":{"position":[[1574,4],[2281,4]]},"166":{"position":[[925,4]]},"230":{"position":[[319,4]]},"353":{"position":[[144,4]]},"594":{"position":[[1381,4],[1471,4],[2714,4]]}}}],["longer",{"_index":365,"t":{"14":{"position":[[114,6],[179,6]]},"188":{"position":[[1330,6]]},"303":{"position":[[2231,6],[2364,6]]},"315":{"position":[[704,6]]},"343":{"position":[[1386,6]]},"551":{"position":[[44,6]]},"627":{"position":[[1082,6]]}}}],["look",{"_index":237,"t":{"8":{"position":[[290,4]]},"143":{"position":[[451,4]]},"149":{"position":[[2211,4]]},"196":{"position":[[177,4],[245,4]]},"327":{"position":[[1738,4]]},"355":{"position":[[44,5]]},"384":{"position":[[438,4]]},"435":{"position":[[321,5]]},"472":{"position":[[1330,4]]},"476":{"position":[[5144,5]]},"557":{"position":[[67,4]]},"586":{"position":[[556,5]]},"597":{"position":[[886,5]]}}}],["lookup",{"_index":2352,"t":{"325":{"position":[[626,6]]},"439":{"position":[[393,6]]}}}],["loop",{"_index":1577,"t":{"151":{"position":[[1366,6]]}}}],["lose",{"_index":679,"t":{"40":{"position":[[338,4]]}}}],["lost",{"_index":3102,"t":{"543":{"position":[[211,4]]}}}],["lot",{"_index":1512,"t":{"149":{"position":[[854,3]]}}}],["low",{"_index":1563,"t":{"151":{"position":[[475,3]]},"297":{"position":[[1913,3]]}}}],["lower",{"_index":2993,"t":{"483":{"position":[[183,5]]}}}],["lowercas",{"_index":1269,"t":{"118":{"position":[[309,10]]}}}],["lowest",{"_index":878,"t":{"60":{"position":[[1501,6]]},"513":{"position":[[265,6]]}}}],["ltj",{"_index":2603,"t":{"369":{"position":[[843,3]]}}}],["lua",{"_index":2367,"t":{"327":{"position":[[373,3],[380,3]]}}}],["lz",{"_index":1256,"t":{"114":{"position":[[1805,2],[3255,2]]},"174":{"position":[[1855,3],[2855,3]]},"178":{"position":[[2629,3],[3802,3]]},"253":{"position":[[502,2],[1985,3],[3316,3]]},"261":{"position":[[2128,2],[3578,2]]}}}],["lz_enabl",{"_index":1250,"t":{"114":{"position":[[243,9]]}}}],["lz_id",{"_index":1248,"t":{"114":{"position":[[127,5],[202,5]]}}}],["lz_name",{"_index":1249,"t":{"114":{"position":[[178,7]]}}}],["lz_token",{"_index":1253,"t":{"114":{"position":[[399,8]]}}}],["lz_url",{"_index":1251,"t":{"114":{"position":[[297,6]]}}}],["lz_user",{"_index":1254,"t":{"114":{"position":[[455,7]]}}}],["lze_en",{"_index":2082,"t":{"253":{"position":[[246,10]]},"629":{"position":[[92,10]]}}}],["lze_id",{"_index":2080,"t":{"253":{"position":[[127,6],[204,6]]}}}],["lze_id=mylznavidrom",{"_index":1688,"t":{"174":{"position":[[974,20]]},"178":{"position":[[1328,20]]}}}],["lze_id=navidromelz",{"_index":3176,"t":{"557":{"position":[[1971,18]]}}}],["lze_nam",{"_index":2081,"t":{"253":{"position":[[179,8]]}}}],["lze_slug",{"_index":2083,"t":{"253":{"position":[[301,8]]}}}],["lze_slug=foobar",{"_index":2070,"t":{"244":{"position":[[611,15]]}}}],["lze_token",{"_index":2068,"t":{"242":{"position":[[172,10]]},"253":{"position":[[479,9]]},"557":{"position":[[2547,9]]}}}],["lze_token=mycooltoken",{"_index":3175,"t":{"557":{"position":[[1947,21]]}}}],["lze_token=mytoken",{"_index":1689,"t":{"174":{"position":[[997,17]]},"178":{"position":[[1351,17]]}}}],["lze_transforms=musicbrainz",{"_index":1751,"t":{"178":{"position":[[1435,26]]},"559":{"position":[[1411,26]]},"563":{"position":[[549,26]]}}}],["lze_usernam",{"_index":2084,"t":{"253":{"position":[[629,12]]}}}],["lzendpoint_en",{"_index":3471,"t":{"629":{"position":[[71,17]]}}}],["ma7xbvzrerk3gqdkx4dkb3oq.6aagmj.rvfiivrzg4vxhhl3lyhzyhpwdg3ph_if9akz5",{"_index":871,"t":{"60":{"position":[[931,73],[2027,73]]},"66":{"position":[[2286,73],[3704,73]]}}}],["machin",{"_index":803,"t":{"50":{"position":[[383,7]]},"73":{"position":[[216,7],[577,8],[3445,7],[5715,7],[7101,7],[7311,8],[9360,7],[9686,7]]},"206":{"position":[[538,7]]},"212":{"position":[[530,7]]},"216":{"position":[[874,7],[1020,7]]},"303":{"position":[[3144,7],[3525,7],[3734,7]]},"435":{"position":[[1788,7],[2189,7],[2389,8]]},"437":{"position":[[336,7]]},"543":{"position":[[1183,7],[1270,8]]},"545":{"position":[[254,7]]},"553":{"position":[[176,7],[494,7]]},"594":{"position":[[233,7],[558,7],[968,7],[2607,7]]},"599":{"position":[[52,7],[682,7],[1576,7]]}}}],["maco",{"_index":1031,"t":{"73":{"position":[[4022,5],[4456,6],[5394,5],[7305,5]]},"549":{"position":[[966,5]]}}}],["made",{"_index":2560,"t":{"357":{"position":[[1301,4]]},"359":{"position":[[13,4]]},"425":{"position":[[2504,4]]},"481":{"position":[[1120,4]]}}}],["magic",{"_index":1985,"t":{"216":{"position":[[1794,9]]}}}],["main",{"_index":812,"t":{"54":{"position":[[258,4]]},"68":{"position":[[239,4]]},"130":{"position":[[182,6],[490,4],[565,4]]},"196":{"position":[[151,4],[1009,4]]},"323":{"position":[[62,4]]},"327":{"position":[[223,4],[354,4]]},"347":{"position":[[1416,4]]}}}],["mainstream",{"_index":2887,"t":{"459":{"position":[[587,10],[944,10]]},"461":{"position":[[341,10]]}}}],["major",{"_index":1391,"t":{"120":{"position":[[289,8]]},"200":{"position":[[168,8]]},"216":{"position":[[1133,5]]},"447":{"position":[[104,8]]},"481":{"position":[[1759,8]]},"490":{"position":[[267,5]]},"594":{"position":[[4,8]]},"602":{"position":[[4,8]]},"610":{"position":[[49,5],[150,5]]},"618":{"position":[[4,8]]}}}],["majorli",{"_index":2728,"t":{"423":{"position":[[468,7]]}}}],["make",{"_index":321,"t":{"12":{"position":[[68,4]]},"29":{"position":[[316,4]]},"73":{"position":[[1022,4],[5327,4]]},"87":{"position":[[633,6],[1086,4]]},"128":{"position":[[79,4]]},"149":{"position":[[846,5],[892,4],[3751,4]]},"160":{"position":[[197,5]]},"184":{"position":[[1196,4]]},"192":{"position":[[116,4]]},"206":{"position":[[404,4]]},"212":{"position":[[398,4]]},"222":{"position":[[534,5]]},"228":{"position":[[507,4]]},"230":{"position":[[1039,6]]},"232":{"position":[[1052,4]]},"251":{"position":[[1063,4]]},"271":{"position":[[762,4]]},"293":{"position":[[976,4],[1543,4]]},"307":{"position":[[25,4]]},"343":{"position":[[4370,4],[4418,4]]},"425":{"position":[[1814,4],[3165,4]]},"435":{"position":[[2313,4]]},"457":{"position":[[271,5]]},"476":{"position":[[690,4],[822,6]]},"515":{"position":[[163,4]]},"535":{"position":[[168,4]]},"557":{"position":[[2049,6],[2391,6],[2591,4],[3530,4]]},"604":{"position":[[304,4],[338,6],[460,4]]},"621":{"position":[[123,4]]},"625":{"position":[[1241,4]]},"631":{"position":[[469,4]]}}}],["maloja",{"_index":194,"t":{"4":{"position":[[5170,9],[5210,8]]},"33":{"position":[[125,7]]},"35":{"position":[[71,6]]},"93":{"position":[[8,6],[57,6],[511,6]]},"95":{"position":[[339,6],[387,6],[501,6],[708,6],[1048,6],[1128,6],[1352,6],[1651,7],[2027,6],[2219,6],[2738,6],[3031,7],[3191,8]]},"157":{"position":[[589,6]]},"263":{"position":[[28,6],[52,6],[76,6]]},"265":{"position":[[374,6],[429,6],[543,6],[750,6],[1090,6],[1170,6],[1359,6],[1498,6],[1559,6],[1650,6],[1949,7],[2325,6],[2517,6],[3036,6],[3329,7],[3489,8]]},"384":{"position":[[574,6],[939,6]]},"472":{"position":[[1471,6],[1979,6]]},"545":{"position":[[110,6]]},"549":{"position":[[2194,9]]},"553":{"position":[[420,7]]},"565":{"position":[[177,6],[1766,6],[1815,6]]},"633":{"position":[[313,6],[646,6]]}}}],["maloja'",{"_index":1134,"t":{"93":{"position":[[88,8]]},"565":{"position":[[1846,8]]}}}],["maloja_api_key",{"_index":1150,"t":{"95":{"position":[[353,14]]}}}],["maloja_api_key=1234",{"_index":3128,"t":{"545":{"position":[[883,19]]}}}],["maloja_api_key=myapikey",{"_index":2662,"t":{"384":{"position":[[989,23]]},"472":{"position":[[2069,23]]},"565":{"position":[[2445,23]]}}}],["maloja_en",{"_index":1148,"t":{"95":{"position":[[255,13]]}}}],["maloja_force_password=change_m",{"_index":1137,"t":{"93":{"position":[[213,31]]},"565":{"position":[[1971,31]]}}}],["maloja_id",{"_index":1146,"t":{"95":{"position":[[127,9],[210,9]]}}}],["maloja_id=mymaloja",{"_index":3202,"t":{"565":{"position":[[2471,18]]}}}],["maloja_nam",{"_index":1147,"t":{"95":{"position":[[182,11]]}}}],["maloja_url",{"_index":1149,"t":{"95":{"position":[[313,10]]}}}],["maloja_url=\"http://domain.tld",{"_index":3161,"t":{"549":{"position":[[1874,30]]}}}],["maloja_url=http://192.168.0.100:42010",{"_index":2661,"t":{"384":{"position":[[899,37]]},"472":{"position":[[2029,37]]},"565":{"position":[[2405,37]]}}}],["maloja_url=http://domain.tld:42010",{"_index":3127,"t":{"545":{"position":[[846,34]]}}}],["malojadata",{"_index":1138,"t":{"93":{"position":[[291,12]]},"565":{"position":[[2049,12]]}}}],["malojadata/dock",{"_index":1135,"t":{"93":{"position":[[125,19]]},"565":{"position":[[1883,19]]}}}],["manag",{"_index":2251,"t":{"303":{"position":[[1102,10]]},"417":{"position":[[144,6]]},"571":{"position":[[30,7]]},"577":{"position":[[85,9]]},"633":{"position":[[2206,6]]}}}],["mani",{"_index":415,"t":{"18":{"position":[[165,4],[965,4]]},"105":{"position":[[889,4]]},"138":{"position":[[887,4]]},"174":{"position":[[51,4]]},"194":{"position":[[87,4]]},"216":{"position":[[1177,4]]},"224":{"position":[[181,4],[206,4],[221,4],[253,4],[268,4],[2557,4],[2572,4]]},"238":{"position":[[181,4],[206,4],[221,4],[248,4],[263,4],[2542,4],[2557,4]]},"244":{"position":[[168,4]]},"271":{"position":[[67,4]]},"351":{"position":[[159,4]]},"457":{"position":[[2255,4]]},"459":{"position":[[764,4]]},"461":{"position":[[161,4]]},"476":{"position":[[1277,4],[6456,4]]},"559":{"position":[[332,4]]},"561":{"position":[[65,4]]},"581":{"position":[[131,4]]},"633":{"position":[[138,4],[575,4],[2137,4]]}}}],["manner",{"_index":1113,"t":{"87":{"position":[[1130,6]]}}}],["manual",{"_index":1544,"t":{"149":{"position":[[2878,8],[3178,6]]},"182":{"position":[[704,9],[1070,8],[1129,8],[1612,8]]},"200":{"position":[[804,9],[1168,8],[1227,8],[2045,8]]},"216":{"position":[[758,8]]},"218":{"position":[[84,8]]},"303":{"position":[[3618,8]]},"535":{"position":[[47,8]]},"602":{"position":[[69,6]]},"604":{"position":[[295,8]]}}}],["map",{"_index":565,"t":{"27":{"position":[[791,9],[1144,9]]},"543":{"position":[[786,3]]}}}],["march",{"_index":2245,"t":{"303":{"position":[[536,5]]}}}],["mari",{"_index":1725,"t":{"176":{"position":[[286,5],[343,4],[457,4],[796,6],[892,7],[1169,6],[2030,6],[2128,7],[2432,6]]},"196":{"position":[[381,4]]}}}],["mark",{"_index":1339,"t":{"118":{"position":[[3733,6]]},"476":{"position":[[7081,6]]}}}],["markdown",{"_index":3049,"t":{"517":{"position":[[540,8]]}}}],["maryapikey",{"_index":1735,"t":{"176":{"position":[[1230,13],[2493,13]]}}}],["maryjf",{"_index":1731,"t":{"176":{"position":[[778,9],[2012,9]]}}}],["marylfm",{"_index":1732,"t":{"176":{"position":[[825,12],[1150,10],[2061,9],[2413,10]]}}}],["marysecret",{"_index":1736,"t":{"176":{"position":[[1254,13],[2517,13]]}}}],["master",{"_index":3424,"t":{"612":{"position":[[12,6]]},"614":{"position":[[313,6]]},"616":{"position":[[546,6]]}}}],["match",{"_index":21,"t":{"4":{"position":[[218,5]]},"8":{"position":[[382,8],[1632,8]]},"64":{"position":[[3330,9]]},"83":{"position":[[3155,9]]},"105":{"position":[[1979,7],[2126,8]]},"118":{"position":[[1127,8],[1285,8],[1980,8],[3706,5],[3757,5],[4123,5],[4142,5],[4439,5],[4472,5],[4713,8]]},"120":{"position":[[779,5]]},"125":{"position":[[625,5]]},"134":{"position":[[319,5]]},"136":{"position":[[103,5]]},"149":{"position":[[2694,5]]},"151":{"position":[[2066,5]]},"206":{"position":[[430,7]]},"212":{"position":[[424,7]]},"230":{"position":[[332,5]]},"253":{"position":[[591,5]]},"271":{"position":[[801,5]]},"273":{"position":[[219,7]]},"277":{"position":[[690,7]]},"309":{"position":[[81,5],[172,5],[195,8],[261,5],[297,5],[423,7],[541,8]]},"311":{"position":[[230,7]]},"325":{"position":[[294,9]]},"327":{"position":[[1378,8],[1502,7]]},"337":{"position":[[64,7],[560,7]]},"351":{"position":[[96,8]]},"359":{"position":[[363,5]]},"365":{"position":[[1361,5]]},"367":{"position":[[243,5],[550,8],[632,8],[728,8],[810,8],[892,5],[969,5],[1457,7]]},"378":{"position":[[456,7]]},"397":{"position":[[59,7],[203,7],[227,6],[366,5],[484,5],[690,7]]},"402":{"position":[[94,7]]},"459":{"position":[[22,7],[83,5],[140,5]]},"468":{"position":[[31,8]]},"472":{"position":[[831,5],[848,5]]},"474":{"position":[[146,8],[310,7],[356,5]]},"476":{"position":[[967,7],[1192,6],[1312,6],[1337,7],[6114,5],[6569,7],[6650,7],[6750,6]]},"479":{"position":[[5,5],[186,8],[234,7]]},"481":{"position":[[222,5],[493,6],[1203,7],[1776,7],[1806,8],[1997,5]]},"483":{"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]]},"488":{"position":[[130,8],[154,5],[295,5]]},"490":{"position":[[126,9],[367,8],[424,5],[1408,8],[1481,8],[1759,7]]},"492":{"position":[[156,5],[267,5],[395,8],[441,5],[537,7]]},"494":{"position":[[31,5],[218,7]]},"496":{"position":[[32,7],[75,5]]},"503":{"position":[[150,5],[229,5]]},"505":{"position":[[177,7],[829,5]]},"507":{"position":[[133,7],[1176,7]]},"559":{"position":[[39,5],[690,7]]},"561":{"position":[[423,7]]},"633":{"position":[[2397,5]]}}}],["match/correct",{"_index":3025,"t":{"490":{"position":[[1591,13]]}}}],["match/record",{"_index":3016,"t":{"483":{"position":[[2983,16]]}}}],["matches/releas",{"_index":2992,"t":{"483":{"position":[[91,16]]}}}],["maximum",{"_index":1542,"t":{"149":{"position":[[2839,7]]}}}],["maxpollretri",{"_index":177,"t":{"4":{"position":[[4716,17]]}}}],["maxrequestretri",{"_index":179,"t":{"4":{"position":[[4737,20],[4807,20]]}}}],["mayb",{"_index":3033,"t":{"503":{"position":[[462,5]]},"507":{"position":[[593,5]]}}}],["mb_contact",{"_index":2925,"t":{"472":{"position":[[166,10]]}}}],["mb_contact=contact@mydomain.com",{"_index":1743,"t":{"178":{"position":[[894,31]]},"472":{"position":[[211,31],[1607,31]]},"509":{"position":[[374,31]]}}}],["mb_contact=mycoolname@emailprovider.com",{"_index":3188,"t":{"559":{"position":[[611,39]]},"561":{"position":[[344,39]]}}}],["mb_contact=myemail@myemailprovider.com",{"_index":2313,"t":{"311":{"position":[[619,38]]}}}],["mb_preset",{"_index":2926,"t":{"472":{"position":[[275,10]]}}}],["mb_presets=default,sensible,n",{"_index":1749,"t":{"178":{"position":[[1045,34]]},"472":{"position":[[1743,34]]},"559":{"position":[[771,34]]},"561":{"position":[[504,34]]}}}],["mb_presets=id,default",{"_index":2314,"t":{"311":{"position":[[660,21]]}}}],["mb_presets=id,native,sens",{"_index":3038,"t":{"509":{"position":[[408,29]]}}}],["mbid",{"_index":929,"t":{"64":{"position":[[3103,4],[3237,5],[3454,5]]},"83":{"position":[[2928,4],[3062,5],[3279,5]]},"136":{"position":[[288,4]]},"311":{"position":[[4,4]]},"363":{"position":[[644,7]]},"459":{"position":[[515,5]]},"470":{"position":[[786,5]]},"476":{"position":[[95,5],[594,5],[2069,4],[2142,4],[2190,5],[2288,4],[2509,6],[2669,5],[2817,5]]},"490":{"position":[[1702,5],[1788,4]]},"494":{"position":[[243,5]]},"503":{"position":[[811,5]]},"507":{"position":[[23,5]]},"509":{"position":[[109,5]]}}}],["mbidrecord",{"_index":2319,"t":{"311":{"position":[[1136,17],[1622,17]]},"472":{"position":[[630,13]]},"476":{"position":[[1654,16],[2074,15],[2308,17]]},"490":{"position":[[1016,13],[1883,13]]}}}],["mc_enabl",{"_index":2173,"t":{"285":{"position":[[243,9]]}}}],["mc_id",{"_index":2171,"t":{"285":{"position":[[127,5],[202,5]]}}}],["mc_name",{"_index":2172,"t":{"285":{"position":[[178,7]]}}}],["mc_password",{"_index":2175,"t":{"285":{"position":[[394,11]]}}}],["mc_url",{"_index":2174,"t":{"285":{"position":[[297,6]]}}}],["mcast_en",{"_index":2398,"t":{"333":{"position":[[252,12]]}}}],["mcast_id",{"_index":2396,"t":{"333":{"position":[[127,8],[208,8]]}}}],["mcast_nam",{"_index":2397,"t":{"333":{"position":[[181,10]]}}}],["mcast_url",{"_index":2399,"t":{"333":{"position":[[309,9]]}}}],["mdn",{"_index":1967,"t":{"216":{"position":[[843,5],[849,4],[934,4]]}}}],["mean",{"_index":30,"t":{"4":{"position":[[400,5]]},"31":{"position":[[282,5]]},"60":{"position":[[1523,5]]},"64":{"position":[[2801,5]]},"83":{"position":[[2626,5]]},"105":{"position":[[1500,7]]},"136":{"position":[[269,4],[543,5]]},"138":{"position":[[1494,7]]},"166":{"position":[[377,5]]},"176":{"position":[[104,5]]},"206":{"position":[[306,5]]},"212":{"position":[[302,5]]},"222":{"position":[[451,5]]},"271":{"position":[[659,5]]},"343":{"position":[[96,5]]},"378":{"position":[[1201,5]]},"435":{"position":[[38,5],[1299,5]]},"439":{"position":[[102,5],[174,5],[243,5],[334,5]]},"444":{"position":[[281,5]]},"476":{"position":[[6086,5]]},"490":{"position":[[225,5]]}}}],["meant",{"_index":505,"t":{"18":{"position":[[3883,5]]},"46":{"position":[[1521,5],[2917,5]]},"66":{"position":[[2026,5],[3432,5]]},"85":{"position":[[1785,5],[3149,5]]},"91":{"position":[[1690,5],[3149,5]]},"95":{"position":[[1463,5],[2830,5]]},"103":{"position":[[1792,5],[3211,5]]},"110":{"position":[[2717,5],[4146,5]]},"114":{"position":[[1605,5],[3048,5]]},"143":{"position":[[2076,5],[3443,5]]},"153":{"position":[[1848,5],[3533,5]]},"186":{"position":[[1607,5],[3027,5]]},"188":{"position":[[4736,5],[6554,5]]},"198":{"position":[[1616,5],[3043,5]]},"202":{"position":[[1456,5],[2776,5]]},"208":{"position":[[1625,5],[2969,5]]},"214":{"position":[[1581,5],[2938,5]]},"218":{"position":[[1961,5],[3329,5]]},"220":{"position":[[2178,5],[3574,5]]},"234":{"position":[[1724,5],[3038,5]]},"253":{"position":[[1793,5],[3115,5]]},"257":{"position":[[2114,5],[3533,5]]},"261":{"position":[[1928,5],[3371,5]]},"265":{"position":[[1761,5],[3128,5]]},"269":{"position":[[2002,5],[3461,5]]},"277":{"position":[[1820,5],[3181,5]]},"281":{"position":[[1541,5],[2896,5]]},"285":{"position":[[1586,5],[2951,5]]},"291":{"position":[[2012,5],[3441,5]]},"295":{"position":[[1583,5],[2915,5]]},"301":{"position":[[2054,5],[3468,5]]},"305":{"position":[[1607,5],[3069,5]]},"317":{"position":[[1590,5],[3044,5]]},"325":{"position":[[3247,5],[4672,5]]},"329":{"position":[[1460,5],[2766,5]]},"333":{"position":[[1467,5],[2787,5]]},"341":{"position":[[1550,5],[2903,5]]},"345":{"position":[[1702,5],[3170,5]]},"349":{"position":[[1564,5],[2927,5]]}}}],["measur",{"_index":424,"t":{"18":{"position":[[453,7]]}}}],["mechan",{"_index":3394,"t":{"599":{"position":[[1241,9]]}}}],["media",{"_index":1481,"t":{"145":{"position":[[252,5]]},"147":{"position":[[415,5]]},"149":{"position":[[2532,5],[3666,5]]},"153":{"position":[[2323,5],[4017,5]]},"188":{"position":[[774,5],[1053,5],[1101,5],[3603,5]]},"204":{"position":[[157,5],[181,5]]},"206":{"position":[[479,5]]},"216":{"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]]},"293":{"position":[[157,5],[297,5]]},"307":{"position":[[1415,5]]},"317":{"position":[[494,5]]},"453":{"position":[[77,5],[138,5],[216,5],[294,5],[363,5],[407,5]]},"581":{"position":[[60,5]]}}}],["mediausertoken",{"_index":1483,"t":{"147":{"position":[[4,14],[499,14]]},"149":{"position":[[2508,17],[3642,17]]},"153":{"position":[[2299,17],[3993,17]]}}}],["meet",{"_index":1643,"t":{"160":{"position":[[988,5]]}}}],["melendi",{"_index":1300,"t":{"118":{"position":[[1474,8],[1580,8]]}}}],["membership",{"_index":1548,"t":{"149":{"position":[[3413,10]]}}}],["memori",{"_index":324,"t":{"12":{"position":[[107,6]]},"31":{"position":[[400,6]]},"372":{"position":[[245,7],[409,6]]},"431":{"position":[[276,6]]},"486":{"position":[[97,6]]},"543":{"position":[[2472,6]]},"569":{"position":[[165,6]]}}}],["memorysourc",{"_index":3276,"t":{"586":{"position":[[266,12],[378,12],[485,12]]},"590":{"position":[[382,12]]},"592":{"position":[[403,12],[1663,12],[2301,12]]},"594":{"position":[[584,12],[949,12],[1025,12],[1730,12]]},"597":{"position":[[485,12]]},"599":{"position":[[928,12],[1584,12]]}}}],["memorysource.j",{"_index":3277,"t":{"586":{"position":[[284,20]]}}}],["mendhak/http",{"_index":2273,"t":{"303":{"position":[[3768,12],[3923,12],[4549,12]]}}}],["mention",{"_index":1417,"t":{"128":{"position":[[20,9]]},"212":{"position":[[477,9]]},"347":{"position":[[1294,7]]}}}],["menu",{"_index":2305,"t":{"309":{"position":[[337,5],[464,4]]},"327":{"position":[[102,4]]}}}],["messag",{"_index":563,"t":{"27":{"position":[[737,7],[1090,7]]},"29":{"position":[[512,8]]},"592":{"position":[[2607,7]]}}}],["met",{"_index":1657,"t":{"166":{"position":[[1030,4]]},"182":{"position":[[1523,4]]},"479":{"position":[[179,3]]}}}],["meta",{"_index":2572,"t":{"363":{"position":[[588,7],[639,4]]},"367":{"position":[[1067,4]]},"369":{"position":[[985,4]]},"470":{"position":[[753,7]]},"494":{"position":[[255,4],[606,7]]},"503":{"position":[[257,4],[760,7]]},"590":{"position":[[935,5]]}}}],["metadata",{"_index":342,"t":{"12":{"position":[[669,10]]},"16":{"position":[[321,8]]},"105":{"position":[[1859,8]]},"151":{"position":[[2072,9]]},"200":{"position":[[6,8],[204,8],[263,8],[1728,8],[1877,8],[2124,8]]},"216":{"position":[[1652,8]]},"222":{"position":[[580,8]]},"283":{"position":[[99,8],[343,8]]},"285":{"position":[[362,10]]},"311":{"position":[[217,9],[384,8]]},"327":{"position":[[2271,8],[2345,8]]},"427":{"position":[[271,8]]},"455":{"position":[[34,8]]},"459":{"position":[[534,9]]},"486":{"position":[[17,8]]},"503":{"position":[[797,8]]},"627":{"position":[[481,8],[509,8],[873,11],[1247,9]]}}}],["metdata",{"_index":1207,"t":{"105":{"position":[[1782,7]]}}}],["method",{"_index":29,"t":{"4":{"position":[[393,6]]},"73":{"position":[[3276,6],[3528,6],[3807,7],[3937,6],[5522,6],[5678,6],[6744,6],[6908,6],[7064,6],[7268,7],[8620,6],[8975,6],[9167,6],[9323,6],[10124,6]]},"149":{"position":[[619,6]]},"160":{"position":[[100,7]]},"184":{"position":[[211,7]]},"190":{"position":[[36,7],[146,7]]},"192":{"position":[[240,7]]},"293":{"position":[[1308,6]]},"303":{"position":[[2402,7],[3026,6]]},"311":{"position":[[408,7]]},"343":{"position":[[523,7],[4896,6]]},"457":{"position":[[496,6]]},"472":{"position":[[583,7]]},"476":{"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]]},"490":{"position":[[99,7],[968,7],[1181,7],[1270,7],[1934,7],[2018,7],[2058,8]]},"533":{"position":[[140,6]]},"557":{"position":[[745,6]]},"569":{"position":[[58,7]]},"584":{"position":[[2101,7]]}}}],["metric",{"_index":605,"t":{"31":{"position":[[105,7],[264,7],[341,7],[379,7],[876,7]]},"166":{"position":[[1114,7]]}}}],["metrics_path",{"_index":626,"t":{"31":{"position":[[703,13]]}}}],["migrat",{"_index":399,"t":{"16":{"position":[[245,9]]},"602":{"position":[[400,9]]},"604":{"position":[[128,10],[219,9]]},"608":{"position":[[178,9]]},"610":{"position":[[387,9]]},"618":{"position":[[464,9]]},"625":{"position":[[297,9],[669,7],[807,10],[858,7],[1480,9]]},"631":{"position":[[514,9]]}}}],["million",{"_index":2889,"t":{"459":{"position":[[640,8],[658,8],[678,8]]},"461":{"position":[[37,8],[55,8],[75,8]]}}}],["millisecond",{"_index":2325,"t":{"315":{"position":[[88,11]]}}}],["mind",{"_index":2554,"t":{"357":{"position":[[573,4]]},"633":{"position":[[2007,4]]}}}],["minim",{"_index":428,"t":{"18":{"position":[[513,7],[585,7]]},"359":{"position":[[547,9]]},"594":{"position":[[3033,9]]}}}],["minimum",{"_index":2724,"t":{"423":{"position":[[58,7]]},"479":{"position":[[152,7]]}}}],["minor",{"_index":1344,"t":{"118":{"position":[[3816,6],[3932,6],[4250,6],[4371,6]]},"602":{"position":[[458,5]]},"604":{"position":[[430,5]]},"606":{"position":[[0,5]]},"610":{"position":[[74,5],[420,5]]}}}],["minut",{"_index":475,"t":{"18":{"position":[[2362,7],[2428,7],[2960,7],[3005,7],[3291,7],[3377,9],[4337,7],[4403,7],[4816,7],[4861,7],[5048,7],[5133,9]]},"25":{"position":[[258,7]]},"40":{"position":[[128,7]]},"166":{"position":[[1281,7]]},"343":{"position":[[4197,7]]},"457":{"position":[[3308,7]]}}}],["mirror",{"_index":1425,"t":{"132":{"position":[[447,7]]},"488":{"position":[[311,6]]},"557":{"position":[[3183,6]]}}}],["misbehav",{"_index":2820,"t":{"439":{"position":[[736,12],[908,11]]}}}],["mishav",{"_index":2824,"t":{"439":{"position":[[1110,9]]}}}],["miss",{"_index":267,"t":{"8":{"position":[[1358,7],[1545,7]]},"73":{"position":[[1157,7]]},"118":{"position":[[5136,6]]},"206":{"position":[[246,7]]},"212":{"position":[[242,7]]},"271":{"position":[[599,7]]},"343":{"position":[[338,6]]},"459":{"position":[[169,7]]},"476":{"position":[[262,7],[624,7],[792,7]]},"509":{"position":[[196,7]]},"559":{"position":[[92,7]]},"569":{"position":[[539,7]]},"597":{"position":[[36,8]]}}}],["mistak",{"_index":2670,"t":{"393":{"position":[[337,8]]}}}],["misus",{"_index":824,"t":{"54":{"position":[[655,6]]}}}],["mit",{"_index":3496,"t":{"653":{"position":[[0,3]]}}}],["mix",{"_index":20,"t":{"4":{"position":[[210,3]]},"120":{"position":[[883,5]]},"188":{"position":[[988,5]]},"303":{"position":[[195,7]]},"369":{"position":[[828,4]]}}}],["mixcloud",{"_index":2139,"t":{"275":{"position":[[388,11]]}}}],["mkdir",{"_index":3217,"t":{"573":{"position":[[70,5]]}}}],["mobil",{"_index":773,"t":{"46":{"position":[[1351,6],[2711,6]]},"66":{"position":[[1854,6],[3224,6]]},"73":{"position":[[1168,6]]},"85":{"position":[[1613,6],[2941,6]]},"91":{"position":[[1519,6],[2942,6]]},"95":{"position":[[1292,6],[2623,6]]},"103":{"position":[[1620,6],[3003,6]]},"110":{"position":[[2545,6],[3938,6]]},"114":{"position":[[1428,6],[2835,6]]},"143":{"position":[[1905,6],[3236,6]]},"153":{"position":[[1673,6],[3322,6]]},"186":{"position":[[1433,6],[2817,6]]},"188":{"position":[[4563,6],[6345,6]]},"198":{"position":[[1445,6],[2836,6]]},"202":{"position":[[1284,6],[2568,6]]},"208":{"position":[[1454,6],[2762,6]]},"214":{"position":[[1412,6],[2733,6]]},"218":{"position":[[1786,6],[3118,6]]},"220":{"position":[[2008,6],[3368,6]]},"228":{"position":[[280,6]]},"234":{"position":[[1548,6],[2826,6]]},"253":{"position":[[1618,6],[2904,6]]},"257":{"position":[[1942,6],[3325,6]]},"261":{"position":[[1751,6],[3158,6]]},"265":{"position":[[1590,6],[2921,6]]},"269":{"position":[[1831,6],[3254,6]]},"277":{"position":[[1649,6],[2974,6]]},"281":{"position":[[1373,6],[2692,6]]},"285":{"position":[[1412,6],[2741,6]]},"291":{"position":[[1840,6],[3233,6]]},"295":{"position":[[1413,6],[2709,6]]},"301":{"position":[[1884,6],[3262,6]]},"305":{"position":[[1435,6],[2861,6]]},"317":{"position":[[1417,6],[2835,6]]},"325":{"position":[[3076,6],[4465,6]]},"329":{"position":[[1292,6],[2562,6]]},"333":{"position":[[1293,6],[2577,6]]},"341":{"position":[[1373,6],[2690,6]]},"345":{"position":[[1530,6],[2962,6]]},"349":{"position":[[1391,6],[2718,6]]},"457":{"position":[[2751,7]]},"633":{"position":[[1750,6]]}}}],["mode",{"_index":518,"t":{"20":{"position":[[17,4],[285,4],[323,4],[418,4]]},"46":{"position":[[852,4],[895,4],[1000,5],[2370,4],[2413,4],[2518,5]]},"66":{"position":[[1349,4],[1392,4],[1497,5],[2883,4],[2926,4],[3031,5]]},"85":{"position":[[1108,4],[1151,4],[1256,5],[2600,4],[2643,4],[2748,5]]},"91":{"position":[[1017,4],[1060,4],[1165,5],[2601,4],[2644,4],[2749,5]]},"95":{"position":[[790,4],[833,4],[938,5],[2282,4],[2325,4],[2430,5]]},"103":{"position":[[1115,4],[1158,4],[1263,5],[2662,4],[2705,4],[2810,5]]},"110":{"position":[[2040,4],[2083,4],[2188,5],[3597,4],[3640,4],[3745,5]]},"114":{"position":[[908,4],[951,4],[1056,5],[2494,4],[2537,4],[2642,5]]},"143":{"position":[[1403,4],[1446,4],[1551,5],[2895,4],[2938,4],[3043,5]]},"153":{"position":[[1159,4],[1202,4],[1307,5],[2981,4],[3024,4],[3129,5]]},"178":{"position":[[1037,5]]},"186":{"position":[[922,4],[965,4],[1070,5],[2476,4],[2519,4],[2624,5]]},"188":{"position":[[4055,4],[4098,4],[4203,5],[6004,4],[6047,4],[6152,5]]},"198":{"position":[[943,4],[986,4],[1091,5],[2495,4],[2538,4],[2643,5]]},"202":{"position":[[779,4],[822,4],[927,5],[2227,4],[2270,4],[2375,5]]},"208":{"position":[[952,4],[995,4],[1100,5],[2421,4],[2464,4],[2569,5]]},"214":{"position":[[916,4],[959,4],[1064,5],[2392,4],[2435,4],[2540,5]]},"216":{"position":[[3450,5]]},"218":{"position":[[1272,4],[1315,4],[1420,5],[2777,4],[2820,4],[2925,5]]},"220":{"position":[[1256,4],[1299,4],[1404,5],[3027,4],[3070,4],[3175,5]]},"234":{"position":[[1031,4],[1074,4],[1179,5],[2485,4],[2528,4],[2633,5]]},"253":{"position":[[1104,4],[1147,4],[1252,5],[2563,4],[2606,4],[2711,5]]},"257":{"position":[[1178,4],[1221,4],[1326,5],[2984,4],[3027,4],[3132,5]]},"261":{"position":[[957,4],[1000,4],[1105,5],[2817,4],[2860,4],[2965,5]]},"265":{"position":[[832,4],[875,4],[980,5],[2580,4],[2623,4],[2728,5]]},"269":{"position":[[1073,4],[1116,4],[1221,5],[2913,4],[2956,4],[3061,5]]},"277":{"position":[[1147,4],[1190,4],[1295,5],[2633,4],[2676,4],[2781,5]]},"281":{"position":[[880,4],[923,4],[1028,5],[2351,4],[2394,4],[2499,5]]},"285":{"position":[[901,4],[944,4],[1049,5],[2400,4],[2443,4],[2548,5]]},"291":{"position":[[1076,4],[1119,4],[1224,5],[2892,4],[2935,4],[3040,5]]},"295":{"position":[[914,4],[957,4],[1062,5],[2368,4],[2411,4],[2516,5]]},"297":{"position":[[1266,4]]},"301":{"position":[[1385,4],[1428,4],[1533,5],[2921,4],[2964,4],[3069,5]]},"305":{"position":[[930,4],[973,4],[1078,5],[2520,4],[2563,4],[2668,5]]},"317":{"position":[[909,4],[952,4],[1057,5],[2494,4],[2537,4],[2642,5]]},"325":{"position":[[2318,4],[2361,4],[2466,5],[4124,4],[4167,4],[4272,5]]},"329":{"position":[[799,4],[842,4],[947,5],[2221,4],[2264,4],[2369,5]]},"333":{"position":[[782,4],[825,4],[930,5],[2236,4],[2279,4],[2384,5]]},"341":{"position":[[853,4],[896,4],[1001,5],[2349,4],[2392,4],[2497,5]]},"345":{"position":[[1025,4],[1068,4],[1173,5],[2621,4],[2664,4],[2769,5]]},"349":{"position":[[883,4],[926,4],[1031,5],[2377,4],[2420,4],[2525,5]]},"472":{"position":[[716,4],[1735,5]]},"476":{"position":[[3845,4],[4104,5],[4153,4],[4473,4],[5139,4],[5423,4]]},"488":{"position":[[677,4]]},"496":{"position":[[176,4]]},"515":{"position":[[27,4],[64,4],[153,4]]},"524":{"position":[[585,4]]},"588":{"position":[[927,5]]}}}],["modern",{"_index":3483,"t":{"633":{"position":[[1423,10]]}}}],["modif",{"_index":1437,"t":{"136":{"position":[[518,14]]},"293":{"position":[[750,13]]},"357":{"position":[[1283,13]]},"365":{"position":[[205,12]]},"382":{"position":[[210,12]]},"395":{"position":[[542,12]]},"402":{"position":[[27,12]]},"496":{"position":[[393,12],[510,12]]}}}],["modifi",{"_index":990,"t":{"73":{"position":[[1739,6]]},"77":{"position":[[338,6]]},"87":{"position":[[948,9]]},"110":{"position":[[887,6]]},"123":{"position":[[460,6]]},"125":{"position":[[244,6]]},"136":{"position":[[112,6],[196,9],[274,9],[728,8]]},"194":{"position":[[149,6]]},"293":{"position":[[1081,6]]},"303":{"position":[[298,8]]},"327":{"position":[[858,6]]},"355":{"position":[[234,6]]},"357":{"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]]},"359":{"position":[[100,9]]},"378":{"position":[[490,9]]},"391":{"position":[[418,6]]},"503":{"position":[[44,8]]},"549":{"position":[[1494,6],[2373,8]]},"557":{"position":[[2266,6]]},"559":{"position":[[1577,6]]},"563":{"position":[[715,6]]},"588":{"position":[[191,6]]}}}],["modify/replac",{"_index":2669,"t":{"393":{"position":[[72,14]]}}}],["modul",{"_index":2365,"t":{"327":{"position":[[56,6],[262,7]]}}}],["monitor",{"_index":540,"t":{"25":{"position":[[18,10],[150,7]]},"29":{"position":[[16,10]]},"42":{"position":[[62,10]]},"44":{"position":[[14,7]]},"48":{"position":[[111,10]]},"54":{"position":[[111,10],[504,10]]},"68":{"position":[[111,10]]},"87":{"position":[[15,7]]},"97":{"position":[[15,7]]},"105":{"position":[[14,7]]},"112":{"position":[[15,7]]},"118":{"position":[[2728,10],[3459,9]]},"138":{"position":[[14,7]]},"145":{"position":[[12,8]]},"157":{"position":[[84,10]]},"160":{"position":[[284,7],[1244,8]]},"162":{"position":[[156,7]]},"166":{"position":[[1070,8]]},"168":{"position":[[196,7],[369,7],[462,10]]},"182":{"position":[[633,10],[683,10],[789,10],[862,10],[1054,7],[1113,7],[1249,10],[1480,7],[1563,10]]},"184":{"position":[[1128,7]]},"186":{"position":[[354,7]]},"196":{"position":[[20,7],[535,7],[864,10],[1200,9]]},"198":{"position":[[440,8]]},"200":{"position":[[598,10],[652,10],[733,10],[783,10],[889,10],[962,10],[1152,7],[1211,7],[1295,10],[1355,8]]},"216":{"position":[[102,7]]},"220":{"position":[[12,8]]},"222":{"position":[[177,7]]},"236":{"position":[[415,7]]},"255":{"position":[[12,8]]},"259":{"position":[[12,8]]},"267":{"position":[[12,8]]},"279":{"position":[[257,7]]},"287":{"position":[[158,8]]},"297":{"position":[[47,7],[769,7],[929,10],[1896,7]]},"319":{"position":[[237,8]]},"331":{"position":[[0,7]]},"343":{"position":[[248,10],[5474,11]]},"347":{"position":[[0,7]]},"553":{"position":[[297,10]]},"557":{"position":[[55,8],[1299,10],[4086,10]]},"567":{"position":[[304,7]]},"586":{"position":[[978,9]]},"594":{"position":[[27,8],[382,10]]},"633":{"position":[[22,8],[113,10],[771,7]]},"635":{"position":[[78,8]]}}}],["monitoring/webhook",{"_index":142,"t":{"4":{"position":[[3736,20]]}}}],["monitorwhenl",{"_index":1777,"t":{"182":{"position":[[1348,16]]},"186":{"position":[[1937,18],[3367,18]]}}}],["monitorwhenlisten",{"_index":1779,"t":{"182":{"position":[[1407,21]]},"186":{"position":[[1962,23],[3392,23]]}}}],["monoloth",{"_index":2649,"t":{"378":{"position":[[426,10]]}}}],["mopidi",{"_index":1623,"t":{"157":{"position":[[619,6]]},"271":{"position":[[0,6],[197,6],[279,6],[375,6],[741,6],[828,6],[1031,7]]},"273":{"position":[[82,6],[434,6]]},"275":{"position":[[33,6]]},"277":{"position":[[373,6],[858,6],[1065,6],[1405,6],[1485,6],[1709,6],[2008,7],[2378,6],[2570,6],[3089,6],[3382,7],[3536,8]]},"633":{"position":[[320,6]]}}}],["mopidy.conf",{"_index":2123,"t":{"271":{"position":[[854,12]]}}}],["mopidy.mydomain.com",{"_index":2125,"t":{"271":{"position":[[1100,19]]}}}],["mopidy.mydomain.com:80/mopw",{"_index":2128,"t":{"271":{"position":[[1215,28]]}}}],["mopidy_album_denylist",{"_index":2147,"t":{"277":{"position":[[627,21]]}}}],["mopidy_en",{"_index":2142,"t":{"277":{"position":[[255,13]]}}}],["mopidy_id",{"_index":2140,"t":{"277":{"position":[[127,9],[210,9]]}}}],["mopidy_nam",{"_index":2141,"t":{"277":{"position":[[182,11]]}}}],["mopidy_uri_allowlist",{"_index":2146,"t":{"277":{"position":[[517,20]]}}}],["mopidy_uri_denylist",{"_index":2144,"t":{"277":{"position":[[406,19]]}}}],["mopidy_url",{"_index":2143,"t":{"277":{"position":[[313,10]]}}}],["more",{"_index":81,"t":{"4":{"position":[[1542,4],[1741,4],[1855,4],[4087,4]]},"14":{"position":[[91,5]]},"50":{"position":[[151,4]]},"52":{"position":[[228,4]]},"62":{"position":[[97,4]]},"110":{"position":[[751,4]]},"118":{"position":[[5322,5]]},"136":{"position":[[141,4]]},"151":{"position":[[2398,4]]},"166":{"position":[[971,4],[1221,5],[1292,5],[1574,4],[1633,4]]},"171":{"position":[[393,4]]},"176":{"position":[[50,4]]},"188":{"position":[[945,4],[1216,4]]},"192":{"position":[[407,4]]},"194":{"position":[[666,4]]},"222":{"position":[[619,4]]},"224":{"position":[[609,4],[1039,4],[1806,4],[3343,4]]},"230":{"position":[[22,4]]},"238":{"position":[[594,4],[1018,4],[1791,4],[3302,4]]},"244":{"position":[[22,4]]},"287":{"position":[[270,4]]},"309":{"position":[[370,4]]},"313":{"position":[[543,4],[569,4]]},"319":{"position":[[349,4]]},"343":{"position":[[407,4]]},"355":{"position":[[254,4]]},"359":{"position":[[31,4]]},"367":{"position":[[1005,4]]},"378":{"position":[[1320,4]]},"412":{"position":[[385,4]]},"427":{"position":[[697,4]]},"447":{"position":[[258,4]]},"451":{"position":[[329,4]]},"459":{"position":[[577,4],[769,4],[1001,4],[1139,4],[1222,4],[1360,4]]},"461":{"position":[[166,4],[398,4]]},"463":{"position":[[43,4],[126,4],[264,4]]},"466":{"position":[[477,4]]},"472":{"position":[[344,4]]},"483":{"position":[[2208,4],[2374,4],[2760,4]]},"488":{"position":[[278,4]]},"490":{"position":[[386,4],[1253,4],[1282,4],[1343,4]]},"507":{"position":[[868,4]]},"515":{"position":[[82,4]]},"524":{"position":[[519,4]]},"545":{"position":[[422,4]]},"549":{"position":[[1734,4]]},"551":{"position":[[119,4]]},"557":{"position":[[3109,4],[3225,4]]},"565":{"position":[[801,4]]},"569":{"position":[[4,4],[269,4]]},"594":{"position":[[1426,4]]},"618":{"position":[[571,4]]},"623":{"position":[[199,7],[262,7]]},"633":{"position":[[1933,4]]},"635":{"position":[[37,4],[61,4]]}}}],["mount",{"_index":356,"t":{"12":{"position":[[1102,5],[1138,7]]},"14":{"position":[[567,5]]},"73":{"position":[[1476,5],[1589,5],[1684,7]]},"77":{"position":[[75,5],[188,5],[283,7]]},"293":{"position":[[916,5]]},"415":{"position":[[135,6]]},"543":{"position":[[404,8]]}}}],["move",{"_index":1029,"t":{"73":{"position":[[3240,4]]},"79":{"position":[[464,4]]},"301":{"position":[[2337,7],[3765,7]]},"457":{"position":[[1837,5],[1927,5],[2027,5],[2110,5]]},"535":{"position":[[342,4],[528,4]]}}}],["movi",{"_index":2839,"t":{"453":{"position":[[355,7]]}}}],["mozilla/5.0",{"_index":1892,"t":{"198":{"position":[[474,11]]},"435":{"position":[[531,11],[742,11]]}}}],["mpd",{"_index":1624,"t":{"157":{"position":[[650,3]]},"279":{"position":[[21,3],[117,3]]},"281":{"position":[[347,3],[597,3],[801,3],[1138,3],[1215,3],[1433,3],[2102,3],[2291,3],[2807,3],[3257,5]]},"295":{"position":[[1852,5],[3198,5]]},"633":{"position":[[327,3]]}}}],["mpd_enabl",{"_index":2156,"t":{"281":{"position":[[246,10]]}}}],["mpd_id",{"_index":2154,"t":{"281":{"position":[[127,6],[204,6]]}}}],["mpd_name",{"_index":2155,"t":{"281":{"position":[[179,8]]}}}],["mpd_password",{"_index":2160,"t":{"281":{"position":[[372,12]]}}}],["mpd_url",{"_index":2157,"t":{"281":{"position":[[301,7]]}}}],["mpri",{"_index":2185,"t":{"293":{"position":[[0,5],[211,6],[357,6],[376,5],[575,5],[877,6]]},"295":{"position":[[627,5],[833,5],[1172,5],[1251,5],[1473,5],[2115,5],[2306,5],[2824,5],[3245,7]]},"633":{"position":[[353,5]]}}}],["mpris_blacklist",{"_index":2202,"t":{"295":{"position":[[309,15]]}}}],["mpris_en",{"_index":2201,"t":{"295":{"position":[[252,12]]}}}],["mpris_id",{"_index":2199,"t":{"295":{"position":[[127,8],[208,8]]}}}],["mpris_nam",{"_index":2200,"t":{"295":{"position":[[181,10]]}}}],["mpris_whitelist",{"_index":2203,"t":{"295":{"position":[[419,15]]}}}],["ms",{"_index":17,"t":{"4":{"position":[[144,2],[306,2],[406,2],[589,2],[646,2],[1139,2],[3282,2],[3948,2],[4015,3]]},"10":{"position":[[292,2]]},"12":{"position":[[951,2]]},"18":{"position":[[415,2],[3654,2],[4020,2]]},"25":{"position":[[357,2]]},"38":{"position":[[39,2],[152,2],[448,2]]},"44":{"position":[[996,2]]},"54":{"position":[[328,2],[713,2],[738,2],[1065,2],[1289,2]]},"57":{"position":[[500,2]]},"60":{"position":[[0,2],[158,2],[330,2],[573,2],[666,2],[890,5],[1209,2],[1806,2],[1880,2],[1986,5]]},"64":{"position":[[412,2],[473,2],[1093,2],[2710,2],[2870,2],[3122,2],[3148,2],[3391,2]]},"66":{"position":[[901,2]]},"73":{"position":[[524,2],[1312,2],[1557,2],[3052,2],[3180,2],[3205,2],[3306,2],[3357,2],[3395,2],[3485,2],[3612,2],[3727,2],[3957,2],[5419,2],[5440,2],[5465,2],[6150,2],[6361,2],[6667,2],[6719,2],[6805,2],[6826,2],[6851,2],[8030,2],[8241,2],[8543,2],[8595,2],[8681,2],[8694,2],[9837,2],[10059,2],[10111,2]]},"75":{"position":[[80,2]]},"77":{"position":[[156,2]]},"79":{"position":[[276,2],[404,2],[429,2]]},"83":{"position":[[321,2],[332,2],[952,2],[2535,2],[2695,2],[2947,2],[2973,2],[3216,2]]},"118":{"position":[[1807,2],[4112,2]]},"120":{"position":[[623,2],[1131,2]]},"123":{"position":[[60,2],[491,2]]},"125":{"position":[[275,2]]},"130":{"position":[[100,2],[584,2]]},"134":{"position":[[523,2]]},"136":{"position":[[916,2],[967,2],[1294,2]]},"145":{"position":[[202,4]]},"151":{"position":[[1159,2],[1519,2]]},"160":{"position":[[187,2],[270,2],[329,2],[571,2]]},"166":{"position":[[533,2],[908,2]]},"168":{"position":[[337,2]]},"182":{"position":[[16,2],[82,2],[385,2],[1458,2]]},"188":{"position":[[1392,2],[1871,2],[2005,2]]},"194":{"position":[[456,2]]},"216":{"position":[[1570,2],[1917,2],[2499,2],[3262,2]]},"224":{"position":[[165,3],[566,2],[941,3],[1026,3]]},"226":{"position":[[173,2]]},"228":{"position":[[130,3]]},"230":{"position":[[105,3],[134,2],[237,2],[346,2],[515,2],[936,2]]},"232":{"position":[[695,2],[725,2]]},"238":{"position":[[165,3],[551,2],[926,3],[1005,3]]},"244":{"position":[[70,2],[283,2],[507,2],[627,2]]},"249":{"position":[[356,2]]},"251":{"position":[[700,2],[730,2]]},"279":{"position":[[0,2]]},"283":{"position":[[222,2],[394,2],[447,2]]},"297":{"position":[[90,2]]},"303":{"position":[[112,2],[436,2],[780,2],[873,2],[1414,2],[2510,2]]},"307":{"position":[[404,2]]},"311":{"position":[[347,2]]},"315":{"position":[[409,2]]},"327":{"position":[[0,2],[681,3],[1450,2],[1856,2]]},"335":{"position":[[708,2]]},"339":{"position":[[0,2]]},"343":{"position":[[1212,2],[2375,3],[2429,2],[2810,2],[3094,2],[3240,2],[3379,2],[4241,3],[4563,2],[4686,2],[5348,2]]},"347":{"position":[[1277,2],[1502,2]]},"369":{"position":[[0,2]]},"372":{"position":[[0,2],[425,3]]},"378":{"position":[[311,3]]},"425":{"position":[[148,2],[1461,2],[1557,2],[1952,2],[2171,2]]},"427":{"position":[[46,2]]},"439":{"position":[[230,2],[254,2]]},"441":{"position":[[591,2],[1148,2],[1249,2]]},"451":{"position":[[480,3]]},"453":{"position":[[102,2]]},"455":{"position":[[58,2]]},"457":{"position":[[4,2],[1682,2],[2482,2]]},"476":{"position":[[7,2],[26,2]]},"481":{"position":[[147,2]]},"509":{"position":[[937,5],[1484,5]]},"513":{"position":[[451,2]]},"530":{"position":[[40,2]]},"535":{"position":[[268,2]]},"537":{"position":[[77,2]]},"543":{"position":[[855,2],[1165,2],[2124,2]]},"549":{"position":[[364,2],[608,2],[908,2]]},"551":{"position":[[82,2]]},"579":{"position":[[87,2]]},"581":{"position":[[841,2],[898,2],[1065,3]]},"584":{"position":[[87,2]]},"586":{"position":[[937,2]]},"588":{"position":[[5,2]]},"594":{"position":[[24,2],[211,2],[2854,2]]},"597":{"position":[[57,2],[558,2]]},"599":{"position":[[610,2],[1001,2],[1289,2],[1328,2]]},"616":{"position":[[400,2]]},"621":{"position":[[0,2],[208,2]]},"625":{"position":[[30,2],[323,2],[384,2],[570,2],[839,2],[1027,2]]},"631":{"position":[[7,2]]},"635":{"position":[[75,2],[158,2]]}}}],["ms'",{"_index":882,"t":{"60":{"position":[[1644,4]]},"73":{"position":[[1623,4]]},"77":{"position":[[222,4]]},"303":{"position":[[350,4],[1483,4]]},"339":{"position":[[205,4]]},"343":{"position":[[426,4],[3311,4]]},"359":{"position":[[260,4]]},"439":{"position":[[377,4]]},"441":{"position":[[524,4]]},"457":{"position":[[1297,4]]}}}],["ms.db",{"_index":393,"t":{"16":{"position":[[45,7]]},"604":{"position":[[45,7],[355,5],[396,5]]}}}],["msdata",{"_index":3203,"t":{"567":{"position":[[221,8]]}}}],["msdata/config/lastfm.json",{"_index":3190,"t":{"559":{"position":[[1751,27]]},"563":{"position":[[889,27]]}}}],["msdata/dock",{"_index":2500,"t":{"347":{"position":[[214,15]]},"555":{"position":[[107,15]]},"557":{"position":[[299,15],[920,15],[1917,15],[2743,15],[3669,15]]},"559":{"position":[[515,15],[1096,15],[1239,15],[1381,15],[1519,15]]},"561":{"position":[[248,15]]},"563":{"position":[[234,15],[377,15],[519,15],[657,15]]},"565":{"position":[[1008,15],[1652,15],[2375,15]]}}}],["mtg8v6xa2nc",{"_index":2861,"t":{"457":{"position":[[1864,13]]}}}],["much",{"_index":408,"t":{"18":{"position":[[4,4],[124,4]]},"73":{"position":[[606,4]]},"315":{"position":[[699,4]]},"459":{"position":[[819,4],[996,4],[1355,4]]},"461":{"position":[[216,4],[393,4]]},"463":{"position":[[259,4]]},"515":{"position":[[77,4]]},"627":{"position":[[41,4]]}}}],["multi",{"_index":54,"t":{"4":{"position":[[804,5]]},"8":{"position":[[38,5],[269,5],[919,5],[1371,5],[1814,5],[1919,5]]},"12":{"position":[[0,5],[1451,5]]},"14":{"position":[[339,5],[456,5],[511,5],[602,5],[746,5],[936,5],[1065,5]]},"16":{"position":[[0,5],[127,5]]},"18":{"position":[[1739,5],[2125,5],[3542,5],[3753,5],[4140,5]]},"27":{"position":[[693,5],[1046,5],[1449,5]]},"31":{"position":[[666,5]]},"40":{"position":[[3,5]]},"42":{"position":[[0,5],[223,5]]},"44":{"position":[[591,5],[821,5]]},"48":{"position":[[127,5]]},"54":{"position":[[127,5],[348,5],[956,5],[983,5],[1184,5],[1235,5]]},"62":{"position":[[405,5]]},"64":{"position":[[0,5],[255,5],[3818,5]]},"68":{"position":[[127,5]]},"71":{"position":[[258,5]]},"73":{"position":[[114,5],[653,5],[1364,5],[1760,5],[1835,5],[2816,5],[5254,5],[5349,5]]},"77":{"position":[[359,5],[434,5]]},"79":{"position":[[40,5]]},"83":{"position":[[0,5],[164,5],[3610,5]]},"87":{"position":[[161,5],[467,5],[884,5]]},"89":{"position":[[64,5],[211,5],[267,5]]},"99":{"position":[[64,5],[211,5],[267,5]]},"105":{"position":[[1018,5],[1058,5]]},"110":{"position":[[21,5],[353,5],[471,5],[1035,5]]},"112":{"position":[[159,5]]},"116":{"position":[[0,5]]},"118":{"position":[[0,5],[1164,5],[2755,5],[3485,5],[4768,5],[4887,5],[5258,5]]},"120":{"position":[[308,5],[453,5]]},"123":{"position":[[217,5],[326,5]]},"132":{"position":[[3,5]]},"136":{"position":[[703,5],[871,5]]},"138":{"position":[[1016,5],[1056,5],[2053,5]]},"140":{"position":[[5,5]]},"143":{"position":[[33,5],[499,5]]},"145":{"position":[[186,5]]},"147":{"position":[[541,5]]},"149":{"position":[[25,5]]},"151":{"position":[[99,5],[919,5],[2094,5]]},"157":{"position":[[29,5]]},"160":{"position":[[27,5],[389,5],[442,5],[889,5],[1228,5]]},"164":{"position":[[509,5]]},"166":{"position":[[309,5],[748,5]]},"168":{"position":[[139,5],[246,5]]},"171":{"position":[[54,5],[221,5]]},"174":{"position":[[25,5],[508,5],[571,5]]},"178":{"position":[[641,5],[704,5]]},"180":{"position":[[181,5]]},"182":{"position":[[1212,5]]},"184":{"position":[[43,5],[977,5]]},"188":{"position":[[61,5],[269,5],[547,5],[739,5],[1018,5]]},"192":{"position":[[78,5]]},"196":{"position":[[0,5],[113,5],[839,5]]},"200":{"position":[[287,5],[495,5],[1426,5],[2173,5]]},"204":{"position":[[13,5]]},"206":{"position":[[254,5],[691,5]]},"210":{"position":[[13,5]]},"212":{"position":[[250,5],[683,5]]},"216":{"position":[[82,5],[890,5]]},"220":{"position":[[1870,5]]},"222":{"position":[[20,5],[461,5]]},"224":{"position":[[103,5],[399,5],[653,5],[1083,5],[1850,5],[2984,5]]},"226":{"position":[[56,5],[109,5]]},"228":{"position":[[246,5]]},"232":{"position":[[622,5]]},"236":{"position":[[20,5],[238,5]]},"238":{"position":[[103,5],[385,5],[638,5],[1062,5],[1835,5],[2936,5]]},"240":{"position":[[115,5],[225,5]]},"251":{"position":[[627,5]]},"257":{"position":[[1800,5]]},"259":{"position":[[258,5]]},"261":{"position":[[1599,5]]},"265":{"position":[[1450,5]]},"267":{"position":[[226,5]]},"269":{"position":[[1691,5]]},"271":{"position":[[145,5],[607,5],[992,5]]},"273":{"position":[[162,5],[398,5]]},"275":{"position":[[146,5],[237,5],[505,5]]},"279":{"position":[[195,5]]},"291":{"position":[[1698,5]]},"293":{"position":[[218,5],[405,5],[479,5],[696,5],[831,5],[1702,5]]},"297":{"position":[[0,5],[631,5],[1683,5],[1806,5]]},"301":{"position":[[76,5]]},"303":{"position":[[485,5],[2173,5],[2483,5],[2696,5],[2851,5],[2954,5],[3080,5],[3289,5],[3391,5],[3461,5],[3677,5],[3983,5],[4087,5],[4362,5],[4628,5],[5153,5],[5397,5]]},"307":{"position":[[121,5],[1380,5]]},"311":{"position":[[150,5],[453,5]]},"315":{"position":[[0,5],[629,5]]},"325":{"position":[[2936,5]]},"327":{"position":[[1078,5],[2046,5]]},"331":{"position":[[247,5],[329,5]]},"335":{"position":[[560,5]]},"343":{"position":[[4945,5]]},"347":{"position":[[252,5],[315,5],[1217,5],[1421,5]]},"351":{"position":[[0,5],[183,5],[896,5]]},"353":{"position":[[50,5]]},"357":{"position":[[811,5]]},"378":{"position":[[156,5]]},"380":{"position":[[415,5]]},"382":{"position":[[80,5]]},"384":{"position":[[616,5],[679,5]]},"395":{"position":[[437,5]]},"412":{"position":[[45,5]]},"415":{"position":[[0,5]]},"417":{"position":[[316,5]]},"435":{"position":[[49,5],[148,5],[179,5],[212,5],[1216,5],[1271,5],[1470,5],[1745,5],[1858,5],[2041,5],[2197,5]]},"437":{"position":[[166,5],[293,5]]},"441":{"position":[[21,5],[927,5],[1216,5]]},"447":{"position":[[0,5]]},"449":{"position":[[150,5],[275,5]]},"451":{"position":[[277,5]]},"457":{"position":[[40,5],[289,5],[414,5],[552,5]]},"459":{"position":[[115,5],[1538,5]]},"466":{"position":[[514,5],[658,5]]},"472":{"position":[[1513,5],[1576,5]]},"476":{"position":[[924,5],[1749,5],[1908,5],[2152,5],[3181,5],[3389,5],[3688,5]]},"496":{"position":[[40,5]]},"513":{"position":[[0,5]]},"520":{"position":[[89,5]]},"522":{"position":[[29,5]]},"524":{"position":[[122,5]]},"543":{"position":[[276,5],[554,5],[975,5],[1374,5],[1543,5],[2252,5],[2558,5]]},"545":{"position":[[481,5],[544,5]]},"547":{"position":[[47,5]]},"549":{"position":[[191,5]]},"553":{"position":[[44,5],[281,5],[382,5],[453,5]]},"555":{"position":[[24,5],[145,5],[208,5]]},"557":{"position":[[39,5],[1136,5],[1262,5],[1652,5],[1779,5],[2027,5],[2972,5],[3301,5],[3914,5],[4049,5]]},"559":{"position":[[0,5]]},"565":{"position":[[43,5],[679,5],[983,5],[1627,5],[2350,5]]},"567":{"position":[[28,5],[264,5],[606,5]]},"569":{"position":[[237,5]]},"573":{"position":[[30,5],[216,5]]},"575":{"position":[[72,5],[119,5],[190,5]]},"577":{"position":[[51,5]]},"594":{"position":[[3078,5]]},"602":{"position":[[16,5]]},"604":{"position":[[0,5]]},"608":{"position":[[421,5]]},"610":{"position":[[0,5]]},"616":{"position":[[23,5],[129,5]]},"623":{"position":[[143,5],[964,5]]},"631":{"position":[[250,5]]},"633":{"position":[[1434,5],[1804,5],[2569,5]]}}}],["multipl",{"_index":128,"t":{"4":{"position":[[2743,8]]},"27":{"position":[[277,8]]},"42":{"position":[[699,8]]},"87":{"position":[[403,8]]},"118":{"position":[[21,8],[243,8],[625,8]]},"120":{"position":[[518,8],[873,9]]},"151":{"position":[[624,8]]},"174":{"position":[[107,8]]},"178":{"position":[[9,8]]},"224":{"position":[[1475,8],[2372,8],[2794,8]]},"234":{"position":[[328,8]]},"238":{"position":[[1456,8],[2358,8],[2757,8]]},"244":{"position":[[213,8]]},"253":{"position":[[328,8]]},"313":{"position":[[163,8],[586,9]]},"327":{"position":[[1461,8]]},"337":{"position":[[22,8]]},"361":{"position":[[1015,8]]},"466":{"position":[[756,8]]},"476":{"position":[[981,8],[3727,8]]},"483":{"position":[[1656,8],[2014,8]]},"488":{"position":[[720,8]]},"490":{"position":[[476,8]]},"496":{"position":[[384,8]]},"557":{"position":[[1542,8]]},"559":{"position":[[893,8]]},"563":{"position":[[31,8]]},"618":{"position":[[481,8]]},"633":{"position":[[949,8]]}}}],["multiscrobbl",{"_index":635,"t":{"31":{"position":[[930,14]]}}}],["musibrainz",{"_index":1428,"t":{"134":{"position":[[347,10]]}}}],["music",{"_index":601,"t":{"29":{"position":[[698,6]]},"48":{"position":[[87,5]]},"54":{"position":[[87,5]]},"64":{"position":[[549,5],[1160,5],[3321,5]]},"68":{"position":[[87,5]]},"83":{"position":[[408,5],[1019,5],[3146,5]]},"105":{"position":[[97,5]]},"145":{"position":[[32,5],[79,5],[169,5]]},"147":{"position":[[114,5]]},"149":{"position":[[108,5],[331,5],[832,5],[3220,5]]},"151":{"position":[[32,5],[543,5],[1881,5],[2766,7]]},"153":{"position":[[536,5],[2072,7],[3766,7]]},"155":{"position":[[88,5],[160,6]]},"157":{"position":[[101,5],[654,6],[1049,5],[1085,5]]},"178":{"position":[[29,5],[68,5]]},"184":{"position":[[854,7]]},"188":{"position":[[830,6]]},"216":{"position":[[134,5],[429,5],[2666,6]]},"249":{"position":[[8,5],[37,5],[513,5]]},"271":{"position":[[21,5],[56,5]]},"287":{"position":[[72,5]]},"293":{"position":[[53,5]]},"307":{"position":[[1466,6]]},"309":{"position":[[21,5],[45,5],[92,5]]},"325":{"position":[[148,5],[445,5]]},"331":{"position":[[39,5]]},"343":{"position":[[30,5],[188,5],[4978,5],[5384,5]]},"345":{"position":[[1919,7],[3399,7]]},"347":{"position":[[20,5],[138,6],[152,5],[201,5],[411,5],[446,5],[575,5],[622,5],[956,5],[1067,5],[1371,5],[1530,6]]},"349":{"position":[[399,5],[1780,7],[3154,7]]},"351":{"position":[[365,5]]},"453":{"position":[[95,6]]},"457":{"position":[[1060,6],[2887,5]]},"459":{"position":[[384,5],[839,5],[955,5]]},"461":{"position":[[236,5],[352,5]]},"476":{"position":[[6412,5],[6496,5]]},"488":{"position":[[361,5],[745,5]]},"494":{"position":[[77,5]]},"594":{"position":[[81,5],[115,5],[183,5],[273,5]]},"599":{"position":[[362,5],[512,5],[572,5]]},"633":{"position":[[36,5],[157,5],[331,6],[385,5],[532,5],[546,5],[2535,5]]},"637":{"position":[[58,5],[132,5],[155,5],[216,6]]},"639":{"position":[[77,5]]}}}],["music'",{"_index":1604,"t":{"153":{"position":[[635,7]]}}}],["music.apple.com",{"_index":1484,"t":{"147":{"position":[[135,15]]},"149":{"position":[[1060,15],[1844,15]]}}}],["music.youtube.com",{"_index":2494,"t":{"345":{"position":[[598,17]]}}}],["musicbrainz",{"_index":147,"t":{"4":{"position":[[3886,11]]},"12":{"position":[[730,12]]},"14":{"position":[[264,11]]},"18":{"position":[[390,11]]},"25":{"position":[[303,11]]},"64":{"position":[[3075,11],[3405,11]]},"83":{"position":[[2900,11],[3230,11]]},"134":{"position":[[123,11]]},"178":{"position":[[128,11],[479,11],[880,11],[1379,11],[1726,11],[1984,14],[2739,14],[3183,14],[3935,14]]},"222":{"position":[[606,12]]},"297":{"position":[[189,11],[346,11]]},"309":{"position":[[103,11]]},"311":{"position":[[291,11],[357,11],[513,11],[564,11],[778,14],[852,11],[1091,14],[1255,14],[1329,11],[1576,14]]},"359":{"position":[[336,11],[388,11]]},"365":{"position":[[1072,14],[1261,11],[1333,11],[1387,14]]},"369":{"position":[[768,11]]},"372":{"position":[[73,11]]},"374":{"position":[[92,11]]},"459":{"position":[[4,11],[54,11],[449,11],[564,12],[607,11],[1178,11],[1654,11]]},"461":{"position":[[4,11]]},"463":{"position":[[82,11]]},"466":{"position":[[24,11],[254,14],[365,11],[407,11],[609,11],[700,11],[823,14],[926,11]]},"468":{"position":[[45,11],[174,14]]},"470":{"position":[[185,14],[486,14],[774,11],[1071,14]]},"472":{"position":[[1890,11]]},"474":{"position":[[200,11],[249,11]]},"476":{"position":[[221,11],[851,11],[955,11],[2380,11],[3209,11],[4447,11],[4814,11],[5284,11],[5636,11],[5951,11],[6097,11]]},"479":{"position":[[23,11]]},"481":{"position":[[1032,11]]},"483":{"position":[[1228,11],[1361,11],[1640,11]]},"488":{"position":[[15,11]]},"490":{"position":[[136,11],[340,11],[758,11]]},"492":{"position":[[230,11]]},"494":{"position":[[19,11],[293,11],[502,14]]},"496":{"position":[[3,11],[218,11],[699,14]]},"499":{"position":[[74,14],[321,14]]},"501":{"position":[[162,14],[634,14]]},"503":{"position":[[138,11],[351,14],[656,14]]},"505":{"position":[[0,11],[165,11],[259,14],[729,11],[801,11],[855,14]]},"507":{"position":[[483,14],[759,14],[1076,14]]},"509":{"position":[[123,11],[204,11],[537,14],[1023,14],[1116,14],[1589,14]]},"559":{"position":[[24,11],[210,11],[251,11],[361,11],[405,11],[574,11],[657,11],[837,11],[862,11],[2034,13]]},"561":{"position":[[94,11],[138,11],[307,11],[390,11]]},"563":{"position":[[0,11],[1172,13]]},"569":{"position":[[490,11]]},"633":{"position":[[750,11],[2427,11]]}}}],["musicbrainz'",{"_index":1213,"t":{"105":{"position":[[2014,13]]}}}],["musicbrainz/cov",{"_index":898,"t":{"64":{"position":[[383,17]]},"83":{"position":[[292,17]]}}}],["musiccast",{"_index":1630,"t":{"157":{"position":[[1008,9]]},"331":{"position":[[8,9],[99,9],[386,9],[414,9]]},"333":{"position":[[487,9],[697,9],[1040,9],[1123,9],[1353,9],[1975,9],[2170,9],[2692,9],[3089,11]]},"633":{"position":[[515,9]]}}}],["musickit",{"_index":1504,"t":{"149":{"position":[[392,8],[654,8],[3051,8],[3281,8]]}}}],["musicservicebasedomain",{"_index":2355,"t":{"325":{"position":[[724,22]]}}}],["musictrack",{"_index":1986,"t":{"216":{"position":[[1962,11]]}}}],["musicvideo",{"_index":1848,"t":{"188":{"position":[[5349,13],[7178,13]]}}}],["musikcub",{"_index":1626,"t":{"157":{"position":[[700,9]]},"283":{"position":[[16,9],[166,9]]},"285":{"position":[[342,9],[429,9],[606,9],[816,9],[1159,9],[1242,9],[1472,9],[1777,12],[2139,9],[2334,9],[2856,9],[3152,12]]},"588":{"position":[[684,12],[1274,12]]},"633":{"position":[[375,9]]}}}],["musl",{"_index":1973,"t":{"216":{"position":[[1112,4]]}}}],["mutli",{"_index":2375,"t":{"327":{"position":[[1203,5],[2148,5]]}}}],["mvp",{"_index":3398,"t":{"599":{"position":[[2084,3]]}}}],["mx",{"_index":2985,"t":{"481":{"position":[[1021,3]]}}}],["my\",\"optional\",\"tag",{"_index":580,"t":{"27":{"position":[[1841,24]]}}}],["my.domain.local:80",{"_index":307,"t":{"10":{"position":[[869,18]]}}}],["my.domain.local:9000",{"_index":309,"t":{"10":{"position":[[928,20]]}}}],["my.domain.tld/api",{"_index":2468,"t":{"343":{"position":[[3561,20]]}}}],["my/host/folder:/msdata",{"_index":3104,"t":{"543":{"position":[[671,26]]}}}],["my_api_key_placedhold",{"_index":3191,"t":{"559":{"position":[[1854,26]]},"563":{"position":[[992,26]]}}}],["my_apikey",{"_index":247,"t":{"8":{"position":[[597,16]]}}}],["my_apikey=a89cba1569901a0671d5a9875fed4be1",{"_index":253,"t":{"8":{"position":[[814,42]]}}}],["my_env",{"_index":242,"t":{"8":{"position":[[391,10],[463,6]]}}}],["my_password",{"_index":2165,"t":{"281":{"position":[[1819,13],[3190,13]]},"285":{"position":[[1898,13],[3273,13]]}}}],["my_secret",{"_index":249,"t":{"8":{"position":[[624,16]]}}}],["my_secret=ec42e09d5ae0ee0f0816ca151008412a",{"_index":254,"t":{"8":{"position":[[857,42]]}}}],["my_secret_placehold",{"_index":3192,"t":{"559":{"position":[[1891,24]]},"563":{"position":[[1029,24]]}}}],["my_token",{"_index":3239,"t":{"581":{"position":[[399,8]]}}}],["myapikey",{"_index":1717,"t":{"174":{"position":[[2216,11],[3237,11]]},"178":{"position":[[2890,11],[4093,11]]}}}],["myapplemus",{"_index":1590,"t":{"151":{"position":[[2732,15]]},"153":{"position":[[2038,15],[3732,15]]}}}],["myapprisefriendlynameforlog",{"_index":576,"t":{"27":{"position":[[1583,31]]}}}],["myazura",{"_index":1799,"t":{"186":{"position":[[1857,10],[3287,10]]}}}],["mybasicsourc",{"_index":3402,"t":{"599":{"position":[[2822,13]]}}}],["mybasicsourcesourc",{"_index":3408,"t":{"599":{"position":[[3494,19]]}}}],["mycast",{"_index":1989,"t":{"216":{"position":[[2301,9],[2833,9],[3492,9]]},"218":{"position":[[2170,9],[3547,9]]}}}],["mycdn",{"_index":924,"t":{"64":{"position":[[2569,7]]},"83":{"position":[[2428,7]]}}}],["mycdn\",\"jellyfin",{"_index":915,"t":{"64":{"position":[[1426,20]]},"83":{"position":[[1285,20]]}}}],["mycomponentid",{"_index":739,"t":{"46":{"position":[[167,13]]},"66":{"position":[[169,13]]},"85":{"position":[[169,13]]},"91":{"position":[[168,13]]},"95":{"position":[[168,13]]},"103":{"position":[[169,13]]},"110":{"position":[[1221,13]]},"114":{"position":[[164,13]]},"143":{"position":[[744,13]]},"153":{"position":[[172,13]]},"186":{"position":[[167,13]]},"188":{"position":[[2280,13]]},"198":{"position":[[168,13]]},"202":{"position":[[169,13]]},"208":{"position":[[168,13]]},"214":{"position":[[166,13]]},"218":{"position":[[259,13]]},"220":{"position":[[529,13]]},"234":{"position":[[165,13]]},"253":{"position":[[165,13]]},"257":{"position":[[176,13]]},"261":{"position":[[171,13]]},"265":{"position":[[175,13]]},"269":{"position":[[175,13]]},"277":{"position":[[168,13]]},"281":{"position":[[165,13]]},"285":{"position":[[164,13]]},"291":{"position":[[333,13]]},"295":{"position":[[167,13]]},"301":{"position":[[292,13]]},"305":{"position":[[169,13]]},"317":{"position":[[170,13]]},"325":{"position":[[1624,13]]},"329":{"position":[[165,13]]},"333":{"position":[[167,13]]},"341":{"position":[[164,13]]},"345":{"position":[[165,13]]},"349":{"position":[[170,13]]}}}],["myconfig",{"_index":185,"t":{"4":{"position":[[4918,13]]},"423":{"position":[[166,8]]},"549":{"position":[[2013,13],[2212,11]]}}}],["mydeez",{"_index":1863,"t":{"194":{"position":[[303,11]]},"196":{"position":[[306,9]]}}}],["mydeezerid",{"_index":1900,"t":{"198":{"position":[[1828,13],[3268,13]]}}}],["mydiscordloc",{"_index":1093,"t":{"85":{"position":[[2007,17],[3383,17]]}}}],["mydiscordremot",{"_index":955,"t":{"66":{"position":[[2248,18],[3666,18]]}}}],["mydomain.com",{"_index":1224,"t":{"110":{"position":[[246,12]]},"143":{"position":[[345,12]]}}}],["mydomain.com:80/jriverreverse/mcws/v1",{"_index":1935,"t":{"206":{"position":[[917,38],[956,38]]}}}],["mydomain.com:80/kodireverse/jsonrpc",{"_index":1951,"t":{"212":{"position":[[898,35]]}}}],["mydomainorip:9078",{"_index":2050,"t":{"232":{"position":[[271,20]]},"251":{"position":[[271,20]]}}}],["myemail@myemailprovider.com",{"_index":2316,"t":{"311":{"position":[[916,29],[1393,29]]}}}],["mygotifyfriendlynameforlog",{"_index":566,"t":{"27":{"position":[[849,30]]}}}],["mygotifytoken",{"_index":203,"t":{"4":{"position":[[5417,16]]}}}],["myicestation1",{"_index":1922,"t":{"202":{"position":[[1680,16],[3012,16]]}}}],["myici",{"_index":1911,"t":{"200":{"position":[[1925,8]]}}}],["myjellyfin",{"_index":1645,"t":{"164":{"position":[[207,13]]},"188":{"position":[[4966,13],[6795,13]]},"503":{"position":[[562,13]]},"505":{"position":[[637,13]]}}}],["myjellyfinsourc",{"_index":3163,"t":{"549":{"position":[[2035,19]]}}}],["mykodi",{"_index":1960,"t":{"214":{"position":[[1791,9],[3163,9]]}}}],["mykoitocli",{"_index":780,"t":{"46":{"position":[[1732,16],[3142,16]]}}}],["mykoitoid",{"_index":3449,"t":{"621":{"position":[[421,9]]},"623":{"position":[[461,12],[776,12]]}}}],["mykoitosourc",{"_index":2018,"t":{"220":{"position":[[2389,16],[3799,16]]}}}],["mylastfm",{"_index":2551,"t":{"355":{"position":[[391,11]]},"357":{"position":[[1362,11]]},"399":{"position":[[86,11]]}}}],["mylastfmcli",{"_index":245,"t":{"8":{"position":[[534,17],[970,17]]},"42":{"position":[[1039,17]]},"91":{"position":[[1903,17],[3375,17]]},"151":{"position":[[2886,17]]}}}],["mylastfmsourc",{"_index":2116,"t":{"269":{"position":[[2215,17],[3687,17]]},"559":{"position":[[1791,17]]},"563":{"position":[[929,17]]}}}],["mylfm",{"_index":1716,"t":{"174":{"position":[[2140,8],[3161,8]]},"178":{"position":[[2814,8],[4017,8]]},"369":{"position":[[694,6]]},"507":{"position":[[646,8]]}}}],["mylfmapp",{"_index":2062,"t":{"234":{"position":[[1954,11],[3276,11]]}}}],["mylibrefmcli",{"_index":1176,"t":{"103":{"position":[[2008,18],[3439,18]]}}}],["mylibrefmsourc",{"_index":2095,"t":{"257":{"position":[[2330,18],[3761,18]]}}}],["mylznavidrom",{"_index":1708,"t":{"174":{"position":[[1830,16],[2881,16]]},"178":{"position":[[2604,16],[3828,16]]},"253":{"position":[[2011,16],[3342,16]]}}}],["mymaloja\",\"koitoa\",\"listenbrainzfoo",{"_index":1646,"t":{"164":{"position":[[232,39]]}}}],["mymalojacli",{"_index":1152,"t":{"95":{"position":[[1674,17],[3054,17]]}}}],["mymalojaid",{"_index":195,"t":{"4":{"position":[[5225,13]]}}}],["mymalojakey",{"_index":197,"t":{"4":{"position":[[5292,13]]},"95":{"position":[[1786,13],[3166,13]]},"265":{"position":[[2084,13],[3464,13]]},"549":{"position":[[2277,13]]}}}],["mymalojasourc",{"_index":2108,"t":{"265":{"position":[[1972,17],[3352,17]]}}}],["mymb",{"_index":1754,"t":{"178":{"position":[[2007,7],[2762,6],[3206,7],[3958,6]]},"311":{"position":[[801,7],[1114,6],[1278,7],[1599,7]]},"365":{"position":[[1095,6],[1410,6]]},"369":{"position":[[780,4]]},"466":{"position":[[277,7],[846,7]]},"468":{"position":[[197,7]]},"470":{"position":[[208,6],[509,6],[1094,7]]},"494":{"position":[[525,7]]},"496":{"position":[[722,7]]},"499":{"position":[[97,7],[344,6]]},"501":{"position":[[185,7],[657,6]]},"503":{"position":[[374,7],[679,7]]},"505":{"position":[[282,7],[878,6]]},"507":{"position":[[506,7],[782,7],[1099,7]]},"509":{"position":[[560,7],[1139,7]]}}}],["mymopidi",{"_index":2149,"t":{"277":{"position":[[2032,11],[3406,11]]}}}],["mympd",{"_index":2163,"t":{"281":{"position":[[1740,8],[3111,8]]}}}],["mymprisubuntu",{"_index":2205,"t":{"295":{"position":[[1787,16],[3133,16]]}}}],["mymultiscrobblerip:9078",{"_index":630,"t":{"31":{"position":[[759,27]]}}}],["mymultiscrobblertop",{"_index":214,"t":{"4":{"position":[[5585,24]]}}}],["mymusikcub",{"_index":2178,"t":{"285":{"position":[[1831,14],[3206,14]]}}}],["myn",{"_index":2582,"t":{"365":{"position":[[1133,10],[1493,10]]}}}],["mynativetransform",{"_index":2563,"t":{"361":{"position":[[536,22],[912,21],[2051,22],[2427,22]]},"387":{"position":[[92,22],[469,21]]},"389":{"position":[[92,22],[368,21]]}}}],["myntfyfriendlynameforlog",{"_index":211,"t":{"4":{"position":[[5515,28]]},"27":{"position":[[1200,28]]}}}],["myoptionalslug",{"_index":2433,"t":{"341":{"position":[[1804,17],[3164,17]]}}}],["mypassword",{"_index":1962,"t":{"214":{"position":[[1901,12],[3273,12]]}}}],["myplex",{"_index":2318,"t":{"311":{"position":[[1001,9],[1470,9]]}}}],["myriv",{"_index":1943,"t":{"208":{"position":[[1839,10],[3196,10]]}}}],["myrockskycli",{"_index":1246,"t":{"110":{"position":[[2904,18],[4345,18]]}}}],["myrockskysourc",{"_index":2184,"t":{"291":{"position":[[2199,18],[3640,18]]}}}],["mysecret",{"_index":1718,"t":{"174":{"position":[[2238,11],[3259,11]]},"178":{"position":[[2912,11],[4115,11]]}}}],["mysite.com",{"_index":2680,"t":{"397":{"position":[[758,14],[800,14],[854,13]]}}}],["myslug",{"_index":2046,"t":{"230":{"position":[[956,8]]},"234":{"position":[[1984,8],[3306,8]]}}}],["mysono",{"_index":2215,"t":{"297":{"position":[[1401,10]]},"301":{"position":[[2255,10],[3683,10]]}}}],["mysourc",{"_index":2744,"t":{"425":{"position":[[1377,8]]}}}],["myspotifi",{"_index":2296,"t":{"305":{"position":[[1794,12],[3268,12]]},"507":{"position":[[983,12]]}}}],["myspotify1\",\"myjellyfin2",{"_index":700,"t":{"42":{"position":[[1333,28]]}}}],["myspotifyid",{"_index":187,"t":{"4":{"position":[[4967,14]]}}}],["mysubson",{"_index":2340,"t":{"317":{"position":[[1778,13],[3243,13]]},"361":{"position":[[801,13],[1512,13],[2316,13]]},"382":{"position":[[291,13]]},"387":{"position":[[357,13]]},"389":{"position":[[256,13]]},"391":{"position":[[289,13]]},"395":{"position":[[623,13]]},"470":{"position":[[91,13],[392,13],[977,13]]},"494":{"position":[[408,13]]},"496":{"position":[[591,13]]},"499":{"position":[[227,13]]},"501":{"position":[[540,13]]}}}],["mytealcli",{"_index":1474,"t":{"143":{"position":[[2262,15],[3642,15]]}}}],["mytealsourc",{"_index":2358,"t":{"325":{"position":[[843,15],[1052,15],[1282,15],[3433,15],[4871,15]]}}}],["myth",{"_index":2592,"t":{"369":{"position":[[367,10]]}}}],["mytoken",{"_index":1709,"t":{"174":{"position":[[1894,9],[2917,9]]},"178":{"position":[[2668,9],[3864,9]]},"253":{"position":[[2063,9],[3394,9]]}}}],["myurl",{"_index":3193,"t":{"565":{"position":[[758,5]]}}}],["myuser",{"_index":1961,"t":{"214":{"position":[[1879,9],[3251,9]]},"549":{"position":[[2155,8]]},"565":{"position":[[551,7]]}}}],["myvlc",{"_index":2377,"t":{"327":{"position":[[1609,8],[2404,8]]},"329":{"position":[[1659,8],[2981,8]]},"361":{"position":[[1695,8]]}}}],["mywebscrobbl",{"_index":2431,"t":{"341":{"position":[[1742,17],[3102,17]]}}}],["myyamaha",{"_index":2403,"t":{"333":{"position":[[1687,11],[3017,11]]}}}],["myyandex",{"_index":2529,"t":{"349":{"position":[[1752,11],[3126,11]]}}}],["myytm",{"_index":2445,"t":{"343":{"position":[[1069,8],[2616,8],[3845,8]]},"457":{"position":[[1553,8],[1740,6],[2388,8]]}}}],["myytm.log",{"_index":2878,"t":{"457":{"position":[[2547,9]]}}}],["myytmus",{"_index":2496,"t":{"345":{"position":[[1889,12],[3369,12]]}}}],["n",{"_index":1554,"t":{"149":{"position":[[3798,2]]}}}],["n+1",{"_index":2847,"t":{"457":{"position":[[788,3]]}}}],["n/a",{"_index":1375,"t":{"118":{"position":[[4695,3]]}}}],["naiv",{"_index":2955,"t":{"476":{"position":[[4098,5],[4131,5],[5125,5],[5131,7],[5417,5],[5830,5],[5903,7]]}}}],["name",{"_index":108,"t":{"4":{"position":[[2344,5],[2590,7],[2793,7],[2947,7],[3137,4],[4932,7],[4954,6],[5196,7],[5329,7],[5507,7],[5905,7],[6256,4]]},"8":{"position":[[457,5],[526,7],[962,7],[1532,5],[1576,5],[1678,4],[1748,5],[1800,5],[1865,4]]},"12":{"position":[[946,4]]},"14":{"position":[[549,5]]},"27":{"position":[[418,7],[522,7],[581,7],[841,7],[1192,7],[1575,7]]},"29":{"position":[[364,4]]},"35":{"position":[[0,4]]},"42":{"position":[[829,5],[862,4],[1031,7],[1199,5]]},"44":{"position":[[1654,4]]},"46":{"position":[[226,4],[1700,7],[3110,7]]},"60":{"position":[[882,7],[1765,5],[1978,7]]},"62":{"position":[[323,4]]},"66":{"position":[[232,4],[895,5],[2207,7],[3625,7]]},"71":{"position":[[176,4]]},"73":{"position":[[1534,5],[2683,5],[2711,5],[4872,5],[4982,5],[5049,5],[5219,4],[8756,5],[9552,5]]},"77":{"position":[[133,5],[1282,5],[1310,5]]},"85":{"position":[[232,4],[1966,7],[3342,7]]},"91":{"position":[[229,4],[1870,7],[3342,7]]},"95":{"position":[[229,4],[1643,7],[3023,7]]},"103":{"position":[[232,4],[1973,7],[3404,7]]},"110":{"position":[[1284,4],[2923,7],[4364,7]]},"114":{"position":[[217,4],[1791,7],[3241,7]]},"143":{"position":[[805,4],[2278,7],[3658,7]]},"147":{"position":[[409,5]]},"149":{"position":[[1393,6],[2166,4]]},"151":{"position":[[1851,4],[1929,4],[1999,5],[2157,4],[2624,7],[2748,7],[2853,7],[3171,7]]},"153":{"position":[[241,4],[2054,7],[3748,7]]},"157":{"position":[[0,4]]},"164":{"position":[[126,4],[199,7],[493,5],[549,4],[620,4]]},"174":{"position":[[342,5],[649,4],[1589,7],[1847,7],[1953,7],[2149,7],[2354,7],[2620,7],[2847,7],[2968,7],[3170,7],[3367,7]]},"176":{"position":[[608,7],[788,7],[994,7],[1161,7],[1347,7],[1558,7],[1820,7],[2022,7],[2222,7],[2424,7],[2628,7],[2831,7]]},"178":{"position":[[782,4],[1999,7],[2363,7],[2621,7],[2754,7],[2823,7],[3198,7],[3567,7],[3794,7],[3950,7],[4026,7]]},"184":{"position":[[194,5],[659,5],[754,7]]},"186":{"position":[[226,4],[1827,7],[1930,6],[3257,7],[3360,6]]},"188":{"position":[[264,4],[2345,4],[2998,4],[3122,4],[3232,4],[3343,4],[4918,7],[6747,7]]},"192":{"position":[[500,4],[729,5]]},"194":{"position":[[295,7]]},"196":{"position":[[333,5],[375,5],[417,5],[461,5],[702,7]]},"198":{"position":[[229,4],[1796,7],[3236,7]]},"200":{"position":[[1917,7]]},"202":{"position":[[232,4],[1637,7],[2969,7]]},"208":{"position":[[229,4],[1805,7],[3162,7]]},"214":{"position":[[223,4],[1759,7],[3131,7]]},"216":{"position":[[2258,6],[2293,7],[2372,4],[2760,5],[2825,7],[3484,7]]},"218":{"position":[[312,4],[2145,7],[3522,7]]},"220":{"position":[[602,4],[2357,7],[3767,7]]},"234":{"position":[[220,4],[1909,7],[3231,7]]},"253":{"position":[[220,4],[1977,7],[3308,7]]},"257":{"position":[[253,4],[2295,7],[3726,7]]},"261":{"position":[[238,4],[2114,7],[3564,7]]},"265":{"position":[[250,4],[1941,7],[3321,7]]},"269":{"position":[[250,4],[2182,7],[3654,7]]},"275":{"position":[[124,5],[218,4]]},"277":{"position":[[229,4],[2000,7],[3374,7]]},"281":{"position":[[220,4],[1749,7],[3120,7]]},"285":{"position":[[217,4],[1806,7],[3181,7]]},"291":{"position":[[410,4],[2218,7],[3659,7]]},"295":{"position":[[226,4],[1762,7],[3108,7]]},"297":{"position":[[1393,7]]},"299":{"position":[[135,5]]},"301":{"position":[[351,4],[555,4],[661,4],[761,4],[904,4],[2266,7],[3694,7]]},"305":{"position":[[232,4],[1807,7],[3281,7]]},"309":{"position":[[218,4],[234,6]]},"311":{"position":[[793,7],[993,7],[1106,7],[1270,7],[1462,7],[1591,7]]},"317":{"position":[[235,4],[1792,7],[3257,7]]},"325":{"position":[[259,4],[835,7],[1044,7],[1274,7],[1699,4],[3449,7],[4887,7]]},"327":{"position":[[1338,5],[1601,7],[2111,4],[2191,4],[2396,7]]},"329":{"position":[[220,4],[1668,7],[2990,7]]},"333":{"position":[[226,4],[1650,7],[2980,7]]},"335":{"position":[[218,5]]},"337":{"position":[[183,7],[267,7]]},"339":{"position":[[89,4]]},"341":{"position":[[217,4],[1760,7],[3120,7]]},"343":{"position":[[1061,7],[2224,4],[2608,7],[3837,7]]},"345":{"position":[[220,4],[1902,7],[3382,7]]},"349":{"position":[[235,4],[1764,7],[3138,7]]},"355":{"position":[[383,7]]},"357":{"position":[[1354,7]]},"361":{"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]]},"365":{"position":[[1087,7],[1125,7],[1402,7],[1485,7]]},"369":{"position":[[359,7]]},"376":{"position":[[389,5],[449,4]]},"382":{"position":[[197,4],[283,7],[413,5]]},"387":{"position":[[84,7],[349,7],[461,7]]},"389":{"position":[[84,7],[248,7],[360,7]]},"391":{"position":[[281,7]]},"393":{"position":[[368,5]]},"395":{"position":[[235,7],[529,4],[615,7]]},"399":{"position":[[78,7]]},"423":{"position":[[177,5]]},"435":{"position":[[1607,4],[1848,4],[1985,4]]},"457":{"position":[[1545,7],[2380,7],[2533,5],[2579,6]]},"466":{"position":[[269,7],[838,7]]},"468":{"position":[[189,7]]},"470":{"position":[[83,7],[200,7],[384,7],[501,7],[969,7],[1086,7]]},"476":{"position":[[3570,4]]},"481":{"position":[[1290,4]]},"483":{"position":[[1490,5],[1507,5],[1744,4],[2184,5],[2201,6]]},"488":{"position":[[265,6]]},"494":{"position":[[400,7],[517,7]]},"496":{"position":[[583,7],[714,7]]},"499":{"position":[[89,7],[219,7],[336,7]]},"501":{"position":[[177,7],[532,7],[649,7]]},"503":{"position":[[366,7],[554,7],[671,7]]},"505":{"position":[[274,7],[629,7],[870,7]]},"507":{"position":[[498,7],[638,7],[774,7],[975,7],[1091,7]]},"509":{"position":[[552,7],[929,7],[1131,7],[1476,7]]},"543":{"position":[[1615,4]]},"545":{"position":[[622,4]]},"549":{"position":[[2027,7],[2204,7]]},"555":{"position":[[286,4]]},"559":{"position":[[1783,7]]},"563":{"position":[[921,7]]},"565":{"position":[[1302,4]]},"586":{"position":[[733,5]]},"588":{"position":[[895,5]]},"604":{"position":[[379,5]]},"616":{"position":[[516,4]]},"623":{"position":[[406,7],[704,7],[1007,4],[1048,4],[1145,4]]},"625":{"position":[[193,5],[227,4],[564,5]]},"631":{"position":[[104,5],[186,4],[538,5]]},"637":{"position":[[286,5],[383,5]]},"639":{"position":[[202,5]]}}}],["name=[nameofsourc",{"_index":2471,"t":{"343":{"position":[[3660,19]]}}}],["names/interpol",{"_index":257,"t":{"8":{"position":[[1197,19]]}}}],["name}.json",{"_index":2745,"t":{"425":{"position":[[1386,13]]}}}],["nan",{"_index":1275,"t":{"118":{"position":[[562,4]]}}}],["nana",{"_index":1276,"t":{"118":{"position":[[570,4]]}}}],["nash",{"_index":2664,"t":{"389":{"position":[[165,4]]}}}],["nativ",{"_index":959,"t":{"73":{"position":[[265,6],[536,6],[7336,8],[7389,6]]},"110":{"position":[[722,6]]},"118":{"position":[[2144,6]]},"178":{"position":[[1029,7],[2251,9],[3450,9]]},"359":{"position":[[242,6],[665,8]]},"361":{"position":[[518,9],[895,8],[982,8],[1198,9],[1318,9],[1606,8],[1784,8],[2033,9],[2410,8]]},"363":{"position":[[185,9]]},"365":{"position":[[1006,6],[1044,6],[1115,9],[1303,7],[1323,6],[1475,9]]},"367":{"position":[[1245,6],[1303,9],[1428,6],[1502,6],[1585,9]]},"374":{"position":[[79,6]]},"376":{"position":[[4,6],[670,6]]},"378":{"position":[[1073,6]]},"380":{"position":[[136,9]]},"382":{"position":[[47,6],[385,9],[431,6]]},"384":{"position":[[849,6]]},"387":{"position":[[74,9],[451,9]]},"389":{"position":[[74,9],[350,9]]},"391":{"position":[[383,9]]},"472":{"position":[[665,6],[709,6],[1727,7]]},"476":{"position":[[4032,8],[4088,6],[4110,6],[4137,6],[4144,8],[4198,6],[4372,6],[4466,6],[5040,6],[5114,8]]},"488":{"position":[[670,6],[1158,8]]},"501":{"position":[[427,8]]},"505":{"position":[[99,6],[137,6],[524,9],[771,7],[791,6],[943,8]]},"507":{"position":[[812,8]]},"509":{"position":[[823,9],[1402,9]]},"549":{"position":[[1473,6]]}}}],["navidrom",{"_index":1677,"t":{"174":{"position":[[175,9],[940,9],[1863,11],[2863,11]]},"178":{"position":[[182,10],[348,9],[1294,9],[1416,9],[2637,11],[3810,11]]},"238":{"position":[[352,10],[660,9],[1084,9],[1857,9],[2903,10]]},"253":{"position":[[1993,11],[3324,11]]},"313":{"position":[[139,10],[406,11]]},"553":{"position":[[327,10]]},"557":{"position":[[113,9],[1368,9],[1627,9],[2079,10],[2194,9],[2375,9],[2479,10]]},"559":{"position":[[992,9]]},"563":{"position":[[130,9]]},"633":{"position":[[472,10]]},"637":{"position":[[223,10]]}}}],["navidrome'",{"_index":3174,"t":{"557":{"position":[[1477,11]]}}}],["navig",{"_index":703,"t":{"44":{"position":[[208,8]]},"73":{"position":[[2776,8]]},"79":{"position":[[0,8]]},"89":{"position":[[195,8],[296,10]]},"93":{"position":[[325,8]]},"99":{"position":[[195,8],[296,10]]},"107":{"position":[[52,8],[129,8]]},"140":{"position":[[197,8]]},"147":{"position":[[243,8]]},"149":{"position":[[1147,8],[1743,8],[1939,8]]},"184":{"position":[[538,8]]},"188":{"position":[[108,8]]},"249":{"position":[[56,8]]},"303":{"position":[[1081,8],[1848,8],[2070,8],[4468,8]]},"327":{"position":[[535,10]]},"343":{"position":[[2117,8]]},"565":{"position":[[300,8],[2083,8]]},"633":{"position":[[1567,8]]}}}],["nd_listenbrainz_baseurl",{"_index":2075,"t":{"247":{"position":[[42,24]]},"557":{"position":[[2124,24]]}}}],["nd_listenbrainz_baseurl=http://192.168.0.100:9078/1",{"_index":3177,"t":{"557":{"position":[[2314,52]]}}}],["nearli",{"_index":2836,"t":{"451":{"position":[[599,6]]}}}],["necessari",{"_index":1803,"t":{"188":{"position":[[683,9]]},"224":{"position":[[527,10],[948,10]]},"238":{"position":[[518,10],[933,10]]},"303":{"position":[[2159,9]]},"343":{"position":[[1822,10]]},"365":{"position":[[807,9]]},"425":{"position":[[1719,10]]}}}],["necessarili",{"_index":3365,"t":{"594":{"position":[[1327,11]]}}}],["need",{"_index":91,"t":{"4":{"position":[[1727,4]]},"10":{"position":[[429,4]]},"22":{"position":[[14,4]]},"54":{"position":[[1035,5],[1151,5],[1213,4],[1394,4]]},"64":{"position":[[4045,4]]},"73":{"position":[[786,7],[3892,4],[4415,4],[4821,4],[5319,4]]},"83":{"position":[[3837,4]]},"87":{"position":[[1203,4]]},"97":{"position":[[148,4],[277,6]]},"105":{"position":[[2168,4]]},"107":{"position":[[9,4]]},"112":{"position":[[244,4]]},"118":{"position":[[4662,7]]},"120":{"position":[[414,4]]},"130":{"position":[[414,5]]},"149":{"position":[[356,7],[984,5],[3206,4]]},"182":{"position":[[269,4]]},"184":{"position":[[114,5],[1077,4]]},"204":{"position":[[264,4]]},"210":{"position":[[251,4]]},"224":{"position":[[143,4],[1531,4],[2428,4]]},"228":{"position":[[70,4],[421,4]]},"230":{"position":[[7,4]]},"238":{"position":[[143,4],[1512,4],[2414,4]]},"244":{"position":[[7,4]]},"259":{"position":[[343,4]]},"307":{"position":[[379,4]]},"325":{"position":[[277,4]]},"343":{"position":[[531,5],[3299,4],[4178,4],[4639,4]]},"347":{"position":[[897,4],[1008,4]]},"351":{"position":[[241,4]]},"357":{"position":[[836,4]]},"372":{"position":[[50,6]]},"425":{"position":[[960,6],[2327,5]]},"435":{"position":[[1805,4]]},"457":{"position":[[112,5]]},"476":{"position":[[1296,6]]},"496":{"position":[[355,6],[417,4]]},"559":{"position":[[287,5]]},"561":{"position":[[20,5]]},"579":{"position":[[138,4]]},"588":{"position":[[104,4]]},"594":{"position":[[680,4],[1339,4]]},"599":{"position":[[1391,4]]},"621":{"position":[[313,5]]},"633":{"position":[[1938,4]]},"637":{"position":[[301,6]]},"639":{"position":[[217,6]]},"647":{"position":[[234,4]]}}}],["netstat",{"_index":1034,"t":{"73":{"position":[[4140,7],[4546,7]]}}}],["network",{"_index":957,"t":{"73":{"position":[[234,8],[5702,7],[7088,7],[9347,7]]},"85":{"position":[[370,7]]},"149":{"position":[[1163,7],[1955,7]]},"157":{"position":[[5,10]]},"160":{"position":[[203,7]]},"188":{"position":[[1449,7]]},"204":{"position":[[163,7],[187,7]]},"206":{"position":[[485,7]]},"293":{"position":[[1362,7],[1418,7]]},"335":{"position":[[676,7]]},"425":{"position":[[366,7],[901,9],[2779,7]]},"435":{"position":[[1331,8],[2296,7]]},"439":{"position":[[30,7],[820,8],[1018,8]]},"543":{"position":[[8,10],[746,7],[1143,7]]},"633":{"position":[[1080,7]]}}}],["network/usb/cd",{"_index":2392,"t":{"331":{"position":[[55,14]]}}}],["network/your",{"_index":2345,"t":{"319":{"position":[[168,12]]}}}],["never",{"_index":678,"t":{"40":{"position":[[332,5]]},"57":{"position":[[885,5]]},"118":{"position":[[2079,5]]},"151":{"position":[[1495,5]]},"168":{"position":[[792,5]]},"182":{"position":[[1107,5]]},"200":{"position":[[1205,5],[1349,5]]},"481":{"position":[[1695,5]]}}}],["new",{"_index":707,"t":{"44":{"position":[[269,3]]},"62":{"position":[[291,4]]},"71":{"position":[[144,4]]},"87":{"position":[[1108,3]]},"93":{"position":[[448,3]]},"107":{"position":[[206,3]]},"118":{"position":[[3594,5],[3862,3],[4098,3]]},"136":{"position":[[1000,3]]},"140":{"position":[[308,3]]},"145":{"position":[[103,3]]},"160":{"position":[[1309,3]]},"166":{"position":[[108,6]]},"188":{"position":[[247,3]]},"255":{"position":[[69,3]]},"267":{"position":[[68,3]]},"297":{"position":[[1746,3]]},"303":{"position":[[5205,3]]},"315":{"position":[[29,3],[158,3]]},"343":{"position":[[1333,3],[1842,3],[1952,3]]},"353":{"position":[[192,3],[232,3]]},"357":{"position":[[1468,5],[1563,3]]},"419":{"position":[[418,3]]},"435":{"position":[[473,3]]},"441":{"position":[[1193,3]]},"457":{"position":[[357,3],[705,3],[815,3],[2985,3]]},"470":{"position":[[1208,3]]},"524":{"position":[[227,3],[309,3],[350,3],[431,3]]},"555":{"position":[[9,3]]},"557":{"position":[[1743,3],[3002,3]]},"565":{"position":[[361,3],[2209,3]]},"573":{"position":[[9,3]]},"575":{"position":[[162,3]]},"579":{"position":[[73,3]]},"581":{"position":[[34,3]]},"584":{"position":[[17,3],[138,3],[1160,3],[1897,3]]},"586":{"position":[[18,3]]},"588":{"position":[[1066,3],[1338,3]]},"592":{"position":[[581,3],[948,3],[1101,3],[1230,3],[2588,3]]},"594":{"position":[[2840,3]]},"597":{"position":[[1070,3]]},"599":{"position":[[726,3],[1039,4],[1841,3],[2688,3],[2911,5]]},"610":{"position":[[156,3],[217,3]]},"614":{"position":[[206,3]]},"616":{"position":[[681,3]]},"627":{"position":[[374,3],[741,3]]},"633":{"position":[[1342,3],[1416,3]]},"635":{"position":[[124,3]]}}}],["newer",{"_index":3441,"t":{"618":{"position":[[355,5]]}}}],["newli",{"_index":2460,"t":{"343":{"position":[[2452,5]]},"594":{"position":[[763,7]]}}}],["newplay",{"_index":3381,"t":{"594":{"position":[[2760,8],[2775,8],[2971,9]]}}}],["newsourc",{"_index":3306,"t":{"588":{"position":[[1219,10],[1320,9]]}}}],["next",{"_index":1667,"t":{"168":{"position":[[454,4]]},"182":{"position":[[781,4]]},"200":{"position":[[881,4]]},"365":{"position":[[55,4],[706,4]]},"476":{"position":[[809,4]]},"545":{"position":[[277,4]]},"592":{"position":[[0,4]]},"599":{"position":[[1880,4]]},"616":{"position":[[120,4]]},"623":{"position":[[377,4],[661,4]]},"625":{"position":[[895,4]]}}}],["nginx/traefik/caddi",{"_index":2266,"t":{"303":{"position":[[2735,21]]}}}],["nice",{"_index":2539,"t":{"351":{"position":[[797,4]]}}}],["nightli",{"_index":1054,"t":{"73":{"position":[[5176,8]]}}}],["nightmar",{"_index":2867,"t":{"457":{"position":[[1968,10]]}}}],["nmigtageambmgbyqgsm49ageg",{"_index":1552,"t":{"149":{"position":[[3583,29]]},"153":{"position":[[2208,29],[3902,29]]}}}],["node",{"_index":789,"t":{"46":{"position":[[2156,4]]},"66":{"position":[[2667,4]]},"85":{"position":[[2384,4]]},"91":{"position":[[2386,4]]},"95":{"position":[[2067,4]]},"103":{"position":[[2446,4]]},"110":{"position":[[3381,4]]},"114":{"position":[[2273,4]]},"143":{"position":[[2680,4]]},"153":{"position":[[2762,4]]},"186":{"position":[[2258,4]]},"188":{"position":[[5787,4]]},"198":{"position":[[2280,4]]},"202":{"position":[[2011,4]]},"208":{"position":[[2206,4]]},"214":{"position":[[2179,4]]},"218":{"position":[[2558,4]]},"220":{"position":[[2813,4]]},"234":{"position":[[2265,4]]},"253":{"position":[[2344,4]]},"257":{"position":[[2768,4]]},"261":{"position":[[2596,4]]},"265":{"position":[[2365,4]]},"269":{"position":[[2698,4]]},"277":{"position":[[2418,4]]},"281":{"position":[[2139,4]]},"285":{"position":[[2182,4]]},"291":{"position":[[2676,4]]},"295":{"position":[[2154,4]]},"301":{"position":[[2707,4]]},"305":{"position":[[2304,4]]},"309":{"position":[[498,4]]},"311":{"position":[[31,4]]},"317":{"position":[[2277,4]]},"325":{"position":[[3909,4]]},"329":{"position":[[2009,4]]},"333":{"position":[[2018,4]]},"341":{"position":[[2128,4]]},"345":{"position":[[2405,4]]},"349":{"position":[[2160,4]]},"417":{"position":[[21,4],[165,4],[365,4]]},"431":{"position":[[46,4]]},"528":{"position":[[48,4]]},"535":{"position":[[125,4],[305,4],[483,4]]},"549":{"position":[[242,4],[1547,4],[1621,6],[1905,4]]}}}],["node/npm",{"_index":2189,"t":{"293":{"position":[[545,9]]}}}],["node@^4.9.6",{"_index":3160,"t":{"549":{"position":[[1698,12]]}}}],["node_env=product",{"_index":2771,"t":{"431":{"position":[[26,19]]}}}],["node_modul",{"_index":3076,"t":{"535":{"position":[[178,12]]}}}],["node_modules/.bin/tsx",{"_index":2772,"t":{"431":{"position":[[51,21]]}}}],["nodej",{"_index":1984,"t":{"216":{"position":[[1513,6]]},"633":{"position":[[1317,6]]}}}],["nois",{"_index":1516,"t":{"149":{"position":[[950,5]]}}}],["noisi",{"_index":522,"t":{"20":{"position":[[267,5]]},"515":{"position":[[183,6]]}}}],["non",{"_index":442,"t":{"18":{"position":[[719,3],[893,3]]},"54":{"position":[[734,3]]},"57":{"position":[[389,3]]},"73":{"position":[[5481,4],[6867,4],[8710,4]]},"110":{"position":[[263,3]]},"118":{"position":[[320,3]]},"143":{"position":[[362,3]]},"178":{"position":[[1710,3]]},"271":{"position":[[85,3]]},"303":{"position":[[1147,4]]},"376":{"position":[[217,3]]},"451":{"position":[[349,3]]},"483":{"position":[[2053,3]]},"490":{"position":[[310,3]]},"599":{"position":[[1135,3]]},"612":{"position":[[109,3]]},"616":{"position":[[410,3]]}}}],["none",{"_index":274,"t":{"8":{"position":[[1641,4]]},"64":{"position":[[1456,4]]},"83":{"position":[[1315,4]]},"182":{"position":[[189,4]]},"206":{"position":[[758,5]]},"212":{"position":[[748,5]]},"271":{"position":[[1059,5]]},"363":{"position":[[927,4]]},"369":{"position":[[868,6]]},"435":{"position":[[845,8]]},"524":{"position":[[386,4]]}}}],["normal",{"_index":611,"t":{"31":{"position":[[324,8]]},"64":{"position":[[3131,8]]},"73":{"position":[[3018,9]]},"79":{"position":[[242,9]]},"83":{"position":[[2956,8]]},"105":{"position":[[796,8]]},"118":{"position":[[217,13]]},"134":{"position":[[85,9],[371,9]]},"138":{"position":[[794,8]]},"151":{"position":[[1856,14]]},"303":{"position":[[1266,8]]},"343":{"position":[[942,6]]},"395":{"position":[[243,13]]},"490":{"position":[[160,10],[314,6]]},"513":{"position":[[467,9]]},"592":{"position":[[487,6],[1341,11]]}}}],["normalization/simiarl",{"_index":1384,"t":{"118":{"position":[[4996,25]]}}}],["normalizealbum",{"_index":1587,"t":{"151":{"position":[[2284,17],[2807,17]]},"153":{"position":[[2468,17],[4162,17]]}}}],["normalizeprotocol",{"_index":3332,"t":{"592":{"position":[[543,18]]}}}],["normalizeurl(v",{"_index":3330,"t":{"592":{"position":[[496,17]]}}}],["note",{"_index":135,"t":{"4":{"position":[[3215,5]]},"44":{"position":[[416,4]]},"64":{"position":[[145,4]]},"73":{"position":[[8723,4]]},"81":{"position":[[0,4]]},"87":{"position":[[1466,4]]},"118":{"position":[[1802,4]]},"140":{"position":[[0,4]]},"149":{"position":[[2794,5],[3345,4]]},"151":{"position":[[1316,5]]},"164":{"position":[[294,4],[423,4]]},"168":{"position":[[0,4]]},"184":{"position":[[1284,4]]},"200":{"position":[[73,4]]},"216":{"position":[[150,4],[388,4]]},"218":{"position":[[79,4]]},"228":{"position":[[394,5]]},"271":{"position":[[260,4]]},"307":{"position":[[30,4]]},"339":{"position":[[182,4]]},"363":{"position":[[1032,4]]},"399":{"position":[[387,4]]},"474":{"position":[[0,4]]},"476":{"position":[[7002,4]]},"553":{"position":[[441,4]]},"557":{"position":[[2596,4],[3535,4]]},"559":{"position":[[267,4]]},"561":{"position":[[0,4]]},"565":{"position":[[508,4]]},"599":{"position":[[3888,4]]},"602":{"position":[[196,5],[235,5]]},"606":{"position":[[94,5]]},"608":{"position":[[61,5],[133,6]]},"610":{"position":[[339,5]]},"618":{"position":[[55,6],[126,5],[632,6]]},"625":{"position":[[1079,4]]}}}],["noth",{"_index":448,"t":{"18":{"position":[[1009,7]]},"125":{"position":[[614,7]]},"134":{"position":[[479,8]]},"136":{"position":[[367,7]]}}}],["notic",{"_index":2548,"t":{"355":{"position":[[7,6]]}}}],["notif",{"_index":552,"t":{"27":{"position":[[21,12],[745,12],[1098,12]]},"73":{"position":[[941,13],[1138,14]]},"293":{"position":[[123,12]]},"419":{"position":[[360,12]]},"569":{"position":[[401,12]]}}}],["notifi",{"_index":977,"t":{"73":{"position":[[917,6]]}}}],["now",{"_index":640,"t":{"35":{"position":[[5,3]]},"42":{"position":[[119,3],[146,3],[260,3],[283,3],[466,3],[936,3],[1238,3],[1305,3]]},"48":{"position":[[20,3]]},"54":{"position":[[20,3]]},"68":{"position":[[20,3]]},"73":{"position":[[3091,3]]},"79":{"position":[[315,3]]},"110":{"position":[[954,3]]},"118":{"position":[[2665,4]]},"136":{"position":[[1336,3]]},"151":{"position":[[264,4]]},"180":{"position":[[272,3]]},"244":{"position":[[696,3]]},"315":{"position":[[461,3]]},"327":{"position":[[657,3]]},"343":{"position":[[2383,3],[2799,4]]},"537":{"position":[[69,3]]},"567":{"position":[[283,3],[565,3]]},"575":{"position":[[286,3]]},"584":{"position":[[1876,3],[2140,3]]},"590":{"position":[[0,3]]},"594":{"position":[[3063,3]]},"610":{"position":[[68,5]]},"621":{"position":[[174,3]]},"631":{"position":[[161,3]]},"633":{"position":[[596,4],[881,3],[1385,3]]}}}],["now_playing=fals",{"_index":687,"t":{"42":{"position":[[372,17]]}}}],["now_playing=tru",{"_index":686,"t":{"42":{"position":[[352,16]]}}}],["nowplay",{"_index":697,"t":{"42":{"position":[[1136,15],[1317,15]]}}}],["npm",{"_index":69,"t":{"4":{"position":[[1125,3]]},"417":{"position":[[412,3],[424,3]]},"419":{"position":[[387,3]]},"535":{"position":[[320,3],[498,3]]},"549":{"position":[[255,3],[267,3],[291,3],[305,3],[2300,3]]}}}],["npm/node",{"_index":3135,"t":{"549":{"position":[[525,9]]}}}],["npm:@rollup/wasm",{"_index":3159,"t":{"549":{"position":[[1680,17]]}}}],["ntfi",{"_index":210,"t":{"4":{"position":[[5499,7]]},"27":{"position":[[614,7],[998,5],[1184,7]]},"633":{"position":[[833,5]]}}}],["ntfyconfig",{"_index":568,"t":{"27":{"position":[[1035,10]]}}}],["ntfyserveron",{"_index":561,"t":{"27":{"position":[[589,16]]}}}],["null",{"_index":2732,"t":{"425":{"position":[[491,4]]},"592":{"position":[[615,4],[857,4],[1004,4]]}}}],["number",{"_index":263,"t":{"8":{"position":[[1323,8]]},"18":{"position":[[2331,6],[4306,6]]},"31":{"position":[[213,6]]},"40":{"position":[[142,6]]},"206":{"position":[[423,6]]},"212":{"position":[[417,6]]},"271":{"position":[[794,6]]},"351":{"position":[[329,6]]},"372":{"position":[[30,6]]},"594":{"position":[[2131,6]]}}}],["numer",{"_index":2964,"t":{"479":{"position":[[46,7]]}}}],["nvm",{"_index":2709,"t":{"417":{"position":[[137,3],[332,3]]},"549":{"position":[[207,3]]}}}],["o",{"_index":2873,"t":{"457":{"position":[[2079,1]]},"533":{"position":[[263,1],[302,1]]}}}],["oauth",{"_index":2437,"t":{"343":{"position":[[557,5],[1369,5],[1549,5],[1893,5],[2170,6],[2893,5],[3174,5],[3786,5]]},"345":{"position":[[354,5],[441,5],[511,5]]},"441":{"position":[[409,6],[427,5]]}}}],["obj",{"_index":3318,"t":{"590":{"position":[[407,5],[750,4]]}}}],["object",{"_index":265,"t":{"8":{"position":[[1342,8]]},"184":{"position":[[725,7]]},"357":{"position":[[1153,6]]},"361":{"position":[[236,6],[321,6]]},"363":{"position":[[167,7],[874,6]]},"367":{"position":[[66,6],[117,6],[606,6],[784,6],[1117,7]]},"369":{"position":[[84,6]]},"397":{"position":[[336,6]]},"423":{"position":[[197,6],[214,6]]},"597":{"position":[[939,6]]},"627":{"position":[[776,7],[1368,7],[1406,6]]}}}],["object.values(cp).every(x",{"_index":3300,"t":{"588":{"position":[[809,27]]}}}],["obscur",{"_index":2902,"t":{"459":{"position":[[1030,8]]},"461":{"position":[[427,8]]}}}],["obtain",{"_index":862,"t":{"57":{"position":[[750,9],[961,9],[1079,6]]},"147":{"position":[[637,6]]},"343":{"position":[[665,6]]}}}],["occur",{"_index":692,"t":{"42":{"position":[[631,5]]},"118":{"position":[[2916,8],[3013,6]]},"128":{"position":[[72,6]]},"369":{"position":[[56,6]]},"425":{"position":[[2815,8]]},"439":{"position":[[47,8],[458,5]]},"457":{"position":[[371,6],[914,5],[2682,9],[3259,8]]},"513":{"position":[[371,8],[414,6]]},"597":{"position":[[1087,8]]},"604":{"position":[[229,7]]},"625":{"position":[[1102,6]]}}}],["occurr",{"_index":2818,"t":{"439":{"position":[[589,10]]},"490":{"position":[[398,10]]}}}],["off",{"_index":1866,"t":{"194":{"position":[[450,5]]}}}],["offici",{"_index":829,"t":{"54":{"position":[[832,8]]},"73":{"position":[[431,8],[5157,10]]},"87":{"position":[[355,10]]},"97":{"position":[[113,8]]},"101":{"position":[[25,8]]},"110":{"position":[[641,8]]},"112":{"position":[[311,8]]},"136":{"position":[[146,10]]},"145":{"position":[[64,8]]},"149":{"position":[[93,8]]},"151":{"position":[[1990,8],[2148,8]]},"178":{"position":[[2117,13],[3316,13]]},"188":{"position":[[1193,8]]},"259":{"position":[[410,8]]},"441":{"position":[[768,8]]},"449":{"position":[[189,8]]},"468":{"position":[[305,13]]},"481":{"position":[[356,8],[683,9],[1410,10],[1443,12]]},"483":{"position":[[860,10],[926,12]]},"488":{"position":[[386,8],[447,13],[799,8],[860,13]]},"501":{"position":[[295,13]]},"505":{"position":[[392,13]]},"509":{"position":[[691,13],[1270,13]]}}}],["offlin",{"_index":983,"t":{"73":{"position":[[1217,8]]},"533":{"position":[[64,7]]},"557":{"position":[[1563,7]]}}}],["ogg",{"_index":1914,"t":{"200":{"position":[[2016,6],[2230,4]]}}}],["ogon",{"_index":1274,"t":{"118":{"position":[[557,4]]}}}],["ok",{"_index":585,"t":{"29":{"position":[[132,2]]},"120":{"position":[[900,3]]},"457":{"position":[[758,4]]},"599":{"position":[[2997,2]]}}}],["okay",{"_index":2972,"t":{"481":{"position":[[415,4]]}}}],["old",{"_index":1098,"t":{"87":{"position":[[229,3]]},"174":{"position":[[395,3],[2157,4],[3178,4]]},"178":{"position":[[2831,4],[4034,4]]},"343":{"position":[[1922,3]]},"616":{"position":[[797,3]]}}}],["older",{"_index":1099,"t":{"87":{"position":[[301,5]]},"151":{"position":[[274,5],[721,5]]}}}],["oldi",{"_index":1678,"t":{"174":{"position":[[348,6],[2089,11],[3104,10]]}}}],["omit",{"_index":1648,"t":{"164":{"position":[[341,7]]},"382":{"position":[[184,8]]},"395":{"position":[[516,8]]},"637":{"position":[[428,7]]}}}],["on",{"_index":16,"t":{"4":{"position":[[123,3],[278,3],[657,3],[681,3],[1552,3],[3306,3]]},"10":{"position":[[226,3]]},"22":{"position":[[330,3]]},"46":{"position":[[1955,3],[2260,3],[2778,3]]},"54":{"position":[[1455,3]]},"66":{"position":[[2464,3],[2771,3],[3291,3]]},"73":{"position":[[7257,3]]},"85":{"position":[[2181,3],[2488,3],[3008,3]]},"91":{"position":[[2184,3],[2490,3],[3009,3]]},"95":{"position":[[1865,3],[2171,3],[2690,3]]},"103":{"position":[[2243,3],[2550,3],[3070,3]]},"110":{"position":[[3178,3],[3485,3],[4005,3]]},"114":{"position":[[2065,3],[2377,3],[2902,3]]},"118":{"position":[[2364,3]]},"120":{"position":[[52,3],[67,3],[181,3]]},"134":{"position":[[9,3],[578,4]]},"136":{"position":[[353,4]]},"140":{"position":[[193,3]]},"143":{"position":[[2478,3],[2784,3],[3303,3]]},"151":{"position":[[351,4]]},"153":{"position":[[2556,3],[2866,3],[3389,3]]},"166":{"position":[[1103,3]]},"176":{"position":[[60,3],[200,3]]},"184":{"position":[[1220,3]]},"186":{"position":[[2053,3],[2362,3],[2884,3]]},"188":{"position":[[1209,3],[5583,3],[5891,3],[6412,3]]},"192":{"position":[[229,3]]},"198":{"position":[[2078,3],[2384,3],[2903,3]]},"202":{"position":[[1808,3],[2115,3],[2635,3]]},"208":{"position":[[2004,3],[2310,3],[2829,3]]},"214":{"position":[[1979,3],[2283,3],[2800,3]]},"218":{"position":[[2352,3],[2662,3],[3185,3]]},"220":{"position":[[2612,3],[2917,3],[3435,3]]},"222":{"position":[[517,3]]},"224":{"position":[[20,3],[169,3],[344,3],[426,3],[619,3],[832,3],[1049,3],[1386,3],[1536,3],[1816,3],[2283,3],[2433,3],[2929,3],[3028,3]]},"228":{"position":[[27,3],[334,3]]},"230":{"position":[[32,3]]},"232":{"position":[[414,3]]},"234":{"position":[[2058,3],[2369,3],[2893,3]]},"238":{"position":[[20,3],[169,3],[334,3],[412,3],[604,3],[815,3],[1028,3],[1362,3],[1517,3],[1801,3],[2264,3],[2419,3],[2885,3],[2980,3]]},"240":{"position":[[33,3]]},"242":{"position":[[310,4]]},"244":{"position":[[32,3]]},"249":{"position":[[533,4]]},"251":{"position":[[414,3]]},"253":{"position":[[2138,3],[2448,3],[2971,3]]},"257":{"position":[[2565,3],[2872,3],[3392,3]]},"261":{"position":[[2388,3],[2700,3],[3225,3]]},"265":{"position":[[2163,3],[2469,3],[2988,3]]},"269":{"position":[[2496,3],[2802,3],[3321,3]]},"277":{"position":[[2216,3],[2522,3],[3041,3]]},"281":{"position":[[1940,3],[2243,3],[2759,3]]},"285":{"position":[[1977,3],[2286,3],[2808,3]]},"291":{"position":[[2473,3],[2780,3],[3300,3]]},"295":{"position":[[1953,3],[2258,3],[2776,3]]},"301":{"position":[[43,3],[2506,3],[2811,3],[3329,3]]},"303":{"position":[[2381,3]]},"305":{"position":[[2101,3],[2408,3],[2928,3]]},"311":{"position":[[397,3]]},"313":{"position":[[196,3],[485,4]]},"317":{"position":[[2073,3],[2381,3],[2902,3]]},"325":{"position":[[309,3],[3707,3],[4013,3],[4532,3]]},"327":{"position":[[1493,3]]},"329":{"position":[[1810,3],[2113,3],[2629,3]]},"333":{"position":[[1813,3],[2122,3],[2644,3]]},"341":{"position":[[1920,3],[2232,3],[2757,3]]},"343":{"position":[[510,3],[2059,3]]},"345":{"position":[[2202,3],[2509,3],[3029,3]]},"349":{"position":[[1956,3],[2264,3],[2785,3]]},"357":{"position":[[999,3]]},"359":{"position":[[24,3]]},"376":{"position":[[464,3]]},"378":{"position":[[1158,3],[1330,3]]},"382":{"position":[[117,3]]},"395":{"position":[[483,3]]},"412":{"position":[[172,3],[216,3],[559,3],[624,4]]},"449":{"position":[[71,3]]},"466":{"position":[[487,3]]},"472":{"position":[[354,3],[434,3]]},"476":{"position":[[1160,3],[1188,3],[3665,3],[5221,3],[6784,3]]},"483":{"position":[[661,3],[2367,3],[2770,3]]},"490":{"position":[[624,3]]},"543":{"position":[[1200,3]]},"557":{"position":[[3218,3]]},"584":{"position":[[1069,3]]},"633":{"position":[[2153,3]]},"635":{"position":[[30,3],[54,3]]}}}],["onc",{"_index":835,"t":{"54":{"position":[[1163,5]]},"149":{"position":[[2336,4]]},"216":{"position":[[1200,4]]},"343":{"position":[[4537,4]]},"559":{"position":[[309,4]]},"561":{"position":[[42,4]]}}}],["one/mi",{"_index":2694,"t":{"412":{"position":[[459,6]]}}}],["onfailur",{"_index":2578,"t":{"365":{"position":[[324,9],[1367,11],[1438,12]]},"476":{"position":[[7098,11]]},"505":{"position":[[835,11],[906,12]]}}}],["onlin",{"_index":811,"t":{"52":{"position":[[305,6]]},"54":{"position":[[1584,8]]},"57":{"position":[[1060,6]]},"60":{"position":[[425,7],[545,6],[620,6],[704,7],[742,6],[849,6],[1068,10]]},"81":{"position":[[96,6]]}}}],["online,idle,dnd",{"_index":949,"t":{"66":{"position":[[727,15]]}}}],["onskip",{"_index":2579,"t":{"365":{"position":[[458,6]]},"367":{"position":[[474,9]]}}}],["onsuccess",{"_index":2577,"t":{"365":{"position":[[247,9],[1417,12]]},"505":{"position":[[885,12]]}}}],["op",{"_index":1345,"t":{"118":{"position":[[3823,3],[3939,3],[4257,3],[4378,3]]}}}],["opaqu",{"_index":1432,"t":{"136":{"position":[[90,9]]}}}],["open",{"_index":374,"t":{"14":{"position":[[380,4]]},"50":{"position":[[256,4]]},"54":{"position":[[1477,4]]},"60":{"position":[[380,4]]},"73":{"position":[[5636,6],[7022,6],[9281,6]]},"147":{"position":[[179,4]]},"149":{"position":[[1088,4],[1483,6],[1713,4],[1872,4]]},"160":{"position":[[509,4]]},"192":{"position":[[331,4],[599,4]]},"216":{"position":[[262,4]]},"228":{"position":[[379,4]]},"315":{"position":[[33,4]]},"327":{"position":[[86,4]]},"335":{"position":[[44,4]]},"347":{"position":[[1173,4],[1332,7]]},"419":{"position":[[298,4]]},"425":{"position":[[1880,4]]},"431":{"position":[[234,6]]},"435":{"position":[[2267,5],[2369,4]]},"517":{"position":[[69,7]]},"524":{"position":[[187,7]]},"577":{"position":[[0,4]]},"616":{"position":[[71,4]]},"633":{"position":[[1979,4]]}}}],["oper",{"_index":610,"t":{"31":{"position":[[314,9]]},"105":{"position":[[612,8]]},"138":{"position":[[610,8]]},"293":{"position":[[76,9],[335,9]]},"421":{"position":[[385,8],[490,8]]},"423":{"position":[[278,7]]},"425":{"position":[[988,8]]},"594":{"position":[[46,7],[160,7]]}}}],["opinion",{"_index":2885,"t":{"459":{"position":[[347,8]]},"488":{"position":[[283,11]]}}}],["oppos",{"_index":2780,"t":{"435":{"position":[[168,7]]},"483":{"position":[[1300,7]]},"581":{"position":[[965,7]]}}}],["option",{"_index":145,"t":{"4":{"position":[[3816,7],[5622,11],[5646,11]]},"6":{"position":[[43,7]]},"12":{"position":[[183,9]]},"20":{"position":[[51,8],[72,7]]},"27":{"position":[[709,10],[1062,10],[1306,11],[1330,11]]},"42":{"position":[[1102,10]]},"73":{"position":[[3251,8]]},"79":{"position":[[475,8]]},"91":{"position":[[516,8],[572,8]]},"103":{"position":[[340,8],[399,8],[503,8],[560,8],[661,10]]},"151":{"position":[[1763,7],[2277,6],[2794,10],[3105,10]]},"153":{"position":[[2402,10],[4096,10]]},"166":{"position":[[1399,7],[1474,10]]},"168":{"position":[[644,7],[712,10]]},"178":{"position":[[2681,10],[3877,10]]},"182":{"position":[[948,7],[1016,10]]},"188":{"position":[[5457,10],[7286,10]]},"194":{"position":[[215,6],[360,10],[421,6]]},"200":{"position":[[1048,7],[1114,10],[2099,7]]},"204":{"position":[[146,7]]},"206":{"position":[[493,8]]},"216":{"position":[[3543,10]]},"222":{"position":[[663,6]]},"236":{"position":[[198,6]]},"257":{"position":[[375,8],[441,8],[552,8],[616,8],[724,10]]},"269":{"position":[[565,8],[628,8]]},"281":{"position":[[1836,10],[3207,10]]},"297":{"position":[[1201,7],[1449,10]]},"299":{"position":[[4,8]]},"309":{"position":[[303,6]]},"311":{"position":[[1033,10],[1518,10]]},"313":{"position":[[643,8]]},"315":{"position":[[399,9]]},"327":{"position":[[782,8],[1654,10],[2449,10]]},"343":{"position":[[1146,10],[2736,10],[4039,10]]},"345":{"position":[[2108,10],[3588,10]]},"349":{"position":[[441,8]]},"355":{"position":[[464,10]]},"357":{"position":[[1381,10]]},"359":{"position":[[677,9]]},"361":{"position":[[837,10],[1548,10],[1726,10],[2352,10]]},"365":{"position":[[14,10],[924,10],[1205,10]]},"369":{"position":[[397,10]]},"378":{"position":[[657,7]]},"382":{"position":[[327,10]]},"387":{"position":[[393,10]]},"389":{"position":[[292,10]]},"391":{"position":[[325,10]]},"395":{"position":[[659,10]]},"399":{"position":[[143,10]]},"417":{"position":[[342,9]]},"423":{"position":[[204,9],[350,7],[362,8]]},"427":{"position":[[283,8]]},"457":{"position":[[1505,7],[1579,10],[2214,11],[2351,7],[2414,10]]},"470":{"position":[[127,10],[428,10],[1013,10]]},"474":{"position":[[46,9]]},"476":{"position":[[1501,6],[3811,10],[4044,8]]},"488":{"position":[[64,8]]},"494":{"position":[[444,10]]},"496":{"position":[[627,10]]},"499":{"position":[[263,10]]},"501":{"position":[[576,10]]},"503":{"position":[[598,10]]},"505":{"position":[[673,10]]},"507":{"position":[[701,10],[1018,10]]},"509":{"position":[[965,10],[1531,10]]},"543":{"position":[[329,11],[1019,11],[2354,11]]},"545":{"position":[[331,8],[427,7]]},"549":{"position":[[217,9]]},"557":{"position":[[1689,7],[2864,9]]},"559":{"position":[[200,9],[1978,10]]},"563":{"position":[[1116,10]]},"567":{"position":[[500,7]]},"569":{"position":[[25,7]]},"588":{"position":[[247,7]]},"590":{"position":[[631,8]]},"597":{"position":[[681,9]]},"618":{"position":[[500,8]]},"627":{"position":[[1060,6]]},"637":{"position":[[359,8]]},"647":{"position":[[75,7]]}}}],["order",{"_index":699,"t":{"42":{"position":[[1253,5]]},"57":{"position":[[58,5]]},"64":{"position":[[240,5],[319,5]]},"71":{"position":[[33,5]]},"73":{"position":[[3947,5]]},"83":{"position":[[149,5],[228,5]]},"118":{"position":[[580,5],[684,7],[3376,5]]},"184":{"position":[[1111,5]]},"188":{"position":[[1991,5]]},"204":{"position":[[3,5]]},"210":{"position":[[3,5]]},"216":{"position":[[116,5]]},"228":{"position":[[451,5]]},"279":{"position":[[248,5]]},"283":{"position":[[3,5]]},"301":{"position":[[66,5]]},"303":{"position":[[3171,5]]},"343":{"position":[[2067,5]]},"415":{"position":[[339,5]]},"425":{"position":[[306,5],[2401,5]]},"457":{"position":[[30,5]]},"476":{"position":[[1049,5],[1130,5],[1231,5],[1475,5],[1603,5]]},"483":{"position":[[732,5]]},"543":{"position":[[817,5]]},"559":{"position":[[75,5]]},"594":{"position":[[289,5]]},"623":{"position":[[1163,5]]},"625":{"position":[[1453,5]]}}}],["org.opencontainers.image.vers",{"_index":3435,"t":{"616":{"position":[[348,32]]}}}],["organ",{"_index":1741,"t":{"178":{"position":[[97,10]]},"476":{"position":[[6328,9],[6430,9]]},"494":{"position":[[102,9]]}}}],["origin",{"_index":429,"t":{"18":{"position":[[526,8]]},"118":{"position":[[2258,9],[4867,10]]},"125":{"position":[[187,8]]},"149":{"position":[[2411,6],[2556,9],[2596,6],[2750,6]]},"153":{"position":[[496,6],[2347,9],[4041,9]]},"325":{"position":[[186,11]]},"343":{"position":[[2282,7]]},"369":{"position":[[148,8],[289,8],[537,8],[757,8],[814,9],[907,9],[962,9]]},"457":{"position":[[1845,10],[1935,10],[2035,10],[2118,10]]},"459":{"position":[[1254,10]]},"463":{"position":[[158,10]]},"472":{"position":[[891,8]]},"483":{"position":[[1152,8],[1278,8],[1585,8],[2229,8],[2309,8]]},"507":{"position":[[159,8],[1206,8]]}}}],["os",{"_index":801,"t":{"50":{"position":[[304,2]]},"73":{"position":[[3605,3],[3678,2],[3795,2]]},"216":{"position":[[965,2]]},"549":{"position":[[931,2]]}}}],["os/contain",{"_index":27,"t":{"4":{"position":[[359,12]]}}}],["other",{"_index":932,"t":{"64":{"position":[[3365,7]]},"83":{"position":[[3190,7]]},"232":{"position":[[256,6]]},"251":{"position":[[256,6]]},"633":{"position":[[2228,6]]}}}],["otherwis",{"_index":1650,"t":{"164":{"position":[[601,10]]},"182":{"position":[[259,9]]},"188":{"position":[[1426,9]]},"365":{"position":[[405,9]]},"543":{"position":[[186,10]]},"590":{"position":[[505,9]]}}}],["out",{"_index":234,"t":{"8":{"position":[[199,3]]},"73":{"position":[[8887,3]]},"120":{"position":[[844,4]]},"136":{"position":[[1414,3]]},"149":{"position":[[942,3]]},"151":{"position":[[2132,3]]},"343":{"position":[[1988,3]]},"444":{"position":[[405,3]]},"483":{"position":[[437,3]]},"492":{"position":[[139,3]]},"569":{"position":[[429,3]]},"633":{"position":[[1536,3],[1619,3]]}}}],["outcom",{"_index":2575,"t":{"365":{"position":[[122,7]]},"625":{"position":[[990,7]]}}}],["output",{"_index":519,"t":{"20":{"position":[[111,6],[163,6]]},"216":{"position":[[3121,6],[3328,6]]},"232":{"position":[[956,7]]},"251":{"position":[[961,7]]},"327":{"position":[[2300,6]]},"369":{"position":[[141,6],[182,6],[282,6],[323,6],[484,6]]},"425":{"position":[[642,6]]},"435":{"position":[[1557,6]]},"451":{"position":[[516,6]]},"647":{"position":[[121,6]]}}}],["outsid",{"_index":1097,"t":{"87":{"position":[[134,7]]},"112":{"position":[[132,7]]},"136":{"position":[[691,8]]},"222":{"position":[[61,7]]},"236":{"position":[[61,7]]},"259":{"position":[[231,7]]},"267":{"position":[[199,7]]},"303":{"position":[[4103,8]]},"335":{"position":[[657,7]]}}}],["outta",{"_index":2869,"t":{"457":{"position":[[2012,5]]}}}],["over",{"_index":149,"t":{"4":{"position":[[3929,4]]},"60":{"position":[[1639,4]]},"73":{"position":[[227,4]]},"151":{"position":[[2411,4]]},"293":{"position":[[1355,4]]},"459":{"position":[[698,4]]},"461":{"position":[[95,4]]},"483":{"position":[[880,4],[974,4]]},"488":{"position":[[403,4],[816,4]]},"492":{"position":[[50,4],[349,4]]},"594":{"position":[[1238,4]]},"633":{"position":[[1718,4]]}}}],["overlap",{"_index":1414,"t":{"125":{"position":[[170,7]]}}}],["overload",{"_index":2816,"t":{"439":{"position":[[526,10]]}}}],["overrid",{"_index":298,"t":{"10":{"position":[[327,8]]},"20":{"position":[[27,8]]},"188":{"position":[[885,8]]},"307":{"position":[[536,10],[1517,8]]},"361":{"position":[[1825,10],[2453,9]]},"470":{"position":[[835,8],[1150,8]]},"507":{"position":[[291,9]]},"549":{"position":[[1501,9],[1589,12]]}}}],["overridden",{"_index":2569,"t":{"361":{"position":[[1907,10]]}}}],["overriden/ad",{"_index":2921,"t":{"470":{"position":[[895,15]]}}}],["overwrit",{"_index":3071,"t":{"533":{"position":[[318,9]]}}}],["own",{"_index":2247,"t":{"303":{"position":[[641,5]]},"543":{"position":[[1834,4]]}}}],["owner",{"_index":2258,"t":{"303":{"position":[[1631,5]]}}}],["owner'",{"_index":2256,"t":{"303":{"position":[[1363,7]]}}}],["p",{"_index":2276,"t":{"303":{"position":[[3901,1]]},"573":{"position":[[77,1]]}}}],["p8",{"_index":1546,"t":{"149":{"position":[[3308,3],[3549,5],[3731,3]]},"153":{"position":[[2174,5],[3868,5]]}}}],["packag",{"_index":1976,"t":{"216":{"position":[[1159,7]]},"535":{"position":[[324,7]]},"541":{"position":[[114,8]]}}}],["package.json",{"_index":3154,"t":{"549":{"position":[[1514,12]]}}}],["page",{"_index":539,"t":{"25":{"position":[[9,4],[246,6]]},"38":{"position":[[708,4]]},"54":{"position":[[276,4]]},"68":{"position":[[257,4]]},"73":{"position":[[9644,5]]},"112":{"position":[[345,4]]},"149":{"position":[[1367,4],[2104,4]]},"171":{"position":[[8,4]]},"184":{"position":[[1102,5],[1190,5],[1259,5]]},"259":{"position":[[445,4]]},"303":{"position":[[1113,4],[4231,4],[5278,5]]},"439":{"position":[[689,4]]},"447":{"position":[[383,4]]},"517":{"position":[[57,4],[89,4]]},"541":{"position":[[134,4],[190,4]]},"599":{"position":[[3192,5]]},"618":{"position":[[718,4]]},"647":{"position":[[9,4],[348,6],[372,4]]}}}],["paid",{"_index":1505,"t":{"149":{"position":[[415,4],[482,4],[667,5],[712,4],[2998,4]]}}}],["pan",{"_index":2667,"t":{"389":{"position":[[188,4]]}}}],["pandora",{"_index":2117,"t":{"271":{"position":[[114,8]]},"451":{"position":[[147,8]]}}}],["pane",{"_index":1857,"t":{"192":{"position":[[558,5]]}}}],["panel",{"_index":1140,"t":{"93":{"position":[[347,5]]},"149":{"position":[[1472,5]]},"565":{"position":[[2105,5]]}}}],["pano",{"_index":1406,"t":{"123":{"position":[[125,4],[428,4]]},"136":{"position":[[676,4],[891,4]]}}}],["panoscrobbl",{"_index":2024,"t":{"224":{"position":[[362,14],[691,14],[1121,14],[1888,14],[2947,14]]},"238":{"position":[[674,14],[1098,14],[1871,14]]}}}],["paper",{"_index":821,"t":{"54":{"position":[[570,5]]}}}],["param",{"_index":594,"t":{"29":{"position":[[349,6]]}}}],["paramet",{"_index":2966,"t":{"479":{"position":[[104,11]]}}}],["pars",{"_index":18,"t":{"4":{"position":[[152,5],[314,5],[1147,5],[3290,5]]},"118":{"position":[[2024,6]]},"200":{"position":[[0,5],[279,7],[323,5],[1772,7]]},"216":{"position":[[515,6]]},"327":{"position":[[993,8],[2069,7]]},"425":{"position":[[849,5],[1079,5]]},"444":{"position":[[124,7],[271,6]]},"549":{"position":[[589,7]]},"592":{"position":[[235,5],[1251,5],[2553,5]]}}}],["parseconnectionurl(v",{"_index":3329,"t":{"592":{"position":[[447,23]]}}}],["parsedconfig",{"_index":3295,"t":{"588":{"position":[[472,14],[1158,13]]}}}],["part",{"_index":241,"t":{"8":{"position":[[359,4]]},"118":{"position":[[4198,6]]},"151":{"position":[[1978,4]]},"206":{"position":[[226,4],[324,4]]},"212":{"position":[[222,4],[320,4]]},"271":{"position":[[579,4],[677,4]]},"343":{"position":[[3465,5]]},"363":{"position":[[89,5]]},"367":{"position":[[299,5],[1026,5],[1112,4]]},"369":{"position":[[806,4]]},"393":{"position":[[87,5]]},"421":{"position":[[187,6],[402,5]]},"474":{"position":[[267,5]]},"476":{"position":[[6132,4]]},"633":{"position":[[2302,5]]}}}],["parti",{"_index":1209,"t":{"105":{"position":[[1804,5]]},"194":{"position":[[6,5]]},"347":{"position":[[88,5]]},"457":{"position":[[2763,5]]}}}],["partial",{"_index":3032,"t":{"503":{"position":[[221,7]]}}}],["particularli",{"_index":369,"t":{"14":{"position":[[213,12]]}}}],["pass",{"_index":1027,"t":{"73":{"position":[[2937,4],[5242,4],[6385,4],[8265,4]]},"79":{"position":[[161,4]]},"87":{"position":[[781,6],[1186,7]]},"216":{"position":[[1231,4]]},"367":{"position":[[352,6],[383,4],[443,4]]},"549":{"position":[[506,6]]},"594":{"position":[[1067,4],[1347,4]]}}}],["password",{"_index":216,"t":{"4":{"position":[[5634,11]]},"27":{"position":[[1318,11]]},"73":{"position":[[2240,8]]},"77":{"position":[[839,8]]},"93":{"position":[[261,8]]},"140":{"position":[[239,9],[289,9],[316,8]]},"143":{"position":[[976,8]]},"188":{"position":[[504,9],[2545,8]]},"204":{"position":[[297,8]]},"208":{"position":[[546,8],[1915,11],[3272,11]]},"210":{"position":[[228,8]]},"214":{"position":[[485,8],[1889,11],[3261,11]]},"230":{"position":[[366,8]]},"281":{"position":[[392,8],[487,9],[1807,11],[3178,11]]},"283":{"position":[[121,8]]},"285":{"position":[[413,8],[1886,11],[3261,11]]},"313":{"position":[[261,8]]},"317":{"position":[[404,8],[1906,11],[3371,11]]},"325":{"position":[[1891,8]]},"327":{"position":[[392,8],[410,8],[640,9]]},"329":{"position":[[392,8],[1722,11],[3044,11]]},"361":{"position":[[426,9]]},"425":{"position":[[1303,8]]},"565":{"position":[[2019,8]]}}}],["past",{"_index":969,"t":{"73":{"position":[[691,6]]},"149":{"position":[[1211,5],[2021,5],[3702,7]]},"444":{"position":[[346,5]]},"517":{"position":[[368,5],[471,5]]}}}],["patch",{"_index":3411,"t":{"602":{"position":[[113,5]]},"608":{"position":[[30,5]]},"610":{"position":[[169,5]]}}}],["path",{"_index":718,"t":{"44":{"position":[[737,4],[885,4]]},"73":{"position":[[4407,4],[4813,4],[5305,4],[6394,4],[6449,4],[8274,4],[8329,4]]},"85":{"position":[[396,5]]},"103":{"position":[[685,4]]},"182":{"position":[[112,4],[241,4],[283,4],[313,4]]},"234":{"position":[[423,4]]},"240":{"position":[[369,4]]},"244":{"position":[[596,5]]},"253":{"position":[[416,4]]},"257":{"position":[[748,4]]},"331":{"position":[[400,5],[520,4]]},"533":{"position":[[378,4]]},"602":{"position":[[318,4]]},"606":{"position":[[112,5]]},"608":{"position":[[148,5]]},"618":{"position":[[190,5]]}}}],["path/to/flatpak/build/dir",{"_index":3070,"t":{"533":{"position":[[268,26]]}}}],["pattern",{"_index":238,"t":{"8":{"position":[[299,8]]},"18":{"position":[[2407,7],[4382,7]]},"73":{"position":[[5067,8]]},"118":{"position":[[1227,8],[1308,8],[1336,8]]},"151":{"position":[[1199,8]]},"351":{"position":[[752,7]]},"355":{"position":[[25,7]]},"393":{"position":[[185,9]]},"476":{"position":[[4281,8]]},"614":{"position":[[27,8]]},"633":{"position":[[711,9]]}}}],["paus",{"_index":1639,"t":{"160":{"position":[[760,8]]},"594":{"position":[[2106,11]]}}}],["payload",{"_index":599,"t":{"29":{"position":[[499,7]]},"216":{"position":[[3296,7]]},"451":{"position":[[431,7]]}}}],["pd",{"_index":1182,"t":{"105":{"position":[[316,3],[1485,3]]},"138":{"position":[[314,3],[1479,3]]},"143":{"position":[[374,3]]},"287":{"position":[[197,3]]},"289":{"position":[[89,3]]},"319":{"position":[[37,4],[197,3],[276,3]]},"321":{"position":[[89,3]]},"325":{"position":[[675,3]]}}}],["peac",{"_index":3488,"t":{"633":{"position":[[1998,5]]}}}],["people/mod",{"_index":1103,"t":{"87":{"position":[[412,11]]}}}],["per",{"_index":607,"t":{"31":{"position":[[144,3],[202,3],[230,3]]},"138":{"position":[[2070,3]]},"176":{"position":[[218,3]]},"224":{"position":[[1415,3],[2312,3]]},"230":{"position":[[109,3],[751,3]]},"238":{"position":[[1396,3],[2298,3]]},"470":{"position":[[821,3],[914,4]]},"507":{"position":[[277,3]]}}}],["percent",{"_index":175,"t":{"4":{"position":[[4699,10]]},"166":{"position":[[1184,7],[1579,10]]},"200":{"position":[[1490,7]]}}}],["perform",{"_index":1763,"t":{"180":{"position":[[260,11]]},"431":{"position":[[261,11]]},"476":{"position":[[287,10]]},"486":{"position":[[73,12]]},"543":{"position":[[2451,12]]},"559":{"position":[[299,9]]},"561":{"position":[[32,9]]},"569":{"position":[[141,11]]}}}],["period",{"_index":368,"t":{"14":{"position":[[186,7]]},"315":{"position":[[711,6]]},"457":{"position":[[1033,7]]}}}],["perman",{"_index":1509,"t":{"149":{"position":[[579,9]]},"357":{"position":[[544,11]]}}}],["permiss",{"_index":818,"t":{"54":{"position":[[463,11]]},"279":{"position":[[234,10]]},"293":{"position":[[1041,11]]},"343":{"position":[[1406,10],[4843,11]]},"543":{"position":[[1806,11],[1911,10]]},"567":{"position":[[117,12]]}}}],["permit",{"_index":798,"t":{"50":{"position":[[106,11]]}}}],["persist",{"_index":335,"t":{"12":{"position":[[405,11],[990,11],[1080,9]]},"14":{"position":[[33,11]]},"27":{"position":[[1488,10],[1802,12]]},"40":{"position":[[296,7]]},"105":{"position":[[1722,10],[2150,10]]},"327":{"position":[[459,7]]},"618":{"position":[[433,10]]},"621":{"position":[[36,10]]},"625":{"position":[[420,10]]},"633":{"position":[[1181,12]]}}}],["person",{"_index":39,"t":{"4":{"position":[[573,6]]},"105":{"position":[[291,8],[320,9]]},"138":{"position":[[289,8],[318,9]]},"145":{"position":[[286,8]]},"178":{"position":[[44,9],[204,8]]},"303":{"position":[[4719,8]]},"319":{"position":[[201,9]]},"559":{"position":[[557,8]]},"561":{"position":[[290,8]]},"581":{"position":[[683,8]]},"633":{"position":[[2037,8]]}}}],["persona",{"_index":3003,"t":{"483":{"position":[[1749,8]]}}}],["persona5",{"_index":3002,"t":{"483":{"position":[[1575,9],[2299,9]]}}}],["pgid",{"_index":2191,"t":{"293":{"position":[[995,4]]},"543":{"position":[[1998,5]]}}}],["pgid=1000",{"_index":3130,"t":{"545":{"position":[[917,9]]}}}],["phone",{"_index":2879,"t":{"457":{"position":[[2852,8]]}}}],["phone/comput",{"_index":1963,"t":{"216":{"position":[[62,14]]}}}],["photo",{"_index":1814,"t":{"188":{"position":[[1248,6]]}}}],["phrase",{"_index":1990,"t":{"216":{"position":[[2399,7],[2922,7]]},"376":{"position":[[521,7],[598,7]]},"404":{"position":[[12,6]]},"490":{"position":[[290,7]]}}}],["phu7",{"_index":1477,"t":{"143":{"position":[[2397,4],[3777,4]]},"325":{"position":[[950,4],[1159,4],[1389,4],[3568,4],[5006,4]]}}}],["physic",{"_index":1030,"t":{"73":{"position":[[3333,8]]},"149":{"position":[[3772,8]]}}}],["pi",{"_index":3098,"t":{"541":{"position":[[76,3]]}}}],["picker",{"_index":2021,"t":{"224":{"position":[[9,6]]},"238":{"position":[[9,6]]}}}],["pickup",{"_index":3232,"t":{"575":{"position":[[179,6]]}}}],["pihol",{"_index":2821,"t":{"439":{"position":[[1040,7]]}}}],["pin",{"_index":3427,"t":{"614":{"position":[[327,6]]},"616":{"position":[[414,6]]},"633":{"position":[[1672,6]]}}}],["ping",{"_index":2749,"t":{"425":{"position":[[1924,4]]}}}],["pip/pipx",{"_index":3063,"t":{"528":{"position":[[86,8]]}}}],["pipe",{"_index":1044,"t":{"73":{"position":[[4878,5],[4988,4],[5214,4],[8762,5],[9112,4],[9558,4],[9772,4]]}}}],["pipe\\app_named_pipe_foo",{"_index":1050,"t":{"73":{"position":[[5007,27]]}}}],["pipe\\discord",{"_index":1051,"t":{"73":{"position":[[5076,16],[9777,17]]}}}],["pipelin",{"_index":1261,"t":{"116":{"position":[[80,9]]}}}],["pipeproxi",{"_index":1086,"t":{"73":{"position":[[9516,9],[9715,9],[9898,9]]}}}],["pipeproxy.ex",{"_index":1088,"t":{"73":{"position":[[9612,13],[9756,13]]}}}],["pipetap",{"_index":1049,"t":{"73":{"position":[[4956,8]]}}}],["place",{"_index":673,"t":{"40":{"position":[[70,6]]},"437":{"position":[[554,5]]},"616":{"position":[[63,7]]}}}],["plain",{"_index":590,"t":{"29":{"position":[[214,5]]},"397":{"position":[[41,5],[386,5]]},"476":{"position":[[2856,5]]}}}],["plan",{"_index":3459,"t":{"625":{"position":[[206,4]]}}}],["platform",{"_index":1178,"t":{"105":{"position":[[126,8],[1883,9]]},"155":{"position":[[104,9]]},"287":{"position":[[101,8]]},"303":{"position":[[593,8]]},"427":{"position":[[404,8]]},"451":{"position":[[114,8],[303,9]]},"457":{"position":[[2719,8],[2800,8]]},"541":{"position":[[6,8]]},"549":{"position":[[1395,8]]},"633":{"position":[[1772,8],[1961,8]]}}}],["platformid",{"_index":3378,"t":{"594":{"position":[[2333,11]]}}}],["plausibl",{"_index":1438,"t":{"136":{"position":[[589,9]]}}}],["play",{"_index":400,"t":{"16":{"position":[[279,5],[390,4]]},"18":{"position":[[75,4],[205,6],[634,6],[641,4],[806,4],[1030,4],[1129,6],[1429,6],[1529,6],[1684,6],[1854,5],[1991,4],[2208,5],[2557,5],[2622,5],[2690,5],[2764,5],[2862,5],[2945,5],[3028,4],[3531,5],[3589,5],[3727,5],[4185,5],[4482,5],[4545,5],[4611,5],[4683,5],[4719,5],[4801,5],[4882,4]]},"31":{"position":[[138,5]]},"33":{"position":[[92,6]]},"35":{"position":[[9,7]]},"38":{"position":[[9,4],[104,4],[146,5],[305,4],[464,4]]},"42":{"position":[[41,7],[123,7],[150,7],[264,7],[287,7],[470,7],[594,8],[940,7],[1242,7],[1309,7]]},"48":{"position":[[24,7]]},"54":{"position":[[24,7],[1690,11]]},"64":{"position":[[3604,4]]},"68":{"position":[[24,7]]},"73":{"position":[[3095,7]]},"79":{"position":[[319,7]]},"83":{"position":[[3396,4]]},"105":{"position":[[1100,5]]},"118":{"position":[[2670,8],[2719,4],[2817,4],[3271,6],[4648,4]]},"120":{"position":[[1154,5]]},"138":{"position":[[1098,5]]},"147":{"position":[[55,6]]},"151":{"position":[[91,7],[125,4],[256,7],[307,6],[518,4],[672,6],[1425,7],[1551,6]]},"153":{"position":[[671,6]]},"155":{"position":[[73,7]]},"160":{"position":[[608,6],[778,8],[850,7]]},"162":{"position":[[34,7],[91,7]]},"176":{"position":[[249,5]]},"178":{"position":[[437,5]]},"180":{"position":[[276,7]]},"200":{"position":[[1498,7]]},"216":{"position":[[144,5],[1727,7]]},"244":{"position":[[700,8]]},"271":{"position":[[48,7],[181,6]]},"273":{"position":[[67,6]]},"293":{"position":[[283,6]]},"297":{"position":[[81,8],[137,5],[176,8],[393,5],[568,6],[660,4],[946,6],[1855,4]]},"301":{"position":[[781,7],[924,7]]},"303":{"position":[[232,4],[307,4],[451,7]]},"315":{"position":[[465,7],[687,7],[931,7]]},"325":{"position":[[71,5],[172,4],[412,4]]},"327":{"position":[[1020,6]]},"331":{"position":[[45,6]]},"353":{"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]]},"357":{"position":[[33,4],[98,4],[144,4],[193,4],[271,4],[336,4],[428,4],[1474,4],[1567,4]]},"359":{"position":[[114,4],[369,4],[486,4]]},"363":{"position":[[102,4],[251,4],[326,4],[429,4],[495,4],[556,4],[634,4],[1197,4]]},"365":{"position":[[520,4]]},"367":{"position":[[284,4],[525,4],[601,4],[703,4],[779,4],[876,4],[953,4],[1532,4]]},"369":{"position":[[157,4],[298,4],[546,5],[701,5]]},"376":{"position":[[73,4],[574,4],[694,4]]},"380":{"position":[[202,4],[277,4],[372,4]]},"393":{"position":[[96,4]]},"404":{"position":[[55,4]]},"427":{"position":[[246,6],[332,4],[391,4],[464,6]]},"449":{"position":[[113,5]]},"453":{"position":[[21,7]]},"457":{"position":[[2899,7]]},"459":{"position":[[35,4],[197,4],[263,4]]},"470":{"position":[[572,4],[647,4],[742,4]]},"474":{"position":[[171,4]]},"476":{"position":[[6310,4]]},"481":{"position":[[241,4]]},"488":{"position":[[233,4]]},"492":{"position":[[471,4]]},"496":{"position":[[447,4]]},"517":{"position":[[143,5],[268,5]]},"524":{"position":[[475,4]]},"567":{"position":[[569,7]]},"581":{"position":[[455,6],[501,7]]},"584":{"position":[[2144,7]]},"594":{"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]]},"597":{"position":[[166,6],[934,4],[1119,8]]},"599":{"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]]},"633":{"position":[[601,8],[885,7],[1892,4],[1921,4],[2356,5]]},"635":{"position":[[139,6]]},"637":{"position":[[72,7]]},"639":{"position":[[92,6]]}}}],["play'",{"_index":649,"t":{"38":{"position":[[231,6],[386,6]]}}}],["play/scrobbl",{"_index":467,"t":{"18":{"position":[[1794,14]]},"118":{"position":[[3600,13]]},"357":{"position":[[1544,14]]}}}],["playback",{"_index":2324,"t":{"315":{"position":[[58,8],[231,8],[377,8],[521,8],[609,8],[881,8],[949,8]]}}}],["playdat",{"_index":3326,"t":{"590":{"position":[[906,9]]}}}],["playedat",{"_index":3324,"t":{"590":{"position":[[736,9],[873,8]]}}}],["player",{"_index":665,"t":{"38":{"position":[[525,6]]},"42":{"position":[[572,6],[669,6],[730,7]]},"149":{"position":[[341,6],[770,6]]},"155":{"position":[[94,6]]},"157":{"position":[[661,6]]},"160":{"position":[[747,6],[787,6]]},"166":{"position":[[808,6]]},"216":{"position":[[3265,6]]},"293":{"position":[[59,7],[303,6]]},"295":{"position":[[357,7],[465,7]]},"303":{"position":[[36,6]]},"315":{"position":[[109,6],[306,6],[505,7],[658,7]]},"557":{"position":[[31,7]]},"581":{"position":[[66,6],[85,7],[98,6],[566,6],[593,6],[635,6],[709,6],[924,6]]},"584":{"position":[[47,6],[622,6],[650,6],[791,6],[2120,6]]},"586":{"position":[[775,6]]},"592":{"position":[[1984,6],[2511,6]]},"594":{"position":[[87,6],[279,6],[1085,6],[1194,6],[1356,6],[2200,6],[2277,6],[2437,6],[2456,6],[2580,6],[2642,6]]},"599":{"position":[[578,7]]},"633":{"position":[[338,6]]},"637":{"position":[[120,7],[138,7]]}}}],["player'",{"_index":3313,"t":{"590":{"position":[[92,8],[587,8]]}}}],["playerdata",{"_index":3377,"t":{"594":{"position":[[2301,11]]}}}],["playerst",{"_index":3374,"t":{"594":{"position":[[2064,12]]}}}],["playerstatedata",{"_index":3367,"t":{"594":{"position":[[1591,16],[2313,15]]}}}],["playground",{"_index":155,"t":{"4":{"position":[[4303,10]]}}}],["playlist/queu",{"_index":2242,"t":{"303":{"position":[[92,14]]}}}],["playobject",{"_index":2762,"t":{"427":{"position":[[4,10],[523,10],[648,10],[736,10]]},"584":{"position":[[2043,10]]},"590":{"position":[[127,11],[294,10],[671,10]]},"594":{"position":[[742,11],[2496,10]]},"597":{"position":[[375,11]]},"599":{"position":[[2878,11],[3055,12],[3556,11],[3588,12]]}}}],["plays.push(playerdata",{"_index":3380,"t":{"594":{"position":[[2520,23]]}}}],["plays/scobbl",{"_index":3455,"t":{"623":{"position":[[1177,14]]}}}],["plays/scrobbl",{"_index":500,"t":{"18":{"position":[[3794,15]]},"621":{"position":[[47,16]]},"625":{"position":[[431,16]]}}}],["playtransform",{"_index":1591,"t":{"151":{"position":[[3118,16]]},"178":{"position":[[2694,16],[3890,16]]},"311":{"position":[[1046,16],[1531,16]]},"355":{"position":[[477,16]]},"357":{"position":[[1394,16]]},"361":{"position":[[850,16],[1561,16],[1739,16],[2365,16]]},"365":{"position":[[937,16],[1218,16]]},"367":{"position":[[1258,16],[1542,16]]},"369":{"position":[[70,13],[410,16]]},"382":{"position":[[340,16]]},"387":{"position":[[406,16]]},"389":{"position":[[305,16]]},"391":{"position":[[338,16]]},"395":{"position":[[672,16]]},"399":{"position":[[156,16]]},"470":{"position":[[140,16],[441,16],[1026,16]]},"494":{"position":[[457,16]]},"496":{"position":[[640,16]]},"499":{"position":[[276,16]]},"501":{"position":[[589,16]]},"503":{"position":[[611,16]]},"505":{"position":[[686,16]]},"507":{"position":[[714,16],[1031,16]]},"509":{"position":[[978,16],[1544,16]]},"559":{"position":[[1991,16]]},"563":{"position":[[1129,16]]}}}],["pleas",{"_index":776,"t":{"46":{"position":[[1598,6],[2994,6]]},"66":{"position":[[2103,6],[3509,6]]},"73":{"position":[[8921,6],[9076,6]]},"85":{"position":[[1862,6],[3226,6]]},"87":{"position":[[1079,6]]},"91":{"position":[[1767,6],[3226,6]]},"95":{"position":[[1540,6],[2907,6]]},"103":{"position":[[1869,6],[3288,6]]},"110":{"position":[[2794,6],[4223,6]]},"114":{"position":[[1682,6],[3125,6]]},"143":{"position":[[2153,6],[3520,6]]},"153":{"position":[[1925,6],[3610,6]]},"186":{"position":[[1684,6],[3104,6]]},"188":{"position":[[4813,6],[6631,6]]},"198":{"position":[[1693,6],[3120,6]]},"202":{"position":[[1533,6],[2853,6]]},"208":{"position":[[1702,6],[3046,6]]},"214":{"position":[[1658,6],[3015,6]]},"216":{"position":[[255,6],[3084,6],[3281,6]]},"218":{"position":[[2038,6],[3406,6]]},"220":{"position":[[2255,6],[3651,6]]},"228":{"position":[[372,6]]},"232":{"position":[[1113,6]]},"234":{"position":[[1801,6],[3115,6]]},"249":{"position":[[538,6]]},"251":{"position":[[1124,6]]},"253":{"position":[[1870,6],[3192,6]]},"257":{"position":[[2191,6],[3610,6]]},"261":{"position":[[2005,6],[3448,6]]},"265":{"position":[[1838,6],[3205,6]]},"269":{"position":[[2079,6],[3538,6]]},"277":{"position":[[1897,6],[3258,6]]},"281":{"position":[[1618,6],[2973,6]]},"285":{"position":[[1663,6],[3028,6]]},"291":{"position":[[2089,6],[3518,6]]},"295":{"position":[[1660,6],[2992,6]]},"297":{"position":[[1131,6],[1955,6]]},"301":{"position":[[2131,6],[3545,6]]},"303":{"position":[[4685,6]]},"305":{"position":[[1684,6],[3146,6]]},"317":{"position":[[1667,6],[3121,6]]},"325":{"position":[[3324,6],[4749,6]]},"327":{"position":[[2256,6]]},"329":{"position":[[1537,6],[2843,6]]},"333":{"position":[[1544,6],[2864,6]]},"341":{"position":[[1627,6],[2980,6]]},"345":{"position":[[1779,6],[3247,6]]},"347":{"position":[[1166,6],[1287,6]]},"349":{"position":[[1641,6],[3004,6]]},"439":{"position":[[647,6]]},"457":{"position":[[1361,6]]},"496":{"position":[[285,6]]},"513":{"position":[[234,6]]},"524":{"position":[[26,6],[138,6],[447,6]]}}}],["plex",{"_index":930,"t":{"64":{"position":[[3274,5]]},"83":{"position":[[3099,5]]},"155":{"position":[[146,5]]},"157":{"position":[[734,4]]},"166":{"position":[[713,5]]},"174":{"position":[[273,4],[1017,4],[1967,6],[2942,7],[2982,6]]},"176":{"position":[[396,4],[1008,6],[2196,7],[2236,6]]},"297":{"position":[[912,4]]},"307":{"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]]},"309":{"position":[[3,5],[16,4],[64,4],[142,4],[347,4]]},"311":{"position":[[263,4],[379,4],[1488,7]]},"490":{"position":[[1132,5]]},"553":{"position":[[338,5]]},"557":{"position":[[123,4],[2576,4],[2645,4],[3086,4]]},"559":{"position":[[1002,4]]},"563":{"position":[[140,4]]},"599":{"position":[[266,5],[1177,5]]},"633":{"position":[[401,4]]},"637":{"position":[[202,5]]}}}],["plex.json",{"_index":2317,"t":{"311":{"position":[[979,9]]}}}],["plex_devices_block=sono",{"_index":2210,"t":{"297":{"position":[[1006,24]]}}}],["plex_id=foxxplex",{"_index":1690,"t":{"174":{"position":[[1024,16]]}}}],["plex_id=myplex",{"_index":3180,"t":{"557":{"position":[[2847,14]]}}}],["plex_libraries_allow",{"_index":2301,"t":{"307":{"position":[[1491,20]]}}}],["plex_libraries_allow=oldi",{"_index":1694,"t":{"174":{"position":[[1132,27]]}}}],["plex_local_us",{"_index":2297,"t":{"307":{"position":[[270,17],[1145,18]]}}}],["plex_token=6c0ihz8j7__f5r18oa0zm8",{"_index":3179,"t":{"557":{"position":[[2811,33]]}}}],["plex_token=jtrnwqwd__xmjf8st3jc",{"_index":1692,"t":{"174":{"position":[[1074,31]]}}}],["plex_transforms=musicbrainz",{"_index":2315,"t":{"311":{"position":[[684,27]]},"559":{"position":[[1549,27]]},"563":{"position":[[687,27]]}}}],["plex_url=192.168.0.233:32400",{"_index":1691,"t":{"174":{"position":[[1043,28]]}}}],["plex_url=http://192.168.0.101:32400",{"_index":3178,"t":{"557":{"position":[[2773,35]]}}}],["plex_users_allow",{"_index":2298,"t":{"307":{"position":[[453,16],[723,16],[885,17],[1179,17]]}}}],["plex_users_allow=foxx",{"_index":1693,"t":{"174":{"position":[[1108,21]]}}}],["plex_users_allow=myplexusernam",{"_index":3181,"t":{"557":{"position":[[2932,31]]}}}],["plexmediaserver/1.24.5.5173",{"_index":2798,"t":{"435":{"position":[[1054,27]]}}}],["plkex",{"_index":2800,"t":{"435":{"position":[[1111,6]]}}}],["plugin",{"_index":2077,"t":{"249":{"position":[[80,7],[100,6]]}}}],["plyr",{"_index":2359,"t":{"325":{"position":[[983,9],[1422,8],[3603,6],[5041,6]]}}}],["plyr.fm",{"_index":2356,"t":{"325":{"position":[[810,8],[1228,7]]}}}],["pm195xpv98cdpk0qw47fiior8akatax5dblbf",{"_index":710,"t":{"44":{"position":[[362,37]]},"565":{"position":[[454,37]]}}}],["point",{"_index":759,"t":{"46":{"position":[[919,5],[2437,5]]},"66":{"position":[[1416,5],[2950,5]]},"73":{"position":[[1671,5]]},"77":{"position":[[270,5]]},"85":{"position":[[1175,5],[2667,5]]},"91":{"position":[[1084,5],[2668,5]]},"95":{"position":[[857,5],[2349,5]]},"103":{"position":[[1182,5],[2729,5]]},"110":{"position":[[2107,5],[3664,5]]},"114":{"position":[[975,5],[2561,5]]},"143":{"position":[[1470,5],[2962,5]]},"153":{"position":[[1226,5],[3048,5]]},"166":{"position":[[457,5]]},"171":{"position":[[272,5]]},"186":{"position":[[989,5],[2543,5]]},"188":{"position":[[4122,5],[6071,5]]},"198":{"position":[[1010,5],[2562,5]]},"202":{"position":[[846,5],[2294,5]]},"208":{"position":[[1019,5],[2488,5]]},"214":{"position":[[983,5],[2459,5]]},"218":{"position":[[1339,5],[2844,5]]},"220":{"position":[[1323,5],[3094,5]]},"224":{"position":[[3196,6]]},"234":{"position":[[1098,5],[2552,5]]},"238":{"position":[[3150,6]]},"253":{"position":[[1171,5],[2630,5]]},"257":{"position":[[1245,5],[3051,5]]},"261":{"position":[[1024,5],[2884,5]]},"265":{"position":[[899,5],[2647,5]]},"269":{"position":[[1140,5],[2980,5]]},"277":{"position":[[1214,5],[2700,5]]},"281":{"position":[[947,5],[2418,5]]},"285":{"position":[[968,5],[2467,5]]},"291":{"position":[[1143,5],[2959,5]]},"295":{"position":[[981,5],[2435,5]]},"301":{"position":[[1452,5],[2988,5]]},"305":{"position":[[997,5],[2587,5]]},"317":{"position":[[976,5],[2561,5]]},"325":{"position":[[2385,5],[4191,5]]},"329":{"position":[[866,5],[2288,5]]},"333":{"position":[[849,5],[2303,5]]},"341":{"position":[[920,5],[2416,5]]},"343":{"position":[[1277,5]]},"345":{"position":[[1092,5],[2688,5]]},"349":{"position":[[950,5],[2444,5]]},"355":{"position":[[131,7]]}}}],["polici",{"_index":453,"t":{"18":{"position":[[1094,6],[1255,6],[1357,6],[2151,7],[2250,7],[3480,6],[4005,6],[4106,6],[4166,7],[4225,7]]},"57":{"position":[[1016,8]]}}}],["policies/term",{"_index":846,"t":{"57":{"position":[[234,14]]}}}],["poll",{"_index":554,"t":{"27":{"position":[[85,7],[108,7],[129,7]]},"29":{"position":[[680,4],[752,7]]},"136":{"position":[[970,5]]},"151":{"position":[[436,7],[935,6],[977,5]]},"343":{"position":[[4601,7]]},"581":{"position":[[877,7]]},"586":{"position":[[418,7]]},"594":{"position":[[645,7]]},"599":{"position":[[31,7],[407,7],[1139,7],[1233,7],[2148,7]]}}}],["pollingopt",{"_index":3246,"t":{"584":{"position":[[236,14],[522,14]]}}}],["polo",{"_index":2666,"t":{"389":{"position":[[180,5]]}}}],["pong",{"_index":2750,"t":{"425":{"position":[[1929,4]]}}}],["poor",{"_index":2815,"t":{"439":{"position":[[480,4]]}}}],["pop!_o",{"_index":3215,"t":{"571":{"position":[[107,8]]}}}],["popul",{"_index":3037,"t":{"509":{"position":[[224,9]]}}}],["popular",{"_index":3211,"t":{"571":{"position":[[59,7]]}}}],["popup",{"_index":2461,"t":{"343":{"position":[[2473,5]]}}}],["port",{"_index":296,"t":{"10":{"position":[[311,4],[360,4]]},"73":{"position":[[2152,6],[2165,4],[2864,4],[5647,5],[5815,4],[5839,4],[5962,4],[7033,5],[7201,4],[7225,4],[7519,4],[7855,6],[9292,5],[9460,4],[9484,4],[9586,5]]},"77":{"position":[[751,6],[764,4]]},"79":{"position":[[88,4]]},"160":{"position":[[514,4]]},"174":{"position":[[1477,6]]},"178":{"position":[[1643,6]]},"206":{"position":[[418,4]]},"212":{"position":[[412,4],[449,4]]},"216":{"position":[[950,4]]},"271":{"position":[[789,4],[895,4]]},"279":{"position":[[183,4]]},"283":{"position":[[268,4],[374,4]]},"293":{"position":[[1391,4],[1534,5],[1589,4]]},"307":{"position":[[50,4]]},"327":{"position":[[711,5],[841,4],[978,5]]},"347":{"position":[[523,6],[843,6]]},"384":{"position":[[1043,6]]},"435":{"position":[[2165,4],[2254,4],[2354,4]]},"472":{"position":[[2123,6]]},"543":{"position":[[792,4],[932,4],[998,6]]},"545":{"position":[[139,4],[1061,6]]},"549":{"position":[[2350,4],[2392,4]]},"553":{"position":[[156,4]]},"555":{"position":[[487,6]]},"557":{"position":[[2616,4]]},"581":{"position":[[668,4]]},"584":{"position":[[775,4]]}}}],["portal",{"_index":893,"t":{"62":{"position":[[275,6]]},"71":{"position":[[128,6]]},"149":{"position":[[3261,6]]}}}],["ports/prefix",{"_index":3328,"t":{"592":{"position":[[269,13]]}}}],["posit",{"_index":1578,"t":{"151":{"position":[[1594,9]]},"160":{"position":[[794,8]]},"180":{"position":[[72,9]]},"315":{"position":[[116,8]]},"581":{"position":[[600,8]]},"594":{"position":[[2118,9],[2170,8],[2414,8]]}}}],["possibl",{"_index":96,"t":{"4":{"position":[[1877,8]]},"38":{"position":[[799,8]]},"46":{"position":[[592,8],[1996,8]]},"66":{"position":[[1087,8],[2505,8]]},"73":{"position":[[8740,8]]},"85":{"position":[[846,8],[2222,8]]},"91":{"position":[[756,8],[2225,8]]},"95":{"position":[[529,8],[1906,8]]},"103":{"position":[[853,8],[2284,8]]},"110":{"position":[[1778,8],[3219,8]]},"114":{"position":[[641,8],[2106,8]]},"118":{"position":[[736,9],[5214,8],[5249,8]]},"134":{"position":[[43,8]]},"143":{"position":[[1142,8],[2519,8]]},"153":{"position":[[894,8],[2597,8]]},"176":{"position":[[15,8],[151,8]]},"186":{"position":[[658,8],[2094,8]]},"188":{"position":[[3792,8],[5624,8]]},"198":{"position":[[682,8],[2119,8]]},"202":{"position":[[517,8],[1849,8]]},"208":{"position":[[691,8],[2045,8]]},"214":{"position":[[657,8],[2020,8]]},"218":{"position":[[1007,8],[2393,8]]},"220":{"position":[[996,8],[2653,8]]},"230":{"position":[[671,9]]},"232":{"position":[[394,9]]},"234":{"position":[[765,8],[2099,8]]},"244":{"position":[[429,9]]},"251":{"position":[[394,9]]},"253":{"position":[[839,8],[2179,8]]},"257":{"position":[[916,8],[2606,8]]},"261":{"position":[[690,8],[2429,8]]},"265":{"position":[[571,8],[2204,8]]},"269":{"position":[[812,8],[2537,8]]},"277":{"position":[[886,8],[2257,8]]},"281":{"position":[[622,8],[1981,8]]},"285":{"position":[[637,8],[2018,8]]},"291":{"position":[[814,8],[2514,8]]},"293":{"position":[[629,9]]},"295":{"position":[[654,8],[1994,8]]},"301":{"position":[[1125,8],[2547,8]]},"303":{"position":[[4797,8]]},"305":{"position":[[668,8],[2142,8]]},"317":{"position":[[646,8],[2114,8]]},"325":{"position":[[2057,8],[3748,8]]},"329":{"position":[[541,8],[1851,8]]},"333":{"position":[[518,8],[1854,8]]},"341":{"position":[[586,8],[1961,8]]},"343":{"position":[[1940,8]]},"345":{"position":[[763,8],[2243,8]]},"349":{"position":[[620,8],[1997,8]]},"376":{"position":[[753,11],[887,13]]},"425":{"position":[[2866,9]]},"476":{"position":[[3039,11],[4506,11],[4854,13],[5456,11],[5676,11]]},"483":{"position":[[289,11]]},"490":{"position":[[331,8],[656,11],[854,13]]},"513":{"position":[[278,8]]},"515":{"position":[[3,9]]},"524":{"position":[[544,9]]},"633":{"position":[[2499,9]]}}}],["post",{"_index":2796,"t":{"435":{"position":[[1010,4]]}}}],["postcompar",{"_index":2552,"t":{"355":{"position":[[547,14]]},"357":{"position":[[172,11],[407,11],[1122,12]]}}}],["potenti",{"_index":150,"t":{"4":{"position":[[3938,9]]},"12":{"position":[[1283,11]]},"50":{"position":[[431,11]]},"118":{"position":[[3091,12]]},"123":{"position":[[180,12]]},"130":{"position":[[294,11]]},"134":{"position":[[243,11]]},"361":{"position":[[192,13]]},"441":{"position":[[1255,11]]},"476":{"position":[[886,9]]}}}],["pr",{"_index":3233,"t":{"577":{"position":[[7,2]]},"614":{"position":[[466,3]]}}}],["practic",{"_index":2639,"t":{"376":{"position":[[640,9]]},"474":{"position":[[127,9]]},"599":{"position":[[3826,8]]}}}],["pre",{"_index":349,"t":{"12":{"position":[[929,3]]},"367":{"position":[[253,3]]},"378":{"position":[[1180,4]]}}}],["preced",{"_index":848,"t":{"57":{"position":[[323,9]]},"60":{"position":[[1628,10]]},"476":{"position":[[5242,9]]}}}],["precompar",{"_index":1592,"t":{"151":{"position":[[3137,13]]},"178":{"position":[[2713,13],[3909,13]]},"311":{"position":[[1065,13],[1550,13]]},"355":{"position":[[496,13]]},"357":{"position":[[13,10],[251,10],[870,10],[1027,10],[1107,10]]},"361":{"position":[[869,13],[1580,13],[1758,13],[2384,13]]},"365":{"position":[[956,13],[1237,13]]},"367":{"position":[[1277,13],[1561,13]]},"369":{"position":[[429,13],[718,12]]},"382":{"position":[[359,13]]},"387":{"position":[[425,13]]},"389":{"position":[[324,13]]},"391":{"position":[[357,13]]},"395":{"position":[[691,13]]},"399":{"position":[[175,13]]},"470":{"position":[[159,13],[460,13],[1045,13]]},"494":{"position":[[476,13]]},"496":{"position":[[673,13]]},"499":{"position":[[295,13]]},"501":{"position":[[608,13]]},"503":{"position":[[630,13]]},"505":{"position":[[705,13]]},"507":{"position":[[733,13],[1050,13]]},"509":{"position":[[148,10],[997,13],[1563,13]]},"559":{"position":[[2010,13]]},"563":{"position":[[1148,13]]}}}],["prefer",{"_index":1510,"t":{"149":{"position":[[609,9]]},"327":{"position":[[110,11]]},"459":{"position":[[557,6]]},"481":{"position":[[295,6],[520,6]]},"483":{"position":[[853,6],[945,6]]},"488":{"position":[[464,6],[564,6],[877,6],[977,6]]},"490":{"position":[[1992,6]]},"492":{"position":[[38,6],[334,6]]},"599":{"position":[[309,6]]}}}],["preferences/set",{"_index":2404,"t":{"335":{"position":[[53,20]]}}}],["prefix",{"_index":1172,"t":{"103":{"position":[[690,6]]},"149":{"position":[[1611,6],[2318,6]]},"257":{"position":[[753,6]]},"384":{"position":[[283,6]]},"472":{"position":[[1174,6]]},"629":{"position":[[29,8]]}}}],["premium",{"_index":1852,"t":{"190":{"position":[[271,7]]},"303":{"position":[[502,7],[660,7],[709,7],[826,7],[958,8],[1015,7],[1152,8]]}}}],["presenc",{"_index":793,"t":{"48":{"position":[[71,8]]},"50":{"position":[[91,9]]},"52":{"position":[[79,9]]},"54":{"position":[[71,8],[689,9],[775,9],[841,8],[1116,8],[1308,9],[1635,8]]},"60":{"position":[[91,9],[201,9],[350,8],[597,8],[787,8],[1230,8],[1893,8]]},"62":{"position":[[215,9]]},"66":{"position":[[798,9],[928,8]]},"68":{"position":[[71,8],[215,9]]},"73":{"position":[[104,9]]}}}],["present",{"_index":26,"t":{"4":{"position":[[344,7]]},"200":{"position":[[110,10]]},"309":{"position":[[516,7]]},"311":{"position":[[137,7]]},"376":{"position":[[419,7],[481,7]]},"378":{"position":[[706,7],[787,7],[905,7],[992,8]]},"380":{"position":[[402,7]]},"419":{"position":[[376,10]]},"476":{"position":[[510,7],[742,7]]},"625":{"position":[[1298,7]]}}}],["preserv",{"_index":901,"t":{"64":{"position":[[600,8]]},"83":{"position":[[459,8]]},"136":{"position":[[1460,10]]},"517":{"position":[[552,8]]}}}],["preset",{"_index":2924,"t":{"472":{"position":[[81,7],[317,7],[358,6],[445,7],[528,7]]},"559":{"position":[[806,7]]},"561":{"position":[[539,7]]}}}],["presid",{"_index":2858,"t":{"457":{"position":[[1810,9]]}}}],["press",{"_index":1855,"t":{"192":{"position":[[318,5],[392,5]]}}}],["pretend",{"_index":2827,"t":{"441":{"position":[[676,7]]}}}],["pretransform",{"_index":1750,"t":{"178":{"position":[[1400,12]]},"384":{"position":[[220,12],[865,12]]},"472":{"position":[[1111,12],[1911,12]]}}}],["pretti",{"_index":1398,"t":{"120":{"position":[[672,6]]}}}],["prevent",{"_index":1321,"t":{"118":{"position":[[1837,7]]},"130":{"position":[[514,7]]},"194":{"position":[[586,7]]},"273":{"position":[[390,7]]},"275":{"position":[[138,7]]},"297":{"position":[[900,7]]},"315":{"position":[[782,8]]},"351":{"position":[[866,7]]},"599":{"position":[[2485,8],[4048,7]]}}}],["preview",{"_index":1452,"t":{"138":{"position":[[1859,7]]},"633":{"position":[[1349,7],[1403,8],[1559,7],[1634,7]]}}}],["previou",{"_index":1559,"t":{"151":{"position":[[342,8]]},"359":{"position":[[505,8]]},"369":{"position":[[518,8]]},"557":{"position":[[448,8]]},"616":{"position":[[741,8]]}}}],["previous",{"_index":3362,"t":{"594":{"position":[[810,10],[2889,10]]}}}],["price",{"_index":3000,"t":{"483":{"position":[[1524,8]]}}}],["primari",{"_index":2917,"t":{"466":{"position":[[692,7]]},"481":{"position":[[736,7]]},"490":{"position":[[1919,7]]}}}],["primarili",{"_index":3358,"t":{"594":{"position":[[36,9]]}}}],["print",{"_index":3111,"t":{"543":{"position":[[2093,6],[2113,6]]},"616":{"position":[[211,7]]}}}],["prior",{"_index":3460,"t":{"625":{"position":[[472,5]]},"631":{"position":[[21,5]]}}}],["priorit",{"_index":2900,"t":{"459":{"position":[[933,10]]},"461":{"position":[[330,10]]},"472":{"position":[[596,9]]},"483":{"position":[[1952,10]]},"490":{"position":[[957,10]]}}}],["prioriti",{"_index":204,"t":{"4":{"position":[[5434,13],[5658,13]]},"27":{"position":[[758,8],[944,13],[1111,8],[1342,13]]},"42":{"position":[[1282,8]]},"60":{"position":[[1394,8],[1508,9]]},"483":{"position":[[777,8]]}}}],["privaci",{"_index":902,"t":{"64":{"position":[[614,7]]},"83":{"position":[[473,7]]},"105":{"position":[[1625,8]]},"138":{"position":[[1619,8]]},"140":{"position":[[261,7]]}}}],["privat",{"_index":1508,"t":{"149":{"position":[[541,7],[3332,7],[3567,7],[3621,7]]},"153":{"position":[[2192,7],[2246,7],[3886,7],[3940,7]]},"186":{"position":[[465,7]]},"196":{"position":[[361,9],[403,9],[448,9],[494,9],[1167,7],[1232,7]]}}}],["probabl",{"_index":1225,"t":{"110":{"position":[[286,8]]},"143":{"position":[[389,8]]}}}],["problem",{"_index":460,"t":{"18":{"position":[[1510,8]]},"216":{"position":[[294,8]]},"441":{"position":[[1279,8]]},"543":{"position":[[1922,9]]},"569":{"position":[[624,8]]}}}],["proce",{"_index":3075,"t":{"533":{"position":[[491,7]]}}}],["process",{"_index":613,"t":{"31":{"position":[[371,7]]},"105":{"position":[[814,7]]},"120":{"position":[[720,7]]},"138":{"position":[[812,7]]},"303":{"position":[[1258,7],[1399,7],[1918,7],[3638,7],[5508,7]]},"355":{"position":[[169,10]]},"357":{"position":[[798,9],[904,9]]},"365":{"position":[[313,10],[390,11],[508,7]]},"367":{"position":[[406,10]]},"431":{"position":[[193,8],[306,8]]},"459":{"position":[[1687,11]]},"594":{"position":[[2572,7]]},"625":{"position":[[760,7],[825,7],[1005,7],[1089,7]]}}}],["process.env.cool_token",{"_index":3299,"t":{"588":{"position":[[781,22]]}}}],["process.env.cool_url",{"_index":3298,"t":{"588":{"position":[[752,21]]}}}],["processrecentplay",{"_index":3363,"t":{"594":{"position":[[1001,18],[1134,21],[1272,18]]},"599":{"position":[[1815,19]]}}}],["produc",{"_index":2605,"t":{"369":{"position":[[885,8],[940,8]]}}}],["product",{"_index":1448,"t":{"138":{"position":[[1718,10]]}}}],["production.up.railway.app",{"_index":1450,"t":{"138":{"position":[[1802,25]]}}}],["prof",{"_index":2774,"t":{"431":{"position":[[90,4]]}}}],["profil",{"_index":877,"t":{"60":{"position":[[1456,8],[1742,8]]},"112":{"position":[[337,7]]},"138":{"position":[[62,7]]},"259":{"position":[[437,7]]},"431":{"position":[[286,7]]},"633":{"position":[[2689,7]]}}}],["program",{"_index":802,"t":{"50":{"position":[[367,7]]},"149":{"position":[[503,7],[3019,7]]}}}],["programmat",{"_index":822,"t":{"54":{"position":[[608,16]]}}}],["progress/result",{"_index":3462,"t":{"625":{"position":[[734,16]]}}}],["project",{"_index":99,"t":{"4":{"position":[[2055,8]]},"343":{"position":[[1846,7]]},"345":{"position":[[346,7],[433,7],[503,7]]},"427":{"position":[[772,7]]},"533":{"position":[[170,7]]},"535":{"position":[[224,7],[271,7]]},"599":{"position":[[1498,7]]}}}],["project_dir",{"_index":3079,"t":{"535":{"position":[[285,11],[463,11]]}}}],["project_dir/flatpak",{"_index":3082,"t":{"535":{"position":[[375,19],[561,19],[761,19]]}}}],["prometheu",{"_index":603,"t":{"31":{"position":[[2,10],[488,10],[865,10]]}}}],["prometheus_full=tru",{"_index":616,"t":{"31":{"position":[[441,20]]}}}],["promise<playobject",{"_index":3371,"t":{"594":{"position":[[1824,21]]},"597":{"position":[[715,21]]}}}],["promise<tru",{"_index":3336,"t":{"592":{"position":[[766,12],[1722,12]]}}}],["promot",{"_index":2977,"t":{"481":{"position":[[693,12]]}}}],["prone",{"_index":1080,"t":{"73":{"position":[[9019,5]]}}}],["proper",{"_index":2654,"t":{"378":{"position":[[1265,6]]},"567":{"position":[[105,6]]}}}],["properli",{"_index":2331,"t":{"315":{"position":[[911,8]]},"343":{"position":[[463,8]]},"581":{"position":[[298,8]]},"594":{"position":[[668,8]]}}}],["propert",{"_index":2583,"t":{"367":{"position":[[133,9]]}}}],["properti",{"_index":219,"t":{"4":{"position":[[5758,8],[5866,9]]},"18":{"position":[[2298,10],[2486,10],[4273,10]]},"22":{"position":[[357,8]]},"27":{"position":[[267,9]]},"42":{"position":[[867,8]]},"46":{"position":[[601,11],[2005,11]]},"66":{"position":[[1096,11],[2514,11]]},"85":{"position":[[855,11],[2231,11]]},"91":{"position":[[765,11],[2234,11]]},"95":{"position":[[538,11],[1915,11]]},"101":{"position":[[123,8]]},"103":{"position":[[862,11],[2293,11]]},"110":{"position":[[1787,11],[3228,11]]},"114":{"position":[[650,11],[2115,11]]},"143":{"position":[[1151,11],[2528,11]]},"153":{"position":[[903,11],[2606,11]]},"164":{"position":[[65,8],[131,8],[625,8]]},"178":{"position":[[1865,9],[3064,9]]},"184":{"position":[[708,8]]},"186":{"position":[[667,11],[2103,11]]},"188":{"position":[[3801,11],[5633,11]]},"196":{"position":[[669,8]]},"198":{"position":[[691,11],[2128,11]]},"202":{"position":[[526,11],[1858,11]]},"208":{"position":[[700,11],[2054,11]]},"214":{"position":[[666,11],[2029,11]]},"216":{"position":[[1661,8]]},"218":{"position":[[1016,11],[2402,11]]},"220":{"position":[[1005,11],[1860,9],[2662,11]]},"234":{"position":[[774,11],[2108,11]]},"253":{"position":[[848,11],[2188,11]]},"257":{"position":[[925,11],[1790,9],[2615,11]]},"261":{"position":[[699,11],[1589,9],[2438,11]]},"265":{"position":[[580,11],[1440,9],[2213,11]]},"269":{"position":[[821,11],[1681,9],[2546,11]]},"277":{"position":[[895,11],[2266,11]]},"281":{"position":[[631,11],[1990,11]]},"285":{"position":[[646,11],[2027,11]]},"291":{"position":[[823,11],[1688,9],[2523,11]]},"295":{"position":[[663,11],[2003,11]]},"299":{"position":[[40,10]]},"301":{"position":[[1134,11],[2556,11]]},"305":{"position":[[677,11],[2151,11]]},"313":{"position":[[663,8]]},"317":{"position":[[655,11],[2123,11]]},"325":{"position":[[747,8],[2066,11],[2926,9],[3757,11]]},"329":{"position":[[550,11],[1860,11]]},"333":{"position":[[527,11],[1863,11]]},"341":{"position":[[595,11],[1970,11]]},"345":{"position":[[772,11],[2252,11]]},"349":{"position":[[629,11],[2006,11]]},"361":{"position":[[2463,8]]},"363":{"position":[[702,8],[841,8],[939,10]]},"365":{"position":[[174,10]]},"367":{"position":[[158,8],[223,8]]},"378":{"position":[[10,10],[531,10]]},"397":{"position":[[903,8]]},"425":{"position":[[1287,10],[2021,11],[2054,10],[3154,10]]},"468":{"position":[[11,10]]},"470":{"position":[[919,9],[1212,9]]},"474":{"position":[[9,10]]},"481":{"position":[[1281,8]]},"483":{"position":[[676,8],[786,9],[1181,10],[2395,10]]},"584":{"position":[[570,11]]},"592":{"position":[[170,10]]},"625":{"position":[[1267,8]]},"627":{"position":[[1345,8]]}}}],["properties/behavior",{"_index":2722,"t":{"421":{"position":[[441,19]]}}}],["protect",{"_index":2834,"t":{"447":{"position":[[208,9]]},"592":{"position":[[731,9],[1685,9]]},"594":{"position":[[1752,9]]},"597":{"position":[[644,9]]}}}],["protocol",{"_index":293,"t":{"10":{"position":[[247,8],[270,8]]},"105":{"position":[[151,8],[386,9],[403,8],[596,8],[1046,11]]},"138":{"position":[[384,9],[401,8],[594,8],[1044,11]]},"287":{"position":[[126,8]]}}}],["protocol://libre.tld/path/prefix",{"_index":1162,"t":{"101":{"position":[[192,32]]}}}],["protocol]://[hostname]:[port]/[path",{"_index":1927,"t":{"206":{"position":[[138,37]]},"212":{"position":[[136,37]]},"271":{"position":[[493,37]]}}}],["provid",{"_index":105,"t":{"4":{"position":[[2249,8],[3873,8],[4213,8]]},"12":{"position":[[971,8],[1322,7],[1548,11]]},"18":{"position":[[1231,8],[2115,9],[4130,9]]},"57":{"position":[[9,7],[948,8]]},"64":{"position":[[3298,7]]},"73":{"position":[[296,8],[357,8]]},"83":{"position":[[3123,7]]},"105":{"position":[[1002,10]]},"136":{"position":[[1491,9]]},"138":{"position":[[1000,10]]},"140":{"position":[[106,8]]},"149":{"position":[[168,7],[531,7]]},"151":{"position":[[51,7]]},"171":{"position":[[75,7],[305,9]]},"182":{"position":[[197,9],[344,7]]},"188":{"position":[[1340,8]]},"204":{"position":[[272,7]]},"210":{"position":[[259,7]]},"216":{"position":[[440,8]]},"242":{"position":[[64,8]]},"283":{"position":[[382,8],[435,8]]},"313":{"position":[[561,7]]},"331":{"position":[[317,8],[503,7]]},"343":{"position":[[3336,7],[5272,8]]},"347":{"position":[[992,8]]},"378":{"position":[[645,8],[1257,7]]},"393":{"position":[[52,8]]},"457":{"position":[[1320,9],[1388,7],[2586,7],[2614,7],[3213,7]]},"507":{"position":[[41,8]]},"513":{"position":[[303,7]]},"533":{"position":[[29,8]]},"557":{"position":[[1532,9]]},"559":{"position":[[387,7]]},"561":{"position":[[120,7]]},"579":{"position":[[19,7]]},"592":{"position":[[191,8]]},"597":{"position":[[107,8]]},"627":{"position":[[889,11],[1119,8],[1485,11]]},"647":{"position":[[136,8]]}}}],["proxi",{"_index":1085,"t":{"73":{"position":[[9117,5]]},"160":{"position":[[530,6]]},"182":{"position":[[228,5]]},"232":{"position":[[655,5]]},"251":{"position":[[660,5]]},"303":{"position":[[2729,5]]},"331":{"position":[[474,6]]},"335":{"position":[[746,5]]}}}],["psuedo",{"_index":2922,"t":{"470":{"position":[[1127,8]]},"476":{"position":[[6530,6]]},"483":{"position":[[1963,6]]}}}],["public",{"_index":542,"t":{"25":{"position":[[49,6]]},"64":{"position":[[122,10],[2788,6],[4074,6]]},"73":{"position":[[5851,6],[7237,6],[9496,6]]},"83":{"position":[[122,10],[2613,6],[3866,6]]},"105":{"position":[[987,6],[1458,6],[1492,7],[1532,6]]},"138":{"position":[[985,6],[1452,6],[1486,7],[1526,6]]},"184":{"position":[[1095,6],[1183,6],[1252,6],[1272,6],[1427,7]]},"335":{"position":[[540,6]]}}}],["publicli",{"_index":2411,"t":{"335":{"position":[[598,8]]}}}],["publish",{"_index":3428,"t":{"614":{"position":[[350,9],[441,9]]}}}],["puid",{"_index":2190,"t":{"293":{"position":[[986,4]]},"543":{"position":[[1989,4]]}}}],["puid=1000",{"_index":3129,"t":{"545":{"position":[[905,9]]}}}],["pull",{"_index":1202,"t":{"105":{"position":[[1398,6]]},"138":{"position":[[1392,6]]},"608":{"position":[[263,4],[373,7],[404,4]]},"612":{"position":[[149,4]]},"614":{"position":[[196,7],[404,4]]},"616":{"position":[[447,4],[621,6]]}}}],["punctuat",{"_index":1322,"t":{"118":{"position":[[1865,11]]}}}],["punish",{"_index":849,"t":{"57":{"position":[[345,9]]}}}],["punk",{"_index":2644,"t":{"376":{"position":[[815,4],[933,5]]},"476":{"position":[[4568,4],[4630,4],[4900,5],[5517,4]]},"490":{"position":[[718,4],[900,5]]}}}],["pure",{"_index":1576,"t":{"151":{"position":[[1360,5]]}}}],["push",{"_index":551,"t":{"27":{"position":[[14,4]]},"594":{"position":[[2481,4]]}}}],["python",{"_index":2524,"t":{"349":{"position":[[358,6]]},"528":{"position":[[73,6]]}}}],["qualifi",{"_index":1243,"t":{"110":{"position":[[1599,9]]},"291":{"position":[[635,9]]}}}],["qualiti",{"_index":1905,"t":{"200":{"position":[[383,7]]}}}],["queri",{"_index":421,"t":{"18":{"position":[[402,8]]},"29":{"position":[[343,5]]},"136":{"position":[[1089,7]]},"317":{"position":[[510,5]]},"343":{"position":[[3687,5]]},"474":{"position":[[293,7]]},"476":{"position":[[836,7]]}}}],["querystrings/data",{"_index":2283,"t":{"303":{"position":[[4740,17]]}}}],["question",{"_index":3057,"t":{"524":{"position":[[62,9]]}}}],["queu",{"_index":3480,"t":{"633":{"position":[[1116,7]]}}}],["queue",{"_index":674,"t":{"40":{"position":[[97,5]]},"87":{"position":[[487,5]]},"125":{"position":[[449,5]]},"303":{"position":[[211,5]]},"457":{"position":[[3048,8]]},"621":{"position":[[64,7]]},"625":{"position":[[448,7]]}}}],["queued/fail",{"_index":3458,"t":{"625":{"position":[[51,13],[489,13]]}}}],["queued/scrobbled/deadlett",{"_index":608,"t":{"31":{"position":[[164,27]]}}}],["quick",{"_index":2911,"t":{"459":{"position":[[1570,5]]},"545":{"position":[[12,5]]},"633":{"position":[[1324,5]]},"641":{"position":[[8,5]]}}}],["quicker",{"_index":333,"t":{"12":{"position":[[380,7]]}}}],["quickstart",{"_index":1676,"t":{"171":{"position":[[452,10]]},"384":{"position":[[594,11]]},"472":{"position":[[1491,11]]},"633":{"position":[[2877,10]]}}}],["quirk",{"_index":1603,"t":{"153":{"position":[[617,5]]}}}],["r",{"_index":1014,"t":{"73":{"position":[[2449,1],[2496,1]]},"77":{"position":[[1048,1],[1095,1]]}}}],["race",{"_index":1407,"t":{"123":{"position":[[164,4]]}}}],["rang",{"_index":647,"t":{"38":{"position":[[208,5]]},"118":{"position":[[2794,5],[4678,5]]},"459":{"position":[[830,5]]},"461":{"position":[[227,5]]}}}],["rank",{"_index":2996,"t":{"483":{"position":[[705,4],[2251,6],[2953,7],[3088,6],[3124,6]]}}}],["rariti",{"_index":2606,"t":{"369":{"position":[[898,8],[953,8]]}}}],["raspberri",{"_index":3097,"t":{"541":{"position":[[66,9]]}}}],["rate",{"_index":2912,"t":{"466":{"position":[[9,4]]}}}],["raw",{"_index":1459,"t":{"138":{"position":[[2009,3]]},"184":{"position":[[502,3]]},"216":{"position":[[3117,3]]},"297":{"position":[[1710,3]]},"325":{"position":[[658,3]]},"327":{"position":[[1163,3]]},"451":{"position":[[550,3]]}}}],["re",{"_index":701,"t":{"44":{"position":[[26,2]]},"73":{"position":[[2734,2]]},"77":{"position":[[1333,2]]},"87":{"position":[[27,2]]},"97":{"position":[[27,2]]},"105":{"position":[[26,2]]},"112":{"position":[[27,2]]},"118":{"position":[[653,2]]},"134":{"position":[[510,2]]},"138":{"position":[[26,2]]},"151":{"position":[[669,2],[1305,2],[1653,2]]},"184":{"position":[[828,3]]},"220":{"position":[[65,2]]},"222":{"position":[[189,2]]},"236":{"position":[[427,2]]},"255":{"position":[[56,2]]},"259":{"position":[[72,2]]},"267":{"position":[[55,2]]},"287":{"position":[[210,2]]},"319":{"position":[[289,2]]},"343":{"position":[[4647,2]]},"425":{"position":[[2846,2]]},"441":{"position":[[1132,2]]},"457":{"position":[[1162,3]]}}}],["re)authent",{"_index":2289,"t":{"303":{"position":[[5453,16]]},"343":{"position":[[4270,16]]},"441":{"position":[[497,16]]},"557":{"position":[[1212,16],[3990,16]]}}}],["re)start",{"_index":836,"t":{"54":{"position":[[1254,12]]},"557":{"position":[[2017,9]]}}}],["reach",{"_index":2053,"t":{"232":{"position":[[988,5]]},"251":{"position":[[993,5]]},"343":{"position":[[3084,5]]},"437":{"position":[[474,5]]}}}],["reachabl",{"_index":541,"t":{"25":{"position":[[33,12]]},"232":{"position":[[701,11]]},"251":{"position":[[706,11]]},"435":{"position":[[1877,9]]}}}],["read",{"_index":775,"t":{"46":{"position":[[1570,4],[2966,4]]},"54":{"position":[[479,5]]},"66":{"position":[[2075,4],[3481,4]]},"85":{"position":[[1834,4],[3198,4]]},"91":{"position":[[1739,4],[3198,4]]},"95":{"position":[[1512,4],[2879,4]]},"103":{"position":[[1841,4],[3260,4]]},"105":{"position":[[1376,4],[1539,5]]},"110":{"position":[[2766,4],[4195,4]]},"114":{"position":[[1654,4],[3097,4]]},"138":{"position":[[1370,4],[1533,5]]},"143":{"position":[[2125,4],[3492,4]]},"153":{"position":[[1897,4],[3582,4]]},"186":{"position":[[1656,4],[3076,4]]},"188":{"position":[[4785,4],[6603,4]]},"198":{"position":[[1665,4],[3092,4]]},"202":{"position":[[1505,4],[2825,4]]},"208":{"position":[[1674,4],[3018,4]]},"214":{"position":[[1630,4],[2987,4]]},"218":{"position":[[2010,4],[3378,4]]},"220":{"position":[[2227,4],[3623,4]]},"234":{"position":[[1773,4],[3087,4]]},"253":{"position":[[1842,4],[3164,4]]},"257":{"position":[[2163,4],[3582,4]]},"261":{"position":[[1977,4],[3420,4]]},"265":{"position":[[1810,4],[3177,4]]},"269":{"position":[[2051,4],[3510,4]]},"277":{"position":[[1869,4],[3230,4]]},"279":{"position":[[229,4]]},"281":{"position":[[1590,4],[2945,4]]},"285":{"position":[[1635,4],[3000,4]]},"291":{"position":[[2061,4],[3490,4]]},"295":{"position":[[1632,4],[2964,4]]},"301":{"position":[[2103,4],[3517,4]]},"305":{"position":[[1656,4],[3118,4]]},"317":{"position":[[1639,4],[3093,4]]},"325":{"position":[[3296,4],[4721,4]]},"329":{"position":[[1509,4],[2815,4]]},"333":{"position":[[1516,4],[2836,4]]},"341":{"position":[[1599,4],[2952,4]]},"345":{"position":[[1751,4],[3219,4]]},"349":{"position":[[1613,4],[2976,4]]},"425":{"position":[[386,7],[1317,4],[3230,4]]},"543":{"position":[[48,4],[2174,4]]},"581":{"position":[[857,4]]},"588":{"position":[[18,5]]},"592":{"position":[[1889,4]]}}}],["read_onli",{"_index":3114,"t":{"543":{"position":[[2189,10],[2305,10]]}}}],["readi",{"_index":2078,"t":{"249":{"position":[[403,5]]},"327":{"position":[[661,5]]}}}],["real",{"_index":769,"t":{"46":{"position":[[1222,4]]},"60":{"position":[[34,6],[246,6],[390,4],[822,6]]},"66":{"position":[[1723,4]]},"85":{"position":[[1482,4]]},"91":{"position":[[1389,4]]},"95":{"position":[[1162,4]]},"103":{"position":[[1489,4]]},"110":{"position":[[2414,4]]},"114":{"position":[[1292,4]]},"118":{"position":[[2742,4],[3472,4]]},"143":{"position":[[1775,4]]},"153":{"position":[[1539,4]]},"160":{"position":[[705,4],[924,4]]},"178":{"position":[[930,4]]},"186":{"position":[[1300,4]]},"188":{"position":[[4431,4]]},"198":{"position":[[1315,4]]},"202":{"position":[[1153,4]]},"208":{"position":[[1324,4]]},"214":{"position":[[1284,4]]},"218":{"position":[[1652,4]]},"220":{"position":[[1626,4]]},"232":{"position":[[539,4]]},"234":{"position":[[1413,4]]},"236":{"position":[[315,4]]},"251":{"position":[[544,4]]},"253":{"position":[[1484,4]]},"257":{"position":[[1552,4]]},"261":{"position":[[1341,4]]},"265":{"position":[[1204,4]]},"269":{"position":[[1445,4]]},"277":{"position":[[1519,4]]},"281":{"position":[[1246,4]]},"285":{"position":[[1279,4]]},"291":{"position":[[1450,4]]},"295":{"position":[[1284,4]]},"301":{"position":[[1755,4]]},"305":{"position":[[1304,4]]},"311":{"position":[[548,4],[836,4],[1313,4]]},"317":{"position":[[1285,4]]},"325":{"position":[[2690,4]]},"329":{"position":[[1165,4]]},"333":{"position":[[1160,4]]},"341":{"position":[[1237,4]]},"345":{"position":[[1399,4]]},"347":{"position":[[48,4]]},"349":{"position":[[1259,4]]},"513":{"position":[[23,4]]},"567":{"position":[[586,4]]},"590":{"position":[[433,4]]}}}],["realiz",{"_index":3029,"t":{"492":{"position":[[170,9]]}}}],["realtim",{"_index":664,"t":{"38":{"position":[[516,8]]}}}],["reason",{"_index":140,"t":{"4":{"position":[[3695,7]]},"18":{"position":[[1285,10],[3985,10]]},"57":{"position":[[404,7]]},"297":{"position":[[1833,6]]},"351":{"position":[[339,8]]},"425":{"position":[[711,6]]},"476":{"position":[[6737,7]]},"599":{"position":[[3873,6]]}}}],["reasons/stat",{"_index":1421,"t":{"130":{"position":[[216,14]]}}}],["reauthent",{"_index":2761,"t":{"425":{"position":[[3313,14]]},"441":{"position":[[370,14]]}}}],["rebound",{"_index":1572,"t":{"151":{"position":[[1190,8]]}}}],["recap",{"_index":2542,"t":{"353":{"position":[[13,5]]}}}],["receiv",{"_index":1412,"t":{"125":{"position":[[122,8]]},"216":{"position":[[2457,10],[3044,10]]},"353":{"position":[[558,8]]},"357":{"position":[[60,8],[298,8],[919,7]]},"359":{"position":[[477,8]]},"384":{"position":[[946,8]]},"427":{"position":[[562,8]]},"435":{"position":[[449,8],[814,8],[1001,8]]},"451":{"position":[[73,8]]},"472":{"position":[[1986,8]]},"599":{"position":[[215,8],[1627,8],[1787,8]]}}}],["recent",{"_index":841,"t":{"54":{"position":[[1513,8]]},"147":{"position":[[46,8]]},"151":{"position":[[215,6]]},"581":{"position":[[446,8]]},"597":{"position":[[1110,8]]},"599":{"position":[[762,8],[4019,9]]},"647":{"position":[[31,6]]}}}],["recentlyplayedopt",{"_index":3370,"t":{"594":{"position":[[1795,21]]},"597":{"position":[[691,23]]}}}],["reciev",{"_index":1397,"t":{"120":{"position":[[480,9]]},"123":{"position":[[494,8]]},"125":{"position":[[278,8]]},"297":{"position":[[1719,8]]},"303":{"position":[[741,7],[3874,9]]},"333":{"position":[[1670,10],[3000,10]]}}}],["recogn",{"_index":2791,"t":{"435":{"position":[[942,10]]},"449":{"position":[[103,9]]}}}],["recommend",{"_index":372,"t":{"14":{"position":[[295,11]]},"62":{"position":[[151,11]]},"151":{"position":[[412,11]]},"188":{"position":[[353,11]]},"216":{"position":[[590,11]]},"222":{"position":[[263,11]]},"313":{"position":[[313,11]]},"335":{"position":[[811,13]]},"343":{"position":[[826,11]]},"476":{"position":[[4117,13]]},"515":{"position":[[206,11]]},"533":{"position":[[130,9]]},"602":{"position":[[154,11]]},"621":{"position":[[437,11]]}}}],["reconstruct",{"_index":468,"t":{"18":{"position":[[1829,11]]}}}],["record",{"_index":1656,"t":{"166":{"position":[[914,6]]},"325":{"position":[[765,6]]},"439":{"position":[[278,6],[404,6],[896,8]]},"476":{"position":[[2130,11],[2278,9],[6142,9],[6173,9]]},"481":{"position":[[59,9],[200,9],[1560,9],[1670,9],[1817,9]]},"483":{"position":[[1621,9],[3024,11],[3172,10]]},"490":{"position":[[770,9]]}}}],["recov",{"_index":2756,"t":{"425":{"position":[[2938,7]]}}}],["recoveri",{"_index":1564,"t":{"151":{"position":[[523,9],[1689,8]]}}}],["recoverunchangedtophistori",{"_index":1580,"t":{"151":{"position":[[1712,29]]},"153":{"position":[[2432,29],[4126,29]]}}}],["recreat",{"_index":3438,"t":{"616":{"position":[[645,9]]}}}],["redi",{"_index":376,"t":{"14":{"position":[[400,6]]}}}],["redirect",{"_index":285,"t":{"10":{"position":[[49,8],[445,8],[501,8],[622,8],[856,8]]},"89":{"position":[[4,8],[39,8],[498,8]]},"97":{"position":[[437,9]]},"99":{"position":[[4,8],[39,8],[492,8]]},"303":{"position":[[1948,8],[2000,8],[2028,8],[2429,8],[2642,8],[2812,8],[3272,8],[3966,8],[4118,8],[4209,8],[5136,8],[5315,8]]},"305":{"position":[[478,8]]},"343":{"position":[[2307,8],[2941,8],[3033,8],[3210,8],[3362,8],[3442,8],[3750,8],[4132,8]]},"345":{"position":[[378,8]]},"543":{"position":[[1072,9]]},"557":{"position":[[641,8],[761,8]]}}}],["redirecturi",{"_index":192,"t":{"4":{"position":[[5092,14]]},"8":{"position":[[641,14],[1115,14]]},"10":{"position":[[562,11]]},"89":{"position":[[396,11]]},"91":{"position":[[2064,14],[3536,14]]},"99":{"position":[[397,11]]},"103":{"position":[[2122,14],[3553,14]]},"151":{"position":[[3047,14]]},"174":{"position":[[1723,14],[2250,14],[2754,14],[3271,14]]},"176":{"position":[[1268,14],[1454,14],[2531,14],[2735,14]]},"178":{"position":[[2497,14],[2924,14],[3701,14],[4127,14]]},"257":{"position":[[2444,14],[3875,14]]},"269":{"position":[[2376,14],[3848,14]]},"305":{"position":[[1972,14],[3446,14]]},"343":{"position":[[3963,14]]},"559":{"position":[[1916,14]]},"563":{"position":[[1054,14]]}}}],["redis://192.168.0.120:6379",{"_index":389,"t":{"14":{"position":[[1192,28]]}}}],["redis://host_ip:host_port",{"_index":387,"t":{"14":{"position":[[1008,25]]}}}],["redis://valkey:6379",{"_index":384,"t":{"14":{"position":[[832,19]]},"627":{"position":[[849,21],[927,21],[1452,22],[1523,21]]}}}],["redo",{"_index":1234,"t":{"110":{"position":[[860,4]]}}}],["reduc",{"_index":317,"t":{"12":{"position":[[38,6]]},"18":{"position":[[1460,6]]},"180":{"position":[[113,6]]},"331":{"position":[[179,6]]},"372":{"position":[[19,6],[402,6]]},"486":{"position":[[37,6],[90,6]]},"543":{"position":[[2464,7]]},"569":{"position":[[157,7]]}}}],["refer",{"_index":223,"t":{"4":{"position":[[6133,9]]},"6":{"position":[[98,9],[156,9]]},"27":{"position":[[649,5],[1004,5],[1404,5]]},"57":{"position":[[483,5]]},"384":{"position":[[330,5]]},"421":{"position":[[28,9],[128,8]]},"427":{"position":[[702,5]]},"447":{"position":[[342,5]]},"453":{"position":[[271,5],[392,5]]},"472":{"position":[[1221,5]]},"474":{"position":[[109,5]]},"557":{"position":[[655,5],[3030,5]]},"599":{"position":[[1509,10]]}}}],["referenc",{"_index":462,"t":{"18":{"position":[[1583,11]]}}}],["refin",{"_index":2934,"t":{"474":{"position":[[301,8]]}}}],["refresh",{"_index":1545,"t":{"149":{"position":[[3191,10]]},"343":{"position":[[5432,11]]},"441":{"position":[[456,7]]}}}],["regardless",{"_index":1379,"t":{"118":{"position":[[4837,10]]},"216":{"position":[[2551,10],[2954,10]]},"271":{"position":[[220,10]]},"297":{"position":[[1612,11]]},"459":{"position":[[274,10]]},"476":{"position":[[6191,10]]},"490":{"position":[[1612,10]]},"559":{"position":[[314,10]]},"561":{"position":[[47,10]]},"599":{"position":[[744,10]]},"602":{"position":[[136,11]]},"633":{"position":[[1897,10],[2089,10]]}}}],["regex",{"_index":2685,"t":{"402":{"position":[[129,5],[196,5]]},"412":{"position":[[281,5]]}}}],["regist",{"_index":1115,"t":{"87":{"position":[[1279,8]]},"557":{"position":[[3389,8]]},"565":{"position":[[1366,8]]}}}],["registr",{"_index":2086,"t":{"255":{"position":[[206,12]]},"267":{"position":[[321,12]]}}}],["regular",{"_index":1222,"t":{"110":{"position":[[103,7]]},"143":{"position":[[203,7]]},"200":{"position":[[1793,7]]},"327":{"position":[[1182,7]]},"367":{"position":[[186,7],[898,7]]},"378":{"position":[[401,7]]},"397":{"position":[[179,7],[402,7]]},"594":{"position":[[2488,7]]}}}],["rel",{"_index":3136,"t":{"549":{"position":[[624,8],[810,8]]}}}],["relat",{"_index":1382,"t":{"118":{"position":[[4930,7]]},"299":{"position":[[32,7]]},"347":{"position":[[1049,7],[1512,7]]},"427":{"position":[[308,7]]},"439":{"position":[[629,7]]},"483":{"position":[[1717,7]]},"555":{"position":[[40,7]]},"606":{"position":[[41,7]]}}}],["relay",{"_index":804,"t":{"50":{"position":[[394,5]]},"73":{"position":[[5616,7],[5896,5],[7002,7],[7453,5],[9261,7]]},"138":{"position":[[1796,5]]},"293":{"position":[[1467,5]]}}}],["releas",{"_index":928,"t":{"64":{"position":[[3087,7],[3229,7]]},"73":{"position":[[9635,8]]},"83":{"position":[[2912,7],[3054,7]]},"178":{"position":[[966,7]]},"470":{"position":[[1136,10]]},"472":{"position":[[975,8],[1664,7]]},"476":{"position":[[6161,8],[6537,9],[6601,9],[6658,8],[6761,7]]},"481":{"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]]},"483":{"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]]},"488":{"position":[[395,7],[581,7],[808,7],[994,7]]},"492":{"position":[[61,8],[208,7]]},"509":{"position":[[101,7]]},"602":{"position":[[188,7],[227,7]]},"606":{"position":[[86,7]]},"608":{"position":[[53,7],[125,7]]},"610":{"position":[[331,7]]},"612":{"position":[[196,7]]},"614":{"position":[[65,7],[90,8],[180,8],[370,8]]},"618":{"position":[[47,7],[118,7],[624,7]]},"633":{"position":[[1551,7]]}}}],["release/album/ep",{"_index":2976,"t":{"481":{"position":[[666,16]]}}}],["releaseallowempti",{"_index":2920,"t":{"468":{"position":[[319,20]]},"481":{"position":[[1881,17],[1953,20]]}}}],["releasecountri",{"_index":2982,"t":{"481":{"position":[[954,16]]}}}],["releasecountryprior",{"_index":1759,"t":{"178":{"position":[[2195,25],[3394,25]]},"488":{"position":[[589,25],[1002,25]]},"501":{"position":[[371,25]]},"505":{"position":[[468,25]]},"509":{"position":[[767,25],[1346,25]]}}}],["releasegroup",{"_index":2623,"t":{"369":{"position":[[1167,13]]}}}],["releasegroupprimarytyp",{"_index":2978,"t":{"481":{"position":[[749,25]]}}}],["releasegroupprimarytypeprior",{"_index":1758,"t":{"178":{"position":[[2131,34],[3330,34]]},"483":{"position":[[995,34]]},"488":{"position":[[499,34],[912,34]]},"501":{"position":[[309,34]]},"505":{"position":[[406,34]]},"509":{"position":[[705,34],[1284,34]]}}}],["releasegroupsecondarytyp",{"_index":2979,"t":{"481":{"position":[[851,27]]}}}],["releasegroupsecondarytypedeni",{"_index":2991,"t":{"481":{"position":[[1483,32]]}}}],["releasestatu",{"_index":2975,"t":{"481":{"position":[[640,15]]}}}],["releasestatusallow",{"_index":2990,"t":{"481":{"position":[[1421,21]]}}}],["releasestatusprior",{"_index":1757,"t":{"178":{"position":[[2092,24],[3291,24]]},"468":{"position":[[280,24]]},"470":{"position":[[1102,24]]},"483":{"position":[[901,24],[1927,21]]},"488":{"position":[[422,24],[835,24]]},"501":{"position":[[270,24]]},"505":{"position":[[367,24]]},"509":{"position":[[666,24],[1245,24]]}}}],["relev",{"_index":1653,"t":{"166":{"position":[[162,8],[563,8]]},"517":{"position":[[251,8]]},"524":{"position":[[491,8]]}}}],["reli",{"_index":1965,"t":{"216":{"position":[[405,6],[672,7]]},"441":{"position":[[599,6]]},"451":{"position":[[28,6]]},"507":{"position":[[109,4]]}}}],["reload",{"_index":1530,"t":{"149":{"position":[[1356,6],[2093,6]]},"335":{"position":[[244,6]]},"575":{"position":[[41,6]]}}}],["remain",{"_index":1555,"t":{"149":{"position":[[3807,7]]},"483":{"position":[[38,9]]},"627":{"position":[[526,7],[992,7]]}}}],["remast",{"_index":2589,"t":{"367":{"position":[[854,18]]}}}],["rememb",{"_index":937,"t":{"64":{"position":[[4026,9]]},"83":{"position":[[3818,9]]},"343":{"position":[[3700,8]]},"584":{"position":[[542,8]]}}}],["remix",{"_index":2981,"t":{"481":{"position":[[924,6]]}}}],["remot",{"_index":1946,"t":{"210":{"position":[[173,6]]},"214":{"position":[[431,6],[502,6]]},"293":{"position":[[608,6],[647,6],[1275,6]]},"435":{"position":[[477,6]]}}}],["remov",{"_index":1235,"t":{"110":{"position":[[1004,7]]},"118":{"position":[[268,8]]},"151":{"position":[[709,7]]},"153":{"position":[[718,7]]},"178":{"position":[[1907,7],[3106,7]]},"190":{"position":[[133,6]]},"277":{"position":[[667,6]]},"393":{"position":[[234,8],[275,8]]},"395":{"position":[[739,7]]},"397":{"position":[[83,7],[215,7]]},"399":{"position":[[223,7],[268,7],[500,8]]},"402":{"position":[[202,6]]},"404":{"position":[[0,7]]},"457":{"position":[[1086,8]]},"476":{"position":[[4715,7]]},"481":{"position":[[1988,6]]},"483":{"position":[[154,8]]},"553":{"position":[[564,6]]},"627":{"position":[[82,8],[316,8],[346,7],[388,6],[439,6],[644,6],[709,6],[1265,6],[1323,6],[1420,8]]}}}],["removetrailingslash",{"_index":3331,"t":{"592":{"position":[[514,21]]}}}],["renam",{"_index":100,"t":{"4":{"position":[[2091,8]]},"535":{"position":[[399,6],[585,6]]},"627":{"position":[[666,6]]},"629":{"position":[[62,8]]}}}],["render",{"_index":1203,"t":{"105":{"position":[[1428,6]]},"138":{"position":[[1422,6]]},"188":{"position":[[1707,9]]},"415":{"position":[[348,6]]}}}],["repeat",{"_index":663,"t":{"38":{"position":[[474,6]]},"147":{"position":[[615,6]]},"151":{"position":[[1410,6]]},"194":{"position":[[484,8],[608,8]]},"315":{"position":[[791,8]]},"351":{"position":[[400,9],[742,9]]}}}],["replac",{"_index":243,"t":{"8":{"position":[[405,8]]},"110":{"position":[[623,8]]},"149":{"position":[[3764,7]]},"188":{"position":[[1561,7],[1662,7]]},"226":{"position":[[72,7]]},"303":{"position":[[4310,7]]},"351":{"position":[[109,9]]},"359":{"position":[[201,7]]},"363":{"position":[[1174,9]]},"378":{"position":[[287,8]]},"393":{"position":[[31,7]]},"395":{"position":[[49,7]]},"397":{"position":[[13,7],[434,7],[524,10],[549,7],[747,10],[776,7],[895,7],[930,9]]},"399":{"position":[[41,7],[301,8],[349,10]]},"402":{"position":[[61,7],[142,7],[301,10]]},"408":{"position":[[65,10]]},"410":{"position":[[68,10]]},"412":{"position":[[93,7],[106,7],[294,7],[742,10]]},"535":{"position":[[653,7]]},"549":{"position":[[1565,11]]},"553":{"position":[[618,7]]},"565":{"position":[[750,7]]},"627":{"position":[[358,8]]}}}],["replay",{"_index":469,"t":{"18":{"position":[[1845,6]]}}}],["replic",{"_index":3044,"t":{"515":{"position":[[36,9]]},"524":{"position":[[554,9]]}}}],["repo",{"_index":160,"t":{"4":{"position":[[4417,4]]}}}],["repo=/home/youruser/multi",{"_index":3087,"t":{"535":{"position":[[799,25]]}}}],["report",{"_index":470,"t":{"18":{"position":[[1894,9]]},"20":{"position":[[217,10]]},"38":{"position":[[509,6]]},"42":{"position":[[20,6],[272,10],[494,8],[618,9],[779,9],[1231,6],[1295,9]]},"73":{"position":[[3136,7],[8928,6]]},"79":{"position":[[360,7]]},"118":{"position":[[2658,6]]},"162":{"position":[[13,6]]},"180":{"position":[[49,6]]},"194":{"position":[[65,6]]},"200":{"position":[[1402,6]]},"216":{"position":[[1597,6],[1681,8],[1758,6],[1855,6],[1950,8],[2622,7],[2979,8]]},"232":{"position":[[1094,6]]},"249":{"position":[[571,8]]},"251":{"position":[[1105,6]]},"297":{"position":[[272,7],[516,9],[1038,6],[1151,6],[2012,7]]},"303":{"position":[[286,6],[439,7]]},"313":{"position":[[184,8]]},"315":{"position":[[67,7],[135,10],[252,6],[386,9],[530,9],[618,10],[671,6],[766,10],[920,7]]},"327":{"position":[[1270,8],[1948,10],[1995,9],[2137,10],[2237,9]]},"331":{"position":[[127,6]]},"343":{"position":[[472,6],[1447,8]]},"376":{"position":[[140,6],[180,7]]},"453":{"position":[[63,9],[147,8]]},"455":{"position":[[7,9]]},"457":{"position":[[1201,9],[1412,7]]},"524":{"position":[[7,9],[439,7]]},"594":{"position":[[423,8]]}}}],["repositori",{"_index":422,"t":{"18":{"position":[[418,10]]},"64":{"position":[[3834,11]]},"83":{"position":[[3626,11]]},"105":{"position":[[300,10],[1114,10],[1414,10]]},"138":{"position":[[298,10],[1112,10],[1408,10]]},"289":{"position":[[93,10]]},"319":{"position":[[181,10]]},"321":{"position":[[93,10]]},"347":{"position":[[1195,10]]},"417":{"position":[[190,10]]},"419":{"position":[[5,10],[307,10]]},"522":{"position":[[14,10]]},"541":{"position":[[123,10],[179,10]]},"549":{"position":[[11,10]]},"608":{"position":[[302,10]]}}}],["repres",{"_index":2965,"t":{"479":{"position":[[60,12]]},"481":{"position":[[1072,9]]},"590":{"position":[[556,9]]}}}],["request",{"_index":334,"t":{"12":{"position":[[388,8]]},"18":{"position":[[1000,8]]},"149":{"position":[[872,9],[1336,8],[1418,7],[1509,7],[2138,7],[2226,7],[2683,7]]},"153":{"position":[[546,8]]},"160":{"position":[[211,8]]},"192":{"position":[[132,8]]},"232":{"position":[[1068,8]]},"244":{"position":[[554,8],[642,8]]},"251":{"position":[[1079,8]]},"253":{"position":[[516,7]]},"303":{"position":[[3863,7],[4766,8]]},"345":{"position":[[579,7]]},"425":{"position":[[374,8],[1821,7],[2496,7],[3172,7]]},"435":{"position":[[458,7],[1015,7],[2522,9]]},"439":{"position":[[222,7],[382,7],[637,9]]},"441":{"position":[[110,7]]},"524":{"position":[[219,7],[261,7],[299,7]]},"581":{"position":[[907,8]]},"592":{"position":[[1516,7],[2154,7],[2381,7]]},"594":{"position":[[1543,7],[1951,7]]},"597":{"position":[[339,7],[767,7]]},"612":{"position":[[154,8]]},"614":{"position":[[409,8]]},"616":{"position":[[452,8]]}}}],["request.get(`${this.baseurl}/health",{"_index":3352,"t":{"592":{"position":[[1784,38]]}}}],["request/respons",{"_index":420,"t":{"18":{"position":[[362,16],[2029,17]]}}}],["requir",{"_index":31,"t":{"4":{"position":[[418,7],[5741,7],[5839,7],[6110,8]]},"16":{"position":[[169,8]]},"18":{"position":[[1574,8]]},"29":{"position":[[582,7]]},"44":{"position":[[788,9]]},"46":{"position":[[479,8]]},"50":{"position":[[283,8],[345,7]]},"52":{"position":[[98,7],[206,8]]},"54":{"position":[[451,8],[920,8]]},"57":{"position":[[151,8]]},"64":{"position":[[1051,8]]},"66":{"position":[[972,8]]},"73":{"position":[[3373,8],[6654,9],[8530,9],[10046,9]]},"83":{"position":[[910,8]]},"85":{"position":[[731,8]]},"91":{"position":[[642,8]]},"95":{"position":[[415,8]]},"103":{"position":[[738,8]]},"110":{"position":[[1663,8]]},"114":{"position":[[521,8]]},"143":{"position":[[1028,8]]},"145":{"position":[[207,8]]},"147":{"position":[[22,8]]},"149":{"position":[[41,8],[405,9],[2610,8],[2670,8],[2929,8]]},"153":{"position":[[776,8]]},"160":{"position":[[429,7]]},"168":{"position":[[280,7]]},"178":{"position":[[861,8]]},"182":{"position":[[117,8]]},"186":{"position":[[541,8]]},"188":{"position":[[3676,8]]},"198":{"position":[[568,8]]},"202":{"position":[[402,8]]},"208":{"position":[[577,8]]},"214":{"position":[[545,8]]},"216":{"position":[[1470,9],[1544,9]]},"218":{"position":[[889,8]]},"220":{"position":[[883,8],[1752,8],[1944,11]]},"228":{"position":[[157,8],[325,8]]},"232":{"position":[[184,7],[439,7],[513,7]]},"234":{"position":[[646,8]]},"242":{"position":[[26,7],[269,7]]},"251":{"position":[[184,7],[439,7],[518,7]]},"253":{"position":[[721,8]]},"257":{"position":[[801,8],[1680,8],[1876,11]]},"261":{"position":[[570,8],[1474,8],[1680,11]]},"265":{"position":[[457,8],[1331,8],[1525,11]]},"269":{"position":[[698,8],[1572,8],[1766,11]]},"277":{"position":[[772,8]]},"279":{"position":[[211,8]]},"281":{"position":[[511,8]]},"285":{"position":[[520,8]]},"291":{"position":[[699,8],[1578,8],[1774,11]]},"293":{"position":[[396,8],[598,9],[768,11]]},"295":{"position":[[541,8]]},"301":{"position":[[1012,8]]},"303":{"position":[[518,8],[888,7],[1453,8]]},"305":{"position":[[494,8],[553,8]]},"317":{"position":[[530,8]]},"325":{"position":[[1943,8],[2817,8],[3011,11]]},"329":{"position":[[430,8]]},"333":{"position":[[401,8]]},"335":{"position":[[430,9]]},"337":{"position":[[117,8]]},"341":{"position":[[466,8]]},"345":{"position":[[648,8]]},"347":{"position":[[71,8]]},"349":{"position":[[504,8]]},"361":{"position":[[348,8]]},"391":{"position":[[194,8]]},"417":{"position":[[12,8]]},"423":{"position":[[250,8],[449,8]]},"425":{"position":[[516,8],[1278,8],[1977,8],[2293,8],[2374,8],[2446,8],[2708,8]]},"427":{"position":[[99,8]]},"466":{"position":[[36,8]]},"476":{"position":[[185,8],[326,8],[493,8],[775,8]]},"528":{"position":[[64,8]]},"581":{"position":[[340,7]]},"584":{"position":[[355,8],[2065,8],[2092,8]]},"586":{"position":[[782,8],[848,7]]},"588":{"position":[[1048,10]]},"592":{"position":[[34,8]]},"602":{"position":[[370,8]]},"604":{"position":[[143,8]]},"610":{"position":[[403,8]]},"618":{"position":[[251,8],[287,8],[563,7]]},"621":{"position":[[520,8]]},"623":{"position":[[1244,8]]},"627":{"position":[[53,8]]}}}],["requiresauth",{"_index":2752,"t":{"425":{"position":[[2125,12]]}}}],["requiresauthinteract",{"_index":2754,"t":{"425":{"position":[[2216,23]]}}}],["reserv",{"_index":3440,"t":{"618":{"position":[[237,8]]}}}],["reset",{"_index":2845,"t":{"457":{"position":[[568,6]]}}}],["resolut",{"_index":1972,"t":{"216":{"position":[[1094,10]]}}}],["resolv",{"_index":1114,"t":{"87":{"position":[[1155,8]]},"425":{"position":[[2737,7]]},"441":{"position":[[1267,7]]},"451":{"position":[[620,7]]},"549":{"position":[[616,7]]}}}],["resourc",{"_index":1820,"t":{"188":{"position":[[1753,10]]}}}],["resp",{"_index":3351,"t":{"592":{"position":[[1771,4],[2368,4]]},"594":{"position":[[1938,4],[2244,5]]},"597":{"position":[[754,4],[987,5]]}}}],["resp.body.vers",{"_index":3353,"t":{"592":{"position":[[2000,22]]}}}],["respect",{"_index":788,"t":{"46":{"position":[[2137,10]]},"54":{"position":[[433,7]]},"66":{"position":[[2648,10]]},"85":{"position":[[2365,10]]},"91":{"position":[[2367,10]]},"95":{"position":[[2048,10]]},"103":{"position":[[2427,10]]},"110":{"position":[[3362,10]]},"114":{"position":[[2254,10]]},"143":{"position":[[2661,10]]},"153":{"position":[[2743,10]]},"186":{"position":[[2239,10]]},"188":{"position":[[1688,13],[5768,10]]},"198":{"position":[[2261,10]]},"202":{"position":[[1992,10]]},"208":{"position":[[2187,10]]},"214":{"position":[[2160,10]]},"218":{"position":[[2539,10]]},"220":{"position":[[2794,10]]},"234":{"position":[[2246,10]]},"253":{"position":[[2325,10]]},"257":{"position":[[2749,10]]},"261":{"position":[[2577,10]]},"265":{"position":[[2346,10]]},"269":{"position":[[2679,10]]},"277":{"position":[[2399,10]]},"281":{"position":[[2120,10]]},"285":{"position":[[2163,10]]},"291":{"position":[[2657,10]]},"295":{"position":[[2135,10]]},"301":{"position":[[2688,10]]},"303":{"position":[[5335,10]]},"305":{"position":[[2285,10]]},"317":{"position":[[2258,10]]},"325":{"position":[[3890,10]]},"329":{"position":[[1990,10]]},"333":{"position":[[1999,10]]},"341":{"position":[[2109,10]]},"345":{"position":[[2386,10]]},"349":{"position":[[2141,10]]},"423":{"position":[[82,12]]}}}],["respond",{"_index":2811,"t":{"439":{"position":[[209,7],[366,7]]}}}],["respons",{"_index":598,"t":{"29":{"position":[[475,8]]},"87":{"position":[[617,11]]},"136":{"position":[[403,8]]},"160":{"position":[[251,8]]},"184":{"position":[[511,8]]},"198":{"position":[[357,8]]},"592":{"position":[[1894,8]]}}}],["rest",{"_index":2253,"t":{"303":{"position":[[1217,4]]}}}],["restart",{"_index":336,"t":{"12":{"position":[[424,9],[1009,8]]},"14":{"position":[[67,8]]},"40":{"position":[[312,7]]},"73":{"position":[[3172,7]]},"79":{"position":[[396,7]]},"174":{"position":[[1498,8]]},"178":{"position":[[1664,8]]},"196":{"position":[[831,7]]},"327":{"position":[[480,7]]},"343":{"position":[[4233,7],[4675,10]]},"347":{"position":[[544,8],[864,8]]},"384":{"position":[[1064,8]]},"425":{"position":[[180,10],[1611,7]]},"441":{"position":[[1241,7]]},"472":{"position":[[2144,8]]},"545":{"position":[[1080,8]]},"555":{"position":[[508,8]]},"557":{"position":[[2367,7],[2964,7]]},"608":{"position":[[413,7]]}}}],["restart=no",{"_index":3228,"t":{"573":{"position":[[395,10]]}}}],["restrict",{"_index":595,"t":{"29":{"position":[[372,8]]},"50":{"position":[[156,10]]},"196":{"position":[[889,12]]},"293":{"position":[[1399,10]]},"313":{"position":[[706,8]]},"343":{"position":[[4826,11]]},"459":{"position":[[890,10]]},"461":{"position":[[287,10]]},"557":{"position":[[2874,8]]}}}],["result",{"_index":255,"t":{"8":{"position":[[904,9]]},"12":{"position":[[438,7],[623,7]]},"18":{"position":[[1996,9]]},"118":{"position":[[2052,9],[3311,7]]},"120":{"position":[[747,6]]},"123":{"position":[[367,9]]},"363":{"position":[[51,9],[1130,6]]},"365":{"position":[[451,6]]},"367":{"position":[[1492,6]]},"372":{"position":[[137,8]]},"425":{"position":[[624,6]]},"447":{"position":[[443,6]]},"459":{"position":[[1494,7]]},"463":{"position":[[398,7]]},"474":{"position":[[188,6],[318,7]]},"476":{"position":[[4790,9],[5612,9],[6241,7],[7055,7]]},"483":{"position":[[2266,9]]},"488":{"position":[[117,7]]},"490":{"position":[[1399,8]]},"496":{"position":[[88,9]]}}}],["retart",{"_index":1106,"t":{"87":{"position":[[718,9]]}}}],["retent",{"_index":452,"t":{"18":{"position":[[1084,9],[1347,9],[3106,12],[3327,12],[3470,9],[4935,12],[5084,12]]}}}],["retention_compact_aft",{"_index":481,"t":{"18":{"position":[[2508,23]]}}}],["retention_compact_after=3",{"_index":488,"t":{"18":{"position":[[2881,25]]}}}],["retention_compact_completed_aft",{"_index":482,"t":{"18":{"position":[[2563,33]]}}}],["retention_compact_completed_after=30",{"_index":489,"t":{"18":{"position":[[2968,36]]}}}],["retention_compact_duped_aft",{"_index":485,"t":{"18":{"position":[[2705,29]]}}}],["retention_compact_failed_aft",{"_index":483,"t":{"18":{"position":[[2637,30]]}}}],["retention_delete_aft",{"_index":510,"t":{"18":{"position":[[4434,22]]}}}],["retention_delete_after=3",{"_index":514,"t":{"18":{"position":[[4738,24]]}}}],["retention_delete_completed_aft",{"_index":511,"t":{"18":{"position":[[4488,32]]}}}],["retention_delete_duped_aft",{"_index":513,"t":{"18":{"position":[[4626,28]]}}}],["retention_delete_failed_aft",{"_index":512,"t":{"18":{"position":[[4560,29]]}}}],["retentiond_delete_completed_after=30",{"_index":515,"t":{"18":{"position":[[4824,36]]}}}],["retri",{"_index":555,"t":{"27":{"position":[[116,5]]},"40":{"position":[[112,7],[207,8],[253,7]]},"87":{"position":[[696,8]]},"633":{"position":[[1144,6]]}}}],["retries/restart",{"_index":1111,"t":{"87":{"position":[[1047,16]]}}}],["retriev",{"_index":466,"t":{"18":{"position":[[1726,9]]},"64":{"position":[[2775,9]]},"83":{"position":[[2600,9]]},"192":{"position":[[170,8],[257,8]]},"198":{"position":[[335,9]]},"345":{"position":[[560,9]]},"441":{"position":[[1182,8]]}}}],["retrymultipli",{"_index":180,"t":{"4":{"position":[[4761,18],[4831,18]]}}}],["return",{"_index":583,"t":{"29":{"position":[[120,7],[328,6],[484,7],[622,6]]},"91":{"position":[[592,8]]},"103":{"position":[[580,8]]},"151":{"position":[[859,7]]},"160":{"position":[[241,7]]},"184":{"position":[[641,8]]},"196":{"position":[[917,6]]},"257":{"position":[[636,8]]},"269":{"position":[[648,8]]},"315":{"position":[[857,9]]},"425":{"position":[[459,6],[484,6],[525,6],[560,6],[2586,7],[2903,6],[3274,7]]},"451":{"position":[[322,6]]},"476":{"position":[[1171,7],[1349,9],[7044,6]]},"479":{"position":[[11,8]]},"490":{"position":[[563,7],[1212,6],[1378,6]]},"496":{"position":[[22,9]]},"581":{"position":[[260,7],[523,7]]},"590":{"position":[[73,8],[109,6],[755,6]]},"592":{"position":[[717,6],[1381,6],[1823,6],[1850,8],[1907,6],[1971,6],[2473,6],[2518,8]]},"594":{"position":[[521,8],[734,7],[1098,8],[2449,6],[2750,6],[2833,6],[2964,6]]},"597":{"position":[[908,8],[993,6]]},"599":{"position":[[429,8],[702,6],[2182,8],[2943,8]]}}}],["reveal",{"_index":3045,"t":{"515":{"position":[[104,6]]},"517":{"position":[[116,7]]}}}],["revers",{"_index":1635,"t":{"160":{"position":[[522,7]]},"182":{"position":[[220,7]]},"232":{"position":[[647,7]]},"251":{"position":[[652,7]]},"303":{"position":[[2721,7]]},"331":{"position":[[466,7]]},"335":{"position":[[738,7]]}}}],["review",{"_index":3207,"t":{"569":{"position":[[178,6]]},"579":{"position":[[229,6]]}}}],["rewrit",{"_index":3482,"t":{"633":{"position":[[1364,7]]}}}],["rich",{"_index":792,"t":{"48":{"position":[[66,4]]},"50":{"position":[[86,4]]},"52":{"position":[[74,4]]},"54":{"position":[[66,4],[684,4]]},"60":{"position":[[1225,4]]},"62":{"position":[[210,4]]},"68":{"position":[[66,4],[210,4]]},"73":{"position":[[99,4]]},"105":{"position":[[1868,4]]},"633":{"position":[[2491,4]]}}}],["right",{"_index":709,"t":{"44":{"position":[[342,5]]},"93":{"position":[[367,5]]},"136":{"position":[[500,5]]},"149":{"position":[[909,5]]},"192":{"position":[[774,5]]},"459":{"position":[[1383,6]]},"463":{"position":[[287,6]]},"476":{"position":[[6690,5]]},"565":{"position":[[434,5],[2125,5]]},"599":{"position":[[71,5]]}}}],["righteou",{"_index":1303,"t":{"118":{"position":[[1499,9],[1605,9]]}}}],["risk",{"_index":847,"t":{"57":{"position":[[305,5],[556,4]]},"190":{"position":[[219,5]]},"303":{"position":[[4924,4],[4995,4]]},"490":{"position":[[1961,5]]}}}],["rm",{"_index":2275,"t":{"303":{"position":[[3897,2]]}}}],["roam",{"_index":2237,"t":{"301":{"position":[[2373,6],[3801,6]]}}}],["robin",{"_index":1308,"t":{"118":{"position":[[1558,5],[1653,5]]},"466":{"position":[[541,5]]}}}],["robust",{"_index":2832,"t":{"447":{"position":[[22,6]]}}}],["rock",{"_index":2645,"t":{"376":{"position":[[820,4],[939,4]]},"476":{"position":[[4573,4],[4635,4],[4906,4],[5522,4]]},"490":{"position":[[723,4],[906,4]]}}}],["rockski",{"_index":643,"t":{"35":{"position":[[80,7]]},"105":{"position":[[52,7],[69,7],[86,7],[1326,8],[1658,7]]},"107":{"position":[[43,8],[166,7]]},"110":{"position":[[584,8],[729,7],[1431,7],[1542,7],[1749,7],[1957,7],[2298,7],[2379,7],[2605,7],[2939,7],[3340,7],[3533,7],[4053,7],[4380,7],[4565,9]]},"157":{"position":[[763,7]]},"287":{"position":[[26,8],[44,7],[61,7],[171,7],[285,7],[315,7]]},"289":{"position":[[37,7]]},"291":{"position":[[8,7],[571,7],[785,7],[993,7],[1334,7],[1415,7],[1606,7],[1746,7],[1808,7],[1900,7],[2234,7],[2635,7],[2828,7],[3348,7],[3675,7],[3860,9]]},"494":{"position":[[340,8]]},"503":{"position":[[191,8]]},"633":{"position":[[406,7],[653,7]]}}}],["rocksky'",{"_index":1197,"t":{"105":{"position":[[1165,9],[1223,9],[1733,9]]},"110":{"position":[[491,9]]}}}],["rocksky.app",{"_index":1216,"t":{"107":{"position":[[64,11]]}}}],["rocksky_en",{"_index":1238,"t":{"110":{"position":[[1310,14]]}}}],["rocksky_handl",{"_index":1241,"t":{"110":{"position":[[1567,14]]}}}],["rocksky_id",{"_index":1236,"t":{"110":{"position":[[1179,10],[1264,10]]}}}],["rocksky_key",{"_index":1233,"t":{"110":{"position":[[837,11],[1369,11]]}}}],["rocksky_nam",{"_index":1237,"t":{"110":{"position":[[1235,12]]}}}],["rocksky_token",{"_index":1239,"t":{"110":{"position":[[1456,13]]}}}],["rollup",{"_index":3151,"t":{"549":{"position":[[1314,6],[1480,6],[1581,7],[1670,9]]}}}],["rollup/wasm",{"_index":3155,"t":{"549":{"position":[[1534,12]]}}}],["romanian",{"_index":2863,"t":{"457":{"position":[[1889,8]]}}}],["root",{"_index":3078,"t":{"535":{"position":[[279,5]]}}}],["roughli",{"_index":1333,"t":{"118":{"position":[[3348,7]]}}}],["round",{"_index":2915,"t":{"466":{"position":[[535,5]]}}}],["rout",{"_index":2069,"t":{"244":{"position":[[590,5]]},"435":{"position":[[1104,6]]}}}],["router",{"_index":2803,"t":{"435":{"position":[[2328,6]]}}}],["row",{"_index":1567,"t":{"151":{"position":[[644,4]]},"192":{"position":[[709,3]]},"457":{"position":[[2961,4]]}}}],["rule",{"_index":337,"t":{"12":{"position":[[459,5],[591,5]]},"363":{"position":[[1054,5],[1102,5]]},"365":{"position":[[240,6]]},"367":{"position":[[26,5],[147,5],[1387,4]]},"380":{"position":[[5,4],[390,4]]},"384":{"position":[[247,5]]},"395":{"position":[[87,6],[124,5]]},"399":{"position":[[5,4]]},"402":{"position":[[165,4]]},"470":{"position":[[238,4]]},"472":{"position":[[1138,5]]},"494":{"position":[[4,5]]},"503":{"position":[[235,5]]}}}],["run",{"_index":28,"t":{"4":{"position":[[383,4],[1056,10],[1129,3]]},"10":{"position":[[390,7]]},"16":{"position":[[78,3]]},"25":{"position":[[158,4]]},"54":{"position":[[235,8]]},"57":{"position":[[776,3],[849,3]]},"73":{"position":[[35,7],[627,4],[2844,7],[3320,7],[4106,8],[4115,3],[4512,8],[4521,3],[6203,7],[8083,7],[9694,7],[9711,3],[9890,7]]},"79":{"position":[[68,7]]},"97":{"position":[[177,3]]},"112":{"position":[[252,3]]},"216":{"position":[[882,7],[1051,7],[1214,7],[1304,3],[3349,7]]},"232":{"position":[[801,8]]},"251":{"position":[[806,8]]},"259":{"position":[[351,3]]},"293":{"position":[[102,3],[498,7],[715,7],[825,3]]},"303":{"position":[[2506,3],[2688,7],[3076,3],[3485,4],[3817,4],[3891,3],[4541,3]]},"365":{"position":[[147,7],[695,3],[734,4],[1016,3],[1060,3],[1299,3],[1319,3]]},"367":{"position":[[103,4],[1241,3],[1424,3]]},"402":{"position":[[125,3],[176,3]]},"417":{"position":[[83,7],[383,7],[428,3]]},"419":{"position":[[253,7],[407,3]]},"431":{"position":[[0,3],[185,7],[298,7]]},"435":{"position":[[1689,7],[2216,7]]},"437":{"position":[[316,7]]},"439":{"position":[[1034,3]]},"451":{"position":[[476,3],[533,4]]},"476":{"position":[[1119,3],[1242,3],[4425,7]]},"505":{"position":[[133,3],[767,3],[787,3]]},"533":{"position":[[199,3]]},"537":{"position":[[73,3],[106,3]]},"543":{"position":[[1725,7],[2048,3]]},"547":{"position":[[66,3]]},"549":{"position":[[271,3],[295,3],[309,3],[2304,3]]},"553":{"position":[[31,7]]},"567":{"position":[[15,7],[287,8]]},"571":{"position":[[177,4]]},"573":{"position":[[385,3]]},"575":{"position":[[19,4],[241,3]]},"581":{"position":[[290,7]]},"592":{"position":[[67,8]]},"604":{"position":[[78,3]]},"616":{"position":[[306,7],[392,7],[758,7],[785,7]]},"625":{"position":[[311,3]]},"631":{"position":[[494,3]]}}}],["run/debug",{"_index":2715,"t":{"419":{"position":[[88,9]]}}}],["run/start",{"_index":2734,"t":{"425":{"position":[[759,9]]}}}],["run/user/1000",{"_index":1004,"t":{"73":{"position":[[2297,14],[2424,14],[2471,14]]},"77":{"position":[[896,14],[1023,14],[1070,14]]}}}],["run/user/1000/discord",{"_index":1043,"t":{"73":{"position":[[4362,22],[4424,22],[4768,22],[4830,22],[6586,22],[7887,22],[8462,22]]}}}],["run/user/uid/bus:/run/user/uid/bus:ro",{"_index":2193,"t":{"293":{"position":[[1236,38]]}}}],["run:exec",{"_index":3116,"t":{"543":{"position":[[2330,9]]}}}],["runtim",{"_index":3494,"t":{"647":{"position":[[53,7]]}}}],["rust",{"_index":1082,"t":{"73":{"position":[[9061,4]]}}}],["rv:135.0",{"_index":1895,"t":{"198":{"position":[[504,9]]}}}],["rv:139.0",{"_index":2788,"t":{"435":{"position":[[563,9],[774,9]]}}}],["rvowkj1xtivmxglr",{"_index":570,"t":{"27":{"position":[[1274,19]]}}}],["rxbcaiyysxm",{"_index":2866,"t":{"457":{"position":[[1954,13]]}}}],["ryan",{"_index":1301,"t":{"118":{"position":[[1483,4],[1589,4]]}}}],["s",{"_index":1357,"t":{"118":{"position":[[4292,3],[4413,3]]},"402":{"position":[[259,7],[362,8]]},"406":{"position":[[65,16],[128,16]]}}}],["s)et",{"_index":2167,"t":{"283":{"position":[[179,10]]}}}],["s*(?<artist",{"_index":2380,"t":{"327":{"position":[[1782,21]]}}}],["safari",{"_index":1537,"t":{"149":{"position":[[1629,6],[1672,7],[1718,6]]}}}],["safari/firefox",{"_index":1489,"t":{"147":{"position":[[304,17]]}}}],["safe",{"_index":3422,"t":{"610":{"position":[[286,6]]}}}],["safeti",{"_index":2473,"t":{"343":{"position":[[4410,7]]},"604":{"position":[[484,7]]}}}],["salt",{"_index":2742,"t":{"425":{"position":[[1312,4]]}}}],["same",{"_index":82,"t":{"4":{"position":[[1563,4],[2129,4],[2755,4],[3233,4],[6225,4]]},"12":{"position":[[569,4]]},"42":{"position":[[510,4]]},"60":{"position":[[1840,4]]},"64":{"position":[[307,4]]},"66":{"position":[[944,4]]},"73":{"position":[[211,4],[639,4],[1255,4],[1318,4],[3440,4],[3861,4],[5446,4],[5471,4],[5974,4],[6725,4],[6832,4],[6857,4],[7531,4],[8601,4],[8700,4]]},"75":{"position":[[23,4],[86,4]]},"83":{"position":[[216,4]]},"87":{"position":[[1401,4]]},"89":{"position":[[162,4]]},"99":{"position":[[162,4]]},"118":{"position":[[405,4],[432,4],[456,4],[483,4],[507,4],[534,4],[4630,9]]},"120":{"position":[[99,4],[494,4],[578,4],[698,4],[814,4],[832,4]]},"123":{"position":[[248,4]]},"130":{"position":[[252,4]]},"136":{"position":[[1181,4]]},"151":{"position":[[614,4]]},"171":{"position":[[333,4]]},"176":{"position":[[71,4]]},"194":{"position":[[76,4]]},"200":{"position":[[1848,4],[2084,4]]},"206":{"position":[[533,4]]},"212":{"position":[[525,4]]},"222":{"position":[[307,4]]},"224":{"position":[[196,4],[546,4],[750,4],[808,4],[967,4],[1506,4],[1659,4],[1773,4],[2403,4]]},"226":{"position":[[211,4]]},"230":{"position":[[189,4]]},"232":{"position":[[773,4]]},"238":{"position":[[196,4],[537,4],[733,4],[791,4],[952,4],[1487,4],[1640,4],[1758,4],[2389,4]]},"242":{"position":[[146,4]]},"244":{"position":[[140,5]]},"251":{"position":[[778,4]]},"255":{"position":[[201,4]]},"267":{"position":[[316,4]]},"283":{"position":[[280,4]]},"293":{"position":[[562,4],[864,4]]},"303":{"position":[[3139,4],[3520,4],[3729,4]]},"327":{"position":[[921,4]]},"343":{"position":[[1308,4],[2346,4],[3283,4],[3499,5]]},"357":{"position":[[778,4]]},"361":{"position":[[1038,4]]},"363":{"position":[[1071,4]]},"365":{"position":[[645,4]]},"435":{"position":[[1730,4],[1783,4],[1975,4]]},"437":{"position":[[125,4],[331,4]]},"449":{"position":[[176,4]]},"451":{"position":[[192,4]]},"472":{"position":[[510,5]]},"476":{"position":[[2700,4]]},"483":{"position":[[1814,4]]},"513":{"position":[[75,4]]},"553":{"position":[[235,4],[489,4]]},"567":{"position":[[139,4]]},"604":{"position":[[271,4]]},"618":{"position":[[732,4]]},"623":{"position":[[1212,4]]},"627":{"position":[[538,4],[1004,4],[1232,4]]}}}],["sampl",{"_index":3122,"t":{"545":{"position":[[405,6]]}}}],["satisfi",{"_index":2570,"t":{"363":{"position":[[352,9]]},"380":{"position":[[303,9]]},"470":{"position":[[673,9]]}}}],["savag",{"_index":1315,"t":{"118":{"position":[[1711,7],[1768,7]]}}}],["save",{"_index":364,"t":{"14":{"position":[[105,6]]},"140":{"position":[[329,4]]},"249":{"position":[[368,4]]},"303":{"position":[[5195,4]]},"327":{"position":[[437,4]]},"343":{"position":[[2076,5],[2479,4],[4695,5]]},"517":{"position":[[411,4]]},"553":{"position":[[222,5]]},"575":{"position":[[0,4]]}}}],["scagg",{"_index":2691,"t":{"408":{"position":[[81,7]]}}}],["scale",{"_index":502,"t":{"18":{"position":[[3834,5]]}}}],["scan",{"_index":3231,"t":{"575":{"position":[[153,4]]}}}],["scenario",{"_index":251,"t":{"8":{"position":[[745,8]]},"14":{"position":[[317,10]]},"18":{"position":[[502,10]]},"50":{"position":[[270,9]]},"64":{"position":[[755,9]]},"83":{"position":[[614,9]]},"120":{"position":[[859,8],[1064,8]]},"123":{"position":[[8,8]]},"125":{"position":[[8,9]]},"130":{"position":[[19,8]]},"134":{"position":[[160,8]]},"136":{"position":[[599,9]]},"171":{"position":[[422,9]]},"224":{"position":[[0,8],[31,9],[2178,8],[3040,8],[3120,9]]},"230":{"position":[[470,8],[580,8]]},"238":{"position":[[0,8],[31,9],[2159,8],[2992,8],[3074,9]]},"240":{"position":[[8,9]]},"244":{"position":[[238,8],[348,8]]},"293":{"position":[[892,8]]},"303":{"position":[[3205,8]]},"351":{"position":[[725,8]]},"365":{"position":[[864,9]]},"391":{"position":[[7,8]]},"393":{"position":[[223,10]]},"412":{"position":[[397,10]]},"447":{"position":[[246,8]]},"483":{"position":[[1409,8]]},"545":{"position":[[84,9]]},"569":{"position":[[300,9]]},"599":{"position":[[15,9]]}}}],["scene",{"_index":1511,"t":{"149":{"position":[[814,7]]}}}],["schema",{"_index":158,"t":{"4":{"position":[[4343,6]]},"27":{"position":[[669,6],[1024,6],[1424,6]]}}}],["schulz",{"_index":1309,"t":{"118":{"position":[[1564,7],[1659,6]]}}}],["schvitz",{"_index":2865,"t":{"457":{"position":[[1916,7]]}}}],["scopes/permissions/gr",{"_index":2474,"t":{"343":{"position":[[4442,25]]}}}],["score",{"_index":652,"t":{"38":{"position":[[267,6],[547,7]]},"118":{"position":[[1090,5],[3334,5],[3401,5],[3673,6],[3687,5],[3763,7],[4163,5],[4699,5],[4754,7],[4949,8]]},"459":{"position":[[89,5]]},"472":{"position":[[820,7]]},"476":{"position":[[6634,5]]},"479":{"position":[[54,5],[120,5],[160,5],[219,8],[247,5]]},"483":{"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]]},"488":{"position":[[147,6]]},"492":{"position":[[260,6]]}}}],["scrape",{"_index":2826,"t":{"441":{"position":[[609,8]]},"457":{"position":[[170,7],[517,11]]}}}],["scrape_config",{"_index":622,"t":{"31":{"position":[[604,15]]}}}],["scrape_configssect",{"_index":621,"t":{"31":{"position":[[571,21]]}}}],["scrape_interv",{"_index":625,"t":{"31":{"position":[[682,16]]}}}],["screen",{"_index":774,"t":{"46":{"position":[[1540,6],[2936,6]]},"66":{"position":[[2045,6],[3451,6]]},"85":{"position":[[1804,6],[3168,6]]},"91":{"position":[[1709,6],[3168,6]]},"95":{"position":[[1482,6],[2849,6]]},"103":{"position":[[1811,6],[3230,6]]},"110":{"position":[[2736,6],[4165,6]]},"114":{"position":[[1624,6],[3067,6]]},"143":{"position":[[2095,6],[3462,6]]},"153":{"position":[[1867,6],[3552,6]]},"186":{"position":[[1626,6],[3046,6]]},"188":{"position":[[4755,6],[6573,6]]},"198":{"position":[[1635,6],[3062,6]]},"202":{"position":[[1475,6],[2795,6]]},"208":{"position":[[1644,6],[2988,6]]},"214":{"position":[[1600,6],[2957,6]]},"218":{"position":[[1980,6],[3348,6]]},"220":{"position":[[2197,6],[3593,6]]},"234":{"position":[[1743,6],[3057,6]]},"249":{"position":[[178,7]]},"253":{"position":[[1812,6],[3134,6]]},"257":{"position":[[2133,6],[3552,6]]},"261":{"position":[[1947,6],[3390,6]]},"265":{"position":[[1780,6],[3147,6]]},"269":{"position":[[2021,6],[3480,6]]},"277":{"position":[[1839,6],[3200,6]]},"281":{"position":[[1560,6],[2915,6]]},"285":{"position":[[1605,6],[2970,6]]},"291":{"position":[[2031,6],[3460,6]]},"295":{"position":[[1602,6],[2934,6]]},"301":{"position":[[2073,6],[3487,6]]},"305":{"position":[[1626,6],[3088,6]]},"317":{"position":[[1609,6],[3063,6]]},"325":{"position":[[3266,6],[4691,6]]},"329":{"position":[[1479,6],[2785,6]]},"333":{"position":[[1486,6],[2806,6]]},"341":{"position":[[1569,6],[2922,6]]},"343":{"position":[[1907,6],[4347,6]]},"345":{"position":[[1721,6],[3189,6]]},"349":{"position":[[1583,6],[2946,6]]}}}],["screenshot",{"_index":2168,"t":{"283":{"position":[[314,10]]}}}],["script",{"_index":3067,"t":{"533":{"position":[[19,6]]}}}],["scrobbabl",{"_index":1637,"t":{"160":{"position":[[622,11]]},"166":{"position":[[1148,10],[1530,10],[1596,10]]}}}],["scrobbel",{"_index":3041,"t":{"513":{"position":[[6,10]]}}}],["scrobber",{"_index":1229,"t":{"110":{"position":[[477,8]]}}}],["scrobbl",{"_index":40,"t":{"4":{"position":[[595,10],[661,8],[1694,8]]},"6":{"position":[[108,8],[166,8]]},"12":{"position":[[287,8],[489,8],[705,10],[795,8]]},"18":{"position":[[193,8],[260,8],[3676,8],[3862,9],[3919,9],[4045,9]]},"27":{"position":[[154,8],[170,8]]},"31":{"position":[[192,9]]},"33":{"position":[[99,12]]},"38":{"position":[[17,9],[58,9],[126,10],[172,9],[283,9],[588,8],[662,9],[690,8]]},"40":{"position":[[41,8],[81,8],[220,8],[286,9],[345,8]]},"42":{"position":[[81,8],[549,8],[747,8]]},"44":{"position":[[29,8],[1025,8]]},"46":{"position":[[397,8],[452,8]]},"64":{"position":[[2915,8],[3050,8],[3214,8]]},"83":{"position":[[2740,8],[2875,8],[3039,8]]},"87":{"position":[[30,8],[119,9],[233,9],[267,9],[493,9],[590,9],[651,9],[930,8],[1018,9]]},"97":{"position":[[30,8]]},"105":{"position":[[29,8],[1074,11],[1302,8],[1513,9],[1637,10],[1696,8],[1767,9],[1919,8],[1992,8],[2065,8],[2101,8],[2178,9],[2224,8],[2250,8]]},"112":{"position":[[30,8],[117,9]]},"114":{"position":[[442,8],[494,8]]},"116":{"position":[[94,10],[150,10]]},"118":{"position":[[82,9],[160,8],[1995,8],[2062,8],[2180,9],[2295,9],[2333,9],[2854,8],[3058,8],[3140,8],[3436,8],[3866,8],[3987,8],[4045,9],[4102,9],[4304,9],[4826,10],[5143,9]]},"120":{"position":[[158,9],[626,9],[801,9],[916,9],[1078,9]]},"123":{"position":[[98,10],[197,9],[281,9],[342,9],[390,10],[413,8],[471,8],[507,8]]},"125":{"position":[[85,9],[131,9],[217,8],[255,8],[291,8],[475,10],[597,8]]},"130":{"position":[[59,8],[157,9],[441,9]]},"132":{"position":[[44,8],[81,8],[168,8],[203,9],[268,8],[349,8],[432,9]]},"134":{"position":[[99,8],[325,9]]},"136":{"position":[[39,8],[124,8],[247,9],[382,8],[613,8],[820,8],[1004,9],[1122,9],[1147,8],[1310,8]]},"138":{"position":[[29,8],[147,9],[1072,11],[1296,8],[1507,9],[1764,8],[1972,9],[2074,9]]},"145":{"position":[[93,9]]},"151":{"position":[[378,8],[1277,9],[1618,9],[2054,8],[2542,8]]},"157":{"position":[[16,8],[47,8]]},"160":{"position":[[314,10],[961,9],[1002,8],[1085,11],[1138,8],[1192,9],[1284,9]]},"164":{"position":[[37,8],[170,8],[387,8]]},"166":{"position":[[361,10],[521,11],[885,10],[1000,8],[1035,8],[1342,8]]},"168":{"position":[[567,10],[750,8],[798,8]]},"174":{"position":[[90,8],[138,8],[246,8],[304,8],[367,8]]},"176":{"position":[[240,8],[317,8],[433,8]]},"178":{"position":[[163,9],[248,8],[311,8],[419,8],[512,8],[541,8]]},"180":{"position":[[0,10],[153,8],[197,9]]},"188":{"position":[[573,8],[708,8],[765,8],[1044,8],[1119,9],[2506,9],[2751,8],[2820,8],[2879,8],[2964,8],[3088,8],[3212,8],[3323,8],[3652,9]]},"194":{"position":[[635,10]]},"200":{"position":[[61,11],[684,10],[718,9],[1364,10],[1472,8],[1568,8]]},"216":{"position":[[125,8],[706,11],[1573,10]]},"218":{"position":[[427,8],[549,8],[669,8],[787,8]]},"220":{"position":[[39,8],[68,9],[133,8],[794,8],[856,8]]},"222":{"position":[[46,9],[127,8],[192,8],[540,10],[673,8]]},"224":{"position":[[87,12],[387,8],[641,8],[733,8],[781,9],[1071,8],[1166,8],[1196,8],[1838,8],[1933,8],[1963,8],[2972,8]]},"230":{"position":[[154,9]]},"232":{"position":[[476,8],[1059,8]]},"234":{"position":[[460,9]]},"236":{"position":[[46,9],[147,9],[265,9],[355,8],[430,8]]},"238":{"position":[[87,12],[373,8],[626,8],[716,8],[764,9],[1050,8],[1143,8],[1173,8],[1823,8],[1916,8],[1946,8],[2924,8]]},"240":{"position":[[103,8],[205,8],[266,9],[378,11]]},"244":{"position":[[91,9],[670,9]]},"249":{"position":[[412,8]]},"251":{"position":[[476,8],[1070,8]]},"253":{"position":[[453,9]]},"255":{"position":[[35,8],[59,9],[119,8]]},"259":{"position":[[46,8],[75,9],[140,8],[216,9]]},"261":{"position":[[484,8],[543,8]]},"263":{"position":[[14,8]]},"267":{"position":[[34,8],[58,9],[118,8],[184,9]]},"271":{"position":[[165,8]]},"273":{"position":[[38,10],[419,10]]},"275":{"position":[[264,8],[422,9],[534,8]]},"277":{"position":[[440,8],[550,8],[746,11]]},"287":{"position":[[14,8],[179,9],[213,9],[293,9]]},"289":{"position":[[108,8]]},"293":{"position":[[267,8]]},"295":{"position":[[339,8],[447,8]]},"297":{"position":[[102,10],[212,10],[358,8],[453,10],[1098,8]]},"301":{"position":[[536,8],[642,8],[745,8],[888,8]]},"303":{"position":[[366,8]]},"307":{"position":[[156,8],[410,8],[676,9],[818,9],[948,9],[1028,9],[1323,9],[1406,8]]},"311":{"position":[[195,9],[324,9]]},"313":{"position":[[370,10],[507,8],[715,10]]},"315":{"position":[[800,9]]},"319":{"position":[[14,8],[126,9],[258,9],[292,9],[372,9]]},"321":{"position":[[108,8]]},"325":{"position":[[81,9],[575,9],[795,9],[1004,9],[1213,9]]},"331":{"position":[[78,10],[219,8],[263,9]]},"339":{"position":[[29,9],[46,9]]},"341":{"position":[[323,10],[403,10]]},"343":{"position":[[216,8],[345,10]]},"351":{"position":[[55,8],[302,8],[708,9],[884,11]]},"353":{"position":[[38,8],[457,9],[482,8],[635,9],[746,9],[783,8],[817,8]]},"355":{"position":[[211,8]]},"357":{"position":[[221,8],[397,9],[445,10],[508,9],[530,9],[978,8]]},"376":{"position":[[710,8]]},"378":{"position":[[1135,8]]},"384":{"position":[[964,8]]},"427":{"position":[[112,11]]},"447":{"position":[[39,8],[365,8],[463,10]]},"449":{"position":[[243,9]]},"457":{"position":[[99,9],[361,9],[709,9],[895,9],[1215,8],[1250,8],[3103,9],[3164,9]]},"459":{"position":[[524,9]]},"470":{"position":[[795,8]]},"472":{"position":[[900,8],[2004,8]]},"474":{"position":[[281,8]]},"476":{"position":[[63,8],[1849,8],[2098,8],[2438,9],[2776,8],[3309,8],[3637,8],[4331,8],[5984,8]]},"483":{"position":[[1161,9],[1287,9],[1422,8],[2238,8]]},"490":{"position":[[33,8],[244,8],[430,8],[554,8],[1303,8],[1417,9],[1495,10],[1661,10],[1725,8],[1820,8]]},"496":{"position":[[107,8],[238,8]]},"503":{"position":[[24,8],[122,8],[161,8],[788,8]]},"507":{"position":[[168,8]]},"509":{"position":[[76,8]]},"517":{"position":[[183,9]]},"553":{"position":[[398,10]]},"557":{"position":[[1387,10],[1498,10],[1571,10],[1640,8],[2465,10],[2883,10],[3149,10],[3195,10],[3287,8]]},"559":{"position":[[155,9]]},"565":{"position":[[32,10],[64,8]]},"567":{"position":[[343,8]]},"569":{"position":[[463,8],[574,9]]},"581":{"position":[[938,8]]},"594":{"position":[[355,10],[914,9],[1486,9],[2732,9],[2954,9]]},"597":{"position":[[27,8]]},"599":{"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]]},"625":{"position":[[73,8],[145,9],[373,10],[503,9],[677,9],[798,8],[873,10],[931,9],[1470,9]]},"627":{"position":[[299,8],[325,8]]},"631":{"position":[[459,9],[505,8]]},"633":{"position":[[81,9],[561,10],[685,8],[897,8],[964,11],[1124,9],[1495,9],[1868,8],[2123,8],[2213,10],[2238,8],[2408,9],[2458,9],[2523,8],[2669,9],[2753,8]]},"635":{"position":[[202,10]]},"637":{"position":[[412,8],[452,9]]},"639":{"position":[[99,12]]}}}],["scrobblabl",{"_index":1107,"t":{"87":{"position":[[813,11]]},"353":{"position":[[162,12]]}}}],["scrobble'",{"_index":660,"t":{"38":{"position":[[419,10]]},"459":{"position":[[252,10]]},"474":{"position":[[160,10]]}}}],["scrobble.cach",{"_index":3461,"t":{"625":{"position":[[573,15]]}}}],["scrobble/play",{"_index":2555,"t":{"357":{"position":[[593,13]]}}}],["scrobblecli",{"_index":3406,"t":{"599":{"position":[[3309,15]]}}}],["scrobbler",{"_index":55,"t":{"4":{"position":[[810,10],[841,9]]},"8":{"position":[[44,9],[275,9],[925,9],[1377,9],[1820,10],[1925,10]]},"12":{"position":[[6,9],[1457,10]]},"14":{"position":[[345,9],[462,9],[517,9],[608,10],[752,10],[942,9],[1071,10]]},"16":{"position":[[6,9],[133,9]]},"18":{"position":[[1745,10],[2131,9],[3548,9],[3759,9],[3950,9],[4146,9]]},"27":{"position":[[699,9],[1052,9],[1455,9]]},"31":{"position":[[672,9]]},"40":{"position":[[9,9]]},"42":{"position":[[6,9],[229,9]]},"44":{"position":[[597,9],[827,9]]},"48":{"position":[[5,9],[133,10]]},"54":{"position":[[5,9],[133,10],[354,9],[962,9],[989,9],[1190,10],[1241,9]]},"57":{"position":[[277,9]]},"62":{"position":[[411,9]]},"64":{"position":[[6,9],[261,9],[3824,9]]},"68":{"position":[[5,9],[133,10]]},"71":{"position":[[264,9]]},"73":{"position":[[120,9],[659,9],[1370,9],[1766,9],[1841,10],[5260,10],[5355,10]]},"77":{"position":[[365,9],[440,10]]},"83":{"position":[[6,9],[170,9],[3616,9]]},"87":{"position":[[167,9],[473,9],[890,9]]},"89":{"position":[[70,9],[217,9],[273,9]]},"99":{"position":[[70,9],[217,9],[273,9]]},"105":{"position":[[1024,9],[1064,9]]},"110":{"position":[[27,9],[359,9],[1041,10]]},"112":{"position":[[165,9]]},"118":{"position":[[6,9],[1170,9],[2761,9],[3491,10],[4774,9],[5264,9]]},"120":{"position":[[314,9],[459,9]]},"123":{"position":[[130,10],[223,9],[332,9],[433,10]]},"132":{"position":[[9,10]]},"136":{"position":[[681,9],[709,10],[877,9],[1429,9]]},"138":{"position":[[1022,9],[1062,9],[2059,10]]},"140":{"position":[[11,9]]},"143":{"position":[[39,9],[505,9]]},"145":{"position":[[192,9]]},"147":{"position":[[547,9]]},"149":{"position":[[31,9]]},"151":{"position":[[105,9],[925,9],[1101,10],[2100,9]]},"160":{"position":[[33,9],[395,10],[448,9],[895,9],[1234,9]]},"164":{"position":[[515,9]]},"166":{"position":[[315,9],[754,9]]},"168":{"position":[[145,9],[252,9]]},"171":{"position":[[60,9],[227,9]]},"174":{"position":[[31,10],[514,10],[545,9],[577,9]]},"178":{"position":[[647,10],[678,9],[710,9]]},"180":{"position":[[187,9]]},"182":{"position":[[1218,9]]},"184":{"position":[[49,9],[983,9]]},"188":{"position":[[67,9],[275,9],[553,9],[745,9],[1024,9]]},"192":{"position":[[84,9]]},"196":{"position":[[6,9],[119,9],[845,9]]},"200":{"position":[[293,9],[501,9],[1432,9],[2179,9]]},"204":{"position":[[19,9]]},"206":{"position":[[260,9],[697,9]]},"210":{"position":[[19,9]]},"212":{"position":[[256,9],[689,9]]},"216":{"position":[[88,9],[896,9],[1421,9]]},"220":{"position":[[1876,9]]},"222":{"position":[[26,9]]},"224":{"position":[[109,9],[405,10],[659,10],[1089,10],[1856,10],[2990,10]]},"226":{"position":[[62,9],[115,9]]},"228":{"position":[[252,9]]},"232":{"position":[[628,9]]},"236":{"position":[[26,9],[244,9]]},"238":{"position":[[109,9],[391,10],[644,10],[1068,10],[1841,10],[2942,10]]},"240":{"position":[[121,10],[231,9]]},"249":{"position":[[124,9],[154,9]]},"251":{"position":[[633,9]]},"257":{"position":[[1806,9]]},"259":{"position":[[264,9]]},"261":{"position":[[1605,9]]},"265":{"position":[[1456,9]]},"267":{"position":[[232,9]]},"269":{"position":[[1697,9]]},"271":{"position":[[151,9],[613,9],[998,9]]},"273":{"position":[[168,9],[404,9]]},"275":{"position":[[152,9],[243,9],[511,9]]},"279":{"position":[[201,9]]},"291":{"position":[[1704,9]]},"293":{"position":[[224,9],[411,9],[485,9],[702,9],[837,9]]},"297":{"position":[[6,9],[637,9],[1689,9],[1812,9]]},"301":{"position":[[82,9]]},"303":{"position":[[491,10],[2179,9],[2489,10],[2702,9],[2857,9],[2960,9],[3086,10],[3295,9],[3467,9],[3683,9],[3989,9],[4093,9],[4368,9],[4634,9],[5159,9],[5403,10]]},"307":{"position":[[127,9],[1386,9]]},"311":{"position":[[156,9],[459,9]]},"315":{"position":[[6,9],[635,9]]},"325":{"position":[[2942,9]]},"327":{"position":[[1084,9],[1209,9],[2052,9],[2154,9]]},"331":{"position":[[253,9],[335,9]]},"335":{"position":[[566,9]]},"343":{"position":[[4951,9]]},"347":{"position":[[258,10],[289,9],[321,9],[1427,9]]},"351":{"position":[[6,9],[902,9]]},"353":{"position":[[56,10]]},"357":{"position":[[817,9]]},"380":{"position":[[421,9]]},"382":{"position":[[86,9]]},"384":{"position":[[622,10],[653,9],[685,9]]},"395":{"position":[[443,9]]},"415":{"position":[[6,9]]},"417":{"position":[[322,9]]},"435":{"position":[[55,9],[154,10],[185,9],[218,9],[1222,9],[1277,9],[1476,9],[1751,10],[1864,9],[2047,10],[2203,9]]},"437":{"position":[[172,9],[299,9]]},"441":{"position":[[27,9],[933,9],[1222,9]]},"447":{"position":[[6,9]]},"449":{"position":[[156,9]]},"451":{"position":[[283,10]]},"457":{"position":[[46,9],[295,9],[420,9],[558,9]]},"459":{"position":[[121,9],[1544,9]]},"466":{"position":[[520,9],[664,9]]},"472":{"position":[[1519,10],[1550,9],[1582,9]]},"476":{"position":[[930,9],[1755,9],[1914,9],[2158,9],[3187,9],[3395,9],[3694,9]]},"496":{"position":[[46,9]]},"520":{"position":[[95,10]]},"522":{"position":[[35,10]]},"524":{"position":[[128,9]]},"535":{"position":[[682,9],[825,9],[881,9],[926,9]]},"543":{"position":[[282,10],[560,10],[981,10],[1380,10],[1549,10],[2258,10],[2289,9],[2564,10],[2595,9]]},"545":{"position":[[487,10],[518,9],[550,9]]},"547":{"position":[[53,9]]},"549":{"position":[[197,9],[1013,9],[1042,9],[1081,9],[1115,9],[1163,9],[1217,9]]},"553":{"position":[[50,9],[287,9],[388,9],[459,9]]},"555":{"position":[[30,9],[151,10],[182,9],[214,9]]},"557":{"position":[[45,9],[1142,10],[1268,9],[1658,9],[1785,9],[2033,9],[2978,9],[3307,9],[3920,10],[4055,9]]},"559":{"position":[[6,9]]},"565":{"position":[[49,9],[685,9],[989,9],[1633,9],[2356,9]]},"567":{"position":[[34,9],[270,9]]},"569":{"position":[[243,9]]},"573":{"position":[[36,9],[266,9]]},"575":{"position":[[196,9]]},"577":{"position":[[57,9]]},"594":{"position":[[3084,10]]},"602":{"position":[[22,9]]},"604":{"position":[[6,9]]},"608":{"position":[[427,10]]},"610":{"position":[[6,9]]},"616":{"position":[[29,9],[135,9]]},"623":{"position":[[149,10],[970,9]]},"631":{"position":[[256,10]]},"633":{"position":[[1440,9],[1761,10],[1810,9],[2575,9]]}}}],["scrobbler'",{"_index":1258,"t":{"116":{"position":[[6,11]]},"118":{"position":[[4893,11]]},"293":{"position":[[1708,11]]},"303":{"position":[[3397,11]]},"347":{"position":[[1223,12]]},"351":{"position":[[189,11]]},"378":{"position":[[162,11]]},"567":{"position":[[612,11]]}}}],["scrobbler.app",{"_index":544,"t":{"25":{"position":[[131,13]]},"303":{"position":[[2547,13]]}}}],["scrobbler.app/callback",{"_index":2286,"t":{"303":{"position":[[5102,22]]}}}],["scrobbler.git",{"_index":2712,"t":{"417":{"position":[[297,13]]},"549":{"position":[[174,13]]},"612":{"position":[[289,13]]}}}],["scrobbler.mydomain.com/callback",{"_index":3172,"t":{"557":{"position":[[1059,31]]}}}],["scrobbler.servic",{"_index":3221,"t":{"573":{"position":[[137,17],[222,18]]},"575":{"position":[[78,17],[125,17]]}}}],["scrobbler/directori",{"_index":3226,"t":{"573":{"position":[[351,19]]}}}],["scrobbler/discord",{"_index":1025,"t":{"73":{"position":[[2822,17]]},"79":{"position":[[46,17]]}}}],["scrobbler:latest",{"_index":991,"t":{"73":{"position":[[1872,16]]},"77":{"position":[[471,16]]},"541":{"position":[[162,16],[216,16]]}}}],["scrobbler\\config",{"_index":3148,"t":{"549":{"position":[[1253,16]]}}}],["scrobbler\\data",{"_index":3150,"t":{"549":{"position":[[1299,14]]}}}],["scrobblesourc",{"_index":3292,"t":{"588":{"position":[[396,15]]}}}],["scrobblesources.t",{"_index":3288,"t":{"588":{"position":[[198,18]]}}}],["scrobblethreshold",{"_index":172,"t":{"4":{"position":[[4659,21]]},"166":{"position":[[1487,21]]}}}],["scroll",{"_index":1533,"t":{"149":{"position":[[1490,6]]}}}],["search",{"_index":282,"t":{"8":{"position":[[1844,6]]},"57":{"position":[[1053,6]]},"178":{"position":[[943,8]]},"359":{"position":[[190,6]]},"393":{"position":[[20,6]]},"395":{"position":[[38,6]]},"397":{"position":[[2,6],[453,9],[659,9]]},"399":{"position":[[30,6],[328,9]]},"402":{"position":[[54,6],[135,6],[249,9]]},"408":{"position":[[41,9]]},"410":{"position":[[39,9]]},"412":{"position":[[82,6],[697,9]]},"472":{"position":[[606,9],[764,6],[1641,8]]},"474":{"position":[[239,9]]},"476":{"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]]},"479":{"position":[[97,6]]},"488":{"position":[[1039,6],[1077,6]]},"490":{"position":[[92,6],[981,6],[1365,8],[1927,6]]},"505":{"position":[[61,6]]},"507":{"position":[[120,8],[220,8],[373,6],[844,8],[890,8],[1128,6]]},"522":{"position":[[46,6]]},"559":{"position":[[669,8]]},"561":{"position":[[402,8]]},"633":{"position":[[704,6]]}}}],["searchartistmethod",{"_index":1761,"t":{"178":{"position":[[2229,21],[3428,21]]},"476":{"position":[[3855,19],[4010,21],[4055,18],[5092,21],[5881,21]]},"488":{"position":[[1136,21]]},"501":{"position":[[405,21]]},"505":{"position":[[502,21]]},"507":{"position":[[790,21]]},"509":{"position":[[801,21],[1380,21]]}}}],["searchord",{"_index":1747,"t":{"178":{"position":[[991,11],[2261,14],[3460,14]]},"311":{"position":[[1121,14],[1607,14]]},"470":{"position":[[1173,14]]},"472":{"position":[[487,11],[548,12],[571,11],[724,11],[785,11],[1689,11]]},"476":{"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]]},"488":{"position":[[1092,14]]},"501":{"position":[[436,14]]},"505":{"position":[[534,14]]},"507":{"position":[[899,14],[1135,14]]},"509":{"position":[[833,14],[1412,14]]}}}],["searchwhenmiss",{"_index":2937,"t":{"476":{"position":[[342,17]]}}}],["searchwithmiss",{"_index":2939,"t":{"476":{"position":[[632,20]]}}}],["second",{"_index":473,"t":{"18":{"position":[[2341,7],[4316,7]]},"118":{"position":[[2414,7],[2565,7],[2632,7],[2696,8],[3033,7]]},"151":{"position":[[323,7],[498,9]]},"166":{"position":[[1563,7]]},"590":{"position":[[843,7]]},"592":{"position":[[1416,6]]},"594":{"position":[[2141,7]]}}}],["secondari",{"_index":328,"t":{"12":{"position":[[193,9],[1189,9],[1403,9]]},"14":{"position":[[8,9],[412,9]]},"62":{"position":[[69,9]]},"372":{"position":[[312,9]]},"481":{"position":[[836,9]]},"543":{"position":[[2405,9]]},"569":{"position":[[97,9]]}}}],["secondgotifyserv",{"_index":560,"t":{"27":{"position":[[530,21]]}}}],["secret",{"_index":248,"t":{"8":{"position":[[614,9],[1069,9],[1623,8]]},"87":{"position":[[1491,6]]},"91":{"position":[[404,6],[2018,9],[3490,9]]},"97":{"position":[[257,6]]},"103":{"position":[[349,6],[408,6],[2100,9],[3531,9]]},"151":{"position":[[3001,9]]},"174":{"position":[[2228,9],[3249,9]]},"176":{"position":[[1244,9],[1430,9],[2507,9],[2711,9]]},"178":{"position":[[2902,9],[4105,9]]},"257":{"position":[[384,6],[450,6],[2422,9],[3853,9]]},"269":{"position":[[446,6],[2330,9],[3802,9]]},"303":{"position":[[5303,7]]},"305":{"position":[[404,6]]},"343":{"position":[[2509,7],[2929,7]]},"345":{"position":[[524,6]]},"437":{"position":[[24,7]]},"557":{"position":[[3559,6]]},"559":{"position":[[1881,9]]},"563":{"position":[[1019,9]]}}}],["section",{"_index":102,"t":{"4":{"position":[[2178,7],[6196,7]]},"6":{"position":[[270,7]]},"57":{"position":[[520,7]]},"73":{"position":[[3699,8]]},"87":{"position":[[1452,8]]},"101":{"position":[[144,7]]},"110":{"position":[[672,7],[875,7]]},"118":{"position":[[5304,8]]},"149":{"position":[[1525,8],[2234,7]]},"196":{"position":[[613,8],[690,7]]},"206":{"position":[[464,7]]},"212":{"position":[[469,7]]},"224":{"position":[[3160,7]]},"238":{"position":[[3114,7]]},"293":{"position":[[666,7]]},"303":{"position":[[5377,7]]},"311":{"position":[[501,7]]},"327":{"position":[[270,7]]},"343":{"position":[[3187,7],[3764,7]]},"374":{"position":[[13,8]]},"384":{"position":[[382,8]]},"453":{"position":[[305,7],[422,7]]},"468":{"position":[[57,7]]},"472":{"position":[[1273,8]]},"474":{"position":[[34,7],[137,8]]},"530":{"position":[[57,7]]},"557":{"position":[[252,7],[873,7],[1870,7],[2696,7],[3374,7],[3622,7]]},"559":{"position":[[468,7],[1049,7],[1192,7],[1334,7],[1472,7],[1666,7],[1729,7]]},"561":{"position":[[201,7]]},"563":{"position":[[187,7],[330,7],[472,7],[610,7],[804,7],[867,7]]},"565":{"position":[[933,7],[1577,7],[2300,7]]},"597":{"position":[[957,7]]},"599":{"position":[[1885,7]]},"602":{"position":[[429,7]]},"625":{"position":[[115,8]]},"627":{"position":[[290,8]]}}}],["secur",{"_index":530,"t":{"22":{"position":[[65,8]]},"50":{"position":[[461,7]]},"73":{"position":[[5560,7],[6946,7],[9205,7]]},"140":{"position":[[273,8]]},"293":{"position":[[808,6]]}}}],["see",{"_index":75,"t":{"4":{"position":[[1299,3],[1371,3],[3475,3],[3559,3]]},"6":{"position":[[0,3]]},"38":{"position":[[93,3],[672,3]]},"44":{"position":[[934,3]]},"73":{"position":[[4394,3],[4800,3]]},"118":{"position":[[5290,3]]},"136":{"position":[[1106,3],[1135,4]]},"140":{"position":[[78,3]]},"160":{"position":[[1302,4]]},"168":{"position":[[101,3]]},"194":{"position":[[646,3]]},"216":{"position":[[1647,4]]},"220":{"position":[[185,3]]},"232":{"position":[[327,3],[407,3],[810,3],[946,3]]},"251":{"position":[[327,3],[407,3],[815,3],[951,3]]},"263":{"position":[[68,3]]},"273":{"position":[[201,3]]},"291":{"position":[[0,3]]},"293":{"position":[[639,3]]},"297":{"position":[[847,3]]},"309":{"position":[[343,3]]},"323":{"position":[[0,3]]},"343":{"position":[[356,3],[403,3]]},"357":{"position":[[137,3],[375,3]]},"363":{"position":[[792,3]]},"374":{"position":[[0,3]]},"425":{"position":[[3255,3]]},"435":{"position":[[1136,3],[2439,3]]},"441":{"position":[[7,3]]},"444":{"position":[[7,3]]},"455":{"position":[[80,3]]},"476":{"position":[[1359,3]]},"488":{"position":[[108,3]]},"496":{"position":[[425,3]]},"520":{"position":[[17,3]]},"522":{"position":[[88,3]]},"539":{"position":[[70,3]]},"545":{"position":[[4,3],[382,3]]},"547":{"position":[[19,3]]},"549":{"position":[[1715,3]]},"551":{"position":[[115,3]]},"557":{"position":[[3333,3]]},"567":{"position":[[70,3],[410,3]]},"569":{"position":[[0,3],[310,3]]},"594":{"position":[[2867,3]]},"599":{"position":[[1466,3],[1872,3],[2352,3]]},"625":{"position":[[730,3]]},"633":{"position":[[1651,3]]},"641":{"position":[[0,3]]},"643":{"position":[[0,3]]},"645":{"position":[[0,3]]}}}],["seem",{"_index":2452,"t":{"343":{"position":[[1393,4]]}}}],["seen",{"_index":2219,"t":{"297":{"position":[[1774,4]]},"353":{"position":[[279,5],[409,4],[660,5],[833,4]]},"357":{"position":[[503,4]]},"457":{"position":[[1765,4]]},"594":{"position":[[2900,4]]},"599":{"position":[[480,4],[738,5],[778,5],[2072,4],[2925,4]]}}}],["select",{"_index":787,"t":{"46":{"position":[[2106,6]]},"66":{"position":[[2615,6]]},"85":{"position":[[2332,6]]},"91":{"position":[[2335,6]]},"95":{"position":[[2016,6]]},"103":{"position":[[2394,6]]},"110":{"position":[[3329,6]]},"114":{"position":[[2216,6]]},"143":{"position":[[2629,6]]},"147":{"position":[[361,6]]},"153":{"position":[[2707,6]]},"186":{"position":[[2204,6]]},"188":{"position":[[5734,6]]},"192":{"position":[[682,6]]},"198":{"position":[[2229,6]]},"202":{"position":[[1959,6]]},"208":{"position":[[2155,6]]},"214":{"position":[[2130,6]]},"218":{"position":[[2503,6]]},"220":{"position":[[2763,6]]},"234":{"position":[[2209,6]]},"253":{"position":[[2289,6]]},"257":{"position":[[2716,6]]},"261":{"position":[[2539,6]]},"265":{"position":[[2314,6]]},"269":{"position":[[2647,6]]},"277":{"position":[[2367,6]]},"281":{"position":[[2091,6]]},"285":{"position":[[2128,6]]},"291":{"position":[[2624,6]]},"295":{"position":[[2104,6]]},"301":{"position":[[2657,6]]},"305":{"position":[[2252,6]]},"317":{"position":[[2224,6]]},"325":{"position":[[3858,6]]},"327":{"position":[[203,6],[334,6]]},"329":{"position":[[1961,6]]},"333":{"position":[[1964,6]]},"341":{"position":[[2071,6]]},"343":{"position":[[4431,6],[4486,6],[4526,6]]},"345":{"position":[[2353,6]]},"349":{"position":[[2107,6]]},"472":{"position":[[68,9]]},"474":{"position":[[329,6]]},"481":{"position":[[210,8]]},"494":{"position":[[42,12]]},"559":{"position":[[682,7]]},"561":{"position":[[415,7]]}}}],["self",{"_index":962,"t":{"73":{"position":[[307,4]]},"105":{"position":[[766,4]]},"138":{"position":[[764,4]]},"303":{"position":[[4674,4]]},"359":{"position":[[57,4]]},"581":{"position":[[38,4]]},"633":{"position":[[2828,4]]}}}],["semver",{"_index":3418,"t":{"610":{"position":[[32,6]]},"614":{"position":[[334,6]]}}}],["send",{"_index":416,"t":{"18":{"position":[[252,5],[578,4]]},"105":{"position":[[1709,4]]},"160":{"position":[[376,4]]},"166":{"position":[[293,7],[506,5]]},"351":{"position":[[289,7]]},"357":{"position":[[210,7]]},"441":{"position":[[91,4]]},"490":{"position":[[1691,7]]},"581":{"position":[[901,5],[1052,4]]},"635":{"position":[[193,5]]}}}],["sensibl",{"_index":1745,"t":{"178":{"position":[[957,8],[1831,8],[3030,8]]},"472":{"position":[[909,8],[932,8],[1655,8]]},"474":{"position":[[75,8]]},"501":{"position":[[26,8]]},"503":{"position":[[483,8]]},"505":{"position":[[34,8]]},"507":{"position":[[322,9],[603,9]]},"509":{"position":[[648,8],[1227,8]]}}}],["sensit",{"_index":232,"t":{"8":{"position":[[155,9]]},"57":{"position":[[599,9]]}}}],["sent",{"_index":498,"t":{"18":{"position":[[3705,4]]},"87":{"position":[[676,4],[1038,4]]},"136":{"position":[[235,4]]},"303":{"position":[[4758,4],[4829,4]]},"349":{"position":[[458,4]]},"494":{"position":[[173,4]]},"599":{"position":[[3006,4]]}}}],["separ",{"_index":945,"t":{"66":{"position":[[499,9],[751,9]]},"85":{"position":[[342,9],[526,9]]},"105":{"position":[[746,10]]},"118":{"position":[[1922,9]]},"138":{"position":[[744,10]]},"222":{"position":[[405,10]]},"303":{"position":[[1514,8]]},"313":{"position":[[220,9]]},"457":{"position":[[1041,9]]},"474":{"position":[[378,8]]},"490":{"position":[[796,9]]},"543":{"position":[[347,8]]},"633":{"position":[[2362,9]]}}}],["seper",{"_index":953,"t":{"66":{"position":[[858,9]]}}}],["sept",{"_index":2450,"t":{"343":{"position":[[1360,4]]}}}],["serv",{"_index":2703,"t":{"415":{"position":[[234,6]]},"545":{"position":[[124,7]]},"549":{"position":[[2340,6]]},"553":{"position":[[146,6]]}}}],["server",{"_index":119,"t":{"4":{"position":[[2607,8],[2810,8],[2965,8],[5922,8]]},"18":{"position":[[3960,7]]},"22":{"position":[[150,6]]},"27":{"position":[[53,7]]},"29":{"position":[[178,6]]},"44":{"position":[[106,6],[191,6]]},"46":{"position":[[344,6]]},"93":{"position":[[15,6],[518,6]]},"95":{"position":[[346,6],[394,6]]},"105":{"position":[[335,8]]},"112":{"position":[[194,7],[278,6]]},"114":{"position":[[366,7]]},"136":{"position":[[169,6]]},"138":{"position":[[333,8]]},"174":{"position":[[423,6]]},"176":{"position":[[377,7],[401,6],[516,6]]},"180":{"position":[[232,6]]},"188":{"position":[[2689,6],[3460,6],[4935,8],[6764,8]]},"204":{"position":[[74,6]]},"208":{"position":[[386,6],[1824,8],[3181,8]]},"214":{"position":[[372,6],[1776,8],[3148,8]]},"220":{"position":[[153,7],[734,6]]},"222":{"position":[[105,7]]},"236":{"position":[[110,7],[333,7]]},"240":{"position":[[362,6]]},"259":{"position":[[167,7],[293,7],[377,6]]},"261":{"position":[[401,7]]},"263":{"position":[[35,7]]},"265":{"position":[[381,6],[436,6]]},"271":{"position":[[27,6],[382,7]]},"277":{"position":[[385,6]]},"281":{"position":[[351,6],[409,7]]},"283":{"position":[[74,6],[108,6],[193,6],[301,6],[352,6]]},"285":{"position":[[373,6]]},"303":{"position":[[3836,6]]},"315":{"position":[[182,6],[835,7],[904,6]]},"317":{"position":[[367,6],[442,6],[500,6],[1810,8],[3275,8]]},"319":{"position":[[216,8]]},"329":{"position":[[351,6],[409,6]]},"415":{"position":[[146,6]]},"425":{"position":[[1846,6]]},"435":{"position":[[259,6],[892,6],[994,6],[1735,6]]},"439":{"position":[[351,6],[924,8]]},"466":{"position":[[377,7],[491,6],[621,6],[712,7],[765,8],[938,6],[986,6]]},"565":{"position":[[198,6],[283,6],[1773,6]]},"633":{"position":[[1010,6]]}}}],["server/channel/dm",{"_index":980,"t":{"73":{"position":[[1083,18]]}}}],["server/cli",{"_index":2329,"t":{"315":{"position":[[553,13]]}}}],["servers/mirror",{"_index":2914,"t":{"466":{"position":[[419,15]]}}}],["servic",{"_index":53,"t":{"4":{"position":[[794,9]]},"10":{"position":[[86,8]]},"12":{"position":[[680,8],[1441,9]]},"14":{"position":[[592,9],[736,9],[1055,9]]},"18":{"position":[[145,7]]},"25":{"position":[[56,8],[219,9],[375,8]]},"57":{"position":[[252,8]]},"64":{"position":[[555,8],[1742,7],[1829,7],[1908,7],[2019,7],[2158,7],[2432,7]]},"73":{"position":[[1353,7],[1446,7],[1825,9],[2073,7],[2889,8],[6018,7],[7575,7],[7818,9]]},"77":{"position":[[45,7],[424,9],[672,7]]},"79":{"position":[[113,8]]},"83":{"position":[[414,8],[1601,7],[1688,7],[1767,7],[1878,7],[2017,7],[2291,7]]},"87":{"position":[[526,7]]},"136":{"position":[[1439,8]]},"160":{"position":[[227,7],[479,8],[1147,8]]},"174":{"position":[[116,9],[498,9]]},"178":{"position":[[631,9]]},"210":{"position":[[141,8]]},"222":{"position":[[560,9]]},"224":{"position":[[173,7],[186,9],[211,9],[258,9],[303,7],[348,8],[499,7],[587,8],[623,7],[719,8],[904,7],[997,8],[1053,7],[1150,8],[1302,8],[1419,7],[1484,8],[1572,9],[1720,8],[1820,7],[1917,8],[2079,8],[2263,9],[2316,7],[2381,8],[2469,9],[2497,8],[2562,9],[2622,8],[2729,8],[2933,8],[3032,7],[3254,7]]},"232":{"position":[[18,7],[172,7],[316,7],[430,8],[458,8],[752,8],[790,7],[881,7],[905,7]]},"238":{"position":[[173,7],[186,9],[211,9],[253,9],[293,7],[338,8],[490,7],[572,8],[608,7],[702,8],[893,7],[976,8],[1032,7],[1127,8],[1279,8],[1400,7],[1465,8],[1553,9],[1700,8],[1805,7],[1900,8],[2062,8],[2244,9],[2302,7],[2367,8],[2455,9],[2483,8],[2547,9],[2602,8],[2695,8],[2889,8],[2984,7],[3208,7]]},"240":{"position":[[92,7]]},"242":{"position":[[252,7]]},"251":{"position":[[18,7],[172,7],[316,7],[430,8],[458,8],[757,8],[795,7],[886,7],[910,7]]},"297":{"position":[[232,9]]},"303":{"position":[[4954,7]]},"313":{"position":[[353,7],[490,7]]},"319":{"position":[[114,7]]},"325":{"position":[[154,7],[251,7],[451,7],[542,8],[1248,9]]},"343":{"position":[[1435,8],[1869,9]]},"347":{"position":[[242,9]]},"351":{"position":[[475,7]]},"353":{"position":[[792,7]]},"357":{"position":[[473,7]]},"384":{"position":[[606,9]]},"425":{"position":[[1489,7],[2429,7],[2516,7]]},"427":{"position":[[605,7]]},"435":{"position":[[296,9],[2411,7]]},"437":{"position":[[103,8]]},"439":{"position":[[121,7],[193,7],[316,7],[515,7],[673,8],[725,7],[756,7]]},"441":{"position":[[795,7]]},"459":{"position":[[866,8],[1113,8]]},"461":{"position":[[263,8]]},"463":{"position":[[17,8]]},"472":{"position":[[1503,9]]},"488":{"position":[[367,9]]},"543":{"position":[[266,9],[544,9],[965,9],[1364,9],[1533,9],[2242,9],[2379,7],[2519,9],[2548,9]]},"545":{"position":[[471,9]]},"555":{"position":[[135,9]]},"565":{"position":[[12,8]]},"571":{"position":[[22,7],[164,7]]},"573":{"position":[[13,7],[297,9]]},"575":{"position":[[166,8],[211,7],[230,7],[278,7]]},"577":{"position":[[77,7]]},"579":{"position":[[174,7]]},"581":{"position":[[279,7],[1041,7]]},"594":{"position":[[446,8],[539,8],[1123,7],[1310,7]]},"597":{"position":[[83,7]]},"599":{"position":[[153,7],[499,7],[1076,7],[1272,7],[1355,8],[3325,7],[3716,7]]},"623":{"position":[[133,9]]},"631":{"position":[[240,9]]},"633":{"position":[[1847,7]]},"637":{"position":[[161,8]]}}}],["service'",{"_index":2748,"t":{"425":{"position":[[1836,9]]},"439":{"position":[[972,9]]}}}],["service(",{"_index":2022,"t":{"224":{"position":[[68,10]]},"238":{"position":[[68,10]]},"447":{"position":[[285,10]]}}}],["service.md",{"_index":3132,"t":{"547":{"position":[[23,10]]}}}],["service/account",{"_index":1389,"t":{"120":{"position":[[104,15]]}}}],["service/appl",{"_index":1633,"t":{"160":{"position":[[147,20],[353,19]]}}}],["service/cov",{"_index":910,"t":{"64":{"position":[[1166,13]]},"83":{"position":[[1025,13]]}}}],["service/play",{"_index":2063,"t":{"236":{"position":[[126,14],[285,14]]}}}],["service/volum",{"_index":3131,"t":{"545":{"position":[[957,14]]}}}],["serviceallow",{"_index":2346,"t":{"325":{"position":[[0,12],[346,12],[967,15],[1406,15],[3585,15],[5023,15]]}}}],["servicedeni",{"_index":2347,"t":{"325":{"position":[[17,11],[378,11],[1176,14],[3613,14],[5051,14]]}}}],["services/mus",{"_index":3167,"t":{"557":{"position":[[16,14]]}}}],["session",{"_index":819,"t":{"54":{"position":[[531,8],[741,8],[1020,7],[1323,7]]},"60":{"position":[[49,8],[829,8]]},"66":{"position":[[322,8]]},"91":{"position":[[581,7]]},"103":{"position":[[569,7]]},"257":{"position":[[625,7]]},"269":{"position":[[637,7]]},"293":{"position":[[931,7]]},"343":{"position":[[882,7],[914,7],[1247,8]]},"441":{"position":[[855,7],[994,7],[1068,7]]}}}],["sessions/tokens/etc",{"_index":332,"t":{"12":{"position":[[342,22]]}}}],["set",{"_index":143,"t":{"4":{"position":[[3765,8],[4023,8],[4102,9],[4144,8]]},"8":{"position":[[754,3]]},"10":{"position":[[186,3],[352,3]]},"12":{"position":[[574,3]]},"16":{"position":[[484,3]]},"18":{"position":[[3979,3]]},"20":{"position":[[103,3],[408,3],[519,3]]},"27":{"position":[[729,7],[1082,7]]},"42":{"position":[[441,3],[876,3]]},"44":{"position":[[220,8],[675,3],[1558,3],[1622,3]]},"48":{"position":[[49,3]]},"50":{"position":[[82,3]]},"52":{"position":[[70,3]]},"54":{"position":[[49,3],[1607,3]]},"60":{"position":[[643,7],[1221,3]]},"64":{"position":[[1660,4],[1943,3],[2054,3],[2058,7],[2322,7]]},"68":{"position":[[49,3],[201,3]]},"73":{"position":[[95,3],[2234,3],[2869,3],[2954,3]]},"77":{"position":[[833,3]]},"79":{"position":[[93,3],[178,3]]},"83":{"position":[[1519,4],[1802,3],[1913,3],[1917,7],[2181,7]]},"87":{"position":[[1416,3]]},"89":{"position":[[599,8]]},"93":{"position":[[248,3]]},"99":{"position":[[593,8]]},"107":{"position":[[174,8]]},"140":{"position":[[249,8]]},"149":{"position":[[1725,8]]},"151":{"position":[[1777,7]]},"168":{"position":[[596,3],[728,3],[776,3]]},"180":{"position":[[328,8]]},"182":{"position":[[900,3],[1032,3],[1091,3],[1207,4],[1233,3],[1297,8],[1647,3]]},"184":{"position":[[1171,8]]},"188":{"position":[[1129,3],[1276,7]]},"196":{"position":[[553,4],[574,3]]},"200":{"position":[[1000,3],[1130,3],[1189,3],[1338,4],[1525,3],[2054,3]]},"206":{"position":[[35,3],[395,8],[764,4]]},"208":{"position":[[479,3],[559,3]]},"210":{"position":[[129,8],[237,4]]},"212":{"position":[[33,3],[389,8],[754,4]]},"214":{"position":[[423,3],[494,3]]},"216":{"position":[[2072,7],[2673,3]]},"220":{"position":[[1819,3]]},"224":{"position":[[3278,3],[3339,3]]},"226":{"position":[[5,7]]},"228":{"position":[[16,7]]},"230":{"position":[[245,7],[882,7]]},"236":{"position":[[208,3]]},"238":{"position":[[502,3],[3232,3],[3298,3]]},"242":{"position":[[306,3]]},"247":{"position":[[8,3]]},"249":{"position":[[68,8],[246,8]]},"257":{"position":[[1749,3]]},"261":{"position":[[1548,3]]},"265":{"position":[[1399,3]]},"269":{"position":[[1640,3]]},"271":{"position":[[390,3],[1065,4]]},"279":{"position":[[100,8]]},"281":{"position":[[420,3]]},"283":{"position":[[115,3],[144,8]]},"285":{"position":[[422,3]]},"291":{"position":[[1647,3]]},"303":{"position":[[1972,3],[1991,8],[2796,3],[3950,3]]},"307":{"position":[[559,8]]},"309":{"position":[[36,3]]},"315":{"position":[[1041,7]]},"325":{"position":[[2885,3]]},"327":{"position":[[153,8],[404,3],[685,7],[730,3]]},"337":{"position":[[372,3],[454,3]]},"343":{"position":[[1648,7],[3307,3],[3392,7]]},"361":{"position":[[1098,4],[1881,3]]},"417":{"position":[[352,4]]},"419":{"position":[[35,8]]},"423":{"position":[[371,8]]},"425":{"position":[[2044,3],[2156,3],[2258,3]]},"435":{"position":[[1489,7]]},"441":{"position":[[1197,3]]},"457":{"position":[[1615,3]]},"459":{"position":[[1623,3]]},"466":{"position":[[135,3]]},"470":{"position":[[861,3]]},"476":{"position":[[1446,3],[4081,3]]},"479":{"position":[[116,3],[146,3]]},"481":{"position":[[1877,3]]},"483":{"position":[[1792,4]]},"530":{"position":[[0,3]]},"533":{"position":[[518,8]]},"543":{"position":[[441,7],[1231,3],[1442,3],[2147,7]]},"549":{"position":[[230,3],[538,3],[728,4],[795,4],[869,3]]},"557":{"position":[[187,7],[629,3],[2090,3]]},"565":{"position":[[312,8],[1206,3],[1270,3],[2006,3]]},"567":{"position":[[97,7],[367,3]]},"569":{"position":[[394,3]]},"577":{"position":[[40,7]]},"584":{"position":[[660,8]]},"597":{"position":[[221,3],[225,7]]},"599":{"position":[[641,7]]},"635":{"position":[[4,3]]}}}],["set('author",{"_index":3355,"t":{"592":{"position":[[2420,21]]},"594":{"position":[[1995,21]]},"597":{"position":[[806,21]]}}}],["setup",{"_index":43,"t":{"4":{"position":[[636,5],[1735,5],[3730,5]]},"44":{"position":[[92,5]]},"50":{"position":[[325,5]]},"73":{"position":[[597,5],[1226,5],[1232,5],[3260,6],[6010,5],[7285,5],[7567,5]]},"75":{"position":[[0,5]]},"79":{"position":[[484,6]]},"93":{"position":[[0,5],[64,5]]},"110":{"position":[[666,5],[869,5]]},"178":{"position":[[870,5],[1758,5]]},"220":{"position":[[234,6]]},"232":{"position":[[616,5]]},"242":{"position":[[80,6]]},"251":{"position":[[621,5]]},"263":{"position":[[118,6]]},"283":{"position":[[81,6],[200,5],[308,5]]},"289":{"position":[[11,5]]},"291":{"position":[[51,6]]},"293":{"position":[[369,6],[589,5],[615,5]]},"315":{"position":[[1001,6]]},"321":{"position":[[11,5]]},"323":{"position":[[51,6]]},"343":{"position":[[5337,5]]},"347":{"position":[[1141,5]]},"447":{"position":[[147,5]]},"459":{"position":[[1585,6]]},"486":{"position":[[11,5]]},"543":{"position":[[770,6]]},"557":{"position":[[1621,5],[3123,6],[3360,5]]},"559":{"position":[[222,5],[1624,5]]},"563":{"position":[[762,5]]},"565":{"position":[[184,5],[1758,5],[1822,5]]},"569":{"position":[[91,5],[457,5]]},"571":{"position":[[139,5]]},"586":{"position":[[57,5]]},"633":{"position":[[2287,5],[2762,5]]}}}],["setup.sh",{"_index":3069,"t":{"533":{"position":[[251,10]]},"535":{"position":[[18,8]]},"537":{"position":[[51,9]]}}}],["sevenhtml",{"_index":1915,"t":{"200":{"position":[[2023,12]]}}}],["sever",{"_index":866,"t":{"60":{"position":[[8,7]]},"214":{"position":[[454,5],[525,5]]},"343":{"position":[[1498,7]]},"361":{"position":[[1090,7]]},"481":{"position":[[10,7]]},"616":{"position":[[55,7]]}}}],["sh",{"_index":1009,"t":{"73":{"position":[[2407,2]]},"77":{"position":[[1006,2]]}}}],["shape",{"_index":747,"t":{"46":{"position":[[619,6],[2023,6]]},"66":{"position":[[1114,6],[2532,6]]},"85":{"position":[[873,6],[2249,6]]},"91":{"position":[[783,6],[2252,6]]},"95":{"position":[[556,6],[1933,6]]},"103":{"position":[[880,6],[2311,6]]},"110":{"position":[[1805,6],[3246,6]]},"114":{"position":[[668,6],[2133,6]]},"143":{"position":[[1169,6],[2546,6]]},"151":{"position":[[1509,6]]},"153":{"position":[[921,6],[2624,6]]},"186":{"position":[[685,6],[2121,6]]},"188":{"position":[[3819,6],[5651,6]]},"198":{"position":[[709,6],[2146,6]]},"202":{"position":[[544,6],[1876,6]]},"208":{"position":[[718,6],[2072,6]]},"214":{"position":[[684,6],[2047,6]]},"218":{"position":[[1034,6],[2420,6]]},"220":{"position":[[1023,6],[2680,6]]},"234":{"position":[[792,6],[2126,6]]},"253":{"position":[[866,6],[2206,6]]},"257":{"position":[[943,6],[2633,6]]},"261":{"position":[[717,6],[2456,6]]},"265":{"position":[[598,6],[2231,6]]},"269":{"position":[[839,6],[2564,6]]},"277":{"position":[[913,6],[2284,6]]},"281":{"position":[[649,6],[2008,6]]},"285":{"position":[[664,6],[2045,6]]},"291":{"position":[[841,6],[2541,6]]},"295":{"position":[[681,6],[2021,6]]},"301":{"position":[[1152,6],[2574,6]]},"305":{"position":[[695,6],[2169,6]]},"317":{"position":[[673,6],[2141,6]]},"325":{"position":[[2084,6],[3775,6]]},"329":{"position":[[568,6],[1878,6]]},"333":{"position":[[545,6],[1881,6]]},"341":{"position":[[613,6],[1988,6]]},"345":{"position":[[790,6],[2270,6]]},"349":{"position":[[647,6],[2024,6]]},"423":{"position":[[66,6]]},"425":{"position":[[928,5]]}}}],["share",{"_index":1185,"t":{"105":{"position":[[506,5]]},"138":{"position":[[504,5]]},"174":{"position":[[266,6]]},"204":{"position":[[198,5]]},"421":{"position":[[81,6],[423,5]]}}}],["shm_size",{"_index":999,"t":{"73":{"position":[[2204,9]]},"77":{"position":[[803,9]]}}}],["short",{"_index":2631,"t":{"372":{"position":[[217,5]]},"616":{"position":[[525,5]]}}}],["shortcod",{"_index":1784,"t":{"184":{"position":[[142,9],[277,9],[472,9],[698,9],[781,12]]}}}],["shortcut",{"_index":520,"t":{"20":{"position":[[141,8]]}}}],["shorter",{"_index":1910,"t":{"200":{"position":[[1531,7]]},"303":{"position":[[224,7]]}}}],["show",{"_index":764,"t":{"46":{"position":[[1061,4],[2578,4]]},"64":{"position":[[4142,4]]},"66":{"position":[[1558,4],[3091,4]]},"85":{"position":[[1317,4],[2808,4]]},"91":{"position":[[1226,4],[2809,4]]},"95":{"position":[[999,4],[2490,4]]},"103":{"position":[[1324,4],[2870,4]]},"110":{"position":[[2249,4],[3805,4]]},"114":{"position":[[1117,4],[2702,4]]},"143":{"position":[[1612,4],[3103,4]]},"149":{"position":[[1783,5],[1915,4]]},"151":{"position":[[602,7]]},"153":{"position":[[1368,4],[3189,4]]},"186":{"position":[[1131,4],[2684,4]]},"188":{"position":[[4264,4],[6212,4]]},"198":{"position":[[1152,4],[2703,4]]},"202":{"position":[[988,4],[2435,4]]},"208":{"position":[[1161,4],[2629,4]]},"214":{"position":[[1125,4],[2600,4]]},"218":{"position":[[1481,4],[2985,4]]},"220":{"position":[[1465,4],[3235,4]]},"234":{"position":[[1240,4],[2693,4]]},"249":{"position":[[232,4]]},"253":{"position":[[1313,4],[2771,4]]},"257":{"position":[[1387,4],[3192,4]]},"261":{"position":[[1166,4],[3025,4]]},"265":{"position":[[1041,4],[2788,4]]},"269":{"position":[[1282,4],[3121,4]]},"277":{"position":[[1356,4],[2841,4]]},"281":{"position":[[1089,4],[2559,4]]},"285":{"position":[[1110,4],[2608,4]]},"291":{"position":[[1285,4],[3100,4]]},"293":{"position":[[146,5]]},"295":{"position":[[1123,4],[2576,4]]},"301":{"position":[[1594,4],[3129,4]]},"305":{"position":[[1139,4],[2728,4]]},"317":{"position":[[1118,4],[2702,4]]},"325":{"position":[[2527,4],[4332,4]]},"327":{"position":[[148,4]]},"329":{"position":[[1008,4],[2429,4]]},"333":{"position":[[991,4],[2444,4]]},"341":{"position":[[1062,4],[2557,4]]},"345":{"position":[[1234,4],[2829,4]]},"349":{"position":[[1092,4],[2585,4]]},"369":{"position":[[491,5]]},"567":{"position":[[461,4],[600,5]]},"625":{"position":[[43,5]]}}}],["shown",{"_index":754,"t":{"46":{"position":[[823,5],[1463,5],[1591,6],[2341,5],[2859,5],[2987,6]]},"60":{"position":[[1433,5]]},"62":{"position":[[364,5]]},"64":{"position":[[337,5],[3658,5]]},"66":{"position":[[1320,5],[1968,5],[2096,6],[2854,5],[3374,5],[3502,6]]},"71":{"position":[[217,5]]},"83":{"position":[[246,5],[3450,5]]},"85":{"position":[[1079,5],[1727,5],[1855,6],[2571,5],[3091,5],[3219,6]]},"91":{"position":[[988,5],[1632,5],[1760,6],[2572,5],[3091,5],[3219,6]]},"95":{"position":[[761,5],[1405,5],[1533,6],[2253,5],[2772,5],[2900,6]]},"103":{"position":[[1086,5],[1734,5],[1862,6],[2633,5],[3153,5],[3281,6]]},"110":{"position":[[2011,5],[2659,5],[2787,6],[3568,5],[4088,5],[4216,6]]},"114":{"position":[[879,5],[1547,5],[1675,6],[2465,5],[2990,5],[3118,6]]},"140":{"position":[[363,5]]},"143":{"position":[[1374,5],[2018,5],[2146,6],[2866,5],[3385,5],[3513,6]]},"149":{"position":[[2781,5]]},"153":{"position":[[1130,5],[1790,5],[1918,6],[2952,5],[3475,5],[3603,6]]},"186":{"position":[[893,5],[1549,5],[1677,6],[2447,5],[2969,5],[3097,6]]},"188":{"position":[[4026,5],[4678,5],[4806,6],[5975,5],[6496,5],[6624,6]]},"192":{"position":[[532,5]]},"198":{"position":[[914,5],[1558,5],[1686,6],[2466,5],[2985,5],[3113,6]]},"200":{"position":[[1860,5]]},"202":{"position":[[750,5],[1398,5],[1526,6],[2198,5],[2718,5],[2846,6]]},"208":{"position":[[923,5],[1567,5],[1695,6],[2392,5],[2911,5],[3039,6]]},"214":{"position":[[887,5],[1523,5],[1651,6],[2363,5],[2880,5],[3008,6]]},"218":{"position":[[1243,5],[1903,5],[2031,6],[2748,5],[3271,5],[3399,6]]},"220":{"position":[[1227,5],[2120,5],[2248,6],[2998,5],[3516,5],[3644,6]]},"234":{"position":[[1002,5],[1666,5],[1794,6],[2456,5],[2980,5],[3108,6]]},"253":{"position":[[1075,5],[1735,5],[1863,6],[2534,5],[3057,5],[3185,6]]},"255":{"position":[[255,5]]},"257":{"position":[[1149,5],[2056,5],[2184,6],[2955,5],[3475,5],[3603,6]]},"261":{"position":[[928,5],[1870,5],[1998,6],[2788,5],[3313,5],[3441,6]]},"265":{"position":[[803,5],[1703,5],[1831,6],[2551,5],[3070,5],[3198,6]]},"267":{"position":[[370,5]]},"269":{"position":[[1044,5],[1944,5],[2072,6],[2884,5],[3403,5],[3531,6]]},"277":{"position":[[1118,5],[1762,5],[1890,6],[2604,5],[3123,5],[3251,6]]},"281":{"position":[[851,5],[1483,5],[1611,6],[2322,5],[2838,5],[2966,6]]},"283":{"position":[[288,5]]},"285":{"position":[[872,5],[1528,5],[1656,6],[2371,5],[2893,5],[3021,6]]},"291":{"position":[[1047,5],[1954,5],[2082,6],[2863,5],[3383,5],[3511,6]]},"295":{"position":[[885,5],[1525,5],[1653,6],[2339,5],[2857,5],[2985,6]]},"301":{"position":[[1356,5],[1996,5],[2124,6],[2892,5],[3410,5],[3538,6]]},"305":{"position":[[527,5],[901,5],[1549,5],[1677,6],[2491,5],[3011,5],[3139,6]]},"317":{"position":[[880,5],[1532,5],[1660,6],[2465,5],[2986,5],[3114,6]]},"325":{"position":[[2289,5],[3189,5],[3317,6],[4095,5],[4614,5],[4742,6]]},"327":{"position":[[313,5]]},"329":{"position":[[770,5],[1402,5],[1530,6],[2192,5],[2708,5],[2836,6]]},"333":{"position":[[753,5],[1409,5],[1537,6],[2207,5],[2729,5],[2857,6]]},"341":{"position":[[824,5],[1492,5],[1620,6],[2320,5],[2845,5],[2973,6]]},"345":{"position":[[996,5],[1644,5],[1772,6],[2592,5],[3112,5],[3240,6]]},"349":{"position":[[854,5],[1506,5],[1634,6],[2348,5],[2869,5],[2997,6]]},"382":{"position":[[140,5]]},"384":{"position":[[26,5]]},"472":{"position":[[26,5]]},"501":{"position":[[17,5]]},"513":{"position":[[37,5]]},"616":{"position":[[496,5]]},"618":{"position":[[693,5],[753,5]]},"623":{"position":[[1056,5]]}}}],["side",{"_index":1433,"t":{"136":{"position":[[176,5]]},"149":{"position":[[1998,4]]},"457":{"position":[[453,4]]}}}],["side(",{"_index":2559,"t":{"357":{"position":[[1183,7]]}}}],["sidebar",{"_index":1491,"t":{"147":{"position":[[349,7]]},"149":{"position":[[2202,8]]},"192":{"position":[[670,7]]},"374":{"position":[[58,9]]}}}],["sign",{"_index":1217,"t":{"107":{"position":[[80,4]]},"343":{"position":[[5098,4]]}}}],["signal",{"_index":834,"t":{"54":{"position":[[1084,7],[1281,7]]},"60":{"position":[[16,7]]},"594":{"position":[[2915,10]]}}}],["silo",{"_index":3490,"t":{"633":{"position":[[2315,4]]}}}],["similar",{"_index":654,"t":{"38":{"position":[[320,10]]},"118":{"position":[[60,10],[601,10],[717,7],[1100,10],[2868,7]]},"303":{"position":[[4401,7]]},"457":{"position":[[1712,7]]},"472":{"position":[[877,10]]},"483":{"position":[[1120,7],[1736,7],[2213,7],[2844,10]]},"507":{"position":[[1192,10]]}}}],["similarli",{"_index":3415,"t":{"604":{"position":[[369,9]]}}}],["similiar",{"_index":3012,"t":{"483":{"position":[[2509,11],[2572,11],[2636,11]]}}}],["simpl",{"_index":42,"t":{"4":{"position":[[629,6]]},"62":{"position":[[137,7]]},"71":{"position":[[92,7]]},"105":{"position":[[807,6]]},"120":{"position":[[301,6]]},"138":{"position":[[805,6]]},"303":{"position":[[3824,6]]},"327":{"position":[[167,6]]},"419":{"position":[[291,6]]},"447":{"position":[[140,6]]}}}],["simpler",{"_index":968,"t":{"73":{"position":[[611,7]]}}}],["simpli",{"_index":1497,"t":{"147":{"position":[[608,6]]},"151":{"position":[[652,6]]},"293":{"position":[[909,6]]},"599":{"position":[[591,6]]}}}],["simplifi",{"_index":3399,"t":{"599":{"position":[[2550,10]]},"627":{"position":[[25,10],[497,11],[567,11],[967,11],[1033,11]]}}}],["simultan",{"_index":2206,"t":{"297":{"position":[[113,13]]}}}],["singl",{"_index":1294,"t":{"118":{"position":[[1239,6]]},"149":{"position":[[3824,6]]},"151":{"position":[[1909,6],[1946,8]]},"178":{"position":[[2177,9],[3376,9]]},"200":{"position":[[224,6]]},"359":{"position":[[311,6]]},"376":{"position":[[201,6]]},"481":{"position":[[310,8],[803,7]]},"483":{"position":[[965,8],[1040,9]]},"488":{"position":[[483,7],[544,9],[896,7],[957,9]]},"501":{"position":[[354,9]]},"505":{"position":[[451,9]]},"509":{"position":[[750,9],[1329,9]]},"588":{"position":[[933,9]]},"633":{"position":[[939,6]]}}}],["single_user_platform_id",{"_index":3368,"t":{"594":{"position":[[1608,23],[2345,24]]}}}],["site",{"_index":777,"t":{"46":{"position":[[1614,4],[3010,4]]},"66":{"position":[[2119,4],[3525,4]]},"85":{"position":[[1878,4],[3242,4]]},"91":{"position":[[1783,4],[3242,4]]},"95":{"position":[[1556,4],[2923,4]]},"103":{"position":[[1885,4],[3304,4]]},"110":{"position":[[2810,4],[4239,4]]},"114":{"position":[[1698,4],[3141,4]]},"143":{"position":[[2169,4],[3536,4]]},"153":{"position":[[1941,4],[3626,4]]},"186":{"position":[[1700,4],[3120,4]]},"188":{"position":[[4829,4],[6647,4]]},"198":{"position":[[1709,4],[3136,4]]},"202":{"position":[[1549,4],[2869,4]]},"208":{"position":[[1718,4],[3062,4]]},"214":{"position":[[1674,4],[3031,4]]},"218":{"position":[[2054,4],[3422,4]]},"220":{"position":[[2271,4],[3667,4]]},"234":{"position":[[1817,4],[3131,4]]},"253":{"position":[[1886,4],[3208,4]]},"257":{"position":[[2207,4],[3626,4]]},"261":{"position":[[2021,4],[3464,4]]},"265":{"position":[[1854,4],[3221,4]]},"269":{"position":[[2095,4],[3554,4]]},"277":{"position":[[1913,4],[3274,4]]},"281":{"position":[[1634,4],[2989,4]]},"285":{"position":[[1679,4],[3044,4]]},"291":{"position":[[2105,4],[3534,4]]},"295":{"position":[[1676,4],[3008,4]]},"301":{"position":[[2147,4],[3561,4]]},"303":{"position":[[4783,4],[5014,4]]},"305":{"position":[[1700,4],[3162,4]]},"317":{"position":[[1683,4],[3137,4]]},"325":{"position":[[3340,4],[4765,4]]},"329":{"position":[[1553,4],[2859,4]]},"333":{"position":[[1560,4],[2880,4]]},"341":{"position":[[1643,4],[2996,4]]},"345":{"position":[[1795,4],[3263,4]]},"349":{"position":[[1657,4],[3020,4]]},"441":{"position":[[626,4]]},"444":{"position":[[378,4]]}}}],["situat",{"_index":1500,"t":{"149":{"position":[[205,10]]}}}],["size",{"_index":426,"t":{"18":{"position":[[481,4],[655,4],[820,4],[1044,4]]},"372":{"position":[[203,4],[352,4]]}}}],["skagg",{"_index":2690,"t":{"408":{"position":[[56,8]]}}}],["skip",{"_index":970,"t":{"73":{"position":[[698,4]]},"365":{"position":[[578,4]]},"367":{"position":[[466,7]]},"402":{"position":[[155,4]]},"459":{"position":[[1592,4]]},"476":{"position":[[242,8]]},"599":{"position":[[3789,4]]},"618":{"position":[[661,8]]}}}],["slash",{"_index":2692,"t":{"412":{"position":[[264,5],[440,5],[540,5]]}}}],["slice.wisp.plac",{"_index":1451,"t":{"138":{"position":[[1836,16]]}}}],["slick",{"_index":3235,"t":{"581":{"position":[[111,5]]}}}],["slight",{"_index":2835,"t":{"451":{"position":[[211,6]]}}}],["slightli",{"_index":2558,"t":{"357":{"position":[[1083,8]]}}}],["slug",{"_index":2032,"t":{"224":{"position":[[2913,6],[3243,5]]},"230":{"position":[[502,4],[700,6],[848,6],[892,4],[950,5]]},"232":{"position":[[142,5]]},"234":{"position":[[1976,7],[3298,7]]},"238":{"position":[[2869,6],[3197,5]]},"244":{"position":[[270,4],[458,6],[472,4],[573,4]]},"251":{"position":[[142,5]]},"337":{"position":[[80,4],[244,7],[328,7],[616,4]]},"341":{"position":[[1796,7],[3156,7]]},"435":{"position":[[840,4]]}}}],["small",{"_index":2630,"t":{"372":{"position":[[191,5]]}}}],["smart",{"_index":1319,"t":{"118":{"position":[[1815,7]]},"633":{"position":[[1151,5]]}}}],["smarttub",{"_index":1991,"t":{"216":{"position":[[2428,13],[3015,13]]}}}],["sn6yasw8g4",{"_index":1551,"t":{"149":{"position":[[3535,13]]},"153":{"position":[[2160,13],[3854,13]]}}}],["snapshot",{"_index":3486,"t":{"633":{"position":[[1642,8]]}}}],["socat",{"_index":1061,"t":{"73":{"position":[[5871,5],[6060,5],[7291,5],[7320,5],[7353,5],[7428,5],[7617,5],[7699,5],[7723,5],[7828,6]]},"293":{"position":[[1442,5],[1600,5]]}}}],["social",{"_index":1181,"t":{"105":{"position":[[250,6]]},"130":{"position":[[209,6]]},"138":{"position":[[109,6],[248,6]]},"319":{"position":[[81,6]]}}}],["socket",{"_index":988,"t":{"73":{"position":[[1522,6],[1582,6],[1604,6],[4077,6],[4483,6],[5936,6],[6417,6],[7493,6],[7776,6],[8297,6]]},"77":{"position":[[121,6],[181,6],[203,6]]},"85":{"position":[[410,6]]},"216":{"position":[[1263,6]]},"293":{"position":[[659,6],[791,7],[949,6],[1067,7],[1287,7],[1508,6]]}}}],["softwar",{"_index":1048,"t":{"73":{"position":[[4941,9]]}}}],["sole",{"_index":1906,"t":{"200":{"position":[[419,6]]},"216":{"position":[[680,6]]}}}],["solut",{"_index":1427,"t":{"134":{"position":[[26,9],[550,9]]},"439":{"position":[[1070,8]]},"569":{"position":[[604,9]]}}}],["solv",{"_index":3056,"t":{"522":{"position":[[153,7]]}}}],["some_ip",{"_index":2741,"t":{"425":{"position":[[1193,9]]}}}],["someguy",{"_index":2638,"t":{"376":{"position":[[629,8]]}}}],["someon",{"_index":865,"t":{"57":{"position":[[910,7]]}}}],["someotherus",{"_index":1839,"t":{"188":{"position":[[5127,15],[6956,15]]}}}],["someth",{"_index":1871,"t":{"196":{"position":[[250,9]]},"343":{"position":[[2856,9]]},"435":{"position":[[327,9],[1261,9]]},"441":{"position":[[917,9]]},"444":{"position":[[11,9]]},"457":{"position":[[404,9]]},"503":{"position":[[468,9]]}}}],["sometim",{"_index":981,"t":{"73":{"position":[[1102,10]]},"457":{"position":[[1076,9]]},"481":{"position":[[1548,9]]}}}],["someus",{"_index":2299,"t":{"307":{"position":[[869,12],[903,8],[931,8],[1164,11],[1243,9]]}}}],["somewher",{"_index":1463,"t":{"140":{"position":[[337,10]]},"417":{"position":[[201,9]]},"549":{"position":[[22,9]]}}}],["song",{"_index":639,"t":{"33":{"position":[[77,5]]},"151":{"position":[[619,4],[764,4],[773,4],[797,5],[806,4],[837,4],[867,5],[876,4],[884,5],[965,4],[1263,5],[1287,4],[1387,4]]},"160":{"position":[[594,4]]},"166":{"position":[[1140,4]]},"311":{"position":[[100,4]]},"315":{"position":[[939,4]]},"353":{"position":[[119,5]]},"376":{"position":[[351,4],[617,4]]},"457":{"position":[[85,4],[1907,4],[2950,5],[2989,4],[3036,4],[3113,5],[3174,5]]},"594":{"position":[[319,4]]}}}],["sono",{"_index":1627,"t":{"157":{"position":[[794,5]]},"194":{"position":[[37,7]]},"297":{"position":[[28,5],[65,5],[261,5],[470,5],[583,6],[673,5],[701,5],[777,5],[961,6],[972,5],[1060,5],[1542,5],[1733,5],[1865,5],[1941,5]]},"299":{"position":[[111,5]]},"301":{"position":[[111,5],[480,5],[1098,5],[1304,5],[1643,5],[1722,5],[1944,5],[2668,5],[2859,5],[3377,5],[3880,7]]},"633":{"position":[[414,5]]}}}],["sonos.json",{"_index":2214,"t":{"297":{"position":[[1340,11]]}}}],["sonos/accessori",{"_index":2224,"t":{"301":{"position":[[47,15]]}}}],["sonos_devices_allow",{"_index":2230,"t":{"301":{"position":[[504,19]]}}}],["sonos_devices_block",{"_index":2231,"t":{"301":{"position":[[608,19]]}}}],["sonos_en",{"_index":2227,"t":{"301":{"position":[[377,12]]}}}],["sonos_groups_allow",{"_index":2232,"t":{"301":{"position":[[714,18]]}}}],["sonos_groups_block",{"_index":2233,"t":{"301":{"position":[[855,18]]}}}],["sonos_host",{"_index":2228,"t":{"301":{"position":[[434,10]]}}}],["sonos_id",{"_index":2225,"t":{"301":{"position":[[252,8],[333,8]]}}}],["sonos_nam",{"_index":2226,"t":{"301":{"position":[[306,10]]}}}],["soon",{"_index":1440,"t":{"136":{"position":[[955,4]]}}}],["sort",{"_index":1746,"t":{"178":{"position":[[974,7]]},"472":{"position":[[837,7],[967,7],[1672,7]]},"483":{"position":[[83,7],[176,6],[217,7],[397,7],[524,7],[1196,7],[3013,7]]},"492":{"position":[[341,7],[364,7]]}}}],["sorted/rank",{"_index":2998,"t":{"483":{"position":[[1093,13]]}}}],["sot",{"_index":1612,"t":{"157":{"position":[[25,3]]}}}],["souc",{"_index":1335,"t":{"118":{"position":[[3423,5]]}}}],["sound",{"_index":2870,"t":{"457":{"position":[[2018,5]]},"483":{"position":[[1552,5]]}}}],["soundcloud",{"_index":2134,"t":{"273":{"position":[[368,14]]},"275":{"position":[[20,12],[98,12],[373,14],[444,11]]},"277":{"position":[[656,10]]}}}],["soundcloud:song:mysong",{"_index":2135,"t":{"273":{"position":[[474,22]]}}}],["soundtrack",{"_index":2980,"t":{"481":{"position":[[912,11]]},"483":{"position":[[1594,11],[2318,11]]}}}],["soup",{"_index":2643,"t":{"376":{"position":[[808,4],[926,6]]},"476":{"position":[[3094,6],[4561,4],[4625,4],[4893,6],[5511,5],[5606,5],[5731,6]]},"490":{"position":[[711,4],[893,6]]}}}],["sourc",{"_index":5,"t":{"4":{"position":[[0,7],[685,6],[1683,7],[4857,10],[5890,10]]},"6":{"position":[[64,6],[117,7],[134,7]]},"8":{"position":[[1604,9]]},"14":{"position":[[385,6]]},"18":{"position":[[138,6],[183,6],[245,6],[570,7],[704,7],[1763,7]]},"20":{"position":[[489,10]]},"22":{"position":[[48,8],[208,7]]},"27":{"position":[[78,6],[101,6],[122,6],[358,10]]},"29":{"position":[[667,7]]},"31":{"position":[[148,6]]},"38":{"position":[[496,7]]},"42":{"position":[[525,6],[708,7],[808,6],[895,6],[988,6],[1183,6]]},"44":{"position":[[83,8]]},"46":{"position":[[1171,6]]},"64":{"position":[[836,6],[915,6],[1017,6],[3248,7]]},"66":{"position":[[1670,6]]},"73":{"position":[[5771,6],[7157,6],[9416,6]]},"83":{"position":[[695,6],[774,6],[876,6],[3073,7]]},"85":{"position":[[1429,6]]},"87":{"position":[[100,8]]},"91":{"position":[[1337,6]]},"95":{"position":[[1110,6]]},"97":{"position":[[93,8],[216,6]]},"103":{"position":[[1436,6]]},"105":{"position":[[77,8],[1933,6]]},"110":{"position":[[2361,6]]},"112":{"position":[[98,8]]},"114":{"position":[[1234,6]]},"118":{"position":[[2497,6],[2528,7],[2591,7],[3108,6],[4205,7],[5157,7]]},"120":{"position":[[56,6],[264,6],[511,6],[609,7],[889,7],[943,6],[1034,8],[1110,6]]},"123":{"position":[[76,6]]},"125":{"position":[[51,6],[67,6]]},"128":{"position":[[101,7],[159,6]]},"132":{"position":[[36,7],[253,7],[336,7],[420,6]]},"136":{"position":[[909,6],[989,6]]},"138":{"position":[[87,8]]},"143":{"position":[[1723,6]]},"145":{"position":[[5,6]]},"153":{"position":[[878,6],[1084,6],[1410,6],[1483,6],[1744,6],[2754,7],[2925,6],[3448,6],[3711,10]]},"155":{"position":[[2,6],[19,6]]},"160":{"position":[[4,7],[122,6],[190,6],[332,6],[421,7],[545,6],[677,7],[881,7],[1028,7],[1220,7]]},"162":{"position":[[5,7],[105,7]]},"164":{"position":[[25,6],[377,6]]},"166":{"position":[[46,6],[68,8],[226,8],[472,6],[610,7],[679,6],[1058,6],[1712,7]]},"168":{"position":[[55,8],[131,7],[232,7],[533,8]]},"174":{"position":[[56,7],[2565,10]]},"176":{"position":[[1769,10]]},"178":{"position":[[18,7],[453,6],[1426,6],[3512,10]]},"182":{"position":[[658,6]]},"186":{"position":[[642,6],[847,6],[1173,6],[1245,6],[1503,6],[2250,7],[2420,6],[2942,6],[3205,10]]},"188":{"position":[[3776,6],[3980,6],[4306,6],[4377,6],[4632,6],[5779,7],[5948,6],[6469,6],[6732,10]]},"190":{"position":[[13,6],[200,6],[235,6]]},"194":{"position":[[168,6]]},"196":{"position":[[229,7],[286,9]]},"198":{"position":[[666,6],[868,6],[1194,6],[1263,6],[1512,6],[2272,7],[2439,6],[2958,6],[3221,10]]},"200":{"position":[[621,7],[758,6],[1597,8],[1674,7],[1815,7],[1997,10],[2064,7],[2146,7]]},"202":{"position":[[501,6],[704,6],[1030,6],[1100,6],[1352,6],[2003,7],[2171,6],[2691,6],[2954,10]]},"208":{"position":[[675,6],[877,6],[1203,6],[1272,6],[1521,6],[2198,7],[2365,6],[2884,6],[3147,10]]},"214":{"position":[[641,6],[841,6],[1167,6],[1234,6],[1477,6],[2171,7],[2336,6],[2853,6],[3116,10]]},"216":{"position":[[247,7],[398,6],[532,6],[577,6],[3342,6]]},"218":{"position":[[991,6],[1197,6],[1523,6],[1596,6],[1857,6],[2550,7],[2721,6],[3244,6],[3507,10]]},"220":{"position":[[5,6],[265,6],[331,8],[980,6],[1181,6],[1507,6],[1575,6],[1786,6],[1838,8],[2074,6],[2372,6],[2421,9],[2805,7],[2971,6],[3489,6],[3752,10],[3782,6],[3831,9]]},"222":{"position":[[5,6],[254,8],[292,6],[344,8],[738,6]]},"224":{"position":[[130,7],[447,7],[852,7],[1407,7],[1540,6],[1607,7],[1750,7],[2304,7],[2437,6],[2694,6],[2783,7]]},"228":{"position":[[47,6],[482,7]]},"230":{"position":[[52,6],[113,7],[173,7],[524,6],[755,6],[810,7]]},"234":{"position":[[337,7],[479,6],[552,7],[624,7],[749,6],[956,6],[1282,6],[1356,6],[1620,6],[2257,7],[2429,6],[2953,6],[3216,10]]},"236":{"position":[[5,6],[502,8]]},"238":{"position":[[130,7],[438,7],[841,7],[1388,7],[1521,6],[1594,7],[1735,7],[2290,7],[2423,6],[2667,6],[2746,7]]},"242":{"position":[[236,7],[349,6]]},"244":{"position":[[58,6],[292,6]]},"253":{"position":[[337,7],[472,6],[622,6],[700,6],[823,6],[1029,6],[1355,6],[1428,6],[1689,6],[2336,7],[2507,6],[3030,6],[3293,10]]},"255":{"position":[[5,6],[186,6],[323,8]]},"257":{"position":[[900,6],[1103,6],[1429,6],[1499,6],[1716,6],[1768,8],[2010,6],[2315,8],[2380,9],[2760,7],[2928,6],[3448,6],[3711,10],[3746,8],[3811,9]]},"259":{"position":[[5,6]]},"261":{"position":[[674,6],[882,6],[1208,6],[1283,6],[1515,6],[1567,8],[1824,6],[2131,8],[2193,9],[2588,7],[2761,6],[3286,6],[3549,10],[3581,8],[3643,9]]},"263":{"position":[[149,6],[215,8]]},"265":{"position":[[555,6],[757,6],[1083,6],[1152,6],[1366,6],[1418,8],[1657,6],[1957,8],[2021,9],[2357,7],[2524,6],[3043,6],[3306,10],[3337,8],[3401,9]]},"267":{"position":[[5,6],[301,6],[437,8]]},"269":{"position":[[796,6],[998,6],[1324,6],[1393,6],[1607,6],[1659,8],[1898,6],[2200,8],[2264,9],[2690,7],[2857,6],[3376,6],[3639,10],[3672,8],[3736,9]]},"271":{"position":[[98,7],[212,7]]},"273":{"position":[[59,7]]},"275":{"position":[[12,7]]},"277":{"position":[[870,6],[1072,6],[1398,6],[1467,6],[1716,6],[2410,7],[2577,6],[3096,6],[3359,10]]},"281":{"position":[[606,6],[805,6],[1131,6],[1197,6],[1437,6],[2131,7],[2295,6],[2811,6],[3074,10]]},"285":{"position":[[621,6],[826,6],[1152,6],[1224,6],[1482,6],[2174,7],[2344,6],[2866,6],[3129,10]]},"287":{"position":[[151,6]]},"291":{"position":[[82,6],[148,8],[798,6],[1001,6],[1327,6],[1397,6],[1614,6],[1666,8],[1908,6],[2242,8],[2266,9],[2668,7],[2836,6],[3356,6],[3619,10],[3683,8],[3707,9]]},"295":{"position":[[638,6],[839,6],[1165,6],[1233,6],[1479,6],[2146,7],[2312,6],[2830,6],[3093,10]]},"297":{"position":[[499,7],[536,7],[608,7],[735,6],[837,6],[917,6],[1066,6]]},"301":{"position":[[1109,6],[1310,6],[1636,6],[1704,6],[1950,6],[2699,7],[2865,6],[3383,6],[3646,10]]},"303":{"position":[[3122,7]]},"305":{"position":[[652,6],[855,6],[1181,6],[1251,6],[1503,6],[2296,7],[2464,6],[2984,6],[3247,10]]},"311":{"position":[[1440,10]]},"313":{"position":[[5,6],[337,7],[462,6]]},"315":{"position":[[288,6]]},"317":{"position":[[630,6],[834,6],[1160,6],[1231,6],[1486,6],[2269,7],[2438,6],[2959,6],[3222,10]]},"319":{"position":[[230,6]]},"323":{"position":[[83,6],[149,8]]},"325":{"position":[[874,9],[1083,9],[1313,9],[2041,6],[2243,6],[2569,6],[2638,6],[2852,6],[2904,8],[3143,6],[3468,8],[3492,9],[3901,7],[4068,6],[4587,6],[4850,10],[4906,8],[4930,9]]},"329":{"position":[[525,6],[724,6],[1050,6],[1116,6],[1356,6],[2001,7],[2165,6],[2681,6],[2944,10]]},"333":{"position":[[502,6],[707,6],[1033,6],[1105,6],[1363,6],[2010,7],[2180,6],[2702,6],[2965,10]]},"337":{"position":[[44,7],[365,6],[447,6],[583,6]]},"341":{"position":[[570,6],[778,6],[1104,6],[1179,6],[1446,6],[2120,7],[2293,6],[2818,6],[3081,10]]},"343":{"position":[[1667,6],[4302,6]]},"345":{"position":[[747,6],[950,6],[1276,6],[1346,6],[1598,6],[2397,7],[2565,6],[3085,6],[3348,10]]},"347":{"position":[[64,6],[1280,6]]},"349":{"position":[[604,6],[808,6],[1134,6],[1205,6],[1460,6],[2152,7],[2321,6],[2842,6],[3105,10]]},"351":{"position":[[272,6],[665,6]]},"353":{"position":[[67,7],[177,6],[211,6],[358,6],[532,8],[581,6]]},"355":{"position":[[151,6],[348,6],[434,9]]},"357":{"position":[[4,8],[1011,7]]},"369":{"position":[[674,9]]},"376":{"position":[[127,7]]},"378":{"position":[[1217,7]]},"384":{"position":[[426,6],[890,6]]},"399":{"position":[[113,9]]},"415":{"position":[[198,6]]},"421":{"position":[[52,7]]},"425":{"position":[[886,7]]},"427":{"position":[[495,7]]},"429":{"position":[[0,6]]},"435":{"position":[[6,7],[1178,6],[1947,8],[2404,6]]},"447":{"position":[[324,6]]},"451":{"position":[[468,7]]},"457":{"position":[[120,6],[607,7],[768,6],[2266,8],[2572,6]]},"459":{"position":[[292,6],[475,8]]},"470":{"position":[[20,6]]},"472":{"position":[[1318,6],[1936,6]]},"476":{"position":[[1435,7]]},"488":{"position":[[697,7]]},"490":{"position":[[65,6],[449,7],[1059,7],[1155,9],[1197,7]]},"507":{"position":[[398,7],[670,8]]},"509":{"position":[[1461,10]]},"517":{"position":[[170,9]]},"530":{"position":[[50,6]]},"533":{"position":[[72,7],[351,7]]},"535":{"position":[[65,7],[152,8],[454,8]]},"543":{"position":[[868,7],[1044,6]]},"545":{"position":[[103,6]]},"549":{"position":[[1967,10]]},"551":{"position":[[107,7]]},"557":{"position":[[0,7],[1462,6],[1601,6],[1726,7],[1769,6],[3006,7],[3091,6],[3254,7],[4022,8]]},"559":{"position":[[64,7],[337,7],[855,6],[902,8],[967,7],[1630,7],[1824,9]]},"561":{"position":[[70,7]]},"563":{"position":[[40,8],[105,7],[768,7],[962,9]]},"565":{"position":[[105,7]]},"567":{"position":[[316,7]]},"569":{"position":[[328,7]]},"579":{"position":[[77,6],[131,6]]},"581":{"position":[[885,6],[987,6]]},"584":{"position":[[1124,6],[1210,8],[1641,6],[1901,6]]},"586":{"position":[[22,6],[431,7],[950,6]]},"588":{"position":[[57,6],[912,7],[1090,6]]},"590":{"position":[[943,7]]},"594":{"position":[[16,7],[59,6],[173,6],[653,6],[1116,6],[1187,6],[1303,6]]},"597":{"position":[[13,6],[181,6]]},"599":{"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]]},"616":{"position":[[421,6]]},"621":{"position":[[349,6]]},"623":{"position":[[421,8],[445,9],[689,10],[719,8],[743,9]]},"633":{"position":[[143,7],[789,7],[1984,6],[2142,7],[2320,7],[2623,6],[2651,6],[2888,7]]},"635":{"position":[[42,7],[110,8],[151,6],[237,6]]},"637":{"position":[[2,6],[19,6],[241,6],[348,7],[398,6],[440,6]]}}}],["source'",{"_index":691,"t":{"42":{"position":[[563,8]]},"164":{"position":[[79,8]]},"166":{"position":[[1410,8]]},"168":{"position":[[75,8],[487,8],[635,8]]},"182":{"position":[[814,8],[939,8]]},"200":{"position":[[914,8],[1039,8]]},"351":{"position":[[466,8]]},"357":{"position":[[861,8]]},"476":{"position":[[6301,8]]},"594":{"position":[[437,8]]},"597":{"position":[[74,8]]},"599":{"position":[[2528,8],[3419,8]]}}}],["source/cli",{"_index":83,"t":{"4":{"position":[[1576,13],[1775,13],[1794,14],[1979,13],[2194,13],[3200,14],[5715,13]]},"6":{"position":[[231,13]]},"16":{"position":[[501,13]]},"31":{"position":[[234,13],[293,13]]},"120":{"position":[[4,13],[124,13]]},"132":{"position":[[148,14]]},"134":{"position":[[194,14]]},"176":{"position":[[84,14],[204,13]]},"369":{"position":[[96,13]]},"384":{"position":[[143,13],[354,13]]},"415":{"position":[[114,13]]},"421":{"position":[[106,13],[408,14]]},"427":{"position":[[360,13]]},"439":{"position":[[76,14]]},"472":{"position":[[1034,13],[1245,13]]},"517":{"position":[[25,13],[102,13]]},"524":{"position":[[313,13],[354,13]]},"569":{"position":[[286,13]]},"621":{"position":[[105,14],[154,13],[236,13],[274,13]]},"623":{"position":[[22,13],[348,13],[632,13],[1019,13],[1131,13]]}}}],["source/client'",{"_index":224,"t":{"4":{"position":[[6166,15]]},"384":{"position":[[304,15]]},"472":{"position":[[1195,15]]}}}],["source/config",{"_index":406,"t":{"16":{"position":[[416,13]]}}}],["source_koito_en",{"_index":2014,"t":{"220":{"position":[[628,19]]}}}],["source_koito_id",{"_index":2012,"t":{"220":{"position":[[482,15],[577,15]]}}}],["source_koito_nam",{"_index":2013,"t":{"220":{"position":[[543,17]]}}}],["source_koito_token",{"_index":2016,"t":{"220":{"position":[[741,18]]}}}],["source_koito_url",{"_index":2015,"t":{"220":{"position":[[692,16]]}}}],["source_koito_us",{"_index":2017,"t":{"220":{"position":[[807,17]]}}}],["source_lastfm_api_key",{"_index":2112,"t":{"269":{"position":[[341,21]]}}}],["source_lastfm_api_key=my_api_key_placedhold",{"_index":3183,"t":{"557":{"position":[[3699,45]]}}}],["source_lastfm_en",{"_index":2111,"t":{"269":{"position":[[276,20]]}}}],["source_lastfm_id",{"_index":2109,"t":{"269":{"position":[[127,16],[224,16]]}}}],["source_lastfm_id=mylfmsourc",{"_index":3186,"t":{"557":{"position":[[3863,28]]}}}],["source_lastfm_nam",{"_index":2110,"t":{"269":{"position":[[189,18]]}}}],["source_lastfm_redirect_uri",{"_index":2114,"t":{"269":{"position":[[493,26]]}}}],["source_lastfm_redirect_uri=http://192.168.0.100:9078/lastfm/callback",{"_index":3185,"t":{"557":{"position":[[3792,68]]}}}],["source_lastfm_secret",{"_index":2113,"t":{"269":{"position":[[418,20]]}}}],["source_lastfm_secret=my_secret_placehold",{"_index":3184,"t":{"557":{"position":[[3747,42]]}}}],["source_lastfm_sess",{"_index":2115,"t":{"269":{"position":[[599,21]]}}}],["source_librefm_api_key",{"_index":2090,"t":{"257":{"position":[[345,22]]}}}],["source_librefm_en",{"_index":2089,"t":{"257":{"position":[[279,21]]}}}],["source_librefm_id",{"_index":2087,"t":{"257":{"position":[[127,17],[226,17]]}}}],["source_librefm_nam",{"_index":2088,"t":{"257":{"position":[[190,19]]}}}],["source_librefm_redirect_uri",{"_index":2092,"t":{"257":{"position":[[478,27]]}}}],["source_librefm_secret",{"_index":2091,"t":{"257":{"position":[[412,21]]}}}],["source_librefm_sess",{"_index":2093,"t":{"257":{"position":[[586,22]]}}}],["source_librefm_urlbas",{"_index":2094,"t":{"257":{"position":[[672,22]]}}}],["source_lz_en",{"_index":2098,"t":{"261":{"position":[[264,16]]}}}],["source_lz_id",{"_index":2096,"t":{"261":{"position":[[127,12],[216,12]]}}}],["source_lz_nam",{"_index":2097,"t":{"261":{"position":[[185,14]]}}}],["source_lz_token",{"_index":2100,"t":{"261":{"position":[[434,15]]}}}],["source_lz_url",{"_index":2099,"t":{"261":{"position":[[325,13]]}}}],["source_lz_us",{"_index":2101,"t":{"261":{"position":[[497,14]]}}}],["source_maloja_api_key",{"_index":2107,"t":{"265":{"position":[[388,21]]}}}],["source_maloja_en",{"_index":2105,"t":{"265":{"position":[[276,20]]}}}],["source_maloja_id",{"_index":2103,"t":{"265":{"position":[[127,16],[224,16]]}}}],["source_maloja_nam",{"_index":2104,"t":{"265":{"position":[[189,18]]}}}],["source_maloja_url",{"_index":2106,"t":{"265":{"position":[[341,17]]}}}],["source_rocksky_en",{"_index":2181,"t":{"291":{"position":[[436,21]]}}}],["source_rocksky_handl",{"_index":2183,"t":{"291":{"position":[[596,21]]}}}],["source_rocksky_id",{"_index":2179,"t":{"291":{"position":[[284,17],[383,17]]}}}],["source_rocksky_key",{"_index":2182,"t":{"291":{"position":[[502,18]]}}}],["source_rocksky_nam",{"_index":2180,"t":{"291":{"position":[[347,19]]}}}],["source_scrobble_duration=40",{"_index":1664,"t":{"166":{"position":[[1732,27]]}}}],["source_scrobble_percent=20",{"_index":1665,"t":{"166":{"position":[[1760,26]]}}}],["source_sot",{"_index":3390,"t":{"599":{"position":[[833,10]]}}}],["source_sot.histori",{"_index":3393,"t":{"599":{"position":[[1111,19]]}}}],["source_tealfm_app_pw",{"_index":2364,"t":{"325":{"position":[[1855,20]]}}}],["source_tealfm_en",{"_index":2362,"t":{"325":{"position":[[1725,20]]}}}],["source_tealfm_id",{"_index":2360,"t":{"325":{"position":[[1576,16],[1673,16]]}}}],["source_tealfm_identifi",{"_index":2363,"t":{"325":{"position":[[1790,24]]}}}],["source_tealfm_nam",{"_index":2361,"t":{"325":{"position":[[1638,18]]}}}],["sourceaioconfig",{"_index":3267,"t":{"584":{"position":[[1547,15]]}}}],["sourceconfig",{"_index":3265,"t":{"584":{"position":[[1467,12]]}}}],["sourcedata",{"_index":3366,"t":{"594":{"position":[[1579,11],[1861,12]]}}}],["sourcedefault",{"_index":167,"t":{"4":{"position":[[4565,17]]},"588":{"position":[[1182,14]]}}}],["sources.0.json",{"_index":3083,"t":{"535":{"position":[[416,14]]}}}],["sources.1.json",{"_index":3085,"t":{"535":{"position":[[602,14]]}}}],["sources.json",{"_index":3081,"t":{"535":{"position":[[357,12],[543,12]]}}}],["sources/cli",{"_index":106,"t":{"4":{"position":[[2280,15],[3782,16],[4161,15],[4244,15],[5802,15]]},"16":{"position":[[294,15]]},"18":{"position":[[869,16]]},"25":{"position":[[78,15]]},"29":{"position":[[41,15]]},"132":{"position":[[290,16]]},"347":{"position":[[373,15]]},"384":{"position":[[90,16]]},"472":{"position":[[121,16]]},"567":{"position":[[445,15]]},"621":{"position":[[490,16]]},"651":{"position":[[49,15]]}}}],["sourcetyp",{"_index":3270,"t":{"584":{"position":[[1753,10],[1812,12],[1825,12]]},"588":{"position":[[621,10],[635,12],[657,12]]}}}],["space",{"_index":458,"t":{"18":{"position":[[1480,5]]},"412":{"position":[[249,6],[425,6]]},"457":{"position":[[2006,5]]}}}],["speaker",{"_index":2229,"t":{"301":{"position":[[486,7]]}}}],["spec",{"_index":815,"t":{"54":{"position":[[397,5]]}}}],["special",{"_index":2310,"t":{"311":{"position":[[50,7]]},"325":{"position":[[494,7]]},"397":{"position":[[968,7]]},"481":{"position":[[1053,7]]}}}],["specif",{"_index":12,"t":{"4":{"position":[[86,8],[1674,8],[1706,8]]},"18":{"position":[[2914,12],[4770,13]]},"50":{"position":[[307,8]]},"54":{"position":[[200,8]]},"73":{"position":[[568,8],[3739,8],[3798,8]]},"87":{"position":[[581,8],[1009,8]]},"151":{"position":[[2533,8]]},"162":{"position":[[177,8]]},"174":{"position":[[325,8]]},"186":{"position":[[334,8]]},"188":{"position":[[2764,8]]},"196":{"position":[[1044,12]]},"216":{"position":[[968,8],[2205,8]]},"230":{"position":[[544,8]]},"244":{"position":[[312,8]]},"279":{"position":[[158,8]]},"303":{"position":[[1579,8]]},"307":{"position":[[840,8],[1045,8]]},"311":{"position":[[74,12],[110,8]]},"313":{"position":[[498,8]]},"327":{"position":[[773,8]]},"341":{"position":[[339,8],[419,8]]},"347":{"position":[[1036,12],[1255,12]]},"359":{"position":[[631,8],[693,8]]},"365":{"position":[[569,8]]},"374":{"position":[[25,8]]},"427":{"position":[[323,8],[340,9],[413,8]]},"451":{"position":[[294,8]]},"476":{"position":[[125,8]]},"481":{"position":[[1125,12]]},"608":{"position":[[202,8]]},"618":{"position":[[200,8]]},"633":{"position":[[2331,8]]}}}],["specifi",{"_index":72,"t":{"4":{"position":[[1198,9],[3368,9]]},"10":{"position":[[282,9],[437,7],[577,9]]},"89":{"position":[[529,9]]},"99":{"position":[[523,9]]},"101":{"position":[[57,7]]},"164":{"position":[[114,7]]},"174":{"position":[[615,7]]},"178":{"position":[[748,7]]},"188":{"position":[[1304,7],[1544,7]]},"232":{"position":[[339,7]]},"251":{"position":[[339,7]]},"273":{"position":[[97,7]]},"303":{"position":[[2413,7]]},"363":{"position":[[15,7],[115,10],[954,9],[1037,10]]},"365":{"position":[[775,10]]},"380":{"position":[[38,10]]},"397":{"position":[[348,9]]},"441":{"position":[[100,9]]},"470":{"position":[[40,10],[271,10]]},"476":{"position":[[3822,7]]},"503":{"position":[[244,7]]},"507":{"position":[[355,7]]},"543":{"position":[[1581,7],[1787,7],[1945,9]]},"545":{"position":[[588,7]]},"549":{"position":[[469,9]]},"555":{"position":[[252,7]]},"586":{"position":[[104,7]]},"627":{"position":[[1111,7]]},"647":{"position":[[181,9]]}}}],["speed",{"_index":346,"t":{"12":{"position":[[786,5]]},"372":{"position":[[92,5]]}}}],["spell",{"_index":2538,"t":{"351":{"position":[[637,7]]},"393":{"position":[[328,8]]}}}],["split",{"_index":2635,"t":{"376":{"position":[[252,6],[365,5],[436,5],[489,6]]}}}],["spot",{"_index":1569,"t":{"151":{"position":[[700,4]]}}}],["spotifi",{"_index":183,"t":{"4":{"position":[[4880,10],[4946,7]]},"8":{"position":[[1614,8]]},"10":{"position":[[100,7]]},"18":{"position":[[758,7],[932,7]]},"29":{"position":[[685,9]]},"60":{"position":[[528,8],[1308,9],[1910,7],[2167,11]]},"118":{"position":[[3263,7]]},"123":{"position":[[35,7],[68,7]]},"155":{"position":[[127,8]]},"157":{"position":[[824,7]]},"166":{"position":[[719,8]]},"174":{"position":[[157,7],[728,7],[1603,9],[2588,10],[2634,9]]},"178":{"position":[[330,7],[1082,7],[2377,9],[3535,10],[3581,9]]},"295":{"position":[[1876,9],[3222,9]]},"297":{"position":[[252,8]]},"303":{"position":[[0,7],[28,7],[67,7],[269,7],[380,7],[472,7],[575,7],[652,7],[788,8],[818,7],[860,7],[950,7],[1007,7],[1306,7],[1674,7],[1708,7],[1805,7],[1865,7],[2057,7],[2198,7],[2220,7],[2455,7],[2804,7],[2834,7],[3114,7],[3264,7],[3589,7],[3958,7],[4074,7],[4196,7],[4837,7],[5128,7],[5477,7]]},"305":{"position":[[342,7],[389,7],[470,7],[639,7],[847,7],[1188,7],[1269,7],[1495,7],[1821,9],[2263,7],[2456,7],[2976,7],[3295,9],[3521,9]]},"363":{"position":[[652,7]]},"449":{"position":[[198,7]]},"451":{"position":[[137,9]]},"459":{"position":[[1122,9]]},"463":{"position":[[26,9]]},"476":{"position":[[1894,8]]},"483":{"position":[[1447,8]]},"490":{"position":[[1113,8]]},"507":{"position":[[33,7],[89,8]]},"549":{"position":[[1604,8]]},"553":{"position":[[308,8]]},"557":{"position":[[105,7],[552,7],[587,7],[668,7],[1236,7]]},"559":{"position":[[984,7]]},"563":{"position":[[122,7]]},"584":{"position":[[1766,9],[1842,10]]},"633":{"position":[[420,7]]},"637":{"position":[[183,8]]},"647":{"position":[[252,7]]}}}],["spotify'",{"_index":1214,"t":{"105":{"position":[[2035,9]]}}}],["spotify.json",{"_index":1659,"t":{"166":{"position":[[1439,12]]},"507":{"position":[[958,12]]}}}],["spotify/jellyfin/etc",{"_index":2653,"t":{"378":{"position":[[1230,21]]}}}],["spotify/lastfm/listenbrainz",{"_index":1405,"t":{"120":{"position":[[1165,28]]}}}],["spotify_client_id",{"_index":2293,"t":{"305":{"position":[[317,17]]}}}],["spotify_client_id=h2uvgv8okrflv2ouoc1latk7xe5egdg",{"_index":1685,"t":{"174":{"position":[[763,50]]},"178":{"position":[[1117,50]]}}}],["spotify_client_id=yourclientid",{"_index":3169,"t":{"557":{"position":[[950,30]]}}}],["spotify_client_id=yourid",{"_index":67,"t":{"4":{"position":[[1067,24]]}}}],["spotify_client_secret",{"_index":2294,"t":{"305":{"position":[[360,21]]}}}],["spotify_client_secret=hvofe5ce2hdblne6vafbex6drvcddo43",{"_index":1686,"t":{"174":{"position":[[816,54]]},"178":{"position":[[1170,54]]}}}],["spotify_client_secret=yourclientsecret",{"_index":3170,"t":{"557":{"position":[[983,38]]}}}],["spotify_client_secret=yoursecret",{"_index":68,"t":{"4":{"position":[[1092,32]]}}}],["spotify_en",{"_index":2292,"t":{"305":{"position":[[258,14]]}}}],["spotify_id",{"_index":2290,"t":{"305":{"position":[[127,10],[212,10]]}}}],["spotify_id=foxxspotifi",{"_index":1684,"t":{"174":{"position":[[738,22]]},"178":{"position":[[1092,22]]}}}],["spotify_id=myspotifi",{"_index":3173,"t":{"557":{"position":[[1093,20]]}}}],["spotify_nam",{"_index":2291,"t":{"305":{"position":[[183,12]]}}}],["spotify_redirect_uri",{"_index":2268,"t":{"303":{"position":[[2867,20],[3305,20],[3999,20],[5169,20]]},"305":{"position":[[411,20]]}}}],["spotify_redirect_uri=https://multi",{"_index":3171,"t":{"557":{"position":[[1024,34]]}}}],["spotify_redirect_uri=https://multiscrobbler.example.com/callback",{"_index":1687,"t":{"174":{"position":[[873,64]]},"178":{"position":[[1227,64]]}}}],["spotify_secret",{"_index":276,"t":{"8":{"position":[[1659,14]]}}}],["spotify_transforms=musicbrainz",{"_index":3189,"t":{"559":{"position":[[1269,30]]},"563":{"position":[[407,30]]}}}],["spotifysourceaioconfig",{"_index":3268,"t":{"584":{"position":[[1565,22]]}}}],["spotifysourceconfig",{"_index":3266,"t":{"584":{"position":[[1482,19]]}}}],["sqlite",{"_index":391,"t":{"16":{"position":[[29,6]]},"604":{"position":[[29,6]]}}}],["squeez",{"_index":1574,"t":{"151":{"position":[[1251,8]]}}}],["squiggli",{"_index":765,"t":{"46":{"position":[[1072,8],[2589,8]]},"66":{"position":[[1569,8],[3102,8]]},"85":{"position":[[1328,8],[2819,8]]},"91":{"position":[[1237,8],[2820,8]]},"95":{"position":[[1010,8],[2501,8]]},"103":{"position":[[1335,8],[2881,8]]},"110":{"position":[[2260,8],[3816,8]]},"114":{"position":[[1128,8],[2713,8]]},"143":{"position":[[1623,8],[3114,8]]},"153":{"position":[[1379,8],[3200,8]]},"186":{"position":[[1142,8],[2695,8]]},"188":{"position":[[4275,8],[6223,8]]},"198":{"position":[[1163,8],[2714,8]]},"202":{"position":[[999,8],[2446,8]]},"208":{"position":[[1172,8],[2640,8]]},"214":{"position":[[1136,8],[2611,8]]},"218":{"position":[[1492,8],[2996,8]]},"220":{"position":[[1476,8],[3246,8]]},"234":{"position":[[1251,8],[2704,8]]},"253":{"position":[[1324,8],[2782,8]]},"257":{"position":[[1398,8],[3203,8]]},"261":{"position":[[1177,8],[3036,8]]},"265":{"position":[[1052,8],[2799,8]]},"269":{"position":[[1293,8],[3132,8]]},"277":{"position":[[1367,8],[2852,8]]},"281":{"position":[[1100,8],[2570,8]]},"285":{"position":[[1121,8],[2619,8]]},"291":{"position":[[1296,8],[3111,8]]},"295":{"position":[[1134,8],[2587,8]]},"301":{"position":[[1605,8],[3140,8]]},"305":{"position":[[1150,8],[2739,8]]},"317":{"position":[[1129,8],[2713,8]]},"325":{"position":[[2538,8],[4343,8]]},"329":{"position":[[1019,8],[2440,8]]},"333":{"position":[[1002,8],[2455,8]]},"341":{"position":[[1073,8],[2568,8]]},"345":{"position":[[1245,8],[2840,8]]},"349":{"position":[[1103,8],[2596,8]]}}}],["src/backend/common/infrastructure/atomic.t",{"_index":3269,"t":{"584":{"position":[[1697,43]]}}}],["src/backend/common/infrastructure/config/source/coolplayer.t",{"_index":3245,"t":{"584":{"position":[[164,62]]}}}],["src/backend/common/infrastructure/config/source/sources.t",{"_index":3260,"t":{"584":{"position":[[1219,58]]}}}],["src/backend/index.t",{"_index":2775,"t":{"431":{"position":[[95,20]]}}}],["src/backend/sources/coolplayersource.t",{"_index":3314,"t":{"590":{"position":[[139,39]]},"592":{"position":[[283,39],[1469,39],[2107,39]]},"594":{"position":[[1496,39]]},"597":{"position":[[292,39]]},"599":{"position":[[784,39]]}}}],["src/backend/sources/mybasicsource.t",{"_index":3401,"t":{"599":{"position":[[2764,36],[3436,36]]}}}],["src/backend/sources/scrobblesources.t",{"_index":3289,"t":{"588":{"position":[[255,38]]}}}],["src/backend/sources/spotifysource.t",{"_index":3274,"t":{"586":{"position":[[127,36]]}}}],["src/index.j",{"_index":3162,"t":{"549":{"position":[[1910,12]]}}}],["src/service/api.t",{"_index":3395,"t":{"599":{"position":[[1422,18]]}}}],["ssl",{"_index":2052,"t":{"232":{"position":[[576,3]]},"251":{"position":[[581,3]]},"303":{"position":[[2592,3]]}}}],["stabl",{"_index":3425,"t":{"612":{"position":[[33,7],[189,6]]},"614":{"position":[[58,6],[506,6]]},"633":{"position":[[1544,6]]}}}],["stack",{"_index":378,"t":{"14":{"position":[[542,6]]},"73":{"position":[[644,5],[1395,5],[1470,5],[2749,6]]},"77":{"position":[[69,5],[1348,6]]},"293":{"position":[[1101,5]]},"543":{"position":[[2395,5]]}}}],["stage",{"_index":933,"t":{"64":{"position":[[3417,5]]},"83":{"position":[[3242,5]]},"134":{"position":[[145,6],[310,5]]},"151":{"position":[[2336,5],[2453,6],[2498,5]]},"178":{"position":[[1391,5]]},"311":{"position":[[303,5]]},"359":{"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]]},"361":{"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]]},"363":{"position":[[5,5],[161,5],[737,6],[767,5],[971,5],[1095,6]]},"365":{"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]]},"367":{"position":[[0,6],[44,6],[457,5],[1172,5],[1252,5],[1435,5],[1509,5]]},"369":{"position":[[21,5],[197,5],[338,5],[527,5],[568,6]]},"372":{"position":[[61,6],[284,6]]},"374":{"position":[[34,5],[73,5],[86,5],[104,5]]},"376":{"position":[[11,5],[102,5],[677,5]]},"378":{"position":[[25,5]]},"382":{"position":[[54,5],[223,6],[438,5]]},"384":{"position":[[180,5],[207,5],[856,5]]},"387":{"position":[[161,5],[240,5]]},"391":{"position":[[171,5],[229,6]]},"393":{"position":[[9,5],[112,5],[383,5]]},"395":{"position":[[4,5],[154,5],[352,6],[411,5],[555,6]]},"425":{"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]]},"459":{"position":[[16,5],[213,5],[461,5]]},"466":{"position":[[165,5]]},"468":{"position":[[83,5]]},"470":{"position":[[9,5],[232,5],[868,5]]},"472":{"position":[[256,5],[1071,5],[1098,5],[1902,5]]},"476":{"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]]},"483":{"position":[[2414,5]]},"486":{"position":[[126,6]]},"488":{"position":[[27,5]]},"496":{"position":[[406,6],[465,6],[523,6]]},"505":{"position":[[12,5],[106,5]]},"507":{"position":[[332,5],[414,5]]},"509":{"position":[[135,5]]},"584":{"position":[[402,6],[2074,6]]},"592":{"position":[[27,6],[122,6],[1462,6],[2100,6]]}}}],["stage/rul",{"_index":2585,"t":{"367":{"position":[[392,10]]}}}],["stale",{"_index":2328,"t":{"315":{"position":[[499,5]]},"439":{"position":[[889,6]]}}}],["stale/disappear",{"_index":1655,"t":{"166":{"position":[[823,16]]}}}],["stand",{"_index":2657,"t":{"384":{"position":[[268,6]]},"472":{"position":[[1159,6]]}}}],["standalon",{"_index":2704,"t":{"415":{"position":[[273,10]]}}}],["standard",{"_index":1183,"t":{"105":{"position":[[360,12]]},"138":{"position":[[358,12]]},"149":{"position":[[784,8]]},"151":{"position":[[1092,8]]},"178":{"position":[[285,13]]},"200":{"position":[[90,8]]},"206":{"position":[[348,8]]},"212":{"position":[[344,8]]},"224":{"position":[[322,8],[463,8],[868,8],[1778,8],[2866,8],[3058,8]]},"232":{"position":[[52,8]]},"234":{"position":[[383,8]]},"238":{"position":[[312,8],[454,8],[857,8],[1763,8],[2822,8],[3011,8]]},"240":{"position":[[340,8]]},"244":{"position":[[146,8]]},"251":{"position":[[52,8]]},"253":{"position":[[376,8]]},"271":{"position":[[72,8],[89,8],[701,8]]},"293":{"position":[[11,8]]},"359":{"position":[[416,11]]},"427":{"position":[[22,8],[156,8]]},"459":{"position":[[233,13]]},"549":{"position":[[934,12]]},"590":{"position":[[118,8]]},"594":{"position":[[2268,8]]},"629":{"position":[[16,8]]},"633":{"position":[[2372,11]]}}}],["start",{"_index":70,"t":{"4":{"position":[[1133,5]]},"27":{"position":[[93,7]]},"54":{"position":[[947,8],[1002,7],[1175,8]]},"60":{"position":[[1541,5]]},"64":{"position":[[1207,6]]},"73":{"position":[[6029,5],[7586,5]]},"83":{"position":[[1066,6]]},"93":{"position":[[270,5]]},"105":{"position":[[852,5]]},"118":{"position":[[3219,7]]},"138":{"position":[[850,5]]},"143":{"position":[[80,8]]},"147":{"position":[[465,6]]},"149":{"position":[[1426,8]]},"171":{"position":[[263,8]]},"196":{"position":[[107,5],[858,5]]},"218":{"position":[[492,5],[613,5],[733,5],[851,5]]},"273":{"position":[[231,5],[452,5]]},"277":{"position":[[466,6],[576,6]]},"295":{"position":[[370,5],[478,5]]},"303":{"position":[[527,8],[1897,5],[2259,6],[5056,8],[5391,5],[5493,5]]},"327":{"position":[[737,8]]},"343":{"position":[[2804,5],[3513,5],[4595,5],[4939,5],[5454,5]]},"397":{"position":[[714,6]]},"417":{"position":[[432,5]]},"425":{"position":[[157,6]]},"457":{"position":[[2916,5]]},"524":{"position":[[154,8]]},"545":{"position":[[18,5]]},"549":{"position":[[313,5],[2308,5]]},"557":{"position":[[1127,8],[3905,8]]},"565":{"position":[[2028,5]]},"567":{"position":[[200,5]]},"573":{"position":[[389,5]]},"575":{"position":[[113,5],[268,5]]},"588":{"position":[[8,6]]},"597":{"position":[[60,6]]},"625":{"position":[[911,7],[1358,5],[1432,5]]},"627":{"position":[[410,8]]},"633":{"position":[[1330,5],[2903,8]]},"641":{"position":[[14,5]]}}}],["startup",{"_index":1403,"t":{"120":{"position":[[1123,7]]},"343":{"position":[[2836,7]]},"421":{"position":[[315,9]]},"425":{"position":[[1560,7]]},"597":{"position":[[603,7]]},"616":{"position":[[176,7]]},"625":{"position":[[1070,8]]},"647":{"position":[[218,7]]}}}],["stat",{"_index":1457,"t":{"138":{"position":[[1950,5]]},"200":{"position":[[1737,6],[1886,6],[2133,6]]},"633":{"position":[[1031,6]]}}}],["state",{"_index":826,"t":{"54":{"position":[[725,5]]},"118":{"position":[[2377,7]]},"160":{"position":[[754,5],[934,5]]},"315":{"position":[[129,5]]},"535":{"position":[[850,5]]},"581":{"position":[[553,5]]},"584":{"position":[[2127,5]]},"594":{"position":[[227,5],[552,5],[962,5],[1092,5],[1201,5],[1921,5],[2284,5],[2463,5],[2587,5],[2601,5],[2649,5]]},"599":{"position":[[46,5],[676,5],[1570,5]]}}}],["stateless",{"_index":573,"t":{"27":{"position":[[1474,9],[1704,9]]}}}],["statement",{"_index":3296,"t":{"588":{"position":[[595,9]]}}}],["static",{"_index":3312,"t":{"590":{"position":[[21,6],[600,6]]},"592":{"position":[[440,6]]}}}],["static_config",{"_index":628,"t":{"31":{"position":[[732,15]]}}}],["station",{"_index":1781,"t":{"184":{"position":[[0,7],[24,7],[86,7],[169,8],[248,7],[343,7],[396,7],[433,7],[448,7],[529,8],[626,7],[771,9],[803,9],[926,7],[941,7],[961,7],[1057,7],[1163,7],[1361,7]]},"186":{"position":[[343,7],[1841,9],[1907,10],[1922,7],[3271,9],[3337,10],[3352,7]]},"200":{"position":[[32,7],[568,8]]},"202":{"position":[[1645,8],[2977,8]]}}}],["station'",{"_index":1791,"t":{"184":{"position":[[1148,9]]}}}],["statist",{"_index":3205,"t":{"567":{"position":[[516,10]]},"647":{"position":[[19,11]]}}}],["statu",{"_index":538,"t":{"25":{"position":[[2,6]]},"29":{"position":[[249,6],[321,6]]},"42":{"position":[[579,6],[642,6]]},"54":{"position":[[1577,6],[1620,6]]},"60":{"position":[[407,6],[552,7],[627,7],[694,6]]},"62":{"position":[[79,6]]},"64":{"position":[[54,7],[189,6],[3682,6]]},"81":{"position":[[103,6]]},"83":{"position":[[54,7],[3474,6]]},"168":{"position":[[496,6]]},"182":{"position":[[823,6],[1326,6]]},"200":{"position":[[923,6]]},"439":{"position":[[682,6]]},"441":{"position":[[129,6]]},"481":{"position":[[633,6],[1403,6]]},"567":{"position":[[474,6],[577,6]]},"633":{"position":[[779,6]]},"647":{"position":[[2,6],[341,6],[365,6]]}}}],["status",{"_index":950,"t":{"66":{"position":[[769,8]]}}}],["statusoverrideallow",{"_index":874,"t":{"60":{"position":[[1045,22]]}}}],["stdout/stderr",{"_index":3495,"t":{"647":{"position":[[148,13]]}}}],["step",{"_index":418,"t":{"18":{"position":[[322,4],[981,5],[1944,5],[2015,5],[2068,4]]},"50":{"position":[[316,5]]},"57":{"position":[[800,6]]},"73":{"position":[[3663,5]]},"147":{"position":[[628,5]]},"149":{"position":[[1001,5]]},"216":{"position":[[1460,5],[1534,5]]},"232":{"position":[[105,5]]},"251":{"position":[[105,5]]},"303":{"position":[[978,5],[1066,5],[4147,4],[5070,4]]},"372":{"position":[[127,5]]},"435":{"position":[[1380,5]]},"474":{"position":[[232,6],[367,5]]},"476":{"position":[[814,4]]},"557":{"position":[[457,4]]},"559":{"position":[[192,4],[277,4],[1638,4]]},"561":{"position":[[10,4]]},"563":{"position":[[776,4]]},"579":{"position":[[29,4],[37,4]]},"608":{"position":[[188,5]]},"610":{"position":[[397,5]]}}}],["stick",{"_index":24,"t":{"4":{"position":[[269,5]]}}}],["still",{"_index":32,"t":{"4":{"position":[[451,5]]},"40":{"position":[[229,5]]},"60":{"position":[[1698,5]]},"130":{"position":[[137,5]]},"134":{"position":[[173,5]]},"138":{"position":[[1639,5],[1671,5]]},"151":{"position":[[2349,5]]},"188":{"position":[[1461,5]]},"224":{"position":[[2676,5]]},"230":{"position":[[790,5]]},"238":{"position":[[2649,5]]},"275":{"position":[[258,5]]},"303":{"position":[[850,5]]},"335":{"position":[[801,5]]},"389":{"position":[[157,7]]},"395":{"position":[[134,5]]},"483":{"position":[[2008,5]]},"488":{"position":[[102,5]]},"494":{"position":[[199,5],[353,5]]},"503":{"position":[[79,5]]},"551":{"position":[[70,5]]},"599":{"position":[[401,5],[1548,5]]},"616":{"position":[[779,5]]},"625":{"position":[[1415,5]]},"633":{"position":[[2778,5]]}}}],["stop",{"_index":556,"t":{"27":{"position":[[137,7]]},"40":{"position":[[187,5]]},"160":{"position":[[769,8]]},"174":{"position":[[1514,7]]},"178":{"position":[[1680,7]]},"315":{"position":[[890,6],[962,7]]},"343":{"position":[[128,4]]},"347":{"position":[[560,7],[880,7]]},"365":{"position":[[69,4],[343,5],[1430,7]]},"384":{"position":[[1080,7]]},"425":{"position":[[221,5]]},"441":{"position":[[342,7]]},"472":{"position":[[2160,7]]},"505":{"position":[[898,7]]},"545":{"position":[[1096,7]]},"555":{"position":[[524,7]]},"594":{"position":[[2093,9]]}}}],["storag",{"_index":77,"t":{"4":{"position":[[1379,7],[3567,7]]},"18":{"position":[[9,7],[1472,7]]},"27":{"position":[[1499,7],[1815,7]]},"105":{"position":[[557,8]]},"138":{"position":[[555,8]]},"147":{"position":[[292,7]]},"192":{"position":[[630,7]]},"543":{"position":[[0,7]]}}}],["store",{"_index":325,"t":{"12":{"position":[[120,5],[203,5],[886,6],[1199,5],[1413,6]]},"14":{"position":[[18,5],[85,5],[141,5],[422,6]]},"16":{"position":[[86,6],[268,6]]},"18":{"position":[[59,6],[330,7],[1422,6],[3524,6],[3788,5],[3892,5],[4023,6]]},"33":{"position":[[32,6]]},"105":{"position":[[279,6],[437,7],[1761,5]]},"138":{"position":[[157,6],[277,6],[435,7]]},"192":{"position":[[48,5]]},"425":{"position":[[1212,5],[1322,6],[3139,5]]},"427":{"position":[[57,5],[176,7]]},"535":{"position":[[728,7]]},"543":{"position":[[122,7]]},"565":{"position":[[26,5]]},"604":{"position":[[86,6]]},"625":{"position":[[518,6]]},"639":{"position":[[32,6]]}}}],["stored/avail",{"_index":2344,"t":{"319":{"position":[[136,16]]}}}],["straightforward",{"_index":1395,"t":{"120":{"position":[[387,15]]},"171":{"position":[[406,15]]}}}],["strang",{"_index":1998,"t":{"216":{"position":[[3254,7]]}}}],["strategi",{"_index":2629,"t":{"372":{"position":[[175,8]]}}}],["stream",{"_index":879,"t":{"60":{"position":[[1574,11]]},"73":{"position":[[4185,6],[4324,6],[4591,6],[4730,6]]},"186":{"position":[[473,7]]},"200":{"position":[[40,9],[153,6],[180,7],[1649,6]]},"202":{"position":[[348,6]]}}}],["streamtitl",{"_index":1903,"t":{"200":{"position":[[238,13]]}}}],["strict",{"_index":1575,"t":{"151":{"position":[[1338,6]]}}}],["strictli",{"_index":1565,"t":{"151":{"position":[[561,8]]}}}],["string",{"_index":262,"t":{"8":{"position":[[1272,6],[1479,6]]},"14":{"position":[[870,6],[921,6]]},"46":{"position":[[136,6],[192,6],[319,6],[363,6],[421,6]]},"66":{"position":[[138,6],[196,6],[272,6],[354,6],[561,6],[720,6],[841,6]]},"85":{"position":[[138,6],[196,6],[281,6],[325,6],[588,6]]},"91":{"position":[[137,6],[194,6],[328,6],[397,6],[471,6],[565,6]]},"95":{"position":[[137,6],[194,6],[324,6],[368,6]]},"103":{"position":[[138,6],[196,6],[333,6],[392,6],[457,6],[553,6],[632,6]]},"110":{"position":[[1190,6],[1248,6],[1381,6],[1470,6],[1582,6]]},"114":{"position":[[133,6],[186,6],[304,6],[408,6],[463,6]]},"118":{"position":[[210,6],[389,7],[418,6],[442,6],[469,6],[493,6],[520,6],[612,7],[756,6],[801,6],[856,6],[906,6],[967,7],[1246,6],[1374,7],[4989,6]]},"136":{"position":[[1223,7]]},"143":{"position":[[713,6],[770,6],[907,6],[961,6]]},"149":{"position":[[1579,6],[2286,6],[3841,7]]},"153":{"position":[[141,6],[202,6],[347,6],[373,6],[398,6],[433,6],[457,6],[489,6]]},"186":{"position":[[136,6],[192,6],[323,6],[372,6],[424,6],[501,6]]},"188":{"position":[[2249,6],[2308,6],[2445,6],[2538,6],[2606,6],[2656,6],[2731,6],[2865,6],[2952,6],[3012,7],[3074,6],[3136,7],[3200,6],[3246,6],[3309,6],[3357,7],[3427,6],[3590,6]]},"198":{"position":[[137,6],[194,6],[324,6],[391,6],[467,6]]},"200":{"position":[[231,6]]},"202":{"position":[[138,6],[196,6],[329,6]]},"208":{"position":[[137,6],[194,6],[324,6],[419,6],[499,6]]},"214":{"position":[[135,6],[190,6],[314,6],[403,6],[474,6]]},"218":{"position":[[228,6],[281,6],[413,6],[537,6],[655,6],[775,6]]},"220":{"position":[[498,6],[561,6],[709,6],[760,6],[825,6]]},"222":{"position":[[521,7]]},"234":{"position":[[134,6],[188,6],[310,6],[499,6],[572,6]]},"253":{"position":[[134,6],[188,6],[310,6],[489,6],[642,6]]},"257":{"position":[[145,6],[210,6],[368,6],[434,6],[506,6],[609,6],[695,6]]},"261":{"position":[[140,6],[200,6],[339,6],[450,6],[512,6]]},"265":{"position":[[144,6],[208,6],[359,6],[410,6]]},"269":{"position":[[144,6],[208,6],[363,6],[439,6],[520,6],[621,6]]},"273":{"position":[[212,6],[312,7]]},"275":{"position":[[315,7]]},"277":{"position":[[137,6],[194,6],[324,6],[426,6],[491,8],[538,6],[601,8],[649,6],[719,6]]},"281":{"position":[[134,6],[188,6],[309,6],[385,6]]},"285":{"position":[[133,6],[186,6],[304,6],[406,6]]},"291":{"position":[[302,6],[367,6],[521,6],[618,6]]},"295":{"position":[[136,6],[192,6],[325,6],[435,6]]},"301":{"position":[[261,6],[317,6],[445,6],[524,6],[569,7],[628,6],[675,7],[733,6],[816,7],[874,6],[959,7]]},"305":{"position":[[138,6],[196,6],[335,6],[382,6],[432,6]]},"317":{"position":[[139,6],[198,6],[335,6],[397,6],[467,6]]},"325":{"position":[[1593,6],[1657,6],[1815,6],[1876,6]]},"329":{"position":[[134,6],[188,6],[309,6],[385,6]]},"333":{"position":[[136,6],[192,6],[319,6]]},"341":{"position":[[133,6],[186,6],[310,6],[385,6]]},"343":{"position":[[3693,6]]},"345":{"position":[[134,6],[188,6],[318,6],[405,6],[475,6],[542,6]]},"349":{"position":[[139,6],[198,6],[334,6],[434,6]]},"351":{"position":[[119,7]]},"359":{"position":[[325,6]]},"361":{"position":[[1414,6]]},"367":{"position":[[176,6]]},"376":{"position":[[208,6],[277,6]]},"378":{"position":[[74,6],[219,6],[386,7],[444,6],[765,7],[1162,6],[1334,7],[1388,7]]},"397":{"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]]},"399":{"position":[[456,6]]},"412":{"position":[[24,6],[69,7],[118,6]]},"423":{"position":[[183,6]]},"425":{"position":[[569,6]]},"449":{"position":[[75,6]]},"476":{"position":[[3676,6],[3771,7],[4316,6],[4673,6],[4708,6],[4750,6],[5201,7],[5366,7],[5409,7]]},"490":{"position":[[628,7]]},"584":{"position":[[749,6],[861,6]]},"592":{"position":[[471,7],[781,6],[906,8],[1057,8],[1737,6],[1916,6]]},"616":{"position":[[709,6]]},"627":{"position":[[745,6],[818,7]]}}}],["strip",{"_index":1585,"t":{"151":{"position":[[2110,6],[2309,9],[2365,9],[2512,5]]}}}],["strong",{"_index":2884,"t":{"459":{"position":[[340,6]]}}}],["strongli",{"_index":371,"t":{"14":{"position":[[286,8]]}}}],["structur",{"_index":113,"t":{"4":{"position":[[2497,10]]},"46":{"position":[[495,9],[523,9],[836,10],[1476,10],[1903,9],[1931,9],[2354,10],[2872,10]]},"66":{"position":[[988,9],[1016,9],[1333,10],[1981,10],[2412,9],[2440,9],[2867,10],[3387,10]]},"85":{"position":[[747,9],[775,9],[1092,10],[1740,10],[2129,9],[2157,9],[2584,10],[3104,10]]},"91":{"position":[[658,9],[686,9],[1001,10],[1645,10],[2132,9],[2160,9],[2585,10],[3104,10]]},"95":{"position":[[431,9],[459,9],[774,10],[1418,10],[1813,9],[1841,9],[2266,10],[2785,10]]},"103":{"position":[[754,9],[782,9],[1099,10],[1747,10],[2191,9],[2219,9],[2646,10],[3166,10]]},"105":{"position":[[1140,9],[1189,9]]},"110":{"position":[[1679,9],[1707,9],[2024,10],[2672,10],[3126,9],[3154,9],[3581,10],[4101,10]]},"114":{"position":[[537,9],[565,9],[892,10],[1560,10],[2013,9],[2041,9],[2478,10],[3003,10]]},"138":{"position":[[1138,9],[1187,9]]},"143":{"position":[[1044,9],[1072,9],[1387,10],[2031,10],[2426,9],[2454,9],[2879,10],[3398,10]]},"153":{"position":[[792,9],[820,9],[1143,10],[1803,10],[2504,9],[2532,9],[2965,10],[3488,10]]},"186":{"position":[[557,9],[585,9],[906,10],[1562,10],[2001,9],[2029,9],[2460,10],[2982,10]]},"188":{"position":[[3692,9],[3720,9],[4039,10],[4691,10],[5531,9],[5559,9],[5988,10],[6509,10]]},"198":{"position":[[584,9],[612,9],[927,10],[1571,10],[2026,9],[2054,9],[2479,10],[2998,10]]},"202":{"position":[[418,9],[446,9],[763,10],[1411,10],[1756,9],[1784,9],[2211,10],[2731,10]]},"208":{"position":[[593,9],[621,9],[936,10],[1580,10],[1952,9],[1980,9],[2405,10],[2924,10]]},"214":{"position":[[561,9],[589,9],[900,10],[1536,10],[1927,9],[1955,9],[2376,10],[2893,10]]},"218":{"position":[[905,9],[933,9],[1256,10],[1916,10],[2300,9],[2328,9],[2761,10],[3284,10]]},"220":{"position":[[899,9],[927,9],[1240,10],[2133,10],[2560,9],[2588,9],[3011,10],[3529,10]]},"226":{"position":[[229,9]]},"234":{"position":[[662,9],[690,9],[1015,10],[1679,10],[2006,9],[2034,9],[2469,10],[2993,10]]},"253":{"position":[[737,9],[765,9],[1088,10],[1748,10],[2086,9],[2114,9],[2547,10],[3070,10]]},"257":{"position":[[817,9],[845,9],[1162,10],[2069,10],[2513,9],[2541,9],[2968,10],[3488,10]]},"261":{"position":[[586,9],[614,9],[941,10],[1883,10],[2336,9],[2364,9],[2801,10],[3326,10]]},"265":{"position":[[473,9],[501,9],[816,10],[1716,10],[2111,9],[2139,9],[2564,10],[3083,10]]},"269":{"position":[[714,9],[742,9],[1057,10],[1957,10],[2444,9],[2472,9],[2897,10],[3416,10]]},"277":{"position":[[788,9],[816,9],[1131,10],[1775,10],[2164,9],[2192,9],[2617,10],[3136,10]]},"281":{"position":[[527,9],[555,9],[864,10],[1496,10],[1888,9],[1916,9],[2335,10],[2851,10]]},"285":{"position":[[536,9],[564,9],[885,10],[1541,10],[1925,9],[1953,9],[2384,10],[2906,10]]},"291":{"position":[[715,9],[743,9],[1060,10],[1967,10],[2421,9],[2449,9],[2876,10],[3396,10]]},"295":{"position":[[557,9],[585,9],[898,10],[1538,10],[1901,9],[1929,9],[2352,10],[2870,10]]},"301":{"position":[[1028,9],[1056,9],[1369,10],[2009,10],[2454,9],[2482,9],[2905,10],[3423,10]]},"305":{"position":[[569,9],[597,9],[914,10],[1562,10],[2049,9],[2077,9],[2504,10],[3024,10]]},"317":{"position":[[546,9],[574,9],[893,10],[1545,10],[2021,9],[2049,9],[2478,10],[2999,10]]},"325":{"position":[[1959,9],[1987,9],[2302,10],[3202,10],[3655,9],[3683,9],[4108,10],[4627,10]]},"329":{"position":[[446,9],[474,9],[783,10],[1415,10],[1758,9],[1786,9],[2205,10],[2721,10]]},"333":{"position":[[417,9],[445,9],[766,10],[1422,10],[1761,9],[1789,9],[2220,10],[2742,10]]},"341":{"position":[[482,9],[510,9],[837,10],[1505,10],[1868,9],[1896,9],[2333,10],[2858,10]]},"345":{"position":[[664,9],[692,9],[1009,10],[1657,10],[2150,9],[2178,9],[2605,10],[3125,10]]},"349":{"position":[[520,9],[548,9],[867,10],[1519,10],[1904,9],[1932,9],[2361,10],[2882,10]]},"355":{"position":[[286,9]]},"421":{"position":[[227,9]]},"427":{"position":[[36,9]]},"459":{"position":[[1163,10]]},"463":{"position":[[67,10]]},"517":{"position":[[565,9]]}}}],["stub",{"_index":1783,"t":{"184":{"position":[[134,4],[272,4],[295,4],[413,4]]}}}],["style",{"_index":1456,"t":{"138":{"position":[[1944,5]]}}}],["su",{"_index":1017,"t":{"73":{"position":[[2545,2]]},"77":{"position":[[1144,2]]}}}],["subdirectori",{"_index":2467,"t":{"343":{"position":[[3545,12]]}}}],["subhead",{"_index":1649,"t":{"164":{"position":[[559,9]]}}}],["submiss",{"_index":2071,"t":{"244":{"position":[[680,11]]},"253":{"position":[[505,10],[601,10]]}}}],["submit",{"_index":672,"t":{"40":{"position":[[32,6],[384,9]]},"105":{"position":[[2083,10]]},"240":{"position":[[214,6]]},"244":{"position":[[539,6],[655,6]]},"435":{"position":[[1393,10]]}}}],["subsequ",{"_index":2574,"t":{"365":{"position":[[90,10]]},"625":{"position":[[1059,10]]}}}],["subset",{"_index":2349,"t":{"325":{"position":[[230,6]]}}}],["subson",{"_index":602,"t":{"29":{"position":[[705,9]]},"118":{"position":[[2599,10]]},"157":{"position":[[856,8]]},"166":{"position":[[728,9]]},"313":{"position":[[64,8],[621,8]]},"315":{"position":[[38,8],[173,8],[279,8],[452,8],[544,8],[815,8]]},"317":{"position":[[485,8],[616,8],[825,8],[1167,8],[1249,8],[1477,8],[2235,8],[2429,8],[2950,8],[3484,10]]},"361":{"position":[[753,8],[1464,8],[2268,8]]},"376":{"position":[[169,8],[724,8]]},"382":{"position":[[243,8]]},"384":{"position":[[417,8]]},"387":{"position":[[309,8]]},"389":{"position":[[208,8]]},"391":{"position":[[241,8]]},"395":{"position":[[575,8]]},"472":{"position":[[1309,8]]},"490":{"position":[[503,8]]},"496":{"position":[[543,8]]},"499":{"position":[[179,8]]},"501":{"position":[[492,8]]},"557":{"position":[[1453,8],[1592,8]]},"633":{"position":[[428,8]]}}}],["subsonic.json",{"_index":2565,"t":{"361":{"position":[[775,13],[1486,13],[2290,13]]},"365":{"position":[[903,13],[1184,13]]},"382":{"position":[[265,13]]},"387":{"position":[[331,13]]},"389":{"position":[[230,13]]},"391":{"position":[[263,13]]},"395":{"position":[[597,13]]},"470":{"position":[[65,13],[366,13],[951,13]]},"494":{"position":[[382,13]]},"496":{"position":[[565,13]]},"499":{"position":[[201,13]]},"501":{"position":[[514,13]]}}}],["subsonic_en",{"_index":2335,"t":{"317":{"position":[[261,15]]}}}],["subsonic_id",{"_index":2333,"t":{"317":{"position":[[127,11],[214,11]]}}}],["subsonic_nam",{"_index":2334,"t":{"317":{"position":[[184,13]]}}}],["subsonic_password",{"_index":2337,"t":{"317":{"position":[[379,17]]}}}],["subsonic_transforms=musicbrainz",{"_index":2931,"t":{"472":{"position":[[1372,31]]}}}],["subsonic_transforms=n",{"_index":2659,"t":{"384":{"position":[[480,26]]}}}],["subsonic_url",{"_index":2338,"t":{"317":{"position":[[454,12]]}}}],["subsonic_us",{"_index":2336,"t":{"317":{"position":[[321,13]]}}}],["subsonic_user=myus",{"_index":2658,"t":{"384":{"position":[[448,20]]},"472":{"position":[[1340,20]]}}}],["subtract",{"_index":1557,"t":{"151":{"position":[[167,11]]}}}],["succe",{"_index":2759,"t":{"425":{"position":[[3262,8]]},"625":{"position":[[1013,8]]}}}],["succeed",{"_index":2733,"t":{"425":{"position":[[550,9],[589,9],[2607,9]]}}}],["success",{"_index":2486,"t":{"343":{"position":[[5365,7]]},"365":{"position":[[994,11],[1276,10]]},"505":{"position":[[744,10]]},"625":{"position":[[971,7]]}}}],["successfulli",{"_index":681,"t":{"40":{"position":[[371,12]]},"365":{"position":[[291,12]]},"616":{"position":[[632,12]]},"625":{"position":[[1364,12]]}}}],["succinctli",{"_index":2591,"t":{"367":{"position":[[1010,11]]}}}],["such",{"_index":44,"t":{"4":{"position":[[649,4]]},"224":{"position":[[1263,5],[2030,5]]},"238":{"position":[[1240,5],[2013,5]]},"271":{"position":[[106,4]]},"313":{"position":[[117,5],[397,5]]},"376":{"position":[[160,4]]},"423":{"position":[[286,4]]},"427":{"position":[[396,4]]},"437":{"position":[[501,5]]},"476":{"position":[[6516,5]]},"490":{"position":[[1104,4]]},"637":{"position":[[101,4]]}}}],["sudo",{"_index":1033,"t":{"73":{"position":[[4135,4],[4541,4]]}}}],["suffici",{"_index":2045,"t":{"230":{"position":[[653,10]]},"244":{"position":[[411,10]]}}}],["suffix",{"_index":1584,"t":{"151":{"position":[[1961,8],[2123,8],[2319,6],[2518,8]]},"153":{"position":[[737,8]]},"623":{"position":[[88,6]]},"631":{"position":[[210,7]]}}}],["suggest",{"_index":1752,"t":{"178":{"position":[[1885,10],[3084,10]]},"483":{"position":[[1382,9],[1694,9]]}}}],["super",{"_index":1435,"t":{"136":{"position":[[479,5]]},"597":{"position":[[525,8]]},"599":{"position":[[968,8]]}}}],["super('coolplay",{"_index":3284,"t":{"586":{"position":[[713,19]]}}}],["superag",{"_index":3157,"t":{"549":{"position":[[1630,13],[1644,13]]},"592":{"position":[[1529,13],[2167,13]]},"594":{"position":[[1556,13]]},"597":{"position":[[352,13]]}}}],["suppli",{"_index":3027,"t":{"490":{"position":[[1793,8]]}}}],["support",{"_index":93,"t":{"4":{"position":[[1814,7]]},"14":{"position":[[360,8]]},"25":{"position":[[367,7]]},"27":{"position":[[720,8],[1073,8],[1465,8]]},"42":{"position":[[198,7]]},"87":{"position":[[439,7]]},"118":{"position":[[5170,7]]},"168":{"position":[[111,10]]},"176":{"position":[[191,8]]},"182":{"position":[[665,8]]},"200":{"position":[[765,8],[1686,9]]},"216":{"position":[[167,7]]},"222":{"position":[[397,7]]},"228":{"position":[[214,9],[267,8]]},"232":{"position":[[664,7]]},"251":{"position":[[669,7]]},"271":{"position":[[39,8]]},"297":{"position":[[93,8]]},"313":{"position":[[81,8],[361,8]]},"315":{"position":[[16,8],[194,7],[327,7],[592,7]]},"335":{"position":[[301,9],[393,9]]},"339":{"position":[[118,9]]},"343":{"position":[[58,9]]},"351":{"position":[[24,7]]},"367":{"position":[[51,7]]},"488":{"position":[[712,7]]},"490":{"position":[[468,7]]},"494":{"position":[[284,8]]},"549":{"position":[[1456,9]]},"551":{"position":[[51,10]]},"557":{"position":[[1378,8],[1523,8]]},"633":{"position":[[104,8],[552,8],[872,8],[914,8]]}}}],["support/multi",{"_index":3146,"t":{"549":{"position":[[1203,13]]}}}],["sure",{"_index":979,"t":{"73":{"position":[[1027,4]]},"87":{"position":[[640,4],[1091,4]]},"128":{"position":[[84,4]]},"149":{"position":[[3756,4]]},"184":{"position":[[1201,4]]},"206":{"position":[[409,4]]},"212":{"position":[[403,4]]},"216":{"position":[[2651,4]]},"271":{"position":[[767,4]]},"293":{"position":[[981,4]]},"343":{"position":[[4375,4],[4423,4]]},"435":{"position":[[2318,4]]},"535":{"position":[[173,4]]},"625":{"position":[[1246,4]]},"631":{"position":[[474,4]]}}}],["surfac",{"_index":3018,"t":{"488":{"position":[[219,7]]},"594":{"position":[[891,8]]},"599":{"position":[[3127,8]]}}}],["switch",{"_index":772,"t":{"46":{"position":[[1271,6],[2631,6]]},"66":{"position":[[1774,6],[3144,6]]},"85":{"position":[[1533,6],[2861,6]]},"91":{"position":[[1439,6],[2862,6]]},"95":{"position":[[1212,6],[2543,6]]},"103":{"position":[[1540,6],[2923,6]]},"110":{"position":[[2465,6],[3858,6]]},"114":{"position":[[1348,6],[2755,6]]},"143":{"position":[[1825,6],[3156,6]]},"153":{"position":[[1593,6],[3242,6]]},"186":{"position":[[1353,6],[2737,6]]},"188":{"position":[[4483,6],[6265,6]]},"198":{"position":[[1365,6],[2756,6]]},"202":{"position":[[1204,6],[2488,6]]},"208":{"position":[[1374,6],[2682,6]]},"214":{"position":[[1332,6],[2653,6]]},"218":{"position":[[1706,6],[3038,6]]},"220":{"position":[[1675,6],[3288,6]]},"234":{"position":[[1468,6],[2746,6]]},"253":{"position":[[1538,6],[2824,6]]},"257":{"position":[[1603,6],[3245,6]]},"261":{"position":[[1397,6],[3078,6]]},"265":{"position":[[1254,6],[2841,6]]},"269":{"position":[[1495,6],[3174,6]]},"277":{"position":[[1569,6],[2894,6]]},"281":{"position":[[1293,6],[2612,6]]},"285":{"position":[[1332,6],[2661,6]]},"291":{"position":[[1501,6],[3153,6]]},"295":{"position":[[1333,6],[2629,6]]},"301":{"position":[[1804,6],[3182,6]]},"305":{"position":[[1355,6],[2781,6]]},"317":{"position":[[1337,6],[2755,6]]},"325":{"position":[[2740,6],[4385,6]]},"329":{"position":[[1212,6],[2482,6]]},"333":{"position":[[1213,6],[2497,6]]},"341":{"position":[[1293,6],[2610,6]]},"345":{"position":[[1450,6],[2882,6]]},"349":{"position":[[1311,6],[2638,6]]},"457":{"position":[[2811,8]]},"588":{"position":[[650,6],[1246,6]]}}}],["symbol",{"_index":1266,"t":{"118":{"position":[[231,7]]}}}],["syntax",{"_index":762,"t":{"46":{"position":[[981,6],[2499,6]]},"66":{"position":[[1478,6],[3012,6]]},"73":{"position":[[4969,6]]},"85":{"position":[[1237,6],[2729,6]]},"91":{"position":[[1146,6],[2730,6]]},"95":{"position":[[919,6],[2411,6]]},"103":{"position":[[1244,6],[2791,6]]},"110":{"position":[[2169,6],[3726,6]]},"114":{"position":[[1037,6],[2623,6]]},"143":{"position":[[1532,6],[3024,6]]},"153":{"position":[[1288,6],[3110,6]]},"182":{"position":[[51,7]]},"186":{"position":[[1051,6],[2605,6]]},"188":{"position":[[4184,6],[6133,6]]},"198":{"position":[[1072,6],[2624,6]]},"202":{"position":[[908,6],[2356,6]]},"206":{"position":[[128,6]]},"208":{"position":[[1081,6],[2550,6]]},"212":{"position":[[126,6]]},"214":{"position":[[1045,6],[2521,6]]},"218":{"position":[[1401,6],[2906,6]]},"220":{"position":[[1385,6],[3156,6]]},"234":{"position":[[1160,6],[2614,6]]},"253":{"position":[[1233,6],[2692,6]]},"257":{"position":[[1307,6],[3113,6]]},"261":{"position":[[1086,6],[2946,6]]},"265":{"position":[[961,6],[2709,6]]},"269":{"position":[[1202,6],[3042,6]]},"271":{"position":[[483,6]]},"277":{"position":[[1276,6],[2762,6]]},"281":{"position":[[1009,6],[2480,6]]},"283":{"position":[[233,7]]},"285":{"position":[[1030,6],[2529,6]]},"291":{"position":[[1205,6],[3021,6]]},"295":{"position":[[1043,6],[2497,6]]},"301":{"position":[[1514,6],[3050,6]]},"305":{"position":[[1059,6],[2649,6]]},"317":{"position":[[1038,6],[2623,6]]},"325":{"position":[[2447,6],[4253,6]]},"329":{"position":[[928,6],[2350,6]]},"333":{"position":[[911,6],[2365,6]]},"341":{"position":[[982,6],[2478,6]]},"345":{"position":[[1154,6],[2750,6]]},"349":{"position":[[1012,6],[2506,6]]},"369":{"position":[[620,7]]},"533":{"position":[[243,7]]}}}],["system",{"_index":1765,"t":{"180":{"position":[[321,6]]},"293":{"position":[[86,8],[345,6]]},"297":{"position":[[71,6]]},"301":{"position":[[117,7]]},"417":{"position":[[66,7]]},"447":{"position":[[58,6]]},"543":{"position":[[2164,6]]},"571":{"position":[[11,6]]}}}],["systemctl",{"_index":3230,"t":{"575":{"position":[[24,9],[48,9],[96,9]]}}}],["systemd",{"_index":3210,"t":{"571":{"position":[[0,7]]}}}],["s|\\\\s)(feat\\\\.(.+)|live|remastered(.+))$/i",{"_index":2688,"t":{"402":{"position":[[371,45]]}}}],["s滾石40\\\\s滾石撞樂隊\\\\s40團拚經典(.+)$/i",{"_index":2687,"t":{"402":{"position":[[267,33]]}}}],["tab",{"_index":78,"t":{"4":{"position":[[1387,3],[3575,3],[6154,3]]},"64":{"position":[[332,4]]},"83":{"position":[[241,4]]},"147":{"position":[[271,3],[300,3]]},"149":{"position":[[1171,4],[1768,4],[1963,4],[3124,3]]},"192":{"position":[[387,4],[412,4],[638,4]]},"293":{"position":[[688,4]]},"339":{"position":[[160,3]]},"557":{"position":[[3349,3]]},"559":{"position":[[941,3]]},"563":{"position":[[79,3]]},"633":{"position":[[2866,3]]}}}],["tabl",{"_index":721,"t":{"44":{"position":[[942,5]]}}}],["tablet/laptop/desktop",{"_index":778,"t":{"46":{"position":[[1624,21],[3020,21]]},"66":{"position":[[2129,21],[3535,21]]},"85":{"position":[[1888,21],[3252,21]]},"91":{"position":[[1793,21],[3252,21]]},"95":{"position":[[1566,21],[2933,21]]},"103":{"position":[[1895,21],[3314,21]]},"110":{"position":[[2820,21],[4249,21]]},"114":{"position":[[1708,21],[3151,21]]},"143":{"position":[[2179,21],[3546,21]]},"153":{"position":[[1951,21],[3636,21]]},"186":{"position":[[1710,21],[3130,21]]},"188":{"position":[[4839,21],[6657,21]]},"198":{"position":[[1719,21],[3146,21]]},"202":{"position":[[1559,21],[2879,21]]},"208":{"position":[[1728,21],[3072,21]]},"214":{"position":[[1684,21],[3041,21]]},"218":{"position":[[2064,21],[3432,21]]},"220":{"position":[[2281,21],[3677,21]]},"234":{"position":[[1827,21],[3141,21]]},"253":{"position":[[1896,21],[3218,21]]},"257":{"position":[[2217,21],[3636,21]]},"261":{"position":[[2031,21],[3474,21]]},"265":{"position":[[1864,21],[3231,21]]},"269":{"position":[[2105,21],[3564,21]]},"277":{"position":[[1923,21],[3284,21]]},"281":{"position":[[1644,21],[2999,21]]},"285":{"position":[[1689,21],[3054,21]]},"291":{"position":[[2115,21],[3544,21]]},"295":{"position":[[1686,21],[3018,21]]},"301":{"position":[[2157,21],[3571,21]]},"305":{"position":[[1710,21],[3172,21]]},"317":{"position":[[1693,21],[3147,21]]},"325":{"position":[[3350,21],[4775,21]]},"329":{"position":[[1563,21],[2869,21]]},"333":{"position":[[1570,21],[2890,21]]},"341":{"position":[[1653,21],[3006,21]]},"345":{"position":[[1805,21],[3273,21]]},"349":{"position":[[1667,21],[3030,21]]}}}],["tag",{"_index":575,"t":{"27":{"position":[[1528,5],[1833,7]]},"309":{"position":[[164,4]]},"351":{"position":[[352,4]]},"488":{"position":[[769,6]]},"530":{"position":[[15,3]]},"549":{"position":[[53,3]]},"612":{"position":[[223,3]]},"614":{"position":[[13,4],[341,4],[456,4]]},"616":{"position":[[440,4]]}}}],["tagged/organ",{"_index":2886,"t":{"459":{"position":[[401,16]]}}}],["tags/metadata",{"_index":2373,"t":{"327":{"position":[[1052,13]]}}}],["take",{"_index":712,"t":{"44":{"position":[[411,4]]},"60":{"position":[[1623,4]]},"87":{"position":[[1461,4]]},"151":{"position":[[139,6]]},"343":{"position":[[4215,4]]},"507":{"position":[[233,4]]},"543":{"position":[[2426,4]]},"565":{"position":[[503,4]]},"590":{"position":[[53,4]]},"594":{"position":[[927,4],[1164,5]]},"599":{"position":[[2737,4]]}}}],["taken",{"_index":1666,"t":{"168":{"position":[[406,5]]},"182":{"position":[[733,5]]},"200":{"position":[[833,5]]}}}],["target",{"_index":629,"t":{"31":{"position":[[750,8]]}}}],["tautulli",{"_index":3389,"t":{"599":{"position":[[272,9],[1183,9]]}}}],["tbd",{"_index":2767,"t":{"429":{"position":[[64,5]]}}}],["tcp",{"_index":1057,"t":{"73":{"position":[[5643,3],[5811,3],[5958,3],[6069,3],[7029,3],[7197,3],[7515,3],[7626,3],[7953,4],[9288,3],[9456,3],[9582,3],[9804,3]]},"279":{"position":[[35,3]]},"293":{"position":[[1530,3],[1606,3]]}}}],["teal",{"_index":1449,"t":{"138":{"position":[[1791,4],[1831,4]]},"143":{"position":[[2292,4],[3672,4]]},"325":{"position":[[3463,4],[4901,4]]}}}],["teal.fm",{"_index":644,"t":{"35":{"position":[[90,7]]},"138":{"position":[[79,7],[96,7],[1320,8],[1628,7],[1660,7],[1756,7],[1870,7],[1964,7]]},"157":{"position":[[905,7]]},"319":{"position":[[51,7],[68,7],[250,7],[364,7],[394,7]]},"321":{"position":[[37,7]]},"323":{"position":[[8,7]]},"325":{"position":[[96,8]]},"633":{"position":[[483,7],[661,7]]}}}],["teal.fm'",{"_index":1446,"t":{"138":{"position":[[1163,9],[1221,9]]}}}],["tealfm",{"_index":1472,"t":{"143":{"position":[[1114,6],[1321,6],[1661,6],[1741,6],[1965,6],[2640,6],[2832,6],[3351,6],[3804,8]]},"325":{"position":[[2029,6],[2236,6],[2576,6],[2656,6],[2845,6],[2984,6],[3045,6],[3136,6],[3869,6],[4061,6],[4580,6],[5091,8]]},"494":{"position":[[318,7]]},"503":{"position":[[183,7]]}}}],["tealfm.json",{"_index":2357,"t":{"325":{"position":[[819,11],[1028,11],[1258,11]]}}}],["tealfm_app_pw",{"_index":1471,"t":{"143":{"position":[[947,13]]}}}],["tealfm_en",{"_index":1469,"t":{"143":{"position":[[831,13]]}}}],["tealfm_id",{"_index":1467,"t":{"143":{"position":[[703,9],[786,9]]}}}],["tealfm_identifi",{"_index":1470,"t":{"143":{"position":[[889,17]]}}}],["tealfm_nam",{"_index":1468,"t":{"143":{"position":[[758,11]]}}}],["team",{"_index":1547,"t":{"149":{"position":[[3366,4]]},"483":{"position":[[1558,7]]}}}],["teamid",{"_index":1550,"t":{"149":{"position":[[3525,9]]},"153":{"position":[[2150,9],[3844,9]]}}}],["technic",{"_index":2848,"t":{"457":{"position":[[956,11]]},"599":{"position":[[3777,11]]}}}],["techniqu",{"_index":1263,"t":{"118":{"position":[[30,10],[121,10],[3553,10],[4739,10]]}}}],["tell",{"_index":2043,"t":{"230":{"position":[[510,4]]},"244":{"position":[[278,4]]},"453":{"position":[[115,4]]},"584":{"position":[[82,4]]},"586":{"position":[[931,5]]},"588":{"position":[[112,4]]},"597":{"position":[[553,4]]},"599":{"position":[[996,4]]}}}],["templat",{"_index":1964,"t":{"216":{"position":[[353,8]]},"524":{"position":[[275,8],[374,8]]}}}],["tempor",{"_index":658,"t":{"38":{"position":[[360,8]]},"118":{"position":[[2274,10],[4621,8]]}}}],["temporari",{"_index":1503,"t":{"149":{"position":[[300,9]]}}}],["temporarili",{"_index":2553,"t":{"357":{"position":[[79,11],[317,11]]}}}],["tend",{"_index":2323,"t":{"313":{"position":[[532,4]]}}}],["term",{"_index":1205,"t":{"105":{"position":[[1616,5]]},"136":{"position":[[1451,5]]},"138":{"position":[[1610,5]]},"303":{"position":[[1842,5]]},"355":{"position":[[268,5]]},"359":{"position":[[209,5]]},"481":{"position":[[1262,6]]}}}],["termin",{"_index":3110,"t":{"543":{"position":[[2074,9]]}}}],["test",{"_index":1076,"t":{"73":{"position":[[8805,6]]},"118":{"position":[[4915,6],[4941,7]]},"343":{"position":[[4360,9]]},"367":{"position":[[77,7],[339,4],[429,4]]},"419":{"position":[[144,5],[261,5]]},"425":{"position":[[1941,4]]},"584":{"position":[[392,4]]},"592":{"position":[[2052,4],[2095,4]]},"614":{"position":[[541,8]]}}}],["text",{"_index":239,"t":{"8":{"position":[[311,4],[371,4]]},"46":{"position":[[847,4],[1281,4],[1304,4],[2365,4],[2641,4],[2664,4]]},"66":{"position":[[1344,4],[1784,4],[1807,4],[2878,4],[3154,4],[3177,4]]},"85":{"position":[[1103,4],[1543,4],[1566,4],[2595,4],[2871,4],[2894,4]]},"91":{"position":[[1012,4],[1449,4],[1472,4],[2596,4],[2872,4],[2895,4]]},"95":{"position":[[785,4],[1222,4],[1245,4],[2277,4],[2553,4],[2576,4]]},"103":{"position":[[1110,4],[1550,4],[1573,4],[2657,4],[2933,4],[2956,4]]},"110":{"position":[[2035,4],[2475,4],[2498,4],[3592,4],[3868,4],[3891,4]]},"114":{"position":[[903,4],[1358,4],[1381,4],[2489,4],[2765,4],[2788,4]]},"118":{"position":[[74,4],[148,4],[596,4]]},"143":{"position":[[1398,4],[1835,4],[1858,4],[2890,4],[3166,4],[3189,4]]},"149":{"position":[[1589,4],[2296,4]]},"153":{"position":[[1154,4],[1603,4],[1626,4],[2976,4],[3252,4],[3275,4]]},"186":{"position":[[917,4],[1363,4],[1386,4],[2471,4],[2747,4],[2770,4]]},"188":{"position":[[4050,4],[4493,4],[4516,4],[5999,4],[6275,4],[6298,4]]},"192":{"position":[[491,4]]},"198":{"position":[[938,4],[1375,4],[1398,4],[2490,4],[2766,4],[2789,4]]},"202":{"position":[[774,4],[1214,4],[1237,4],[2222,4],[2498,4],[2521,4]]},"208":{"position":[[947,4],[1384,4],[1407,4],[2416,4],[2692,4],[2715,4]]},"214":{"position":[[911,4],[1342,4],[1365,4],[2387,4],[2663,4],[2686,4]]},"218":{"position":[[1267,4],[1716,4],[1739,4],[2772,4],[3048,4],[3071,4]]},"220":{"position":[[1251,4],[1685,4],[1708,4],[3022,4],[3298,4],[3321,4]]},"234":{"position":[[1026,4],[1478,4],[1501,4],[2480,4],[2756,4],[2779,4]]},"253":{"position":[[1099,4],[1548,4],[1571,4],[2558,4],[2834,4],[2857,4]]},"257":{"position":[[1173,4],[1613,4],[1636,4],[2979,4],[3255,4],[3278,4]]},"261":{"position":[[952,4],[1407,4],[1430,4],[2812,4],[3088,4],[3111,4]]},"265":{"position":[[827,4],[1264,4],[1287,4],[2575,4],[2851,4],[2874,4]]},"269":{"position":[[1068,4],[1505,4],[1528,4],[2908,4],[3184,4],[3207,4]]},"277":{"position":[[1142,4],[1579,4],[1602,4],[2628,4],[2904,4],[2927,4]]},"281":{"position":[[875,4],[1303,4],[1326,4],[2346,4],[2622,4],[2645,4]]},"285":{"position":[[896,4],[1342,4],[1365,4],[2395,4],[2671,4],[2694,4]]},"291":{"position":[[1071,4],[1511,4],[1534,4],[2887,4],[3163,4],[3186,4]]},"295":{"position":[[909,4],[1343,4],[1366,4],[2363,4],[2639,4],[2662,4]]},"301":{"position":[[1380,4],[1814,4],[1837,4],[2916,4],[3192,4],[3215,4]]},"305":{"position":[[925,4],[1365,4],[1388,4],[2515,4],[2791,4],[2814,4]]},"317":{"position":[[904,4],[1347,4],[1370,4],[2489,4],[2765,4],[2788,4]]},"325":{"position":[[2313,4],[2750,4],[2773,4],[4119,4],[4395,4],[4418,4]]},"329":{"position":[[794,4],[1222,4],[1245,4],[2216,4],[2492,4],[2515,4]]},"333":{"position":[[777,4],[1223,4],[1246,4],[2231,4],[2507,4],[2530,4]]},"341":{"position":[[848,4],[1303,4],[1326,4],[2344,4],[2620,4],[2643,4]]},"345":{"position":[[1020,4],[1460,4],[1483,4],[2616,4],[2892,4],[2915,4]]},"349":{"position":[[878,4],[1321,4],[1344,4],[2372,4],[2648,4],[2671,4]]},"472":{"position":[[759,4],[854,4]]},"476":{"position":[[2416,4],[2862,4],[5918,4],[5971,4],[6051,4],[6120,4],[6371,4],[6933,4]]},"483":{"position":[[2504,4],[2567,4],[2631,4]]},"507":{"position":[[177,4],[215,4]]},"517":{"position":[[397,4],[622,4]]},"559":{"position":[[725,4]]},"561":{"position":[[458,4]]},"573":{"position":[[160,4]]}}}],["textbox",{"_index":2366,"t":{"327":{"position":[[326,7]]}}}],["thank",{"_index":3053,"t":{"517":{"position":[[752,5]]}}}],["theme",{"_index":2601,"t":{"369":{"position":[[800,5]]}}}],["themself",{"_index":2913,"t":{"466":{"position":[[67,8]]}}}],["therefor",{"_index":1907,"t":{"200":{"position":[[577,10]]},"457":{"position":[[800,10]]},"490":{"position":[[1849,10]]}}}],["these",{"_index":1642,"t":{"160":{"position":[[874,6]]}}}],["thing",{"_index":2023,"t":{"224":{"position":[[79,7]]},"238":{"position":[[79,7]]},"457":{"position":[[2702,6]]}}}],["think",{"_index":1434,"t":{"136":{"position":[[331,6]]},"232":{"position":[[7,5]]},"251":{"position":[[7,5]]},"365":{"position":[[675,5]]},"481":{"position":[[270,5]]}}}],["third",{"_index":1860,"t":{"194":{"position":[[0,5]]},"347":{"position":[[82,5]]}}}],["this.baseurl",{"_index":3343,"t":{"592":{"position":[[1149,12]]}}}],["this.canbacklog",{"_index":3385,"t":{"597":{"position":[[611,15]]}}}],["this.canpol",{"_index":3287,"t":{"586":{"position":[[1000,12]]}}}],["this.config",{"_index":3337,"t":{"592":{"position":[[830,12]]}}}],["this.config.token",{"_index":3356,"t":{"592":{"position":[[2449,23]]},"594":{"position":[[2024,23]]},"597":{"position":[[835,23]]}}}],["this.configdir}/currentcr",{"_index":2743,"t":{"425":{"position":[[1346,30]]}}}],["this.discover([someplay",{"_index":3404,"t":{"599":{"position":[[3070,26],[3603,26]]}}}],["this.emitt",{"_index":3311,"t":{"588":{"position":[[1418,14]]}}}],["this.logger.verbose(`config",{"_index":3347,"t":{"592":{"position":[[1294,27]]}}}],["this.playersourceoftruth",{"_index":3392,"t":{"599":{"position":[[1084,24]]}}}],["this.processrecentplays(play",{"_index":3382,"t":{"594":{"position":[[2786,31]]}}}],["this.requiresauth",{"_index":3285,"t":{"586":{"position":[[806,17]]}}}],["this.requiresauthinteract",{"_index":3286,"t":{"586":{"position":[[890,28]]}}}],["this.scrobble(discov",{"_index":3409,"t":{"599":{"position":[[3677,26]]}}}],["this.url.tostr",{"_index":3348,"t":{"592":{"position":[[1353,27]]}}}],["thorough",{"_index":2852,"t":{"457":{"position":[[1330,8]]}}}],["those",{"_index":1806,"t":{"188":{"position":[[970,5]]},"200":{"position":[[1705,5]]},"378":{"position":[[971,5]]},"476":{"position":[[2835,5]]},"483":{"position":[[444,5]]}}}],["though",{"_index":2413,"t":{"335":{"position":[[785,7]]},"363":{"position":[[828,7]]},"439":{"position":[[933,6]]},"515":{"position":[[190,7]]}}}],["thousand",{"_index":504,"t":{"18":{"position":[[3849,9],[3906,9]]}}}],["thread",{"_index":1869,"t":{"194":{"position":[[655,6]]}}}],["three",{"_index":1726,"t":{"176":{"position":[[296,5],[412,5]]},"343":{"position":[[3459,5]]},"365":{"position":[[168,5]]},"476":{"position":[[3370,5]]}}}],["threshold",{"_index":1338,"t":{"118":{"position":[[3712,9]]},"157":{"position":[[68,10]]},"160":{"position":[[1011,11]]},"166":{"position":[[1009,10],[1044,11]]},"180":{"position":[[11,9],[162,10]]},"200":{"position":[[1375,9],[1577,11]]},"331":{"position":[[89,9],[228,10]]},"599":{"position":[[178,9]]}}}],["through",{"_index":95,"t":{"4":{"position":[[1842,7]]},"8":{"position":[[758,7]]},"73":{"position":[[393,7]]},"160":{"position":[[498,7]]},"218":{"position":[[147,7]]},"273":{"position":[[74,7]]},"297":{"position":[[485,7],[575,7],[665,7],[953,7]]},"309":{"position":[[283,7]]},"335":{"position":[[711,7],[728,7]]},"586":{"position":[[988,7]]},"594":{"position":[[2593,7]]},"602":{"position":[[362,7]]},"633":{"position":[[1208,7],[1240,7]]}}}],["through/to",{"_index":3439,"t":{"618":{"position":[[170,11]]}}}],["throw",{"_index":268,"t":{"8":{"position":[[1396,5]]},"136":{"position":[[57,5]]},"147":{"position":[[564,8]]},"425":{"position":[[477,6],[664,5],[2757,5],[2881,5]]},"592":{"position":[[942,5],[1095,5],[1224,5],[2037,5],[2582,5],[2615,5]]},"594":{"position":[[2558,5]]},"597":{"position":[[1064,5]]}}}],["thrown",{"_index":3457,"t":{"623":{"position":[[1295,7]]}}}],["thu",{"_index":1837,"t":{"188":{"position":[[3531,4]]}}}],["time",{"_index":366,"t":{"14":{"position":[[121,4]]},"18":{"position":[[1202,5],[4060,5]]},"38":{"position":[[203,4]]},"40":{"position":[[152,5]]},"54":{"position":[[978,4],[1230,4],[1374,4]]},"60":{"position":[[1845,4]]},"66":{"position":[[949,4]]},"87":{"position":[[337,5],[1123,6]]},"118":{"position":[[2747,4],[2789,4],[2952,4],[3477,4],[4522,5],[4551,4]]},"120":{"position":[[527,6]]},"123":{"position":[[159,4],[253,5]]},"136":{"position":[[1186,4]]},"151":{"position":[[130,5],[158,4],[633,5]]},"160":{"position":[[710,4],[929,4]]},"166":{"position":[[1240,4]]},"190":{"position":[[161,5]]},"194":{"position":[[92,5],[519,4]]},"216":{"position":[[1507,5]]},"297":{"position":[[1793,4]]},"303":{"position":[[237,4],[312,4]]},"315":{"position":[[721,4]]},"325":{"position":[[337,5]]},"343":{"position":[[148,4],[1688,4]]},"347":{"position":[[53,5]]},"351":{"position":[[174,5]]},"357":{"position":[[666,5]]},"425":{"position":[[1583,4]]},"435":{"position":[[868,5]]},"441":{"position":[[870,5]]},"457":{"position":[[1122,4],[3239,4]]},"513":{"position":[[28,4]]},"517":{"position":[[771,5]]},"567":{"position":[[591,4]]},"594":{"position":[[1243,5]]},"625":{"position":[[900,4]]}}}],["timeout",{"_index":2814,"t":{"439":{"position":[[439,7]]}}}],["timerang",{"_index":1354,"t":{"118":{"position":[[4077,9]]}}}],["timestamp",{"_index":651,"t":{"38":{"position":[[248,9],[393,9],[430,9]]},"87":{"position":[[286,11],[843,9],[962,9]]},"118":{"position":[[2165,10],[2305,9],[2391,10],[2437,10],[2901,9],[3003,9],[3115,11]]},"151":{"position":[[0,9],[59,10],[387,11]]},"581":{"position":[[476,9]]},"590":{"position":[[896,9]]},"594":{"position":[[850,9]]},"597":{"position":[[134,9]]},"599":{"position":[[2424,9]]}}}],["timezon",{"_index":1681,"t":{"174":{"position":[[623,8]]},"178":{"position":[[756,8]]},"543":{"position":[[28,8],[1450,8],[1589,8]]},"545":{"position":[[596,8]]},"555":{"position":[[260,8]]}}}],["tip",{"_index":0,"t":{"2":{"position":[[0,3]]},"4":{"position":[[1934,3],[3965,3]]},"44":{"position":[[1467,3]]},"54":{"position":[[244,3]]},"68":{"position":[[225,3]]},"120":{"position":[[281,3],[1043,3]]},"149":{"position":[[3693,3]]},"171":{"position":[[389,3]]},"337":{"position":[[514,3]]},"365":{"position":[[594,3]]},"417":{"position":[[74,3]]},"459":{"position":[[1502,3],[1619,3]]},"476":{"position":[[4346,3]]},"539":{"position":[[0,3]]},"545":{"position":[[0,3]]},"549":{"position":[[2314,3]]},"565":{"position":[[1115,3]]},"567":{"position":[[0,3]]},"604":{"position":[[411,3]]},"616":{"position":[[562,3]]},"625":{"position":[[0,3]]},"627":{"position":[[91,3]]}}}],["titl",{"_index":655,"t":{"38":{"position":[[334,6]]},"118":{"position":[[169,7],[1277,7],[4497,6]]},"136":{"position":[[219,6],[1205,6]]},"327":{"position":[[1125,6],[1430,5],[1712,5]]},"351":{"position":[[130,6],[458,5],[543,5],[574,5],[598,5]]},"361":{"position":[[1408,5],[1441,9],[2520,8]]},"363":{"position":[[126,6],[202,8],[256,5]]},"367":{"position":[[845,8],[881,5],[1072,6]]},"369":{"position":[[785,5]]},"376":{"position":[[579,5],[735,8],[869,8]]},"378":{"position":[[604,5],[679,8],[778,5],[868,5],[982,6],[1548,8],[1660,9]]},"380":{"position":[[153,8],[207,5]]},"391":{"position":[[61,6],[136,5],[393,8],[425,5]]},"393":{"position":[[268,6]]},"395":{"position":[[271,8],[725,8],[766,5]]},"399":{"position":[[209,8],[246,5],[291,5],[418,7]]},"402":{"position":[[72,8],[212,5],[236,8]]},"404":{"position":[[44,5],[86,8]]},"406":{"position":[[54,8],[117,8]]},"470":{"position":[[523,8],[577,5]]},"476":{"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]]},"483":{"position":[[1477,6],[2561,5],[3036,5]]},"488":{"position":[[248,5]]},"490":{"position":[[190,5],[588,5],[638,8],[827,6],[836,8]]},"494":{"position":[[533,8]]},"503":{"position":[[687,8]]}}}],["title.mp4",{"_index":2379,"t":{"327":{"position":[[1772,9]]}}}],["title/album",{"_index":2954,"t":{"476":{"position":[[3951,11],[5026,11],[5816,11]]}}}],["title/artist/album/listen",{"_index":2545,"t":{"353":{"position":[[307,28],[688,28]]}}}],["title>.+?)\\\\.\\\\w+$/i",{"_index":2381,"t":{"327":{"position":[[1806,24]]}}}],["titleonli",{"_index":2567,"t":{"361":{"position":[[1336,12],[1801,11]]}}}],["titles/artist",{"_index":2961,"t":{"476":{"position":[[6473,14]]}}}],["titleweight",{"_index":3014,"t":{"483":{"position":[[2592,14]]},"507":{"position":[[1241,14]]}}}],["tld",{"_index":1221,"t":{"110":{"position":[[94,4],[344,3]]},"143":{"position":[[176,3],[490,3]]}}}],["tldr",{"_index":867,"t":{"60":{"position":[[287,4]]},"355":{"position":[[245,5]]},"357":{"position":[[961,4]]}}}],["tmp:noexec",{"_index":3117,"t":{"543":{"position":[[2342,11]]}}}],["tmpf",{"_index":3115,"t":{"543":{"position":[[2321,6]]}}}],["tmt_yxr90am",{"_index":2871,"t":{"457":{"position":[[2054,13]]}}}],["to",{"_index":799,"t":{"50":{"position":[[140,3]]},"52":{"position":[[191,3]]},"57":{"position":[[128,3]]},"73":{"position":[[811,3]]},"190":{"position":[[107,4]]}}}],["to/from",{"_index":1056,"t":{"73":{"position":[[5624,7],[7010,7],[9269,7]]}}}],["toggl",{"_index":1774,"t":{"182":{"position":[[674,8]]},"200":{"position":[[774,8]]},"249":{"position":[[225,6]]},"423":{"position":[[515,7]]}}}],["token",{"_index":202,"t":{"4":{"position":[[5408,8]]},"27":{"position":[[501,8],[916,8]]},"46":{"position":[[375,5],[1784,8],[3194,8]]},"52":{"position":[[222,5]]},"54":{"position":[[602,5]]},"57":{"position":[[32,5],[99,5],[193,5],[379,5],[588,5],[636,5],[687,5],[765,5],[901,5],[978,5],[1099,7]]},"60":{"position":[[922,8],[2018,8]]},"66":{"position":[[284,5],[2277,8],[3695,8]]},"107":{"position":[[152,6],[210,5]]},"110":{"position":[[701,6],[930,5],[1484,5],[1532,6],[2991,8],[4432,8]]},"112":{"position":[[365,5]]},"114":{"position":[[420,5],[1890,8],[3340,8]]},"118":{"position":[[640,8],[673,6],[725,6]]},"145":{"position":[[230,6],[263,5],[326,5]]},"147":{"position":[[426,5],[482,5],[666,6]]},"149":{"position":[[68,5],[181,5],[224,5],[310,5],[589,7],[641,5],[751,5],[915,5],[975,5],[1663,5],[2355,6],[2454,8],[2543,5],[3111,5],[3185,5],[3677,5]]},"153":{"position":[[2267,8],[2286,5],[2334,5],[3961,8],[3980,5],[4028,5]]},"174":{"position":[[1885,8],[1984,8],[2411,8],[2908,8],[2999,8],[3424,8]]},"176":{"position":[[1049,8],[1615,8],[2279,8],[2888,8]]},"178":{"position":[[2659,8],[3855,8]]},"220":{"position":[[772,5],[2441,8],[3851,8]]},"238":{"position":[[241,6],[286,6],[508,6],[542,5],[917,5],[957,5],[1301,5],[1624,6],[1645,5],[2087,5],[2510,6],[2577,6],[2632,8],[2684,6],[2716,5],[2786,6]]},"242":{"position":[[52,5],[161,5],[279,6]]},"244":{"position":[[110,5],[222,6],[384,5]]},"249":{"position":[[191,5],[204,5]]},"253":{"position":[[353,7],[538,5],[2054,8],[3385,8]]},"259":{"position":[[465,5]]},"261":{"position":[[462,5],[2213,8],[3663,8]]},"291":{"position":[[2286,8],[3727,8]]},"303":{"position":[[2213,6]]},"307":{"position":[[15,5],[230,5],[770,5],[972,5],[1262,5]]},"347":{"position":[[922,5],[1152,5]]},"425":{"position":[[3079,5],[3219,5]]},"557":{"position":[[1809,5],[1994,5],[2512,5],[2525,5],[2581,5]]},"581":{"position":[[365,5]]},"584":{"position":[[607,5],[680,6],[742,6]]},"588":{"position":[[774,6]]},"592":{"position":[[152,5],[811,6],[846,6],[865,5],[896,5],[2442,6]]},"594":{"position":[[2017,6]]},"597":{"position":[[828,6]]},"623":{"position":[[484,8],[799,8]]}}}],["token.trim",{"_index":3339,"t":{"592":{"position":[[918,12]]}}}],["toler",{"_index":2962,"t":{"476":{"position":[[6555,8]]}}}],["tool",{"_index":1486,"t":{"147":{"position":[[209,5]]},"149":{"position":[[1103,5],[1706,6]]},"192":{"position":[[350,5],[614,5]]},"204":{"position":[[137,5]]},"327":{"position":[[96,5]]},"599":{"position":[[77,4]]}}}],["top",{"_index":537,"t":{"22":{"position":[[347,3]]},"27":{"position":[[257,3]]},"149":{"position":[[1201,3]]},"151":{"position":[[910,5],[951,3],[1019,4],[1028,3],[1185,4]]},"361":{"position":[[75,3]]},"457":{"position":[[1181,3]]},"483":{"position":[[3084,3],[3120,3]]},"488":{"position":[[143,3]]},"559":{"position":[[1713,3]]},"563":{"position":[[851,3]]},"616":{"position":[[157,3]]},"618":{"position":[[706,3]]},"623":{"position":[[329,3],[613,3]]}}}],["topic",{"_index":213,"t":{"4":{"position":[[5576,8]]},"27":{"position":[[1265,8]]}}}],["touch",{"_index":3219,"t":{"573":{"position":[[102,5]]}}}],["toward",{"_index":2929,"t":{"472":{"position":[[869,7]]},"507":{"position":[[1184,7]]}}}],["trace",{"_index":667,"t":{"38":{"position":[[615,5]]}}}],["track",{"_index":682,"t":{"42":{"position":[[49,6],[793,5]]},"105":{"position":[[103,8],[1821,5]]},"118":{"position":[[1271,5],[3069,5]]},"136":{"position":[[655,5],[774,5],[862,5],[1049,5],[1199,5]]},"151":{"position":[[79,6],[179,5],[222,5],[280,5],[583,7],[679,5],[955,5],[1032,5],[1234,6],[1469,8],[1604,7]]},"155":{"position":[[58,6]]},"160":{"position":[[841,6],[911,5],[973,5],[1070,5],[1202,7]]},"162":{"position":[[44,5],[76,5]]},"166":{"position":[[780,5],[950,5],[1195,5],[1256,5]]},"180":{"position":[[56,5]]},"188":{"position":[[2500,5]]},"194":{"position":[[81,5],[493,6],[617,6]]},"200":{"position":[[121,5],[487,7],[1409,5]]},"216":{"position":[[1930,5],[2489,9],[2519,5],[2788,8],[2945,8],[3233,5]]},"220":{"position":[[89,6]]},"222":{"position":[[474,6]]},"259":{"position":[[96,6]]},"271":{"position":[[174,6]]},"273":{"position":[[253,6],[441,5]]},"275":{"position":[[58,5],[277,6],[407,5],[456,6],[471,6],[543,6],[558,6]]},"277":{"position":[[449,6],[559,6]]},"287":{"position":[[78,8],[234,6]]},"293":{"position":[[276,6]]},"297":{"position":[[303,6]]},"303":{"position":[[150,5],[186,5]]},"311":{"position":[[41,6]]},"315":{"position":[[869,5]]},"319":{"position":[[313,6]]},"327":{"position":[[2005,5]]},"331":{"position":[[134,5]]},"343":{"position":[[444,7]]},"357":{"position":[[760,5],[954,6]]},"363":{"position":[[581,6]]},"369":{"position":[[1112,6]]},"378":{"position":[[862,5],[1470,5]]},"391":{"position":[[55,5],[94,5]]},"395":{"position":[[760,5]]},"427":{"position":[[70,7],[140,5],[184,6],[207,5],[236,5],[437,6],[476,6],[571,5]]},"449":{"position":[[288,6]]},"453":{"position":[[196,5],[265,5],[345,5],[386,5],[413,8]]},"457":{"position":[[819,6],[1013,5],[1099,5]]},"459":{"position":[[649,6]]},"461":{"position":[[46,6]]},"476":{"position":[[2063,5],[2124,5],[3765,5]]},"481":{"position":[[437,5]]},"483":{"position":[[1436,5],[1515,8]]},"567":{"position":[[554,6]]},"569":{"position":[[547,5]]},"581":{"position":[[462,6],[586,6],[616,6]]},"584":{"position":[[2025,5],[2152,5]]},"590":{"position":[[62,5],[566,5],[813,6]]},"594":{"position":[[303,5],[417,5],[1072,5],[1393,5],[2158,5],[2223,5],[2625,5],[2687,5]]},"597":{"position":[[45,6],[116,5],[156,5],[593,6],[897,5]]},"599":{"position":[[423,5],[711,5],[1051,6],[2241,5],[2409,5],[2635,5],[2902,5],[3172,7],[3931,5]]},"633":{"position":[[2069,5],[2198,7]]},"635":{"position":[[128,6]]}}}],["track'",{"_index":1662,"t":{"166":{"position":[[1645,7]]},"315":{"position":[[735,7]]}}}],["track.scrobbl",{"_index":2040,"t":{"228":{"position":[[512,14]]}}}],["track.updatenowplay",{"_index":2041,"t":{"228":{"position":[[530,22]]}}}],["track/artist/album",{"_index":1429,"t":{"134":{"position":[[387,18]]}}}],["track/artists/album",{"_index":339,"t":{"12":{"position":[[518,21]]}}}],["track/device/servic",{"_index":2218,"t":{"297":{"position":[[1750,20]]}}}],["track/record",{"_index":2936,"t":{"476":{"position":[[134,15]]}}}],["track/song",{"_index":2969,"t":{"481":{"position":[[81,11]]}}}],["track/title/album",{"_index":3024,"t":{"490":{"position":[[1545,17]]}}}],["tracknam",{"_index":3321,"t":{"590":{"position":[[692,10],[820,10]]}}}],["tracks/play",{"_index":3372,"t":{"594":{"position":[[1907,13]]}}}],["trade",{"_index":1865,"t":{"194":{"position":[[444,5]]}}}],["traffic",{"_index":1055,"t":{"73":{"position":[[5608,7],[5795,7],[6994,7],[7181,7],[9253,7],[9440,7]]},"216":{"position":[[939,7]]}}}],["tranform",{"_index":2652,"t":{"378":{"position":[[1080,10]]}}}],["transform",{"_index":146,"t":{"4":{"position":[[3840,12]]},"12":{"position":[[296,10],[307,9],[449,9],[581,9],[613,9],[804,16]]},"14":{"position":[[248,10]]},"18":{"position":[[294,10],[970,10],[1913,9],[1963,11],[2186,9],[3067,10],[3169,11]]},"118":{"position":[[2085,11],[2151,9]]},"134":{"position":[[135,9],[300,9]]},"151":{"position":[[2588,15]]},"178":{"position":[[140,11],[1738,11],[1956,15],[3155,15]]},"206":{"position":[[610,9],[742,11]]},"212":{"position":[[602,9],[732,11]]},"224":{"position":[[1276,12],[2043,12]]},"238":{"position":[[1253,12],[2026,12]]},"271":{"position":[[911,9],[1043,11]]},"311":{"position":[[750,15],[1227,15]]},"331":{"position":[[540,11]]},"357":{"position":[[518,11]]},"361":{"position":[[85,12],[490,15],[991,11],[1170,15],[2005,15]]},"363":{"position":[[61,14],[999,11],[1144,14]]},"365":{"position":[[436,14]]},"367":{"position":[[257,14]]},"369":{"position":[[27,15],[170,11],[311,11],[707,10],[740,9]]},"372":{"position":[[105,10],[274,9]]},"376":{"position":[[845,11]]},"378":{"position":[[1185,10]]},"380":{"position":[[56,11]]},"387":{"position":[[46,15]]},"389":{"position":[[46,15]]},"395":{"position":[[199,15]]},"399":{"position":[[469,12]]},"427":{"position":[[621,9]]},"466":{"position":[[226,15],[795,15]]},"468":{"position":[[146,15]]},"470":{"position":[[289,11]]},"486":{"position":[[63,9]]},"499":{"position":[[46,15]]},"501":{"position":[[134,15]]},"503":{"position":[[323,15]]},"505":{"position":[[231,15]]},"507":{"position":[[455,15]]},"509":{"position":[[509,15],[1088,15]]},"584":{"position":[[2002,9]]},"594":{"position":[[2253,9]]},"597":{"position":[[946,10]]}}}],["tray",{"_index":2186,"t":{"293":{"position":[[136,4]]}}}],["treat",{"_index":858,"t":{"57":{"position":[[620,5]]},"224":{"position":[[1243,7],[1442,7],[2010,7],[2339,7]]},"238":{"position":[[1220,7],[1423,7],[1993,7],[2325,7]]}}}],["tree",{"_index":757,"t":{"46":{"position":[[890,4],[2408,4]]},"66":{"position":[[1387,4],[2921,4]]},"85":{"position":[[1146,4],[2638,4]]},"91":{"position":[[1055,4],[2639,4]]},"95":{"position":[[828,4],[2320,4]]},"103":{"position":[[1153,4],[2700,4]]},"110":{"position":[[2078,4],[3635,4]]},"114":{"position":[[946,4],[2532,4]]},"143":{"position":[[1441,4],[2933,4]]},"153":{"position":[[1197,4],[3019,4]]},"186":{"position":[[960,4],[2514,4]]},"188":{"position":[[4093,4],[6042,4]]},"198":{"position":[[981,4],[2533,4]]},"202":{"position":[[817,4],[2265,4]]},"208":{"position":[[990,4],[2459,4]]},"214":{"position":[[954,4],[2430,4]]},"218":{"position":[[1310,4],[2815,4]]},"220":{"position":[[1294,4],[3065,4]]},"234":{"position":[[1069,4],[2523,4]]},"253":{"position":[[1142,4],[2601,4]]},"257":{"position":[[1216,4],[3022,4]]},"261":{"position":[[995,4],[2855,4]]},"265":{"position":[[870,4],[2618,4]]},"269":{"position":[[1111,4],[2951,4]]},"277":{"position":[[1185,4],[2671,4]]},"281":{"position":[[918,4],[2389,4]]},"285":{"position":[[939,4],[2438,4]]},"291":{"position":[[1114,4],[2930,4]]},"295":{"position":[[952,4],[2406,4]]},"301":{"position":[[1423,4],[2959,4]]},"305":{"position":[[968,4],[2558,4]]},"317":{"position":[[947,4],[2532,4]]},"325":{"position":[[2356,4],[4162,4]]},"329":{"position":[[837,4],[2259,4]]},"333":{"position":[[820,4],[2274,4]]},"341":{"position":[[891,4],[2387,4]]},"345":{"position":[[1063,4],[2659,4]]},"349":{"position":[[921,4],[2415,4]]}}}],["tri",{"_index":295,"t":{"10":{"position":[[300,3]]},"64":{"position":[[2717,3],[2878,3],[3178,3],[3438,3]]},"73":{"position":[[6711,3],[8587,3],[8878,3],[10103,3]]},"83":{"position":[[2542,3],[2703,3],[3003,3],[3263,3]]},"134":{"position":[[65,3]]},"151":{"position":[[2044,6]]},"200":{"position":[[2211,3]]},"206":{"position":[[585,3]]},"212":{"position":[[577,3]]},"224":{"position":[[3018,5],[3175,6],[3211,3]]},"232":{"position":[[118,6],[372,3],[978,6],[1042,6]]},"238":{"position":[[2970,5],[3129,6],[3165,3]]},"251":{"position":[[118,6],[372,3],[983,6],[1053,6]]},"283":{"position":[[458,3]]},"297":{"position":[[690,3],[762,3]]},"303":{"position":[[766,6]]},"327":{"position":[[1859,5]]},"343":{"position":[[1710,3]]},"359":{"position":[[354,5]]},"376":{"position":[[45,3]]},"378":{"position":[[565,3],[717,5],[798,5],[1354,3]]},"425":{"position":[[1602,5]]},"435":{"position":[[899,5],[1366,3]]},"439":{"position":[[1079,3]]},"459":{"position":[[1440,6]]},"463":{"position":[[344,6]]},"476":{"position":[[875,3],[5316,3]]},"490":{"position":[[414,6]]},"513":{"position":[[346,3]]},"559":{"position":[[713,5],[745,5]]},"561":{"position":[[446,5],[478,5]]},"592":{"position":[[1143,3],[1759,3],[2356,3]]},"594":{"position":[[1880,3]]},"597":{"position":[[20,3],[571,3],[742,3]]},"633":{"position":[[1532,3],[1615,3]]}}}],["trigger",{"_index":832,"t":{"54":{"position":[[1047,9]]},"297":{"position":[[1674,8],[1798,7]]},"441":{"position":[[888,9]]},"647":{"position":[[414,7]]}}}],["trivial",{"_index":443,"t":{"18":{"position":[[723,7],[897,7]]},"579":{"position":[[63,9]]}}}],["troublehoot",{"_index":3058,"t":{"524":{"position":[[72,15]]}}}],["troubleshoot",{"_index":404,"t":{"16":{"position":[[364,12]]},"18":{"position":[[1875,15]]},"20":{"position":[[191,15],[356,15]]},"216":{"position":[[3067,16]]},"224":{"position":[[3140,15]]},"232":{"position":[[838,15]]},"238":{"position":[[3094,15]]},"249":{"position":[[424,12]]},"251":{"position":[[843,15]]},"297":{"position":[[2042,15]]},"343":{"position":[[225,15]]},"347":{"position":[[1478,15]]},"435":{"position":[[1340,16]]},"457":{"position":[[2161,15]]},"515":{"position":[[131,16]]},"520":{"position":[[150,12]]}}}],["true",{"_index":184,"t":{"4":{"position":[[4901,5],[5190,5]]},"20":{"position":[[483,5]]},"22":{"position":[[380,4]]},"42":{"position":[[1152,4]]},"46":{"position":[[273,4]]},"60":{"position":[[906,5],[2002,5]]},"64":{"position":[[1258,4],[3519,5]]},"66":{"position":[[2236,5],[3654,5]]},"83":{"position":[[1117,4],[3311,5]]},"85":{"position":[[1995,5],[3371,5]]},"91":{"position":[[277,4],[1931,5],[3403,5]]},"95":{"position":[[277,4],[1702,5],[3082,5]]},"103":{"position":[[281,4],[2037,5],[3468,5]]},"110":{"position":[[1333,4]]},"114":{"position":[[261,4],[1849,5],[3299,5]]},"138":{"position":[[1713,4]]},"143":{"position":[[853,4]]},"151":{"position":[[2914,5]]},"153":{"position":[[293,4],[604,4],[713,4],[2090,5],[2426,5],[2462,5],[2486,4],[3784,5],[4120,5],[4156,5],[4180,4]]},"168":{"position":[[735,4],[836,4]]},"182":{"position":[[1039,4],[1162,4]]},"186":{"position":[[273,4],[1821,5],[1956,5],[3251,5],[3386,5]]},"188":{"position":[[2395,4],[2741,4],[2814,5],[4954,5],[5484,5],[6783,5],[7313,5]]},"196":{"position":[[733,5]]},"198":{"position":[[277,4],[1852,5],[3292,5]]},"200":{"position":[[1137,4],[1260,4],[1944,5]]},"202":{"position":[[281,4],[1668,5],[3000,5]]},"208":{"position":[[277,4],[1860,5],[3217,5]]},"214":{"position":[[269,4],[1811,5],[3183,5]]},"216":{"position":[[2101,4],[3570,4]]},"218":{"position":[[356,4]]},"220":{"position":[[656,4]]},"234":{"position":[[265,4],[1942,5],[3264,5]]},"253":{"position":[[265,4],[2038,5],[3369,5]]},"257":{"position":[[309,4],[2359,5],[3790,5]]},"261":{"position":[[289,4],[2172,5],[3622,5]]},"265":{"position":[[305,4],[2000,5],[3380,5]]},"269":{"position":[[305,4],[2243,5],[3715,5]]},"277":{"position":[[277,4],[2054,5],[3428,5]]},"281":{"position":[[265,4],[1728,5],[3099,5]]},"285":{"position":[[261,4],[1800,5],[3175,5]]},"291":{"position":[[466,4]]},"295":{"position":[[273,4],[1814,5],[3160,5]]},"297":{"position":[[1387,5],[1504,4]]},"301":{"position":[[398,4],[2243,5],[3671,5]]},"305":{"position":[[281,4],[1841,5],[3315,5]]},"317":{"position":[[285,4],[1829,5],[2003,4],[3294,5],[3468,4]]},"325":{"position":[[1754,4]]},"327":{"position":[[1628,5],[1920,5],[2423,5],[2481,4]]},"329":{"position":[[265,4],[1647,5],[2969,5]]},"333":{"position":[[273,4],[1709,5],[3039,5]]},"341":{"position":[[261,4]]},"343":{"position":[[1055,5],[1183,5],[1200,4],[2602,5],[2773,5],[2790,4],[3831,5],[4076,5],[4093,4]]},"345":{"position":[[265,4],[1937,5],[2132,4],[3417,5],[3612,4]]},"349":{"position":[[285,4]]},"355":{"position":[[413,5]]},"363":{"position":[[391,5],[457,5],[518,5],[596,5]]},"365":{"position":[[850,4]]},"367":{"position":[[344,4]]},"369":{"position":[[133,4],[461,4]]},"378":{"position":[[1057,5],[1068,4]]},"380":{"position":[[335,4],[446,5]]},"425":{"position":[[532,4],[2163,4],[2265,4],[2594,4]]},"457":{"position":[[1603,4],[2438,5],[2457,4]]},"459":{"position":[[1227,4]]},"463":{"position":[[131,4]]},"468":{"position":[[340,4]]},"470":{"position":[[705,4],[761,4]]},"476":{"position":[[765,4]]},"481":{"position":[[1902,4],[1974,4]]},"494":{"position":[[614,4]]},"503":{"position":[[768,4]]},"543":{"position":[[2316,4]]},"586":{"position":[[826,5],[1015,5]]},"592":{"position":[[562,6],[1388,5],[1830,5],[2480,5]]},"597":{"position":[[629,5]]},"625":{"position":[[1286,4]]}}}],["truli",{"_index":1441,"t":{"136":{"position":[[1398,5]]}}}],["trust",{"_index":864,"t":{"57":{"position":[[835,6]]},"73":{"position":[[5692,5],[7078,5],[9337,5]]},"293":{"position":[[1429,8]]},"303":{"position":[[4943,8]]},"457":{"position":[[308,7]]}}}],["truth",{"_index":1211,"t":{"105":{"position":[[1943,6]]},"160":{"position":[[555,6]]},"166":{"position":[[56,5],[689,5]]},"457":{"position":[[130,6],[618,6],[778,5]]},"594":{"position":[[69,5]]},"599":{"position":[[627,5]]}}}],["ts",{"_index":2764,"t":{"427":{"position":[[715,2]]},"586":{"position":[[518,2]]},"590":{"position":[[438,2]]}}}],["ts/j",{"_index":3319,"t":{"590":{"position":[[474,5]]}}}],["tsx",{"_index":2768,"t":{"431":{"position":[[4,3]]}}}],["ttl",{"_index":2632,"t":{"372":{"position":[[223,4]]}}}],["tuhe1cphrxi",{"_index":2855,"t":{"457":{"position":[[1779,13]]}}}],["tune",{"_index":2727,"t":{"423":{"position":[[405,4]]}}}],["tunein",{"_index":2119,"t":{"271":{"position":[[137,7]]}}}],["turn",{"_index":517,"t":{"20":{"position":[[0,7],[381,4]]},"216":{"position":[[3288,4]]},"327":{"position":[[2263,4],[2334,6]]},"435":{"position":[[1414,4],[1444,4]]},"455":{"position":[[26,4]]},"457":{"position":[[1420,4],[2192,4],[2312,4]]},"496":{"position":[[159,7]]},"515":{"position":[[13,4],[221,4]]},"524":{"position":[[590,6]]}}}],["tutori",{"_index":2766,"t":{"429":{"position":[[23,8],[55,8]]}}}],["tv",{"_index":2478,"t":{"343":{"position":[[4855,2]]}}}],["twice",{"_index":2849,"t":{"457":{"position":[[1019,5]]}}}],["two",{"_index":464,"t":{"18":{"position":[[1626,3]]},"48":{"position":[[154,3]]},"87":{"position":[[761,3]]},"118":{"position":[[2329,3]]},"145":{"position":[[216,3]]},"149":{"position":[[156,3]]},"160":{"position":[[67,3]]},"166":{"position":[[1110,3]]},"412":{"position":[[188,3],[575,3],[639,4]]},"421":{"position":[[183,3]]},"425":{"position":[[2011,3]]},"457":{"position":[[942,3],[2946,3]]},"474":{"position":[[228,3]]},"490":{"position":[[607,3]]},"621":{"position":[[379,3]]}}}],["two/anoth",{"_index":2695,"t":{"412":{"position":[[473,11]]}}}],["twog",{"_index":1476,"t":{"143":{"position":[[2391,5],[3771,5]]},"325":{"position":[[944,5],[1153,5],[1383,5],[3562,5],[5000,5]]}}}],["tyler",{"_index":1323,"t":{"118":{"position":[[1877,7]]}}}],["type",{"_index":19,"t":{"4":{"position":[[195,6],[282,5],[1568,4],[1993,5],[2360,4],[2456,4],[3261,4],[4872,7],[5162,7],[5358,7],[5491,7],[5751,6],[5861,4],[5931,6],[6119,4]]},"6":{"position":[[22,5],[335,5]]},"18":{"position":[[1392,5],[1630,5],[3033,5],[3515,5],[4887,5]]},"27":{"position":[[330,5],[447,7],[552,7],[606,7],[823,7],[1176,7],[1556,7]]},"29":{"position":[[356,4]]},"46":{"position":[[27,4],[73,5],[102,4],[571,4],[2123,4],[3303,7]]},"48":{"position":[[158,5]]},"60":{"position":[[1344,6],[1389,4],[1488,4],[1557,4]]},"64":{"position":[[362,6]]},"66":{"position":[[27,4],[73,5],[102,4],[1066,4],[2634,4],[3820,7]]},"83":{"position":[[271,6]]},"85":{"position":[[27,4],[73,5],[102,4],[825,4],[2351,4],[3495,7]]},"91":{"position":[[27,4],[73,5],[102,4],[735,4],[2353,4],[3594,7]]},"93":{"position":[[562,4]]},"95":{"position":[[27,4],[73,5],[102,4],[508,4],[2034,4],[3183,7]]},"103":{"position":[[27,4],[73,5],[102,4],[832,4],[2413,4],[3612,7]]},"105":{"position":[[1180,4]]},"110":{"position":[[1079,4],[1125,5],[1154,4],[1757,4],[3348,4],[4557,7]]},"114":{"position":[[27,4],[73,5],[102,4],[620,4],[2240,4],[3453,7]]},"138":{"position":[[1178,4]]},"143":{"position":[[603,4],[649,5],[678,4],[1121,4],[2647,4],[3796,7]]},"151":{"position":[[2608,7],[3155,7]]},"153":{"position":[[27,4],[73,5],[102,4],[873,4],[2729,4],[4188,7]]},"160":{"position":[[412,5]]},"164":{"position":[[586,5]]},"171":{"position":[[120,5],[383,5]]},"174":{"position":[[2580,7],[2825,7],[2934,7],[3137,7],[3333,7]]},"176":{"position":[[76,4],[141,5],[222,5],[1784,7],[1986,7],[2188,7],[2389,7],[2593,7],[2797,7]]},"178":{"position":[[1976,7],[2731,7],[3175,7],[3527,7],[3772,7],[3927,7],[3993,7]]},"186":{"position":[[27,4],[73,5],[102,4],[637,4],[1790,7],[2225,4],[3220,7]]},"188":{"position":[[958,5],[1107,5],[1202,6],[2137,4],[2183,5],[2212,4],[3609,5],[3771,4],[5754,4],[7350,7]]},"198":{"position":[[27,4],[73,5],[102,4],[661,4],[2247,4],[3456,7]]},"202":{"position":[[27,4],[73,5],[102,4],[496,4],[1978,4],[3078,7]]},"208":{"position":[[27,4],[73,5],[102,4],[670,4],[2173,4],[3299,7]]},"214":{"position":[[27,4],[73,5],[102,4],[636,4],[2146,4],[3289,7]]},"216":{"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]]},"218":{"position":[[27,4],[73,5],[197,4],[986,4],[2525,4],[3667,7]]},"220":{"position":[[382,4],[428,5],[457,4],[975,4],[2780,4],[3960,7]]},"228":{"position":[[229,5]]},"234":{"position":[[27,4],[73,5],[102,4],[744,4],[2232,4],[3318,7]]},"253":{"position":[[27,4],[73,5],[102,4],[818,4],[2311,4],[3407,7]]},"257":{"position":[[27,4],[73,5],[102,4],[895,4],[2735,4],[3934,7]]},"261":{"position":[[27,4],[73,5],[102,4],[669,4],[2563,4],[3776,7]]},"265":{"position":[[27,4],[73,5],[102,4],[550,4],[2332,4],[3481,7]]},"269":{"position":[[27,4],[73,5],[102,4],[791,4],[2665,4],[3906,7]]},"277":{"position":[[27,4],[73,5],[102,4],[865,4],[2385,4],[3528,7]]},"281":{"position":[[27,4],[73,5],[102,4],[601,4],[2106,4],[3249,7]]},"285":{"position":[[27,4],[73,5],[102,4],[616,4],[1769,7],[2149,4],[3144,7]]},"291":{"position":[[184,4],[230,5],[259,4],[793,4],[2643,4],[3852,7]]},"295":{"position":[[27,4],[73,5],[102,4],[633,4],[2121,4],[3237,7]]},"297":{"position":[[1229,4],[1634,6]]},"301":{"position":[[152,4],[198,5],[227,4],[1104,4],[2674,4],[3872,7]]},"305":{"position":[[27,4],[73,5],[102,4],[647,4],[2271,4],[3513,7]]},"311":{"position":[[58,4],[770,7],[1083,7],[1247,7],[1480,7],[1568,7]]},"317":{"position":[[27,4],[73,5],[102,4],[625,4],[2244,4],[3476,7]]},"325":{"position":[[1476,4],[1522,5],[1551,4],[2036,4],[3876,4],[5083,7]]},"327":{"position":[[625,6]]},"329":{"position":[[27,4],[73,5],[102,4],[520,4],[1976,4],[3070,7]]},"333":{"position":[[27,4],[73,5],[102,4],[497,4],[1985,4],[3081,7]]},"335":{"position":[[295,5]]},"341":{"position":[[27,4],[73,5],[102,4],[565,4],[2095,4],[3218,7]]},"343":{"position":[[1026,7],[2200,4],[2573,7],[3802,7]]},"345":{"position":[[27,4],[73,5],[102,4],[742,4],[2372,4],[3620,7]]},"349":{"position":[[27,4],[73,5],[102,4],[599,4],[1788,7],[2127,4],[3162,7]]},"359":{"position":[[571,4],[657,7]]},"361":{"position":[[129,4],[138,4],[510,7],[887,7],[1043,4],[1190,7],[1310,7],[1598,7],[1776,7],[2025,7],[2402,7]]},"363":{"position":[[177,7]]},"365":{"position":[[1064,7],[1107,7],[1379,7],[1467,7]]},"367":{"position":[[1295,7],[1577,7]]},"380":{"position":[[128,7]]},"382":{"position":[[377,7]]},"387":{"position":[[66,7],[443,7]]},"389":{"position":[[66,7],[342,7]]},"391":{"position":[[375,7]]},"393":{"position":[[389,4]]},"395":{"position":[[219,7],[709,7]]},"399":{"position":[[193,7]]},"402":{"position":[[220,7]]},"404":{"position":[[70,7]]},"406":{"position":[[38,7],[101,7]]},"408":{"position":[[10,7]]},"410":{"position":[[10,7]]},"412":{"position":[[666,7]]},"453":{"position":[[83,4],[129,4],[222,4],[300,4],[369,4]]},"457":{"position":[[1526,7],[2361,7]]},"466":{"position":[[246,7],[815,7]]},"468":{"position":[[166,7]]},"470":{"position":[[177,7],[478,7],[1063,7]]},"476":{"position":[[199,5],[316,5],[1328,5]]},"481":{"position":[[744,4],[846,4]]},"492":{"position":[[216,6]]},"494":{"position":[[494,7]]},"496":{"position":[[691,7]]},"499":{"position":[[66,7],[313,7]]},"501":{"position":[[154,7],[626,7]]},"503":{"position":[[343,7],[648,7]]},"505":{"position":[[251,7],[847,7],[935,7]]},"507":{"position":[[475,7],[751,7],[1068,7]]},"509":{"position":[[529,7],[1015,7],[1108,7],[1490,7],[1581,7]]},"539":{"position":[[88,6]]},"549":{"position":[[1982,7],[2186,7]]},"559":{"position":[[2026,7]]},"563":{"position":[[1164,7]]},"584":{"position":[[1131,5],[1462,4],[1542,4],[1648,4],[1748,4]]},"586":{"position":[[426,4],[503,4]]},"588":{"position":[[173,4],[875,5],[1104,4],[1253,6]]},"599":{"position":[[633,4]]},"618":{"position":[[674,4]]},"621":{"position":[[356,4]]},"623":{"position":[[753,7]]}}}],["type=simpl",{"_index":3224,"t":{"573":{"position":[[307,11]]}}}],["typeof",{"_index":3338,"t":{"592":{"position":[[888,7],[1037,7]]}}}],["typescript",{"_index":2700,"t":{"415":{"position":[[39,11]]},"421":{"position":[[194,10]]}}}],["typic",{"_index":1493,"t":{"147":{"position":[[455,9]]}}}],["tz",{"_index":1682,"t":{"174":{"position":[[637,2]]},"178":{"position":[[770,2]]},"543":{"position":[[1510,3],[1603,2]]},"545":{"position":[[610,2]]},"555":{"position":[[274,2]]}}}],["tz=america/new_york",{"_index":3107,"t":{"543":{"position":[[1694,19]]}}}],["tz=etc/gmt",{"_index":1680,"t":{"174":{"position":[[602,10]]},"178":{"position":[[735,10]]},"347":{"position":[[346,10]]},"545":{"position":[[575,10]]},"555":{"position":[[239,10]]}}}],["tz=europe/moscow",{"_index":2506,"t":{"347":{"position":[[657,16]]}}}],["u",{"_index":3092,"t":{"537":{"position":[[111,1]]},"543":{"position":[[2088,1]]}}}],["ua",{"_index":2786,"t":{"435":{"position":[[526,4],[737,4],[1049,4]]}}}],["ubuntu",{"_index":3213,"t":{"571":{"position":[[91,7]]}}}],["ui",{"_index":693,"t":{"42":{"position":[[676,2]]},"87":{"position":[[712,2],[746,3],[981,3]]},"188":{"position":[[105,2],[1501,2],[1741,2]]},"249":{"position":[[53,2]]},"307":{"position":[[346,2]]},"315":{"position":[[267,2]]},"549":{"position":[[2326,2]]},"557":{"position":[[379,2]]},"594":{"position":[[2207,2]]},"631":{"position":[[38,2]]},"633":{"position":[[1346,2],[1379,2],[1420,2]]}}}],["uid",{"_index":2194,"t":{"293":{"position":[[1567,3]]},"543":{"position":[[2015,3],[2100,3]]}}}],["uid/gid",{"_index":3120,"t":{"545":{"position":[[310,7]]}}}],["ultim",{"_index":1926,"t":{"206":{"position":[[91,10]]},"212":{"position":[[89,10]]},"271":{"position":[[446,10]]}}}],["unabl",{"_index":671,"t":{"40":{"position":[[22,6]]}}}],["unattend",{"_index":3423,"t":{"610":{"position":[[302,11]]}}}],["unauthent",{"_index":3238,"t":{"581":{"position":[[208,15]]}}}],["unavail",{"_index":1105,"t":{"87":{"position":[[537,12]]}}}],["unavoid",{"_index":2455,"t":{"343":{"position":[[1959,11]]}}}],["uncaught",{"_index":2830,"t":{"444":{"position":[[184,8]]}}}],["unchang",{"_index":1570,"t":{"151":{"position":[[1059,10]]}}}],["uncom",{"_index":1136,"t":{"93":{"position":[[183,9]]},"476":{"position":[[677,9]]},"545":{"position":[[368,13],[929,9]]},"565":{"position":[[1941,9]]}}}],["uncomment/cr",{"_index":2150,"t":{"279":{"position":[[69,16]]}}}],["unconstrain",{"_index":2958,"t":{"476":{"position":[[6066,13]]}}}],["uncorrect",{"_index":3030,"t":{"492":{"position":[[492,11]]}}}],["undefin",{"_index":2859,"t":{"457":{"position":[[1824,9],[2097,9]]},"476":{"position":[[1734,9]]},"588":{"position":[[846,11]]},"592":{"position":[[790,10],[875,9],[1024,9],[1746,10]]}}}],["under",{"_index":134,"t":{"4":{"position":[[3162,5]]},"27":{"position":[[239,5]]},"105":{"position":[[373,5]]},"138":{"position":[[371,5]]},"149":{"position":[[1383,5],[2216,5]]},"164":{"position":[[569,5]]},"192":{"position":[[438,5]]},"196":{"position":[[954,5]]},"283":{"position":[[337,5]]},"313":{"position":[[275,6]]},"335":{"position":[[82,5]]},"343":{"position":[[2009,5]]},"457":{"position":[[1499,5]]},"483":{"position":[[2738,5]]},"573":{"position":[[46,5]]}}}],["understand",{"_index":749,"t":{"46":{"position":[[662,10],[2066,10]]},"57":{"position":[[820,10],[873,11]]},"66":{"position":[[1157,10],[2575,10]]},"85":{"position":[[916,10],[2292,10]]},"91":{"position":[[826,10],[2295,10]]},"95":{"position":[[599,10],[1976,10]]},"103":{"position":[[923,10],[2354,10]]},"110":{"position":[[1848,10],[3289,10]]},"114":{"position":[[711,10],[2176,10]]},"143":{"position":[[1212,10],[2589,10]]},"153":{"position":[[964,10],[2667,10]]},"186":{"position":[[728,10],[2164,10]]},"188":{"position":[[3862,10],[5694,10]]},"198":{"position":[[752,10],[2189,10]]},"202":{"position":[[587,10],[1919,10]]},"208":{"position":[[761,10],[2115,10]]},"214":{"position":[[727,10],[2090,10]]},"218":{"position":[[1077,10],[2463,10]]},"220":{"position":[[1066,10],[2723,10]]},"234":{"position":[[835,10],[2169,10]]},"253":{"position":[[909,10],[2249,10]]},"257":{"position":[[986,10],[2676,10]]},"261":{"position":[[760,10],[2499,10]]},"265":{"position":[[641,10],[2274,10]]},"269":{"position":[[882,10],[2607,10]]},"277":{"position":[[956,10],[2327,10]]},"281":{"position":[[692,10],[2051,10]]},"285":{"position":[[707,10],[2088,10]]},"291":{"position":[[884,10],[2584,10]]},"295":{"position":[[724,10],[2064,10]]},"301":{"position":[[1195,10],[2617,10]]},"305":{"position":[[738,10],[2212,10]]},"317":{"position":[[716,10],[2184,10]]},"325":{"position":[[2127,10],[3818,10]]},"329":{"position":[[611,10],[1921,10]]},"333":{"position":[[588,10],[1924,10]]},"341":{"position":[[656,10],[2031,10]]},"345":{"position":[[833,10],[2313,10]]},"349":{"position":[[690,10],[2067,10]]},"490":{"position":[[1946,10]]}}}],["undesir",{"_index":2960,"t":{"476":{"position":[[6273,10]]}}}],["undocu",{"_index":876,"t":{"60":{"position":[[1367,12]]},"451":{"position":[[376,13]]}}}],["unexpect",{"_index":2755,"t":{"425":{"position":[[2646,10],[2798,10]]},"476":{"position":[[6258,10]]}}}],["unexpectedli",{"_index":2809,"t":{"439":{"position":[[129,12]]}}}],["unfortun",{"_index":2840,"t":{"457":{"position":[[200,14]]}}}],["uniqu",{"_index":738,"t":{"46":{"position":[[154,6]]},"66":{"position":[[156,6]]},"85":{"position":[[156,6]]},"91":{"position":[[155,6]]},"95":{"position":[[155,6]]},"103":{"position":[[156,6]]},"110":{"position":[[1208,6]]},"114":{"position":[[151,6]]},"118":{"position":[[1200,6]]},"120":{"position":[[594,6]]},"136":{"position":[[293,7],[1374,6]]},"143":{"position":[[731,6]]},"153":{"position":[[159,6]]},"186":{"position":[[154,6]]},"188":{"position":[[2267,6]]},"198":{"position":[[155,6]]},"202":{"position":[[156,6]]},"208":{"position":[[155,6]]},"214":{"position":[[153,6]]},"218":{"position":[[246,6]]},"220":{"position":[[516,6]]},"234":{"position":[[152,6]]},"253":{"position":[[152,6]]},"257":{"position":[[163,6]]},"261":{"position":[[158,6]]},"265":{"position":[[162,6]]},"269":{"position":[[162,6]]},"277":{"position":[[155,6]]},"281":{"position":[[152,6]]},"285":{"position":[[151,6]]},"291":{"position":[[320,6]]},"295":{"position":[[154,6]]},"301":{"position":[[279,6]]},"305":{"position":[[156,6]]},"317":{"position":[[157,6]]},"325":{"position":[[1611,6]]},"329":{"position":[[152,6]]},"333":{"position":[[154,6]]},"341":{"position":[[151,6]]},"345":{"position":[[152,6]]},"349":{"position":[[157,6]]},"353":{"position":[[300,6],[681,6]]},"359":{"position":[[73,6]]},"361":{"position":[[159,6]]},"490":{"position":[[991,6]]},"621":{"position":[[325,6],[473,6]]}}}],["unit",{"_index":476,"t":{"18":{"position":[[2372,4],[2417,4],[4347,4],[4392,4]]},"118":{"position":[[4910,4]]},"573":{"position":[[241,6]]}}}],["unix",{"_index":987,"t":{"73":{"position":[[1517,4],[1577,4],[1599,4],[4072,4],[4170,4],[4309,4],[4478,4],[4576,4],[4715,4],[5931,4],[6100,4],[6412,4],[7488,4],[7657,4],[7771,4],[7988,5],[8292,4]]},"77":{"position":[[116,4],[176,4],[198,4]]},"85":{"position":[[405,4]]},"293":{"position":[[654,4],[786,4],[944,4],[1282,4],[1637,4]]}}}],["unknown",{"_index":1812,"t":{"188":{"position":[[1225,8]]},"216":{"position":[[1896,8],[1980,7],[2014,7],[2181,7],[2357,7]]},"325":{"position":[[510,8],[1240,7],[1431,11]]},"435":{"position":[[1096,7]]},"441":{"position":[[901,7]]},"453":{"position":[[206,9],[286,7]]}}}],["unless",{"_index":1108,"t":{"87":{"position":[[832,6]]},"118":{"position":[[2097,6]]},"174":{"position":[[1507,6]]},"178":{"position":[[1673,6]]},"182":{"position":[[1062,7],[1121,7]]},"200":{"position":[[1160,7],[1219,7]]},"293":{"position":[[1370,6]]},"303":{"position":[[2280,6]]},"347":{"position":[[553,6],[873,6]]},"384":{"position":[[1073,6]]},"472":{"position":[[2153,6]]},"490":{"position":[[1643,6]]},"545":{"position":[[1089,6]]},"555":{"position":[[517,6]]},"599":{"position":[[3845,6]]}}}],["unlik",{"_index":2477,"t":{"343":{"position":[[4795,8]]}}}],["unmatch",{"_index":275,"t":{"8":{"position":[[1648,10]]}}}],["unnam",{"_index":3302,"t":{"588":{"position":[[901,10]]},"631":{"position":[[115,7]]}}}],["unoffici",{"_index":1850,"t":{"190":{"position":[[25,10]]},"343":{"position":[[39,10],[265,11]]},"457":{"position":[[485,10]]}}}],["unqiu",{"_index":1443,"t":{"136":{"position":[[1503,6]]}}}],["unrel",{"_index":2257,"t":{"303":{"position":[[1614,9]]}}}],["unreli",{"_index":3035,"t":{"507":{"position":[[12,10]]}}}],["unseen",{"_index":3391,"t":{"599":{"position":[[1044,6]]}}}],["unsent",{"_index":1110,"t":{"87":{"position":[[923,6]]}}}],["unsupport",{"_index":1983,"t":{"216":{"position":[[1487,11]]},"551":{"position":[[0,11]]}}}],["unsur",{"_index":2351,"t":{"325":{"position":[[530,6]]}}}],["untest",{"_index":2410,"t":{"335":{"position":[[531,8]]}}}],["until",{"_index":1654,"t":{"166":{"position":[[770,5]]},"476":{"position":[[1154,5]]}}}],["untouch",{"_index":465,"t":{"18":{"position":[[1711,9]]}}}],["unus",{"_index":455,"t":{"18":{"position":[[1139,6]]},"22":{"position":[[224,8]]}}}],["uosrpjt3u5dhaaup3x",{"_index":1864,"t":{"194":{"position":[[332,24]]}}}],["uosrpjt3u5dhaaup3xq30d",{"_index":1883,"t":{"196":{"position":[[771,28]]}}}],["uosrpjt3u5dhaaup3xq30dwfosgqugdsyzl3qe743waavy2eur2ckyjcz4rv123q3psbkxklwa6ahc9xmefev6btfsp8luje3jswwrqogzcduowvzwo5saig",{"_index":1901,"t":{"198":{"position":[[1890,122],[3330,122]]}}}],["up",{"_index":347,"t":{"12":{"position":[[792,2]]},"16":{"position":[[238,2]]},"40":{"position":[[174,3]]},"46":{"position":[[1066,2],[2583,2]]},"66":{"position":[[1563,2],[3096,2]]},"85":{"position":[[1322,2],[2813,2]]},"91":{"position":[[1231,2],[2814,2]]},"93":{"position":[[319,2]]},"95":{"position":[[1004,2],[2495,2]]},"103":{"position":[[1329,2],[2875,2]]},"105":{"position":[[2123,2]]},"110":{"position":[[2254,2],[3810,2]]},"114":{"position":[[1122,2],[2707,2]]},"120":{"position":[[994,2]]},"125":{"position":[[446,2]]},"130":{"position":[[171,2]]},"143":{"position":[[1617,2],[3108,2]]},"153":{"position":[[1373,2],[3194,2]]},"166":{"position":[[391,2]]},"186":{"position":[[1136,2],[2689,2]]},"188":{"position":[[4269,2],[6217,2]]},"198":{"position":[[1157,2],[2708,2]]},"202":{"position":[[993,2],[2440,2]]},"208":{"position":[[1166,2],[2634,2]]},"214":{"position":[[1130,2],[2605,2]]},"218":{"position":[[1486,2],[2990,2]]},"220":{"position":[[1470,2],[3240,2]]},"226":{"position":[[13,2]]},"228":{"position":[[24,2]]},"230":{"position":[[253,2]]},"234":{"position":[[1245,2],[2698,2]]},"253":{"position":[[1318,2],[2776,2]]},"257":{"position":[[1392,2],[3197,2]]},"261":{"position":[[1171,2],[3030,2]]},"265":{"position":[[1046,2],[2793,2]]},"269":{"position":[[1287,2],[3126,2]]},"277":{"position":[[1361,2],[2846,2]]},"281":{"position":[[1094,2],[2564,2]]},"285":{"position":[[1115,2],[2613,2]]},"291":{"position":[[1290,2],[3105,2]]},"295":{"position":[[1128,2],[2581,2]]},"301":{"position":[[1599,2],[3134,2]]},"305":{"position":[[1144,2],[2733,2]]},"317":{"position":[[1123,2],[2707,2]]},"325":{"position":[[2532,2],[4337,2]]},"329":{"position":[[1013,2],[2434,2]]},"333":{"position":[[996,2],[2449,2]]},"341":{"position":[[1067,2],[2562,2]]},"343":{"position":[[1656,2]]},"345":{"position":[[1239,2],[2834,2]]},"349":{"position":[[1097,2],[2590,2]]},"351":{"position":[[256,3]]},"359":{"position":[[18,2]]},"372":{"position":[[98,2]]},"425":{"position":[[769,2]]},"439":{"position":[[767,2]]},"441":{"position":[[732,2]]},"459":{"position":[[1627,2]]},"483":{"position":[[505,2],[2801,2]]},"553":{"position":[[24,2]]},"557":{"position":[[195,2]]},"565":{"position":[[2077,2]]},"567":{"position":[[245,2],[371,3]]},"569":{"position":[[398,2]]},"577":{"position":[[48,2]]},"597":{"position":[[67,2]]},"604":{"position":[[209,2]]},"608":{"position":[[283,2]]},"635":{"position":[[8,2]]}}}],["up/logn",{"_index":1218,"t":{"107":{"position":[[85,7]]}}}],["updat",{"_index":617,"t":{"31":{"position":[[476,6]]},"54":{"position":[[768,6],[1028,6],[1132,8],[1301,6],[1331,6],[1440,6],[1644,6]]},"60":{"position":[[84,6],[233,7],[343,6],[590,6],[679,6],[796,8],[1886,6]]},"87":{"position":[[874,6]]},"149":{"position":[[2870,7]]},"151":{"position":[[1130,6]]},"180":{"position":[[284,7]]},"327":{"position":[[188,7]]},"503":{"position":[[268,8],[781,6]]},"543":{"position":[[238,8]]},"602":{"position":[[32,7],[127,8]]},"604":{"position":[[159,6]]},"608":{"position":[[363,6]]},"618":{"position":[[161,8]]},"627":{"position":[[616,6]]}}}],["upgrad",{"_index":395,"t":{"16":{"position":[[117,9]]},"602":{"position":[[213,9],[310,7],[352,9],[444,9]]},"604":{"position":[[418,9]]},"606":{"position":[[104,7],[125,10]]},"608":{"position":[[140,7],[219,7]]},"610":{"position":[[293,8]]},"618":{"position":[[182,7],[260,8],[278,8],[296,7],[322,7],[340,9],[425,7],[509,7],[645,8],[682,7]]},"625":{"position":[[11,10],[261,7]]},"631":{"position":[[482,7]]}}}],["upgrade(",{"_index":3417,"t":{"608":{"position":[[10,10]]}}}],["upper",{"_index":1142,"t":{"93":{"position":[[361,5]]},"565":{"position":[[2119,5]]}}}],["upstream",{"_index":1416,"t":{"125":{"position":[[540,8]]},"128":{"position":[[182,8]]},"343":{"position":[[1463,8]]},"439":{"position":[[112,8],[184,8],[307,8],[506,8],[664,8],[963,8]]},"599":{"position":[[1067,8],[1263,8],[1346,8]]}}}],["upstreamerror",{"_index":3349,"t":{"592":{"position":[[1552,13],[2190,13]]}}}],["uptim",{"_index":546,"t":{"25":{"position":[[187,6]]},"439":{"position":[[783,6]]}}}],["uri",{"_index":1128,"t":{"91":{"position":[[525,3]]},"103":{"position":[[512,3]]},"257":{"position":[[561,3]]},"269":{"position":[[574,3]]},"273":{"position":[[244,3],[465,3]]},"277":{"position":[[462,3],[572,3]]},"303":{"position":[[1957,3],[2009,3],[2037,3],[2254,4],[2438,3],[2651,4],[2821,3],[3281,3],[3975,3],[5145,3],[5324,3]]},"305":{"position":[[487,3]]},"343":{"position":[[2316,4],[2950,4],[3042,3],[3219,4],[3371,3],[3451,3],[3759,4],[4141,4]]},"345":{"position":[[387,3]]},"543":{"position":[[1082,4]]},"557":{"position":[[650,4],[770,3]]}}}],["uriblacklist",{"_index":2131,"t":{"273":{"position":[[117,12],[352,15]]},"277":{"position":[[2090,15],[3464,15]]}}}],["uriwhitelist",{"_index":2132,"t":{"273":{"position":[[133,12]]},"277":{"position":[[2110,15],[3484,15]]}}}],["url",{"_index":122,"t":{"4":{"position":[[2642,6],[2845,6],[2999,6],[5249,6],[5376,6],[5544,6],[5976,6]]},"10":{"position":[[12,3],[58,4],[454,4],[510,3],[631,3],[865,3]]},"27":{"position":[[465,6],[880,6],[1229,6],[1652,7]]},"29":{"position":[[220,3]]},"44":{"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]]},"46":{"position":[[326,3],[1855,6],[3265,6]]},"64":{"position":[[115,3],[358,3],[378,4],[493,4],[520,4],[690,3],[801,4],[1118,4],[1140,3],[1203,3],[1282,3],[1340,3],[1474,4],[2768,3],[2832,3],[2959,3],[3001,3],[3028,3],[3548,3],[3716,3],[3744,4],[3794,3],[4041,3],[4274,3]]},"66":{"position":[[467,4],[581,3],[635,3]]},"83":{"position":[[115,3],[267,3],[287,4],[352,4],[379,4],[549,3],[660,4],[977,4],[999,3],[1062,3],[1141,3],[1199,3],[1333,4],[2593,3],[2657,3],[2784,3],[2826,3],[2853,3],[3340,3],[3508,3],[3536,4],[3586,3],[3833,3]]},"85":{"position":[[494,4],[608,3],[662,3]]},"87":{"position":[[1326,3],[1448,3]]},"89":{"position":[[24,3],[136,3],[174,3],[507,3],[595,3]]},"93":{"position":[[525,3]]},"95":{"position":[[331,3],[1743,6],[3123,6]]},"99":{"position":[[24,3],[136,3],[174,3],[501,3],[589,3]]},"114":{"position":[[341,3],[1962,6],[3412,6]]},"138":{"position":[[2031,4]]},"174":{"position":[[2017,6],[2482,6],[3032,6],[3495,6]]},"176":{"position":[[668,6],[848,6],[1082,6],[1686,6],[1882,6],[2084,6],[2312,6],[2959,6]]},"182":{"position":[[4,3],[182,3],[252,3],[366,3]]},"184":{"position":[[130,3],[268,3],[291,3],[325,3],[409,3],[555,3]]},"186":{"position":[[384,3],[1878,6],[3308,6]]},"188":{"position":[[1377,3],[1554,3],[1583,4],[5005,6],[6834,6]]},"200":{"position":[[1589,3],[1610,3],[1628,3],[1801,3],[1960,6]]},"202":{"position":[[355,3],[1707,6],[3039,6]]},"206":{"position":[[4,3],[62,4],[71,3],[239,3],[337,3],[606,3],[649,3],[687,3],[738,3],[754,3]]},"208":{"position":[[363,3],[1876,6],[3233,6]]},"212":{"position":[[4,3],[60,4],[69,3],[235,3],[333,3],[598,3],[641,3],[679,3],[728,3],[744,3]]},"214":{"position":[[351,3],[1827,6],[3199,6]]},"220":{"position":[[716,3],[2512,6],[3922,6]]},"224":{"position":[[331,3],[477,3],[882,3],[1792,4],[2880,4],[2909,3],[3072,3],[3156,3],[3239,3],[3299,3]]},"226":{"position":[[216,3]]},"230":{"position":[[498,3],[691,3],[839,3],[923,3],[1013,3]]},"232":{"position":[[66,3],[138,3],[155,3],[210,3],[505,3],[525,3],[968,3]]},"234":{"position":[[397,4],[414,3]]},"236":{"position":[[229,3]]},"238":{"position":[[321,3],[468,3],[871,3],[1777,4],[2836,4],[2865,3],[3025,3],[3110,3],[3193,3],[3253,3]]},"240":{"position":[[66,3],[221,3]]},"244":{"position":[[160,3],[266,3],[449,3]]},"249":{"position":[[260,3],[271,3]]},"251":{"position":[[66,3],[138,3],[155,3],[210,3],[510,3],[530,3],[973,3]]},"253":{"position":[[390,4],[407,3]]},"261":{"position":[[376,3],[2285,6],[3735,6]]},"265":{"position":[[366,3],[2041,6],[3421,6]]},"271":{"position":[[339,4],[348,3],[417,4],[426,3],[592,3],[690,3],[907,3],[950,3],[988,3],[1039,3],[1055,3]]},"277":{"position":[[362,3],[2070,6],[3444,6]]},"281":{"position":[[1778,6],[3149,6]]},"283":{"position":[[210,3],[428,3]]},"285":{"position":[[331,3],[1856,6],[3231,6]]},"303":{"position":[[2048,3],[2133,3],[3580,3],[4243,3],[4305,4],[4394,3],[4485,3],[4853,3]]},"307":{"position":[[42,3]]},"317":{"position":[[474,3],[1845,6],[3310,6]]},"329":{"position":[[1697,6],[3019,6]]},"331":{"position":[[284,4],[458,3],[536,3],[552,3]]},"333":{"position":[[338,3],[1725,6],[3055,6]]},"335":{"position":[[113,4],[291,3],[411,3],[504,3]]},"337":{"position":[[107,4],[380,3],[462,3]]},"343":{"position":[[3236,3],[3321,3],[3478,3],[3728,3],[5240,3]]},"349":{"position":[[341,3],[1818,6],[3192,6]]},"361":{"position":[[411,4]]},"423":{"position":[[316,5]]},"425":{"position":[[1092,3],[1170,3],[2353,3]]},"427":{"position":[[430,3]]},"435":{"position":[[836,3],[921,3],[1616,4],[1625,4]]},"437":{"position":[[89,3],[589,5]]},"466":{"position":[[121,4],[575,3],[598,3],[639,3],[1030,6]]},"543":{"position":[[24,3],[1244,3]]},"545":{"position":[[220,3]]},"549":{"position":[[2111,6],[2234,6]]},"557":{"position":[[363,3],[2608,3],[3460,4]]},"565":{"position":[[580,3],[596,3],[651,3],[818,3],[1437,4]]},"592":{"position":[[332,3],[343,6],[428,4],[575,3],[724,4],[1322,4]]},"623":{"position":[[555,6],[870,6]]},"647":{"position":[[300,3]]}}}],["url(norm",{"_index":3333,"t":{"592":{"position":[[585,12]]}}}],["url.pathnam",{"_index":3335,"t":{"592":{"position":[[666,13],[691,12]]}}}],["url.port",{"_index":3334,"t":{"592":{"position":[[601,9],[623,8],[642,8]]}}}],["url/cod",{"_index":2479,"t":{"343":{"position":[[5017,8]]}}}],["url/jellyfin_url",{"_index":1819,"t":{"188":{"position":[[1670,17]]}}}],["url:port",{"_index":2159,"t":{"281":{"position":[[331,8]]},"329":{"position":[[331,8]]}}}],["urlbas",{"_index":1161,"t":{"101":{"position":[[115,7]]}}}],["us",{"_index":7,"t":{"4":{"position":[[35,6],[468,3],[522,3],[1459,3],[1602,3],[1886,5],[2077,4],[2270,5],[3157,4],[3252,4],[3647,3],[3836,3],[4234,5],[4288,3],[4387,4],[5829,5],[6244,4]]},"6":{"position":[[313,5]]},"8":{"position":[[5,5],[128,5],[941,4],[1314,4],[1763,3],[1806,4],[1831,3],[1882,3],[1901,4]]},"10":{"position":[[24,4],[307,3],[368,3],[378,6]]},"12":{"position":[[129,4],[689,4],[919,5],[1181,3],[1395,3]]},"14":{"position":[[0,5],[242,5],[828,3],[928,4]]},"18":{"position":[[35,4],[284,5],[1265,4],[1367,4],[1446,6],[1467,4],[1775,4],[1821,4],[1865,4],[2047,4],[2141,4],[2545,3],[3490,4],[3657,4],[4156,4],[4470,3]]},"20":{"position":[[127,3],[182,4]]},"22":{"position":[[285,5],[339,3]]},"25":{"position":[[65,4]]},"29":{"position":[[339,3]]},"31":{"position":[[856,4]]},"42":{"position":[[239,4],[342,5],[970,5]]},"44":{"position":[[6,4],[281,3],[315,5],[444,5],[516,3],[723,5],[812,4],[1668,3]]},"46":{"position":[[303,5],[650,3],[1605,3],[2054,3],[3001,3]]},"48":{"position":[[15,4]]},"50":{"position":[[20,4],[101,4],[487,3]]},"52":{"position":[[25,4],[138,5],[163,5]]},"54":{"position":[[15,4],[331,4],[589,5],[716,4],[873,4],[1095,4]]},"57":{"position":[[167,3],[268,3],[365,3],[503,4],[1028,3]]},"60":{"position":[[3,4],[195,5],[1359,4]]},"62":{"position":[[38,3]]},"64":{"position":[[80,4],[296,3],[480,3],[1101,3],[1273,4],[1492,4],[2724,3],[2885,3],[3140,3],[3185,3],[3397,3],[3532,3],[3702,3],[4187,4]]},"66":{"position":[[376,4],[482,5],[600,3],[649,5],[667,3],[1145,3],[2110,3],[2563,3],[3516,3]]},"68":{"position":[[15,4],[161,4]]},"71":{"position":[[42,3]]},"73":{"position":[[17,4],[423,3],[496,4],[530,3],[1263,5],[1563,3],[1699,3],[2173,3],[2856,3],[3267,3],[3539,3],[3790,4],[4065,4],[4471,4],[4867,4],[5595,4],[5669,3],[5747,3],[5867,3],[6751,5],[6981,4],[7055,3],[7133,3],[7253,3],[7359,5],[7377,3],[7424,3],[7715,3],[8627,5],[8752,3],[9240,4],[9314,3],[9392,3],[9512,3],[10131,5]]},"75":{"position":[[31,5]]},"77":{"position":[[162,3],[298,3],[772,3]]},"79":{"position":[[80,3]]},"83":{"position":[[80,4],[205,3],[339,3],[960,3],[1132,4],[1351,4],[2549,3],[2710,3],[2965,3],[3010,3],[3222,3],[3324,3],[3494,3]]},"85":{"position":[[509,5],[627,3],[676,5],[694,3],[904,3],[1869,3],[2280,3],[3233,3]]},"87":{"position":[[1229,3],[1361,5],[1393,3],[1420,5]]},"89":{"position":[[31,4],[144,3],[188,3],[573,5]]},"91":{"position":[[307,5],[532,3],[814,3],[1774,3],[2283,3],[3233,3]]},"93":{"position":[[82,5],[581,4]]},"95":{"position":[[307,5],[587,3],[1547,3],[1964,3],[2914,3]]},"97":{"position":[[105,3],[206,5],[287,3],[318,3]]},"99":{"position":[[31,4],[144,3],[188,3],[567,5]]},"101":{"position":[[15,5],[86,5]]},"103":{"position":[[311,5],[519,3],[911,3],[1876,3],[2342,3],[3295,3]]},"105":{"position":[[6,4],[858,5],[1034,4],[1582,5]]},"107":{"position":[[39,3],[93,5]]},"110":{"position":[[11,4],[190,3],[486,4],[687,3],[713,4],[796,5],[916,3],[1363,5],[1836,3],[2801,3],[3277,3],[4230,3]]},"112":{"position":[[374,3]]},"114":{"position":[[291,5],[381,5],[699,3],[1689,3],[2164,3],[3132,3]]},"118":{"position":[[16,4],[136,4],[1002,5],[1114,4],[1810,4],[5115,4]]},"120":{"position":[[1026,4]]},"123":{"position":[[29,5]]},"128":{"position":[[0,3]]},"130":{"position":[[96,3],[242,5],[384,4],[557,3]]},"132":{"position":[[69,5]]},"134":{"position":[[3,5],[113,5],[292,5],[529,3],[567,5]]},"138":{"position":[[6,4],[856,5],[1032,4],[1576,5],[1787,3],[1878,3],[1982,3]]},"143":{"position":[[23,4],[183,5],[290,3],[883,5],[1200,3],[2160,3],[2577,3],[3527,3]]},"149":{"position":[[2624,5],[3095,3]]},"151":{"position":[[2165,5],[2442,3]]},"153":{"position":[[323,5],[952,3],[1932,3],[2655,3],[3617,3]]},"160":{"position":[[277,3]]},"164":{"position":[[49,3],[454,5],[612,3]]},"166":{"position":[[623,3],[1098,4],[1720,5]]},"171":{"position":[[169,6],[237,5]]},"174":{"position":[[211,3],[468,5],[1522,5],[2523,5]]},"176":{"position":[[546,5],[1727,5]]},"178":{"position":[[120,3],[178,3],[384,3],[601,5],[1688,5],[1764,5],[1822,4],[2985,5],[3021,4]]},"180":{"position":[[147,5],[251,3]]},"182":{"position":[[8,4],[214,3],[388,4]]},"184":{"position":[[59,4],[200,3],[313,4],[421,3],[914,3],[1002,3],[1369,5]]},"186":{"position":[[303,5],[439,4],[716,3],[1691,3],[2152,3],[3111,3]]},"188":{"position":[[8,5],[320,3],[368,3],[902,3],[1267,3],[1388,3],[1489,4],[1588,3],[1923,3],[2021,3],[2425,5],[3850,3],[4820,3],[5682,3],[6638,3]]},"190":{"position":[[20,4],[191,3]]},"192":{"position":[[40,4],[94,4],[225,3]]},"196":{"position":[[129,5],[989,4],[1111,3],[1212,5]]},"198":{"position":[[307,5],[740,3],[1700,3],[2177,3],[3127,3]]},"200":{"position":[[53,3],[218,3],[648,3],[1562,5],[1642,3],[1747,3],[2218,3]]},"202":{"position":[[311,5],[575,3],[1540,3],[1907,3],[2860,3]]},"204":{"position":[[177,3]]},"206":{"position":[[8,4],[75,4],[275,3],[569,5],[712,3]]},"208":{"position":[[307,5],[749,3],[1709,3],[2103,3],[3053,3]]},"212":{"position":[[8,4],[73,4],[271,3],[561,5],[704,3]]},"214":{"position":[[299,5],[715,3],[1665,3],[2078,3],[3022,3]]},"216":{"position":[[36,5],[236,5],[778,5],[837,5],[2230,5],[2585,6],[3410,5]]},"218":{"position":[[386,5],[1065,3],[2045,3],[2451,3],[3413,3]]},"220":{"position":[[125,4],[686,5],[1054,3],[2262,3],[2711,3],[3658,3]]},"222":{"position":[[119,4],[574,5],[682,5],[706,3]]},"224":{"position":[[16,3],[119,5],[237,3],[287,3],[318,3],[455,3],[538,3],[860,3],[959,3],[1650,3],[1765,3],[2220,3],[2515,3],[2532,3],[2588,3],[2742,5],[2764,3],[2817,3],[2858,3],[2890,3],[3218,3]]},"228":{"position":[[184,3],[460,3]]},"230":{"position":[[181,3],[492,3],[608,4],[721,3],[821,5]]},"232":{"position":[[44,3],[572,3]]},"234":{"position":[[295,5],[322,5],[373,5],[443,4],[823,3],[1808,3],[2157,3],[3122,3]]},"236":{"position":[[347,4]]},"238":{"position":[[16,3],[119,5],[237,3],[282,3],[308,3],[446,3],[529,3],[849,3],[944,3],[1631,3],[1750,3],[2201,3],[2517,3],[2573,3],[2708,5],[2727,3],[2780,3],[2814,3],[2846,3],[3172,3]]},"240":{"position":[[29,3]]},"242":{"position":[[138,3]]},"244":{"position":[[132,3],[260,3],[376,4],[563,5]]},"249":{"position":[[470,5]]},"251":{"position":[[44,3],[577,3]]},"253":{"position":[[295,5],[322,5],[368,5],[436,4],[583,4],[897,3],[1877,3],[2237,3],[3199,3]]},"255":{"position":[[111,4],[193,3]]},"257":{"position":[[339,5],[568,3],[974,3],[2198,3],[2664,3],[3617,3]]},"259":{"position":[[132,4],[474,3]]},"261":{"position":[[319,5],[416,5],[748,3],[2012,3],[2487,3],[3455,3]]},"263":{"position":[[6,4]]},"265":{"position":[[335,5],[629,3],[1845,3],[2262,3],[3212,3]]},"267":{"position":[[110,4],[308,3]]},"269":{"position":[[335,5],[581,3],[870,3],[2086,3],[2595,3],[3545,3]]},"271":{"position":[[352,4],[430,4],[628,3],[1013,3]]},"273":{"position":[[111,5],[276,4]]},"275":{"position":[[94,3],[167,5]]},"277":{"position":[[307,5],[944,3],[1904,3],[2315,3],[3265,3]]},"279":{"position":[[25,5]]},"281":{"position":[[295,5],[680,3],[1625,3],[2039,3],[2980,3]]},"283":{"position":[[12,3],[214,4],[465,3]]},"285":{"position":[[291,5],[695,3],[1670,3],[2076,3],[3035,3]]},"287":{"position":[[6,4]]},"291":{"position":[[496,5],[872,3],[2096,3],[2572,3],[3525,3]]},"293":{"position":[[1438,3]]},"295":{"position":[[303,5],[712,3],[1667,3],[2052,3],[2999,3]]},"297":{"position":[[20,3],[185,3],[1271,5]]},"299":{"position":[[84,4]]},"301":{"position":[[428,5],[1183,3],[2138,3],[2605,3],[3552,3]]},"303":{"position":[[75,4],[776,3],[856,3],[1174,5],[1596,4],[1964,3],[2377,3],[2561,3],[3013,3],[3222,3],[3490,3],[3758,5],[4816,3],[5003,5],[5033,3]]},"305":{"position":[[311,5],[726,3],[1691,3],[2200,3],[3153,3]]},"307":{"position":[[55,4],[435,3]]},"309":{"position":[[147,4]]},"311":{"position":[[170,3],[281,5],[353,3],[393,3],[580,3],[868,3],[1345,3]]},"313":{"position":[[19,4],[233,5],[270,4],[430,5],[635,3]]},"315":{"position":[[149,3],[335,5]]},"317":{"position":[[315,5],[704,3],[1674,3],[2172,3],[3128,3]]},"319":{"position":[[6,4]]},"325":{"position":[[51,4],[327,4],[484,5],[561,4],[608,3],[1784,5],[2115,3],[3331,3],[3806,3],[4756,3]]},"327":{"position":[[25,5],[673,4],[1176,5],[1334,3],[1529,5],[2164,4],[2219,3]]},"329":{"position":[[295,5],[599,3],[1544,3],[1909,3],[2850,3]]},"331":{"position":[[213,5],[528,4]]},"333":{"position":[[303,5],[383,3],[576,3],[1551,3],[1912,3],[2871,3]]},"335":{"position":[[640,3]]},"337":{"position":[[18,3],[72,5],[126,5],[353,3],[435,3]]},"339":{"position":[[81,3]]},"341":{"position":[[291,5],[644,3],[1634,3],[2019,3],[2987,3]]},"343":{"position":[[543,5],[580,3],[1572,5],[1717,3],[1914,3],[2882,3],[3385,3],[3427,5],[4748,5],[4917,5],[5135,5]]},"345":{"position":[[295,5],[821,3],[1786,3],[2301,3],[3254,3]]},"347":{"position":[[941,4],[969,5]]},"349":{"position":[[315,5],[678,3],[1648,3],[2055,3],[3011,3]]},"355":{"position":[[336,4]]},"357":{"position":[[708,5],[1019,3],[1044,5],[1315,3]]},"359":{"position":[[255,4]]},"361":{"position":[[34,5],[206,4],[295,4],[614,4],[693,4],[965,4],[1379,4],[2129,4],[2208,4]]},"363":{"position":[[785,3],[1026,5],[1169,4]]},"367":{"position":[[235,4],[1488,3]]},"369":{"position":[[117,3],[244,5]]},"372":{"position":[[3,4],[184,4],[264,5]]},"376":{"position":[[17,4],[116,6],[284,5],[585,5]]},"378":{"position":[[319,3],[557,4],[953,4]]},"380":{"position":[[83,4]]},"382":{"position":[[121,5],[176,4],[452,4]]},"384":{"position":[[58,5],[107,3],[290,4],[476,3],[557,5]]},"387":{"position":[[170,4],[249,4]]},"391":{"position":[[213,3]]},"393":{"position":[[15,4],[126,6]]},"395":{"position":[[32,5],[148,5],[508,4]]},"397":{"position":[[372,6],[912,4],[960,3]]},"402":{"position":[[0,5]]},"412":{"position":[[370,3]]},"415":{"position":[[213,5]]},"417":{"position":[[133,3],[336,3]]},"419":{"position":[[219,6],[270,3],[332,4]]},"423":{"position":[[392,4]]},"425":{"position":[[812,4],[1439,4]]},"427":{"position":[[49,4],[296,6],[515,3]]},"431":{"position":[[116,3],[257,3]]},"435":{"position":[[109,5],[1894,3],[2005,3]]},"437":{"position":[[148,3],[542,3]]},"441":{"position":[[218,5],[316,5],[385,5],[421,5],[487,5],[549,5],[594,4],[634,5]]},"451":{"position":[[171,3]]},"457":{"position":[[478,3],[1405,6],[2657,5]]},"459":{"position":[[131,4],[222,6],[1517,5]]},"466":{"position":[[76,5],[571,3],[631,4],[913,4]]},"470":{"position":[[316,4]]},"472":{"position":[[89,5],[271,3],[519,5],[993,3],[1181,4],[1368,3],[1454,5]]},"474":{"position":[[261,5]]},"476":{"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]]},"481":{"position":[[154,3],[349,3],[423,4],[1044,4],[1188,4],[1211,5]]},"483":{"position":[[387,4],[471,5],[539,4],[697,4],[1171,3],[1922,4],[2090,5],[2754,5],[3145,4]]},"486":{"position":[[115,5]]},"488":{"position":[[40,4],[382,3],[795,3],[1046,5]]},"490":{"position":[[118,3],[1165,3],[1877,5],[1970,5],[2002,3]]},"492":{"position":[[5,5]]},"494":{"position":[[0,3],[249,5]]},"496":{"position":[[59,5]]},"501":{"position":[[0,5]]},"503":{"position":[[217,3]]},"505":{"position":[[112,4]]},"507":{"position":[[206,3],[273,3],[599,3],[833,3],[1110,3]]},"509":{"position":[[115,3],[279,5]]},"517":{"position":[[515,5]]},"524":{"position":[[245,3],[342,3]]},"530":{"position":[[32,3]]},"533":{"position":[[150,4],[415,4],[469,3]]},"535":{"position":[[14,3],[113,3],[720,3]]},"537":{"position":[[45,5],[80,5]]},"543":{"position":[[341,3],[498,4],[647,4],[700,4],[731,5],[851,3],[1036,5],[1128,5],[1204,4],[1305,3],[1477,5],[1955,5]]},"545":{"position":[[211,3],[348,5]]},"549":{"position":[[32,5],[211,3],[367,4],[746,3],[927,3],[1530,3],[2382,5]]},"553":{"position":[[60,5]]},"557":{"position":[[730,4],[1281,3],[1398,5],[1429,3],[1818,3],[2235,5],[2621,4],[3245,3],[3429,3],[4068,3]]},"559":{"position":[[20,3],[357,3],[590,3]]},"561":{"position":[[90,3],[323,3]]},"565":{"position":[[373,3],[407,5],[536,5],[604,3],[825,3],[1316,3],[1406,3],[1507,3],[1840,5]]},"569":{"position":[[253,5]]},"571":{"position":[[46,4]]},"579":{"position":[[186,4],[198,5]]},"581":{"position":[[1018,4]]},"584":{"position":[[54,5],[123,5],[1052,5]]},"586":{"position":[[409,4]]},"590":{"position":[[45,4],[496,3]]},"594":{"position":[[997,3],[1266,5],[3070,4]]},"599":{"position":[[1562,3],[1810,4],[2518,5],[3794,5],[3838,3],[3893,5]]},"608":{"position":[[317,4]]},"610":{"position":[[27,4]]},"612":{"position":[[204,3]]},"614":{"position":[[18,3],[532,4]]},"616":{"position":[[566,5]]},"621":{"position":[[216,3],[367,4]]},"623":{"position":[[999,3],[1123,3]]},"625":{"position":[[1150,5],[1226,5]]},"627":{"position":[[176,5],[591,5],[1153,4],[1196,3],[1224,3],[1309,5],[1379,5]]},"631":{"position":[[194,5]]},"633":{"position":[[809,5],[1269,5],[1709,3],[1974,4],[2606,3],[2850,3]]}}}],["usag",{"_index":615,"t":{"31":{"position":[[407,5],[470,5]]},"54":{"position":[[441,6]]},"57":{"position":[[105,5]]},"315":{"position":[[359,5]]},"327":{"position":[[1551,5]]},"335":{"position":[[554,5]]},"347":{"position":[[1106,5]]},"361":{"position":[[1925,5]]},"363":{"position":[[800,5]]},"372":{"position":[[416,5]]},"423":{"position":[[414,5]]},"486":{"position":[[104,5]]},"543":{"position":[[2479,6]]},"549":{"position":[[1747,5]]},"553":{"position":[[591,5],[626,5]]},"569":{"position":[[172,5]]}}}],["usecas",{"_index":1672,"t":{"171":{"position":[[41,8],[142,8]]},"224":{"position":[[2207,7]]},"238":{"position":[[2188,7]]},"447":{"position":[[116,9]]}}}],["user",{"_index":124,"t":{"4":{"position":[[2674,7],[2877,7],[3035,7],[6008,7]]},"18":{"position":[[1305,6]]},"31":{"position":[[812,4]]},"46":{"position":[[370,4],[389,4],[444,4]]},"52":{"position":[[217,4]]},"54":{"position":[[526,4],[597,4]]},"57":{"position":[[27,4],[94,4],[188,4],[355,5],[583,4],[631,4],[973,4],[1094,4]]},"60":{"position":[[253,4]]},"64":{"position":[[714,6],[1009,5]]},"66":{"position":[[279,4]]},"73":{"position":[[2385,5],[2466,4],[2513,4],[2553,4],[2919,5]]},"77":{"position":[[984,5],[1065,4],[1112,4],[1152,4]]},"79":{"position":[[143,5]]},"83":{"position":[[573,6],[868,5]]},"87":{"position":[[6,5]]},"97":{"position":[[6,5]]},"105":{"position":[[833,4]]},"110":{"position":[[275,6]]},"112":{"position":[[6,5],[360,4]]},"114":{"position":[[415,4],[434,4],[486,4]]},"118":{"position":[[2108,4],[3172,4],[3214,4]]},"136":{"position":[[562,5]]},"138":{"position":[[831,4]]},"143":{"position":[[378,6]]},"145":{"position":[[258,4]]},"147":{"position":[[421,4]]},"149":{"position":[[268,6],[693,5],[2538,4],[3672,4]]},"151":{"position":[[2331,4],[2448,4],[2493,4],[2616,7],[3163,7]]},"153":{"position":[[2329,4],[4023,4]]},"160":{"position":[[734,6]]},"162":{"position":[[26,4],[197,6]]},"168":{"position":[[174,4],[316,4]]},"174":{"position":[[17,4]]},"176":{"position":[[704,7],[884,7],[1918,7],[2120,7]]},"184":{"position":[[1293,5]]},"188":{"position":[[590,4],[631,5],[732,6],[2472,4],[2773,5],[2837,6],[2892,5],[5037,7],[6866,7]]},"198":{"position":[[543,4]]},"220":{"position":[[767,4],[786,4],[848,4]]},"224":{"position":[[201,4],[226,6],[273,6],[755,4],[1189,6],[1511,5],[1956,6],[2408,5],[2577,6]]},"230":{"position":[[553,5]]},"238":{"position":[[201,4],[226,6],[268,6],[738,4],[1166,6],[1492,5],[1939,6],[2394,5],[2562,6]]},"244":{"position":[[173,6],[321,5]]},"249":{"position":[[186,4]]},"259":{"position":[[460,4]]},"261":{"position":[[457,4],[476,4],[535,4]]},"293":{"position":[[926,4],[1557,4]]},"303":{"position":[[931,4],[1031,4],[1097,4]]},"307":{"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]]},"313":{"position":[[747,6]]},"317":{"position":[[421,4],[1886,7],[3351,7]]},"343":{"position":[[1512,6],[2112,4]]},"359":{"position":[[155,4],[175,4]]},"374":{"position":[[68,4]]},"393":{"position":[[4,4],[378,4],[397,5]]},"395":{"position":[[227,7],[406,4],[717,7]]},"399":{"position":[[201,7]]},"402":{"position":[[228,7]]},"404":{"position":[[78,7]]},"406":{"position":[[46,7],[109,7]]},"408":{"position":[[18,7]]},"410":{"position":[[18,7]]},"412":{"position":[[674,7]]},"425":{"position":[[829,4],[1140,4],[1298,4],[2273,4],[2322,4],[2717,4]]},"441":{"position":[[296,5]]},"459":{"position":[[774,5]]},"461":{"position":[[171,5]]},"466":{"position":[[49,5],[84,4]]},"535":{"position":[[1024,4]]},"537":{"position":[[26,4]]},"543":{"position":[[1825,4],[2043,4]]},"549":{"position":[[2147,7]]},"557":{"position":[[2507,4],[2923,5],[3043,4]]},"571":{"position":[[159,4]]},"575":{"position":[[60,4],[108,4],[206,4]]},"581":{"position":[[350,4]]},"584":{"position":[[592,4],[672,4],[1099,5]]},"586":{"position":[[856,4]]},"592":{"position":[[207,5],[1963,4]]},"599":{"position":[[3143,4]]},"627":{"position":[[116,5]]},"633":{"position":[[958,5]]}}}],["user/.config",{"_index":1007,"t":{"73":{"position":[[2372,12],[2529,12]]},"77":{"position":[[971,12],[1128,12]]}}}],["user/account",{"_index":2027,"t":{"224":{"position":[[1362,13],[2143,13]]},"238":{"position":[[1338,13],[2124,13]]}}}],["user/password",{"_index":2758,"t":{"425":{"position":[[3105,13],[3353,13]]}}}],["user:group",{"_index":3108,"t":{"543":{"position":[[1795,10]]}}}],["user:kasm",{"_index":1015,"t":{"73":{"position":[[2456,9],[2503,9]]},"77":{"position":[[1055,9],[1102,9]]}}}],["user_id",{"_index":1890,"t":{"198":{"position":[[405,9]]}}}],["usera",{"_index":2417,"t":{"337":{"position":[[252,7]]}}}],["userb",{"_index":2420,"t":{"337":{"position":[[336,7]]}}}],["usernam",{"_index":215,"t":{"4":{"position":[[5610,11]]},"27":{"position":[[1294,11]]},"44":{"position":[[435,8]]},"46":{"position":[[428,8],[1834,11],[3244,11]]},"114":{"position":[[470,8],[1940,11],[3390,11]]},"174":{"position":[[2461,11],[3474,11]]},"176":{"position":[[1665,11],[2938,11]]},"188":{"position":[[382,8],[491,8],[2456,8],[2561,8]]},"204":{"position":[[284,8]]},"208":{"position":[[466,8],[1894,11],[3251,11]]},"210":{"position":[[215,8]]},"214":{"position":[[414,8],[1867,11],[3239,11]]},"220":{"position":[[832,8],[2491,11],[3901,11]]},"230":{"position":[[194,8]]},"234":{"position":[[513,8]]},"253":{"position":[[666,10]]},"261":{"position":[[519,8],[2263,11],[3713,11]]},"317":{"position":[[342,8]]},"361":{"position":[[416,9]]},"557":{"position":[[492,8]]},"565":{"position":[[527,8]]},"623":{"position":[[534,11],[849,11]]}}}],["username/apikey",{"_index":2042,"t":{"230":{"position":[[85,15],[444,16],[616,15],[735,15]]}}}],["username/apikey/password",{"_index":2038,"t":{"228":{"position":[[101,24]]}}}],["usersallow",{"_index":1714,"t":{"174":{"position":[[2047,13],[3062,13]]},"176":{"position":[[2342,13]]},"188":{"position":[[637,11],[5101,13],[6930,13]]},"307":{"position":[[439,10],[708,10],[855,13],[1120,13]]},"313":{"position":[[652,10]]},"317":{"position":[[1934,13],[3399,13]]}}}],["usersblock",{"_index":1840,"t":{"188":{"position":[[5146,13],[6975,13]]}}}],["usescas",{"_index":1722,"t":{"176":{"position":[[32,8]]}}}],["usual",{"_index":618,"t":{"31":{"position":[[518,8]]},"147":{"position":[[215,8]]},"151":{"position":[[1075,7]]},"431":{"position":[[202,7]]},"439":{"position":[[993,7]]},"476":{"position":[[1880,8]]}}}],["utmost",{"_index":814,"t":{"54":{"position":[[373,6]]}}}],["v",{"_index":1063,"t":{"73":{"position":[[6067,1],[7624,1],[7948,2]]},"216":{"position":[[1313,1],[1344,1]]}}}],["v18.19.1",{"_index":2706,"t":{"417":{"position":[[26,8]]}}}],["valid",{"_index":751,"t":{"46":{"position":[[688,5],[988,6],[1006,8],[1129,8],[2092,5],[2506,6],[2524,8]]},"66":{"position":[[1183,5],[1485,6],[1503,8],[1628,8],[2601,5],[3019,6],[3037,8]]},"85":{"position":[[942,5],[1244,6],[1262,8],[1387,8],[2318,5],[2736,6],[2754,8]]},"91":{"position":[[852,5],[1153,6],[1171,8],[1295,8],[2321,5],[2737,6],[2755,8]]},"95":{"position":[[625,5],[926,6],[944,8],[1068,8],[2002,5],[2418,6],[2436,8]]},"103":{"position":[[949,5],[1251,6],[1269,8],[1394,8],[2380,5],[2798,6],[2816,8]]},"110":{"position":[[1874,5],[2176,6],[2194,8],[2319,8],[3315,5],[3733,6],[3751,8]]},"114":{"position":[[737,5],[1044,6],[1062,8],[1192,8],[2202,5],[2630,6],[2648,8]]},"143":{"position":[[69,5],[1238,5],[1539,6],[1557,8],[1681,8],[2615,5],[3031,6],[3049,8]]},"149":{"position":[[2827,5],[3817,6]]},"153":{"position":[[990,5],[1295,6],[1313,8],[1441,8],[2693,5],[3117,6],[3135,8]]},"186":{"position":[[754,5],[1058,6],[1076,8],[1203,8],[2190,5],[2612,6],[2630,8]]},"188":{"position":[[3888,5],[4191,6],[4209,8],[4335,8],[5720,5],[6140,6],[6158,8]]},"198":{"position":[[778,5],[1079,6],[1097,8],[1221,8],[2215,5],[2631,6],[2649,8]]},"202":{"position":[[613,5],[915,6],[933,8],[1058,8],[1945,5],[2363,6],[2381,8]]},"208":{"position":[[787,5],[1088,6],[1106,8],[1230,8],[2141,5],[2557,6],[2575,8]]},"214":{"position":[[753,5],[1052,6],[1070,8],[1192,8],[2116,5],[2528,6],[2546,8]]},"218":{"position":[[1103,5],[1408,6],[1426,8],[1554,8],[2489,5],[2913,6],[2931,8]]},"220":{"position":[[1092,5],[1392,6],[1410,8],[1533,8],[2749,5],[3163,6],[3181,8]]},"234":{"position":[[861,5],[1167,6],[1185,8],[1314,8],[2195,5],[2621,6],[2639,8]]},"253":{"position":[[935,5],[1240,6],[1258,8],[1386,8],[2275,5],[2699,6],[2717,8]]},"257":{"position":[[1012,5],[1314,6],[1332,8],[1457,8],[2702,5],[3120,6],[3138,8]]},"261":{"position":[[786,5],[1093,6],[1111,8],[1241,8],[2525,5],[2953,6],[2971,8]]},"265":{"position":[[667,5],[968,6],[986,8],[1110,8],[2300,5],[2716,6],[2734,8]]},"269":{"position":[[908,5],[1209,6],[1227,8],[1351,8],[2633,5],[3049,6],[3067,8]]},"277":{"position":[[982,5],[1283,6],[1301,8],[1425,8],[2353,5],[2769,6],[2787,8]]},"281":{"position":[[718,5],[1016,6],[1034,8],[1155,8],[2077,5],[2487,6],[2505,8]]},"285":{"position":[[733,5],[1037,6],[1055,8],[1182,8],[2114,5],[2536,6],[2554,8]]},"291":{"position":[[910,5],[1212,6],[1230,8],[1355,8],[2610,5],[3028,6],[3046,8]]},"295":{"position":[[750,5],[1050,6],[1068,8],[1191,8],[2090,5],[2504,6],[2522,8]]},"301":{"position":[[1221,5],[1521,6],[1539,8],[1662,8],[2643,5],[3057,6],[3075,8]]},"303":{"position":[[2423,5],[2636,5]]},"305":{"position":[[764,5],[1066,6],[1084,8],[1209,8],[2238,5],[2656,6],[2674,8]]},"317":{"position":[[742,5],[1045,6],[1063,8],[1189,8],[2210,5],[2630,6],[2648,8]]},"325":{"position":[[2153,5],[2454,6],[2472,8],[2596,8],[3844,5],[4260,6],[4278,8]]},"329":{"position":[[637,5],[935,6],[953,8],[1074,8],[1947,5],[2357,6],[2375,8]]},"333":{"position":[[614,5],[918,6],[936,8],[1063,8],[1950,5],[2372,6],[2390,8]]},"341":{"position":[[682,5],[989,6],[1007,8],[1137,8],[2057,5],[2485,6],[2503,8]]},"345":{"position":[[859,5],[1161,6],[1179,8],[1304,8],[2339,5],[2757,6],[2775,8]]},"349":{"position":[[716,5],[1019,6],[1037,8],[1163,8],[2093,5],[2513,6],[2531,8]]},"353":{"position":[[196,5]]},"425":{"position":[[820,8],[1243,8],[1447,8],[2561,6],[2698,5]]},"444":{"position":[[330,6]]},"557":{"position":[[635,5]]},"584":{"position":[[98,5],[1189,5],[1679,5]]},"599":{"position":[[2292,5],[2329,5]]}}}],["valkey",{"_index":358,"t":{"12":{"position":[[1272,6],[1560,8]]},"14":{"position":[[369,7],[436,6],[474,6],[625,7],[769,7],[971,6],[1182,9]]},"459":{"position":[[1630,6]]},"543":{"position":[[2372,6],[2669,7]]},"545":{"position":[[354,6],[950,6],[1104,8]]},"569":{"position":[[120,6]]},"627":{"position":[[597,6],[756,6],[800,6],[839,9],[901,9],[1173,7],[1200,6],[1315,7],[1442,9],[1497,9]]}}}],["valkey/valkey",{"_index":380,"t":{"14":{"position":[[640,13],[784,13]]},"543":{"position":[[2684,13]]},"545":{"position":[[1122,13]]}}}],["valkeydata",{"_index":382,"t":{"14":{"position":[[691,11]]},"543":{"position":[[2735,11]]},"545":{"position":[[1180,11]]}}}],["valkeydata:/data",{"_index":381,"t":{"14":{"position":[[665,16],[809,18]]},"543":{"position":[[2709,16]]},"545":{"position":[[1151,16]]}}}],["valu",{"_index":136,"t":{"4":{"position":[[3238,5],[6124,5],[6230,5]]},"8":{"position":[[421,5],[1279,6],[1432,5]]},"18":{"position":[[2271,5],[4246,5]]},"46":{"position":[[199,5]]},"60":{"position":[[734,7]]},"66":{"position":[[203,5]]},"85":{"position":[[203,5]]},"87":{"position":[[1406,5]]},"91":{"position":[[201,5]]},"93":{"position":[[488,5]]},"95":{"position":[[201,5]]},"97":{"position":[[326,6]]},"101":{"position":[[176,5]]},"103":{"position":[[203,5]]},"110":{"position":[[423,6],[1255,5]]},"114":{"position":[[193,5]]},"118":{"position":[[1260,6]]},"143":{"position":[[569,6],[777,5]]},"147":{"position":[[445,5]]},"153":{"position":[[209,5]]},"166":{"position":[[1312,6],[1367,6]]},"168":{"position":[[624,5]]},"182":{"position":[[928,5]]},"184":{"position":[[307,5],[685,5]]},"186":{"position":[[199,5]]},"188":{"position":[[310,5],[2315,5]]},"192":{"position":[[107,5],[281,6],[552,5],[757,5],[798,5]]},"198":{"position":[[201,5]]},"200":{"position":[[1028,5]]},"202":{"position":[[203,5]]},"206":{"position":[[289,6]]},"208":{"position":[[201,5]]},"212":{"position":[[285,6]]},"214":{"position":[[197,5]]},"218":{"position":[[288,5],[509,6],[630,6],[750,6],[868,6]]},"220":{"position":[[568,5]]},"228":{"position":[[197,6]]},"230":{"position":[[283,6]]},"234":{"position":[[195,5]]},"242":{"position":[[92,5],[151,5]]},"253":{"position":[[195,5]]},"257":{"position":[[217,5]]},"261":{"position":[[207,5]]},"265":{"position":[[215,5]]},"269":{"position":[[215,5]]},"271":{"position":[[642,6]]},"277":{"position":[[201,5]]},"281":{"position":[[195,5]]},"285":{"position":[[193,5]]},"291":{"position":[[374,5]]},"293":{"position":[[1129,7],[1693,5]]},"295":{"position":[[199,5],[381,6],[489,6]]},"301":{"position":[[324,5]]},"305":{"position":[[203,5]]},"313":{"position":[[200,5]]},"317":{"position":[[205,5]]},"325":{"position":[[202,6],[1664,5]]},"327":{"position":[[926,6]]},"329":{"position":[[195,5]]},"333":{"position":[[199,5]]},"341":{"position":[[193,5]]},"343":{"position":[[791,5]]},"345":{"position":[[195,5]]},"349":{"position":[[205,5]]},"363":{"position":[[688,5],[862,5],[917,6]]},"367":{"position":[[210,5],[272,6]]},"378":{"position":[[1038,6]]},"399":{"position":[[399,5]]},"425":{"position":[[468,5]]},"476":{"position":[[5252,5]]},"483":{"position":[[745,6]]},"557":{"position":[[226,6],[847,6],[2670,6],[3596,6]]},"559":{"position":[[443,5],[1024,5],[1167,5],[1309,5],[1447,5]]},"561":{"position":[[176,5]]},"563":{"position":[[162,5],[305,5],[447,5],[585,5]]},"565":{"position":[[861,6],[894,6],[1551,6],[2249,5],[2274,6]]},"623":{"position":[[110,6]]}}}],["vaniti",{"_index":741,"t":{"46":{"position":[[219,6]]},"66":{"position":[[225,6]]},"85":{"position":[[225,6]]},"91":{"position":[[222,6]]},"95":{"position":[[222,6]]},"103":{"position":[[225,6]]},"110":{"position":[[1277,6]]},"114":{"position":[[210,6]]},"143":{"position":[[798,6]]},"153":{"position":[[234,6]]},"186":{"position":[[219,6]]},"188":{"position":[[2338,6]]},"198":{"position":[[222,6]]},"202":{"position":[[225,6]]},"208":{"position":[[222,6]]},"214":{"position":[[216,6]]},"218":{"position":[[305,6]]},"220":{"position":[[595,6]]},"234":{"position":[[213,6]]},"253":{"position":[[213,6]]},"257":{"position":[[246,6]]},"261":{"position":[[231,6]]},"265":{"position":[[243,6]]},"269":{"position":[[243,6]]},"277":{"position":[[222,6]]},"281":{"position":[[213,6]]},"285":{"position":[[210,6]]},"291":{"position":[[403,6]]},"295":{"position":[[219,6]]},"301":{"position":[[344,6]]},"305":{"position":[[225,6]]},"317":{"position":[[228,6]]},"325":{"position":[[1692,6]]},"329":{"position":[[213,6]]},"333":{"position":[[219,6]]},"341":{"position":[[210,6]]},"345":{"position":[[213,6]]},"349":{"position":[[228,6]]}}}],["var",{"_index":1582,"t":{"151":{"position":[[1840,4]]}}}],["var/run/avahi",{"_index":1979,"t":{"216":{"position":[[1346,14]]}}}],["var/run/dbus:/var/run/dbu",{"_index":1978,"t":{"216":{"position":[[1315,27]]}}}],["vari",{"_index":411,"t":{"18":{"position":[[91,4]]},"594":{"position":[[460,7]]}}}],["variabl",{"_index":10,"t":{"4":{"position":[[62,9],[334,9],[1039,9],[1240,9],[1255,8],[3410,9]]},"8":{"position":[[84,9],[448,8],[726,10],[1188,8],[1567,8],[1739,8]]},"44":{"position":[[1529,8]]},"46":{"position":[[93,8]]},"66":{"position":[[93,8]]},"73":{"position":[[6795,9],[8671,9],[10175,9]]},"85":{"position":[[93,8]]},"91":{"position":[[93,8]]},"95":{"position":[[93,8]]},"103":{"position":[[93,8]]},"110":{"position":[[1145,8]]},"114":{"position":[[93,8]]},"143":{"position":[[669,8]]},"153":{"position":[[93,8]]},"186":{"position":[[93,8]]},"188":{"position":[[2203,8]]},"198":{"position":[[93,8]]},"202":{"position":[[93,8]]},"208":{"position":[[93,8]]},"214":{"position":[[93,8]]},"218":{"position":[[188,8]]},"220":{"position":[[448,8]]},"234":{"position":[[93,8]]},"253":{"position":[[93,8]]},"257":{"position":[[93,8]]},"261":{"position":[[93,8]]},"265":{"position":[[93,8]]},"269":{"position":[[93,8]]},"277":{"position":[[93,8]]},"281":{"position":[[93,8]]},"285":{"position":[[93,8]]},"291":{"position":[[250,8]]},"295":{"position":[[93,8]]},"297":{"position":[[1603,8]]},"301":{"position":[[218,8]]},"305":{"position":[[93,8]]},"317":{"position":[[93,8]]},"325":{"position":[[1542,8]]},"329":{"position":[[93,8]]},"333":{"position":[[93,8]]},"341":{"position":[[93,8]]},"345":{"position":[[93,8]]},"349":{"position":[[93,8]]},"435":{"position":[[1515,8]]},"543":{"position":[[1501,8],[1979,9]]},"549":{"position":[[496,9],[893,9],[2411,9]]},"555":{"position":[[420,9]]},"565":{"position":[[1177,8]]},"623":{"position":[[58,10]]}}}],["variou",{"_index":2590,"t":{"367":{"position":[[932,8],[975,8]]},"393":{"position":[[284,7]]},"395":{"position":[[316,8]]},"410":{"position":[[49,8]]}}}],["verbos",{"_index":1872,"t":{"196":{"position":[[271,8]]}}}],["veri",{"_index":41,"t":{"4":{"position":[[624,4]]},"20":{"position":[[262,4]]},"118":{"position":[[4786,4]]},"136":{"position":[[584,4]]},"149":{"position":[[1825,4]]},"372":{"position":[[212,4]]},"515":{"position":[[178,4]]},"599":{"position":[[3863,4]]}}}],["verifi",{"_index":278,"t":{"8":{"position":[[1694,6],[1854,6]]},"42":{"position":[[656,8]]},"105":{"position":[[1810,10]]},"232":{"position":[[148,6],[713,6]]},"251":{"position":[[148,6],[718,6]]},"309":{"position":[[396,6]]},"327":{"position":[[293,6],[492,6]]},"439":{"position":[[711,6]]},"599":{"position":[[3226,8]]},"616":{"position":[[602,6]]}}}],["version",{"_index":396,"t":{"16":{"position":[[143,8]]},"44":{"position":[[1481,8]]},"110":{"position":[[1024,7]]},"136":{"position":[[802,8],[1077,8]]},"160":{"position":[[1053,7]]},"232":{"position":[[381,9]]},"251":{"position":[[381,9]]},"351":{"position":[[556,8]]},"369":{"position":[[921,8],[976,8]]},"393":{"position":[[250,8]]},"395":{"position":[[290,9]]},"404":{"position":[[26,8],[105,9]]},"417":{"position":[[170,8],[370,7]]},"549":{"position":[[247,7]]},"565":{"position":[[1129,8]]},"592":{"position":[[1859,7],[1928,7],[1991,8]]},"602":{"position":[[119,7],[379,8],[464,9]]},"604":{"position":[[436,7]]},"606":{"position":[[6,8]]},"608":{"position":[[36,8],[211,7]]},"610":{"position":[[16,10],[55,7],[80,7],[175,7],[426,9]]},"614":{"position":[[99,7],[240,7]]},"616":{"position":[[12,7],[99,7],[188,7],[277,8],[480,7],[685,8],[701,7],[750,7]]},"618":{"position":[[141,7],[209,8],[304,8],[361,8],[490,9]]}}}],["via",{"_index":564,"t":{"27":{"position":[[767,3],[1120,3]]},"42":{"position":[[98,3],[445,3],[665,3]]},"118":{"position":[[2138,3]]},"123":{"position":[[120,4]]},"136":{"position":[[672,3],[887,3]]},"145":{"position":[[56,3]]},"210":{"position":[[188,3]]},"214":{"position":[[446,3],[517,3]]},"415":{"position":[[313,3]]},"557":{"position":[[1668,3],[1840,3]]}}}],["video",{"_index":1813,"t":{"188":{"position":[[1234,6]]}}}],["view",{"_index":909,"t":{"64":{"position":[[1078,4]]},"73":{"position":[[985,7],[1071,7]]},"83":{"position":[[937,4]]},"93":{"position":[[168,4]]},"138":{"position":[[1746,4],[2000,4]]},"249":{"position":[[492,4]]},"309":{"position":[[484,4]]},"319":{"position":[[106,7]]},"325":{"position":[[649,4]]},"513":{"position":[[186,4]]},"543":{"position":[[1212,4],[1312,4]]},"553":{"position":[[514,7]]},"565":{"position":[[1926,4]]}}}],["vinyl",{"_index":3007,"t":{"483":{"position":[[1782,5]]}}}],["violat",{"_index":810,"t":{"52":{"position":[[174,8]]},"54":{"position":[[576,9]]},"57":{"position":[[111,8]]},"190":{"position":[[85,9]]}}}],["virtual",{"_index":1385,"t":{"118":{"position":[[5063,9]]}}}],["visibl",{"_index":883,"t":{"60":{"position":[[1707,7]]},"64":{"position":[[697,7],[812,8]]},"83":{"position":[[556,7],[671,8]]},"592":{"position":[[1945,10]]}}}],["visit",{"_index":1119,"t":{"89":{"position":[[257,5]]},"99":{"position":[[257,5]]},"147":{"position":[[129,5]]},"149":{"position":[[1054,5],[1838,5]]},"303":{"position":[[5419,5]]},"343":{"position":[[5215,5]]},"425":{"position":[[2336,5]]},"557":{"position":[[1153,5],[3931,5]]},"567":{"position":[[375,5]]},"647":{"position":[[278,8],[355,5]]}}}],["vite",{"_index":3158,"t":{"549":{"position":[[1660,7]]}}}],["vitej",{"_index":2705,"t":{"415":{"position":[[284,6]]}}}],["vlc",{"_index":1628,"t":{"157":{"position":[[973,3]]},"295":{"position":[[1845,6],[3191,6]]},"327":{"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]]},"329":{"position":[[347,3],[516,3],[720,3],[1057,3],[1134,3],[1352,3],[1972,3],[2161,3],[2677,3],[3078,5]]},"361":{"position":[[1657,3]]},"455":{"position":[[61,3],[88,3]]},"633":{"position":[[504,3]]}}}],["vlc.json",{"_index":2568,"t":{"361":{"position":[[1674,8]]}}}],["vlc_enabl",{"_index":2386,"t":{"329":{"position":[[246,10]]}}}],["vlc_id",{"_index":2384,"t":{"329":{"position":[[127,6],[204,6]]}}}],["vlc_name",{"_index":2385,"t":{"329":{"position":[[179,8]]}}}],["vlc_password",{"_index":2389,"t":{"329":{"position":[[372,12]]}}}],["vlc_url",{"_index":2387,"t":{"329":{"position":[[301,7]]}}}],["vldjjo",{"_index":2599,"t":{"369":{"position":[[731,8]]}}}],["vnc",{"_index":965,"t":{"73":{"position":[[415,4],[2161,3],[2253,3]]},"77":{"position":[[760,3],[852,3]]}}}],["vnc_pw",{"_index":1001,"t":{"73":{"position":[[2264,7],[2965,6]]},"77":{"position":[[863,7]]},"79":{"position":[[189,6]]}}}],["volum",{"_index":360,"t":{"12":{"position":[[1332,6]]},"14":{"position":[[555,6],[654,8],[682,8],[798,8]]},"73":{"position":[[1540,6],[1611,6],[1692,6],[2002,8],[2312,8],[2664,8],[6429,6],[6575,8],[7876,8],[8309,6],[8451,8]]},"77":{"position":[[139,6],[210,6],[291,6],[601,8],[911,8],[1263,8]]},"174":{"position":[[1447,8]]},"178":{"position":[[1613,8]]},"293":{"position":[[1225,8]]},"347":{"position":[[493,8]]},"384":{"position":[[1013,8]]},"472":{"position":[[2093,8]]},"543":{"position":[[299,8],[615,8],[2698,8],[2726,8]]},"545":{"position":[[1033,8],[1138,8],[1168,9]]},"555":{"position":[[457,8]]}}}],["volume/bind",{"_index":355,"t":{"12":{"position":[[1090,11]]}}}],["vote",{"_index":2895,"t":{"459":{"position":[[780,6]]},"461":{"position":[[177,6]]}}}],["vp",{"_index":545,"t":{"25":{"position":[[168,3]]}}}],["vpn",{"_index":2412,"t":{"335":{"position":[[721,3]]}}}],["vs",{"_index":1299,"t":{"118":{"position":[[1453,3]]},"376":{"position":[[540,3]]},"378":{"position":[[838,3]]}}}],["vscode",{"_index":2714,"t":{"419":{"position":[[65,7],[321,6]]}}}],["vulfpeck",{"_index":2862,"t":{"457":{"position":[[1878,8]]}}}],["w+.com)/i",{"_index":2678,"t":{"397":{"position":[[669,17]]}}}],["wait",{"_index":1634,"t":{"160":{"position":[[339,5]]},"166":{"position":[[764,5]]},"343":{"position":[[4186,4]]},"435":{"position":[[65,5]]}}}],["wall",{"_index":1192,"t":{"105":{"position":[[692,6]]},"138":{"position":[[690,6]]}}}],["want",{"_index":84,"t":{"4":{"position":[[1594,4],[1655,4],[3722,4],[3828,4],[3907,4]]},"8":{"position":[[1874,4]]},"54":{"position":[[1422,4]]},"60":{"position":[[1866,4]]},"64":{"position":[[783,4],[960,4]]},"73":{"position":[[3290,4],[6002,4],[7559,4]]},"83":{"position":[[642,4],[819,4]]},"130":{"position":[[88,4]]},"151":{"position":[[2185,4],[2355,4]]},"174":{"position":[[82,4],[130,4],[203,4],[296,4],[359,4]]},"176":{"position":[[232,4],[309,4],[425,4]]},"178":{"position":[[112,4],[303,4],[376,4],[533,4]]},"188":{"position":[[700,4],[1467,4]]},"196":{"position":[[527,4]]},"228":{"position":[[208,5],[619,5]]},"230":{"position":[[310,5]]},"242":{"position":[[118,4]]},"297":{"position":[[331,4]]},"307":{"position":[[647,4]]},"335":{"position":[[238,5]]},"343":{"position":[[2245,5]]},"363":{"position":[[777,4]]},"391":{"position":[[26,4],[119,4]]},"459":{"position":[[1563,4]]},"474":{"position":[[68,4]]},"481":{"position":[[341,4],[1740,4]]},"483":{"position":[[348,4],[1213,4]]},"494":{"position":[[127,4]]},"503":{"position":[[14,4],[85,4]]},"507":{"position":[[101,4],[198,4]]},"524":{"position":[[211,4],[291,4]]},"557":{"position":[[3279,4]]},"559":{"position":[[349,4]]},"561":{"position":[[82,4]]},"604":{"position":[[452,4]]},"627":{"position":[[1188,4]]}}}],["wantedby=default.target",{"_index":3229,"t":{"573":{"position":[[416,23]]}}}],["warn",{"_index":170,"t":{"4":{"position":[[4626,7],[5461,7],[5685,7]]},"8":{"position":[[1502,7],[1510,5],[1591,4]]},"22":{"position":[[182,7]]},"27":{"position":[[776,4],[971,7],[1129,4],[1369,7]]},"73":{"position":[[8962,7]]},"134":{"position":[[412,7]]},"190":{"position":[[0,7]]},"293":{"position":[[1295,7]]},"297":{"position":[[1482,7]]},"343":{"position":[[0,7],[1346,7],[4740,7]]},"444":{"position":[[71,4]]},"476":{"position":[[6038,7]]}}}],["watch",{"_index":880,"t":{"60":{"position":[[1586,9]]}}}],["wax",{"_index":2868,"t":{"457":{"position":[[1982,3]]}}}],["way",{"_index":151,"t":{"4":{"position":[[3998,3]]},"18":{"position":[[1453,3]]},"57":{"position":[[204,3]]},"149":{"position":[[160,4]]},"151":{"position":[[1529,3]]},"200":{"position":[[1853,3]]},"293":{"position":[[815,3]]},"359":{"position":[[80,3]]},"425":{"position":[[2931,3]]},"441":{"position":[[777,3]]},"457":{"position":[[673,3]]},"459":{"position":[[366,3],[1239,3]]},"463":{"position":[[143,3]]},"481":{"position":[[263,3]]},"490":{"position":[[321,4]]},"520":{"position":[[137,4]]},"559":{"position":[[397,3]]},"561":{"position":[[130,3]]},"633":{"position":[[2723,3]]}}}],["web",{"_index":533,"t":{"22":{"position":[[146,3]]},"73":{"position":[[2180,3]]},"77":{"position":[[779,3]]},"89":{"position":[[344,3]]},"99":{"position":[[344,3]]},"147":{"position":[[120,3]]},"149":{"position":[[337,3],[766,3],[1802,3],[1881,3],[1920,3]]},"168":{"position":[[419,3]]},"182":{"position":[[746,3]]},"188":{"position":[[101,3]]},"200":{"position":[[846,3]]},"204":{"position":[[70,3]]},"210":{"position":[[72,3]]},"214":{"position":[[450,3],[521,3]]},"303":{"position":[[4227,3],[5429,3]]},"319":{"position":[[102,3]]},"327":{"position":[[35,3],[285,3]]},"343":{"position":[[2208,3]]},"415":{"position":[[142,3]]},"427":{"position":[[426,3]]},"435":{"position":[[2023,3]]},"437":{"position":[[182,3],[200,3],[484,3]]},"441":{"position":[[529,3]]},"549":{"position":[[1613,3],[2322,3]]},"581":{"position":[[50,3]]},"616":{"position":[[80,3]]},"633":{"position":[[1006,3]]},"637":{"position":[[128,3]]}}}],["webhook",{"_index":198,"t":{"4":{"position":[[5313,11]]},"27":{"position":[[0,8],[187,8],[249,7],[286,8],[322,7],[402,11]]},"335":{"position":[[101,7],[282,8]]},"425":{"position":[[1692,8]]},"569":{"position":[[414,8]]},"581":{"position":[[1023,8]]},"633":{"position":[[815,8]]}}}],["webscrobbl",{"_index":535,"t":{"22":{"position":[[233,14]]},"157":{"position":[[936,12]]},"166":{"position":[[268,13]]},"335":{"position":[[21,12],[314,12],[644,12]]},"337":{"position":[[31,12]]},"339":{"position":[[301,12]]},"341":{"position":[[348,12],[428,12],[552,12],[765,12],[1111,12],[1197,12],[1433,12],[2082,12],[2280,12],[2805,12],[3226,14]]},"435":{"position":[[79,12],[409,14],[434,14],[664,14],[689,14],[2425,13]]},"543":{"position":[[876,14]]},"599":{"position":[[251,14],[1193,13]]},"633":{"position":[[491,12]]}}}],["webscrobbler.json",{"_index":2414,"t":{"337":{"position":[[161,17]]}}}],["webscrobbler/lfm",{"_index":2801,"t":{"435":{"position":[[1697,16]]}}}],["websit",{"_index":1153,"t":{"97":{"position":[[131,7]]},"110":{"position":[[200,7]]},"138":{"position":[[1729,8]]},"149":{"position":[[838,7]]},"339":{"position":[[101,7],[128,8]]},"457":{"position":[[191,8]]},"559":{"position":[[566,7]]},"561":{"position":[[299,7]]}}}],["websocket",{"_index":1767,"t":{"182":{"position":[[130,11],[302,10]]},"283":{"position":[[49,9]]},"285":{"position":[[352,9]]},"425":{"position":[[1887,9]]}}}],["week",{"_index":1100,"t":{"87":{"position":[[314,5],[765,4]]}}}],["weight",{"_index":1337,"t":{"118":{"position":[[3664,8]]},"483":{"position":[[2388,6],[2730,7],[2774,7]]}}}],["well",{"_index":288,"t":{"10":{"position":[[125,4]]},"16":{"position":[[313,4]]},"27":{"position":[[1520,4]]},"166":{"position":[[963,4]]},"178":{"position":[[92,4]]},"297":{"position":[[558,4]]},"425":{"position":[[167,4],[1571,4]]},"439":{"position":[[566,5]]},"449":{"position":[[119,5]]},"476":{"position":[[6323,4],[6425,4]]},"488":{"position":[[776,5]]},"494":{"position":[[97,4]]},"569":{"position":[[36,4]]},"602":{"position":[[267,4]]},"647":{"position":[[165,4]]}}}],["went",{"_index":2880,"t":{"457":{"position":[[3021,4]]}}}],["wgxl6bsuq343",{"_index":2465,"t":{"343":{"position":[[2716,16],[3945,17]]}}}],["whatev",{"_index":715,"t":{"44":{"position":[[554,8]]},"166":{"position":[[432,8]]},"335":{"position":[[224,9]]},"343":{"position":[[2232,8]]},"507":{"position":[[238,8]]},"565":{"position":[[642,8]]}}}],["whatever.tld/subdir/api",{"_index":2469,"t":{"343":{"position":[[3585,26]]}}}],["wheatu",{"_index":2641,"t":{"376":{"position":[[772,10],[954,10]]},"476":{"position":[[3058,10],[4525,10],[4689,7],[4730,8],[4937,10],[5475,10],[5537,9],[5695,10]]},"490":{"position":[[675,10],[921,10]]}}}],["when/if",{"_index":2842,"t":{"457":{"position":[[349,7]]}}}],["whether",{"_index":661,"t":{"38":{"position":[[440,7]]},"57":{"position":[[543,7]]},"363":{"position":[[23,7]]},"599":{"position":[[2676,7]]}}}],["whistl",{"_index":3237,"t":{"581":{"position":[[146,9]]}}}],["whitelist",{"_index":2133,"t":{"273":{"position":[[263,9]]},"295":{"position":[[1830,12],[3176,12]]},"341":{"position":[[1822,12],[3182,12]]}}}],["whitelistedapp",{"_index":2010,"t":{"218":{"position":[[2265,18],[3642,18]]}}}],["whitelisteddevic",{"_index":2008,"t":{"218":{"position":[[2216,21],[3593,21]]}}}],["whitespac",{"_index":1267,"t":{"118":{"position":[[252,11]]}}}],["whole",{"_index":1360,"t":{"118":{"position":[[4433,5],[4466,5]]}}}],["whose",{"_index":2145,"t":{"277":{"position":[[456,5],[566,5]]}}}],["wide",{"_index":410,"t":{"18":{"position":[[84,6]]}}}],["wider",{"_index":2896,"t":{"459":{"position":[[824,5]]},"461":{"position":[[221,5]]}}}],["window",{"_index":1032,"t":{"73":{"position":[[4039,7],[4859,7],[5411,7],[8834,7],[9050,7],[9734,7]]},"87":{"position":[[770,6],[1175,6]]},"192":{"position":[[356,7]]},"194":{"position":[[509,6]]},"216":{"position":[[996,7]]},"327":{"position":[[196,6]]},"431":{"position":[[250,6]]},"549":{"position":[[972,7]]}}}],["wish",{"_index":357,"t":{"12":{"position":[[1173,4]]},"273":{"position":[[7,4]]},"384":{"position":[[161,4]]},"425":{"position":[[607,4]]},"457":{"position":[[1992,4]]},"472":{"position":[[329,4],[1052,4]]},"557":{"position":[[3022,4],[3175,4]]},"599":{"position":[[1554,4]]}}}],["within",{"_index":109,"t":{"4":{"position":[[2387,6]]},"8":{"position":[[323,6],[1286,6]]},"118":{"position":[[3020,6]]},"194":{"position":[[500,6]]},"303":{"position":[[1407,6]]},"339":{"position":[[290,6]]},"355":{"position":[[305,6]]},"359":{"position":[[521,6]]},"361":{"position":[[1944,6]]},"367":{"position":[[7,6],[32,6]]},"476":{"position":[[6728,6]]}}}],["without",{"_index":837,"t":{"54":{"position":[[1267,7]]},"60":{"position":[[292,7],[1171,7]]},"64":{"position":[[3749,7]]},"73":{"position":[[778,7],[3546,7],[4924,7]]},"83":{"position":[[3541,7]]},"149":{"position":[[348,7]]},"151":{"position":[[1417,7]]},"220":{"position":[[1847,7]]},"224":{"position":[[2701,7]]},"234":{"position":[[345,7]]},"238":{"position":[[2674,7]]},"253":{"position":[[345,7]]},"257":{"position":[[1777,7]]},"261":{"position":[[1576,7]]},"265":{"position":[[1427,7]]},"269":{"position":[[1668,7]]},"275":{"position":[[289,7]]},"291":{"position":[[1675,7]]},"303":{"position":[[4857,7]]},"315":{"position":[[513,7]]},"325":{"position":[[2913,7]]},"417":{"position":[[391,7]]},"425":{"position":[[2638,7]]},"447":{"position":[[153,7]]},"451":{"position":[[538,7]]},"476":{"position":[[6018,7]]},"483":{"position":[[477,7]]},"488":{"position":[[45,7]]},"492":{"position":[[162,7]]},"533":{"position":[[499,7]]},"599":{"position":[[2646,7]]},"602":{"position":[[57,7]]},"610":{"position":[[39,7]]},"633":{"position":[[2178,7],[2275,7]]}}}],["won't",{"_index":1424,"t":{"132":{"position":[[213,5]]},"490":{"position":[[352,5]]}}}],["word",{"_index":1277,"t":{"118":{"position":[[575,4],[634,5]]}}}],["work",{"_index":261,"t":{"8":{"position":[[1262,5]]},"29":{"position":[[154,7]]},"73":{"position":[[3208,5],[3592,4],[6693,4],[8569,4],[8825,4],[8913,7],[10085,4]]},"79":{"position":[[432,5]]},"105":{"position":[[208,5]]},"134":{"position":[[452,4]]},"138":{"position":[[206,5]]},"140":{"position":[[26,4]]},"145":{"position":[[179,6]]},"190":{"position":[[247,4]]},"194":{"position":[[695,6]]},"224":{"position":[[3090,8]]},"232":{"position":[[84,7],[418,6]]},"238":{"position":[[3044,8]]},"251":{"position":[[84,7],[418,6]]},"271":{"position":[[333,5]]},"287":{"position":[[303,4]]},"297":{"position":[[553,4]]},"303":{"position":[[624,4],[2371,5]]},"319":{"position":[[382,4]]},"335":{"position":[[491,4]]},"343":{"position":[[133,7],[194,5],[1541,7],[1631,5],[4807,4]]},"417":{"position":[[237,7]]},"437":{"position":[[429,5]]},"439":{"position":[[1166,7]]},"441":{"position":[[350,8]]},"449":{"position":[[166,5],[226,5]]},"459":{"position":[[1473,4]]},"463":{"position":[[377,4]]},"483":{"position":[[1989,4]]},"549":{"position":[[83,7],[565,7],[822,7]]},"586":{"position":[[885,4]]},"594":{"position":[[663,4]]}}}],["workflow",{"_index":1394,"t":{"120":{"position":[[375,8]]}}}],["workingdirectory=/path/to/multi",{"_index":3225,"t":{"573":{"position":[[319,31]]}}}],["workspac",{"_index":961,"t":{"73":{"position":[[285,10]]},"419":{"position":[[25,9]]}}}],["world",{"_index":2875,"t":{"457":{"position":[[2087,5]]}}}],["worldwid",{"_index":2986,"t":{"481":{"position":[[1084,11]]},"488":{"position":[[571,9],[984,9]]}}}],["worri",{"_index":1396,"t":{"120":{"position":[[422,5]]},"599":{"position":[[2664,5]]}}}],["worst",{"_index":1442,"t":{"136":{"position":[[1408,5]]}}}],["wrap",{"_index":1455,"t":{"138":{"position":[[1936,7]]}}}],["wrapped.baileytownsend.dev",{"_index":1454,"t":{"138":{"position":[[1905,26]]}}}],["write",{"_index":750,"t":{"46":{"position":[[680,5],[2084,5]]},"66":{"position":[[1175,5],[2593,5]]},"85":{"position":[[934,5],[2310,5]]},"91":{"position":[[844,5],[2313,5]]},"95":{"position":[[617,5],[1994,5]]},"103":{"position":[[941,5],[2372,5]]},"105":{"position":[[469,5],[1086,8]]},"110":{"position":[[1866,5],[3307,5]]},"114":{"position":[[729,5],[2194,5]]},"138":{"position":[[467,5],[1084,8]]},"143":{"position":[[1230,5],[2607,5]]},"153":{"position":[[982,5],[2685,5]]},"186":{"position":[[746,5],[2182,5]]},"188":{"position":[[3880,5],[5712,5]]},"198":{"position":[[770,5],[2207,5]]},"202":{"position":[[605,5],[1937,5]]},"208":{"position":[[779,5],[2133,5]]},"214":{"position":[[745,5],[2108,5]]},"218":{"position":[[1095,5],[2481,5]]},"220":{"position":[[1084,5],[2741,5]]},"234":{"position":[[853,5],[2187,5]]},"253":{"position":[[927,5],[2267,5]]},"257":{"position":[[1004,5],[2694,5]]},"261":{"position":[[778,5],[2517,5]]},"265":{"position":[[659,5],[2292,5]]},"269":{"position":[[900,5],[2625,5]]},"277":{"position":[[974,5],[2345,5]]},"281":{"position":[[710,5],[2069,5]]},"285":{"position":[[725,5],[2106,5]]},"291":{"position":[[902,5],[2602,5]]},"295":{"position":[[742,5],[2082,5]]},"301":{"position":[[1213,5],[2635,5]]},"305":{"position":[[756,5],[2230,5]]},"317":{"position":[[734,5],[2202,5]]},"325":{"position":[[2145,5],[3836,5]]},"329":{"position":[[629,5],[1939,5]]},"333":{"position":[[606,5],[1942,5]]},"341":{"position":[[674,5],[2049,5]]},"345":{"position":[[851,5],[2331,5]]},"349":{"position":[[708,5],[2085,5]]},"457":{"position":[[2488,5]]}}}],["written",{"_index":2699,"t":{"415":{"position":[[19,7]]}}}],["wrong",{"_index":3028,"t":{"490":{"position":[[1842,6]]},"496":{"position":[[69,5]]}}}],["ws",{"_index":2423,"t":{"339":{"position":[[66,2]]}}}],["ws://192.168.0.101",{"_index":1769,"t":{"182":{"position":[[393,20]]},"186":{"position":[[1885,21],[3315,21]]}}}],["ws://192.168.0.101/api/live/nowplaying/websocket",{"_index":1770,"t":{"182":{"position":[[417,48]]}}}],["ws://192.168.0.101:3456/mopidy/w",{"_index":2127,"t":{"271":{"position":[[1180,34]]}}}],["ws://azura.mydomain.com",{"_index":1771,"t":{"182":{"position":[[466,25]]}}}],["ws://azura.mydomain.com.com/api/live/nowplaying/websocket",{"_index":1772,"t":{"182":{"position":[[495,57]]}}}],["ws://localhost:6680/mopidy/w",{"_index":2121,"t":{"271":{"position":[[542,29],[1070,29]]},"277":{"position":[[331,30]]}}}],["ws://localhost:7905",{"_index":2170,"t":{"283":{"position":[[469,19]]},"285":{"position":[[311,19],[1863,22],[3238,22]]}}}],["ws://mopidy.mydomain.com:6680/mopidy/w",{"_index":2126,"t":{"271":{"position":[[1120,40]]}}}],["ws://mopidy.mydomain.com:80/mopw",{"_index":2129,"t":{"271":{"position":[[1244,33]]}}}],["ws_blacklist",{"_index":2428,"t":{"341":{"position":[[297,12]]}}}],["ws_enabl",{"_index":2427,"t":{"341":{"position":[[243,9]]}}}],["ws_id",{"_index":2425,"t":{"341":{"position":[[127,5],[202,5]]}}}],["ws_name",{"_index":2426,"t":{"341":{"position":[[178,7]]}}}],["ws_whitelist",{"_index":2429,"t":{"341":{"position":[[372,12]]}}}],["wss://mydomain.com/custom/azura/w",{"_index":1773,"t":{"182":{"position":[[553,36],[593,34]]}}}],["ws|wss]://host:[port",{"_index":1766,"t":{"182":{"position":[[59,22]]},"283":{"position":[[241,22]]}}}],["x",{"_index":477,"t":{"18":{"position":[[2415,1],[4390,1]]},"349":{"position":[[466,1]]},"457":{"position":[[3119,2],[3180,2],[3196,1]]},"588":{"position":[[840,1]]}}}],["x11",{"_index":1893,"t":{"198":{"position":[[486,5]]},"435":{"position":[[543,5],[754,5]]}}}],["x86",{"_index":973,"t":{"73":{"position":[[854,3]]},"541":{"position":[[36,3]]}}}],["x86/arm",{"_index":3481,"t":{"633":{"position":[[1293,7]]}}}],["x86_64",{"_index":2787,"t":{"435":{"position":[[555,7],[766,7]]}}}],["xdg_config_home/multi",{"_index":3140,"t":{"549":{"position":[[990,22]]}}}],["xdg_data_home/multi",{"_index":3142,"t":{"549":{"position":[[1060,20]]}}}],["xdg_runtime_dir",{"_index":1003,"t":{"73":{"position":[[2280,16]]},"77":{"position":[[879,16]]}}}],["xml",{"_index":2307,"t":{"309":{"position":[[489,3]]}}}],["xw",{"_index":1760,"t":{"178":{"position":[[2221,7],[3420,7]]},"481":{"position":[[1066,2]]},"488":{"position":[[615,6],[1028,7]]},"501":{"position":[[397,7]]},"505":{"position":[[494,7]]},"509":{"position":[[793,7],[1372,7]]}}}],["xxx",{"_index":3152,"t":{"549":{"position":[[1404,5],[1427,5]]}}}],["y",{"_index":2882,"t":{"457":{"position":[[3122,2],[3188,2]]},"533":{"position":[[486,1]]}}}],["y4j3",{"_index":1479,"t":{"143":{"position":[[2407,5],[3787,5]]},"325":{"position":[[960,6],[1169,6],[1399,6],[3578,6],[5016,6]]}}}],["yamaha",{"_index":1629,"t":{"157":{"position":[[1001,6]]},"633":{"position":[[508,6]]}}}],["yamahaextendedcontrol",{"_index":2400,"t":{"333":{"position":[[349,21]]}}}],["yandex",{"_index":1631,"t":{"157":{"position":[[1042,6]]},"347":{"position":[[13,6],[131,6],[145,6],[194,6],[404,6],[568,6],[949,6],[1060,6],[1134,6],[1364,6],[1523,6]]},"349":{"position":[[1772,7],[3146,7]]},"633":{"position":[[525,6]]}}}],["ye",{"_index":1875,"t":{"196":{"position":[[371,3],[413,3],[504,3]]},"633":{"position":[[2593,4]]}}}],["year",{"_index":2894,"t":{"459":{"position":[[754,4]]},"461":{"position":[[151,4]]}}}],["yearinmusic.teal.fm",{"_index":1453,"t":{"138":{"position":[[1882,19]]}}}],["ym_api_key=chang",{"_index":2508,"t":{"347":{"position":[[705,17]]}}}],["ym_enable_ynison=tru",{"_index":2511,"t":{"347":{"position":[[760,21]]}}}],["ym_language=ru",{"_index":2510,"t":{"347":{"position":[[743,14]]}}}],["ym_log_level=info",{"_index":2514,"t":{"347":{"position":[[825,17]]}}}],["ym_port=9980",{"_index":2509,"t":{"347":{"position":[[728,12]]}}}],["ym_push_ttl=45",{"_index":2512,"t":{"347":{"position":[[784,14]]}}}],["ym_queue_cache_ttl=15",{"_index":2513,"t":{"347":{"position":[[801,21]]}}}],["ym_token",{"_index":2516,"t":{"347":{"position":[[932,8]]}}}],["ym_token=agaaaaaco3_345345",{"_index":2507,"t":{"347":{"position":[[676,26]]}}}],["ymbridg",{"_index":2527,"t":{"349":{"position":[[590,8],[799,8],[1141,8],[1223,8],[1451,8],[1796,11],[2118,8],[2312,8],[2833,8],[3170,11]]}}}],["ymbridge_api_key",{"_index":2526,"t":{"349":{"position":[[417,16]]}}}],["ymbridge_api_key=chang",{"_index":2503,"t":{"347":{"position":[[466,23]]}}}],["ymbridge_en",{"_index":2522,"t":{"349":{"position":[[261,15]]}}}],["ymbridge_id",{"_index":2520,"t":{"349":{"position":[[127,11],[214,11]]}}}],["ymbridge_nam",{"_index":2521,"t":{"349":{"position":[[184,13]]}}}],["ymbridge_url",{"_index":2523,"t":{"349":{"position":[[321,12]]}}}],["ymbridge_url=http://yandex",{"_index":2501,"t":{"347":{"position":[[419,26]]}}}],["you'll",{"_index":2547,"t":{"355":{"position":[[0,6]]}}}],["you'r",{"_index":3204,"t":{"567":{"position":[[251,6]]}}}],["you'v",{"_index":2544,"t":{"353":{"position":[[125,6]]}}}],["young",{"_index":2665,"t":{"389":{"position":[[172,7]]}}}],["yourappnam",{"_index":2476,"t":{"343":{"position":[[4498,13]]}}}],["yourhostip:yourport",{"_index":2369,"t":{"327":{"position":[[807,19]]}}}],["yourmultiscrobblerinstance]/api/webscrobbl",{"_index":2405,"t":{"335":{"position":[[118,45]]}}}],["yourmusic.com",{"_index":2679,"t":{"397":{"position":[[729,17]]}}}],["yourmusicsource.com",{"_index":2537,"t":{"351":{"position":[[421,21]]}}}],["yourpassword",{"_index":2343,"t":{"317":{"position":[[1918,15],[3383,15]]}}}],["yourport",{"_index":2370,"t":{"327":{"position":[[846,8]]}}}],["yourself",{"_index":1723,"t":{"176":{"position":[[259,8]]},"303":{"position":[[5023,9]]},"343":{"position":[[2086,8]]},"599":{"position":[[353,8]]}}}],["yourus",{"_index":2342,"t":{"317":{"position":[[1894,11],[1950,10],[3359,11],[3415,10]]}}}],["youtub",{"_index":1610,"t":{"155":{"position":[[152,7]]},"157":{"position":[[1077,7]]},"633":{"position":[[538,7]]},"637":{"position":[[208,7]]}}}],["youtube.js/wiki/how",{"_index":2440,"t":{"343":{"position":[[642,19]]}}}],["youtubetv",{"_index":2438,"t":{"343":{"position":[[570,9],[4767,9]]},"441":{"position":[[224,9],[322,9]]}}}],["yt",{"_index":600,"t":{"29":{"position":[[695,2]]},"343":{"position":[[27,2],[185,2],[4975,2],[5381,2]]},"345":{"position":[[1916,2],[3396,2]]}}}],["ytm",{"_index":2435,"t":{"343":{"position":[[300,3],[1431,3],[1472,3],[1663,3]]},"441":{"position":[[41,3],[151,3],[622,3],[803,3],[1162,3]]},"457":{"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":2491,"t":{"345":{"position":[[391,13]]}}}],["ytm_client_secret",{"_index":2492,"t":{"345":{"position":[[457,17]]}}}],["ytm_cooki",{"_index":2493,"t":{"345":{"position":[[531,10]]}}}],["ytm_enabl",{"_index":2489,"t":{"345":{"position":[[246,10]]}}}],["ytm_id",{"_index":2487,"t":{"345":{"position":[[127,6],[204,6]]}}}],["ytm_log_diff=tru",{"_index":2854,"t":{"457":{"position":[[1632,17]]}}}],["ytm_name",{"_index":2488,"t":{"345":{"position":[[179,8]]}}}],["ytm_redirect_uri",{"_index":2490,"t":{"345":{"position":[[301,16]]}}}],["ytmusic",{"_index":2444,"t":{"343":{"position":[[1034,10],[2581,10],[2828,7],[3810,10],[4294,7]]},"345":{"position":[[734,7],[942,7],[1283,7],[1364,7],[1590,7],[2364,7],[2557,7],[3077,7],[3628,9]]},"457":{"position":[[1534,10],[1729,8],[2369,10],[2539,7]]}}}],["ytmusic.json",{"_index":2443,"t":{"343":{"position":[[982,12],[2537,12],[3406,12]]},"457":{"position":[[1472,14]]}}}],["ytmusic/callback",{"_index":2470,"t":{"343":{"position":[[3627,16]]}}}],["z",{"_index":2883,"t":{"457":{"position":[[3130,2],[3210,2]]}}}],["zimerman",{"_index":1352,"t":{"118":{"position":[[3902,8],[4341,8]]}}}]],"pipeline":["stemmer"]}}] \ No newline at end of file diff --git a/search/index.html b/search/index.html index fe5930c8..c206e73d 100644 --- a/search/index.html +++ b/search/index.html @@ -5,7 +5,7 @@ <meta name="generator" content="Docusaurus v3.9.2"> <title data-rh="true">Search the documentation - + diff --git a/updating/index.html b/updating/index.html index 2d575180..659a1466 100644 --- a/updating/index.html +++ b/updating/index.html @@ -3,11 +3,11 @@ -Overview | Multi-Scrobbler +Overview | Multi-Scrobbler - + - + @@ -67,6 +67,6 @@

    When running MS from a non-pinned source (like :edge tag, a pull request, or git branch) the version will be shown as the branch name and short commit hash EX

    master-1c78da79
    -
    tip

    Using the above information you can verify if you have pulled and successfully recreated a docker container with a new version. If the version string does not change from the previous version running then you are still running the old container

    +
    tip

    Using the above information you can verify if you have pulled and successfully recreated a docker container with a new version. If the version string does not change from the previous version running then you are still running the old container

    \ No newline at end of file diff --git a/updating/upgrade-path/0140/index.html b/updating/upgrade-path/0140/index.html index f818e286..a65c1808 100644 --- a/updating/upgrade-path/0140/index.html +++ b/updating/upgrade-path/0140/index.html @@ -3,11 +3,11 @@ -From < 0.14.0 | Multi-Scrobbler +From < 0.14.0 | Multi-Scrobbler - + - + @@ -73,6 +73,6 @@

    In the MS Dashboard, prior to 0.14.0, UI Client/Sources configured with ENV Config always had generated names like unnamed-koito.

    ENV Config Clients/Sources can now be configured with a name by using the _NAME suffix, example:

    compose.yaml
    services:
    multi-scrobbler:
    # ...
    environment:
    - KOTIO_TOKEN=...
    # ...
    - KOITO_ID=myKoitoID
    - KOITO_NAME=Koito A

    - JELLYFIN_URL=...
    # ..
    - JELLYFIN_ID=myJellyfinID
    - JELLYFIN_NAME=Foxx Jelly
    -
    important

    If you have cached scrobbles make sure to upgrade and run Cached Scrobble Migration before adding names to Client/Sources.

    +
    important

    If you have cached scrobbles make sure to upgrade and run Cached Scrobble Migration before adding names to Client/Sources.

    \ No newline at end of file diff --git a/updating/upgrade-path/index.html b/updating/upgrade-path/index.html index 4df20272..7825a501 100644 --- a/updating/upgrade-path/index.html +++ b/updating/upgrade-path/index.html @@ -3,11 +3,11 @@ -Upgrade Path | Multi-Scrobbler +Upgrade Path | Multi-Scrobbler - + - + @@ -15,6 +15,6 @@

    Upgrade Path

    The majority of changes are detailed in Github Release Notes, including most breaking changes. You should consult the release notes for each version you will be updating through/to.

    Upgrade paths for specific version, detailed here, are reserved for:

    Required Upgrade

    Versions you must upgrade to before upgrading to a newer version. Likely due to the codebase containing functionality to upgrade persistent data that cannot be migrating across multiple versions.

    -

    The type of upgrade is shown at the top of each page with the same colored callout shown above.

    +

    The type of upgrade is shown at the top of each page with the same colored callout shown above.

    \ No newline at end of file -- 2.51.2