Netflix Settings Hijack

Hijack Netflix's settings to allow customization of certain values.

// ==UserScript==
// @name         Netflix Settings Hijack
// @namespace    http://tampermonkey.net/
// @version      0.0.1
// @description  Hijack Netflix's settings to allow customization of certain values.
// @author       TGSAN
// @match        https://www.netflix.com/settings/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=netflix.com
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let windowCtx = self.window;
    if (self.unsafeWindow) {
        console.log("[Netflix Settings Hijack] use unsafeWindow mode");
        windowCtx = self.unsafeWindow;
    } else {
        console.log("[Netflix Settings Hijack] use window mode (your userscript extensions not support unsafeWindow)");
    }

    const originFetchNetflixSettingsHijack = windowCtx.fetch;
    windowCtx.fetch = (...arg) => {
        let url = "";
        let isRequest = false;
        switch (typeof arg[0]) {
            case "object":
                url = arg[0].url;
                isRequest = true;
                break;
            case "string":
                url = arg[0];
                break;
            default:
                break;
        }

        if (url.indexOf('//web.prod.cloud.netflix.com/graphql') > -1) {
            if (typeof arg[1] == "object") {
                let options = arg[1];
                if (typeof options.body == "string" && options.body.startsWith("{") && options.body.endsWith("}")) {
                    let body = JSON.parse(options.body);
                    if (body.operationName == "LanguageSettingsTemplateSaveLanguages") {
                        body.variables.primaryLanguage = prompt("Netflix Settings Hijack\n\nPrimaryLanguage", body.variables.primaryLanguage);
                    } else if (body.operationName == "updateProfileInfo") {
                        body.variables.avatarKey = prompt("Netflix Settings Hijack\n\nAvatarKey", body.variables.avatarKey);
                    }
                    options.body = JSON.stringify(body);
                }
                arg[1] = options;
            }
        }

        return originFetchNetflixSettingsHijack(...arg);
    }
})();