Florian RICHER
efb95c2bb2
Add dot_config/spicetify/CustomApps/spicetify-marketplace/CONTRIBUTING.md Add dot_config/spicetify/CustomApps/spicetify-marketplace/LICENSE Add dot_config/spicetify/CustomApps/spicetify-marketplace/README.md Add dot_config/spicetify/CustomApps/spicetify-marketplace/blacklist.json Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_eslintrc.json Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_github/ISSUE_TEMPLATE/bug_report.yml Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_github/ISSUE_TEMPLATE/config.yml Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_github/ISSUE_TEMPLATE/feature_request.yml Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_github/ISSUE_TEMPLATE/malicious_extension_report.yml Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_github/dependabot.yml Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_github/workflows/lint.yml Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_gitignore Add dot_config/spicetify/CustomApps/spicetify-marketplace/dot_nvmrc Add dot_config/spicetify/CustomApps/spicetify-marketplace/executable_install.sh Add dot_config/spicetify/CustomApps/spicetify-marketplace/extension.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/index.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/install.ps1 Add dot_config/spicetify/CustomApps/spicetify-marketplace/manifest.json Add dot_config/spicetify/CustomApps/spicetify-marketplace/package-lock.json Add dot_config/spicetify/CustomApps/spicetify-marketplace/package.json Add dot_config/spicetify/CustomApps/spicetify-marketplace/snippets.json Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/AddSnippetModal.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/Card.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/Icons.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/OptionsMenu.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/ReadmePage.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/ReloadModal.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/Settings.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/SortBox.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/TabBar.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/src/Utils.js Add dot_config/spicetify/CustomApps/spicetify-marketplace/style.css Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/components/add-snippet-modal.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/components/card.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/components/fixes.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/components/grid.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/components/readme-pages.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/components/reload-modal.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/components/settings.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/styles/style.scss Add dot_config/spicetify/CustomApps/spicetify-marketplace/tsconfig.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_executable_index.html Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_executable_login.css Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_executable_login.js Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_executable_manifest.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_executable_vendor~login.css Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_executable_vendor~login.js Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIAraOnly-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIAraOnly-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIAraOnly-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIAraOnly-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUICyrOnly-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUICyrOnly-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUICyrOnly-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUICyrOnly-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIHbrOnly-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIHbrOnly-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIHbrOnly-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIHbrOnly-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIv3T-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIv3T-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIv3T-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_CircularSpUIv3T-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_fonts/private_executable_spoticon_regular_2.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable___longest.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_af.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_am.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ar.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_az.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_bg.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_bho.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_bn.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_cs.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_da.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_de.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_el.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_en.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_es-419.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_es.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_et.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_fa.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_fi.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_fil.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_fr-CA.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_fr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_gu.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_he.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_hi.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_hr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_hu.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_id.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_is.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_it.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ja.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_kn.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ko.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_lt.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_lv.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ml.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_mr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ms.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_nb.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ne.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_nl.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_or.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_pa-IN.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_pa-PK.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_pl.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_pt-BR.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_pt-PT.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ro.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ru.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_sk.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_sl.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_sr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_sv.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_sw.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ta.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_te.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_th.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_tr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_uk.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_ur.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_vi.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_zh-CN.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_zh-TW.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_i18n/private_executable_zu.json Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_executable_background.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_executable_eye.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_executable_logo.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_executable_scrollbar-buttons.png Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_content-rtl.avif Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_content-small-rtl.avif Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_content-small.avif Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_content.avif Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_controls.png Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_footer-left.png Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_footer-right.png Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_fake-web-player/private_executable_side.png Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_social-buttons/private_executable_apple.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_social-buttons/private_executable_facebook.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_login/private_images/private_social-buttons/private_executable_google.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_12.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_185.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_188.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_188.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_258.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_258.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_375.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_375.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_381.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_396.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_448.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_479.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_479.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_696.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_774.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_774.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_818.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_818.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_blank.html Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_collection-music-download.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_in-app-messaging-preview.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_in-app-messaging-preview.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_index.html Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_licenses.html Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_manifest.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_vendor~xpui.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_vendor~xpui.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-desktop-modals.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-desktop-modals.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-desktop-routes-debug-utils.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-desktop-routes-debug-utils.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-desktop-routes-homepage-takeover-ad.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-desktop-routes-homepage-takeover-ad.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-album.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-all-episode-sponsors.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-all-episode-sponsors.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-all-show-sponsors.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-artist.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-artist.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-blend.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-blend.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-collection-concerts.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-collection-concerts.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-collection-local-files.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-collection-local-files.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-concert.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-concert.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-create-playlist.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-download-page.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-download-page.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-enhanced-playlist.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-enhanced-playlist.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-episode.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-episode.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-folder.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-folder.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-offline-browse.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-offline-browse.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-playlist.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-playlist.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-profile.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-profile.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-queue.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-queue.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-track-v2.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-track-v2.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-track.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-view.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui-routes-view.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui.css Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_executable_xpui.js Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIAraOnly-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIAraOnly-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIAraOnly-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIAraOnly-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUICyrOnly-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUICyrOnly-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUICyrOnly-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUICyrOnly-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIHbrOnly-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIHbrOnly-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIHbrOnly-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIHbrOnly-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIv3T-Black.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIv3T-Bold.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIv3T-Book.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_fonts/private_executable_CircularSpUIv3T-Light.woff2 Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable___longest.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_af.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_am.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ar.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_az.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_bg.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_bho.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_bn.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_cs.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_da.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_de.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_el.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_en.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_es-419.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_es.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_et.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_fa.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_fi.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_fil.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_fr-CA.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_fr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_gu.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_he.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_hi.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_hr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_hu.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_id.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_is.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_it.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ja.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_kn.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ko.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_lt.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_lv.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ml.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_mr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ms.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_nb.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ne.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_nl.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_or.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_pa-IN.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_pa-PK.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_pl.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_pt-BR.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_pt-PT.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ro.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ru.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_sk.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_sl.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_sr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_sv.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_sw.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ta.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_te.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_th.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_tr.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_uk.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_ur.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_vi.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_zh-CN.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_zh-TW.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_i18n/private_executable_zu.json Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_devices/private_executable_mac.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_connect-to-devices-white.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_connect_header@1x.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_equaliser-animated-green.gif Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_equaliser-green.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_hifi-button-off.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_hifi-button-on.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_hifi.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_playlist-folder-filled.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_station-header-wave.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_station-wave.svg Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_sw_saber_ahsoka1.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_sw_saber_anakin.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_sw_saber_leia.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_sw_saber_luke.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_sw_saber_mace.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_sw_saber_rey.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_sw_saber_vader.png Add dot_config/spicetify/private_Extracted/private_Raw/private_xpui/private_images/private_executable_tracklist-placeholder.png Add dot_config/spicetify/private_Extracted/private_Raw/private_zlink/private_executable_index.html Add dot_config/spicetify/private_Extracted/private_Raw/private_zlink/private_executable_manifest.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_executable_index.html Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_executable_login.css Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_executable_login.js Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_executable_manifest.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_executable_vendor~login.css Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_executable_vendor~login.js Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_fonts/.keep Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable___longest.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_af.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_am.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ar.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_az.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_bg.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_bho.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_bn.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_cs.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_da.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_de.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_el.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_en.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_es-419.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_es.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_et.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_fa.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_fi.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_fil.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_fr-CA.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_fr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_gu.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_he.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_hi.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_hr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_hu.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_id.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_is.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_it.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ja.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_kn.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ko.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_lt.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_lv.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ml.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_mr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ms.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_nb.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ne.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_nl.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_or.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_pa-IN.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_pa-PK.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_pl.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_pt-BR.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_pt-PT.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ro.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ru.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_sk.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_sl.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_sr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_sv.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_sw.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ta.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_te.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_th.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_tr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_uk.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_ur.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_vi.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_zh-CN.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_zh-TW.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_i18n/private_executable_zu.json Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_images/private_fake-web-player/.keep Add dot_config/spicetify/private_Extracted/private_Themed/private_login/private_images/private_social-buttons/.keep Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_12.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_185.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_188.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_188.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_258.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_258.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_375.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_375.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_381.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_396.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_448.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_479.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_479.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_696.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_774.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_774.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_818.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_818.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_blank.html Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_collection-music-download.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_in-app-messaging-preview.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_in-app-messaging-preview.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_index.html Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_licenses.html Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_manifest.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_vendor~xpui.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_vendor~xpui.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-desktop-modals.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-desktop-modals.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-desktop-routes-debug-utils.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-desktop-routes-debug-utils.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-desktop-routes-homepage-takeover-ad.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-desktop-routes-homepage-takeover-ad.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-album.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-all-episode-sponsors.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-all-episode-sponsors.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-all-show-sponsors.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-artist.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-artist.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-blend.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-blend.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-collection-concerts.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-collection-concerts.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-collection-local-files.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-collection-local-files.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-concert.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-concert.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-create-playlist.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-download-page.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-download-page.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-enhanced-playlist.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-enhanced-playlist.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-episode.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-episode.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-folder.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-folder.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-offline-browse.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-offline-browse.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-playlist.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-playlist.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-profile.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-profile.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-queue.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-queue.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-track-v2.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-track-v2.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-track.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-view.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui-routes-view.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui.css Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_executable_xpui.js Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_fonts/.keep Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable___longest.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_af.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_am.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ar.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_az.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_bg.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_bho.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_bn.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_cs.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_da.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_de.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_el.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_en.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_es-419.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_es.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_et.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_fa.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_fi.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_fil.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_fr-CA.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_fr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_gu.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_he.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_hi.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_hr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_hu.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_id.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_is.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_it.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ja.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_kn.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ko.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_lt.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_lv.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ml.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_mr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ms.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_nb.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ne.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_nl.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_or.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_pa-IN.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_pa-PK.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_pl.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_pt-BR.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_pt-PT.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ro.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ru.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_sk.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_sl.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_sr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_sv.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_sw.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ta.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_te.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_th.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_tr.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_uk.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_ur.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_vi.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_zh-CN.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_zh-TW.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_i18n/private_executable_zu.json Add dot_config/spicetify/private_Extracted/private_Themed/private_xpui/private_images/private_devices/.keep Add dot_config/spicetify/private_Extracted/private_Themed/private_zlink/private_executable_index.html Add dot_config/spicetify/private_Extracted/private_Themed/private_zlink/private_executable_manifest.json
496 lines
19 KiB
JavaScript
496 lines
19 KiB
JavaScript
// @ts-check
|
|
|
|
// NAME: Spicetify Marketplace Extension
|
|
// AUTHOR: theRealPadster, CharlieS1103
|
|
// DESCRIPTION: Companion extension for Spicetify Marketplace
|
|
|
|
/// <reference path="../spicetify-cli/globals.d.ts" />
|
|
|
|
// Reset any Marketplace localStorage keys (effectively resetting it completely)
|
|
// eslint-disable-next-line no-redeclare
|
|
const resetMarketplace = () => {
|
|
console.log("Resetting Marketplace");
|
|
|
|
// Loop through and reset marketplace keys
|
|
Object.keys(localStorage).forEach((key) => {
|
|
if (key.startsWith("marketplace:")) {
|
|
localStorage.removeItem(key);
|
|
console.log(`Removed ${key}`);
|
|
}
|
|
});
|
|
|
|
console.log("Marketplace has been reset");
|
|
location.reload();
|
|
};
|
|
|
|
// Expose useful methods in global context
|
|
// @ts-ignore
|
|
window.Marketplace = {
|
|
// Should allow you to reset Marketplace from the dev console if it's b0rked
|
|
reset: resetMarketplace,
|
|
};
|
|
|
|
// eslint-disable-next-line no-redeclare
|
|
const hexToRGB = (hex) => {
|
|
if (hex.length === 3) {
|
|
hex = hex.split("").map((char) => char + char).join("");
|
|
} else if (hex.length != 6) {
|
|
throw "Only 3- or 6-digit hex colours are allowed.";
|
|
} else if (hex.match(/[^0-9a-f]/i)) {
|
|
throw "Only hex colours are allowed.";
|
|
}
|
|
|
|
const aRgbHex = hex.match(/.{1,2}/g);
|
|
const aRgb = [
|
|
parseInt(aRgbHex[0], 16),
|
|
parseInt(aRgbHex[1], 16),
|
|
parseInt(aRgbHex[2], 16),
|
|
];
|
|
return aRgb;
|
|
};
|
|
|
|
/**
|
|
* Get user, repo, and branch from a GitHub raw URL
|
|
* @param {string} url Github Raw URL
|
|
* @returns { { user: string, repo: string, branch: string, filePath: string } }
|
|
*/
|
|
const getParamsFromGithubRaw = (url) => {
|
|
// eslint-disable-next-line no-useless-escape
|
|
const regex_result = url.match(/https:\/\/raw\.githubusercontent\.com\/(?<user>[^\/]+)\/(?<repo>[^\/]+)\/(?<branch>[^\/]+)\/(?<filePath>.+$)/);
|
|
// e.g. https://raw.githubusercontent.com/CharlieS1103/spicetify-extensions/main/featureshuffle/featureshuffle.js
|
|
|
|
const obj = {
|
|
user: regex_result ? regex_result.groups.user : null,
|
|
repo: regex_result ? regex_result.groups.repo : null,
|
|
branch: regex_result ? regex_result.groups.branch : null,
|
|
filePath: regex_result ? regex_result.groups.filePath : null,
|
|
};
|
|
|
|
return obj;
|
|
};
|
|
|
|
(async function MarketplaceExtension() {
|
|
const { LocalStorage } = Spicetify;
|
|
if (!(LocalStorage)) {
|
|
// console.log('Not ready, waiting...');
|
|
setTimeout(MarketplaceExtension, 1000);
|
|
return;
|
|
}
|
|
|
|
// TODO: can we reference/require/import common files between extension and custom app?
|
|
const LOCALSTORAGE_KEYS = {
|
|
"installedExtensions": "marketplace:installed-extensions",
|
|
"installedSnippets": "marketplace:installed-snippets",
|
|
"installedThemes": "marketplace:installed-themes",
|
|
"activeTab": "marketplace:active-tab",
|
|
"tabs": "marketplace:tabs",
|
|
// Theme installed store the localsorage key of the theme (e.g. marketplace:installed:NYRI4/Comfy-spicetify/user.css)
|
|
"themeInstalled": "marketplace:theme-installed",
|
|
"colorShift": "marketplace:colorShift",
|
|
};
|
|
|
|
const getLocalStorageDataFromKey = (key, fallback) => {
|
|
return JSON.parse(localStorage.getItem(key)) ?? fallback;
|
|
};
|
|
|
|
const initializeExtension = (extensionKey) => {
|
|
const extensionManifest = getLocalStorageDataFromKey(extensionKey);
|
|
// Abort if no manifest found or no extension URL (i.e. a theme)
|
|
if (!extensionManifest || !extensionManifest.extensionURL) return;
|
|
|
|
console.log("Initializing extension: ", extensionManifest);
|
|
|
|
const script = document.createElement("script");
|
|
script.defer = true;
|
|
script.src = extensionManifest.extensionURL;
|
|
|
|
// If it's a github raw script, use jsdelivr
|
|
if (script.src.indexOf("raw.githubusercontent.com") > -1) {
|
|
const { user, repo, branch, filePath } = getParamsFromGithubRaw(extensionManifest.extensionURL);
|
|
if (!user || !repo || !branch || !filePath) return;
|
|
script.src = `https://cdn.jsdelivr.net/gh/${user}/${repo}@${branch}/${filePath}`;
|
|
}
|
|
|
|
script.src = `${script.src}?time=${Date.now()}`;
|
|
|
|
document.body.appendChild(script);
|
|
};
|
|
|
|
/**
|
|
* Loop through the snippets and add the contents of the code as a style tag in the DOM
|
|
* @param { { title: string; description: string; code: string;}[] } snippets The snippets to initialize
|
|
*/
|
|
// TODO: keep this in sync with the index.js file
|
|
const initializeSnippets = (snippets) => {
|
|
// Remove any existing marketplace snippets
|
|
const existingSnippets = document.querySelector("style.marketplaceSnippets");
|
|
if (existingSnippets) existingSnippets.remove();
|
|
|
|
const style = document.createElement("style");
|
|
const styleContent = snippets.reduce((accum, snippet) => {
|
|
accum += `/* ${snippet.title} - ${snippet.description} */\n`;
|
|
accum += `${snippet.code}\n`;
|
|
return accum;
|
|
}, "");
|
|
|
|
style.innerHTML = styleContent;
|
|
style.classList.add("marketplaceSnippets");
|
|
document.head.appendChild(style);
|
|
};
|
|
|
|
// NOTE: Keep in sync with index.js
|
|
const injectColourScheme = (scheme) => {
|
|
try {
|
|
// Remove any existing Spicetify scheme
|
|
const existingColorsCSS = document.querySelector("link[href='colors.css']");
|
|
if (existingColorsCSS) existingColorsCSS.remove();
|
|
|
|
// Remove any existing marketplace scheme
|
|
const existingMarketplaceSchemeCSS = document.querySelector("style.marketplaceCSS.marketplaceScheme");
|
|
if (existingMarketplaceSchemeCSS) existingMarketplaceSchemeCSS.remove();
|
|
|
|
// Add new marketplace scheme
|
|
const schemeTag = document.createElement("style");
|
|
schemeTag.classList.add("marketplaceCSS");
|
|
schemeTag.classList.add("marketplaceScheme");
|
|
// const theme = document.querySelector('#theme');
|
|
let injectStr = ":root {";
|
|
|
|
const themeIniKeys = Object.keys(scheme);
|
|
themeIniKeys.forEach((key) => {
|
|
injectStr += `--spice-${key}: #${scheme[key]};`;
|
|
injectStr += `--spice-rgb-${key}: ${hexToRGB(scheme[key])};`;
|
|
});
|
|
injectStr += "}";
|
|
schemeTag.innerHTML = injectStr;
|
|
document.head.appendChild(schemeTag);
|
|
} catch (error) {
|
|
console.warn(error);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Update the user.css in the DOM
|
|
* @param {string} userCSS The contents of the new user.css
|
|
*/
|
|
const injectUserCSS = (userCSS) => {
|
|
try {
|
|
// Remove any existing Spicetify user.css
|
|
const existingUserThemeCSS = document.querySelector("link[href='user.css']");
|
|
if (existingUserThemeCSS) existingUserThemeCSS.remove();
|
|
|
|
// Remove any existing marketplace scheme
|
|
const existingMarketplaceUserCSS = document.querySelector("style.marketplaceCSS.marketplaceUserCSS");
|
|
if (existingMarketplaceUserCSS) existingMarketplaceUserCSS.remove();
|
|
|
|
// Add new marketplace scheme
|
|
const userCssTag = document.createElement("style");
|
|
userCssTag.classList.add("marketplaceCSS");
|
|
userCssTag.classList.add("marketplaceUserCSS");
|
|
userCssTag.innerHTML = userCSS;
|
|
document.head.appendChild(userCssTag);
|
|
} catch (error) {
|
|
console.warn(error);
|
|
}
|
|
};
|
|
|
|
// I guess this is okay to not have an end condition on the interval
|
|
// because if they turn the setting on or off,
|
|
// closing the settings modal will reload the page
|
|
const initColorShiftLoop = (schemes) => {
|
|
let i = 0;
|
|
const NUM_SCHEMES = Object.keys(schemes).length;
|
|
setInterval(() => {
|
|
// Resets to zero when passes the last scheme
|
|
i = i % NUM_SCHEMES;
|
|
const style = document.createElement("style");
|
|
style.className = "colorShift-style";
|
|
style.innerHTML = `* {
|
|
transition-duration: 400ms;
|
|
}
|
|
main-type-bass {
|
|
transition-duration: unset !important;
|
|
}`;
|
|
|
|
document.body.appendChild(style);
|
|
injectColourScheme(Object.values(schemes)[i]);
|
|
i++;
|
|
style.remove();
|
|
}, 60 * 1000);
|
|
};
|
|
|
|
const parseCSS = async (themeManifest) => {
|
|
|
|
const userCssUrl = themeManifest.cssURL.indexOf("raw.githubusercontent.com") > -1
|
|
// TODO: this should probably be the URL stored in localstorage actually (i.e. put this url in localstorage)
|
|
? `https://cdn.jsdelivr.net/gh/${themeManifest.user}/${themeManifest.repo}@${themeManifest.branch}/${themeManifest.manifest.usercss}`
|
|
: themeManifest.cssURL;
|
|
// TODO: Make this more versatile
|
|
const assetsUrl = userCssUrl.replace("/user.css", "/assets/");
|
|
|
|
console.log("Parsing CSS: ", userCssUrl);
|
|
let css = await fetch(`${userCssUrl}?time=${Date.now()}`).then(res => res.text());
|
|
// console.log("Parsed CSS: ", css);
|
|
|
|
let urls = css.matchAll(/url\(['|"](?<path>.+?)['|"]\)/gm) || [];
|
|
|
|
for (const match of urls) {
|
|
const url = match.groups.path;
|
|
// console.log(url);
|
|
// If it's a relative URL, transform it to HTTP URL
|
|
if (!url.startsWith("http") && !url.startsWith("data")) {
|
|
const newUrl = assetsUrl + url.replace(/\.\//g, "");
|
|
css = css.replace(url, newUrl);
|
|
}
|
|
}
|
|
|
|
// console.log("New CSS: ", css);
|
|
|
|
return css;
|
|
};
|
|
|
|
const initializeTheme = async (themeKey) => {
|
|
const themeManifest = getLocalStorageDataFromKey(themeKey);
|
|
// Abort if no manifest found
|
|
if (!themeManifest) {
|
|
console.log("No theme manifest found");
|
|
return;
|
|
}
|
|
|
|
console.log("Initializing theme: ", themeManifest);
|
|
|
|
// Inject colour scheme if found
|
|
if (themeManifest.schemes) {
|
|
const activeScheme = themeManifest.schemes[themeManifest.activeScheme];
|
|
injectColourScheme(activeScheme);
|
|
|
|
if (localStorage.getItem(LOCALSTORAGE_KEYS.colorShift) === "true") {
|
|
initColorShiftLoop(themeManifest.schemes);
|
|
}
|
|
} else {
|
|
console.warn("No schemes found for theme");
|
|
}
|
|
|
|
// Remove default css
|
|
// TODO: what about if we remove the theme? Should we re-add the user.css/colors.css?
|
|
// const existingUserThemeCSS = document.querySelector("link[href='user.css']");
|
|
// if (existingUserThemeCSS) existingUserThemeCSS.remove();
|
|
|
|
// Remove any existing marketplace theme
|
|
const existingMarketplaceThemeCSS = document.querySelector("link.marketplaceCSS");
|
|
if (existingMarketplaceThemeCSS) existingMarketplaceThemeCSS.remove();
|
|
|
|
// Add theme css
|
|
const userCSS = await parseCSS(themeManifest);
|
|
injectUserCSS(userCSS);
|
|
|
|
// Inject any included js
|
|
if (themeManifest.include && themeManifest.include.length) {
|
|
// console.log("Including js", installedThemeData.include);
|
|
|
|
themeManifest.include.forEach((script) => {
|
|
const newScript = document.createElement("script");
|
|
let src = script;
|
|
|
|
// If it's a github raw script, use jsdelivr
|
|
if (script.indexOf("raw.githubusercontent.com") > -1) {
|
|
const { user, repo, branch, filePath } = getParamsFromGithubRaw(script);
|
|
src = `https://cdn.jsdelivr.net/gh/${user}/${repo}@${branch}/${filePath}`;
|
|
}
|
|
// console.log({src});
|
|
newScript.src = `${src}?time=${Date.now()}`;
|
|
newScript.classList.add("marketplaceScript");
|
|
document.body.appendChild(newScript);
|
|
});
|
|
}
|
|
};
|
|
|
|
console.log("Loaded Marketplace extension");
|
|
|
|
const installedThemeKey = LocalStorage.get(LOCALSTORAGE_KEYS.themeInstalled);
|
|
if (installedThemeKey) initializeTheme(installedThemeKey);
|
|
|
|
const installedSnippetKeys = getLocalStorageDataFromKey(LOCALSTORAGE_KEYS.installedSnippets, []);
|
|
const installedSnippets = installedSnippetKeys.map((key) => getLocalStorageDataFromKey(key));
|
|
initializeSnippets(installedSnippets);
|
|
|
|
const installedExtensions = getLocalStorageDataFromKey(LOCALSTORAGE_KEYS.installedExtensions, []);
|
|
installedExtensions.forEach((extensionKey) => initializeExtension(extensionKey));
|
|
})();
|
|
|
|
const ITEMS_PER_REQUEST = 100;
|
|
|
|
async function Blacklist() {
|
|
const url = "https://raw.githubusercontent.com/CharlieS1103/spicetify-marketplace/main/blacklist.json";
|
|
const jsonReturned = await fetch(url).then(res => res.json()).catch(() => {});
|
|
return jsonReturned.repos;
|
|
}
|
|
|
|
/**
|
|
* TODO
|
|
* @param {"theme"|"extension"} type The repo type
|
|
* @param {number} pageNum The page number
|
|
* @returns TODO
|
|
*/
|
|
async function queryRepos(type, pageNum = 1) {
|
|
const BLACKLIST = window.sessionStorage.getItem("marketplace:blacklist");
|
|
|
|
let url = `https://api.github.com/search/repositories?per_page=${ITEMS_PER_REQUEST}`;
|
|
if (type === "extension") url += `&q=${encodeURIComponent("topic:spicetify-extensions")}`;
|
|
else if (type === "theme") url += `&q=${encodeURIComponent("topic:spicetify-themes")}`;
|
|
if (pageNum) url += `&page=${pageNum}`;
|
|
|
|
const allRepos = await fetch(url).then(res => res.json()).catch(() => []);
|
|
if (!allRepos.items) {
|
|
Spicetify.showNotification("Too Many Requests, Cool Down.");
|
|
}
|
|
|
|
const filteredResults = {
|
|
...allRepos,
|
|
page_count: allRepos.items.length,
|
|
items: allRepos.items.filter(item => !BLACKLIST.includes(item.html_url)),
|
|
};
|
|
|
|
return filteredResults;
|
|
}
|
|
|
|
/**
|
|
* TODO
|
|
* @param {"theme"|"extension"} type The repo type
|
|
* @param {number} pageNum The page number
|
|
* @returns TODO
|
|
*/
|
|
async function loadPageRecursive(type, pageNum) {
|
|
const pageOfRepos = await queryRepos(type, pageNum);
|
|
appendInformationToLocalStorage(pageOfRepos, type);
|
|
|
|
// Sets the amount of items that have thus been fetched
|
|
const soFarResults = ITEMS_PER_REQUEST * (pageNum - 1) + pageOfRepos.page_count;
|
|
console.log({ pageOfRepos });
|
|
const remainingResults = pageOfRepos.total_count - soFarResults;
|
|
|
|
// If still have more results, recursively fetch next page
|
|
console.log(`Parsed ${soFarResults}/${pageOfRepos.total_count} ${type}s`);
|
|
if (remainingResults > 0) return await loadPageRecursive(type, pageNum + 1); // There are more results. currentPage + 1 is the next page to fetch.
|
|
else console.log(`No more ${type} results`);
|
|
}
|
|
|
|
(async function initializePreload() {
|
|
console.log("Preloading extensions and themes...");
|
|
window.sessionStorage.clear();
|
|
const BLACKLIST = await Blacklist();
|
|
window.sessionStorage.setItem("marketplace:blacklist", JSON.stringify(BLACKLIST));
|
|
|
|
// TODO: does this work?
|
|
// The recursion isn't super clean...
|
|
|
|
// Begin by getting the themes and extensions from github
|
|
// const [extensionReposArray, themeReposArray] = await Promise.all([
|
|
await Promise.all([
|
|
loadPageRecursive("extension", 1),
|
|
loadPageRecursive("theme", 1),
|
|
]);
|
|
|
|
// let extensionsNextPage = 1;
|
|
// let themesNextPage = 1;
|
|
// do {
|
|
// extensionReposArray = await loadPage("extension", extensionsNextPage);
|
|
// appendInformationToLocalStorage(extensionReposArray, "extension");
|
|
// } while (extensionsNextPage);
|
|
|
|
// do {
|
|
// themeReposArray = await loadPage("theme", themesNextPage);
|
|
// appendInformationToLocalStorage(themeReposArray, "theme");
|
|
// } while (themesNextPage);
|
|
})();
|
|
|
|
async function appendInformationToLocalStorage(array, type) {
|
|
// This system should make it so themes and extensions are stored concurrently
|
|
for (const repo of array.items) {
|
|
const data = (type === "theme")
|
|
? await fetchThemeManifest(repo.contents_url, repo.default_branch)
|
|
: await fetchExtensionManifest(repo.contents_url, repo.default_branch);
|
|
if (data) {
|
|
addToSessionStorage(data);
|
|
await sleep(5000);
|
|
}
|
|
}
|
|
}
|
|
|
|
// This function is used to fetch manifest of a theme and return it
|
|
async function fetchThemeManifest(contents_url, branch) {
|
|
try {
|
|
const regex_result = contents_url.match(/https:\/\/api\.github\.com\/repos\/(?<user>.+)\/(?<repo>.+)\/contents/);
|
|
// TODO: err handling?
|
|
if (!regex_result || !regex_result.groups) return null;
|
|
let { user, repo } = regex_result.groups;
|
|
let manifests = await getRepoManifest(user, repo, branch);
|
|
// If the manifest returned is not an array, initialize it as one
|
|
if (!Array.isArray(manifests)) manifests = [manifests];
|
|
manifests.user = user;
|
|
manifests.repo = repo;
|
|
if (manifests[0] && manifests[0].name && manifests[0].usercss && manifests[0].description) {
|
|
return manifests;
|
|
}
|
|
return null;
|
|
}
|
|
catch (err) {
|
|
// console.warn(contents_url, err);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// This function is used to fetch manifest of an extension and return it
|
|
async function fetchExtensionManifest(contents_url, branch) {
|
|
try {
|
|
// TODO: use the original search full_name ("theRealPadster/spicetify-hide-podcasts") or something to get the url better?
|
|
const regex_result = contents_url.match(/https:\/\/api\.github\.com\/repos\/(?<user>.+)\/(?<repo>.+)\/contents/);
|
|
// TODO: err handling?
|
|
if (!regex_result || !regex_result.groups) return null;
|
|
const { user, repo } = regex_result.groups;
|
|
let manifests = await getRepoManifest(user, repo, branch);
|
|
// If the manifest returned is not an array, initialize it as one
|
|
if (!Array.isArray(manifests)) manifests = [manifests];
|
|
manifests.user = user;
|
|
manifests.repo = repo;
|
|
if (manifests[0] && manifests[0].name && manifests[0].description && manifests[0].main) {
|
|
return manifests;
|
|
}
|
|
return null;
|
|
}
|
|
catch (err) {
|
|
// console.warn(contents_url, err);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async function getRepoManifest(user, repo, branch) {
|
|
const sessionStorageItem = window.sessionStorage.getItem(`${user}-${repo}`);
|
|
const failedSessionStorageItems = window.sessionStorage.getItem("noManifests");
|
|
if (sessionStorageItem) {
|
|
return null;
|
|
}
|
|
const url = `https://raw.githubusercontent.com/${user}/${repo}/${branch}/manifest.json`;
|
|
if (failedSessionStorageItems?.includes(url)) {
|
|
return null;
|
|
}
|
|
return await fetch(url).then(res => res.json()).catch(() => addToSessionStorage([url], "noManifests"));
|
|
}
|
|
|
|
// This function appends an array to session storage
|
|
function addToSessionStorage(items, key) {
|
|
if (!items || items == null) return;
|
|
items.forEach(item => {
|
|
if (!key) key = `${items.user}-${items.repo}`;
|
|
// If the key already exists, it will append to it instead of overwriting it
|
|
const existing = window.sessionStorage.getItem(key);
|
|
const parsed = existing ? JSON.parse(existing) : [];
|
|
parsed.push(item);
|
|
window.sessionStorage.setItem(key, JSON.stringify(parsed));
|
|
});
|
|
}
|
|
|
|
// This function is used to sleep for a certain amount of time
|
|
function sleep(ms) {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|