Joyn.de Adblocker

Adblocker for Joyn.de, because the common adblockers are blocked

// ==UserScript==
// @name            Joyn.de Adblocker
// @name:de         Joyn.de Adblocker
// @version         2.0.0
// @description     Adblocker for Joyn.de, because the common adblockers are blocked
// @description:de  Adblocker für Joyn.de, da die gängigen Adblocker blockiert werden
// @icon            https://www.joyn.de/favicon.ico
// @author          TalkLounge (https://github.com/TalkLounge)
// @namespace       https://github.com/TalkLounge/joyn.de-adblocker
// @license         MIT
// @match           https://www.joyn.de/*
// @grant           none
// @run-at          document-start
// ==/UserScript==

(function () {
    'use strict';

    const old_window_top_fetch = window.top.fetch;

    function checkURL(args, url) {
        if (
            (
                typeof (args[0]) == "object" &&
                args[0].url &&
                new URL(args[0].url).host.includes(url)
            ) || (
                typeof (args[0]) == "string" &&
                args[0] &&
                new URL(args[0]).host.includes(url)
            )
        ) {
            return true;
        }
    }

    window.top.fetch = function (...args) {
        if ([
            "sqrt-5041.de",
            "ad71.adfarm1.adition.com",
            "bat.bing.com",
            "9478953.fls.doubleclick.net",
            "googleads.g.doubleclick.net",
            "connect.facebook.net",
            "static.hotjar.com",
            "cdn-gl.nmrodam.com",
            "amplify.outbrain.com",
            "tr.outbrain.com",
            "alb.reddit.com",
            "cdn.segment.com",
            "o292998.ingest.sentry.io",
            "dmp.theadex.com",
            "analytics.tiktok.com"
        ].find(item => checkURL(args, item))) { // Block Ad & Tracking Web Requests from Privacy Badger Extension
            return;
        }

        if (!checkURL(args, "swankyrule.zomap.de")) { // Don't Intercept other Web Requests except https://swankyrule.zomap.de/v2/
            return old_window_top_fetch.apply(null, args);
        }

        return new Promise(async (resolve, reject) => {
            const data = await old_window_top_fetch.apply(null, args);
            const text = await (await data.clone()).text();
            if (text.indexOf("<MediaFiles>") == -1) {
                return resolve(data);
            }
            data.text = function () {
                return new Promise((resolve, reject) => {
                    const xmlDoc = new DOMParser().parseFromString(text, "text/xml");
                    xmlDoc.querySelectorAll("MediaFile").forEach((item) => item.remove()); // Delete all MediaFile Elements in XML
                    resolve(new XMLSerializer().serializeToString(xmlDoc));
                });
            };
            resolve(data);
        });
    };
})();