Greasy Fork

Greasy Fork is available in English.

BilibiliTimer

B站H5播放器全屏时实时显示当前系统时间

当前为 2017-06-08 提交的版本,查看 最新版本

// ==UserScript==
// @name         BilibiliTimer
// @version      1.1.2
// @description  B站H5播放器全屏时实时显示当前系统时间
// @author       AnnAngela
// @match        *://www.bilibili.com/video/*
// @match        *://www.bilibili.com/html/*layer.htm*
// @run-at       document-start
// @grant        unsafeWindow
// @namespace    http://greasyfork.icu/users/129402
// ==/UserScript==

(function() {
    'use strict';
    /* 防止重复加载 */
    if (unsafeWindow.BilibiliTimer) return;
    unsafeWindow.BilibiliTimer = true;
    /*
     * 出于实现上的考虑,以下代码被保存为纯文本,并通过unsafeWindow.eval运行,以操作真实环境下的DOM节点
     */
    var code = [
        "\"use strict\";",
        "var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function(obj) {",
        "    return typeof obj;",
        "} : function(obj) {",
        "    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;",
        "};",
        "function _inherits(subClass, superClass) {",
        "    if (typeof superClass !== \"function\" && superClass !== null) {",
        "        throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof(superClass)));",
        "    }",
        "    subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });",
        "    if (superClass) {",
        "        if (Object.setPrototypeOf) Object.setPrototypeOf(subClass, superClass);",
        "        else subClass.__proto__ = superClass;",
        "    }",
        "}",
        "function _classCallCheck(instance, Constructor) {",
        "    if (!(instance instanceof Constructor)) {",
        "        throw new TypeError(\"Cannot call a class as a function\");",
        "    }",
        "}",
        "function _possibleConstructorReturn(self, call) {",
        "    if (!self) {",
        "        throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");",
        "    }",
        "    return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof(call)) === \"object\" || typeof call === \"function\") ? call : self;",
        "}",
        "var BilibiliPlayerDate = function(_Date) {",
        "    _inherits(BilibiliPlayerDate, _Date);",
        "    function BilibiliPlayerDate() {",
        "        var _ref;",
        "        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; }",
        "        _classCallCheck(this, BilibiliPlayerDate);",
        "        var _this = _possibleConstructorReturn(this, (_ref = BilibiliPlayerDate.__proto__ || Object.getPrototypeOf(BilibiliPlayerDate)).call.apply(_ref, [this].concat(args)));",
        "        [\"getDate\", \"getFullYear\", \"getHours\", \"getMilliseconds\", \"getMinutes\", \"getMonth\", \"getSeconds\", \"getTime\", \"getUTCDate\", \"getUTCFullYear\", \"getUTCHours\", \"getUTCMilliseconds\", \"getUTCMinutes\", \"getUTCMonth\", \"getUTCSeconds\", \"getYear\"].forEach(function(key) {",
        "            _this[key] = function() {",
        "                var result = Date.prototype[key].apply(this, arguments);",
        "                if (key.includes('Month')) result++;",
        "                if (typeof result === 'number' && (result + '').length === 1) return \"0\" + result;",
        "                else return result + '';",
        "            };",
        "        });",
        "        return _this;",
        "    }",
        "    return BilibiliPlayerDate;",
        "}(Date);",
        "var timer = $('<div/>');",
        "timer.attr('id', 'BilibiliTimer');",
        "var globallock = false;",
        "timer.css({",
        "    background: 'rgba(28,28,28,.8)',",
        "    'border-radius': '4px',",
        "    color: '#fff',",
        "    'font-family': '\"Noto Sans CJK SC DemiLight\",Roboto,\"Segoe UI\",Tahoma,Arial,Helvetica,sans-serif',",
        "    '-webkit-font-smoothing': 'antialiased',",
        "    position: 'absolute',",
        "    'z-index': '64',",
        "    padding: '15px 36px 15px 15px',",
        "    display: 'none',",
        "    cursor: 'move'",
        "});",
        "if (!localStorage.getItem('BilibiliTimerOffset')) {",
        "    timer.css({",
        "        right: '10px',",
        "        top: '10px'",
        "    }).css({",
        "        left: timer.offset().left + 'px',",
        "        right: 'auto'",
        "    });",
        "} else timer.css(JSON.parse(localStorage.getItem('BilibiliTimerOffset')));",
        "timer.on('mousedown', function(e) {",
        "    var baseX = e.clientX;",
        "    var baseY = e.clientY;",
        "    var baseOffsetX = timer.offset().left;",
        "    var baseOffsetY = timer.offset().top;",
        "    timer.data({",
        "        baseOffset: {",
        "            left: baseOffsetX - baseX,",
        "            top: baseOffsetY - baseY",
        "        },",
        "        onMousedown: true",
        "    });",
        "});",
        "$(window).on('resize', function() {",
        "    if (!!$('.mode-fullscreen')[0]) {",
        "        var maxTop = $('.bilibili-player-video-control').offset().top - timer.outerHeight() - 10;",
        "        var maxLeft = $('.bilibili-player-video-control').width() - timer.outerWidth() - 10;",
        "        timer.css({",
        "            left: Math.max(Math.min(parseInt(timer.css('left')), maxLeft), 10),",
        "            top: Math.max(Math.min(parseInt(timer.css('top')), maxTop), 10)",
        "        });",
        "        localStorage.setItem('BilibiliTimerOffset', JSON.stringify({",
        "            top: timer.css('top'),",
        "            left: timer.css('left')",
        "        }));",
        "    }",
        "});",
        "$(document).on({",
        "    mousemove: function(e) {",
        "        if (timer.data('onMousedown')) {",
        "            var maxTop = $('.bilibili-player-video-control').offset().top - timer.outerHeight() - 10;",
        "            var maxLeft = $('.bilibili-player-video-control').width() - timer.outerWidth() - 10;",
        "            timer.css({",
        "                left: Math.max(Math.min(timer.data('baseOffset').left + e.clientX, maxLeft), 10),",
        "                top: Math.max(Math.min(timer.data('baseOffset').top + e.clientY, maxTop), 10)",
        "            });",
        "        }",
        "    },",
        "    mouseup: function() {",
        "        if (timer.data('onMousedown')) {",
        "            timer.data('onMousedown', false);",
        "            localStorage.setItem('BilibiliTimerOffset', JSON.stringify({",
        "                top: timer.css('top'),",
        "                left: timer.css('left')",
        "            }));",
        "        }",
        "    }",
        "});",
        "var button = $('<a/>');",
        "button.text('[x]');",
        "button.css({",
        "    position: 'absolute',",
        "    right: '10px',",
        "    top: '10px',",
        "    'z-index': '49',",
        "    color: '#ddd',",
        "    'font-size': '13px'",
        "});",
        "timer.append(button);",
        "button.on('click', function() {",
        "    globallock = true;",
        "    timer.fadeOut(370);",
        "});",
        "timer.append('<div>当前时间:<span></span></div>');",
        "setInterval(function() {",
        "    var globalmode = !!$('.mode-fullscreen')[0];",
        "    if (globalmode) {",
        "        if (!globallock) timer.fadeIn();",
        "    } else {",
        "        globallock = false;",
        "        timer.fadeOut();",
        "    }",
        "    if (timer.is(':visible')) {",
        "        var date = new BilibiliPlayerDate();",
        "        timer.find('span').text(date.getFullYear() + '-' + date.getMonth() + '-' + date.getDate() + ' ' + date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds());",
        "    }",
        "}, 137);",
        "(function loop(timer) {",
        "    if (!$('.bilibili-player-video-wrap')[0]) {",
        "        console.debug('BilibiliTimer', 'nope');",
        "        setTimeout(loop, timer, 1370);",
        "    } else {",
        "        $('.bilibili-player-video-wrap').append(timer);",
        "        console.debug('BilibiliTimer', 'Yep', $('#BilibiliTimer'));",
        "    }",
        "})(timer);"
    ].join('');
    unsafeWindow.addEventListener('load', function() {
        unsafeWindow.eval(code);
    });
})();