feel free to modify
// ==UserScript==
// @name YouTube patch collection
// @version 0.1
// @description feel free to modify
// @author daylin
// @match *://*.youtube.com/*
// @match *://*.youtu.be/*
// @icon https://www.youtube.com/favicon.ico
// @run-at document-start
// @grant none
// @namespace https://greasyfork.org/users/1132181
// ==/UserScript==
// polyfill for chrome :vomit:
(function() {
if ("onbeforescriptexecute" in document) return;
let scriptWatcher = new MutationObserver(mutations => {
for (let mutation of mutations) {
for (let node of mutation.addedNodes) {
if (node.tagName === "SCRIPT") {
let syntheticEvent = new CustomEvent("beforescriptexecute", {
detail: node,
cancelable: true
})
if (!document.dispatchEvent(syntheticEvent)) {
node.remove();
}
}
}
}
})
scriptWatcher.observe(document, {
childList: true,
subtree: true
})
})();
(function() {
const EXP_MOD_POLYMER_JS = false;
const OLD_POLYMER_JS_CONTENT = fetch("https://www.youtube.com/s/desktop/18069be1/jsbin/desktop_polymer.vflset/desktop_polymer.js");
function modifyJson(json) {
json.EXPERIMENT_FLAGS.kevlar_updated_logo_icons = false;
json.EXPERIMENT_FLAGS.kevlar_updated_icons = false;
json.EXPERIMENT_FLAGS.kevlar_system_icons = false;
json.EXPERIMENT_FLAGS.kevlar_watch_color_update = false;
json.EXPERIMENT_FLAGS.desktop_mic_background = false;
json.EXPERIMENT_FLAGS.kevlar_unavailable_video_error_ui_client = false;
json.EXPERIMENT_FLAGS.kevlar_center_search_results = false;
json.EXPERIMENT_FLAGS.kevlar_watch_metadata_refresh = false;
json.EXPERIMENT_FLAGS.web_snackbar_ui_refresh = false;
json.EXPERIMENT_FLAGS.web_guide_ui_refresh = false;
json.EXPERIMENT_FLAGS.web_sheets_ui_refresh = false;
// json.EXPERIMENT_FLAGS.web_darker_dark_theme = true; //
json.WEB_PLAYER_CONTEXT_CONFIGS
.WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH
.serializedExperimentFlags = modifyPlayerExperiments(
json.WEB_PLAYER_CONTEXT_CONFIGS
.WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH
.serializedExperimentFlags
);
startHtmlMods();
// ------------------------------- //
return JSON.stringify(json);
}
function modifyPlayerExperiments(text) {
var flags = deserialiseFlags(text);
// perform your modifications here;
// due to the encoding of these, the value
// will always be a string (rather than a bool,
// for instance)
flags.web_player_move_autonav_toggle = "false";
flags.web_settings_menu_icons = "false";
// ------------------------------- //
var response = serialiseFlags(flags);
return response;
}
function serialiseFlags(json) {
var keys = Object.keys(json),
response = "";
for (var i = 0, j = keys.length; i < j; i++) {
if (i > 0) {
response += "&";
}
response += keys[i] + "=" + json[keys[i]];
}
return response;
}
function deserialiseFlags(text) {
var a = text.split("&"),
obj = {};
for (var i = 0, j = a.length; i < j; i++) {
var b = a[i].split("=");
var key = b[0];
var val = b[1];
obj[key] = val;
}
return obj;
}
function extractYtConfigJson(text) {
const open = "ytcfg.set(";
const close = ");";
var a = text.split(open);
var b = a[1].split(close);
return b[0];
}
function modifyYtConfig(text) {
var originalJson = extractYtConfigJson(text);
var parsedJson = JSON.parse(originalJson);
var modifiedJson = modifyJson(parsedJson);
var newText = text.replace(originalJson, modifiedJson);
return newText;
}
function startHtmlMods() {
document.getElementsByTagName('html')[0].removeAttribute('system-icons');
}
async function waitForElm(s) {
while (document.querySelector(s) === null) {
await new Promise(r => requestAnimationFrame(r))
}
return document.querySelector(s);
}
async function modPolymerJs(srcUrl) {
var a = document.createElement("script");
a.src = srcUrl;
document.body.appendChild(a);
}
const handleScript = (e) => {
let script = e.details || e.target;
if (script.textContent.search("ytcfg.set") > -1) {
script.textContent = modifyYtConfig(script.textContent);
} else if (EXP_MOD_POLYMER_JS && script.src.search("desktop_polymer") > -1) {
script.textContent = OLD_POLYMER_JS_CONTENT;
}
};
document.addEventListener("beforescriptexecute", handleScript);
})();
(function() {var css = [
"/*right column*/",
" [d*=\"M10 14.65v-5.3L15 12l-5 2.65zm7.77-4.33c-.77-.32-1.2-.5-1.2-.5L18 9.06c1.84-.96 2.53-3.23 1.56-5.06s-3.24-2.53-5.07-1.56L6 6.94c-1.29.68-2.07 2.04-2 3.49.07 1.42.93 2.67 2.22 3.25.03.01 1.2.5 1.2.5L6 14.93c-1.83.97-2.53 3.24-1.56 5.07.97 1.83 3.24 2.53 5.07 1.56l8.5-4.5c1.29-.68 2.06-2.04 1.99-3.49-.07-1.42-.94-2.68-2.23-3.25zm-.23 5.86l-8.5 4.5c-1.34.71-3.01.2-3.72-1.14-.71-1.34-.2-3.01 1.14-3.72l2.04-1.08v-1.21l-.69-.28-1.11-.46c-.99-.41-1.65-1.35-1.7-2.41-.05-1.06.52-2.06 1.46-2.56l8.5-4.5c1.34-.71 3.01-.2 3.72 1.14.71 1.34.2 3.01-1.14 3.72L15.5 9.26v1.21l1.8.74c.99.41 1.65 1.35 1.7 2.41.05 1.06-.52 2.06-1.46 2.56z\"] {",
" d: path(\"M17.77 10.32c-.77-.32-1.2-.5-1.2-.5L18 9.06c1.84-.96 2.53-3.23 1.56-5.06s-3.24-2.53-5.07-1.56L6 6.94c-1.29.68-2.07 2.04-2 3.49.07 1.42.93 2.67 2.22 3.25.03.01 1.2.5 1.2.5L6 14.93c-1.83.97-2.53 3.24-1.56 5.07.97 1.83 3.24 2.53 5.07 1.56l8.5-4.5c1.29-.68 2.06-2.04 1.99-3.49-.07-1.42-.94-2.68-2.23-3.25zM10 14.65v-5.3L15 12l-5 2.65z\")",
" }"
].join("\n");
if (typeof GM_addStyle != "undefined") {
GM_addStyle(css);
} else if (typeof PRO_addStyle != "undefined") {
PRO_addStyle(css);
} else if (typeof addStyle != "undefined") {
addStyle(css);
} else {
var node = document.createElement("style");
node.type = "text/css";
node.appendChild(document.createTextNode(css));
var heads = document.getElementsByTagName("head");
if (heads.length > 0) {
heads[0].appendChild(node);
} else {
// no head yet, stick it whereever
document.documentElement.appendChild(node);
}
}
})();