学习通 防暂停 | 防熄屏 | 自动播放 | 自动静音

南京信息工程大学学习通防暂停、自动播放、自动静音

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