Greasy Fork

来自缓存

Greasy Fork is available in English.

视频分辨率检测显示器

实时显示视频分辨率,支持快捷键和右键菜单控制

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         视频分辨率检测显示器
// @namespace    http://tampermonkey.net/
// @version      1.1.1
// @description  实时显示视频分辨率,支持快捷键和右键菜单控制
// @author       Deepseek AI生成
// @license      GPL-3.0
// @homepage     http://greasyfork.icu/zh-CN/scripts/530701
// @match        *://*/*
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

    // 配置存储
    let config = {
        visible: true,
        hotkey: ';'
    };

    // 初始化元素
    const display = createDisplay();
    let settingsPanel = null;
    let menuCommandId = null;

    // 加载存储配置
    function loadConfig() {
        const savedConfig = GM_getValue('config');
        if (savedConfig) {
            config = {...config, ...savedConfig};
        }
        updateDisplayVisibility();
    }

    // 创建显示控件
    function createDisplay() {
        const div = document.createElement('div');
        div.id = 'video-res-display';
        GM_addStyle(`
            #video-res-display {
                position: fixed;
                background: rgba(0,0,0,0.7) !important;
                color: #fff !important;
                padding: 8px 12px !important;
                border-radius: 4px !important;
                font-family: Arial !important;
                z-index: 99999 !important;
                transition: all 0.3s !important;
                pointer-events: none !important;
            }
        `);
        document.body.appendChild(div);
        return div;
    }

    // 视频检测逻辑
    function initVideoObserver() {
        const observer = new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                mutation.addedNodes.forEach(node => {
                    if (node.tagName === 'VIDEO' || node.querySelector('video')) {
                        bindVideoEvents(node.querySelector('video') || node);
                    }
                });
            });
        });

        observer.observe(document, {
            subtree: true,
            childList: true
        });

        // 初始绑定
        document.querySelectorAll('video').forEach(video => {
            bindVideoEvents(video);
        });
    }

    // 绑定视频事件
    function bindVideoEvents(video) {
        video.addEventListener('timeupdate', updateResolution);
        video.addEventListener('resize', updateResolution);
    }

    // 更新分辨率显示
    function updateResolution(e) {
        const video = e.target;
        if (!video) return;

        const rect = video.getBoundingClientRect();
        display.textContent = `${video.videoWidth}x${video.videoHeight}`;

        // 动态定位
        display.style.left = `${rect.right - 150}px`;
        display.style.top = `${rect.bottom - 50}px`;
    }

    // 显隐控制
    function toggleDisplay() {
        config.visible = !config.visible;
        GM_setValue('config', config);
        updateDisplayVisibility();
        updateMenuCommand();
    }

    function updateDisplayVisibility() {
        display.style.display = config.visible ? 'block' : 'none';
    }

    // 快捷键处理
    function handleHotkey(e) {
        const expectedKeys = config.hotkey.toLowerCase().split('+');
        let match = true;

        expectedKeys.forEach(key => {
            key = key.trim();
            if (key === 'ctrl' && !e.ctrlKey) match = false;
            else if (key === 'alt' && !e.altKey) match = false;
            else if (key === 'shift' && !e.shiftKey) match = false;
            else if (key.length === 1 && e.key.toLowerCase() !== key) match = false;
        });

        if (match) toggleDisplay();
    }

    // 右键菜单
    function updateMenuCommand() {
        if (menuCommandId) GM_unregisterMenuCommand(menuCommandId);
        menuCommandId = GM_registerMenuCommand(
            config.visible ? '隐藏分辨率窗口' : '显示分辨率窗口',
            toggleDisplay
        );
    }

    // 设置面板
    function createSettingsPanel() {
        if (settingsPanel) return;

        // 添加样式保护
        GM_addStyle(`
            .video-res-settings-panel {
                position: fixed !important;
                top: 20px !important;
                right: 20px !important;
                background: #fff !important;
                padding: 20px !important;
                box-shadow: 0 0 10px rgba(0,0,0,0.2) !important;
                z-index: 1000000 !important;
                border-radius: 8px !important;
                font-family: Arial, sans-serif !important;
                color: #333 !important;
            }
            .video-res-settings-panel h3 {
                margin: 0 0 15px 0 !important;
                font-size: 16px !important;
                color: #222 !important;
            }
            .video-res-settings-panel label {
                display: flex !important;
                align-items: center !important;
                margin-bottom: 15px !important;
            }
            .video-res-settings-panel input {
                margin-left: 10px !important;
                padding: 5px !important;
                border: 1px solid #ddd !important;
                border-radius: 4px !important;
                background: #fff !important;
                color: #333 !important;
            }
            .video-res-settings-panel button {
                padding: 6px 12px !important;
                border: none !important;
                border-radius: 4px !important;
                background: #007bff !important;
                color: white !important;
                cursor: pointer !important;
                margin-left: 10px !important;
            }
            .video-res-settings-panel button:hover {
                background: #0056b3 !important;
            }
        `);

        settingsPanel = document.createElement('div');
        settingsPanel.className = 'video-res-settings-panel';
        settingsPanel.innerHTML = `
            <h3>分辨率显示设置</h3>
            <label>
                快捷键:
                <input type="text" id="hotkeyInput" value="${config.hotkey}">
            </label>
            <button id="saveBtn">保存</button>
            <button id="closeBtn">关闭</button>
        `;

        settingsPanel.querySelector('#saveBtn').addEventListener('click', () => {
            config.hotkey = settingsPanel.querySelector('#hotkeyInput').value.trim();
            GM_setValue('config', config);
            settingsPanel.remove();
            settingsPanel = null;
        });

        settingsPanel.querySelector('#closeBtn').addEventListener('click', () => {
            settingsPanel.remove();
            settingsPanel = null;
        });

        document.body.appendChild(settingsPanel);
    }

    // 初始化
    loadConfig();
    initVideoObserver();
    document.addEventListener('keydown', handleHotkey);
    GM_registerMenuCommand('打开设置面板', createSettingsPanel);
    updateMenuCommand();

    // 全屏适配
    document.addEventListener('fullscreenchange', () => {
        const video = document.querySelector('video');
        if (video && document.fullscreenElement === video) {
            display.style.fontSize = '24px';
        } else {
            display.style.fontSize = '14px';
        }
    });
})();