YouTube Playback Speed Control Pro

Adjust YouTube playback speed with "[" and "]", show speed popup in video top-right corner, and reset with "\" key.

// ==UserScript==
// @name         YouTube Playback Speed Control Pro
// @icon         https://i.ibb.co/7tmpKX6/fast-time-clock-or-speed-19009.png
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Adjust YouTube playback speed with "[" and "]", show speed popup in video top-right corner, and reset with "\" key.
// @author       Lalit1022
// @match        *://www.youtube.com/*
// @license MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Popup style settings
    const popupStyle = {
        backgroundColor: 'rgba(0, 0, 0, 0.8)',
        textColor: '#fff',
        fontSize: '16px',
        position: { top: '10px', right: '10px' },
        fontFamily: '"Arial", "Helvetica", "sans-serif"' // Enforcing font for popup
    };

    // Function to display a temporary popup message
    function showPopup(message) {
        const videoContainer = document.querySelector('video');
        if (!videoContainer) return;

        // Check if in full-screen mode
        const isFullScreen = document.fullscreenElement !== null;

        // Adjust popup size if in full-screen mode
        const popupSize = isFullScreen ? '20px' : popupStyle.fontSize;

        // Create popup
        let popup = document.createElement('div');
        popup.id = 'speed-popup';
        popup.textContent = message;
        popup.style.position = 'absolute';
        popup.style.top = popupStyle.position.top;
        popup.style.right = popupStyle.position.right;
        popup.style.backgroundColor = popupStyle.backgroundColor;
        popup.style.color = popupStyle.textColor;
        popup.style.padding = '10px 15px';
        popup.style.borderRadius = '7px';
        popup.style.fontSize = popupSize;
        popup.style.fontFamily = popupStyle.fontFamily;
        popup.style.zIndex = '10000';
        popup.style.opacity = '0';
        popup.style.transition = 'opacity 0.3s';

        // Position inside video container
        const container = videoContainer.parentElement;
        container.style.position = 'relative'; // Ensure parent has relative positioning
        container.appendChild(popup);

        // Fade in the popup
        setTimeout(() => {
            popup.style.opacity = '1';
        }, 10);

        // Remove the popup after 2 seconds
        setTimeout(() => {
            popup.style.opacity = '0';
            setTimeout(() => {
                popup.remove();
            }, 300);
        }, 2000);
    }

    // Event listener for key presses to adjust speed
    document.addEventListener('keydown', (event) => {
        const video = document.querySelector('video');
        if (!video) return;

        const currentSpeed = video.playbackRate;

        if (event.key === '[') {
            const newSpeed = Math.max(0.25, currentSpeed - 0.25);
            video.playbackRate = newSpeed;
            showPopup(`Speed : ×${newSpeed.toFixed(2)}`);
        } else if (event.key === ']') {
            const newSpeed = Math.min(16, currentSpeed + 0.25);
            video.playbackRate = newSpeed;
            showPopup(`Speed : ×${newSpeed.toFixed(2)}`);
        } else if (event.key === '\\') {
            video.playbackRate = 1.0;
            showPopup(`Speed : Default`);
        }
    });

    // Show keybinding information overlay on page load (if no speed is saved)
    window.addEventListener('load', () => {
        const overlay = document.createElement('div');
        overlay.textContent = 'Press "[" to decrease and "]" to increase playback speed. Press "\\" to reset.';
        overlay.style.position = 'absolute';
        overlay.style.bottom = '33px';
        overlay.style.left = '10px';
        overlay.style.backgroundColor = 'rgba(0,0,0,0.7)';
        overlay.style.color = '#fff';
        overlay.style.padding = '10px 15px';
        overlay.style.borderRadius = '7px';
        overlay.style.fontSize = '14px';
        overlay.style.fontFamily = '"Arial", "Helvetica", "sans-serif"';
        overlay.style.zIndex = '10000';

        const body = document.querySelector('body');
        body.appendChild(overlay);

        setTimeout(() => {
            overlay.remove();
        }, 5000); // Remove after 5 seconds
    });

    // Persistent Speed Setting: Save and load playback speed
    window.addEventListener('load', () => {
        const video = document.querySelector('video');
        if (!video) return;

        const savedSpeed = localStorage.getItem('youtubePlaybackSpeed');
        if (savedSpeed) {
            video.playbackRate = parseFloat(savedSpeed);
            showPopup(`Speed : ×${video.playbackRate.toFixed(2)}`);
        }

        video.addEventListener('ratechange', () => {
            localStorage.setItem('youtubePlaybackSpeed', video.playbackRate);
        });
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址