// ==UserScript== // @name YouTube Playback Speed Buttons // @description Adds playback speed buttons to youtube player control bar. // @version 1.0.2 // @license MIT // @author bowencool // @match https://www.youtube.com/* // @namespace https://www.youtube.com/ // @author bowencool // @license MIT // @homepageURL https://greasyfork.org/scripts/475864 // @supportURL https://github.com/bowencool/Tampermonkey-Scripts/issues // @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com // @run-at document-end // @require https://cdn.jsdelivr.net/gh/bowencool/Tampermonkey-Scripts@f59cc91442dd34eb28e0d270486da5c7ac8d2d50/shared/waitForElementToExist.js // @grant GM_addStyle // @downloadURL https://update.greasyfork.icu/scripts/475864/YouTube%20Playback%20Speed%20Buttons.user.js // @updateURL https://update.greasyfork.icu/scripts/475864/YouTube%20Playback%20Speed%20Buttons.meta.js // ==/UserScript== "use strict"; async function main() { const menuR = await waitForElementToExist(".ytp-right-controls"); const video = await waitForElementToExist(".html5-main-video"); if (window.trustedTypes && window.trustedTypes.createPolicy) { window.trustedTypes.createPolicy("default", { createHTML: (string, sink) => string, }); } GM_addStyle(`.speed-button { float: left; }`); const storedPlaybackRate = parseFloat( sessionStorage.getItem("playback-rate"), 10 ); if (storedPlaybackRate > 0) { video.playbackRate = storedPlaybackRate; } const fasterButton = document.createElement("button"); fasterButton.setAttribute("aria-label", "10% faster"); fasterButton.title = "10% faster"; fasterButton.innerHTML = window.trustedTypes.defaultPolicy .createHTML``; fasterButton.classList.add("ytp-button", "speed-button"); fasterButton.onclick = () => { const speed = Math.ceil(video.playbackRate * 11) / 10; console.log(speed); video.playbackRate = speed; sessionStorage.setItem("playback-rate", speed); }; menuR.prepend(fasterButton); const resetButton = document.createElement("button"); resetButton.setAttribute("aria-label", "Reset to 1x"); resetButton.title = "Reset to 1x"; resetButton.innerHTML = window.trustedTypes.defaultPolicy .createHTML``; resetButton.classList.add("ytp-button", "speed-button"); resetButton.onclick = () => { video.playbackRate = 1; sessionStorage.removeItem("playback-rate"); }; menuR.prepend(resetButton); const slowerButton = document.createElement("button"); slowerButton.setAttribute("aria-label", "10% slower"); slowerButton.title = "10% slower"; slowerButton.innerHTML = window.trustedTypes.defaultPolicy .createHTML``; slowerButton.classList.add("ytp-button", "speed-button"); slowerButton.onclick = () => { const speed = Math.floor(video.playbackRate * 9) / 10; console.log(speed); if (speed === 0) return; video.playbackRate = speed; sessionStorage.setItem("playback-rate", speed); }; menuR.prepend(slowerButton); } main();