更新脚本版本号,增加文本课件学习进度通知功能,优化视频播放状态心跳提示

This commit is contained in:
竟康 2026-06-03 15:29:59 +08:00
parent 5404d5fc7c
commit 4f0302bc07
1 changed files with 53 additions and 5 deletions

View File

@ -1,7 +1,7 @@
// ==UserScript==
// @name 平顶山学院(青书学堂)自动学习脚本
// @namespace http://tampermonkey.net/
// @version 2026-06-03.1
// @version 2026-06-03.2
// @description try to take over the world!
// @author You
// @match https://degree.qingshuxuetang.com/pdsu/Student/Course/CourseStudy*
@ -22,6 +22,7 @@
const TOAST_CONTAINER_ID = "qingshu-auto-toast-container";
const TOAST_STYLE_ID = "qingshu-auto-toast-style";
const TOAST_DEFAULT_DURATION = 4000;
const HEARTBEAT_SECONDS = 10;
// 创建右下角 toast 容器和样式。
// 每次通知都会创建一个新的 toast所以多个通知会一起堆叠显示。
@ -200,6 +201,18 @@
document.querySelector(TEXT_SELECTOR)
);
// 把秒数格式化成“x分x秒”用于心跳提示。
const formatSeconds = (seconds) => {
if (!Number.isFinite(seconds) || seconds < 0) {
return "未知";
}
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
return minutes + "分" + remainingSeconds + "秒";
};
const onPageLoad = async () => {
notify("页面加载完成,开始执行脚本", "info");
@ -244,15 +257,39 @@
// 文本课件没有 video 标签,不需要播放;停留 5 分钟后返回列表页。
if (coursewareElement.matches(TEXT_SELECTOR)) {
notify("检测到文本课件等待5分钟后返回准备页面", "warning", 6000);
setTimeout(() => {
const textStartedAt = Date.now();
let textInterval;
const notifyTextProgress = () => {
const studiedSeconds = Math.floor((Date.now() - textStartedAt) / 1000);
if (studiedSeconds >= MIN_STUDY_SECONDS) {
clearInterval(textInterval);
notify("文本课件等待完成,返回准备页面", "success");
returnToStudyPage();
}, MIN_STUDY_SECONDS * 1000);
return;
}
notify(
"文本课件学习中,已等待:" +
formatSeconds(studiedSeconds) +
",剩余:" +
formatSeconds(MIN_STUDY_SECONDS - studiedSeconds),
"info"
);
};
textInterval = setInterval(
notifyTextProgress,
HEARTBEAT_SECONDS * 1000
);
notifyTextProgress();
return;
}
// 视频课件需要周期性检查播放状态:启动播放、设置倍速、播完返回。
let videoMissingNotified = false;
let lastVideoHeartbeatAt = 0;
const videoInterval = setInterval(() => {
const video = document.querySelector(VIDEO_SELECTOR);
@ -283,6 +320,17 @@
video.playbackRate = 2;
}
if (Date.now() - lastVideoHeartbeatAt >= HEARTBEAT_SECONDS * 1000) {
lastVideoHeartbeatAt = Date.now();
notify(
"视频正在播放,当前:" +
formatSeconds(Math.floor(video.currentTime)) +
" / 总时长:" +
formatSeconds(Math.floor(video.duration || 0)),
"info"
);
}
console.log("视频正在播放,当前时间:" + video.currentTime);
}, 3000);
}