Greasy Fork

chinahrt继续教育

全新2.0版本,自动播放下一章节,自动开始并静音,播放速度控制,进度拖动。增加配置面板,可以自由调节。

当前为 2022-05-13 提交的版本,查看 最新版本

// ==UserScript==
// @name         chinahrt继续教育
// @include      http://web.chinahrt.com
// @include      https://web.chinahrt.com
// @version      2.3
// @description  全新2.0版本,自动播放下一章节,自动开始并静音,播放速度控制,进度拖动。增加配置面板,可以自由调节。
// @author       yikuaibaiban(https://github.com/yikuaibaiban)
// @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
// ==/UserScript==

window.onload = function() {
    if (document.head.getElementsByTagName("title")[0].innerText == "404") {
        var h1 = document.createElement('h1');
        h1.innerHTML = '课程已经播放完成,请更换课程!';
        h1.style.color = 'red';
        h1.style.fontSize = '30px';
        h1.style.textAlign = 'center';
        h1.style.marginTop = '50px';
        document.body.append(h1);

        alert('课程已经播放完成,请更换课程!');
        return;
    }


    $(document).ready(function() {
        // (function () {
        // 'use strict';

        // 顶端漂浮提示
        var $topTips = $('<div style="position: fixed;top:0;left:10%;font-size:16px;font-weight: bold;color:red;background: #FFF;">受到浏览器策略影响第一次可能无法自动播放,请手动点击播放。</div>');
        $(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);
        // ==================页面设计结束==========================

        $("video").prop("muted", "muted");

        // 移除讨厌的事件
        window.onfocus = function() {};
        window.onblur = function() {};

        var tmp = setInterval(function() {
            if (player && player.loaded) {
                player.addListener('loadedmetadata', function() {
                    // 总是显示播放进度
                    player.changeControlBarShow(true);

                    // 拖动开关
                    player.changeConfig('config', 'timeScheduleAdjust', drag);

                    if (mute) {
                        player.videoMute();
                    } else {
                        player.videoEscMute();
                    }

                    player.changePlaybackRate(speed);

                    if (autoplay) {
                        player.videoPlay();
                    }
                    clearInterval(tmp);
                });

                // 播放结束
                player.addListener('ended', function() {
                    var url = window.location.href;
                    var sectionId = /sectionId=([^&]*)/.exec(url)[1];
                    var courseId = sectionId.split('-')[0];
                    var sectionId = sectionId.split('-')[1];
                    var sectionId = parseInt(sectionId) + 1;
                    var newUrl = url.replace(/sectionId=([^&]*)/, 'sectionId=' + courseId + '-' + sectionId);
                    window.location.href = newUrl;
                });
            }
        }, 500);
    });
}