// ==UserScript==
// @name BilibiliTimer
// @version 1.4.5
// @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://gf.qytechs.cn/users/129402
// ==/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 = $('<div/>');",
" 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 = $('<a/>');",
" 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 = $('<a/>');",
" restartButton.attr({",
" href: 'javascript:void(0);',",
" id: 'BilibiliTimerRestartButton',",
" title: '如果发现浮窗出现问题(例如无法正常拖动,无法正常显示时间等),请点击该按钮重建浮窗尝试修复'",
" });",
" restartButton.addClass(BilibiliTimer.classList.closeButton).addClass(BilibiliTimer.classList.restartButton);",
" timer.append(restartButton);",
" restartButton.on('click', function() {",
" BilibiliTimer.restart();",
" });",
" var panel = $('<div/>');",
" panel.addClass(BilibiliTimer.classList.panel);",
" panel.append(\"<div class='info-line'><span class='info-title'>系统时间:</span><span class='info-data' id='BilibiliTimerNowTime'></span></div>\");",
" panel.append(BilibiliTimer.isLive('', \"<div class='info-line'><span class='info-title'>播放进度:</span><span class='info-data' id='BilibiliTimerVideoTime'></span></div>\"));",
" timer.append(panel);",
" $(BilibiliTimer.selector.container).append(timer);",
" };",
" BilibiliTimer.checkIfInited = function BilibiliTimerCheckIfInited() {",
" if ($(BilibiliTimer.selector.container)[0] && !$(BilibiliTimer.selector.container).find('#BilibiliTimer')[0]) BilibiliTimer.init();",
" };",
" BilibiliTimer.globalWatcher = function BilibiliTimerGlobalWatcher() {",
" var timer = $('#BilibiliTimer');",
" if (!timer[0]) return;",
" if (!!$(':-webkit-full-screen')[0]) {",
" if (!BilibiliTimer.globallock) {",
" timer.fadeIn();",
" if (BilibiliTimer.onResizing === 2) {",
" BilibiliTimer.onResizing = 0;",
" var maxTop = BilibiliTimer.getControllerTop() - 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')",
" }));",
" } else if (BilibiliTimer.onResizing === 1) {",
" BilibiliTimer.onResizing = 2;",
" }",
" }",
" } else {",
" BilibiliTimer.onResizing = 0;",
" BilibiliTimer.globallock = false;",
" timer.fadeOut();",
" }",
" if (timer.is(':visible')) {",
" var date = BilibiliTimer.date();",
" 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);",
" }",
" }",
" };",
" BilibiliTimer.start = function BilibiliTimerStart() {",
" BilibiliTimer.interval = {",
" checkIfInited: setInterval(BilibiliTimer.checkIfInited, 1307),",
" globalWatcher: setInterval(BilibiliTimer.globalWatcher, 100)",
" };",
" };",
" BilibiliTimer.restart = function restart() {",
" for (var i in BilibiliTimer.interval) {",
" if (BilibiliTimer.interval[i]) clearInterval(BilibiliTimer.interval[i]);",
" }",
" $('#BilibiliTimer').fadeOut(370, function() {",
" $(this).remove();",
" });",
" BilibiliTimer.start();",
" };",
" BilibiliTimer.start();",
"})();"
].join('\n');
var css = [
"#BilibiliTimerCloseButton.bilibili-live-player-video-info-close {",
" color: rgb(0, 0, 0);",
" padding: 0px;",
" height: 15px;",
" background: rgb(221, 221, 221);",
" width: 1em;",
" text-align: center;",
" top: 8px;",
"}",
"#BilibiliTimerRestartButton.bilibili-live-player-video-info-close {",
" top: auto;",
" bottom: 10px;",
"}"
].join('\n');
unsafeWindow.addEventListener('load', function() {
GM_addStyle(css);
unsafeWindow.eval(code);
});
})();