Greasy Fork

Greasy Fork is available in English.

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

        }
    }
})();