Greasy Fork

Greasy Fork is available in English.

crunchyroll_nosubs

disable subs on crunchyroll by default

目前为 2019-03-09 提交的版本。查看 最新版本

// ==UserScript==
// @name         crunchyroll_nosubs
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  disable subs on crunchyroll by default
// @author       mescyn
// @match        https://www.crunchyroll.com/*
// @grant        none
// @run-at       document-start
// ==/UserScript==


(function() {
    'use strict';
            const Event = class {
                constructor(script, target) {
                    this.script = script;
                    this.target = target;

                    this._cancel = false;
                    this._replace = null;
                    this._stop = false;
                }

                preventDefault() {
                    this._cancel = true;
                }
                stopPropagation() {
                    this._stop = true;
                }
                replacePayload(payload) {
                    this._replace = payload;
                }
            };

            let callbacks = [];
            window.addBeforeScriptExecuteListener = (f) => {
                if (typeof f !== "function") {
                    throw new Error("Event handler must be a function.");
                }
                callbacks.push(f);
            };
            window.removeBeforeScriptExecuteListener = (f) => {
                let i = callbacks.length;
                while (i--) {
                    if (callbacks[i] === f) {
                        callbacks.splice(i, 1);
                    }
                }
            };

            const dispatch = (script, target) => {
                if (script.tagName !== "SCRIPT") {
                    return;
                }

                const e = new Event(script, target);

                if (typeof window.onbeforescriptexecute === "function") {
                    try {
                        window.onbeforescriptexecute(e);
                    } catch (err) {
                        console.error(err);
                    }
                }

                for (const func of callbacks) {
                    if (e._stop) {
                        break;
                    }
                    try {
                        func(e);
                    } catch (err) {
                        console.error(err);
                    }
                }

                if (e._cancel) {
                    script.textContent = "";
                    script.remove();
                } else if (typeof e._replace === "string") {
                    script.textContent = e._replace;
                }
            };
            const observer = new MutationObserver((mutations) => {
                for (const m of mutations) {
                    for (const n of m.addedNodes) {
                        dispatch(n, m.target);
                    }
                }
            });
            observer.observe(document, {
                childList: true,
                subtree: true,
            });
    window.onbeforescriptexecute = (e) => {
        if (!e.script.textContent) {
            return;
        }
        if (e.script.textContent.includes("vilos.config.player.language =")) {
            var profilelang = e.script.textContent.match(/vilos\.config\.player\.language = \"(.*)\"/m)[1];
            var newscript = e.script.textContent;

            newscript = newscript.replace(/"hardsub_lang":"[a-zA-Z]{4}"/g, '"hardsub_lang":"abcd"');
            newscript = newscript.replace(/\"hardsub_lang\":null/gi, '"hardsub_lang":"' + profilelang + '"');
            console.log("newscript = " + newscript);
            console.log("profilelang = " + profilelang);
            e.replacePayload(newscript);
        }
    }
})();