Skip to content

Instantly share code, notes, and snippets.

@bugged-codes
Last active October 10, 2023 09:35
Show Gist options
  • Save bugged-codes/7dfa6db97ebafcf692c7cc62b16d86ad to your computer and use it in GitHub Desktop.
Save bugged-codes/7dfa6db97ebafcf692c7cc62b16d86ad to your computer and use it in GitHub Desktop.
My config and settings for desktop browser extension Global Speed by polywock
{"common":{"audioFx":{"delay":0,"eq":{"enabled":false,"factor":1,"values":[0,0,0,0,0,0,0,0,0,0]},"pitch":0,"volume":1},"audioFxAlt":null,"audioPan":null,"backdropFx":{"filters":[{"name":"sepia","value":0},{"name":"hueRotate","value":0},{"name":"grayscale","value":0},{"name":"contrast","value":1},{"name":"brightness","value":1},{"name":"saturate","value":1},{"name":"invert","value":0},{"name":"blur","value":0},{"name":"opacity","value":1}],"transforms":[{"name":"scaleX","value":1},{"name":"scaleY","value":1},{"name":"translateX","value":0},{"name":"translateY","value":0},{"name":"rotateX","value":0},{"name":"rotateY","value":0},{"name":"rotateZ","value":0}]},"elementFx":{"enabled":true,"filters":[{"name":"sepia","value":0},{"name":"hueRotate","value":0},{"name":"grayscale","value":0},{"name":"contrast","value":1},{"name":"brightness","value":1},{"name":"saturate","value":1},{"name":"invert","value":0},{"name":"blur","value":0},{"name":"opacity","value":1}],"transforms":[{"name":"scaleX","value":1},{"name":"scaleY","value":1},{"name":"translateX","value":0},{"name":"translateY","value":0},{"name":"rotateX","value":0},{"name":"rotateY","value":0},{"name":"rotateZ","value":0}]},"enabled":true,"enabledLatestViaPopup":true,"lastSpeed":1.5,"monoOutput":false,"speed":2},"darkTheme":true,"firstUse":1660212151659,"ghostMode":true,"hideBadge":false,"hideMediaView":null,"indicatorInit":{"duration":1,"offset":0.83,"rounding":1.19,"scaling":1.01,"static":false},"keybinds":[{"command":"setState","enabled":true,"greedy":true,"id":"1177791252","key":{"code":"KeyQ","shiftKey":true},"spacing":0,"valueState":"toggle"},{"command":"setPin","enabled":true,"greedy":true,"id":"5995863115","key":"KeyQ","spacing":2,"valueState":"toggle"},{"adjustMode":2,"command":"adjustSpeed","enabled":true,"greedy":true,"id":"3893216778","key":"KeyA","valueNumberAlt":-0.1},{"adjustMode":2,"command":"adjustSpeed","enabled":true,"greedy":true,"id":"5527832638","key":{"altKey":false,"code":"KeyA","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueNumberAlt":-0.01},{"adjustMode":1,"command":"adjustSpeed","enabled":true,"greedy":true,"id":"5280688322","key":{"altKey":false,"code":"KeyS","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":1},{"adjustMode":3,"command":"adjustSpeed","cycleIncrement":59,"enabled":true,"greedy":true,"id":"4383310003","key":{"altKey":false,"code":"KeyS","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueCycle":[1.5,2],"valueNumber":1},{"adjustMode":2,"command":"adjustSpeed","enabled":true,"greedy":true,"id":"3349785623","key":{"altKey":false,"code":"KeyD","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueNumberAlt":0.01},{"adjustMode":2,"command":"adjustSpeed","enabled":true,"greedy":true,"id":"4305571903","key":"KeyD","spacing":2,"valueCycle":[1,2],"valueNumberAlt":0.1},{"command":"seek","enabled":true,"greedy":true,"id":"3322862107","key":{"altKey":false,"code":"KeyZ","ctrlKey":true,"metaKey":false,"shiftKey":true},"valueBool3":true,"valueNumber":-0.041},{"command":"seek","enabled":true,"greedy":true,"id":"8172299073","key":"KeyZ","valueNumber":-5},{"command":"seek","enabled":true,"greedy":true,"id":"8977614209","key":{"altKey":false,"code":"KeyZ","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":1,"valueNumber":-10},{"command":"seek","enabled":true,"greedy":true,"id":"2758161223","key":{"altKey":false,"code":"KeyX","ctrlKey":true,"metaKey":false,"shiftKey":true},"spacing":0,"valueBool3":true,"valueNumber":0.041},{"command":"seek","enabled":true,"greedy":true,"id":"2809664649","key":"KeyX","spacing":0,"valueNumber":5},{"command":"seek","enabled":true,"greedy":true,"id":"743001454","key":{"altKey":false,"code":"KeyX","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":2,"valueNumber":10},{"command":"setPause","enabled":true,"greedy":true,"id":"67923204","key":{"altKey":false,"code":"Space","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueState":"toggle"},{"command":"fullscreen","enabled":true,"greedy":true,"id":"7078115024","key":{"altKey":false,"code":"KeyF","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueBool":false},{"command":"fullscreen","enabled":true,"greedy":true,"id":"1527828224","key":{"code":"KeyF","shiftKey":true},"spacing":0,"valueBool":true},{"command":"PiP","enabled":true,"global":false,"greedy":true,"id":"7910804094","key":{"altKey":false,"code":"KeyP","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":2,"valueState":"toggle"},{"command":"setMark","enabled":true,"global":false,"greedy":true,"id":"5808966110","key":{"altKey":false,"code":"Digit1","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueString":"mark1"},{"command":"seekMark","enabled":true,"greedy":true,"id":"3224294042","key":{"altKey":false,"code":"Digit1","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":0,"valueString":"mark1"},{"command":"toggleLoop","enabled":true,"greedy":true,"id":"6428959830","key":{"altKey":true,"code":"Digit1","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":1,"valueString":"mark1"},{"command":"setMark","enabled":true,"greedy":true,"id":"5888715058","key":{"altKey":false,"code":"Digit2","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueString":"mark2"},{"command":"seekMark","enabled":true,"greedy":true,"id":"25619151","key":{"altKey":false,"code":"Digit2","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":0,"valueString":"mark2"},{"command":"toggleLoop","enabled":true,"greedy":true,"id":"3791200630","key":{"altKey":true,"code":"Digit2","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":1,"valueString":"mark2"},{"command":"setMark","enabled":true,"greedy":true,"id":"8454193702","key":{"altKey":false,"code":"Digit3","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueString":"mark3"},{"command":"seekMark","enabled":true,"greedy":true,"id":"3772563566","key":{"altKey":false,"code":"Digit3","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueString":"mark3"},{"command":"toggleLoop","enabled":true,"greedy":true,"id":"324522912","key":{"altKey":true,"code":"Digit3","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":2,"valueString":"mark3"},{"command":"resetFx","enabled":true,"filterTarget":"both","greedy":true,"id":"5759026778","key":{"altKey":false,"code":"KeyR","ctrlKey":false,"metaKey":false,"shiftKey":true}},{"adjustMode":3,"command":"adjustFilter","cycleIncrement":4,"enabled":true,"filterOption":"scaleY","filterTarget":"element","greedy":true,"id":"6072405332","key":{"altKey":false,"code":"KeyY","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueCycle":[1,1.33],"valueNumberAlt":1.33},{"adjustMode":3,"command":"adjustFilter","cycleIncrement":10,"enabled":true,"filterOption":"scaleX","filterTarget":"element","greedy":true,"id":"9443611415","key":{"altKey":false,"code":"KeyW","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":1,"valueCycle":[1,1.33],"valueNumberAlt":1.33},{"adjustMode":3,"command":"adjustFilter","cycleIncrement":88,"enabled":true,"filterOption":"scaleX","filterTarget":"element","greedy":true,"id":"6496647971","key":{"altKey":false,"code":"KeyE","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":0,"valueCycle":[1,1.33],"valueNumber":1.35,"valueNumberAlt":1.35},{"adjustMode":3,"command":"adjustFilter","cycleIncrement":88,"enabled":true,"filterOption":"scaleY","filterTarget":"element","global":false,"greedy":true,"id":"485291550","key":{"altKey":false,"code":"KeyE","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":2,"valueCycle":[1,1.33],"valueNumber":1.35,"valueNumberAlt":1.35},{"command":"setMute","enabled":true,"greedy":true,"id":"756138300","key":{"altKey":false,"code":"KeyM","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueState":"toggle"},{"command":"tabCapture","enabled":true,"global":true,"greedy":true,"id":"2196828131","spacing":1,"valueState":"toggle"},{"adjustMode":2,"command":"adjustGain","enabled":true,"greedy":true,"id":"6525245521","key":{"altKey":false,"code":"Numpad4","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumberAlt":0.05},{"adjustMode":2,"command":"adjustGain","enabled":true,"greedy":true,"id":"9896914283","key":{"altKey":false,"code":"Numpad1","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":1,"valueNumberAlt":-0.05},{"adjustMode":2,"command":"adjustPitch","enabled":true,"greedy":true,"id":"238214247","key":{"altKey":false,"code":"Numpad5","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumberAlt":0.1},{"adjustMode":2,"command":"adjustPitch","enabled":true,"greedy":true,"id":"7160661072","key":{"altKey":false,"code":"Numpad2","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":1,"valueNumberAlt":-0.1},{"adjustMode":2,"command":"adjustDelay","enabled":true,"greedy":true,"id":"5858853110","key":{"altKey":false,"code":"Numpad6","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumberAlt":0.05},{"adjustMode":2,"command":"adjustDelay","enabled":true,"greedy":true,"id":"3885656789","key":{"altKey":false,"code":"Numpad3","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":1,"valueNumberAlt":-0.05},{"adjustMode":1,"command":"adjustGain","enabled":true,"greedy":true,"id":"1889178290","key":{"altKey":false,"code":"Numpad0","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":1},{"adjustMode":1,"command":"adjustPitch","enabled":true,"greedy":true,"id":"403244030","key":{"altKey":false,"code":"Numpad0","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":null,"valueNumberAlt":null},{"adjustMode":1,"command":"adjustDelay","enabled":true,"greedy":true,"id":"4034237104","key":{"altKey":false,"code":"Numpad0","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":0}],"keybindsUrlCondition":{"matchAll":true,"parts":[{"id":"967066353","inverse":true,"type":"CONTAINS","value":"miniclip.com"},{"id":"8322300676","inverse":true,"type":"CONTAINS","value":"cloudplay.jiogames.com"},{"id":"5316314592","inverse":true,"type":"CONTAINS","value":"typingclub.com"}]},"language":"en","pinByDefault":false,"rules":[{"condition":{"parts":[{"id":"10807114","type":"CONTAINS","value":"twitch.tv"}]},"enabled":true,"id":"7467268185","overrideSpeed":1,"strict":true,"type":"SPEED"},{"condition":{"parts":[]},"enabled":false,"id":"4298158470","overrideJs":"// ==UserScript==\n// @name Return YouTube Dislike\n// @namespace https://www.returnyoutubedislike.com/\n// @homepage https://www.returnyoutubedislike.com/\n// @version 3.0.1\n// @encoding utf-8\n// @description Return of the YouTube Dislike, Based off https://www.returnyoutubedislike.com/\n// @icon https://github.com/Anarios/return-youtube-dislike/raw/main/Icons/Return%20Youtube%20Dislike%20-%20Transparent.png\n// @author Anarios & JRWR\n// @match *://*.youtube.com/*\n// @exclude *://music.youtube.com/*\n// @exclude *://*.music.youtube.com/*\n// @compatible chrome\n// @compatible firefox\n// @compatible opera\n// @compatible safari\n// @compatible edge\n// @downloadURL https://github.com/Anarios/return-youtube-dislike/raw/main/Extensions/UserScript/Return%20Youtube%20Dislike.user.js\n// @updateURL https://github.com/Anarios/return-youtube-dislike/raw/main/Extensions/UserScript/Return%20Youtube%20Dislike.user.js\n// @grant GM.xmlHttpRequest\n// @connect youtube.com\n// @grant GM_addStyle\n// @run-at document-end\n// ==/UserScript==\n\nconst extConfig = {\n // BEGIN USER OPTIONS\n // You may change the following variables to allowed values listed in the corresponding brackets (* means default). Keep the style and keywords intact.\n showUpdatePopup: false, // [true, false*] Show a popup tab after extension update (See what's new)\n disableVoteSubmission: false, // [true, false*] Disable like/dislike submission (Stops counting your likes and dislikes)\n coloredThumbs: true, // [true, false*] Colorize thumbs (Use custom colors for thumb icons)\n coloredBar: true, // [true, false*] Colorize ratio bar (Use custom colors for ratio bar)\n colorTheme: \"classic\", // [classic*, accessible, neon] Color theme (red/green, blue/yellow, pink/cyan)\n numberDisplayFormat: \"compactShort\", // [compactShort*, compactLong, standard] Number format (For non-English locale users, you may be able to improve appearance with a different option. Please file a feature request if your locale is not covered)\n numberDisplayRoundDown: true, // [true*, false] Round down numbers (Show rounded down numbers)\n tooltipPercentageMode: \"dash_like\", // [none*, dash_like, dash_dislike, both, only_like, only_dislike] Mode of showing percentage in like/dislike bar tooltip.\n numberDisplayReformatLikes: false, // [true, false*] Re-format like numbers (Make likes and dislikes format consistent)\n // END USER OPTIONS\n};\n\nconst LIKED_STATE = \"LIKED_STATE\";\nconst DISLIKED_STATE = \"DISLIKED_STATE\";\nconst NEUTRAL_STATE = \"NEUTRAL_STATE\";\nlet previousState = 3; //1=LIKED, 2=DISLIKED, 3=NEUTRAL\nlet likesvalue = 0;\nlet dislikesvalue = 0;\n\nlet isMobile = location.hostname == \"m.youtube.com\";\nlet isShorts = () => location.pathname.startsWith(\"/shorts\");\nlet mobileDislikes = 0;\nfunction cLog(text, subtext = \"\") {\n subtext = subtext.trim() === \"\" ? \"\" : `(${subtext})`;\n console.log(`[Return YouTube Dislikes] ${text} ${subtext}`);\n}\n\nfunction isInViewport(element) {\n const rect = element.getBoundingClientRect();\n const height = innerHeight || document.documentElement.clientHeight;\n const width = innerWidth || document.documentElement.clientWidth;\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= height &&\n rect.right <= width\n );\n}\n\nfunction getButtons() {\n if (isShorts()) {\n let elements = document.querySelectorAll(\n isMobile\n ? \"ytm-like-button-renderer\"\n : \"#like-button > ytd-like-button-renderer\"\n );\n for (let element of elements) {\n if (isInViewport(element)) {\n return element;\n }\n }\n }\n if (isMobile) {\n return document.querySelector(\".slim-video-action-bar-actions\");\n }\n if (document.getElementById(\"menu-container\")?.offsetParent === null) {\n return document.querySelector(\"ytd-menu-renderer.ytd-watch-metadata > div\");\n } else {\n return document\n .getElementById(\"menu-container\")\n ?.querySelector(\"#top-level-buttons-computed\");\n }\n}\n\nfunction getLikeButton() {\n return getButtons().children[0];\n}\n\nfunction getLikeTextContainer() {\n return (\n getLikeButton().querySelector(\"#text\") ??\n getLikeButton().getElementsByTagName(\"yt-formatted-string\")[0]\n );\n}\n\nfunction getDislikeButton() {\n return getButtons().children[1];\n}\n\nfunction getDislikeTextContainer() {\n return (\n getDislikeButton().querySelector(\"#text\") ??\n getDislikeButton().getElementsByTagName(\"yt-formatted-string\")[0]\n );\n}\n\nlet mutationObserver = new Object();\n\nif (isShorts() && mutationObserver.exists !== true) {\n cLog(\"initializing mutation observer\");\n mutationObserver.options = {\n childList: false,\n attributes: true,\n subtree: false,\n };\n mutationObserver.exists = true;\n mutationObserver.observer = new MutationObserver(function (\n mutationList,\n observer\n ) {\n mutationList.forEach((mutation) => {\n if (\n mutation.type === \"attributes\" &&\n mutation.target.nodeName === \"TP-YT-PAPER-BUTTON\" &&\n mutation.target.id === \"button\"\n ) {\n cLog(\"Short thumb button status changed\");\n if (mutation.target.getAttribute(\"aria-pressed\") === \"true\") {\n mutation.target.style.color =\n mutation.target.parentElement.parentElement.id === \"like-button\"\n ? getColorFromTheme(true)\n : getColorFromTheme(false);\n } else {\n mutation.target.style.color = \"unset\";\n }\n return;\n }\n cLog(\n \"unexpected mutation observer event: \" + mutation.target + mutation.type\n );\n });\n });\n}\n\nfunction isVideoLiked() {\n if (isMobile) {\n return (\n getLikeButton().querySelector(\"button\").getAttribute(\"aria-label\") ==\n \"true\"\n );\n }\n return getLikeButton().classList.contains(\"style-default-active\");\n}\n\nfunction isVideoDisliked() {\n if (isMobile) {\n return (\n getDislikeButton().querySelector(\"button\").getAttribute(\"aria-label\") ==\n \"true\"\n );\n }\n return getDislikeButton().classList.contains(\"style-default-active\");\n}\n\nfunction isVideoNotLiked() {\n if (isMobile) {\n return !isVideoLiked();\n }\n return getLikeButton().classList.contains(\"style-text\");\n}\n\nfunction isVideoNotDisliked() {\n if (isMobile) {\n return !isVideoDisliked();\n }\n return getDislikeButton().classList.contains(\"style-text\");\n}\n\nfunction checkForUserAvatarButton() {\n if (isMobile) {\n return;\n }\n if (document.querySelector(\"#avatar-btn\")) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction getState() {\n if (isVideoLiked()) {\n return LIKED_STATE;\n }\n if (isVideoDisliked()) {\n return DISLIKED_STATE;\n }\n return NEUTRAL_STATE;\n}\n\nfunction setLikes(likesCount) {\n if (isMobile) {\n getButtons().children[0].querySelector(\".button-renderer-text\").innerText =\n likesCount;\n return;\n }\n getLikeTextContainer().innerText = likesCount;\n}\n\nfunction setDislikes(dislikesCount) {\n if (isMobile) {\n mobileDislikes = dislikesCount;\n return;\n }\n getDislikeTextContainer().innerText = dislikesCount;\n}\n\nfunction getLikeCountFromButton() {\n if (isShorts()) {\n //Youtube Shorts don't work with this query. It's not nessecary; we can skip it and still see the results.\n //It should be possible to fix this function, but it's not critical to showing the dislike count.\n return false;\n }\n let likesStr = getLikeButton()\n .querySelector(\"yt-formatted-string#text\")\n .getAttribute(\"aria-label\")\n .replace(/\\D/g, \"\");\n return likesStr.length > 0 ? parseInt(likesStr) : false;\n}\n\n(typeof GM_addStyle != \"undefined\"\n ? GM_addStyle\n : (styles) => {\n let styleNode = document.createElement(\"style\");\n styleNode.type = \"text/css\";\n styleNode.innerText = styles;\n document.head.appendChild(styleNode);\n })(`\n #return-youtube-dislike-bar-container {\n background: var(--yt-spec-icon-disabled);\n border-radius: 2px;\n }\n\n #return-youtube-dislike-bar {\n background: var(--yt-spec-text-primary);\n border-radius: 2px;\n transition: all 0.15s ease-in-out;\n }\n\n .ryd-tooltip {\n position: relative;\n display: block;\n height: 2px;\n top: 9px;\n }\n\n .ryd-tooltip-bar-container {\n width: 100%;\n height: 2px;\n position: absolute;\n padding-top: 6px;\n padding-bottom: 28px;\n top: -6px;\n }\n `);\n\nfunction createRateBar(likes, dislikes) {\n if (isMobile) {\n return;\n }\n let rateBar = document.getElementById(\"return-youtube-dislike-bar-container\");\n\n const widthPx =\n getButtons().children[0].clientWidth +\n getButtons().children[1].clientWidth +\n 8;\n\n const widthPercent =\n likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;\n\n var likePercentage = parseFloat(widthPercent.toFixed(1));\n const dislikePercentage = (100 - likePercentage).toLocaleString();\n likePercentage = likePercentage.toLocaleString();\n\n var tooltipInnerHTML;\n switch (extConfig.tooltipPercentageMode) {\n case \"dash_like\":\n tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${likePercentage}%`;\n break;\n case \"dash_dislike\":\n tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${dislikePercentage}%`;\n break;\n case \"both\":\n tooltipInnerHTML = `${likePercentage}%&nbsp;/&nbsp;${dislikePercentage}%`;\n break;\n case \"only_like\":\n tooltipInnerHTML = `${likePercentage}%`;\n break;\n case \"only_dislike\":\n tooltipInnerHTML = `${dislikePercentage}%`;\n break;\n default:\n tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`;\n }\n\n if (!rateBar && !isMobile) {\n let colorLikeStyle = \"\";\n let colorDislikeStyle = \"\";\n if (extConfig.coloredBar) {\n colorLikeStyle = \"; background-color: \" + getColorFromTheme(true);\n colorDislikeStyle = \"; background-color: \" + getColorFromTheme(false);\n }\n\n document.getElementById(\"menu-container\").insertAdjacentHTML(\n \"beforeend\",\n `\n <div class=\"ryd-tooltip\" style=\"width: ${widthPx}px\">\n <div class=\"ryd-tooltip-bar-container\">\n <div\n id=\"return-youtube-dislike-bar-container\"\n style=\"width: 100%; height: 2px;${colorDislikeStyle}\"\n >\n <div\n id=\"return-youtube-dislike-bar\"\n style=\"width: ${widthPercent}%; height: 100%${colorDislikeStyle}\"\n ></div>\n </div>\n </div>\n <tp-yt-paper-tooltip position=\"top\" id=\"ryd-dislike-tooltip\" class=\"style-scope ytd-sentiment-bar-renderer\" role=\"tooltip\" tabindex=\"-1\">\n <!--css-build:shady-->${tooltipInnerHTML}\n </tp-yt-paper-tooltip>\n </div>\n`\n );\n } else {\n document.getElementById(\n \"return-youtube-dislike-bar-container\"\n ).style.width = widthPx + \"px\";\n document.getElementById(\"return-youtube-dislike-bar\").style.width =\n widthPercent + \"%\";\n\n document.querySelector(\"#ryd-dislike-tooltip > #tooltip\").innerHTML =\n tooltipInnerHTML;\n\n if (extConfig.coloredBar) {\n document.getElementById(\n \"return-youtube-dislike-bar-container\"\n ).style.backgroundColor = getColorFromTheme(false);\n document.getElementById(\n \"return-youtube-dislike-bar\"\n ).style.backgroundColor = getColorFromTheme(true);\n }\n }\n}\n\nfunction setState() {\n cLog(\"Fetching votes...\");\n let statsSet = false;\n\n fetch(\n `https://returnyoutubedislikeapi.com/votes?videoId=${getVideoId()}`\n ).then((response) => {\n response.json().then((json) => {\n if (json && !(\"traceId\" in response) && !statsSet) {\n const { dislikes, likes } = json;\n cLog(`Received count: ${dislikes}`);\n likesvalue = likes;\n dislikesvalue = dislikes;\n setDislikes(numberFormat(dislikes));\n if (extConfig.numberDisplayReformatLikes === true) {\n const nativeLikes = getLikeCountFromButton();\n if (nativeLikes !== false) {\n setLikes(numberFormat(nativeLikes));\n }\n }\n createRateBar(likes, dislikes);\n if (extConfig.coloredThumbs === true) {\n if (isShorts()) {\n // for shorts, leave deactived buttons in default color\n let shortLikeButton = getLikeButton().querySelector(\n \"tp-yt-paper-button#button\"\n );\n let shortDislikeButton = getDislikeButton().querySelector(\n \"tp-yt-paper-button#button\"\n );\n if (shortLikeButton.getAttribute(\"aria-pressed\") === \"true\") {\n shortLikeButton.style.color = getColorFromTheme(true);\n }\n if (shortDislikeButton.getAttribute(\"aria-pressed\") === \"true\") {\n shortDislikeButton.style.color = getColorFromTheme(false);\n }\n mutationObserver.observer.observe(\n shortLikeButton,\n mutationObserver.options\n );\n mutationObserver.observer.observe(\n shortDislikeButton,\n mutationObserver.options\n );\n } else {\n getLikeButton().style.color = getColorFromTheme(true);\n getDislikeButton().style.color = getColorFromTheme(false);\n }\n }\n }\n });\n });\n}\n\nfunction likeClicked() {\n if (checkForUserAvatarButton() == true) {\n if (previousState == 1) {\n likesvalue--;\n createRateBar(likesvalue, dislikesvalue);\n setDislikes(numberFormat(dislikesvalue));\n previousState = 3;\n } else if (previousState == 2) {\n likesvalue++;\n dislikesvalue--;\n setDislikes(numberFormat(dislikesvalue));\n createRateBar(likesvalue, dislikesvalue);\n previousState = 1;\n } else if (previousState == 3) {\n likesvalue++;\n createRateBar(likesvalue, dislikesvalue);\n previousState = 1;\n }\n if (extConfig.numberDisplayReformatLikes === true) {\n const nativeLikes = getLikeCountFromButton();\n if (nativeLikes !== false) {\n setLikes(numberFormat(nativeLikes));\n }\n }\n }\n}\n\nfunction dislikeClicked() {\n if (checkForUserAvatarButton() == true) {\n if (previousState == 3) {\n dislikesvalue++;\n setDislikes(numberFormat(dislikesvalue));\n createRateBar(likesvalue, dislikesvalue);\n previousState = 2;\n } else if (previousState == 2) {\n dislikesvalue--;\n setDislikes(numberFormat(dislikesvalue));\n createRateBar(likesvalue, dislikesvalue);\n previousState = 3;\n } else if (previousState == 1) {\n likesvalue--;\n dislikesvalue++;\n setDislikes(numberFormat(dislikesvalue));\n createRateBar(likesvalue, dislikesvalue);\n previousState = 2;\n if (extConfig.numberDisplayReformatLikes === true) {\n const nativeLikes = getLikeCountFromButton();\n if (nativeLikes !== false) {\n setLikes(numberFormat(nativeLikes));\n }\n }\n }\n }\n}\n\nfunction setInitialState() {\n setState();\n}\n\nfunction getVideoId() {\n const urlObject = new URL(window.location.href);\n const pathname = urlObject.pathname;\n if (pathname.startsWith(\"/clip\")) {\n return document.querySelector(\"meta[itemprop='videoId']\").content;\n } else {\n if (pathname.startsWith(\"/shorts\")) {\n return pathname.slice(8);\n }\n return urlObject.searchParams.get(\"v\");\n }\n}\n\nfunction isVideoLoaded() {\n if (isMobile) {\n return document.getElementById(\"player\").getAttribute(\"loading\") == \"false\";\n }\n const videoId = getVideoId();\n\n return (\n document.querySelector(`ytd-watch-flexy[video-id='${videoId}']`) !== null\n );\n}\n\nfunction roundDown(num) {\n if (num < 1000) return num;\n const int = Math.floor(Math.log10(num) - 2);\n const decimal = int + (int % 3 ? 1 : 0);\n const value = Math.floor(num / 10 ** decimal);\n return value * 10 ** decimal;\n}\n\nfunction numberFormat(numberState) {\n let numberDisplay;\n if (extConfig.numberDisplayRoundDown === false) {\n numberDisplay = numberState;\n } else {\n numberDisplay = roundDown(numberState);\n }\n return getNumberFormatter(extConfig.numberDisplayFormat).format(\n numberDisplay\n );\n}\n\nfunction getNumberFormatter(optionSelect) {\n let userLocales;\n if (document.documentElement.lang) {\n userLocales = document.documentElement.lang;\n } else if (navigator.language) {\n userLocales = navigator.language;\n } else {\n try {\n userLocales = new URL(\n Array.from(document.querySelectorAll(\"head > link[rel='search']\"))\n ?.find((n) => n?.getAttribute(\"href\")?.includes(\"?locale=\"))\n ?.getAttribute(\"href\")\n )?.searchParams?.get(\"locale\");\n } catch {\n cLog(\n \"Cannot find browser locale. Use en as default for number formatting.\"\n );\n userLocales = \"en\";\n }\n }\n\n let formatterNotation;\n let formatterCompactDisplay;\n switch (optionSelect) {\n case \"compactLong\":\n formatterNotation = \"compact\";\n formatterCompactDisplay = \"long\";\n break;\n case \"standard\":\n formatterNotation = \"standard\";\n formatterCompactDisplay = \"short\";\n break;\n case \"compactShort\":\n default:\n formatterNotation = \"compact\";\n formatterCompactDisplay = \"short\";\n }\n\n const formatter = Intl.NumberFormat(userLocales, {\n notation: formatterNotation,\n compactDisplay: formatterCompactDisplay,\n });\n return formatter;\n}\n\nfunction getColorFromTheme(voteIsLike) {\n let colorString;\n switch (extConfig.colorTheme) {\n case \"accessible\":\n if (voteIsLike === true) {\n colorString = \"dodgerblue\";\n } else {\n colorString = \"gold\";\n }\n break;\n case \"neon\":\n if (voteIsLike === true) {\n colorString = \"aqua\";\n } else {\n colorString = \"magenta\";\n }\n break;\n case \"classic\":\n default:\n if (voteIsLike === true) {\n colorString = \"lime\";\n } else {\n colorString = \"red\";\n }\n }\n return colorString;\n}\n\nfunction setEventListeners(evt) {\n let jsInitChecktimer;\n\n function checkForJS_Finish() {\n console.log();\n if (isShorts() || (getButtons()?.offsetParent && isVideoLoaded())) {\n const buttons = getButtons();\n\n if (!window.returnDislikeButtonlistenersSet) {\n cLog(\"Registering button listeners...\");\n try {\n buttons.children[0].addEventListener(\"click\", likeClicked);\n buttons.children[1].addEventListener(\"click\", dislikeClicked);\n buttons.children[0].addEventListener(\"touchstart\", likeClicked);\n buttons.children[1].addEventListener(\"touchstart\", dislikeClicked);\n } catch {\n return;\n } //Don't spam errors into the console\n window.returnDislikeButtonlistenersSet = true;\n }\n setInitialState();\n clearInterval(jsInitChecktimer);\n }\n }\n\n cLog(\"Setting up...\");\n jsInitChecktimer = setInterval(checkForJS_Finish, 111);\n}\n\n(function () {\n \"use strict\";\n window.addEventListener(\"yt-navigate-finish\", setEventListeners, true);\n setEventListeners();\n})();\nif (isMobile) {\n let originalPush = history.pushState;\n history.pushState = function (...args) {\n window.returnDislikeButtonlistenersSet = false;\n setEventListeners(args[2]);\n return originalPush.apply(history, args);\n };\n setInterval(() => {\n getDislikeButton().querySelector(\".button-renderer-text\").innerText =\n mobileDislikes;\n }, 1000);\n}","overrideSpeed":1,"strict":true,"type":"JS"}],"speedSlider":null,"staticOverlay":false,"version":10}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment