// ==UserScript== // @name BilibiliTimer // @version 1.4.4 // @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 // @grant GM_addStyle // @namespace https://greasyfork.org/users/129402 // @downloadURL none // ==/UserScript== (function() { 'use strict'; /* 防止重复加载 */ if (unsafeWindow.BilibiliTimer) return; unsafeWindow.BilibiliTimer = {}; /* * 出于实现上的考虑,以下代码被保存为纯文本,并通过unsafeWindow.eval运行,以操作真实环境下的DOM节点 */ var code = [ "(function() {", " 'use strict';", " if (!String.prototype.includes) String.prototype.includes = function includes(s) {", " return this.indexOf(s) !== -1;", " };", " var BilibiliTimer = window.BilibiliTimer || (window.BilibiliTimer = {});", " BilibiliTimer.date = 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;", " };", " BilibiliTimer.isLive = function bilibiliIsLive(a, b) {", " return location.host === 'live.bilibili.com' ? a : b;", " };", " BilibiliTimer.selector = BilibiliTimer.isLive({", " container: '.bilibili-live-player-video-area',", " fullscreenButton: '.bilibili-live-player-video-controller-fullscreen-btn > i',", " controller: '.bilibili-live-player-video-controller',", " fullscreenSendbar: null", " }, {", " container: '.bilibili-player-video-wrap',", " fullscreenButton: '.bilibili-player-video-btn-fullscreen > i',", " controller: '.bilibili-player-video-control',", " fullscreenSendbar: '.bilibili-player-video-sendbar.active'", " });", " BilibiliTimer.classList = BilibiliTimer.isLive({", " timer: 'bilibili-live-player-video-info-container',", " closeButton: 'bilibili-live-player-video-info-close',", " panel: 'bilibili-live-player-video-info-panel',", " restartButton: 'live-icon-reload'", " }, {", " timer: 'bilibili-player-video-info-container',", " closeButton: 'bilibili-player-video-info-close',", " panel: 'bilibili-player-video-info-panel',", " restartButton: 'bilibili-player-iconfont icon-24repeaton'", " });", " BilibiliTimer.closeButtonText = BilibiliTimer.isLive('x', '[x]');", " BilibiliTimer.globallock = false;", " BilibiliTimer.onResizing = 0;", " BilibiliTimer.getControllerTop = function BilibiliTimerGetControllerTop() {", " var controller = $(BilibiliTimer.selector.controller);", " if (controller.closest('.mode-miniscreen')[0]) return $(window).height();", " var _top = $(BilibiliTimer.selector.controller).offset().top;", " var fullscreenSendbar = $(BilibiliTimer.selector.fullscreenSendbar);", " if (fullscreenSendbar[0]) _top -= fullscreenSendbar.outerHeight(true);", " return _top;", " };", " BilibiliTimer.init = function BilibiliTimerInit() {", " $(document).add(window).add(BilibiliTimer.selector.fullscreenButton).off('.BilibiliTimer');", " BilibiliTimer.onResizing = 0;", " var timer = $('
');", " timer.attr('id', 'BilibiliTimer').addClass(BilibiliTimer.classList.timer);", " 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() {", " BilibiliTimer.onResizing = 1;", " });", " $(document).on({", " 'mousemove.BilibiliTimer': function(e) {", " if (timer.data('onMousedown')) {", " var maxTop = BilibiliTimer.getControllerTop() - 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)", " });", " window.getSelection().removeAllRanges();", " }", " },", " '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 closeButton = $('');", " closeButton.text(BilibiliTimer.closeButtonText).attr({", " href: 'javascript:void(0);',", " id: 'BilibiliTimerCloseButton'", " });", " closeButton.addClass(BilibiliTimer.classList.closeButton);", " timer.append(closeButton);", " closeButton.on('click', function() {", " BilibiliTimer.globallock = true;", " timer.fadeOut(370);", " });", " var restartButton = $('');", " restartButton.attr({", " href: 'javascript:void(0);',", " id: 'BilibiliTimerRestartButton'", " });", " restartButton.addClass(BilibiliTimer.classList.closeButton).addClass(BilibiliTimer.classList.restartButton);", " timer.append(restartButton);", " restartButton.on('click', function() {", " BilibiliTimer.restart();", " });", " var panel = $('');", " panel.addClass(BilibiliTimer.classList.panel);", " panel.append(\"