YouTube God Menu v5.3

Smaller, scrollable, clean black YouTube mod menu with drag and hide features.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         YouTube God Menu v5.3
// @namespace    Marley
// @version      5.3
// @description  Smaller, scrollable, clean black YouTube mod menu with drag and hide features.
// @match        https://www.youtube.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const MENU_ID = 'yt-god-menu';

    function createMenu() {
        const menu = document.createElement('div');
        menu.id = MENU_ID;

        const savedTop = localStorage.getItem('ytMenuTop') || '60px';
        const savedLeft = localStorage.getItem('ytMenuLeft') || '10px';

        Object.assign(menu.style, {
            position: 'fixed',
            top: savedTop,
            left: savedLeft,
            zIndex: '99999',
            background: '#000000',            // pure black background
            color: '#ddd',                   // light grey text
            border: '1px solid #444',       // subtle border
            padding: '8px 12px',
            fontFamily: `'Segoe UI', Tahoma, Geneva, Verdana, sans-serif`,
            borderRadius: '10px',
            width: '180px',
            maxHeight: '320px',
            fontSize: '12px',
            boxShadow: '0 6px 20px rgba(255, 0, 0, 0.5)',
            userSelect: 'none',
            transition: 'background-color 0.3s ease, color 0.3s ease',
            overflowY: 'auto',               // scroll vertical if content too tall
            scrollbarWidth: 'thin',
            scrollbarColor: '#ff0000 #222',
        });

        // Drag bar (smaller height)
        const dragBar = document.createElement('div');
        dragBar.textContent = '📺 YouTube God Menu';
        Object.assign(dragBar.style, {
            cursor: 'grab',
            fontWeight: '700',
            marginBottom: '8px',
            background: '#111',           // slightly lighter black
            padding: '6px 10px',
            borderRadius: '8px',
            boxShadow: '0 3px 8px rgba(255, 0, 0, 0.6)',
            color: '#ff3c3c',             // bright red text
            userSelect: 'none',
            fontSize: '13px',
            textAlign: 'center',
            letterSpacing: '0.04em',
        });

        // Drag logic
        let isDragging = false;
        dragBar.addEventListener('mousedown', (e) => {
            isDragging = true;
            menu.dataset.offsetX = e.clientX - menu.offsetLeft;
            menu.dataset.offsetY = e.clientY - menu.offsetTop;
            dragBar.style.cursor = 'grabbing';
        });

        document.addEventListener('mousemove', (e) => {
            if (isDragging) {
                let newX = e.clientX - menu.dataset.offsetX;
                let newY = e.clientY - menu.dataset.offsetY;

                // Keep menu inside viewport horizontally
                newX = Math.max(0, Math.min(window.innerWidth - menu.offsetWidth, newX));
                // Keep menu inside viewport vertically
                newY = Math.max(0, Math.min(window.innerHeight - menu.offsetHeight, newY));

                menu.style.left = `${newX}px`;
                menu.style.top = `${newY}px`;
            }
        });

        document.addEventListener('mouseup', () => {
            if (isDragging) {
                isDragging = false;
                localStorage.setItem('ytMenuTop', menu.style.top);
                localStorage.setItem('ytMenuLeft', menu.style.left);
                dragBar.style.cursor = 'grab';
            }
        });

        menu.appendChild(dragBar);

        // Toggle menu content button
        const toggleBtn = document.createElement('button');
        toggleBtn.textContent = 'Hide';
        styleButton(toggleBtn);
        toggleBtn.style.marginBottom = '8px';
        toggleBtn.onclick = () => {
            if (wrapper.style.display !== 'none') {
                wrapper.style.display = 'none';
                toggleBtn.textContent = 'Show';
            } else {
                wrapper.style.display = 'block';
                toggleBtn.textContent = 'Hide';
            }
        };
        menu.appendChild(toggleBtn);

        // Content wrapper
        const wrapper = document.createElement('div');
        menu.appendChild(wrapper);

        const video = () => document.querySelector('video');

        // Helper to create styled buttons
        function styleButton(btn) {
            Object.assign(btn.style, {
                width: '100%',
                margin: '5px 0',
                padding: '6px',
                border: 'none',
                borderRadius: '7px',
                background: '#1a1a1a',
                color: '#ff4d4d',              // soft red text
                fontWeight: '600',
                cursor: 'pointer',
                boxShadow: '0 2px 6px rgba(255, 0, 0, 0.3)',
                transition: 'background-color 0.25s ease',
                fontSize: '12px',
                userSelect: 'none',
            });
            btn.onmouseenter = () => (btn.style.background = '#330000');
            btn.onmouseleave = () => (btn.style.background = '#1a1a1a');
        }

        // Add a button helper
        function addBtn(text, action) {
            const btn = document.createElement('button');
            btn.textContent = text;
            styleButton(btn);
            btn.onclick = action;
            wrapper.appendChild(btn);
        }

        // Playback Controls
        addBtn('▶️ +10s', () => video() && (video().currentTime += 10));
        addBtn('⏪ -10s', () => video() && (video().currentTime -= 10));
        addBtn('⏩ 2x Speed', () => video() && (video().playbackRate = 2));
        addBtn('🐢 0.5x Speed', () => video() && (video().playbackRate = 0.5));
        addBtn('⏸ 1x Speed', () => video() && (video().playbackRate = 1));
        addBtn('🔁 Loop', () => {
            if (!video()) return;
            video().loop = !video().loop;
            alert('Loop: ' + (video().loop ? 'ON' : 'OFF'));
        });

        // Volume Controls
        addBtn('🔊 Volume +10%', () => video() && (video().volume = Math.min(1, video().volume + 0.1)));
        addBtn('🔉 Volume -10%', () => video() && (video().volume = Math.max(0, video().volume - 0.1)));
        addBtn('🔇 Mute/Unmute', () => video() && (video().muted = !video().muted));

        // Display / UI Controls
        addBtn('🎞️ Theater Mode', () => document.querySelector('.ytp-size-button')?.click());
        addBtn('📺 Captions', () => document.querySelector('.ytp-subtitles-button')?.click());
        addBtn('🔁 Autoplay Toggle', () => document.querySelector('ytd-toggle-button-renderer')?.click());
        addBtn('🔳 Mini Player', () => document.querySelector('.ytp-miniplayer-button')?.click());

        // Dark Mode toggle
        addBtn('🌙 Toggle Dark Mode', () => {
            document.documentElement.classList.add('dark');
            document.documentElement.classList.remove('light');
        });

        // Light Mode toggle
        addBtn('🌞 Toggle Light Mode', () => {
            document.documentElement.classList.add('light');
            document.documentElement.classList.remove('dark');
        });

        // Clear UI toggle
        let hidden = false;
        addBtn('🧹 Toggle Sidebar', () => {
            ['#secondary', '#comments', '#related'].forEach(sel => {
                const el = document.querySelector(sel);
                if (el) el.style.display = hidden ? '' : 'none';
            });
            hidden = !hidden;
        });

        // Game Mode toggle
        let gameMode = false;
        addBtn('🎮 Game Mode', () => {
            const html = document.documentElement;
            const vid = video();
            if (!vid) return;
            if (!gameMode) {
                html.style.overflow = 'hidden';
                document.querySelector('ytd-app').style.display = 'none';
                Object.assign(vid.style, {
                    position: 'fixed', top: 0, left: 0, width: '100vw', height: '100vh', zIndex: 99999,
                });
            } else {
                html.style.overflow = '';
                document.querySelector('ytd-app').style.display = '';
                Object.assign(vid.style, {
                    position: '', width: '', height: '', top: '', left: '', zIndex: '',
                });
            }
            gameMode = !gameMode;
        });

        // Popout Window
        addBtn('🪟 Popout Window', () => {
            window.open(window.location.href, '_blank', 'width=900,height=600');
        });

        // Reload Page
        addBtn('🔄 Reload', () => location.reload());

        // Download Video (opens third-party downloader)
        addBtn('📥 Download Video', () => {
            const videoUrl = window.location.href;
            const downloadService = 'https://yt1s.com/en15/youtube-to-mp4';
            const url = `${downloadService}?q=${encodeURIComponent(videoUrl)}`;
            window.open(url, '_blank');
        });

        document.body.appendChild(menu);
    }

    function waitForVideo() {
        if (document.querySelector('video')) {
            createMenu();
        } else {
            setTimeout(waitForVideo, 1000);
        }
    }

    waitForVideo();
})();