NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name YouTube Variable Playback Speed
// @namespace https://youtube.com/
// @version 1.0
// @description Increase/decrease YouTube video playback speed by 0.25 increments using + and - keys, even beyond the default 2× limit.
// @author nascent
// @match *://www.youtube.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant none
// @run-at document-end
// @updateURL https://openuserjs.org/meta/nascent/YouTube_Variable_Playback_Speed.meta.js
// @downloadURL https://openuserjs.org/install/nascent/YouTube_Variable_Playback_Speed.user.js
// @copyright 2025, nascent (https://openuserjs.org/users/nascent)
// @license MIT
// ==/UserScript==
(function() {
"use strict";
// Function to display an overlay with the current playback speed
function showPlaybackSpeed(speed) {
let overlay = document.getElementById("playbackSpeedOverlay");
if (!overlay) {
overlay = document.createElement("div");
overlay.id = "playbackSpeedOverlay";
// Style the overlay popup
Object.assign(overlay.style, {
position: "fixed",
top: "20px",
right: "20px",
backgroundColor: "rgba(0,0,0,0.7)",
color: "#fff",
padding: "10px",
borderRadius: "5px",
fontSize: "20px",
zIndex: "9999",
transition: "opacity 0.5s",
});
document.body.appendChild(overlay);
}
overlay.textContent = "Playback speed: " + speed.toFixed(2) + "×";
overlay.style.opacity = "1";
// Clear any previous fade-out timeout and schedule a new one
if (overlay.hideTimeout) {
clearTimeout(overlay.hideTimeout);
}
overlay.hideTimeout = setTimeout(() => {
overlay.style.opacity = "0";
}, 1000);
}
// Listen for keydown events on the document
document.addEventListener("keydown", (e) => {
// Avoid interfering if the user is typing in an input, textarea, or a content-editable element
if (
e.target.matches("input, textarea") ||
e.target.isContentEditable
) {
return;
}
// Get the video element
var video = document.querySelector("video");
if (!video) return;
// If the "-" or "_" key is pressed, decrease the speed
if (e.key === "-" || e.key === "_") {
let newRate = video.playbackRate - 0.25;
// Prevent speeds lower than 0.25x
if (newRate < 0.25) {
newRate = 0.25;
}
video.playbackRate = newRate;
showPlaybackSpeed(newRate);
}
// If the "+" or "=" key is pressed, increase the speed
else if (e.key === "+" || e.key === "=") {
let newRate = video.playbackRate + 0.25;
video.playbackRate = newRate;
showPlaybackSpeed(newRate);
}
});
})();