teacher wang

添加视频倍速控制和跳过功能,同时自动播放视频并切换到下一集

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         teacher wang
// @namespace    http://study.swiftnb.com/lms/web/course/index/
// @version      0.4
// @description  添加视频倍速控制和跳过功能,同时自动播放视频并切换到下一集
// @author       teacher wang
// @match        http://study.swiftnb.com/lms/web/course/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 等待页面加载完成
    window.addEventListener('load', function() {
        // 创建倍速选择器和跳过输入框
        const speedControlDiv = document.createElement('div');
        speedControlDiv.style.position = 'fixed';
        speedControlDiv.style.top = '300px'; // 固定在页面中的位置
        speedControlDiv.style.left = '10px'; // 调整左侧位置
        speedControlDiv.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';
        speedControlDiv.style.padding = '10px';
        speedControlDiv.style.borderRadius = '5px';
        speedControlDiv.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.5)';
        speedControlDiv.style.zIndex = '9999'; // 设置较高的 z-index
        speedControlDiv.innerHTML = `
            <label for="speedControl">倍速:</label>
            <select id="speedControl">
                <option value="1">1X</option>
                <option value="1.5">1.5X</option>
                <option value="2">2X</option>
                <option value="2.5">2.5X</option>
                <option value="3">3X</option>
            </select>
            <br><br>
            <label for="skipInput">跳过秒数:</label>
            <input type="number" id="skipInput" placeholder="输入秒数" min="0" style="width: 80px;">
            <button id="skipButton">跳过</button>
            <br><span style="color: red;">因后台检测机制 不建议使用倍速播放!!!</span>
        `;

        document.body.appendChild(speedControlDiv);

        // 获取所有视频元素并静音
        const videos = document.querySelectorAll('video');
        videos.forEach(video => {
            video.muted = true; // 将视频静音
        });

        // 检查是否存在视频元素
        if (videos.length === 0) {
            console.error("没有找到视频元素。");
            return;
        }

        // 设置默认播放速度
        videos.forEach(video => {
            video.playbackRate = 1; // 默认速度为1X
        });

        // 处理倍速选择变化
        const speedControl = document.getElementById('speedControl');
        speedControl.addEventListener('change', function() {
            const selectedSpeed = parseFloat(this.value);
            videos.forEach(video => {
                video.playbackRate = selectedSpeed; // 设置播放速度
            });
        });

        // 处理跳过按钮点击事件
        const skipButton = document.getElementById('skipButton');
        skipButton.addEventListener('click', function() {
            const skipTime = parseFloat(document.getElementById('skipInput').value);
            if (!isNaN(skipTime) && skipTime >= 0) {
                videos.forEach(video => {
                    video.currentTime += skipTime; // 跳过指定秒数
                });
            } else {
                alert("请输入有效的秒数。");
            }
        });

        // 获取进度条
        const playProgress = document.querySelector('.vjs-play-progress');
        if (playProgress) {
            // 监听进度条宽度变化
            const observer = new MutationObserver(function(mutations) {
                mutations.forEach(function(mutation) {
                    // 获取进度条宽度
                    const progressWidth = parseFloat(playProgress.style.width.replace('%', ''));
                    if (progressWidth >= 98) {
                        // 点击下一讲按钮
                        const nextLessonLink = document.querySelector('a[href*="itemid"]');
                        if (nextLessonLink) {
                            nextLessonLink.click();
                        }
                    }
                });
            });

            const config = { attributes: true, attributeFilter: ['style'] };
            observer.observe(playProgress, config);
        }
    });
})();