Greasy Fork 支持简体中文。

EduCity

Optimize the website of educity.cn.

// ==UserScript==
// @name               EduCity
// @name:zh-CN         希赛
// @description        Optimize the website of educity.cn.
// @description:zh-CN  希赛页面优化
// @namespace          https://github.com/HaleShaw
// @version            1.4.8
// @author             HaleShaw
// @copyright          2021+, HaleShaw (https://github.com/HaleShaw)
// @license            AGPL-3.0-or-later
// @homepage           https://github.com/HaleShaw/TM-EduCity
// @supportURL         https://github.com/HaleShaw/TM-EduCity/issues
// @contributionURL    https://www.jianwudao.com/
// @icon               https://wangxiao.xisaiwang.com/favicon.ico
// @match              https://www.educity.cn/wangxiao2/*
// @match              http://www.educity.cn/wangxiao2/*
// @match              https://uc.educity.cn/personalCenter/studyCenter.html
// @match              https://uc.educity.cn/tiku/testReport.html*
// @match              https://uc.educity.cn/tiku/examinationMode.html*
// @match              https://uc.educity.cn/tiku/examinationModeCopy.html*
// @match              https://wangxiao.xisaiwang.com/*
// @compatible	       Chrome
// @grant              GM_addStyle
// @grant              GM_info
// ==/UserScript==

// ==OpenUserJS==
// @author             HaleShaw
// @collaborator       HaleShaw
// ==/OpenUserJS==

(function () {
  "use strict";

  const mainStyle = `
    /* 顶部菜单 */
    div.ecv2_header_tools > div.fl > ul > li:not(:first-child),
    div.ecv2_header_tools > div.fr > :not(:last-child),

    /* Footer */
    .ecv2_footer {
      display: none !important;
    }
  `;

  const zhiBoStyle = `
/* 左上角标题 */
#mainVid > div.vid_head > div.vid_hleft > a:not(:last-child),

/* 右上角“返回旧版、视频课程” */
#mainVid > div.vid_head > div.vid_hright > a,

/* 离线观看 */
#mainVid > div.vid_mid > div.vid_midL > div.vid_midL_top,

/* 右侧笔记、提问 */
#mainVid > div.vid_mid > div.vid_midR > div.vid_midR_tab > div > a:nth-child(2),
#mainVid > div.vid_mid > div.vid_midR > div.vid_midR_tab > div > a:nth-child(3),

/* 鼠标混入视频时的浮标按钮“新建笔记” */
.vid_bj_new,

/* 顶部横条 */
.vid_head {
	display: none !important;
}

.vid_head .vid_hright {
  padding-top: 0 !important;
}

.vid_mid .vid_midL {
  padding: 0 !important;
}

.vid_midR_tab,
.vid_midR_tab > a,
.vid_midR_tab > a > i,
.vid_midR_tab > .vid_midR_ul,
.vid_midR_tab > .vid_midR_ul > a,
.vid_midR_tab > .vid_midR_ul > a > i,
.tabhide .vid_midR{
	width: 28px !important;
}

.tabhide .vid_mid {
  padding-right: 28px;
}
.vid_mid {
	padding-right: 439px;
}

.vid_midR {
	width: 439px;
}

.vid_tab_content {
	padding-bottom: 0;
}

/* 进度条上的时间 */
.time-span {
  margin: 0 10px;
}

/* 视频播放窗口上的遮罩元素 */
#videoCoverTop {
	width: 100%;
	height: 17.4%;
	position: absolute;
	left: 0;
	top: 0;
  text-align: center;
  padding-top: 1.5rem;
  font-size: 1.75rem;
	z-index: 1;
	background-color: black;
}

#videoCoverBottom {
	position: absolute;
	width: 100%;
	height: 14%;
	background-color: black;
	z-index: 2;
	left: 0;
	bottom: 0;
  display: flex;
  align-items: flex-end;
  justify-content: right;
  padding-bottom: 63px;
}

#videoCoverLeft {
	position: absolute;
	width: 25.4%;
	height: 43%;
	background-color: white;
	z-index: 0;
	left: 0;
	bottom: 14%;
}

/* 视频播放窗口进度条上的时间 */
.pv-time-remaining-real.time-span,
.pv-time-over.time-span {
  color: yellow;
}
`;

  // 测试报告页面样式
  const reportStyle = `
  /* 顶部广告 */
  #accountSettingsHeader,

  /* 专家建议 */
  div.col-md-7.testportSty > p,
  div.col-md-7.testportSty > a,

  /* 笔记、提问 */
  div.doPane.note,
  div.doPane.question,

  /* 参考答案,你的答案 */
  .answerEnd,

  /* 选项前的radio */
  .answerContentList.mgt10 > .cbox,

  /* 查看解析,收藏*/
  #dataListWarp > div.dajx > div.pull-right.clearfix {
    display: none !important;
  }
  `;

  // 考试或练习页面
  const examStyle = `
/* 顶部图片Header */
#accountSettingsHeader,

/* 右上角二维码 */
div.zt_top_right,

/* 正确答案与错误答案选项 */
.analysisAnswer>div.bg-fff.box-shadow.mgt10:first-child,

/* 答案解析中的“笔记”和“提问” */
div.tknew.doPane.note,
div.tknew.doPane.question,

div.col-md-12>div>div.zt_top_right,
.lh2>span,
#accountSettingsHeader,
.center.answerCard,
.pull-right>span:not(:first-child),
.answerTitle {
  display: none !important;
}

/* 右侧题目编号列表 */
.dtklist.item {
  height: 500px;
}

/* 选项前的CheckBox */
div.answerContentList>span.cbox {
  display: inline-block !important;
}

/* 标题 */
.zt_top_zong {
  height: 50px;
  background: none !important;
}

.right-title {
  padding: 0px 20px !important;
  margin-bottom: 0px !important;
}

/* 进度条 */
.jindu_div {
  margin: 5px 0 !important;
}

.jindu_div .jindu_line {
  width: calc(100% - 200px);
}

.bp20 {
  padding: 5px !important;
}

.ISpan {
  margin-bottom: 2px !important;
  margin-right: 0 !important;
}

div.answerList.mgb20 {
  padding: 0 15px 0 25px !important;
  margin-bottom: 0px !important;
}

/* 题干 */
.subject-content {
  padding: 0px 30px !important;
  background: none !important;
  min-height: 320px !important;
}

.single-content {
  padding: 5px 10px !important;
}

.lh2 {
  margin-bottom: 5px !important;
}

.examTigan {
    max-height: 600px;
    overflow-y: auto;
    display: block;
}

.examTigan,
.examTigan > p,
.answerContentList > label {
  font-size: 2.2rem !important;
}

/* 选项列表 */
.answerContentList > label {
  color: #666;
}

/* 参考解析 */
div.analysisAnswer>div {
  padding-bottom: 0px !important;
}

.answerEnd {
  padding: 0 !important;
  margin-top: 0 !important;
}

.answerList {
  padding: 0 15px 5px 25px !important;
}

.shitiDesp.pdt15 {
  padding-top: 0 !important;
}

.jiexinew {
  padding: 10px 30px 0 30px !important;
}

#jiexispan>p {
  margin-bottom: 0 !important;
}

.countTime {
  padding: 0 !important;
}

#ztsetWrap>div.bg-fff.box-shadow {
  margin-bottom: 0 !important;
}

/* 顶部标题高度 */
.mgt10 {
  margin-top: 0px !important;
}

.lh2 {
  font-weight: bolder !important;
  color: #337ab7 !important;
  font-size: 1.125em !important;
}

.spanExplain {
  padding: 5px 20px !important;
}

.exBtn {
  margin-top: 5px !important;
}

.answerWrap {
  padding: 0px 30px !important;
}

.mgb20 {
  margin-bottom: 0px !important;
}

.singleR {
  font-size: 16px;
}
`;

  // 个人中心页面
  const personalStyle = `
  /* 班主任微信 */
  #baomingDiv > .kcgw_weixin,

  /* 用户ID,我的报名 */
  div.xpc_top_info > div.xpc_top_V2,

  /* 左侧边栏菜单栏 */
  div.xpc-menu-box > dl:last-child,
  div.xpc-menu-box > dl:nth-last-child(2):nth-child(odd),
  div.xpc-menu-box > dl:nth-child(2) > dd:last-child,

  /* 右侧悬浮工具 */
  .ecv2_right_tools {
    display: none !important;
  }

  #cHeadImg {
    height: 48px;
    width: 48px;
  }

  .xpc_top,
  .xpc_top .xpc_top_con,
  .xpc_top .xpc-top-message li a {
    height: 60px !important;
  }

  /* 播放列表 */
  .ecv2_live_taggleTitles {
    padding: 5px 20px 5px 20px !important;
  }
  .ecv2_live_taggleHide li {
    padding: 5px 0 5px 68px !important;
  }

  .xpc_zbmulu {
    padding: 0 20px !important;
  }

  /* 主窗口 */
  .xpc_main .xpc_main_con {
    padding: 0 !important;
  }
  `;

  const ANSWER_LIST = ["A", "B", "C", "D"];

  main();

  function main() {
    logInfo(GM_info.script.name, GM_info.script.version);
    GM_addStyle(mainStyle);

    let url = window.location.href;
    // 个人中心页面
    if (url.startsWith("https://wangxiao.xisaiwang.com/ucenter2/")) {
      GM_addStyle(personalStyle);
      setTimeout(() => {
        updatePlayButton();
      }, 1500);
    } else if (
      url.startsWith("https://www.educity.cn/wangxiao2") ||
      url.startsWith("http://www.educity.cn/wangxiao2") ||
      url.startsWith("https://wangxiao.xisaiwang.com/wangxiao2/")
    ) {
      // 直播回放调节播放速度
      setTimeout(() => {
        addCover();
        updateSpeed();
      }, 1500);
    } else if (url.startsWith("https://wangxiao.xisaiwang.com/tiku2/ctjx")) {
      // 独立的错题解析页面,添加键盘事件
      GM_addStyle(examStyle);
      addLeftRightKeyListener();
    } else if (url.startsWith("https://wangxiao.xisaiwang.com/tiku2/sectionReport")) {
      // 测试报告页面
      GM_addStyle(reportStyle);
      showWrongTopics();
    } else if (
      url.startsWith("https://uc.educity.cn/tiku/examinationModeCopy.html") ||
      url.startsWith("https://uc.educity.cn/tiku/examinationMode.html") ||
      url.startsWith("https://wangxiao.xisaiwang.com/tiku2/exam")
    ) {
      // 添加键盘监听事件,按键答题
      GM_addStyle(examStyle);
      addKeyListener();
    }
  }

  /**
   * 更新播放按钮事件
   * 将原有事件移除,在新页面打开播放页面。
   */
  function updatePlayButton() {
    let buttons = document.querySelectorAll(
      'div.detail-course-top > a.detail-course-btnC.buyProductDetail[data-type="Video"]'
    );
    for (let i = 0; i < buttons.length; i++) {
      buttons[i].removeAttribute("onclick");
      buttons[i].setAttribute("target", "_blank");
      const uri =
        "/wangxiao2/c" +
        $(buttons[i]).attr("data-cid") +
        "/sp" +
        $(buttons[i]).attr("data-id") +
        ".html";
      buttons[i].setAttribute("href", uri);
    }
  }

  function updateSpeed() {
    GM_addStyle(zhiBoStyle);

    addRemainingTime();
    updateVideoTitle();
    addRateButton();
    addRateListener();
    updateSideHeight();
    addPersonalCenter();
  }

  /**
   * 添加视频播放窗口上的遮罩元素
   */
  function addCover() {
    let parentEle = document.querySelector(".pv-video-wrap");
    let videoCoverTop = document.getElementById("videoCoverTop");
    let videoCoverBottom = document.getElementById("videoCoverBottom");
    let videoCoverLeft = document.getElementById("videoCoverLeft");
    let title = document.querySelector("a.log.pointer.video-player.act").textContent.trim();
    if (parentEle && !videoCoverTop && !videoCoverBottom && !videoCoverLeft) {
      parentEle.appendChild(
        $(
          `<div id="videoCoverTop">${title} &nbsp;&nbsp;&nbsp;&nbsp;剩余课时:${getRemainingClass()}</div>`
        )[0]
      );
      parentEle.appendChild(
        $(`<div id="videoCoverBottom"><span class="videoCoverBottom"></span></div>`)[0]
      );
      parentEle.appendChild($(`<div id="videoCoverLeft"></div>`)[0]);
    }
  }

  /**
   * 添加倍速按钮
   */
  function addRateButton() {
    if (!$(".pv-rate-select") || $(".pv-rate-select").length == 0) {
      return;
    }
    $(
      '<div data-rate="4">4x</div><div data-rate="3.5">3.5x</div><div data-rate="3">3x</div><div data-rate="2.5">2.5x</div>'
    ).insertBefore($(".pv-rate-select").children().eq(0));
  }

  // 获取当前倍速
  function getCurrentRate() {
    let rate = 1.0;
    let rateEle = document.querySelector("button.pv-rate-btn>span");
    if (!rateEle) {
      return rate;
    }
    rate = rateEle.textContent.replace("x", "");

    return rate;
  }

  /**
   * 添加控制播放速度的监听事件,仅用于更新显示当前速度,速度控制通过其他通用三方脚本实现。
   */
  function addRateListener() {
    let rateEle = document.querySelector("button.pv-rate-btn>span");

    document.onkeyup = function (e) {
      var theEvent = e || window.event;
      var code = theEvent.keyCode || theEvent.which || theEvent.charCode;
      if (code == 88) {
        // X,减速
        let rate = getCurrentRate();
        let newRate = (new Number(rate) - new Number(0.1)).toFixed(1);
        let rateStr = newRate + "x";
        rateEle.textContent = rateStr;
        updateRate(rateStr);
      }
      if (code == 67) {
        // C,加速
        let rate = getCurrentRate();
        let newRate = (new Number(rate) + new Number(0.1)).toFixed(1);
        let rateStr = newRate + "x";
        rateEle.textContent = rateStr;
        updateRate(rateStr);
      }
      if (code == 90) {
        // Z,恢复正常速度
        rateEle.textContent = "1x";
        updateRate("1x");
      }
    };
  }

  /**
   * 更新右侧边栏上的播放倍率
   * @param {String} rate 播放倍率
   */
  function updateRate(rate) {
    let rateEle = document.querySelector("span.rateRight");
    if (rateEle) {
      rateEle.textContent = rate;
    } else {
      document
        .querySelector(".vid_midR_tab")
        .appendChild($(`<span class="rateRight">${rate}</span>`)[0]);
    }
  }

  /**
   * 更新右侧侧边栏高度
   */
  function updateSideHeight() {
    let sideBar = document.querySelector(".vid_midR_tab");
    if (!sideBar) {
      return;
    }
    sideBar.style.height = sideBar.parentElement.previousElementSibling.offsetHeight + "px";
    document.querySelector(".vid_midR_wrap").style.height =
      sideBar.parentElement.previousElementSibling.offsetHeight + "px";
  }

  /**
   * 添加个人中心按钮
   */
  function addPersonalCenter() {
    $('<a href="/ucenter2/personal/index.html" target="_blank">个人中心</a>').insertBefore(
      $(".vid_midR_tab").children().eq(0)
    );
  }

  // 添加键盘监听事件,按键答题
  function addKeyListener() {
    document.onkeyup = function (e) {
      var theEvent = e || window.event;
      var code = theEvent.keyCode || theEvent.which || theEvent.charCode;
      // 	Spacebar. 查看答案解析
      if (code == 32 && document.getElementsByClassName("col-md-4 center bottomCenter bp20")[0]) {
        if (validatePause()) {
          return;
        }
        document.getElementsByClassName("col-md-4 center bottomCenter bp20")[0].click();
        if (document.getElementsByClassName("tknew doPane question")[0]) {
          try {
            onQestion();
          } catch (error) {
            console.error(error, "展开提问失败!");
          }
        }
        scrollToBottom();
      }
      // 	Q. 查看提问
      if (code == 81 && document.getElementsByClassName("tknew doPane question")[0]) {
        if (validatePause()) {
          return;
        }
        try {
          onQestion();
        } catch (error) {
          console.error(error, "展开提问失败!");
        }
        scrollToBottom();
      }
      // Left Arrow.
      if (code == 37 && document.getElementsByClassName("col-md-4 center bp20 bLeftWrap")[0]) {
        if (validatePause()) {
          return;
        }
        let btn = document.getElementsByClassName("col-md-4 center bp20 bLeftWrap")[0];
        if (btn.classList.contains("notclickn")) {
          return;
        }
        btn.click();
        setTimeout(() => {
          let tiGan = document.querySelector("div.examTigan");
          scrollElementToBottom(tiGan);
        }, 200);
        scrollToBottom();
      }
      // Right Arrow.
      if (code == 39 && document.getElementsByClassName("col-md-4 center bp20 bRightWrap")[0]) {
        if (validatePause()) {
          return;
        }
        let btn = document.getElementsByClassName("col-md-4 center bp20 bRightWrap")[0];
        if (btn.classList.contains("notclickn")) {
          return;
        }
        btn.click();
        setTimeout(() => {
          let tiGan = document.querySelector("div.examTigan");
          scrollElementToBottom(tiGan);
        }, 200);
        scrollToBottom();
      }
      // A,1.
      if (code == 49 || code == 65 || code == 97) {
        if (validatePause()) {
          return;
        }
        document.getElementById("slec0A").click();
        scrollToBottom();
      }
      // B,2.
      if (code == 50 || code == 66 || code == 98) {
        if (validatePause()) {
          return;
        }
        document.getElementById("slec0B").click();
        scrollToBottom();
      }
      // C,3.
      if (code == 51 || code == 67 || code == 99) {
        if (validatePause()) {
          return;
        }
        document.getElementById("slec0C").click();
        scrollToBottom();
      }
      // D,4.
      if (code == 52 || code == 68 || code == 100) {
        if (validatePause()) {
          return;
        }
        document.getElementById("slec0D").click();
        scrollToBottom();
      }
      // J. 标记
      if (code == 74 && document.getElementsByClassName("bj_icon addBiaoji")[0]) {
        if (validatePause()) {
          return;
        }
        document.getElementsByClassName("bj_icon addBiaoji")[0].click();
        setTimeout(function () {
          if (document.getElementsByClassName("swal-button swal-button--confirm")[0]) {
            document.getElementsByClassName("swal-button swal-button--confirm")[0].click();
            document.getElementsByClassName("col-md-4 center bp20 bRightWrap")[0].click();
          }
        }, 300);
      }
      // J. 取消标记
      if (code == 74 && document.getElementsByClassName("bj_icon cancelBiaoji")[0]) {
        if (validatePause()) {
          return;
        }
        document.getElementsByClassName("bj_icon cancelBiaoji")[0].click();
        setTimeout(function () {
          if (document.getElementsByClassName("swal-button swal-button--confirm")[0]) {
            document.getElementsByClassName("swal-button swal-button--confirm")[0].click();
          }
        }, 300);
      }
      // P.暂停
      if (code == 80 && document.getElementsByClassName("inline-block zanTing")[0]) {
        document.getElementsByClassName("inline-block zanTing")[0].click();
      }
      // P.继续做题
      if (
        code == 80 &&
        document.getElementsByClassName("swal-button swal-button--confirm")[0] &&
        document.getElementsByClassName("swal-button swal-button--confirm")[0].textContent ==
          "继续做题"
      ) {
        document.getElementsByClassName("swal-button swal-button--confirm")[0].click();
      }
    };
  }

  // 添加左右方向键监听事件
  function addLeftRightKeyListener() {
    document.onkeyup = function (e) {
      var theEvent = e || window.event;
      var code = theEvent.keyCode || theEvent.which || theEvent.charCode;
      // 	Q. 查看提问
      if (code == 81 && document.getElementsByClassName("tknew doPane question")[0]) {
        if (validatePause()) {
          return;
        }
        try {
          onQestion();
        } catch (error) {
          console.error(error, "展开提问失败!");
        }
        scrollToBottom();
      }
      // Left Arrow.
      if (code == 37 && document.getElementsByClassName("col-md-4 center bp20 bLeftWrap")[0]) {
        if (validatePause()) {
          return;
        }
        let btn = document.getElementsByClassName("col-md-4 center bp20 bLeftWrap")[0];
        if (btn.classList.contains("notclickn")) {
          return;
        }
        btn.click();
        if (document.getElementsByClassName("tknew doPane question")[0]) {
          try {
            onQestion();
          } catch (error) {
            console.error(error, "展开提问失败!");
          }
        }
        scrollToBottom();
      }
      // Right Arrow.
      if (code == 39 && document.getElementsByClassName("col-md-4 center bp20 bRightWrap")[0]) {
        if (validatePause()) {
          return;
        }
        let btn = document.getElementsByClassName("col-md-4 center bp20 bRightWrap")[0];
        if (btn.classList.contains("notclickn")) {
          return;
        }
        btn.click();
        if (document.getElementsByClassName("tknew doPane question")[0]) {
          try {
            onQestion();
          } catch (error) {
            console.error(error, "展开提问失败!");
          }
        }
        scrollToBottom();
      }
    };
  }

  // 只看错题
  function showWrongTopics() {
    loadErrData();
    setTimeout(() => {
      let showButtons = document.querySelectorAll("#dataListWarp>ul>li>h4.chak.zhank");
      for (let i = 0; i < showButtons.length; i++) {
        showButtons[i].click();
      }
    }, 800);
    setTimeout(() => {
      let explainButtons = document.querySelectorAll(
        "#dataListWarp>div.dajx>div.pull-right.clearfix>a.ckjx"
      );
      for (let i = 0; i < explainButtons.length; i++) {
        explainButtons[i].click();
      }
    }, 1500);
    setTimeout(() => {
      autoFillAnswer();
    }, 2000);
  }

  // 自动填充答案
  function autoFillAnswer() {
    const answers = document.getElementsByClassName("answerEnd");
    for (let i = 0; i < answers.length; i++) {
      let ans = answers[i].children[0].innerText.replace("参考答案:", "").replace(/\s+/g, "");
      let your = answers[i].children[1].innerText.replace("你的答案:", "").replace(/\s+/g, "");
      if (ans != your) {
        let ansId = ANSWER_LIST.indexOf(ans);
        let yourId = ANSWER_LIST.indexOf(your);
        let ansList = answers[i].parentElement.parentElement.querySelectorAll(
          ".answerContentList.mgt10"
        );
        ansList[ansId].style.fontWeight = "bold";
        ansList[ansId].style.color = "#51cb65";
        ansList[ansId].children[1].style.fontWeight = "bold";
        // ansList[ansId].children[0].children[0].checked = true;
        if (yourId != undefined) {
          ansList[yourId].style.color = "rgba(128, 128, 145,0.7)";
          ansList[yourId].style.textDecoration = "line-through";
        }
      }
    }
  }

  /**
   * 验证是否暂停中
   * @returns Boolean
   */
  function validatePause() {
    return (
      document.getElementsByClassName("swal-button swal-button--confirm")[0] &&
      document.getElementsByClassName("swal-button swal-button--confirm")[0].textContent ==
        "继续做题"
    );
  }

  // ---------------------------------------------------
  // 更新播放页面标题
  function updateVideoTitle() {
    const config = { attributes: true };
    const callback = function (mutationsList, observer) {
      for (let mutation of mutationsList) {
        if (mutation.type === "attributes" && mutation.attributeName === "class") {
          let title = "";
          let titleEle = document.querySelector("a.log.pointer.video-player.act");
          if (titleEle) {
            title = titleEle.textContent.trim();
          }
          let cover = document.getElementById("videoCoverTop");
          if (cover) {
            cover.innerHTML = `${title} &nbsp;&nbsp;&nbsp;&nbsp;剩余课时:${getRemainingClass()}`;
          }
        }
      }
    };
    const observer = new MutationObserver(callback);
    document.querySelectorAll("a.log.pointer.video-player").forEach(element => {
      observer.observe(element, config);
    });
  }

  // 获取剩余课时数量
  function getRemainingClass() {
    let classList = document.querySelectorAll("a.log.pointer.video-player");
    let activeClass = document.querySelector("a.log.pointer.video-player.act").textContent.trim();
    let index = 0;
    let flag = false;
    for (let i = 0; i < classList.length; i++) {
      const className = classList[i].textContent.trim();
      if (flag) {
        index++;
      }
      if (activeClass == className) {
        flag = true;
      }
    }
    return index;
  }

  // 添加剩余时间
  function addRemainingTime() {
    document.querySelector(".pv-time-current").addEventListener(
      "DOMSubtreeModified",
      function () {
        let remainingSeconds = getRemainingSeconds();
        let remainingTime = remainingSeconds > 0 ? formatSeconds(remainingSeconds) : "";
        let realRemainingSeconds = (
          new Number(remainingSeconds) / new Number(getCurrentRate())
        ).toFixed(0);
        let realRemainingTime = formatSeconds(realRemainingSeconds);
        let overTime = getOverTime(realRemainingSeconds);

        let currentEle = document.querySelector(".pv-time-current");
        if (currentEle) {
          let parent = currentEle.parentElement;

          let remainingTimeSpan = document.querySelector(".pv-time-remaining.time-span");
          if (!remainingTimeSpan) {
            remainingTimeSpan = document.createElement("span");
            remainingTimeSpan.setAttribute("class", "pv-time-remaining time-span");
            parent.append(remainingTimeSpan);
          }
          remainingTimeSpan.textContent = "剩余时间:" + remainingTime;

          let realRemainingTimeSpan = document.querySelector(".pv-time-remaining-real.time-span");
          if (!realRemainingTimeSpan) {
            realRemainingTimeSpan = document.createElement("span");
            realRemainingTimeSpan.setAttribute("class", "pv-time-remaining-real time-span");
            parent.append(realRemainingTimeSpan);
          }
          realRemainingTimeSpan.textContent = "真实剩余时间:" + realRemainingTime;

          let overTimeSpan = document.querySelector(".pv-time-over.time-span");
          if (!overTimeSpan) {
            overTimeSpan = document.createElement("span");
            overTimeSpan.setAttribute("class", "pv-time-over time-span");
            parent.append(overTimeSpan);
          }
          overTimeSpan.textContent = "结束时间:" + overTime;

          let nowTimeSpan = document.querySelector(".pv-time-now.time-span");
          if (!nowTimeSpan) {
            nowTimeSpan = document.createElement("span");
            nowTimeSpan.setAttribute("class", "pv-time-now time-span");
            document.getElementById("videoCoverBottom").append(nowTimeSpan);
          }
          nowTimeSpan.textContent = "北京时间:" + dateFormat("HH:MM:SS", new Date());
        }
        document
          .querySelector(".pv-video-wrap")
          .nextElementSibling.setAttribute(
            "class",
            "pv-skin-blue pv-video-bottom pv-subtitle-hide pv-show-fullscreen-page pv-base-control pv-first-h pv-first-hh"
          );
      },
      false
    );
  }

  // 获取当前时间
  function getNowSeconds() {
    let nowSeconds = 0;
    let currentEle = document.querySelector(".pv-time-current");
    if (!currentEle) {
      return nowSeconds;
    }

    let nowTime = currentEle.textContent;
    let nowArr = nowTime.split(":");
    if (nowArr.length == 2) {
      nowSeconds = parseInt(nowArr[0]) * 60 + parseInt(nowArr[1]);
    } else if (nowArr.length == 3) {
      nowSeconds = parseInt(nowArr[0]) * 60 * 60 + parseInt(nowArr[1]) * 60 + parseInt(nowArr[2]);
    }

    return nowSeconds;
  }

  // 获取总时长
  function getAllSeconds() {
    let allSeconds = 0;
    let durationEle = document.querySelector(".pv-time-duration");
    if (!durationEle) {
      return allSeconds;
    }

    let allTime = durationEle.textContent;
    let allArr = allTime.split(":");
    if (allArr.length == 2) {
      allSeconds = parseInt(allArr[0]) * 60 + parseInt(allArr[1]);
    } else if (allArr.length == 3) {
      allSeconds = parseInt(allArr[0] * 60 * 60) + parseInt(allArr[1]) * 60 + parseInt(allArr[2]);
    }

    return allSeconds;
  }

  // 获取剩余时间
  function getRemainingSeconds() {
    let allSeconds = getAllSeconds();
    let nowSeconds = getNowSeconds();
    return allSeconds - nowSeconds;
  }

  // 获取结束时间
  function getOverTime(seconds) {
    let timestamp = new Date().getTime() + seconds * 1000;
    return dateFormat("HH:MM:SS", new Date(timestamp));
  }

  // 窗口滚动到底部
  function scrollToBottom() {
    setTimeout("window.scrollTo(0, document.body.scrollHeight)", 400);
    setTimeout("window.scrollTo(0, document.body.scrollHeight)", 800);
  }

  // 元素滚动到底部
  function scrollElementToBottom(element) {
    element.scrollTop = element.scrollHeight - element.clientHeight;
  }

  // 将秒格式化为时间格式
  function formatSeconds(value) {
    let result = parseInt(value);
    let h =
      Math.floor(result / 3600) < 10 ? "0" + Math.floor(result / 3600) : Math.floor(result / 3600);
    let m =
      Math.floor((result / 60) % 60) < 10
        ? "0" + Math.floor((result / 60) % 60)
        : Math.floor((result / 60) % 60);
    let s = Math.floor(result % 60) < 10 ? "0" + Math.floor(result % 60) : Math.floor(result % 60);

    let res = "";
    if (h !== "00") res += `${h}:`;
    if (m !== "00") res += `${m}:`;
    res += `${s}`;
    return res;
  }

  /**
   * Format date.
   * @param fmt format standard.
   * @param date date.
   * @returns {Time formatted string}
   */
  function dateFormat(fmt, date) {
    let ret;
    let opt = {
      "Y+": date.getFullYear().toString(),
      "m+": (date.getMonth() + 1).toString(),
      "d+": date.getDate().toString(),
      "H+": date.getHours().toString(),
      "M+": date.getMinutes().toString(),
      "S+": date.getSeconds().toString(),
    };
    for (let k in opt) {
      ret = new RegExp("(" + k + ")").exec(fmt);
      if (ret) {
        fmt = fmt.replace(
          ret[1],
          ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")
        );
      }
    }
    return fmt;
  }

  /**
   * Log the title and version at the front of the console.
   * @param {String} title title.
   * @param {String} version script version.
   */
  function logInfo(title, version) {
    console.clear();
    const titleStyle = "color:white;background-color:#606060";
    const versionStyle = "color:white;background-color:#1475b2";
    const logTitle = " " + title + " ";
    const logVersion = " " + version + " ";
    console.log("%c" + logTitle + "%c" + logVersion, titleStyle, versionStyle);
  }
})();