teacher wang

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

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==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);
        }
    });
})();