Manipulate and center video elements on web pages. (Zoom, Invert, save per site, Move, Volume boost, Reset changes)
目前為
// ==UserScript==
// @name Extra Video Control
// @version 2.0
// @description Manipulate and center video elements on web pages. (Zoom, Invert, save per site, Move, Volume boost, Reset changes)
// @run-at document-start
// @match *://*/*
// @grant none
// @author TallTacoTristan
// @license MIT
// @namespace https://greasyfork.org/users/1253611
// ==/UserScript==
// Declare variables
let xaxis = 1.0;
let yaxis = 1.0;
let xposition = 0;
let yposition = 0;
// Check if stored values exist for the current site
if (localStorage.getItem('xaxis')) {
xaxis = parseFloat(localStorage.getItem('xaxis'));
yaxis = parseFloat(localStorage.getItem('yaxis'));
xposition = parseInt(localStorage.getItem('xposition'));
yposition = parseInt(localStorage.getItem('yposition'));
}
// Apply transformations to all existing video elements
applyTransformations();
document.addEventListener('keydown', (event) => {
if (event.altKey) {
switch (event.keyCode) {
case 88: // 'x' key
if (event.shiftKey) {
if (xaxis < 0) xaxis += 0.04;
else xaxis -= 0.04;
} else {
if (xaxis < 0) xaxis -= 0.04;
else xaxis += 0.04;
}
break;
case 89: // 'y' key
if (event.shiftKey) {
if (yaxis < 0) yaxis += 0.04;
else yaxis -= 0.04;
} else {
if (yaxis < 0) yaxis -= 0.04;
else yaxis += 0.04;
}
break;
case 187: // '+' key
if (xaxis < 0) xaxis -= 0.04;
else xaxis += 0.04;
if (yaxis < 0) yaxis -= 0.04;
else yaxis += 0.04;
break;
case 189: // '-' key
if (xaxis < 0) xaxis += 0.04;
else xaxis -= 0.04;
if (yaxis < 0) yaxis += 0.04;
else yaxis -= 0.04;
break;
case 85: // 'u' key (up)
yposition -= 20;
break;
case 72: // 'h' key (left)
xposition -= 20
break;
case 74: // 'j' key (down)
yposition += 20
break;
case 75: // 'k' key (right)
xposition += 20
break;
case 82: // 'r' key (reset)
xaxis = 1.0;
yaxis = 1.0;
xposition = 0;
yposition = 0;
break;
}
// Save the transformation values for the current site
localStorage.setItem('xaxis', xaxis);
localStorage.setItem('yaxis', yaxis);
localStorage.setItem('xposition', xposition);
localStorage.setItem('yposition', yposition);
// Apply transformations to all video elements
applyTransformations();
}
});
// Function to apply transformations to all video elements
function applyTransformations() {
document.querySelectorAll('video').forEach(video => {
video.style.transform = `scale(${xaxis}, ${yaxis}) translate(${xposition}px, ${yposition}px)`;
});
}
// Mutation observer to detect changes in the DOM and reapply transformations
const config = { childList: true, subtree: true };
const callback = function(mutationsList, observer) {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
applyTransformations();
}
}
};
const observer = new MutationObserver(callback);
observer.observe(document, config);
//Optional Volume Control, if enabled, pressing shift to boost volume on some sites will break the video, mainly only works with html5 player like yt, uncomment lines to enable
//const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
//const gainNode = audioCtx.createGain();
//gainNode.gain.value = 1.0; // Initial gain value
//document.addEventListener('keydown', function(event) {
//if (event.shiftKey) {
//if (event.key === '+') {
//gainNode.gain.value = Math.min(gainNode.gain.value + 0.5, 10.0); // Adjust maximum gain as needed
//} else if (event.key === '_') {
//gainNode.gain.value = Math.max(gainNode.gain.value - 0.5, 0.0);
//}
//document.querySelectorAll('video').forEach(video => {
//const source = audioCtx.createMediaElementSource(video);
//source.connect(gainNode);
//gainNode.connect(audioCtx.destination);
//});
//}
//});