teacher wang

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
        }
    });
})();