南京信息工程大学学习通防暂停、自动播放、自动静音
// ==UserScript== // @name 学习通 防暂停 | 防熄屏 | 自动播放 | 自动静音 // @namespace http://tampermonkey.net/ // @version 20241209-3fd8e5e3 // @description 南京信息工程大学学习通防暂停、自动播放、自动静音 // @author HowardZhangdqs // @match https://*.chaoxing.com/mycourse/studentstudy* // @icon https://www.chaoxing.com/images/favicon.ico // @grant none // @license WTFPL // ==/UserScript== // 20241209 // + fix: 多视频播放时关闭自动播放 // // 20241206 // + feat: 阻止系统熄屏 (() => { "use strict"; const check_sleep_latency = 1000; const check_stop_latency = 5000; const config = { check_sleep_latency, check_stop_latency, }; const unbounded = () => { let interval_id; let running = false; const closure = { start: async () => { running = true; let video = null; interval_id = setInterval(() => { const iframeDocument = document.getElementsByTagName("iframe")[0].contentWindow?.document; const iframes = iframeDocument?.getElementsByTagName("iframe"); if (!iframes || iframes.length !== 1) { return; } const innerIframeDocument = iframes[0].contentWindow?.document; video = innerIframeDocument?.querySelector("#video_html5_api"); const errDoms = innerIframeDocument?.querySelectorAll( ".ans-vjserrdisplay-title", ).length; if (errDoms) { location.reload(); } if (video) { video.play(); video.muted = true; } }, config.check_sleep_latency); }, stop: () => { running = false; if (interval_id) { clearInterval(interval_id); } }, get running() { return running; }, }; return closure; }; const weblock = () => { let interval_id; let running = false; let waken = false; const closure = { start: async () => { running = true; interval_id = setInterval(async () => { if (waken) { return; } if ("wakeLock" in navigator) { try { const wakeLock = await navigator.wakeLock.request("screen"); console.log( `Wake Lock ${wakeLock.released ? "未激活" : "已激活"}`, ); waken = true; } catch (err) { console.error(`${err.name}, ${err.message}`); } try { const wakeLock = await navigator.wakeLock.request("screen"); wakeLock.addEventListener("release", () => { console.log("Wake Lock 已释放"); waken = false; }); } catch (err) { console.error(`${err.name}, ${err.message}`); } } }, config.check_sleep_latency); }, stop: () => { running = false; if (interval_id) { clearInterval(interval_id); } }, get running() { return running; }, }; return closure; }; const ub = unbounded(); const wb = weblock(); ub.start(); wb.start(); })();