Skip to content

Instantly share code, notes, and snippets.

@viplyzbytes
Last active February 17, 2025 10:55
Show Gist options
  • Save viplyzbytes/7dfa6db97ebafcf692c7cc62b16d86ad to your computer and use it in GitHub Desktop.
Save viplyzbytes/7dfa6db97ebafcf692c7cc62b16d86ad to your computer and use it in GitHub Desktop.
My config and settings for desktop browser extension Global Speed by polywock
{"audioFx":{"delay":0,"eq":{"enabled":false,"factor":1,"values":[0,0,0,0,0,0,0,0,0,0]},"pitch":0,"volume":1},"darkTheme":true,"enabled":true,"firstUse":1660212151659,"ghostMode":true,"gptWebsiteCounter":5,"hideBadge":false,"indicatorInit":{"duration":1,"offset":0.83,"rounding":1.19,"scaling":1.01,"static":false},"initialContext":2,"keybinds":[{"command":"state","enabled":true,"greedy":true,"id":"1177791252","key":{"code":"KeyQ","shiftKey":true},"spacing":0,"valueState":"toggle"},{"command":"pin","enabled":true,"greedy":true,"id":"5995863115","key":"KeyQ","spacing":2,"valueState":"toggle"},{"adjustMode":2,"command":"speed","enabled":true,"greedy":true,"id":"3893216778","key":"KeyA","valueNumber":-0.1},{"adjustMode":2,"command":"speed","enabled":true,"greedy":true,"id":"5527832638","key":{"altKey":false,"code":"KeyA","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueNumber":-0.01},{"adjustMode":1,"command":"speed","enabled":true,"greedy":true,"id":"5280688322","key":{"altKey":false,"code":"KeyS","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":1},{"adjustMode":3,"command":"speed","cycleIncrement":1,"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":"speed","enabled":true,"greedy":true,"id":"3349785623","key":{"altKey":false,"code":"KeyD","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueNumber":0.01},{"adjustMode":2,"command":"speed","enabled":true,"greedy":true,"id":"4305571903","key":"KeyD","spacing":2,"valueCycle":[1,2],"valueNumber":0.1},{"adjustMode":2,"autoPause":true,"command":"seek","duration":2,"enabled":true,"greedy":true,"id":"3322862107","key":{"altKey":false,"code":"KeyZ","ctrlKey":true,"metaKey":false,"shiftKey":true},"valueNumber":-1},{"adjustMode":2,"command":"seek","enabled":true,"greedy":true,"id":"8172299073","key":"KeyZ","valueNumber":-5},{"adjustMode":2,"command":"seek","enabled":true,"greedy":true,"id":"8977614209","key":{"altKey":false,"code":"KeyZ","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":1,"valueNumber":-10},{"adjustMode":2,"autoPause":true,"command":"seek","duration":2,"enabled":true,"greedy":true,"id":"2758161223","key":{"altKey":false,"code":"KeyX","ctrlKey":true,"metaKey":false,"shiftKey":true},"spacing":0,"valueNumber":1},{"adjustMode":2,"command":"seek","enabled":true,"greedy":true,"id":"2809664649","key":"KeyX","spacing":0,"valueNumber":5},{"adjustMode":2,"command":"seek","enabled":true,"greedy":true,"id":"743001454","key":{"altKey":false,"code":"KeyX","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":2,"valueNumber":10},{"command":"pause","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}},{"command":"fullscreen","direct":true,"enabled":true,"greedy":true,"id":"1527828224","key":{"code":"KeyF","shiftKey":true},"spacing":0},{"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":"loop","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":"loop","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":"loop","enabled":true,"greedy":true,"id":"324522912","key":{"altKey":true,"code":"Digit3","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":2,"valueString":"mark3"},{"command":"fxReset","enabled":true,"filterTarget":"both","greedy":true,"id":"5759026778","key":{"altKey":false,"code":"KeyR","ctrlKey":false,"metaKey":false,"shiftKey":true}},{"adjustMode":3,"command":"fxFilter","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]},{"adjustMode":3,"command":"fxFilter","cycleIncrement":1,"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]},{"adjustMode":3,"command":"fxFilter","cycleIncrement":0,"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},{"adjustMode":3,"command":"fxFilter","cycleIncrement":1,"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},{"command":"mute","enabled":true,"greedy":true,"id":"756138300","key":{"altKey":false,"code":"KeyM","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueState":"toggle"},{"command":"afxCapture","enabled":true,"global":true,"greedy":true,"id":"2196828131","spacing":1,"trigger":1,"valueState":"toggle"},{"adjustMode":2,"command":"afxGain","enabled":true,"greedy":true,"id":"6525245521","key":{"altKey":false,"code":"Numpad4","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":0.05},{"adjustMode":2,"command":"afxGain","enabled":true,"greedy":true,"id":"9896914283","key":{"altKey":false,"code":"Numpad1","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":1,"valueNumber":-0.05},{"adjustMode":2,"command":"afxPitch","enabled":true,"greedy":true,"id":"238214247","key":{"altKey":false,"code":"Numpad5","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":0.1},{"adjustMode":2,"command":"afxPitch","enabled":true,"greedy":true,"id":"7160661072","key":{"altKey":false,"code":"Numpad2","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":1,"valueNumber":-0.1},{"adjustMode":2,"command":"afxDelay","enabled":true,"greedy":true,"id":"5858853110","key":{"altKey":false,"code":"Numpad6","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":0.05},{"adjustMode":2,"command":"afxDelay","enabled":true,"greedy":true,"id":"3885656789","key":{"altKey":false,"code":"Numpad3","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":1,"valueNumber":-0.05},{"adjustMode":1,"command":"afxGain","enabled":true,"greedy":true,"id":"1889178290","key":{"altKey":false,"code":"Numpad0","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":1},{"adjustMode":1,"command":"afxPitch","enabled":true,"greedy":true,"id":"403244030","key":{"altKey":false,"code":"Numpad0","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":null},{"adjustMode":1,"command":"afxDelay","enabled":true,"greedy":true,"id":"4034237104","key":{"altKey":false,"code":"Numpad0","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":2,"valueNumber":0},{"adjustMode":1,"command":"seek","duration":3,"enabled":true,"greedy":true,"id":"9371869489","key":{"altKey":false,"code":"KeyB","ctrlKey":false,"metaKey":false,"shiftKey":false},"spacing":0,"valueNumber":0.01},{"command":"setMark","enabled":true,"greedy":true,"id":"8359722880","key":{"altKey":false,"code":"KeyB","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueString":"markBegining"},{"command":"seekMark","enabled":true,"greedy":true,"id":"1757817060","key":{"altKey":false,"code":"KeyB","ctrlKey":false,"metaKey":false,"shiftKey":true},"spacing":1,"valueString":"markBegining"},{"adjustMode":1,"command":"seek","duration":3,"enabled":true,"greedy":true,"id":"7720394765","key":{"altKey":false,"code":"KeyE","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueNumber":99.5},{"command":"setMark","enabled":true,"greedy":true,"id":"1219987231","key":{"altKey":false,"code":"KeyE","ctrlKey":false,"metaKey":false,"shiftKey":false},"valueString":"markEnd"},{"command":"seekMark","enabled":true,"greedy":true,"id":"6253685615","key":{"altKey":false,"code":"KeyE","ctrlKey":false,"metaKey":false,"shiftKey":true},"valueString":"mark1"}],"keybindsUrlCondition":{"block":true,"parts":[{"id":"967066353","type":"CONTAINS","valueContains":"miniclip.com","valueRegex":"example\\.com","valueStartsWith":"https://example.com"},{"id":"8322300676","type":"CONTAINS","valueContains":"cloudplay.jiogames.com","valueRegex":"example\\.com","valueStartsWith":"https://example.com"},{"id":"5316314592","type":"CONTAINS","valueContains":"typingclub.com","valueRegex":"example\\.com","valueStartsWith":"https://example.com"}]},"language":"en","lastSpeed":1.1,"latestViaShortcut":false,"monoOutput":false,"pinByDefault":false,"rules":[{"condition":{"parts":[{"id":"10807114","type":"CONTAINS","valueContains":"twitch.tv","valueRegex":"example\\.com","valueStartsWith":"https://example.com"},{"id":"1206401022","type":"STARTS_WITH","valueContains":"music.youtube.com","valueRegex":"example\\.com","valueStartsWith":"https://music.youtube.com/"}]},"enabled":true,"id":"7467268185","overrideSpeed":1,"type":"SPEED"},{"condition":{"parts":[{"id":"957057171","type":"CONTAINS","valueContains":"monkeytype.com","valueRegex":"example\\.com","valueStartsWith":"https://example.com"}]},"enabled":true,"id":"4298158470","label":"BLacklisted Sites","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,"spacing":1,"type":"OFF"}],"speed":1,"speedChangeCounter":12,"version":12}
@viplyzbytes
Copy link
Author

update to include seek to beginning and seek to end of media.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment