CoursePlayback

add hotkey to pku course playback

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         CoursePlayback
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  add hotkey to pku course playback
// @author       shanqiaosong
// @match        https://livingroomhqy.pku.edu.cn/player*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

(function () {
    var version = '4.8.37.20200917'
    var CmcMediaPlayer = function (_id, _playervars) {
        // console.log('CmcMediaPlayer this =', this)

        this.root = document.getElementById(_id);
        this.id = _id;
        this.playervars = _playervars;
        this.cmcPlayer = null;
        this.ieFlashPlayer = null;
        this.mobilePlayer = null;

        this.getPlayerById = null;
        this.screenshot = null;
        this.Screenshot = null;
        this.ScreenShot = null;
        this.screenShot = null;
        this.playerPlay = null;
        this.seekAndPause = null;
        this.pausePlay = null;
        this.resumePlay = null;
        this.stopPlay = null;
        this.changePlay = null;
        this.PlayNew = null;
        this.playSlice = null;
        this.getPlayTime = null;
        this.getDuration = null;

        this.getBrowser = function () {
            var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
            var mobile = !!userAgent.match(/AppleWebKit.*Mobile.*/) || !!userAgent.match(/AppleWebKit/) && userAgent.indexOf('QIHU') > -1 && userAgent.indexOf('Chrome') < 0
            // var mobile = userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
            var browser = {};
            var type = '';
            if (mobile) {
                type = 'mobile'
                if (userAgent.indexOf('UCBrowser') > -1) { type = 'uc' }
                if (userAgent.indexOf('iPhone') > -1) { type = 'iPhone' }
                if (userAgent.indexOf('iPad') > -1) { type = 'iPad' }
                if (userAgent.indexOf('MicroMessenger') > -1) { type = 'weixin' }
                if (userAgent.match(/\sQQ/i) == " qq") { type = 'qq' }

                browser.type = type;
                browser.mobile = true;

                if (userAgent.indexOf('WindowsWechat') > -1) browser.mobile = false
            }
            else {
                if (userAgent.indexOf('Opera') > -1) { type = 'opera' }
                if (userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1) { type = 'safari' }
                if (userAgent.indexOf('Chrome/') >= 0 && userAgent.indexOf('WebKit') >= 0) { type = 'chrome' }
                if (userAgent.indexOf("Edge") > -1) { type = 'edge' }
                if (userAgent.indexOf("Firefox") > -1) { type = 'firefox' }
                if (window.ActiveXObject || "ActiveXObject" in window) {
                    var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
                    reIE.test(userAgent);
                    var fIEVersion = parseFloat(RegExp["$1"]);
                    if (userAgent.indexOf('MSIE 6.0') != -1) {
                        type = "IE6";
                    }
                    else if (fIEVersion == 7) { type = "IE7"; }
                    else if (fIEVersion == 8) { type = "IE8"; }
                    else if (fIEVersion == 9) { type = "IE9"; }
                    else if (fIEVersion == 10) { type = "IE10"; }
                    else if (userAgent.toLowerCase().match(/rv:([\d.]+)\) like gecko/)) {
                        type = "IE11";
                    }
                    else { type = "IE" }//IE版本过低
                }
                browser.type = type;
                browser.mobile = false;
            }
            return browser;
        }

        var self = this;
        var loadJS = function (url, callback) {
            var script = document.createElement('script');
            script.type = 'text/javascript';
            script.src = url;
            if (typeof callback == 'function') {
                script.onload = script.onreadystatechange = function () {
                    if (!script.readyState || script.readyState == 'loaded'
                        || script.readyState == 'complete') {
                        callback();
                        script.onload = script.onreadystatechange = null;
                    }
                }
                script.onerror = function(e){
                    console.log('load js error =',e,url)
                }
            }
            document.body.appendChild(script);
        }

        var browser = this.getBrowser();
        var url = '';
        if (browser.mobile) {
            //调用手机播放器
            if(window.hasOwnProperty('CmcMobilePlayer')&&CmcMobilePlayer){
                self.mobilePlayer = new CmcMobilePlayer(_id, _playervars);
                // console.log('mobilePlayer 1=',self.mobilePlayer)
                for (var key in self.mobilePlayer) {
                    self[key] = self.mobilePlayer[key]
                }
                self.getPlayerById = function(){
                    return self.mobilePlayer;
                }
                self.resize = function(){}
            }
            else {
                url = './mobile/cmcMobilePlayer.js';
                if (self.playervars.hasOwnProperty('fileHost')) {
                    url = self.playervars.fileHost + 'mobile/cmcMobilePlayer.js';
                }
                // url = 'http://localhost:8301/cmcMobilePlayer.js'
                url = url + `?v=${version}`
                loadJS(url, function () {
                    // console.log('cmcPlayer this =', self)
                    self.mobilePlayer = new CmcMobilePlayer(_id, _playervars);
                    // console.log('mobilePlayer 2=',self.mobilePlayer,Object.keys(self.mobilePlayer))
                    for (var key in self.mobilePlayer) {
                        self[key] = self.mobilePlayer[key]
                    }
                    self.getPlayerById = function(){
                        return self.mobilePlayer;
                    }
                    self.resize = function(){}
                })
            }

        }
        else {

            if (browser.type=='IE9'||browser.type=='IE8'||browser.type=='IE6'||browser.type=='IE7'||browser.type=='IE') {
                // console.log('低版本ie 用flash')

                var ieFlashId = 'cmc_flash_'+self.id;
                self.ieFlashPlayer = document.createElement('div');
                self.ieFlashPlayer.id = ieFlashId;
                self.root.appendChild(self.ieFlashPlayer);

                var swfVersionStr = '11.4.0';
                var xiSwfUrlStr = '';
                var params = {};
                params.quality = 'high';
                params.bgcolor = '#ffffff';
                params.wmode = "transparent";
                params.allowscriptaccess = 'always';
                params.allowfullscreen = 'true';
                params.allowfullscreeninteractive = 'true';
                var attributes = {};
                attributes.id = ieFlashId;
                attributes.name = ieFlashId;
                attributes.align = 'middle';

                var flashvars = JSON.parse(JSON.stringify(self.playervars)); //Object.assign({}, self.playervars);
                flashvars.switchPlayer = false;
                flashvars.filePath = 'flash/';

                if(window.hasOwnProperty('swfobject')&&swfobject){

                    // console.log('swfUrl =',swfUrl)
                    swfobject.embedSWF(swfUrl, ieFlashId, self.playervars.width, self.playervars.height, swfVersionStr, xiSwfUrlStr, flashvars, params, attributes);

                    self.getPlayerById = function(){
                        return swfobject.getObjectById(ieFlashId);
                    };
                    self.screenshot = function(type, w, h, p, enable){
                        var fl = swfobject.getObjectById(ieFlashId);
                        return fl.screenshot(type, w, h, p, enable);
                    };
                    self.Screenshot = function(type, w, h, p, enable){
                        self.screenshot(type, w, h, p, enable);
                    };
                    self.ScreenShot = function(type, w, h, p, enable){
                        self.screenshot(type, w, h, p, enable);
                    };
                    self.screenShot = function(type, w, h, p, enable){
                        self.screenshot(type, w, h, p, enable);
                    };
                    self.playerPlay = function(obj){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.playerPlay(obj);

                        self.playervars.url = obj.url;
                        if(obj.hasOwnProperty('mediaType')){
                            self.playervars.mediaType = obj.mediaType;
                        }
                    };
                    self.seekAndPause = function(){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.seekAndPause();
                    };
                    self.pausePlay = function(){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.pausePlay();
                    };
                    self.resumePlay = function(){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.resumePlay();
                    };
                    self.stopPlay = function(){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.stopPlay();
                    };
                    self.changePlay = function(param){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.changePlay(param);
                    };
                    self.PlayNew = function(url,type){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.PlayNew();
                    };
                    self.getPlayTime = function(){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.getPlayTime();
                    };
                    self.getDuration = function(){
                        var fl = swfobject.getObjectById(ieFlashId);
                        fl.getDuration();
                    };
                }
                else {
                    url = './lib/swfobject.js';
                    if (self.playervars.hasOwnProperty('fileHost')) {
                        url = self.playervars.fileHost + 'lib/swfobject.js';
                    }

                    loadJS(url, function () {
                        // console.log('swfobject =', swfobject)
                        swfobject.embedSWF(swfUrl, ieFlashId, self.playervars.width, self.playervars.height, swfVersionStr, xiSwfUrlStr, flashvars, params, attributes);

                        self.getPlayerById = function(){
                            return swfobject.getObjectById(ieFlashId);
                        };
                        self.screenshot = function(type, w, h, p, enable){
                            var fl = swfobject.getObjectById(ieFlashId);
                            return fl.screenshot(type, w, h, p, enable);
                        };
                        self.Screenshot = function(type, w, h, p, enable){
                            self.screenshot(type, w, h, p, enable);
                        };
                        self.ScreenShot = function(type, w, h, p, enable){
                            self.screenshot(type, w, h, p, enable);
                        };
                        self.screenShot = function(type, w, h, p, enable){
                            self.screenshot(type, w, h, p, enable);
                        };
                        self.playerPlay = function(obj){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.playerPlay(obj);

                            self.playervars.url = obj.url;
                            if(obj.hasOwnProperty('mediaType')){
                                self.playervars.mediaType = obj.mediaType;
                            }
                        };
                        self.seekAndPause = function(){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.seekAndPause();
                        };
                        self.pausePlay = function(){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.pausePlay();
                        };
                        self.resumePlay = function(){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.resumePlay();
                        };
                        self.stopPlay = function(){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.stopPlay();
                        };
                        self.changePlay = function(param){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.changePlay(param);
                        };
                        self.PlayNew = function(url,type){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.PlayNew();
                        };
                        self.getPlayTime = function(){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.getPlayTime();
                        };
                        self.getDuration = function(){
                            var fl = swfobject.getObjectById(ieFlashId);
                            fl.getDuration();
                        };
                    })
                }

            }
            else {
                // console.log('调用cmcPlayer 兼容播放器')
                //判断是否已加载cmcPlayer.js
                if(window.hasOwnProperty('CmcPCPlayer')&&CmcPCPlayer){
                    self.cmcPlayer = new CmcPCPlayer(_id, _playervars);
                    for (var key in self.cmcPlayer) {
                        self[key] = self.cmcPlayer[key]
                    }
                }
                else {
                    url = './cmcPlayer.js';
                    if (self.playervars.hasOwnProperty('fileHost')) {
                        url = self.playervars.fileHost + 'cmcPlayer.js';
                    }
                    url = url + `?v=${version}`
                    // console.log('cmcPlayer js = ',url)
                    loadJS(url, function () {
                        // console.log('cmcPlayer this =', self)
                        self.cmcPlayer = new CmcPCPlayer(_id, _playervars);
                        window.cmcPlayer=self.cmcPlayer
                        // console.log('self.cmcPlayer =',self.cmcPlayer)
                        for (var key in self.cmcPlayer) {
                            self[key] = self.cmcPlayer[key]
                        }
                    })
                }

            }
        }

    }

    if (typeof module === "object" && module && typeof module.exports === "object") {
        module.exports = CmcMediaPlayer;// CommonJS

    } else {
        if (typeof define === "function" && define.amd) {
            define("CmcMediaPlayer", [], function () { return CmcMediaPlayer; });// AMD
        }
        if (typeof window === "object" && typeof window.document === "object") {
            window.CmcMediaPlayer = CmcMediaPlayer;
            window.CmcPlayer = CmcMediaPlayer
        }
    }
})();

    let nowSpeed=2
    const speeds=[0.5,0.75,1,1.25,1.5,2.0,2.5,3,4.0]
    function prompt(txt){
        let p=document.createElement('div')
        p.innerHTML=txt
        p.style.width= '200px'
        p.style.position= 'fixed'
        p.style.top= '20px'
        p.style.left= '0px'
        p.style.right= '0px'
        p.style.margin= '0px auto'
        p.style.height= '40px'
        p.style.background= '#ffffffeb'
        p.style.textAlign= 'center'
        p.style.fontSize= '15px'
        p.style.lineHeight= '40px'
        p.style.borderRadius= '5px'
        p.style.backdropFilter= 'blur(4px)'
        p.style.boxShadow= '#00000059 1px 1px 19px 0px'
        p.style.zIndex= '10000000'
        p.style.transition= '0.5s all'
        document.body.appendChild(p)
        setTimeout(()=>{
            p.style.opacity='0'
        },1000)
    }
    document.onkeydown=(e)=>{
        console.log(e)
        if(e.key==='.'){
            nowSpeed=Math.min(8,Math.max(0,nowSpeed+1))
            window.cmcPlayer.h5Player.Pure.observerMap.play_speed_change[0]({name:'play_speed_change',body:speeds[nowSpeed]})
            prompt('速度: '+speeds[nowSpeed])
        }
        if(e.key===','){
            nowSpeed=Math.min(8,Math.max(0,nowSpeed-1))
            window.cmcPlayer.h5Player.Pure.observerMap.play_speed_change[0]({name:'play_speed_change',body:speeds[nowSpeed]})
            prompt('速度: '+speeds[nowSpeed])
        }
        if(e.key==='b'){
            window.cmcPlayer.seekPlay(window.cmcPlayer.getPlayTime()-3+10*60)
            prompt('跳过课间(10分钟) ')

        }
    }
})();