Greasy Fork

Greasy Fork is available in English.

BilibiliTimer

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

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

// ==UserScript==
// @name         BilibiliTimer
// @version      1.3.0
// @description  B站H5播放器全屏时实时显示当前系统时间
// @author       AnnAngela
// @match        *://www.bilibili.com/video/*
// @match        *://www.bilibili.com/html/*layer.htm*
// @match        *://live.bilibili.com/*
// @compatible   chrome
// @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 = [
        "(function() {",
        "    \"use strict\";",
        "    if (!String.prototype.includes) String.prototype.includes = function includes(s) {",
        "        return this.indexOf(s) !== -1;",
        "    };",
        "    function bilibiliPlayerDate() {",
        "        var _date = new Date();",
        "        ['getDate', 'getFullYear', 'getHours', 'getMilliseconds', 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getUTCDate', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds', 'getYear'].forEach(function(key) {",
        "            _date[key] = function() {",
        "                var result = Date.prototype[key].apply(_date, arguments);",
        "                if (key.includes('Month')) result++;",
        "                if (typeof result === 'number' && (result + '').length === 1) return '0' + result;",
        "                else return result + '';",
        "            };",
        "        });",
        "        return _date;",
        "    }",
        "    var selector = location.host === 'live.bilibili.com' ? {",
        "        container: '.bilibili-live-player-video-area',",
        "        fullscreenButton: '.bilibili-live-player-video-controller-fullscreen-btn > i',",
        "        controller: '.bilibili-live-player-video-controller'",
        "    } : {",
        "        container: '.bilibili-player-video-wrap',",
        "        fullscreenButton: '.bilibili-player-video-btn-fullscreen > i',",
        "        controller: '.bilibili-player-video-control'",
        "    };",
        "    var globallock = false;",
        "    var onFullscreenMode = false;",
        "    function BilibiliTimerInit() {",
        "        $(document).add(window).add(selector.fullscreenButton).off('.BilibiliTimer');",
        "        var timer = $('<div/>');",
        "        timer.attr('id', 'BilibiliTimer').addClass('bilibili-player-video-info-container');",
        "        timer.data('widthSet', false);",
        "        timer.css('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.BilibiliTimer', function() {",
        "            if (onFullscreenMode) {",
        "                var maxTop = $(selector.controller).offset().top - timer.outerHeight() - 10;",
        "                var maxLeft = $(window).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.BilibiliTimer': function(e) {",
        "                if (timer.data('onMousedown')) {",
        "                    var maxTop = $(selector.controller).offset().top - timer.outerHeight() - 10;",
        "                    var maxLeft = $(window).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.BilibiliTimer': 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]').attr('href', \"javascript:void(0);\");",
        "        button.addClass('bilibili-player-video-info-close');",
        "        timer.append(button);",
        "        button.on('click', function() {",
        "            globallock = true;",
        "            timer.fadeOut(370);",
        "        });",
        "        timer.append('<div class=\"bilibili-player-video-info-panel\"><div class=\"info-line\"><span class=\"info-title\">系统时间:</span><span class=\"info-data\" id=\"BilibiliTimerNowTime\"></span></div><div class=\"info-line\"><span class=\"info-title\">播放进度:</span><span class=\"info-data\" id=\"BilibiliTimerVideoTime\"></span></div></div>');",
        "        $(selector.container).append(timer);",
        "        $(selector.fullscreenButton).on('click.BilibiliTimer', function() {",
        "            onFullscreenMode = !onFullscreenMode;",
        "        });",
        "        $(document).on('keyup.BilibiliTimer', function(e) {",
        "            if (e.which === 27) onFullscreenMode = false;",
        "        });",
        "        console.info('BilibiliTimer', 'Init', $('#BilibiliTimer'));",
        "    }",
        "    setInterval(function() {",
        "        if ($(selector.container)[0] && !$(selector.container).find('#BilibiliTimer')[0]) BilibiliTimerInit();",
        "    }, 1307);",
        "    setInterval(function() {",
        "        var timer = $(\"#BilibiliTimer\");",
        "        if (!timer[0]) return;",
        "        var globalmode = !!$(':-webkit-full-screen')[0];",
        "        if (globalmode) {",
        "            if (!globallock) timer.fadeIn();",
        "        } else {",
        "            onFullscreenMode = false;",
        "            globallock = false;",
        "            timer.fadeOut();",
        "        }",
        "        if (timer.is(':visible')) {",
        "            var date = bilibiliPlayerDate();",
        "            timer.find('#BilibiliTimerNowTime').text(date.getFullYear() + '-' + date.getMonth() + '-' + date.getDate() + ' ' + date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds());",
        "            timer.find('#BilibiliTimerVideoTime').text($('.bilibili-player-video-time-wrap').text());",
        "            if (!timer.data('widthSet')) {",
        "                var maxWidth = 0;",
        "                timer.find('.info-line').each(function() {",
        "                    var width = 0;",
        "                    $(this).children().each(function() {",
        "                        if ($(this).is('.info-title')) $(this).width($(this).text().length * parseInt($(this).css('font-size')));",
        "                        width += $(this).outerWidth(true);",
        "                    });",
        "                    if (maxWidth < width) maxWidth = width;",
        "                });",
        "                timer.width(maxWidth);",
        "                timer.data('widthSet', true);",
        "            }",
        "        }",
        "    }, 137);",
        "})();"
    ].join('\n');
    unsafeWindow.addEventListener('load', function() {
        unsafeWindow.eval(code);
    });
})();