// ==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 none
// ==/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();