Pixeldrain Download Bypass (with zip file content support)

Bypass Pixeldrain Download Limit

// ==UserScript==
// @name         Pixeldrain Download Bypass (with zip file content support)
// @namespace    http://tampermonkey.net/
// @version      1.6.2
// @description  Bypass Pixeldrain Download Limit
// @author       MegaLime0, honey, Nurarihyon, ksynwa
// @match        https://pixeldrain.com/*
// @match        https://cdn.pd8.workers.dev/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=pixeldrain.com
// @grant        GM_openInTab
// @license      MIT
// ==/UserScript==

(function () {
    "use strict";

    const bypassUrl = "https://pd.cybar.xyz/";
    const idRegex = /\/api\/file\/(\w+)\//;
    const zipFileRegex = /\/api\/file\/(\w+)\/info\/zip\//;

    function getBypassUrls(urlType, url = "") {
        const currentUrl = window.location.href;

        if (urlType == "file") {
            const id = currentUrl.replace("https://pixeldrain.com/u/", "");
            const alteredUrl = bypassUrl + id;

            return alteredUrl;
        }

        if (urlType == "gallery") {
            const links = document.querySelectorAll("a.file");

            const bypassUrlList = [];
            const bypassUrlNames = [];

            links.forEach((link) => {
                const childDiv = link.querySelector("div");
                const backgroundUrl = childDiv.style.backgroundImage;

                const match = backgroundUrl.match(idRegex);

                if (match && match.length > 1) {
                    const alteredUrl = bypassUrl + match[1];
                    bypassUrlList.push(alteredUrl);
                    bypassUrlNames.push(link.textContent);
                }
            });

            return { bypassUrlList, bypassUrlNames };
        }

        if (urlType == "zipFile") {
            const zipFileSuffix = url.replace(
                "https://pixeldrain.com/api/file/",
                "",
            );
            return bypassUrl + zipFileSuffix;
        }
    }

    function handleButtonClick() {
        const currentUrl = window.location.href;

        if (currentUrl.includes("https://pixeldrain.com/u/")) {
            const alteredUrl = getBypassUrls("file");
            startDownload(alteredUrl);
        }

        if (currentUrl.includes("https://pixeldrain.com/l/")) {
            const links = getBypassUrls("gallery").bypassUrlList;

            links.forEach((link) => {
                startDownload(link);
            });
        }
    }

    function startDownload(link) {
        GM_openInTab(link);
    }

    function handleLinksButtonClick() {
        const popupBox = document.getElementById("popupBox");
        const popupClose = document.createElement("span");
        popupClose.innerHTML = "×";
        popupClose.style.position = "absolute";
        popupClose.style.top = "1px";
        popupClose.style.right = "7px";
        popupClose.style.cursor = "pointer";
        popupClose.onclick = function () {
            popupBox.style.display = "none";
        };

        popupBox.innerHTML = "";
        popupBox.appendChild(popupClose);

        const currentUrl = window.location.href;

        if (currentUrl.includes("https://pixeldrain.com/u/")) {
            const alteredUrl = getBypassUrls("file");
            const urlElement = document.createElement("a");
            urlElement.href = alteredUrl;
            urlElement.textContent = alteredUrl;
            popupBox.appendChild(urlElement);
        }

        if (currentUrl.includes("https://pixeldrain.com/l/")) {
            let result = getBypassUrls("gallery");
            let bypassLinks = result.bypassUrlList;
            let bypassNames = result.bypassUrlNames;

            const linksContainer = document.createElement("div");
            linksContainer.style.maxHeight = "calc(100% - 40px)";
            linksContainer.style.overflowY = "auto";
            linksContainer.style.paddingBottom = "10px";

            bypassLinks.forEach((link) => {
                const urlElement = document.createElement("a");
                urlElement.href = link;
                urlElement.textContent = link;
                urlElement.style.display = "block";
                linksContainer.appendChild(urlElement);
            });

            popupBox.appendChild(linksContainer);

            popupBox.style.display = "flex";
            popupBox.style.flexDirection = "column";
            popupBox.style.alignItems = "center";
            popupBox.style.justifyContent = "center";

            const buttonContainer = document.createElement("div");
            buttonContainer.style.display = "flex";
            buttonContainer.style.justifyContent = "center";
            buttonContainer.style.marginTop = "10px";

            const copyButton = document.createElement("button");
            copyButton.textContent = "🔗 Copy URL";
            copyButton.style.marginRight = "5px";
            copyButton.addEventListener("click", function () {
                const urls = bypassLinks.join("\n");
                navigator.clipboard.writeText(urls).then(
                    function () {
                        copyButton.textContent = "✔️ Copied";
                        setTimeout(function () {
                            copyButton.textContent = "🔗 Copy URL";
                        }, 2500);
                    },
                    function (err) {
                        console.error("Failed to copy URLs: ", err);
                    },
                );
            });
            buttonContainer.appendChild(copyButton);

            const saveButton = document.createElement("button");
            saveButton.textContent = "📄 Save as Text File";
            saveButton.style.marginLeft = "5px";
            saveButton.addEventListener("click", function () {
                const popupContent = document
                    .getElementById("popupBox")
                    .querySelectorAll("a");
                if (popupContent.length > 0) {
                    const currentUrl = window.location.href;
                    const fileIdMatch = currentUrl.match(/\/l\/([^/#?]+)/);
                    if (fileIdMatch && fileIdMatch.length > 1) {
                        const fileId = fileIdMatch[1];
                        const fileName = fileId + ".txt";
                        let content = "";
                        popupContent.forEach((link) => {
                            content += link.href + "\n";
                        });
                        const blob = new Blob([content.trim()], {
                            type: "text/plain",
                        });
                        const url = URL.createObjectURL(blob);
                        const a = document.createElement("a");
                        a.href = url;
                        a.download = fileName;
                        document.body.appendChild(a);
                        a.click();
                        document.body.removeChild(a);
                        URL.revokeObjectURL(url);
                    } else {
                        console.error(
                            "Failed to extract file identifier from URL.",
                        );
                    }
                } else {
                    console.error("Popup content not found.");
                }
            });
            buttonContainer.appendChild(saveButton);

            popupBox.appendChild(buttonContainer);
        }

        popupBox.style.display = "block";
    }

    if (window.location.href.includes("pixeldrain.com")) {
        const button = document.createElement("button");
        const downloadIcon = document.createElement("a");
        downloadIcon.className = "icon";
        downloadIcon.textContent = "download";
        downloadIcon.style.color = "#d7dde8";
        const downloadButtonText = document.createElement("span");
        downloadButtonText.textContent = "Download Bypass";
        button.appendChild(downloadIcon);
        button.appendChild(downloadButtonText);

        const linksButton = document.createElement("button");
        const linksIcon = document.createElement("i");
        linksIcon.className = "icon";
        linksIcon.textContent = "link";
        const linksButtonText = document.createElement("span");
        linksButtonText.textContent = "Show Bypass Links";
        linksButton.appendChild(linksIcon);
        linksButton.appendChild(linksButtonText);

        const popupBox = document.createElement("div");
        popupBox.style.zIndex = 20;
        popupBox.style.whiteSpace = "pre-line";
        popupBox.id = "popupBox";
        popupBox.style.display = "none";
        popupBox.style.position = "fixed";

        popupBox.style.top = "50%";
        popupBox.style.left = "50%";
        popupBox.style.transform = "translate(-50%, -50%)";
        popupBox.style.padding = "20px";
        popupBox.style.background = "#2f3541";
        popupBox.style.border = "2px solid #a4be8c";
        popupBox.style.color = "#d7dde8";
        popupBox.style.borderRadius = "10px";
        popupBox.style.width = "30%";
        popupBox.style.height = "auto";
        popupBox.style.maxWidth = "600px";

        button.addEventListener("click", handleButtonClick);
        linksButton.addEventListener("click", handleLinksButtonClick);

        const labels = document.querySelectorAll("div.label");
        labels.forEach((label) => {
            if (label.textContent.trim() === "Size") {
                const nextElement = label.nextElementSibling;
                if (nextElement) {
                    nextElement.insertAdjacentElement("afterend", linksButton);
                    nextElement.insertAdjacentElement("afterend", button);
                }
            }
        });

        document.body.appendChild(popupBox);

        function positionPopupBox(popupBox) {
            const popupRect = popupBox.getBoundingClientRect();
            popupBox.style.top = `calc(50% - ${popupRect.height / 2}px)`;
            popupBox.style.left = `calc(50% - ${popupRect.width / 2}px)`;
        }

        const bypassZipLinks = (element) => {
            const zipFileLinks = Array.from(
                element.querySelectorAll("a"),
            ).filter((link) => link.href.match(zipFileRegex));
            zipFileLinks.forEach((zipFileLink) => {
                const bypassLink = getBypassUrls("zipFile", zipFileLink.href);
                const bypassElement = document.createElement("a");
                bypassElement.href = bypassLink;
                bypassElement.textContent = "(Bypass)";
                const nextElement = zipFileLink.nextElementSibling;
                nextElement.insertAdjacentText("beforebegin", "\t");
                nextElement.insertAdjacentElement("beforebegin", bypassElement);
            });
        };

        const moCallback = (mutations, observer) => {
            for (const mutation of mutations) {
                for (const node of mutation.addedNodes) {
                    bypassZipLinks(node);
                }
            }
        };

        const file_preview_div =
            document.getElementsByClassName("file_preview")[0];
        console.log("FILE_PREVIEW");
        console.log(file_preview_div);
        const observer = new MutationObserver(moCallback);
        observer.observe(file_preview_div, { childList: true });
    }
})();