CoursePlayback

add hotkey to pku course playback

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==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分钟) ')

        }
    }
})();