From 0a0a5dd20ce80cb503f3c57d8b6aa2c25e261b8d Mon Sep 17 00:00:00 2001 From: enncy <877526278@qq.com> Date: Sat, 9 Apr 2022 17:08:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=87=E6=8D=A2=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E8=B7=AF=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/core/create.element.ts | 1 + packages/core/src/cx/index.ts | 9 +-- packages/core/src/cx/panels.ts | 12 +++- packages/core/src/cx/study.ts | 72 +++++++++--------------- packages/core/src/index.ts | 5 ++ 5 files changed, 50 insertions(+), 49 deletions(-) diff --git a/packages/core/src/core/create.element.ts b/packages/core/src/core/create.element.ts index 0d4edf21..509d0f81 100644 --- a/packages/core/src/core/create.element.ts +++ b/packages/core/src/core/create.element.ts @@ -106,6 +106,7 @@ export function createSettingPanel(...settingItems: FormType[]): DefineComponent class: "ocs-setting-items", }, settingItems + .filter((item) => item) .map((item) => isVNode(item) ? item : [h("label", item.label), createSettingItem.apply(this, [item])] ) diff --git a/packages/core/src/cx/index.ts b/packages/core/src/cx/index.ts index cb63400f..4aa657fb 100644 --- a/packages/core/src/cx/index.ts +++ b/packages/core/src/cx/index.ts @@ -6,6 +6,7 @@ import { createCXStudySettingPanel, createCXWorkSettingPanel } from "./panels"; import { study } from "./study"; import { rateHack } from "./utils"; import { workOrExam } from "./work"; +import { useOCS } from ".."; /** 需切换版本的 url 页面 */ const updateURLs = [ @@ -50,7 +51,7 @@ export const CXScript = defineScript({ name: "任务切换脚本", url: "**/mycourse/studentstudy**", onload() { - const { restudy } = (top || window).OCS.setting.cx.video; + const { restudy } = useOCS().setting.cx.video; const params = new URLSearchParams(window.location.href); const mooc = params.get("mooc2"); @@ -93,7 +94,7 @@ export const CXScript = defineScript({ { name: "学习脚本", url: "**/knowledge/cards**", - async onload(setting = (top || window).OCS.setting.cx.video) { + async onload(setting = useOCS().setting.cx.video) { await sleep(5000); await study(setting); }, @@ -114,7 +115,7 @@ export const CXScript = defineScript({ { name: "作业脚本", url: "**/mooc2/work/dowork**", - async onload(setting = (top || window).OCS.setting.cx.work) { + async onload(setting = useOCS().setting.cx.work) { await sleep(5000); await workOrExam(setting, false); }, @@ -132,7 +133,7 @@ export const CXScript = defineScript({ { name: "考试脚本", url: "**/mooc2/exam/preview**", - async onload(setting = (top || window).OCS.setting.cx.exam) { + async onload(setting = useOCS().setting.cx.exam) { await sleep(5000); await workOrExam(setting, true); }, diff --git a/packages/core/src/cx/panels.ts b/packages/core/src/cx/panels.ts index 97772527..9d19c10b 100644 --- a/packages/core/src/cx/panels.ts +++ b/packages/core/src/cx/panels.ts @@ -1,5 +1,7 @@ import { DefineComponent, h } from "vue"; import { createSettingPanel, createWorkerSetting, CreateWorkerSettingConfig } from "../core/create.element"; +import { domSearch } from "../core/utils"; +import { switchPlayLine } from "./study"; /** * 创建超星学习设置面板 @@ -41,13 +43,21 @@ export function createCXStudySettingPanel(): DefineComponent { id: "video-line", value: settings.line || "", onchange: (e: any) => { - console.log("播放路线", e.target.value); settings.line = e.target.value; + const { iframe } = domSearch({ iframe: "iframe" }); + const win = (iframe as HTMLIFrameElement).contentWindow; + win?.location.reload(); }, }, options: ( [ settings.line ? { label: "指定-" + settings.line, value: settings.line } : [], + ...[ + Array.from(settings.playlines || [{ label: "公网1" }, { label: "公网2" }]).map((line: any) => ({ + label: line.label, + value: line.label, + })), + ], { label: "请指定路线(播放视频后才可选择, 无需保存)", value: "", diff --git a/packages/core/src/cx/study.ts b/packages/core/src/cx/study.ts index 02c52f0c..e7b83ccf 100644 --- a/packages/core/src/cx/study.ts +++ b/packages/core/src/cx/study.ts @@ -118,18 +118,15 @@ function searchIFrame() { } /** - * 播放视频和音频 + * 视频路线切换 */ -function mediaTask(setting: ScriptSettings["cx"]["video"], media: HTMLMediaElement, frame: HTMLIFrameElement) { - const { playbackRate = 1, mute = true } = setting; - /** - * 视频路线选择器 - */ - // @ts-ignore - const { videojs } = domSearch({ videojs: "#video" }, frame.contentDocument || document); - const { lineSelect } = domSearch({ lineSelect: "#video-line" }, top?.document); - - console.log({ videojs, lineSelect }); +export function switchPlayLine( + setting: ScriptSettings["cx"]["video"], + videojs: HTMLElement, + media: HTMLMediaElement, + line: string +) { + const { playbackRate = 1 } = setting; // @ts-ignore if (videojs?.player) { @@ -140,50 +137,37 @@ function mediaTask(setting: ScriptSettings["cx"]["video"], media: HTMLMediaEleme // @ts-ignore videojs.player.controlBar.videoJsPlayLine.querySelectorAll("ul li") ); - console.log({ playlines, menus }); - const currentLine = setting.line; - if (currentLine) { - logger("info", "切换路线中: " + currentLine); - setTimeout(() => selectLine(currentLine), 3000); - } + setting.playlines = playlines; - /** 添加选项 */ - if (lineSelect) { - for (const line of playlines) { - // @ts-ignore - createOption(line.label); - } + logger("info", "切换路线中: " + line); + selectLine(line); - lineSelect.onchange = function () { - const select = lineSelect as HTMLSelectElement; - selectLine(select.value); - }; - - function createOption(label: string) { - console.log({ label }); - - const option = document.createElement("option"); - option.text = label; - option.value = label; - // @ts-ignore - lineSelect.appendChild(option); - console.log(lineSelect); - } - } - - function selectLine(value: string) { + function selectLine(line: string) { for (const menu of menus) { - if (menu.textContent?.includes(value)) { + if (menu.textContent?.includes(line)) { menu.click(); - setting.line = value; - setting; + setting.line = line; setTimeout(() => (media.playbackRate = playbackRate), 3000); break; } } } } +} + +/** + * 播放视频和音频 + */ +function mediaTask(setting: ScriptSettings["cx"]["video"], media: HTMLMediaElement, frame: HTMLIFrameElement) { + const { playbackRate = 1, mute = true } = setting; + + // @ts-ignore + const { videojs } = domSearch({ videojs: "#video" }, frame.contentDocument || document); + if (videojs) { + // 切换路线 + setTimeout(() => switchPlayLine(setting, videojs, media, setting.line), 3000); + } /** * 视频播放 diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 16d1894c..850da4b2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -43,3 +43,8 @@ export const setting: typeof defaultOCSSetting = defaultsDeep(localStorage.setti // @ts-ignore localStorage.setting = setting; + +export function useOCS(): typeof OCS { + // @ts-ignore + return unsafeWindow?.OCS; +}