dots/config/spicetify/CustomApps/marketplace/extension.js
2023-02-13 01:53:52 -03:00

8 lines
9.3 KiB
JavaScript

"use strict";var marketplace=(()=>{var r=Object.defineProperty,s=Object.defineProperties,n=Object.getOwnPropertyDescriptors,a=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,c=Object.prototype.propertyIsEnumerable,i=(e,t,s)=>t in e?r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s,l=(e,t)=>{for(var s in t=t||{})o.call(t,s)&&i(e,s,t[s]);if(a)for(var s of a(t))c.call(t,s)&&i(e,s,t[s]);return e},u=(e,t)=>s(e,n(t)),p="0.7.0",m="marketplace:installed-extensions",h="marketplace:installed-snippets",d="marketplace:theme-installed",g="marketplace:colorShift",f=100,w=(t,e)=>{t=localStorage.getItem(t);if(!t)return e;try{return JSON.parse(t)}catch(e){return t}},y=e=>{if(3===e.length)e=e.split("").map(e=>e+e).join("");else{if(6!=e.length)throw"Only 3- or 6-digit hex colours are allowed.";if(e.match(/[^0-9a-f]/i))throw"Only hex colours are allowed."}e=e.match(/.{1,2}/g);if(e&&3===e.length)return[parseInt(e[0],16),parseInt(e[1],16),parseInt(e[2],16)];throw"Could not parse hex colour."},S=(e,t)=>{let s=[];return e&&0<e.length?s=e.map(e=>({name:e.name,url:e.url.startsWith("javascript:")?"":e.url})):s.push({name:t,url:"https://github.com/"+t}),s},b=()=>{console.log("Resetting Marketplace"),Object.keys(localStorage).forEach(e=>{e.startsWith("marketplace:")&&(localStorage.removeItem(e),console.log("Removed "+e))}),console.log("Marketplace has been reset"),location.reload()},v=s=>{const e=document.querySelector("link[href='colors.css']"),t=(e&&e.remove(),document.querySelector("style.marketplaceCSS.marketplaceScheme"));if(t&&t.remove(),s){const r=document.createElement("style");r.classList.add("marketplaceCSS"),r.classList.add("marketplaceScheme");let t=":root {";const n=Object.keys(s);n.forEach(e=>{t=(t+=`--spice-${e}: #${s[e]};`)+`--spice-rgb-${e}: ${y(s[e])};`}),t+="}",r.innerHTML=t,document.head.appendChild(r)}else{const a=document.createElement("link");a.setAttribute("rel","stylesheet"),a.setAttribute("href","colors.css"),a.classList.add("userCSS"),document.head.appendChild(a)}},$=e=>{var t,e=e.match(new RegExp("https:\\/\\/raw\\.githubusercontent\\.com\\/(?<user>[^/]+)\\/(?<repo>[^/]+)\\/(?<branch>[^/]+)\\/(?<filePath>.+$)"));return{user:e?null==(t=e.groups)?void 0:t.user:null,repo:e?null==(t=e.groups)?void 0:t.repo:null,branch:e?null==(t=e.groups)?void 0:t.branch:null,filePath:e?null==(t=e.groups)?void 0:t.filePath:null}};function k(r,n){r&&r.forEach(e=>{n=n||r.user+"-"+r.repo;var t=window.sessionStorage.getItem(n);const s=t?JSON.parse(t):[];s.push(e),window.sessionStorage.setItem(n,JSON.stringify(s))})}async function L(e,t,s){var r=window.sessionStorage.getItem(e+"-"+t);const n=window.sessionStorage.getItem("noManifests");if(r)return JSON.parse(r);const a=`https://raw.githubusercontent.com/${e}/${t}/${s}/manifest.json`;if(null!=n&&n.includes(a))return null;r=await fetch(a).then(e=>e.json()).catch(()=>k([a],"noManifests"));return r&&window.sessionStorage.setItem(e+"-"+t,JSON.stringify(r)),r}async function O(e,t){var s=await async function(e,t=1){const s=window.sessionStorage.getItem("marketplace:blacklist");let r="https://api.github.com/search/repositories?per_page="+f;"extension"===e?r+="&q="+encodeURIComponent("topic:spicetify-extensions"):"theme"===e&&(r+="&q="+encodeURIComponent("topic:spicetify-themes")),t&&(r+="&page="+t);const n=await fetch(r).then(e=>e.json()).catch(()=>[]);return n.items||Spicetify.showNotification("Too Many Requests, Cool Down."),u(l({},n),{page_count:n.items.length,items:n.items.filter(e=>!(null!=s&&s.includes(e.html_url)))})}(e,t),r=(!async function(e,t){for(const r of e.items){var s="theme"===t?await async function(t,r,n){try{let e;var s=t.match(new RegExp("https:\\/\\/api\\.github\\.com\\/repos\\/(?<user>.+)\\/(?<repo>.+)\\/contents"));if(!s||!s.groups)return null;const{user:a,repo:o}=s.groups;return e=await L(a,o,r),(e=Array.isArray(e)?e:[e]).reduce((e,t)=>{var s=t.branch||r,s={manifest:t,title:t.name,subtitle:t.description,authors:S(t.authors,a),user:a,repo:o,branch:s,imageURL:t.preview&&t.preview.startsWith("http")?t.preview:`https://raw.githubusercontent.com/${a}/${o}/${s}/`+t.preview,readmeURL:t.readme&&t.readme.startsWith("http")?t.readme:`https://raw.githubusercontent.com/${a}/${o}/${s}/`+t.readme,stars:n,tags:t.tags,cssURL:t.usercss.startsWith("http")?t.usercss:`https://raw.githubusercontent.com/${a}/${o}/${s}/`+t.usercss,schemesURL:t.schemes?t.schemes.startsWith("http")?t.schemes:`https://raw.githubusercontent.com/${a}/${o}/${s}/`+t.schemes:null,include:t.include};return null!=t&&t.name&&null!=t&&t.usercss&&null!=t&&t.description&&e.push(s),e},[])}catch(e){return null}}(r.contents_url,r.default_branch,r.stargazers_count):await async function(t,r,n,a=!1){try{let e;var s=t.match(new RegExp("https:\\/\\/api\\.github\\.com\\/repos\\/(?<user>.+)\\/(?<repo>.+)\\/contents"));if(!s||!s.groups)return null;const{user:o,repo:c}=s.groups;return e=await L(o,c,r),(e=Array.isArray(e)?e:[e]).reduce((e,t)=>{var s=t.branch||r,s={manifest:t,title:t.name,subtitle:t.description,authors:S(t.authors,o),user:o,repo:c,branch:s,imageURL:t.preview&&t.preview.startsWith("http")?t.preview:`https://raw.githubusercontent.com/${o}/${c}/${s}/`+t.preview,extensionURL:t.main.startsWith("http")?t.main:`https://raw.githubusercontent.com/${o}/${c}/${s}/`+t.main,readmeURL:t.readme&&t.readme.startsWith("http")?t.readme:`https://raw.githubusercontent.com/${o}/${c}/${s}/`+t.readme,stars:n,tags:t.tags};return t&&t.name&&t.description&&t.main&&(a&&localStorage.getItem(`marketplace:installed:${o}/${c}/`+t.main)||e.push(s)),e},[])}catch(e){return null}}(r.contents_url,r.default_branch,r.stargazers_count);s&&(k(s),await function(t){return new Promise(e=>setTimeout(e,t))}(5e3))}}(s,e),f*(t-1)+s.page_count),n=(console.log({pageOfRepos:s}),s.total_count-r);if(console.log(`Parsed ${r}/${s.total_count} ${e}s`),0<n)return O(e,t+1);console.log(`No more ${e} results`)}(async()=>{for(;null==Spicetify||!Spicetify.LocalStorage||null==Spicetify||!Spicetify.showNotification;)await new Promise(e=>setTimeout(e,100));const e=document.createElement("script");e.innerHTML="const global = globalThis;",document.head.appendChild(e),console.log("Initializing Spicetify Marketplace v"+p),window.Marketplace={reset:b,version:p};var t=async e=>{const s=w(e);if(s){if(console.log("Initializing theme: ",s),s.schemes){e=s.schemes[s.activeScheme];if(v(e),"true"===localStorage.getItem(g)){var r=s.schemes;let t=0;const n=Object.keys(r).length;setInterval(()=>{t%=n;const e=document.createElement("style");e.className="colorShift-style",e.innerHTML=`* {
transition-duration: 400ms;
}
main-type-bass {
transition-duration: unset !important;
}`,document.body.appendChild(e),v(Object.values(r)[t]),t++,e.remove()},6e4)}}else console.warn("No schemes found for theme");const t=document.querySelector("link.marketplaceCSS");t&&t.remove();e=await(async e=>{if(!e.cssURL)throw new Error("No CSS URL provided");const t=-1<e.cssURL.indexOf("raw.githubusercontent.com")?`https://cdn.jsdelivr.net/gh/${e.user}/${e.repo}@${e.branch}/`+e.manifest.usercss:e.cssURL;var s,r=t.replace("/user.css","/assets/");console.log("Parsing CSS: ",t);let n=await fetch(t+"?time="+Date.now()).then(e=>e.text());for(const a of n.matchAll(new RegExp(`url\\(['|"](?<path>.+?)['|"]\\)`,"gm"))||[]){const o=null==(s=null==a?void 0:a.groups)?void 0:s.path;!o||o.startsWith("http")||o.startsWith("data")||(s=r+o.replace(/\.\//g,""),n=n.replace(o,s))}return n})(s);try{const a=document.querySelector("link[href='user.css']"),o=(a&&a.remove(),document.querySelector("style.marketplaceCSS.marketplaceUserCSS"));if(o&&o.remove(),e){const c=document.createElement("style");c.classList.add("marketplaceCSS"),c.classList.add("marketplaceUserCSS"),c.innerHTML=e,document.head.appendChild(c)}else{const i=document.createElement("link");i.setAttribute("rel","stylesheet"),i.setAttribute("href","user.css"),i.classList.add("userCSS"),document.head.appendChild(i)}}catch(e){console.warn(e)}s.include&&s.include.length&&s.include.forEach(e=>{const t=document.createElement("script");let s=e;var r,n,a;-1<e.indexOf("raw.githubusercontent.com")&&({user:e,repo:r,branch:n,filePath:a}=$(e),s=`https://cdn.jsdelivr.net/gh/${e}/${r}@${n}/`+a),t.src=s+"?time="+Date.now(),t.classList.add("marketplaceScript"),document.body.appendChild(t)})}else console.log("No theme manifest found")},s=(console.log("Loaded Marketplace extension"),localStorage.getItem(d));s&&t(s);const r=w(h,[]);t=r.map(e=>w(e));{s=t;const a=document.querySelector("style.marketplaceSnippets"),o=(a&&a.remove(),document.createElement("style"));s=s.reduce((e,t)=>e=(e+=`/* ${t.title} - ${t.description} */
`)+t.code+`
`,""),o.innerHTML=s,o.classList.add("marketplaceSnippets"),document.head.appendChild(o)}const n=w(m,[]);n.forEach(e=>{if((e=w(e=e))&&e.extensionURL){console.log("Initializing extension: ",e);const n=document.createElement("script");if(n.defer=!0,n.src=e.extensionURL,-1<n.src.indexOf("raw.githubusercontent.com")){var{user:e,repo:t,branch:s,filePath:r}=$(e.extensionURL);if(!(e&&t&&s&&r))return;n.src=`https://cdn.jsdelivr.net/gh/${e}/${t}@${s}/`+r}n.src=n.src+"?time="+Date.now(),document.body.appendChild(n)}})})(),async function(){console.log("Preloading extensions and themes..."),window.sessionStorage.clear();var e=await(await fetch("https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/resources/blacklist.json").then(e=>e.json()).catch(()=>({}))).repos;window.sessionStorage.setItem("marketplace:blacklist",JSON.stringify(e)),await Promise.all([O("extension",1),O("theme",1)])}()})();