[25-04-15] 青书学堂自动看课

检测网页视频自动播放并设置0.5倍速,播放完毕后自动下一节课.有问题提Issue,时不时看到会修

// ==UserScript==
// @name         [25-04-15] 青书学堂自动看课
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  检测网页视频自动播放并设置0.5倍速,播放完毕后自动下一节课.有问题提Issue,时不时看到会修
// @author       Hu5
// @run-at       document-start
// @no_frames    true
// @match        *://*.qingshuxuetang.com/*
// ==/UserScript==

(function() {
    'use strict';
    async function main() {
        console.log(`开始看课`)
        // 获取所有课程ID
        const kcjsIds = (function() {
            const allElements = document.querySelectorAll('*');

            const matchingIds = [];

            for (let i = 0; i < allElements.length; i++) {
                const element = allElements[i];
                if (element.id && element.id.startsWith("courseware-kcjs_")) {
                    matchingIds.push(element.id.replace("courseware-", ""));
                }
            }

            return matchingIds;
        }
                        )()

        const observer = new MutationObserver(async (mutationsList, observer) => {
            for (const mutation of mutationsList) {
                if (mutation.type === 'childList') {
                    let videoElm = mutation.target.querySelector('video')
                    if (videoElm) {
                        videoElm.autoplay=true

                        // 慢倍速播放凑时长
                        videoElm.playbackRate = 0.5;
                        // 静音
                        videoElm.muted = "muted";
                        // 开始播放
                        videoElm.play();
                        uploadStudyRecordBegin(nodeId)
                        // 看完自动下一课
                        videoElm.onended = () => {
                            // 解析当前的课程ID
                            const nodeId = (new URL(document.URL)).searchParams.get("nodeId")
                            // 下一节课的ID
                            const nextNodeId = kcjsIds[kcjsIds.indexOf(nodeId) + 1]

                            // 如果还有下一节课,继续看
                            if (nextNodeId) {
                                // 下一节课
                                CoursewareNodesManager.onMenuClick(nextNodeId)
                            } else {
                                // 没有就是看完了,不再继续
                                console.log('看完了,不再继续');
                            }
                        }

                        // 找到关闭监视
                        return observer.disconnect()
                    }
                }
            }
        }
                                             )
        observer.observe(document.querySelector("#playerContainer"), {
            childList: true,
            subtree: true
        });


    }

    window.onload = main;
}
)();