智慧树半自动刷课(动态标题和一次性通知)

根据 XPath 设置标签页标题和一次性通知

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         智慧树半自动刷课(动态标题和一次性通知)
// @version      0.9.2
// @description  根据 XPath 设置标签页标题和一次性通知
// @match        *://hike.zhihuishu.com/aidedteaching/sourceLearning/*
// @grant        GM_notification
// @grant        unsafeWindow
// @license      MIT
// @namespace https://greasyfork.org/users/718156
// ==/UserScript==

(function () {
    'use strict';

    const $ = unsafeWindow.jQuery;
    const emojiAlert = "❗"; // 彩色emoji 感叹号
    let notified = false; // 标记是否已通知

    // 延迟 2 秒后获取 XPath 路径中的标题内容
    setTimeout(() => {
        const titleNode = document.evaluate('//*[@id="sourceTit"]/span', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        const videoTitle = titleNode ? titleNode.textContent.trim() : "刷课视频";

        // 设置标签页标题
        document.title = videoTitle;

        console.log("标签页标题设置为:", document.title);

        // 初始化播放设置
        $(".volumeIcon").click();           // 静音
        $(".speedTab15").click();           // 1.5倍速播放
        $(".bigPlayButton.pointer").click(); // 开始播放
        $(".line1bq").click();              // 播放课程视频

        // 定时检测播放状态
        setInterval(() => {
            const activeItem = $("div.file-item.active");

            // 若 icon-finish 不存在时,打印 activeItem 内文本并追加到标签页标题
            if (activeItem.find("i.icon-finish").length < 0) {
                const activeText = activeItem.text().trim();
                console.log("当前标签页内所有文本内容:", activeText);

                // 更新标签页标题
                document.title = `${videoTitle} - ${activeText}`;
            }

            // 检查视频是否完成
            if (!notified && activeItem.find("i.icon-finish").length > 0) {
                notified = true; // 设置为已通知

                // 视频播放完毕时发送一次性通知
                GM_notification({
                    title: videoTitle,
                    text: "视频播放结束,请手动切换到下一个视频",
                    timeout: 5000,
                    onclick: () => window.focus()  // 点击通知时聚焦当前标签页
                });

                // 修改标签页标题为已完成状态
                document.title = `${emojiAlert}已刷完${emojiAlert} ${videoTitle}`;
            }

            // 若播放按钮显示为“可点击”,则点击继续播放
            if ($(".bigPlayButton.pointer").css("display") === "block") {
                $(".bigPlayButton.pointer").click();
            }
        }, 2000);
    }, 2000);
})();