// ==UserScript== // @name 上海交通大学 Canvas 平台课程视频播放器至尊版焕然一新插件 // @namespace http://tampermonkey.net/ // @version 1.6.0 // @description 优化上海交通大学 Canvas 平台录播观看功能 // @author danyang685 // @match https://oc.sjtu.edu.cn/* // @match https://courses.sjtu.edu.cn/* // @match https://vshare.sjtu.edu.cn/play/* // @icon data:image/png;base64,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 // @grant GM_info // @grant GM_addStyle // @grant unsafeWindow // @license MIT // @downloadURL none // ==/UserScript== /******************************************************************** 功能清单: [x] 将 vshare 网站的视频播放器替换为浏览器内置播放器 [x] 到达 Canvas 登录页时,自动跳转到 jAccount 登录页 [x] 允许在课前25分钟即开始观看课程直播 [x] 当距离上课还有超过40分钟时,访问【课程视频】自动切换到点播页面 [x] 禁用了打开后自动开始播放视频的特性 [x] 倍速列表选项优化(0.5-16倍) [x] 将全局右键屏蔽改为仅应用至视频区域 [x] 状态栏时间显示帧率优化(由1秒刷新加速为0.05秒刷新) [x] 加快状态栏功能弹窗隐藏速度 [x] 允许鼠标点击音量条任意位置设定音量并解除静音 [x] 可以使用鼠标滚轮调节音量了,调节时会在画面左上角显示当前音量 [x] 隐藏了小音量控制按钮,并在音量菜单增加了两路子音量控制 [x] 状态栏显示倍速 [x] 在调整倍速后自动关闭菜单 [x] 空格键或单击画面暂停/播放 [x] 双击画面全屏 [x] 左右方向键进行时移(3秒) [x] Ctrl+左右方向键进行快速时移(15秒) [x] Ctrl+Shift+左右方向键进行超快速时移(59秒) [x] 使用键盘快捷键【Enter】切换全屏 [x] 使用键盘快捷键ZXC进行变速控制 [x] 使用.键进入超慢速定位模式,方便寻找合适的时间点(替代不易实现的下一帧功能) [x] 使用键盘快捷键ASD进行默认播放速度调整 [x] 使用[Crtl]和数字1、2进行当前视频截图和保存 [x] 可以在小画面上使用鼠标滚轮缩放画面 [x] 修正视频变形问题(但导致了空边) [x] 将黑边修改为空白边 [x] 鼠标位于进度条上或拖动进度条时浮窗显示时刻 [x] 修复了暂停状态下改变进度条导致意外继续播放且进度条不再刷新的问题 [x] 为小窗视频略微增加透明度 [x] 修改点播默认音量设定为不静音,并移除静音说明 [x] 移除了底部课程信息区域,压缩页面高度 [x] 在右上角增加【在新标签页播放】按钮 [x] 清空了视频下方的说明文字 [x] 使右侧视频列表的内容更紧凑,并增加了教室显示,并去除了时间显示的00秒部分 [x] 列表好长好长好长的时候,自动将滚动条定位到当前视频条目 [x] 在视频列表顶部文字中显示视频总数 [x] 将直播中同一场课程的多个节次合并显示 [x] 修复了右侧视频栏中已激活的视频在部分场景下仍然可点击的bug [x] 使用配色糟糕的标签突出显示未观看过的视频 [x] 增加了画中画模式,并允许从设置中直接选择所需画面 [x] 仅有一路视频时,禁用了画面布局按钮 [x] 增加了双路视频手动同步功能,能够比较方便地进行画面同步 [x] 增加画面参数调整选项,可进行亮度、对比度、透明度的调节 [x] 支持注册 MediaSession 从而通过系统控制视频的播放与暂停 [x] 阻止向服务器回报观看日志 [x] 去除了页面中没有必要的滚动条 [x] 移除了缺乏使用场景的【停止播放】按钮 [x] 移除了直播页面中没有任何作用的【画质】按钮 [x] 自动更新cookie,防止页面会话失效 [x] 直播中没有电脑视频流时,以【仅现场画面】模式启动 [x] 从canvas内直接打开【视频点播】时,自动切换到上次观看的视频 [x] 打开视频后,自动跳转到上次观看的进度 [x] 打开视频后,自动载入上次的默认播放速度 [x] 为每个视频分别记忆时间同步参数,下次观看无需再设置 [x] 重新打开时,记忆上次的小画面尺寸 [x] 不同canvas用户之间,个人观看偏好不互通 [x] 允许通过点击顶部当前标签页重新载入当前网页 [x] 通过增加边框使右侧视频列表更有质感 [x] 将画面背景色由廉价的灰色改为圣洁白 [x] 将播放控制栏底色由廉价的灰色改为至尊黑 [x] 本插件顺利生效时,顶部标签卡颜色为金色 *********************************************************************/ (function () { 'use strict'; let script_version = GM_info.script.version; // 本脚本的版本号 let window = unsafeWindow; // 脚本中使用GM函数后,必须使用 unsafeWindow 才可覆盖原有 window 事件回调函数 // 登录页面,要求选 jAccount 或校外用户登录 let is_canvas_login = window.location.href == "https://oc.sjtu.edu.cn/login/canvas"; // 点播页面,包括 Canvas 内置的和 courses.sjtu 网站上的 let is_canvas_vod_page = window.location.href.startsWith("https://courses.sjtu.edu.cn/lti/app/lti/vodVideo/playPage") || window.location.href.startsWith("https://courses.sjtu.edu.cn/app/vodvideo/vodVideoPlay.d2j"); // 直播页面,Canvas 内置的 let is_canvas_live_page = window.location.href.startsWith("https://courses.sjtu.edu.cn/lti/app/lti/liveVideo/index.d2j"); // 课程视频 LTI 插件页面 let is_canvas_lti162_page = new RegExp("https://oc\.sjtu\.edu\.cn/courses/\\d*/external_tools/162").test(window.location.href); // vshare 视频页面 let is_vshare_page = window.location.href.startsWith("https://vshare.sjtu.edu.cn/play/") // 处于 iframe 内 let is_iframe = (self != top); // 检查是否为安卓设备 function isAndroid() { return navigator.userAgent.includes("Android"); } // 允许进一步缩放 if (isAndroid()) { // 怎么会一点也不起作用呢?一定是哪里出了问题,不应当不应当! // document.getElementById("viewport").setAttribute("content", "height=520, initial-scale=0, minimum-scale=0.25, maximum-scale=1.0, user-scalable=yes"); } // 到达 Canvas 登录页时,自动跳转到 jAccount 登录页 if (is_canvas_login) { window.location.replace("https://oc.sjtu.edu.cn/login/openid_connect"); } // LTI插件页面 else if (is_canvas_lti162_page) { $(document).ready(function () { // 去除了页面中多余的滚动条 let clear_resize_event_interval = setInterval(function () { $(window).off("resize"); //删除疑似画蛇添足的resize事件,瞎删除1百次就行吧 $(".tool_content_wrapper").attr("style", ""); $("#tool_content").css("min-height", "545px"); }, 100); setTimeout(() => clearInterval(clear_resize_event_interval), 10000); // 去除了左侧的空白区域 $(".ic-Layout-contentMain") .css("height", "100%") .css("padding", "0"); $("#tool_content") .css("min-height", "600px"); // 自动更新cookie,防止页面会话失效 function help_refresh_session() { $("body").append('