// ==UserScript== // @name BilibiliTimer // @version 1.1.3 // @description B站H5播放器全屏时实时显示当前系统时间 // @author AnnAngela // @match *://www.bilibili.com/video/* // @match *://www.bilibili.com/html/*layer.htm* // @run-at document-start // @grant unsafeWindow // @namespace https://greasyfork.org/users/129402 // @downloadURL none // ==/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 = $('
');", "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 = $(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: function(e) {", " if (timer.data('onMousedown')) {", " var maxTop = $('.bilibili-player-video-control').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: function() {", " if (timer.data('onMousedown')) {", " timer.data('onMousedown', false);", " localStorage.setItem('BilibiliTimerOffset', JSON.stringify({", " top: timer.css('top'),", " left: timer.css('left')", " }));", " }", " }", "});", "var button = $('');", "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('
当前时间:
');", "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); }); })();