您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Simplifies the process of extracting images from Blockadelabs skybox generator.
// ==UserScript== // @name BlockadeFarm // @namespace https://github.com/onlypuppy7/ // @version 1.0 // @description Simplifies the process of extracting images from Blockadelabs skybox generator. // @author onlypuppy7 // @match https://skybox.blockadelabs.com/* // @license GPL-3.0 // @grant none // @run-at document-body // ==/UserScript== (function () { 'use strict'; const originalCreateObjectURL = URL.createObjectURL; const blobItems = []; const pendingBlobItems = []; let menuCreated = false; URL.createObjectURL = function (blob) { const blobUrl = originalCreateObjectURL.call(this, blob); console.log(`[Blob] Created blob URL: ${blobUrl}`, blob); if (!menuCreated) { pendingBlobItems.push({ blob, blobUrl }); } else { addBlobToMenu(blob, blobUrl); } return blobUrl; }; function createMenu() { const menu = document.createElement('div'); menu.id = 'blobMenu'; menu.style.position = 'fixed'; menu.style.top = '10%'; menu.style.right = '10px'; menu.style.zIndex = '10000'; menu.style.backgroundColor = '#FFF'; menu.style.border = '1px solid #CCC'; menu.style.borderRadius = '8px'; menu.style.padding = '10px'; menu.style.width = '300px'; menu.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)'; menu.style.maxHeight = '80%'; menu.style.overflowY = 'auto'; const title = document.createElement('h3'); title.textContent = 'BlockadeFarm by onlypuppy7'; title.style.margin = '0 0 10px 0'; title.style.fontSize = '16px'; title.style.color = '#333'; title.style.textAlign = 'center'; menu.appendChild(title); const toolsLabel = document.createElement('h3'); toolsLabel.textContent = 'Tools:'; toolsLabel.style.margin = '0 0 10px 0'; toolsLabel.style.fontSize = '16px'; toolsLabel.style.color = '#333'; toolsLabel.style.textAlign = 'center'; menu.appendChild(toolsLabel); const resetButtonContainer = document.createElement('div'); resetButtonContainer.style.marginBottom = '5px'; resetButtonContainer.style.display = 'flex'; resetButtonContainer.style.justifyContent = 'center'; const resetButton = document.createElement('button'); resetButton.textContent = 'Reset Available Generations'; resetButton.style.backgroundColor = '#FF5733'; resetButton.style.color = '#FFF'; resetButton.style.border = 'none'; resetButton.style.padding = '2px 2px'; resetButton.style.borderRadius = '5px'; resetButton.style.cursor = 'pointer'; resetButton.style.width = '90%'; resetButton.onclick = () => { delete localStorage["available-generations"]; location.reload(true); }; resetButtonContainer.appendChild(resetButton); menu.appendChild(resetButtonContainer); const linksContainer = document.createElement('div'); linksContainer.id = 'linksContainer'; menu.appendChild(linksContainer); createMenuLink(linksContainer, "Convert To Cubemap", "https://jaxry.github.io/panorama-to-cubemap/"); const blobsLabel = document.createElement('h3'); blobsLabel.textContent = 'Detected Skyboxes:'; blobsLabel.style.margin = '0 0 10px 0'; blobsLabel.style.fontSize = '16px'; blobsLabel.style.color = '#333'; blobsLabel.style.textAlign = 'center'; menu.appendChild(blobsLabel); const container = document.createElement('div'); container.id = 'blobContainer'; menu.appendChild(container); document.body.appendChild(menu); menuCreated = true; processPendingBlobs(); const infoLabel = document.createElement('h3'); infoLabel.textContent = 'Enjoy!'; infoLabel.style.margin = '0 0 10px 0'; infoLabel.style.fontSize = '16px'; infoLabel.style.color = '#333'; infoLabel.style.textAlign = 'center'; menu.appendChild(infoLabel); }; function addBlobToMenu(blob, blobUrl) { const extension = blob.type.split('/')[2] || 'bin'; const fileName = `panorama.${extension}`; if (blobItems.find((item) => item.blobUrl === blobUrl)) return; blobItems.push({ blob, blobUrl }); createMenuLink(document.getElementById('blobContainer'), fileName, blobUrl); } function createMenuLink(container, labelName, url) { const linkEntry = document.createElement('div'); linkEntry.style.display = 'flex'; linkEntry.style.justifyContent = 'space-between'; linkEntry.style.alignItems = 'center'; linkEntry.style.marginBottom = '8px'; linkEntry.style.borderBottom = '1px solid #EEE'; linkEntry.style.paddingBottom = '5px'; const link = document.createElement('a'); link.textContent = labelName; link.href = url; link.download = labelName; link.style.color = '#007BFF'; link.style.textDecoration = 'none'; link.style.overflow = 'hidden'; link.style.textOverflow = 'ellipsis'; link.style.whiteSpace = 'nowrap'; link.target = '_blank'; linkEntry.appendChild(link); container.appendChild(linkEntry); }; function processPendingBlobs() { while (pendingBlobItems.length > 0) { const { blob, blobUrl } = pendingBlobItems.shift(); addBlobToMenu(blob, blobUrl); } } const observer = new MutationObserver(() => { if (!document.getElementById('blobMenu')) { menuCreated = false; createMenu(); } }); observer.observe(document.body, { childList: true, subtree: true }); createMenu(); console.log("Userscript to intercept blob requests and add a download menu is running..."); })();