import { waitForElement, htmlToNode } from "./Util"; import iconFolder from "icon/folder.light"; import iconFolderOpen from "icon/folder-open.light"; import iconNote from "icon/note"; waitForElement([`.main-rootlist-rootlistPlaylistsScrollNode ul[tabindex="0"]`, `.main-rootlist-rootlistPlaylistsScrollNode ul[tabindex="0"] li`], ([root, firstItem]) => { const listElem = firstItem.parentElement; root.classList.add("dribs-playlist-list"); /** Replace Playlist name with their pictures */ function loadPlaylistImage() { for (const item of listElem.children) { let link = item.querySelector("a"); if (!link) continue; let [_, app, uid] = link.pathname.split("/"); let uri; if (app === "playlist") { uri = Spicetify.URI.playlistV2URI(uid); } else if (app === "folder") { const base64 = localStorage.getItem("dribbblish:folder-image:" + uid); if (base64 != null) { if (link.querySelector("svg")) link.querySelector("svg").remove(); let img = link.querySelector("img"); if (!img) { img = document.createElement("img"); img.classList.add("playlist-picture"); link.prepend(img); } img.src = base64; } else { if (link.querySelector("img")) link.querySelector("img").remove(); let svg = link.querySelector("svg"); if (!svg) { svg = htmlToNode(iconFolder); svg.classList.add("playlist-picture"); link.prepend(svg); } } continue; } Spicetify.CosmosAsync.get(`sp://core-playlist/v1/playlist/${uri.toURI()}/metadata`, { policy: { picture: true } }).then((res) => { const { picture } = res.metadata; if (picture != null && picture.trim() != "") { if (link.querySelector("svg")) link.querySelector("svg").remove(); let img = link.querySelector("img"); if (!img) { img = document.createElement("img"); img.classList.add("playlist-picture"); link.prepend(img); } img.src = picture; } else { if (link.querySelector("img")) link.querySelector("img").remove(); let svg = link.querySelector("svg"); if (!svg) { svg = htmlToNode(iconNote); svg.classList.add("playlist-picture"); link.prepend(svg); } } }); } } loadPlaylistImage(); new MutationObserver(loadPlaylistImage).observe(listElem, { childList: true }); const filePickerForm = document.createElement("form"); filePickerForm.setAttribute("aria-hidden", true); filePickerForm.innerHTML = ''; document.body.appendChild(filePickerForm); /** @type {HTMLInputElement} */ const filePickerInput = filePickerForm.childNodes[0]; filePickerInput.accept = ["image/jpeg", "image/apng", "image/avif", "image/gif", "image/png", "image/svg+xml", "image/webp"].join(","); filePickerInput.onchange = () => { if (!filePickerInput.files.length) return; const file = filePickerInput.files[0]; const reader = new FileReader(); reader.onload = (event) => { const result = event.target.result; const id = Spicetify.URI.from(filePickerInput.uri).id; try { localStorage.setItem("dribbblish:folder-image:" + id, result); } catch { Spicetify.showNotification("File too large"); } loadPlaylistImage(); }; reader.readAsDataURL(file); }; new Spicetify.ContextMenu.Item( "Remove folder image", ([uri]) => { const id = Spicetify.URI.from(uri).id; localStorage.removeItem("dribbblish:folder-image:" + id); loadPlaylistImage(); }, ([uri]) => Spicetify.URI.isFolder(uri), "x" ).register(); new Spicetify.ContextMenu.Item( "Choose folder image", ([uri]) => { filePickerInput.uri = uri; filePickerForm.reset(); filePickerInput.click(); }, ([uri]) => Spicetify.URI.isFolder(uri), "edit" ).register(); });