NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Video Speed Controller
// @namespace http://tampermonkey.net/
// @version 0.5
// @description try to take over the world!
// @author You
// @match *://*.x.com/*
// @match *://*.linkedin.com/*
// @match *://*.instagram.com/*
// @match *://*.reddit.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=twitter.com
// @license MIT
// @downloadURL https://openuserjs.org/install/BurakBal96/Video_Speed_Controller.user.js
// @updateURL https://openuserjs.org/meta/BurakBal96/Video_Speed_Controller.meta.js
// @require https://openuserjs.org/src/libs/BurakBal96/Version_Control.js
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
(function() {
'use strict';
const INCREMENT_RATIO = 0.2;
const locationArray = window.location.host.split(".");
const currentWebsite = locationArray[locationArray.length - 2]
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
const init = async () => {
await GM_config.init(
{
title: "Youtube Quality Enhancer Settings",
'id': 'video_speed_controller', // The id used for this instance of GM_config
'fields': // Fields object
{
"x_speed": {
label: "Twitter video speed: ",
type: "float",
default: 1.8,
},
"linkedin_speed": {
label: "LinkedIn video speed: ",
type: "float",
default: 1.8,
},
"instagram_speed": {
label: "IinkedIn video speed: ",
type: "float",
default: 1.8,
},
"reddit_speed": {
label: "Reddit video speed: ",
type: "float",
default: 1.8,
},
}
}
);
await sleep(500);
}
//GM_config.open();
// Your code here...
setInterval(()=>{
const videos = document.querySelectorAll("video");
videos.forEach(video => {
if(video) video.playbackRate = Number(getSpeed());
});
const redditShadowPlayers = document.querySelectorAll("shreddit-player-2")
redditShadowPlayers.forEach(player => {
//if(video) video.playbackRate = Number(getSpeed());
player.shadowRoot.querySelectorAll("video")[0].playbackRate = Number(getSpeed());
});
}, 500);
const getSpeed = () => Number(GM_config.get(currentWebsite+"_speed").toFixed(1));
const setSpeed = (additionalSpeed) => {
let speed = getSpeed();
speed += additionalSpeed;
if(speed <= 0) return;
document.getElementById("video-speed-controller").innerText = speed.toFixed(1);
GM_config.set(currentWebsite+"_speed", speed);
GM_config.save();
}
const shortcutListener = (e) => {
if(!e.altKey) return;
switch(e.keyCode){
case 220: setSpeed(INCREMENT_RATIO); break;
case 90: setSpeed(-INCREMENT_RATIO); break;
}
}
const main = async () => {
await init();
const infoArea = document.createElement('div');
infoArea.style.position = "fixed";
infoArea.style.top = "0";
infoArea.style.right = "10px";
infoArea.style.color = "black";
infoArea.style.zIndex = "999";
infoArea.style.background = "snow";
infoArea.style.display = "flex";
infoArea.style.flexDirection = "column";
infoArea.style.alignItems = "center";
infoArea.style.minWidth = "50px";
infoArea.style.height = "fit-content";
const speedInfo = document.createElement('div');
speedInfo.setAttribute("id","video-speed-controller")
speedInfo.innerText = getSpeed();
infoArea.appendChild(speedInfo);
const buttonArea = document.createElement('div');
buttonArea.style.display = "flex";
buttonArea.style.gap = "5px";
buttonArea.style.background = 'snow';
buttonArea.style.padding = '2px';
const textElement = document.createElement('span');
textElement.innerText = "↺";
textElement.style.position = 'absolute';
textElement.style.translate = '-50% -50%';
textElement.style.color = 'white';
const buttonElement = document.createElement('button');
buttonElement.style.width = '3ex'
buttonElement.style.height = '3ex'
buttonElement.style.borderRadius = '50%'
buttonElement.style.background = 'black';
buttonElement.style.textAlign = 'center';
const resetButton = buttonElement.cloneNode(buttonElement)
const resetText = textElement.cloneNode(textElement)
resetText.innerText = "↺";
resetButton.appendChild(resetText)
resetButton.addEventListener('click', () => {
setSpeed(1-getSpeed())
});
const increaseButton = buttonElement.cloneNode(buttonElement)
const increaseText = textElement.cloneNode(textElement)
increaseText.innerText = "+";
increaseButton.appendChild(increaseText)
increaseButton.addEventListener('click', () => {
setSpeed(INCREMENT_RATIO)
});
const decreaseButton = buttonElement.cloneNode(buttonElement)
const decreaseText = textElement.cloneNode(textElement)
decreaseText.innerText = "-";
decreaseButton.appendChild(decreaseText)
decreaseButton.addEventListener('click', () => {
setSpeed(-INCREMENT_RATIO)
});
buttonArea.appendChild(resetButton);
buttonArea.appendChild(decreaseButton);
buttonArea.appendChild(increaseButton);
infoArea.appendChild(buttonArea);
document.body.append(infoArea);
document.addEventListener('keydown', shortcutListener, false);
}
main();
})();