视频定时暂停(支持B站和Youtube)

用户可动态设定B站或YouTube视频的停止时间(分钟和秒),自动暂停视频,只暂停一次

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         视频定时暂停(支持B站和Youtube)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  用户可动态设定B站或YouTube视频的停止时间(分钟和秒),自动暂停视频,只暂停一次
// @author       OldHunter
// @match        https://www.bilibili.com/video/*
// @match        https://www.youtube.com/watch*
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 检测当前网站是B站还是YouTube,返回对应的视频元素
    function getVideoElement() {
        if (window.location.host.includes('bilibili.com')) {
            return document.querySelector('video');
        } else if (window.location.host.includes('youtube.com')) {
            return document.querySelector('video');
        }
        return null;
    }

    // 创建用户输入的分钟和秒数输入框
    function createInput(labelText) {
        const label = document.createElement("label");
        label.innerText = labelText;
        const input = document.createElement("input");
        input.type = "number";
        input.style.marginRight = "10px";
        label.appendChild(input);
        return { label, input };
    }

    // 弹出自定义输入框,让用户输入分钟和秒
    function getUserTimeInput(callback) {
        const dialog = document.createElement("div");
        dialog.style.position = "fixed";
        dialog.style.top = "50%";
        dialog.style.left = "50%";
        dialog.style.transform = "translate(-50%, -50%)";
        dialog.style.padding = "20px";
        dialog.style.backgroundColor = "white";
        dialog.style.border = "1px solid black";
        dialog.style.zIndex = "9999";

        // 创建两个输入框:分钟和秒
        const minutesInput = createInput("请输入分钟:");
        const secondsInput = createInput("请输入秒:");

        // 创建确认按钮
        const submitButton = document.createElement("button");
        submitButton.innerText = "确定";
        submitButton.onclick = function() {
            const minutes = parseInt(minutesInput.input.value, 10) || 0;
            const seconds = parseInt(secondsInput.input.value, 10) || 0;
            const totalTime = (minutes * 60) + seconds;
            document.body.removeChild(dialog);  // 移除对话框
            callback(totalTime);  // 返回用户输入的总秒数
        };

        // 将输入框和按钮加入到对话框中
        dialog.appendChild(minutesInput.label);
        dialog.appendChild(secondsInput.label);
        dialog.appendChild(submitButton);
        document.body.appendChild(dialog);
    }

    // 检查视频是否加载完毕
    function checkVideoReady() {
        const video = getVideoElement();
        if (video && video.readyState >= 3) { // readyState 3表示可以开始播放

            // 弹出用户输入框,获取停止时间
            getUserTimeInput(function(stopTime) {
                let pausedOnce = false;  // 记录是否已经暂停过

                if (stopTime > 0) {
                    // 监听视频播放进度,只暂停一次
                    video.addEventListener('timeupdate', function() {
                        if (!pausedOnce && video.currentTime >= stopTime) {
                            video.pause();
                            pausedOnce = true;  // 标记为已经暂停
                            alert(`视频已播放到设定的${Math.floor(stopTime / 60)}分${stopTime % 60}秒,自动暂停。`);
                        }
                    });
                }
            });

        } else {
            // 如果视频还未加载,继续检查
            setTimeout(checkVideoReady, 500);
        }
    }

    // 初始化脚本
    checkVideoReady();
})();