
auto-video-player v2.1.2(自动连播助手)
自动连播助手是一款 Chromium 内核浏览器(Chrome / Edge)扩展,针对网课平台的课件目录实现自动播放与自动跳转到下一节,支持倍速播放、商业授权等,帮助你无人值守地完成课件连播。
下载安装包
点击下方按钮下载 v2.1.2 安装包(zip,约 136 KB):
⬇️ 下载 auto-video-player-v2.1.2.zip
© 2026 胡昱晨 (hu_yu_chen) 保留所有权利。
本扩展为原创作品,依据 MIT 许可证开源。依据 MIT 条款及《中华人民共和国著作权法》:
- 必须保留署名:任何使用、复制、修改、分发本作品的行为,都必须完整保留 源码中的版权头、
LICENSE文件与NOTICE文件中的作者署名; - 禁止冒名:未经书面许可,任何人不得宣称自己为本作品的原始作者, 亦不得以作者名义进行宣传、推广或背书;
- 修改须标注:修改后再分发须显著标注「已修改」及修改日期。
违反上述条款即构成侵权,权利人保留追究法律责任的权利。 完整条款见 LICENSE 与 NOTICE。
一个通用的浏览器扩展:自动识别网页里正在播放的视频和播放列表,视频暂停时自动续播,播放结束后自动点击下一个视频。
扩展会按域名自动判定当前平台,并只启用该平台的一套策略。各平台可单独启停(见下方「使用」)。
| 平台 | 域名 | 处理方式 | 状态 |
|---|---|---|---|
| 网梯科技 | webtrn.cn |
.s_point[itemtype="video"] 目录识别 · completestate 完成判定 |
已冻结 |
| 江西师范大学 | jxnu.edu.cn |
百家云播放器接管(无 <video>)· 目录百分比进度 |
维护中 |
| 通用兜底 | 其余站点 | <video> 元素基础连播能力 |
维护中 |
为什么按平台隔离:不同平台的目录结构与完成标记完全不同,早期把各平台的特判都写在 同一条共享路径上,改动一个平台存在波及另一个的风险。现在每个平台的专属逻辑都受 profileAllows(id) 准入保护——在 A 平台上,B 平台的判定分支根本不会执行。
「已冻结」表示该平台的逻辑不再随其他平台的开发而改动,任何变更必须先让 tests/selftest_whaty_frozen.js 全绿。
- 平台自动识别:打开页面即按域名判定平台,面板上会显示当前平台名。
- 自动识别视频:扫描页面中所有
<video>元素,并监听动态加载的新视频(含 iframe 内嵌播放器、Shadow DOM)。 - 自定义播放器接管:播放器不在
<video>里(canvas + WebAudio,如百家云)时,直接从播放器控制条读取进度并模拟起播。 - 暂停自动续播:检测到视频被暂停(非播放结束)时,自动恢复播放。
- 识别待播列表:用启发式算法解析课程/播放列表,区分 已播 / 播放中 / 待播 状态;自动穿透 iframe,识别主页面和子页面中的目录。
- 自动连播:当前视频播放结束后,优先点击平台自带的”下一集”按钮;没有时按目录顺序点下一个待播项,遇到未展开目录会自动展开父级后再点击。
- 倍速播放:可选开关,支持 1.0x ~ 5.0x 多档倍速,视频切换后自动保持,关闭即恢复 1 倍速。
- 读取视频进度条:实时显示当前视频播放进度(
00:33 / 34:06)和课程总进度百分比。 - 悬浮面板:页面右下角实时显示运行状态、视频数量、目录统计,可拖拽、可折叠,支持手动”立即播放下一集”,可展开调试日志查看识别过程。
- 打开 Chrome 或 Edge,地址栏输入
chrome://extensions(Edge 为edge://extensions)。 - 打开右上角 「开发者模式」 开关。
- 点击 「加载已解压的扩展程序」。
- 选择本文件夹(
auto-video-player,包含manifest.json的那一层)。 - 打开任意视频网站(B站、YouTube、课程网站等),页面右下角会出现悬浮面板即表示已生效。
- 面板 / 扩展图标弹窗里可开关:平台启停、总开关、进入页面自动起播、暂停自动续播、播完自动下一集、倍速播放。
- 平台启停:可单独关闭某个平台。关闭后,该平台所属域名上扩展完全不动(不建面板、不扫描、不接管),适合在其中某个平台出问题时先隔离该平台、不影响其他平台。重新勾选即可恢复,无需刷新页面。
- 设置通过 Chrome 同步存储,改动会实时生效到已打开的页面。
- 若不希望某些页面自动运行,可在扩展详情里通过「网站访问权限」限制。
- 只在有播放内容的页面工作:打开白名单内的普通页面(首页、列表页等没有任何视频/播放器特征的网页)时,扩展不会弹出面板、不做任何扫描;页面后续真的出现播放内容才会自动启动。
本插件采用离线授权码机制:没有有效授权时,插件在网页上完全不工作(不扫描、不起播、不自动下一集),只在页面右下角显示「🔒 插件未授权」卡片,需联系作者获取授权码。
授权为程序级授权(v2.1.1 起):不绑定域名、不绑定平台——授权码只证明”该用户有权使用本程序”,激活后全部功能、全部已支持网站均可使用。
用户激活(两种方式任选):
- 打开任意已支持的学习网站,页面右下角「🔒 插件未授权」卡片里粘贴授权码 → 点「激活」;
- 点浏览器工具栏扩展图标,在弹窗顶部的授权卡里输入激活。
授权码保存在 chrome.storage.sync,随 Chrome/Edge 账号同步,换电脑登录同一账号无需再次激活。
平台越多、判定分支越容易互相影响,因此所有平台相关改动必须通过回归门禁:
node tests/run-all.js # 跑完全部自检,全绿才可合入
| 测试文件 | 覆盖范围 |
|---|---|
tests/selftest_whaty_frozen.js |
网梯冻结门禁:黄金用例 + 隔离边界 + 冻结标记完整性 |
tests/selftest_lessonfilter.js |
课时/章节标题过滤,含平台隔离断言 |
tests/selftest_customplayer.js |
自定义播放器读数与起播(含源码级断言) |
tests/selftest_autostart.js |
首次起播行为仿真(虚拟时钟驱动真实 tick) |
tests/selftest_videostate.js |
video 状态与空壳过滤 |
tests/selftest_license.js |
授权算法(SHA-256 向量 / 签名 / 程序级授权 / 过期)+ 授权闸门与待命守卫断言 |
tests/selftest_robust.js |
健壮性回归:readCustomPlayer/background 行为测试(DOM/chrome API 桩)+ 修复断言 |
新增平台时的约定:在 PLATFORMS 里登记,用 profileAllows(id) 包住专属分支,并为新平台补一套自检。
| 文件 | 作用 |
|---|---|
manifest.json |
扩展清单(Manifest V3) |
content.js |
核心逻辑:视频识别、续播、列表识别、连播、悬浮面板 |
content.css |
悬浮面板样式 |
popup.html / popup.js |
扩展图标弹窗(设置面板) |
background.js |
后台看门狗 Service Worker(chrome.alarms 驱动,解决后台节流) |
license.js |
商业授权:离线授权码签发/校验(content script、popup、生成器三方共用) |
tools/gen-license.js |
授权码生成器(作者本地运行,不随买家分发) |
icons/ |
扩展图标 |
LICENSE |
MIT 许可证全文 |
NOTICE |
知识产权与著作权声明(中英双语) |
gen_icons.py |
图标生成脚本(可删除) |
上述所有源文件头部均嵌著作权声明,使用时请勿删除。
本项目以 MIT 许可证开源,允许自由使用、复制、修改与分发(含商业用途), 但必须满足以下保留义务:
- 保留每个源文件的版权头注释;
- 保留
LICENSE与NOTICE文件; - 保留界面上的作者署名(悬浮面板底部、扩展弹窗底部);
- 不得宣称自己为原始作者,或修改后不标注即行分发。
简洁地说:代码可以免费用,作者的名字不可以拿掉。
对全部源码(manifest / background / content / popup / license / shadow_bridge,约 4900 行)做了一次完整通读,修复确认的问题:
- 修复
readCustomPlayer()调用未定义的pick():「时长读不到」分支一进去就抛 ReferenceError 被静默吞掉,自定义播放器会被永远当成”暂停中”(现有测试都走”时长读得到”分支,从未覆盖)。 - 修复 SPA 路由监听重复注册:待命再唤醒会叠加 popstate/hashchange 监听、反复包装
pushState、1500ms轮询 interval 越积越多(且不在 tickTimers 里,待命时清不掉);改为监听器只装一次 + 轮询纳入 tickTimers 统一管理。 - 修复 background 标签页注册竞态:
addTab/removeTab原是”异步读 storage → 改 → 写回”,两个标签页几乎同时注册时后写覆盖先写(丢更新),被丢的标签页收不到看门狗唤醒;改为内存数组为单一事实源 + 启动时恢复一次(单 Promise 去重)。 - 修复 Shadow 桥升级不刷新 matches:扩展升级后域名清单变了,已注册的 MAIN world 桥不会更新,新域名永远注入不了;改为注册前逐项比对,过期则
updateContentScripts(老内核自动降级为”注销 → 重注册”)。 - 修复面板”空壳 video”统计错误:改用
isRealVideoObj直接统计,避免页面存在重复 src 的 video 时虚报空壳数量。 - 健壮性:
chrome.tabs.sendMessage同时兼容 callback 与 Promise 两种 API 形态;起播复查定时器(3s/8s/16s)重新调度前先作废旧句柄;ping 向孙辈 iframe 转发;倍速下拉存储值不在选项内时动态补选项,updateUI对面板控件逐个空值保护。 - 性能:video 元素清单与目录容器查找加 TTL 缓存,大页面 CPU 占用显著下降。
- 测试:新增
tests/selftest_robust.js(44 项),全量回归 184/184 通过。
- 授权码 payload 去掉域名字段,同一授权码在任何网站、任何平台都有效;旧版(v2.1.1 前)签发的带域名码签名仍然有效且同样不再受域名限制,无需重签。
- 未授权提示卡移除「当前网站域名 + 一键复制」行(程序级授权不再需要域名信息);popup 授权卡由”适用网站 xxx”改为”程序级授权(全部功能 · 全部已支持网站)”,引导语由”把网站域名发给作者”改为”联系作者购买授权”。
tools/gen-license.js的--domain改为非必填(传入会被忽略并提示),签发命令简化为node tools/gen-license.js --days 365 --customer CUST-001;tests/selftest_license.js升级为 51 项,全量回归 140/140 通过。
- 商业授权(未授权不工作):新增
license.js,离线授权码方案(无需服务器),未授权时不扫描、不起播、不建面板、不注册看门狗,只在页面右下角显示「🔒 插件未授权」卡片(失败原因 + 作者联系方式 + 授权码输入框);新增tools/gen-license.js作者签发工具(不随买家分发包)与tests/selftest_license.js(48 项)。 - 修复”安装后任何网页都蹦出插件”:新增启动状态机(
boot → startFull / startProbe / enterStandby)、待命守卫(看门狗消息 / visibilitychange / window load / SPA 路由变化四个通道待命期直接返回)、host_permissions与web_accessible_resources从<all_urls>收紧为与content_scripts相同的 27 域名白名单。 - 其它:
escapeHtml()补全引号转义、面板信息行追加授权状态(客户号 / 到期);全量自检 137/137 通过。
纯文案修正,无逻辑改动。
- 更正第二个平台的归属名称:
jxnu.edu.cn是江西师范大学的 zjpt 学习平台,此前content.js的PLATFORMS、popup.js平台清单、README / CHANGELOG 中误写为「江西专技学习网」,现统一更正为「江西师范大学」。 - 影响面:仅面板 / 弹窗上显示的平台名,以及
platformInfo().name的诊断输出,不涉及任何平台判定逻辑(detectPlatformByHost()按域名判定,不受影响)。 - 网梯冻结区未改动,
node tests/run-all.js全量自检仍为 89/89 通过。
- 双平台策略隔离:新增平台 profile(网梯 / 江西师范大学 / 通用兜底),按域名判定后只启用对应平台的一套策略。此前为 jxnu 加的每一处特判都在共享代码路径上,现在它们有了明确边界——改 jxnu 不可能再波及网梯。
- 前台平台启停:面板与 popup 新增「平台启停」勾选列表,可单独关闭任一平台;关闭后该平台域名上扩展完全不动(不建面板、不扫描、所有 tick 停手),可随时重新开启。
- 网梯平台正式冻结:网梯目录识别与完成判定标注冻结不再改动;新增
tests/selftest_whaty_frozen.js(20 项)作为回归门禁——任何导致网梯行为变化的改动都会在自检阶段报红。 - 新增统一自检入口
tests/run-all.js(合计 89 项),建议改动合入前必跑。 - 说明:未识别到的站点归为「通用兜底」,此时两套平台专属逻辑都放行(向后兼容),真正的隔离发生在两个已知平台之间。
- 修复「刷新页面 / 进入视频页后必须人工点一次才会播放」:起播原先被
autoResume(默认关闭)、cur<=15、刚跳转三道闸门卡住,停在播放中途(如 25:01)时永不出手。 - 把「首次起播」与「暂停续播」拆开:新增开关 进入页面自动起播(默认开启),负责每一节的第一次播放,播起来即收手,之后用户手动暂停不再打扰;
autoResume维持原语义。 - 冷启动状态机:接管后 2.5s 出手,3s/8s/16s 三次复查并升级起播方式(media.play → 自带按钮 → canvas → 画面容器 → 空格键),8 分钟 / 6 轮上限。
- 换课时三重识别信号(容器类名变化 / 本扩展刚跳转 / 播放位置倒退),同时修复”跳到下一集却不起播”。
- 版本升级不再偷偷还原用户手动勾选的
autoResume。新增 14 项行为级仿真自检(虚拟时钟驱动真实 tick)。
- 修复「一会播放一会暂停」:百家云的时间容器本身叫
.duration,导致总时长一直读成 0;同时占位<audio>抢占读数通道使播放位置恒为 0 → 误判卡住 → 反复点击播放按钮(而它是播放/暂停开关)。新增readPlayerClock()精确读数 + media 可用性判定。 - 三重防误暂停:UI 显示播放中时判停等待放宽到 90s;读不到位置且在播不出手;复查发现已在播立刻收手。
- 目录进度不再负责起播(长视频涨幅慢会被误判),交由秒级的自定义播放器心跳接管。
- 修复目录驱动 tick 每 3 秒崩溃:
catalogDriveAnnounced、currentItemPausedByIcon未声明/未实现,严格模式下抛 ReferenceError,起播级联一行都没执行到。 - 接管无
<video>的自定义播放器(百家云 bplayer:canvas + audio):新增 DOM 状态读取、伪装状态上报、五级起播级联与事后进度校验;面板可显示真实进度,播完自动下一集。 - 修复摄像头空壳
<video>冒充”正在播放”堵死兜底路径;新增 24 项自检。
- 起播四级级联(按钮/画面点击/空格键/课时图标);扫描覆盖 object/embed;桥上报注入时机;复制目录HTML附带播放器区域 DOM。
- Shadow 桥注入改为
registerContentScripts(world:'MAIN', document_start)原生注册 + 同步内联双通道,彻底消灭竞态;桥上报容器数量,play() 被拒时改点容器内播放按钮;诊断行显示桥状态。
- 定位到 jxnu zjpt 播放器的真实藏身处:关闭的 Shadow DOM(页面底部有播放器控制条但查不到可播 video、iframe 为 0)。新增主世界桥接脚本
shadow_bridge.js,截获 closed shadowRoot、回传 video 状态、下发播放/倍速命令,自动起播与播完自动下一集从此直接控制真实播放器。 - 修复 v1.8.7 的图标误判(pause-circle 是”进行中”不是”播放中”,曾导致卡住不起播);当前课时图标变 check-circle 立即跳下一集。
- content script 提前到 document_start(抢装 Shadow 钩子),页面早退判断相应延迟到 init。
- manifest 新增
scripting权限与 web_accessible_resources。
- 修复 jxnu zjpt「不自动播放 / 播完不跳下一集」:页面上的 3 个 video 实为摄像头与人脸检测的空壳元素(无 src、readyState 0),却让脚本误判”播放器已可控”,导致按目录进度驱动的自动连播从未生效。现已剔除空壳。
- 播完判定:目录进度 ≥99.5% 跳转;95% 以上停滞 4 分钟 / 90% 以上停滞 8 分钟也判定播完。
- 自动起播:进度卡住时(0% 卡 20 秒、中途停 45 秒)点页面播放按钮或当前课时的播放图标;平台显示”播放中”时不干预。
- 新增
fireFullClick()完整鼠标事件序列,修复 Vue / Ant Design 平台点击无响应。 - 面板与日志区分「可播视频 / 空壳 video」计数。
- 修复「立即播放下一集」点了没反应:扩展此前命中了自己的面板按钮;现面板带
data-ap-own标记,页面级扫描一律排除自身元素。 - 跳转改为目录优先(平台按钮仅兜底);目录项点击改为点内层容器(适配 Vue 平台事件绑定)。
- 已完成识别补全:Ant Design
anticon-check-circle图标 + 进度条内联宽度 100%。 - 自动起播:跳过无媒体源的空壳 video;
play()失败时退回点击页面播放按钮(刚跳转后/开启续播时,30 秒节流)。 - 诊断:绑定视频输出详情,跳转后 2 秒复查当前项是否切换。
- 回归防护:确保 jxnu 平台适配不影响网梯(webtrn.cn)原有识别与连播。
- 课时序号过滤加双重保护:网梯
.s_point[itemtype="video"]直接跳过过滤;被剔除项若带openLearnResItem/itemtype=video/completestate等课时特征则放弃过滤。 - 本地完成记账改为 10 分钟有效期,避免误标导致漏看课时被永久跳过。
- 用户主动暂停判定收紧为”已播超过 15 秒”,网梯切集时的开头暂停仍会自动起播。
- 课时序号过滤加双重保护:网梯
- 新增
tests/selftest_lessonfilter.js自检脚本(提取真实源码运行,5 项断言全通过)。
- 修复「复制目录HTML」点了没反应(顶层目录未写入缓冲区)。
- 修复目录数量不准:混入的章节标题(
SPAN.nav-title)被当成课时,已按”课时文本带序号”剔除(17 项 → 真实 13 课时)。 - 新增目录进度百分比解析与「无视频状态连播」兜底:播放器在跨域 iframe 里监听不到 ended 时,改由课时进度(100%)驱动跳下一集;面板改用平台课时进度显示。
- 日志降噪(状态不变不重复输出)+ 输出 video/iframe 诊断清单。
- 修复 jxnu zjpt 平台检测数量不对、已播/待播不准、跳转后不自动播放:
- 起播检查
ensurePlaying()此前只在后台看门狗(每分钟)里执行,前台循环未调用 —— 跳到下一集后新视频停在暂停态。现在前台 3 秒循环、子帧 1.5 秒循环、ping应答均执行起播检查,跳转后几秒内自动开播。 - 平台自定义播放器
duration为 0/未知时不再被跳过(此前表现为”视频在播但进度 0%”);时长未知时面板显示「当前 xx:xx / 未知时长」。 - 已完成判定新增「目录项百分比进度 ≥ 99.5%」规则(该平台用 0.0%/78.9%/100% 标记状态,不用 class)。
- 新增运行时本地完成记账:视频播完或自动跳转后,即使平台完成状态延迟 / URL 与高亮不变,也按目录顺序持续推进,不会反复跳回同一集。
- 面板视频数按
src去重;前台手动暂停(未开自动续播)会被记住,起播逻辑不抢启。 - 新增覆盖常见第三方视频云播放器域名(bokecc / polyv / aliyuncs / qiniudns / cdnhwc1·2),若播放器嵌在跨域 iframe 里也能监听播放结束;页面加载后输出 iframe 地址清单到日志,便于后续精准适配。
- 起播检查
- 修复「浏览器最小化 / 切到后台后不自动播放、不自动跳转」(后台定时器节流导致):
- 根因:Chrome 对后台标签页实施定时器节流(隐藏一段时间后
setInterval被压缩到每分钟一次)。而pickBestFrameForNext/pickBestList用 12 秒有效期过滤frameStates,另有 15 秒清理定时器直接delete frameStates[k]—— 后台时帧状态被判为过期或删除,pickBestFrameForNext()返回null,日志打出「未找到有效目录帧」,于是跳不动;回到前台定时器恢复,积压任务一起执行,表现为”打开浏览器才继续”。 - 时效判定按可见性放宽:新增
frameStateMaxAge(),页面不可见时有效期从 15 秒放宽到 5 分钟(目录结构不会因后台而改变),前台保持严格;清理定时器同步放宽。 - 调度改用消息驱动:
ended到达时先analyzeAndReport()+broadcastDown(ping)实时拉起子帧上报(postMessage投递不受定时器节流影响),并抽出统一入口dispatchNext();选不到目录帧时安排一次重试。 - 新增后台看门狗:新增
background.js(Service Worker)+chrome.alarms,每分钟唤醒一次并向已注册标签页发消息,内容是scanVideos → analyzeAndReport → ensurePlaying → 必要时补跳下一集。消息投递会立即执行页面脚本,不受节流限制。无需tabs权限,仅用已有的storage加alarms。 - 被动暂停自动恢复:区分”用户主动暂停”与”后台被动暂停”。页面不可见时发生的暂停(浏览器节流或平台防挂机检测)会自动恢复播放,用户在前台的主动暂停不受影响。
- 保证下一集真的起播:新增
ensurePlaying(),视频刚开始播放(currentTime < 15)却处于暂停时自动尝试启动(优先模拟点击播放按钮,play()兜底),避免跳过去之后卡住不动。 - 恢复可见即时补齐:
visibilitychange回到前台时立即刷新并检查是否有遗漏的跳转。
- 根因:Chrome 对后台标签页实施定时器节流(隐藏一段时间后
- 新增支持 江西师范大学(zjpt 学习平台)
zjpt-web.jxnu.edu.cn:manifest.json与已知平台列表加入jxnu.edu.cn,扩展会在该平台正常注入。
- 修复通用平台无法连播的根本问题:
hasRealCatalogInList/clickNext原先写死只认网梯平台的.s_point[itemtype="video"],导致任何新平台都会被判定为”无目录”而拒绝跳转。现改为通用判断(排除播放器控件 + 课时标题长度校验),网梯平台保留专属快速路径。 - 新增 SPA 路由变化监听:Vue/React 类平台(如江西师范大学)切换视频不刷新页面,现通过
popstate/hashchange/ 劫持pushState·replaceState+ 定时轮询感知 URL 变化,自动重新扫描视频与目录,并重置上一轮跳转锁。 - 目录识别增强:新增 Element UI / Ant Design / 中文拼音类名目录容器(
.el-menu、.ant-menu、.course-list、kecheng、mulu、zhangjie、keshi等)。 - 新增”同级重复结构”兜底识别:目录项无典型 class、无时长文本时(SPA 平台常见),按 tag + 首类名分组识别。
- 播放器控件过滤:新增
isPlayerControl(),统一排除位于video / .player / .jwplayer / .vjs-control-bar等播放器容器内的元素,避免画质、时长、进度条被误当课时。 - 中文完成状态识别增强:新增「已学习 / 已修完 / 已通过 / 完成学习」等文案与
yixue、xuewan等拼音类名。 - 中文”下一集”按钮识别:新增按可见文本匹配「下一节 / 下一讲 / 下一集 / 下节课 / 下一个」,并排除「下一页」等分页按钮。
- 启动日志新增平台判定输出(已知平台 / 是否存在 video 元素),便于排查注入问题。
- 新增倍速播放功能:
- 默认 1 倍速,最高 5 倍速,档位:1.0x / 1.25x / 1.5x / 2.0x / 2.5x / 3.0x / 4.0x / 5.0x。
- 悬浮面板新增「倍速播放」开关 + 「播放速度」下拉选择;扩展图标弹窗同样支持设置。
- 默认关闭(
speedEnabled: false),避免与平台自带倍速冲突或触发违规检测;开启后所有帧的视频统一应用倍速。 - 视频切换(重新播放)时自动重新应用倍速,防止播放器重置;设置实时同步到所有已打开页面,关闭开关即恢复 1 倍速。
- 修复「任何网页都触发扩展、很麻烦」:
manifest.json的content_scripts.matches从<all_urls>收紧为常见视频/网课平台清单(网梯、B站、优酷、爱奇艺、腾讯视频、网易云课堂、中国大学MOOC、学堂在线、智慧树、慕课网、超星、网易公开课、腾讯课堂、高顿、抖音、快手、虎牙、斗鱼、YouTube 等),未列入的网站完全不会注入。content.js顶层 frame 启动时再次校验:不在已知平台域名 且 没有<video>元素时,整个 IIFE 立即return,不绑定任何事件、不创建面板、不扫描 DOM。- 子 frame 仍正常工作(依赖父 frame 的 postMessage 唤醒),但只在匹配的网课平台子页面里才会注入。
- 调整清单:若遇到扩展在某个网课平台未生效,可编辑
manifest.json的matches加上对应域名后重新加载。
- 修复「仍未按顺序播放,且播完最后一个视频后不会回头补齐漏看课时」:
findNextItem改为自动补齐模式:自动连播时按目录顺序取第一个未完成课时,不再局限于「当前项之后」。这样即使前面有漏掉的视频,播完后也会回头继续播放,直到课程全部完成。- 手动点击「立即播放下一集」仍优先取当前项之后的下一个未完成课时,保持操作预期;当前项之后没有待播项时,再兜底取全局第一个未完成项。
clickNext增加autoEnded参数,自动结束事件与手动按钮使用不同策略,并在跨帧广播中传递manual标志。- 全部课时完成后日志输出「全部课时已完成」,避免无意义重复跳转。
- 修复「v1.7.5 仍未拦住播放器帧乱点 / 当前项识别错位」:
clickNext目录有效性判断由「leafCount ≥ 3」改为「本帧必须含.s_point[itemtype="video"]」。网梯内容帧(播放器控件)即便识别出 3 项也不算目录,必须让顶层调度到真正拥有.s_learnlist的目录帧。pickBestFrameForNext同样过滤掉不含.s_point的无效帧,委派的目标帧一定是真实目录帧。analyzeList当前项识别顺序改为 URL 匹配优先,再退回到s_pointerct类标记。原因:平台可能在目录上保留对某一项的s_pointerct高亮,但用户实际播放的是另一项(URL 不同),此时按s_pointerct找当前项会指错,导致下一集跳过多个真实未看项。- 行为:用户从 leaf[N](未标
s_pointerct)播放结束 → 用 URL 识别为 leaf[N] → 下一集严格取 leaf[N+1] 之后的第一个非已完成项。
- 修复「播完下一集仍不按顺序乱跳」:
- 顶层统一调度:视频结束后由顶层挑选「目录项最多」的帧执行下一集,避免多个 iframe 同时点击导致乱跳;
- 子帧目录项不足 3 个时不再处理下一集,防止播放器画质选择(全高清等)被误当目录点击;
- 网梯平台直接调用
openLearnResItem(itemId, 'video', null, title),比点击元素更稳定; - 新增全局 8 秒跳转锁,防止重复触发下一集。
- 修复「播完跳转下集不按顺序、中间跳过的视频被误认为已看完」:
- 目录状态判定只信任平台真实标记(
completestate="1"、s_pointerct等),不再把当前项之前的所有课时默认标为已播; - 修复后:跳过未看的视频仍保持「待播」,课程总进度与待播数量与平台实际状态一致;
findNextItem严格按 DOM 顺序取当前项的下一个非已完成课时,避免跳集。
- 目录状态判定只信任平台真实标记(
- 修复「点击播放下一集仍跳回当前正在播放的视频」:
findWangtiCatalog移除.learn-menu(左侧导航)误命中,只认#learnMenu/.s_learnlist等真正的课程目录;- 目录容器搜索改为跨所有同域 iframe 取评分最高者,
.s_point[itemtype="video"]目录永远优先,左侧导航强烈减分; - 移除「兜底点击随机元素」逻辑(此前顶层帧找不到下一节时会乱点顶层元素,导致跳到当前视频);
- 「下一集」支持跨帧委托:没有目录的帧返回失败后,由顶层广播给拥有目录的子帧执行精准跳转,子帧成功即停止向下广播。
- 日志新增帧标识(
TOP/IFRAME|页面名),便于定位问题帧。
- 修复
collectItems中const candidates被重新赋值导致的Assignment to constant variable错误(该错误使目录分析中断)。 - 目录识别优先使用网梯平台专用
findWangtiCatalog,避免把左侧「课件/课程简介/学习进度」导航菜单当成课程目录。 - 在启发式评分里:包含
.s_point[itemtype="video"]大幅加分,包含.learn-menu-cell大幅减分。 collectItems增加过滤,排除左侧导航、播放器控件(高清/标清等)等非课时项。
- 加入设置版本迁移:升级后强制把「暂停自动续播」重置为关闭,避免旧设置残留导致继续触发平台警告。
- 进一步增强网梯平台目录识别:新增
findWangtiCatalog,直接命中#learnMenu/.s_learnlist/[class*="learnlist"],并以包含最多.s_point[itemtype="video"]的div作为兜底。
- 风险规避:默认关闭「暂停自动续播」,移除直接调用
video.play()的逻辑,改为仅在开启开关时模拟点击播放按钮。 - 降低视频进度上报频率(500ms → 2000ms)和子帧 ping 频率(1s → 3s),减少被平台检测为异常播放的可能性。
- 面板与弹窗对「暂停自动续播」增加 ⚠️ 风险提示。
- 修复目录识别为 0 项:增加对网梯平台
#learnMenu/.s_learnlist的直接命中与兜底选择。
- 针对网梯 / whaty-learnspace 课程平台做精准适配:
- 目录叶子项直接识别
.s_point[itemtype="video"],避免取到内部.wrap导致 class/状态丢失; - 已完成状态读取
completestate="1"属性; - 当前播放中状态识别
s_pointerct类; - 当前课时通过
onclick中的itemId与 URL 中的params.itemId前 8 位匹配,解决无<a href>时无法定位当前项的问题。
- 目录叶子项直接识别
- 课程总进度计算更准确:1 个已完成 + 1 个播放中 + 11 个待播 = 13 项。
- 目录识别只保留“带播放时长的视频课时”,剔除「第X讲」「章节」等非视频项,避免把 15 项误算成视频数。
- 当前课时定位增强:支持从目录项的
onclick/data-*属性中提取真实跳转链接,再与当前 iframe URL 匹配。 - 面板新增「复制日志」「复制目录HTML」按钮,可一键复制识别结果与目录 HTML,方便针对性适配。
- 调试日志改为输出全部课时的文本、类名、完成标记、跳转链接。
- 修复“所有课时都识别为已播、课程总进度 100%”的误报:
- 已完成检测更严格,避免
checkbox/checked等子元素误匹配; - 新增“URL 匹配”定位当前课时,适配 whaty / webtrn 类课程平台;
- 新增页面标题、章节标题匹配当前课时;
- 当全部课时都被标记为已完成、但当前视频尚未结束时,自动判定为误报并清空已完成标记。
- 已完成检测更严格,避免
- 调试日志默认输出目录分析详情,方便定位识别问题。
