- // ==UserScript==
- // @name Enhanced YouTube Userscript with Themes, Decorations, Button Animations, and Timer
- // @namespace http://tampermonkey.net/
- // @version 3.8
- // @description Adds multiple features including ad skipping, mute toggle, captions toggle, playback speed control, and more with a moveable and fixed GUI for YouTube. Includes notifications for feature toggles, theme decorations, button animations, and a video timer. Press Shift + S to hide/show the menu.
- // @author Wadawg117
- // @match https://www.youtube.com/*
- // @icon https://www.youtube.com/s/desktop/fa72b5c3/img/favicon_32x32.png
- // @grant none
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- // Create the main container for the GUI
- const container = document.createElement('div');
- container.style.position = 'fixed';
- container.style.top = '50%';
- container.style.left = '50%';
- container.style.width = '300px'; // Slightly larger width
- container.style.height = 'auto'; // Adjust height automatically based on content
- container.style.transform = 'translate(-50%, -50%)'; // Center the container
- container.style.zIndex = '1000';
- container.style.padding = '10px'; // Slightly larger padding
- container.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
- container.style.border = '2px solid #ff0000';
- container.style.borderRadius = '10px';
- container.style.color = '#ffffff';
- container.style.display = 'grid';
- container.style.gridTemplateColumns = 'repeat(2, auto)';
- container.style.gap = '10px';
- container.style.cursor = 'move';
-
- // Create the notification popup container
- const popupContainer = document.createElement('div');
- popupContainer.style.position = 'fixed';
- popupContainer.style.bottom = '20px';
- popupContainer.style.right = '20px';
- popupContainer.style.padding = '10px';
- popupContainer.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
- popupContainer.style.border = '2px solid #ff0000';
- popupContainer.style.borderRadius = '10px';
- popupContainer.style.color = '#ffffff';
- popupContainer.style.display = 'none';
- popupContainer.style.zIndex = '1001';
-
- // Append the popup container to the body
- document.body.appendChild(popupContainer);
-
- // Function to show the notification popup
- const showPopup = (message) => {
- popupContainer.innerText = message;
- popupContainer.style.display = 'block';
- setTimeout(() => {
- popupContainer.style.display = 'none';
- }, 2000);
- };
-
- // Create buttons for different features
- const createButton = (label, onClick) => {
- const button = document.createElement('button');
- button.innerText = label;
- button.style.padding = '5px';
- button.style.backgroundColor = '#ff0000';
- button.style.color = '#ffffff';
- button.style.border = '1px solid #000000'; // Black outline
- button.style.borderRadius = '5px';
- button.style.cursor = 'pointer';
- button.style.transition = 'transform 0.2s';
- button.addEventListener('click', () => {
- button.style.transform = 'scale(0.95)';
- setTimeout(() => {
- button.style.transform = 'scale(1)';
- onClick();
- }, 200);
- });
- return button;
- };
-
- // Feature functions
- const toggleComments = () => {
- const commentsSection = document.getElementById('comments');
- if (commentsSection) {
- const isHidden = commentsSection.style.display === 'none';
- commentsSection.style.display = isHidden ? '' : 'none';
- showPopup(isHidden ? 'Turned on Comments' : 'Turned off Comments');
- }
- };
-
- const toggleDescription = () => {
- const descriptionSection = document.querySelector('#meta-contents');
- if (descriptionSection) {
- const isHidden = descriptionSection.style.display === 'none';
- descriptionSection.style.display = isHidden ? '' : 'none';
- showPopup(isHidden ? 'Turned on Description' : 'Turned off Description');
- }
- };
-
- const toggleRelatedVideos = () => {
- const relatedVideosSection = document.querySelector('#related');
- if (relatedVideosSection) {
- const isHidden = relatedVideosSection.style.display === 'none';
- relatedVideosSection.style.display = isHidden ? '' : 'none';
- showPopup(isHidden ? 'Turned on Related Videos' : 'Turned off Related Videos');
- }
- };
-
- const skipAds = () => {
- const adSkipButton = document.querySelector('.ytp-ad-skip-button');
- if (adSkipButton) {
- adSkipButton.click();
- showPopup('Skipped Ad');
- } else {
- showPopup('No ad found');
- }
- };
-
- const toggleMute = () => {
- const muteButton = document.querySelector('.ytp-mute-button');
- if (muteButton) {
- const isMuted = document.querySelector('video').muted;
- muteButton.click();
- showPopup(isMuted ? 'Turned off Mute' : 'Turned on Mute');
- }
- };
-
- const toggleCaptions = () => {
- const captionsButton = document.querySelector('.ytp-subtitles-button');
- if (captionsButton) {
- captionsButton.click();
- showPopup('Toggled Captions');
- }
- };
-
- const increasePlaybackSpeed = () => {
- const video = document.querySelector('video');
- if (video) {
- video.playbackRate = Math.min(video.playbackRate + 0.25, 2);
- showPopup(`Playback Speed: ${video.playbackRate.toFixed(2)}x`);
- }
- };
-
- const decreasePlaybackSpeed = () => {
- const video = document.querySelector('video');
- if (video) {
- video.playbackRate = Math.max(video.playbackRate - 0.25, 0.25);
- showPopup(`Playback Speed: ${video.playbackRate.toFixed(2)}x`);
- }
- };
-
- const resetPlaybackSpeed = () => {
- const video = document.querySelector('video');
- if (video) {
- video.playbackRate = 1.0;
- showPopup('Playback Speed Reset to 1.0x');
- }
- };
-
- // Theme changer function
- const changeTheme = (theme) => {
- removeExistingDecorations();
- switch (theme) {
- case '0':
- container.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
- container.style.border = '2px solid #ff0000';
- addDefaultDecoration();
- showPopup('Default theme activated');
- break;
- case '1':
- container.style.backgroundColor = 'rgba(255, 0, 127, 0.8)';
- container.style.border = '2px solid #ff69b4';
- addValentineDecoration();
- showPopup('Valentine theme activated');
- break;
- case '2':
- container.style.backgroundColor = 'rgba(255, 0, 0, 0.8)';
- container.style.border = '2px solid #ff0000';
- addYouTubeDecoration();
- showPopup('YouTube theme activated');
- break;
- case '3':
- container.style.backgroundColor = 'rgba(255, 165, 0, 0.8)';
- container.style.border = '2px solid #ffa500';
- addHalloweenDecoration();
- showPopup('Halloween theme activated');
- break;
- case '4':
- container.style.backgroundColor = 'rgba(0, 128, 0, 0.8)';
- container.style.border = '2px solid #008000';
- addChristmasDecoration();
- showPopup('Christmas theme activated');
- break;
- }
- };
-
- // Add decorations for each theme
- const addDefaultDecoration = () => {
- // No decorations for default theme
- };
-
- const addValentineDecoration = () => {
- for (let i = 0; i < 10; i++) {
- const heart = document.createElement('div');
- heart.innerHTML = '❤️';
- heart.classList.add('decoration');
- heart.style.position = 'fixed';
- heart.style.left = `${Math.random() * 100}%`;
- heart.style.top = `${Math.random() * 100}%`;
- heart.style.animation = 'float 5s infinite';
- heart.style.fontSize = '24px';
- heart.style.zIndex = '1000';
- document.body.appendChild(heart);
- }
- };
-
- const addYouTubeDecoration = () => {
- for (let i = 0; i < 10; i++) {
- const youtubeIcon = document.createElement('div');
- youtubeIcon.innerHTML = '🎥';
- youtubeIcon.classList.add('decoration');
- youtubeIcon.style.position = 'fixed';
- youtubeIcon.style.left = `${Math.random() * 100}%`;
- youtubeIcon.style.top = `${Math.random() * 100}%`;
- youtubeIcon.style.animation = 'float 5s infinite';
- youtubeIcon.style.fontSize = '24px';
- youtubeIcon.style.zIndex = '1000';
- document.body.appendChild(youtubeIcon);
- }
- };
-
- const addHalloweenDecoration = () => {
- for (let i = 0; i < 10; i++) {
- const pumpkin = document.createElement('div');
- pumpkin.innerHTML = '🎃';
- pumpkin.classList.add('decoration');
- pumpkin.style.position = 'fixed';
- pumpkin.style.left = `${Math.random() * 100}%`;
- pumpkin.style.top = `${Math.random() * 100}%`;
- pumpkin.style.animation = 'float 5s infinite';
- pumpkin.style.fontSize = '24px';
- pumpkin.style.zIndex = '1000';
- document.body.appendChild(pumpkin);
- }
- };
-
- const addChristmasDecoration = () => {
- for (let i = 0; i < 10; i++) {
- const snowflake = document.createElement('div');
- snowflake.innerHTML = '❄️';
- snowflake.classList.add('decoration');
- snowflake.style.position = 'fixed';
- snowflake.style.left = `${Math.random() * 100}%`;
- snowflake.style.top = `${Math.random() * 100}%`;
- snowflake.style.animation = 'float 5s infinite';
- snowflake.style.fontSize = '24px';
- snowflake.style.zIndex = '1000';
- document.body.appendChild(snowflake);
- }
- };
-
- // Remove existing decorations
- const removeExistingDecorations = () => {
- const decorations = document.querySelectorAll('.decoration');
- decorations.forEach(deco => {
- deco.remove();
- });
- };
-
- // Create the theme slider
- const createThemeSlider = () => {
- const sliderContainer = document.createElement('div');
- sliderContainer.style.gridColumn = 'span 2';
- sliderContainer.style.display = 'flex';
- sliderContainer.style.flexDirection = 'column';
- sliderContainer.style.alignItems = 'center';
- sliderContainer.style.marginTop = '10px';
-
- const sliderLabel = document.createElement('label');
- sliderLabel.innerText = 'Select Theme:';
- sliderLabel.style.marginBottom = '5px';
- sliderContainer.appendChild(sliderLabel);
-
- const slider = document.createElement('input');
- slider.type = 'range';
- slider.min = '0';
- slider.max = '4';
- slider.value = '0';
- slider.style.width = '100%';
- slider.oninput = (e) => changeTheme(e.target.value);
- sliderContainer.appendChild(slider);
-
- const themeNames = ['Default', 'Valentine', 'YouTube', 'Halloween', 'Christmas'];
- const themeName = document.createElement('div');
- themeName.innerText = themeNames[slider.value];
- sliderContainer.appendChild(themeName);
-
- slider.addEventListener('input', (e) => {
- themeName.innerText = themeNames[e.target.value];
- });
-
- // Prevent dragging when interacting with the slider
- slider.addEventListener('mousedown', (e) => {
- e.stopPropagation();
- });
-
- return sliderContainer;
- };
-
- // Create the video timer
- const createVideoTimer = () => {
- const timer = document.createElement('div');
- timer.style.position = 'fixed';
- timer.style.top = '10px';
- timer.style.left = '10px';
- timer.style.padding = '10px'; // Increased padding for larger size
- timer.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
- timer.style.color = '#ffffff';
- timer.style.borderRadius = '5px';
- timer.style.fontSize = '16px'; // Increased font size
- timer.style.zIndex = '1000';
- document.body.appendChild(timer);
-
- const updateTimer = () => {
- const video = document.querySelector('video');
- if (video) {
- const timeLeft = video.duration - video.currentTime;
- const minutes = Math.floor(timeLeft / 60);
- const seconds = Math.floor(timeLeft % 60);
- timer.innerText = `Time Left: ${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
- } else {
- timer.innerText = 'Time Left: --:--';
- }
- requestAnimationFrame(updateTimer);
- };
-
- updateTimer();
- };
-
- // Append buttons to the container
- const buttons = [
- { label: 'Toggle Comments', action: toggleComments },
- { label: 'Toggle Description', action: toggleDescription },
- { label: 'Toggle Related Videos', action: toggleRelatedVideos },
- { label: 'Skip Ads', action: skipAds },
- { label: 'Toggle Mute', action: toggleMute },
- { label: 'Toggle Captions', action: toggleCaptions },
- { label: 'Increase Speed', action: increasePlaybackSpeed },
- { label: 'Decrease Speed', action: decreasePlaybackSpeed },
- { label: 'Reset Speed', action: resetPlaybackSpeed }
- ];
-
- buttons.forEach(button => {
- container.appendChild(createButton(button.label, button.action));
- });
-
- container.appendChild(createThemeSlider());
-
- // Make the container moveable
- let isMouseDown = false;
- let offsetX, offsetY;
-
- container.addEventListener('mousedown', (e) => {
- isMouseDown = true;
- offsetX = e.clientX - container.getBoundingClientRect().left;
- offsetY = e.clientY - container.getBoundingClientRect().top;
- container.style.cursor = 'grabbing';
- });
-
- document.addEventListener('mousemove', (e) => {
- if (isMouseDown) {
- container.style.left = `${e.clientX - offsetX}px`;
- container.style.top = `${e.clientY - offsetY}px`;
- container.style.transform = ''; // Remove the centering transform
- }
- });
-
- document.addEventListener('mouseup', () => {
- isMouseDown = false;
- container.style.cursor = 'move';
- });
-
- // Append the container to the body
- document.body.appendChild(container);
-
- // Create and append the video timer
- createVideoTimer();
-
- // Keyboard shortcut to hide/show the menu
- let isMenuVisible = true;
- document.addEventListener('keydown', (e) => {
- if (e.shiftKey && e.key === 'S') {
- isMenuVisible = !isMenuVisible;
- container.style.display = isMenuVisible ? 'grid' : 'none';
- }
- });
-
- // Add CSS for floating animation
- const style = document.createElement('style');
- style.innerHTML = `
- @keyframes float {
- 0% { transform: translateY(0); }
- 50% { transform: translateY(-20px); }
- 100% { transform: translateY(0); }
- }
- `;
- document.head.appendChild(style);
- })();