Greasy Fork

Greasy Fork is available in English.

浙江大学智云课堂小助手

对智云课堂页面的一些功能增强

当前为 2021-01-19 提交的版本,查看 最新版本

// ==UserScript==
// @name         浙江大学智云课堂小助手
// @description  对智云课堂页面的一些功能增强
// @namespace    https://github.com/CoolSpring8/userscript
// @supportURL   https://github.com/CoolSpring8/userscript/issues
// @version      0.1.0
// @author       CoolSpring
// @match        *://livingroom.cmc.zju.edu.cn/*
// @grant        none
// ==/UserScript==

const EXTGRP_NAME = "ZJU-CMC"

const showLoadedMessage = () => {
  console.log(
    // eslint-disable-next-line no-undef
    `${GM.info.script.name} v${GM.info.script.version} has been successfully loaded.`
  )
}

const addToolbar = () => {
  const rawToolbar = document.querySelector(".course-info__header—toolbar")
  const helperToolbar = document.createElement("div")

  const removeMaskButton = document.createElement("button")
  removeMaskButton.innerText = "去除学号水印"
  removeMaskButton.onclick = removeMask

  const generateM3UButton = document.createElement("button")
  generateM3UButton.innerText = "生成播放列表"
  generateM3UButton.onclick = generateM3U

  helperToolbar.append(removeMaskButton, generateM3UButton)
  rawToolbar.prepend(helperToolbar)
}

const removeMask = () => {
  const mask = document.querySelector(".expand-mask")
  if (mask) {
    mask.remove()
  }
}

const generateM3U = () => {
  const courseVueInstance = document.querySelector(".course-info__wrapper")
    .__vue__

  const courseName = courseVueInstance.courseName
  const teacherName = courseVueInstance.teacherName
  const menuData = courseVueInstance.menuData
  const academicYear = JSON.parse(courseVueInstance.liveInfo.information).kkxn
  const semester = JSON.parse(courseVueInstance.liveInfo.information).kkxq

  let m3u = `#EXTM3U
  
#PLAYLIST:${courseName}
#EXTGRP:${EXTGRP_NAME}
#EXTALB:${courseName}
#EXTART:${teacherName}
  
${menuData
  .filter((menu) => "playback" in menu.content)
  // filter() has already created a new array, so we don't need to make a copy manually to avoid the side effects of sort().
  .sort((a, b) => a.course_begin - b.course_begin)
  .map(
    (menu) =>
      `#EXTINF:${menu.duration},${menu.title}\n${menu.content.playback.url[0]}\n`
  )
  .join("\n")}`

  _saveTextToFile(
    m3u,
    `${courseName}-${teacherName}-${academicYear}${semester}.m3u`
  )
}

const _saveTextToFile = (text, filename, blobOptions) => {
  const a = document.createElement("a")
  const file = new Blob([text], blobOptions)
  const url = URL.createObjectURL(file)
  a.href = url
  a.download = filename
  a.click()
  URL.revokeObjectURL(file)
}

const initHelper = () => {
  addToolbar()
  showLoadedMessage()
}

setTimeout(initHelper, 10000)