// ==UserScript==
// @name chinahrt继续教育
// @include http://web.chinahrt.com
// @include https://web.chinahrt.com
// @version 2.4.1
// @description 全新2.0版本,可以自行添加播放列表(彻底解放双手,请到课程详情中添加),自动开始并静音,播放速度控制,进度拖动。增加配置面板,可以自由调节。
// @author yikuaibaiban(https://github.com/yikuaibaiban)
// @match http://*.chinahrt.com/*
// @match https://*.chinahrt.com/*
// @match http://videoadmin.chinahrt.com.cn/videoPlay/play*
// @match http://videoadmin.chinahrt.com/videoPlay/play*
// @match https://videoadmin.chinahrt.com.cn/videoPlay/play*
// @match https://videoadmin.chinahrt.com/videoPlay/play*
// @grant none
// @license MIT
// @namespace https://github.com/yikuaibaiban/chinahrt
// @downloadURL none
// ==/UserScript==
window.onload = function() {
function getCourses() {
var json = localStorage.getItem('courses');
if (json) {
json = JSON.parse(json);
} else {
json = [];
}
return json;
}
// 刷新播放列表
function refreshPlaylist() {
if (!playlistDiv) {
// 播放列表
playlistDiv = document.createElement('div');
playlistDiv.style.cssText = "position:fixed;right:255px;top:0;width:250px;height:400px;background-color:#FFF;z-index:9999;border: 1px solid #ccc;overflow: auto;";
document.body.appendChild(playlistDiv);
} else {
playlistDiv.innerHTML = "";
}
// 获取localStorage 转换为 json
var json = getCourses();
for (var i = 0; i < json.length; i++) {
var _t = document.createElement('div');
_t.style.fontSize = "12px";
_t.style.overflow = "hidden";
_t.style.whiteSpace = "nowrap";
_t.style.textOverflow = "ellipsis";
_t.innerText = i + 1 + " " + json[i].title;
playlistDiv.appendChild(_t);
}
}
var href = window.location.href;
// 播放列表
var playlistDiv;
// 课程页面 /course/preview
if (href.indexOf('/course/preview') > -1) {
var button = document.createElement("button");
button.innerHTML = "添加到播放列表";
button.style.fontSize = "20px";
button.style.border = "1px solid rgb(204, 204, 204)";
button.style.borderRadius = "5px";
button.style.padding = "5px 10px";
button.style.background = "#4bccf2";
button.style.color = "#fff";
button.style.marginTop = "10px";
button.style.cursor = "pointer";
button.onclick = function() {
// 获取localStorage 转换为 json
var json = getCourses();
var allCourses = document.getElementsByClassName("memu-in")[0].getElementsByTagName("li");
for (var i = 0; i < allCourses.length; i++) {
if (allCourses[i].getElementsByTagName("span")[0].innerText.indexOf("已学完") == -1) {
var flag = 0;
for (var j = 0; j < json.length; j++) {
if (json[j].href == allCourses[i].getElementsByTagName("a")[0].href) {
flag = 1;
break;
}
}
if (flag == 0) {
json.push({
"title": allCourses[i].getElementsByTagName("a")[0].innerText,
"href": allCourses[i].getElementsByTagName("a")[0].href
});
}
}
}
// 存储到localStorage
localStorage.setItem('courses', JSON.stringify(json));
alert("添加完成");
}
document.getElementsByClassName("menu")[0].insertBefore(button, document.getElementsByClassName("menu")[0].lastChild);
}
// 课程页面 /course/play_video
if (href.indexOf('/course/play_video') > -1) {
refreshPlaylist();
setInterval(() => {
refreshPlaylist();
}, 5000);
window.addEventListener("message", function(e) {
// 获取localStorage 转换为 json
var json = getCourses();
var newJson = new Array();
for (var i = 0; i < json.length; i++) {
// 正则提取 href 中 sectionId courseId trainplanId
var jsonHref = json[i].href;
var jsonSectionId = jsonHref.match(/sectionId=([^&]*)/)[1];
var jsonCourseId = jsonHref.match(/courseId=([^&]*)/)[1];
var jsonTrainplanId = jsonHref.match(/trainplanId=([^&]*)/)[1];
// 正则提取 window.location.href 中 sectionId courseId trainplanId
var href = window.location.href;
var sectionId = href.match(/sectionId=([^&]*)/)[1];
var courseId = href.match(/courseId=([^&]*)/)[1];
var trainplanId = href.match(/trainplanId=([^&]*)/)[1];
if (jsonCourseId == courseId && jsonSectionId == sectionId && jsonTrainplanId == trainplanId) {
continue;
}
newJson.push(json[i]);
}
localStorage.setItem("courses", JSON.stringify(newJson));
if (newJson.length > 0) {
window.top.location.href = newJson[0].href;
} else {
alert("课程列表已经播放完毕");
}
});
}
// 播放页面
if (href.indexOf('/videoPlay/play') > -1) {
$(document).ready(function() {
// 顶端漂浮提示
var $topTips = $('
' +
'点击课程详情页中的插件提供的【添加到播放列表】按钮添加需要自动播放的课程' +
'
受到浏览器策略影响第一次可能无法自动播放,请手动点击播放。
');
$(document.body).append($topTips);
// 从localstorage中获取设置
var autoplay = (localStorage.getItem('autoplay') || 'true') === 'true';
var mute = (localStorage.getItem('mute') || 'true') === 'true';
var speed = parseInt(localStorage.getItem('speed') || '1');
var drag = parseInt(localStorage.getItem('drag') || '5');
// ==================页面设计开始==========================
// 增加页面配置
var configDiv = document.createElement("div");
configDiv.style.cssText = "position:fixed;right:0;top:0;width:250px;height:400px;background-color:#FFF;z-index:9999;border: 1px solid #ccc;";
// 标题
var configTitle = document.createElement("div");
configTitle.style.cssText = "border-bottom:1px solid #ccc ;padding: 5px;font-weight: bold;";
configTitle.innerHTML = "视频控制配置";
configDiv.appendChild(configTitle);
// 外部包裹
var configWrapper = document.createElement("div");
configWrapper.style.cssText = "padding: 5px;padding-bottom: 5px;font-size: 12px;line-height: 150%;";
// 是否自动播放
var configAutoPlay = document.createElement("div");
configAutoPlay.style.cssText = "border-bottom: 1px dotted #ccc ;padding-bottom: 5px;";
var p = document.createElement("p");
p.innerHTML = "是否自动播放:";
configAutoPlay.appendChild(p);
var inputAutoPlay = document.createElement("input");
inputAutoPlay.type = "radio";
inputAutoPlay.name = "autoPlay";
inputAutoPlay.value = "true";
inputAutoPlay.checked = autoplay;
inputAutoPlay.onclick = function() {
localStorage.setItem('autoplay', 'true');
}
configAutoPlay.appendChild(inputAutoPlay);
var labelAutoPlay = document.createElement("label");
labelAutoPlay.innerHTML = "是";
configAutoPlay.appendChild(labelAutoPlay);
var inputAutoPlay2 = document.createElement("input");
inputAutoPlay2.type = "radio";
inputAutoPlay2.name = "autoPlay";
inputAutoPlay2.value = "false";
inputAutoPlay2.checked = !autoplay;
inputAutoPlay2.onclick = function() {
localStorage.setItem('autoplay', 'false');
}
configAutoPlay.appendChild(inputAutoPlay2);
var labelAutoPlay2 = document.createElement("label");
labelAutoPlay2.innerHTML = "否";
configAutoPlay.appendChild(labelAutoPlay2);
configWrapper.appendChild(configAutoPlay);
// 是否静音
var configMute = document.createElement("div");
configMute.style.cssText = "border-bottom: 1px dotted #ccc ;padding-bottom: 5px;";
var p = document.createElement("p");
p.innerHTML = "是否静音:";
configMute.appendChild(p);
var inputMute = document.createElement("input");
inputMute.type = "radio";
inputMute.name = "mute";
inputMute.value = "true";
inputMute.checked = mute;
inputMute.onclick = function() {
localStorage.setItem('mute', 'true');
player.videoMute();
}
configMute.appendChild(inputMute);
var labelMute = document.createElement("label");
labelMute.innerHTML = "是";
configMute.appendChild(labelMute);
var inputMute2 = document.createElement("input");
inputMute2.type = "radio";
inputMute2.name = "mute";
inputMute2.value = "false";
inputMute2.checked = !mute;
inputMute2.onclick = function() {
localStorage.setItem('mute', 'false');
player.videoEscMute();
}
configMute.appendChild(inputMute2);
var labelMute2 = document.createElement("label");
labelMute2.innerHTML = "否";
configMute.appendChild(labelMute2);
var muteTip = document.createElement("p");
muteTip.style.cssText = "font-size:13px;font-weight:bold;";
muteTip.innerHTML = "注意:不静音,视频可能会出现不会自动播放";
configMute.appendChild(muteTip);
configWrapper.appendChild(configMute);
// 启用拖放
var configDrag = document.createElement("div");
configDrag.style.cssText = "border-bottom: 1px dotted #ccc ;padding-bottom: 5px;";
var p = document.createElement("p");
p.innerHTML = "启用拖放(慎用):";
configDrag.appendChild(p);
var inputDrag = document.createElement("input");
inputDrag.type = "radio";
inputDrag.name = "drag";
inputDrag.value = "5";
inputDrag.checked = drag === 5;
inputDrag.onclick = function() {
localStorage.setItem('drag', '5');
player.changeConfig('config', 'timeScheduleAdjust', 5);
}
configDrag.appendChild(inputDrag);
var labelDrag = document.createElement("label");
labelDrag.innerHTML = "还原";
configDrag.appendChild(labelDrag);
var inputDrag2 = document.createElement("input");
inputDrag2.type = "radio";
inputDrag2.name = "drag";
inputDrag2.value = "1";
inputDrag2.checked = drag === 1;
inputDrag2.onclick = function() {
localStorage.setItem('drag', '1');
player.changeConfig('config', 'timeScheduleAdjust', 1);
}
configDrag.appendChild(inputDrag2);
var labelDrag2 = document.createElement("label");
labelDrag2.innerHTML = "启用";
configDrag.appendChild(labelDrag2);
configWrapper.appendChild(configDrag);
// 播放速度调整
var configSpeed = document.createElement("div");
configSpeed.style.cssText = "border-bottom: 1px dotted #ccc ;padding-bottom: 5px;";
var p = document.createElement("p");
p.innerHTML = "播放速度调整(慎用,不知后台是否检测):";
configSpeed.appendChild(p);
var inputSpeed = document.createElement("input");
inputSpeed.type = "radio";
inputSpeed.name = "speed";
inputSpeed.value = "0";
inputSpeed.checked = speed === 0;
inputSpeed.onclick = function() {
localStorage.setItem('speed', '0');
player.changePlaybackRate(0);
}
configSpeed.appendChild(inputSpeed);
var labelSpeed = document.createElement("label");
labelSpeed.innerHTML = "低速";
configSpeed.appendChild(labelSpeed);
var inputSpeed2 = document.createElement("input");
inputSpeed2.type = "radio";
inputSpeed2.name = "speed";
inputSpeed2.value = "1";
inputSpeed2.checked = speed === 1;
inputSpeed2.onclick = function() {
localStorage.setItem('speed', '1');
player.changePlaybackRate(1);
}
configSpeed.appendChild(inputSpeed2);
var labelSpeed2 = document.createElement("label");
labelSpeed2.innerHTML = "正常";
configSpeed.appendChild(labelSpeed2);
var inputSpeed3 = document.createElement("input");
inputSpeed3.type = "radio";
inputSpeed3.name = "speed";
inputSpeed3.value = "2";
inputSpeed3.checked = speed === 2;
inputSpeed3.onclick = function() {
localStorage.setItem('speed', '2');
player.changePlaybackRate(2);
}
configSpeed.appendChild(inputSpeed3);
var labelSpeed3 = document.createElement("label");
labelSpeed3.innerHTML = "高速";
configSpeed.appendChild(labelSpeed3);
var inputSpeed4 = document.createElement("input");
inputSpeed4.type = "radio";
inputSpeed4.name = "speed";
inputSpeed4.value = "3";
inputSpeed4.checked = speed === 3;
inputSpeed4.onclick = function() {
localStorage.setItem('speed', '3');
player.changePlaybackRate(3);
}
configSpeed.appendChild(inputSpeed4);
var labelSpeed4 = document.createElement("label");
labelSpeed4.innerHTML = "超高速";
configSpeed.appendChild(labelSpeed4);
var speedTip = document.createElement("div");
speedTip.style.cssText = "font-size:13px;font-weight:bold;";
speedTip.innerHTML = "提示:基于播放器本身的速度挡位实现,目测最高大概是2倍速。";
configSpeed.appendChild(speedTip);
configWrapper.appendChild(configSpeed);
configDiv.appendChild(configWrapper);
// 联系方式
var contactDiv = document.createElement("div");
contactDiv.style.cssText = "margin-top:10px;font-size:12px;font-weight:bold;line-height: 150%;";
// 博客园地址
var blogDiv = document.createElement("div");
var blog = document.createElement("a");
blog.href = "https://www.cnblogs.com/ykbb/";
blog.target = "_blank";
blog.innerHTML = "博客园地址";
blogDiv.appendChild(blog);
contactDiv.appendChild(blogDiv);
// 意见反馈
var feedbackDiv = document.createElement("div");
var feedback = document.createElement("a");
feedback.href = "https://msg.cnblogs.com/send/ykbb";
feedback.target = "_blank";
feedback.innerHTML = "点此意见反馈";
feedbackDiv.appendChild(feedback);
contactDiv.appendChild(feedbackDiv);
configDiv.appendChild(contactDiv);
document.body.appendChild(configDiv);
// ==================页面设计结束==========================
// 测试
var testBtn = document.createElement("button");
testBtn.style.position = "fixed";
testBtn.style.left = "0";
testBtn.style.top = "0";
testBtn.innerHTML = "测试";
// testBtn.style.display = "none";
testBtn.onclick = function() {
player.videoSeek(player.getMetaDate().duration - 2);
}
document.body.appendChild(testBtn);
$("video").prop("muted", "muted");
// 移除讨厌的事件
window.onfocus = function() {};
window.onblur = function() {};
// 移除本课程学习完毕
attrset.proxyUrl = "";
function run() {
// 总是显示播放进度
player.changeControlBarShow(true);
// 拖动开关
player.changeConfig('config', 'timeScheduleAdjust', drag);
if (mute) {
player.videoMute();
} else {
player.videoEscMute();
}
player.changePlaybackRate(speed);
if (autoplay) {
player.videoPlay();
}
}
var tmp = setInterval(function() {
if (player != undefined) {
player.addListener('loadedmetadata', run);
run();
clearInterval(tmp);
// 播放结束
player.addListener('ended', function() {
// 通知父窗体播放结束
window.parent.postMessage("ended", '*');
});
}
}, 500);
});
}
}