Greasy Fork

Bludclart Extension (watch.bludclart.com)

Bludclart extension by deeone / Custom / rdwxth — bypass CORS for watch.bludclart.com and other sites

// ==UserScript==
// @name         Bludclart Extension (watch.bludclart.com)
// @namespace    https://watch.bludclart.com/
// @version      1.6
// @description  Bludclart extension by deeone / Custom / rdwxth — bypass CORS for watch.bludclart.com and other sites
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @connect      *
// ==/UserScript==

(function () {
    'use strict';

    console.log("[TM] Tampermonkey Fetch Bridge initialized");

    window.addEventListener("message", (event) => {
        console.log("[TM] Received message event:", event);
        const data = event.data;
        console.log("[TM] Parsed event data:", data);

        // Only listen to messages coming from the page
        if (data?.direction !== "page-to-tampermonkey") {
            console.log("[TM] Ignored message with unexpected direction:", data?.direction);
            return;
        }

        // === New: Respond to check-userscript ping ===
        if (data.type === "check-userscript") {
            console.log("[TM] ✅ Check-userscript request received");
            window.postMessage({
                direction: "tampermonkey-to-page",
                type: "check-userscript-response",
                detected: true
            }, "*");
            return;
        }

        // Only handle fetch requests after this point
        if (data.type !== "fetch-request") {
            console.log("[TM] Ignored message with unknown type:", data?.type);
            return;
        }

        const { url, method = "GET", headers = {}, body = null } = data.payload;
        const requestId = data.requestId;

        console.log(`[TM] Processing fetch-request (ID: ${requestId})`);
        console.log("[TM] → URL:", url);
        console.log("[TM] → Method:", method);
        console.log("[TM] → Headers:", headers);
        console.log("[TM] → Body:", body);

        try {
            GM_xmlhttpRequest({
                method,
                url,
                headers,
                data: body,
                onload: (response) => {
                    console.log(`[TM] ✅ Fetch complete for requestId: ${requestId}`);
                    console.log("[TM] → Status:", response.status, response.statusText);
                    console.log("[TM] → Headers:", response.responseHeaders);
                    console.log("[TM] → Response Text:", response.responseText?.slice(0, 500));

                    window.postMessage({
                        direction: "tampermonkey-to-page",
                        type: "fetch-response",
                        requestId,
                        status: response.status,
                        statusText: response.statusText,
                        responseText: response.responseText,
                        headers: response.responseHeaders,
                    }, "*");
                },
                onerror: (error) => {
                    console.error(`[TM] ❌ Fetch error for requestId: ${requestId}`, error);
                    window.postMessage({
                        direction: "tampermonkey-to-page",
                        type: "fetch-error",
                        requestId,
                        error: {
                            message: error?.message || "Unknown error",
                            details: error,
                        }
                    }, "*");
                }
            });
        } catch (err) {
            console.error(`[TM] ❗ Exception during GM_xmlhttpRequest for requestId: ${requestId}`, err);
            window.postMessage({
                direction: "tampermonkey-to-page",
                type: "fetch-error",
                requestId,
                error: {
                    message: "Exception during GM_xmlhttpRequest",
                    details: err.message || err.toString()
                }
            }, "*");
        }
    });
})();