Greasy Fork

Greasy Fork is available in English.

Video Player Control Tool 视频播放控制工具 - 改

视频播放全屏锁屏防误触,同时提供视频控制(快进,暂停,后退)

// ==UserScript==
// @name         Video Player Control Tool 视频播放控制工具 - 改
// @namespace    http://tampermonkey.net/
// @version      2.2kai
// @description  视频播放全屏锁屏防误触,同时提供视频控制(快进,暂停,后退)
// @author       Hui Fei 会飞 / Sndream
// @match        *://*.bilibili.com/*
// @exclude-match *://manga.bilibili.com/*
// @match        *://*.youku.com/*
// @match        *://*.iqiyi.com/*
// @match        *://*.iq.com/*
// @match        *://v.qq.com/*
// @match        *://*.tudou.com/*
// @match        *://*.youtube.com/*
// @grant        none
// @license      MIT License
// ==/UserScript==

(function() {
    'use strict';

    // // Bilibili AVI switch
    // const switchToAV1 = () => {
    //     const radioInputs = document.querySelectorAll('input[type="radio"][name="bui-radio3"]');
    //     for (const radioInput of radioInputs) {
    //         if (radioInput.value === '3') {
    //             radioInput.click();
    //             break;
    //         }
    //     }
    // };
    // const observer = new MutationObserver(switchToAV1);
    // observer.observe(document.body, { childList: true, subtree: true });

    const lockButtonHideDelay = 3000; // 3 seconds delay for button hide
    let hideButtonTimeout;
    let isLocked = false;
    let fullscreenElement = null;
    let video = null;

    // Create the key-shaped lock element
    const lockButton = createButton('🔓︎', 0);
    lockButton.id = 'lockButton';
    lockButton.style.right = '180px';
    lockButton.style.cursor = 'pointer';
    lockButton.style.zIndex = '99999';
    lockButton.style.display = 'none'; // Initially hidden
    setLockButtonIcon(0);
    document.body.appendChild(lockButton);

    // Create control buttons
    const fastForwardButton = createButton('⏩︎', 39); // Right Arrow key
    fastForwardButton.style.right = '240px';
    fastForwardButton.style.display = 'none'; // Initially hidden
    document.body.appendChild(fastForwardButton);

    const playPauseButton = createButton('⏯︎', 32); // Space key
    playPauseButton.style.right = '300px';
    playPauseButton.style.display = 'none'; // Initially hidden
    document.body.appendChild(playPauseButton);

    const rewindButton = createButton('⏪︎', 37); // Left Arrow key
    rewindButton.style.right = '360px';
    rewindButton.style.display = 'none'; // Initially hidden
    document.body.appendChild(rewindButton);

    function triggerKeyEvent(element, keyCode, eventType) {
        const event = new KeyboardEvent(eventType, {
            bubbles: true,
            cancelable: true,
            keyCode: keyCode
        });
        element.dispatchEvent(event);
    }

    function createButton(label, keyCode) {
        const button = document.createElement('button');
        button.textContent = label;
        button.style.position = 'fixed';
        button.style.zIndex = 9999;
        button.style.backgroundColor = 'rgba(255, 255, 255, 0)';
        button.style.color = 'rgba(255, 255, 255, 0.7)';
        button.style.border = '0px';
        button.style.padding = '0px';
        button.style.borderRadius = '0px';
        button.style.width = '60px';
        button.style.height = '36px';
        button.style.top = '4px';
        button.style.fontSize = '30px';
        button.style.fontFamily = 'monospace';
        if (keyCode > 0) {
            button.addEventListener('mousedown', () => triggerKeyEvent(video, keyCode, 'keydown'));
            button.addEventListener('mouseup', () => triggerKeyEvent(video, keyCode, 'keyup'));
            // for touchscreen device
            button.addEventListener('touchstart', (event) => {
                event.preventDefault();
                triggerKeyEvent(video, keyCode, 'keydown');
            });

            button.addEventListener('touchend', (event) => {
                event.preventDefault();
                triggerKeyEvent(video, keyCode, 'keyup');
            });
        }
        return button;
    }

    // Lock Screen Button Click Event
    lockButton.addEventListener('click', function(event) {
        if (isLocked) {
            isLocked = false;
            setLockButtonIcon(0);
            document.body.style.pointerEvents = 'auto'; // Enable click events for the page.
            fastForwardButton.style.pointerEvents = 'auto';
            playPauseButton.style.pointerEvents = 'auto';
            rewindButton.style.pointerEvents = 'auto';
            hidePlayButton()
        } else {
            isLocked = true;
            setLockButtonIcon(1);
            document.body.style.pointerEvents = 'none'; // Disable click events for the entire page.
            lockButton.style.pointerEvents = 'auto'; // Enable click events for the key.
            fastForwardButton.style.pointerEvents = 'auto';
            playPauseButton.style.pointerEvents = 'auto';
            rewindButton.style.pointerEvents = 'auto';
            showPlayButton()
        }
    });

    function setLockButtonIcon(locked) {
        if (locked == 0) {
            lockButton.style.color = 'gray'; // Unlocked state.
            lockButton.textContent = '🔓︎';
        } else {
            lockButton.style.color = 'rgba(255, 255, 255, 0.7)'; // Locked State
            lockButton.textContent = '🔒︎';
        }
    }

    function hidePlayButton() {
        fastForwardButton.style.display = 'none';
        playPauseButton.style.display = 'none';
        rewindButton.style.display = 'none';
    }
    function hideLockButton() {
        lockButton.style.display = 'none';
    }
    function hideAllButton() {
        hideLockButton();
        hidePlayButton();
    }


    function showPlayButton() {
        fastForwardButton.style.display = 'block';
        playPauseButton.style.display = 'block';
        rewindButton.style.display = 'block';
    }

    function showLockButton() {
        lockButton.style.display = 'block';
    }
    function showAllButton() {
        showLockButton();
        showPlayButton();
    }

    function resetHideButtonTimer() {
        clearTimeout(hideButtonTimeout);
        hideButtonTimeout = setTimeout(hideAllButton, lockButtonHideDelay);
    }

    // Fullscreen change event
    document.addEventListener('fullscreenchange', function(event) {
        fullscreenElement = document.fullscreenElement;
        video = document.querySelector('video');
        if (fullscreenElement) {
            fullscreenElement.appendChild(lockButton);
            fullscreenElement.appendChild(fastForwardButton);
            fullscreenElement.appendChild(playPauseButton);
            fullscreenElement.appendChild(rewindButton);
            showLockButton();
            resetHideButtonTimer();
        } else {
            document.body.appendChild(lockButton);
            document.body.appendChild(fastForwardButton);
            document.body.appendChild(playPauseButton);
            document.body.appendChild(rewindButton);
            hideAllButton();
            clearTimeout(hideButtonTimeout);

            if (isLocked) {
                isLocked = false;
                setLockButtonIcon(0);
                document.body.style.pointerEvents = 'auto';
            }
        }
    });

    // Mouse move event
    document.addEventListener('mousemove', function() {
        if (fullscreenElement) {
            if (isLocked) {
                showAllButton();
            } else {
                showLockButton();
            }
            resetHideButtonTimer();
        }
    });

    // Touch start event (for touchscreen devices)
    document.addEventListener('touchstart', function() {
        if (fullscreenElement) {
            if (isLocked) {
                showAllButton();
            } else {
                showLockButton();
            }
            resetHideButtonTimer();
        }
    });

    // Block Context Menu (Right click)
    document.addEventListener('contextmenu', function(e) {
        if (fullscreenElement) {
            if (isLocked) {
                e.preventDefault();
                return false;
            }
        }
    });
})();