// ==UserScript== // @name BilibiliTimer // @version 2.8.2 // @description B站H5播放器全屏时实时显示当前系统时间和播放进度 // @author AnnAngela // @namespace https://greasyfork.org/users/129402 // @mainpage https://greasyfork.org/zh-CN/scripts/30367-bilibilitimer // @supportURL https://greasyfork.org/zh-CN/scripts/30367-bilibilitimer/feedback // @license GNU General Public License v3.0 or later // @compatible chrome 自Chrome 50开始兼容 // @match *://www.bilibili.com/video/av* // @match *://www.bilibili.com/watchlater* // @match *://www.bilibili.com/html/*layer.htm* // @match *://www.bilibili.com/blackboard/*layer.htm* // @match *://www.bilibili.com/bangumi/play/* // @match *://live.bilibili.com/* // @run-at document-start // @grant unsafeWindow // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @icon data:image/png;base64,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 // @icon64 data:image/png;base64,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 // @downloadURL none // ==/UserScript== (function() { 'use strict'; /* 防止重复加载 */ if (unsafeWindow.BilibiliTimer) return; var multiValueKeys = ['exclude', 'grant', 'include', 'match', 'require', 'resource']; var booleanValueKeys = ['noframes'] var script = { scriptMetaStr: GM_info.scriptMetaStr }; GM_info.scriptMetaStr.split(/\n+/).forEach(function(str) { var string = str.replace(/^\s*\/\/\s*/, ''); var _temp = string.match(/^@([a-z\d:-]+) +(.+)$/i); if (!_temp) return; var key = _temp[1], value = _temp[2].trim(); if (multiValueKeys.includes(key)) { if (script[key]) { script[key].push(value); } else { script[key] = [value]; } } else if (booleanValueKeys.includes(key)) { script[key] = true; } else { script[key] = value; } }); unsafeWindow.BilibiliTimerUninit = false; unsafeWindow.BilibiliTimer = {}; var code = function code() { 'use strict'; if (unsafeWindow.BilibiliTimerUninit || !unsafeWindow.jQuery) return false; if (!String.prototype.includes) String.prototype.includes = function includes(s) { return this.indexOf(s) !== -1; }; var BilibiliTimer = unsafeWindow.BilibiliTimer = {}; var LF = String.fromCharCode(10); BilibiliTimer._loop_count = 0; 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; }; try { BilibiliTimer.isEmbedded = location.host === 'www.bilibili.com' && ['/blackboard/html5player.html', '/blackboard/player.html'].includes(location.pathname) && top !== window && top.location.host.includes('bilibili.com'); } catch (_) { BilibiliTimer.isEmbedded = false; } BilibiliTimer.realWindow = BilibiliTimer.isEmbedded ? top : window; BilibiliTimer.isNewPlayPage = (location.pathname.substring(1).replace(/^video/i, '').substring(1).match(/^av([0-9]+)/i) || [0, -1])[1] !== -1 && parseInt((document.cookie.match(/stardustvideo=(-?[0-9]+)/i) || [0, '-1'])[1]) > 0; BilibiliTimer.isLive = function bilibiliIsLive(a, b) { return location.host === 'live.bilibili.com' ? a !== undefined ? a : true : b !== undefined ? b : false; }; BilibiliTimer.selector = BilibiliTimer.isLive({ container: '.bilibili-live-player-video-area', controller: '.bilibili-live-player-video-controller', fullscreenSendbar: null, autoHideButton: '.attention-btn-ctnr > .left-part.dp-i-block.pointer.p-relative', autoHideButtonText: '.BilibiliTimerAutoHideButtonText', autoHideCheck: null, pageTitle: null, watchlaterPageTitle: null, watchlaterVideoTitle: null, bangumiTitle: null, bangumiPartTitle: null }, { container: '.bilibili-player-video-wrap', controller: '.bilibili-player-video-control', fullscreenSendbar: '.bilibili-player-video-sendbar.active', autoHideButton: BilibiliTimer.isNewPlayPage ? '#arc_toolbar_report > .ops' : '.bgray-btn-wrap .bgray-btn.show', autoHideButtonText: '.BilibiliTimerAutoHideButtonText', autoHideCheck: '.bilibili-player-no-cursor', pageTitle: BilibiliTimer.isNewPlayPage ? '.cur-list .on' : '#v_multipage .item.on', watchlaterPageTitle: '.bilibili-player-auxiliary-area .bilibili-player-watchlater-part-item[data-state-play=true] .bilibili-player-watchlater-plist-chapter', watchlaterVideoTitle: '.bilibili-player-auxiliary-area .bilibili-player-watchlater-item[data-state-play=true] .bilibili-player-watchlater-info-title', bangumiTitle: '#app .bangumi-info .info-title > a > h2', bangumiPartTitle: '#app .bangumi-info .bangumi-list-wrapper .episode-list .episode-item.on' }); 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', autoHideButton: 'left-part dp-i-block pointer p-relative BilibiliTimerAutoHideButton BilibiliTimerAutoHideButton-live', autoHideButtonText: 'BilibiliTimerAutoHideButtonText' }, { timer: 'bilibili-player-video-info-container', closeButton: 'bilibili-player-video-info-close', panel: 'bilibili-player-video-info-panel', restartButton: 'bilibili-player-iconfont icon-24repeaton', autoHideButton: BilibiliTimer.isNewPlayPage ? 'BilibiliTimerAutoHideButton' : 'bgray-btn show BilibiliTimerAutoHideButton', autoHideButtonText: 'BilibiliTimerAutoHideButtonText' }); BilibiliTimer.closeButtonText = BilibiliTimer.isLive('x', '[x]'); BilibiliTimer.globallock = false; BilibiliTimer.widthSet = false; BilibiliTimer.onResizing = 0; if (BilibiliTimer.selector.autoHideCheck) BilibiliTimer.mousemoveCount = 0; BilibiliTimer.getControllerTop = function BilibiliTimerGetControllerTop() { var controller = $(BilibiliTimer.selector.controller); if (controller.closest('.mode-miniscreen')[0]) return $(window).height(); var _top = $(window).height() - controller.height(); var fullscreenSendbar = $(BilibiliTimer.selector.fullscreenSendbar); if (fullscreenSendbar[0]) _top -= fullscreenSendbar.outerHeight(true); return _top; }; $(window).on('resize.BilibiliTimer', function() { BilibiliTimer.onResizing = 1; }); $(document).on({ 'mousemove.BilibiliTimer': function(e) { var BilibiliTimer = unsafeWindow.BilibiliTimer; if (BilibiliTimer && BilibiliTimer.timer) { if (BilibiliTimer.timer.data('onMousedown')) { var maxTop = BilibiliTimer.getControllerTop() - BilibiliTimer.timer.outerHeight() - 10; var maxLeft = $(window).width() - BilibiliTimer.timer.outerWidth() - 10; BilibiliTimer.timer.css({ left: Math.max(Math.min(BilibiliTimer.timer.data('baseOffset').left + e.clientX, maxLeft), 10), top: Math.max(Math.min(BilibiliTimer.timer.data('baseOffset').top + e.clientY, maxTop), 10) }); unsafeWindow.getSelection().removeAllRanges(); } if (BilibiliTimer.selector.autoHideCheck) BilibiliTimer.mousemoveCount = 0; } }, 'mouseup.BilibiliTimer': function(e) { var BilibiliTimer = unsafeWindow.BilibiliTimer; if (BilibiliTimer && BilibiliTimer.timer && BilibiliTimer.timer.data('onMousedown')) { BilibiliTimer.timer.data('onMousedown', false); GM_setValue('offset', { top: BilibiliTimer.timer.css('top'), left: BilibiliTimer.timer.css('left') }); } } }); BilibiliTimer.template = {}; var timer = BilibiliTimer.template.timer = $('
'); timer.attr('id', 'BilibiliTimer').addClass(BilibiliTimer.classList.timer); var closeButton = BilibiliTimer.template.closeButton = $(''); closeButton.text(BilibiliTimer.closeButtonText).attr({ href: 'javascript:void(0);', id: 'BilibiliTimerCloseButton' }); closeButton.addClass(BilibiliTimer.classList.closeButton); var restartButton = BilibiliTimer.template.restartButton = $(''); restartButton.attr({ href: 'javascript:void(0);', id: 'BilibiliTimerRestartButton', title: '如果发现浮窗出现问题,' + LF + '例如无法正常拖动,无法正常显示时间等,' + LF + '请点击该按钮重建浮窗尝试修复!' }); restartButton.addClass(BilibiliTimer.classList.closeButton).addClass(BilibiliTimer.classList.restartButton); var panel = BilibiliTimer.template.panel = $('
'); panel.addClass(BilibiliTimer.classList.panel); panel.append('
系统时间: -
'); panel.append(BilibiliTimer.isLive('
缓冲质量:当前缓冲时长 - s
', '
播放进度: - (已播放 - %)
加载进度: - (剩余缓冲时长 - s,已缓冲 - %)
')); var autoHideButton = BilibiliTimer.template.autoHideButton = $(BilibiliTimer.isNewPlayPage ? '' : '
'); autoHideButton.addClass(BilibiliTimer.classList.autoHideButton); autoHideButton.css(BilibiliTimer.isLive('width', BilibiliTimer.isNewPlayPage ? 'width' : 'height'), 'auto'); autoHideButton.html((BilibiliTimer.isNewPlayPage ? '' : '') + '浮窗自动隐藏' + BilibiliTimer.isLive(' | ', BilibiliTimer.isNewPlayPage ? ' | ' : '
')); var autoHideButtonText = $(''); autoHideButtonText.addClass(BilibiliTimer.classList.autoHideButtonText); if (!GM_getValue('autoHidden')) { GM_setValue('autoHidden', false); autoHideButtonText.text('OFF'); } else { autoHideButtonText.text('ON'); } autoHideButton.append(autoHideButtonText); BilibiliTimer.init = function BilibiliTimerInit() { if (unsafeWindow.BilibiliTimerUninit) return false; if (!$(BilibiliTimer.selector.container)[0] && ++BilibiliTimer._loop_count > 150) return BilibiliTimer.uninit(); BilibiliTimer.onResizing = 0; BilibiliTimer.widthSet = false; BilibiliTimer.timer = BilibiliTimer.template.timer.clone(); BilibiliTimer.closeButton = BilibiliTimer.template.closeButton.clone(); BilibiliTimer.restartButton = BilibiliTimer.template.restartButton.clone(); BilibiliTimer.panel = BilibiliTimer.template.panel.clone(); BilibiliTimer.autoHideButton = BilibiliTimer.template.autoHideButton.clone(); BilibiliTimer.timer.append(BilibiliTimer.closeButton).append(BilibiliTimer.restartButton).append(BilibiliTimer.panel); var title = null, description = null; if ($(BilibiliTimer.selector.pageTitle)[0]) title = (BilibiliTimer.isNewPlayPage ? $(BilibiliTimer.selector.pageTitle).children('a:visible').text().trim().replace(/^(P[0-9]+)/i, '$1 ') : $(BilibiliTimer.selector.pageTitle).text()); else if ($(BilibiliTimer.selector.watchlaterPageTitle)[0]) { description = '当前分页:
(稍后再看)
'; title = $(BilibiliTimer.selector.watchlaterVideoTitle).closest('li').index() + 1 + '、' + $(BilibiliTimer.selector.watchlaterVideoTitle).text() + '
' + ($(BilibiliTimer.selector.watchlaterPageTitle).closest('li').index() + 1) + '、' + $(BilibiliTimer.selector.watchlaterPageTitle).text(); } else if ($(BilibiliTimer.selector.watchlaterVideoTitle)[0]) { description = '当前视频:
(稍后再看)
'; title = $(BilibiliTimer.selector.watchlaterVideoTitle).closest('li').index() + 1 + '、' + $(BilibiliTimer.selector.watchlaterVideoTitle).text(); } else if ($(BilibiliTimer.selector.bangumiTitle)[0]) { description = '当前番剧:'; title = $(BilibiliTimer.selector.bangumiTitle).text(); if ($(BilibiliTimer.selector.bangumiPartTitle)[0]) { var cloneNode = $(BilibiliTimer.selector.bangumiPartTitle).clone(); cloneNode.find('.ep-index').text(cloneNode.find('.ep-index').text() + ':'); title += '
' + '(' + cloneNode.text() + ')'; } } if (title) BilibiliTimer.timer.find('#BilibiliTimerTitle').html(title).parent().removeAttr('style'); if (description) BilibiliTimer.timer.find('#BilibiliTimerTitleDescription').html(description); (function loop(BilibiliTimer) { if (BilibiliTimer.isNewPlayPage && [ $('#arc_toolbar_report > .ops > .like').text(), $('#arc_toolbar_report > .ops > .coin').text(), $('#arc_toolbar_report > .ops > .collect').text() ].includes('--')) return setTimeout(loop, 200, BilibiliTimer); $('.BilibiliTimerAutoHideButton').remove(); $(BilibiliTimer.realWindow.document.querySelector(BilibiliTimer.selector.autoHideButton))[BilibiliTimer.isNewPlayPage ? 'append' : 'before'](BilibiliTimer.autoHideButton); })(BilibiliTimer); BilibiliTimer.autoHideButtonText = BilibiliTimer.autoHideButton.find(BilibiliTimer.selector.autoHideButtonText); BilibiliTimer.timer.on('mousedown', function(e) { var baseX = Math.max(e.clientX, 0); var baseY = Math.max(e.clientY, 0); var baseOffsetX = Math.max(parseInt(BilibiliTimer.timer.css('left')), 0); var baseOffsetY = Math.max(parseInt(BilibiliTimer.timer.css('top')), 0); BilibiliTimer.timer.data({ baseOffset: { left: baseOffsetX - baseX, top: baseOffsetY - baseY }, onMousedown: true }); }); BilibiliTimer.closeButton.on('click', function() { BilibiliTimer.globallock = true; BilibiliTimer.timer.dequeue().clearQueue().css('opacity', '0').delay(370).queue(function() { timer.hide().dequeue(); }); }); BilibiliTimer.restartButton.on('click', function() { BilibiliTimer.restart('User order', ""); }); BilibiliTimer.autoHideButton.on('click', function() { if (GM_getValue('autoHidden')) { GM_setValue('autoHidden', false); BilibiliTimer.autoHideButtonText.text('OFF'); } else { GM_setValue('autoHidden', true); BilibiliTimer.autoHideButtonText.text('ON'); } }); if (!GM_getValue('offset')) { BilibiliTimer.timer.css({ left: 'auto', right: '10px', top: '10px' }); } else BilibiliTimer.timer.css(GM_getValue('offset')); $(BilibiliTimer.selector.container).append(BilibiliTimer.timer); $(window).resize(); }; BilibiliTimer.globalWatcher = function BilibiliTimerGlobalWatcher() { if (unsafeWindow.BilibiliTimerUninit) return false; var timer = BilibiliTimer.timer; if (!timer || !timer[0]) { BilibiliTimer.init(); return; } if ($('object#player_placeholder, object#player_object')[0]) { BilibiliTimer.uninit(); return; } if (!timer.closest('body')[0]) { BilibiliTimer.restart('Timer did not exist in document.body', timer.closest('body')[0]); return; } if (!!BilibiliTimer.realWindow.document.querySelector(':-webkit-full-screen')) { if (GM_getValue('autoHidden') && (BilibiliTimer.selector.autoHideCheck ? $(BilibiliTimer.selector.autoHideCheck)[0] : BilibiliTimer.mousemoveCount >= 3)) BilibiliTimer.autoHidden = true; else BilibiliTimer.autoHidden = false; if (!BilibiliTimer.globallock && !BilibiliTimer.autoHidden) { if (!timer.is(':visible')) { timer.dequeue().clearQueue().show().css('opacity', '1'); } if (BilibiliTimer.onResizing === 2) { BilibiliTimer.onResizing = 0; var maxTop = BilibiliTimer.getControllerTop() - timer.outerHeight() - 10; var maxLeft = $(window).width() - timer.outerWidth() - 10; timer.animate({ left: Math.max(Math.min(parseInt(timer.css('left')), maxLeft), 10), top: Math.max(Math.min(parseInt(timer.css('top')), maxTop), 10) }, 370); GM_setValue('offset', { top: timer.css('top'), left: timer.css('left') }); } else if (BilibiliTimer.onResizing === 1) { BilibiliTimer.onResizing = 2; } var date = BilibiliTimer.date(); timer.find('#BilibiliTimerNowTime').text(date.getFullYear() + '-' + date.getMonth() + '-' + date.getDate() + ' ' + date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds()); if (!BilibiliTimer.widthSet) BilibiliTimer.widthCalc(); } } else { BilibiliTimer.onResizing = 0; BilibiliTimer.globallock = false; timer.dequeue().clearQueue().css('opacity', '0').delay(370).queue(function() { timer.hide().dequeue(); }); } var video = $('video')[0]; if (!video) { BilibiliTimer.restart('No Video', null); return; } if (!video.dataset.isTrusted) { video.dataset.isTrusted = true; video.addEventListener('timeupdate', BilibiliTimer.videoPlayListener); video.addEventListener('progress', BilibiliTimer.videoProgressListener); } if ((timer.find('#BilibiliTimerVideoTimePercents').text() + timer.find('#BilibiliTimerVideoBufferedTimeRange').text() + timer.find('#BilibiliTimerVideoTime').text()).includes('-')) { BilibiliTimer.videoPlayListener({ target: video[0] }); BilibiliTimer.videoProgressListener({ target: video[0] }); } }; BilibiliTimer.autoHideWatcher = function BilibiliTimerAutoHideWatcher() { if (!GM_getValue('autoHidden')) return; if (BilibiliTimer.selector.autoHideCheck ? $(BilibiliTimer.selector.autoHideCheck)[0] : BilibiliTimer.mousemoveCount >= 3) { BilibiliTimer.autoHidden = true; BilibiliTimer.timer.dequeue().clearQueue().css('opacity', '0').delay(370).queue(function() { timer.hide().dequeue(); }); } if (BilibiliTimer.selector.autoHideCheck) BilibiliTimer.mousemoveCount++; }; BilibiliTimer.lazyWatcher = function BilibiliTimerLazyWatcher() { var BilibiliTimer = unsafeWindow.BilibiliTimer; if (!BilibiliTimer || !BilibiliTimer.timer) return; var timer = BilibiliTimer.timer; if (BilibiliTimer.timer.find('.info-line').width() > BilibiliTimer.timer.width()) BilibiliTimer.widthCalc(); var flag, node; if ($(BilibiliTimer.selector.pageTitle)[0]) { if (!timer.find('#BilibiliTimerTitleDescription')[0]) { flag = 'TitleDescription unset'; node = timer.find('#BilibiliTimerTitleDescription')[0]; } else if (timer.is(':visible') && timer.find('#BilibiliTimerTitleDescription').is(':hidden')) { flag = 'TitleDescription invisible'; node = timer.find('#BilibiliTimerTitleDescription')[0] } } else if ($(BilibiliTimer.selector.watchlaterPageTitle)[0] || $(BilibiliTimer.selector.watchlaterVideoTitle)[0]) { if (!timer.find('#BilibiliTimerTitleDescriptionLabel')[0]) { flag = 'TitleDescriptionLabel unset'; node = timer.find('#BilibiliTimerTitleDescriptionLabel')[0]; } else if (timer.is(':visible') && timer.find('#BilibiliTimerTitleDescriptionLabel').is(':hidden')) { flag = 'TitleDescriptionLabel invisible' node = timer.find('#BilibiliTimerTitleDescriptionLabel')[0] } } else if ($(BilibiliTimer.selector.bangumiTitle)[0]) { if (!timer.text().includes('当前番剧:')) { flag = 'TitleDescriptionLabel did not include bangumi'; node = timer.find('#BilibiliTimerTitleDescription')[0]; } } if (flag) { BilibiliTimer.restart(flag, node); return; } }; BilibiliTimer.widthCalc = function BilibiliTimerWidthCalc() { var BilibiliTimer = unsafeWindow.BilibiliTimer; if (!BilibiliTimer || !BilibiliTimer.timer) return; var timer = BilibiliTimer.timer; var maxWidth = 0; timer.find('.info-line').each(function() { var width = 0, maxHeight = 0; $(this).css('height', 'unset').children().each(function() { width += $(this).outerWidth(true); var _height = $(this).height(); if ($(this).find('#BilibiliTimerTitleDescriptionLabel')[0]) _height += $(this).find('#BilibiliTimerTitleDescriptionLabel').height(); if (maxHeight < _height) maxHeight = _height; }); if (maxWidth < width) maxWidth = width; $(this).height(maxHeight); }); timer.width(maxWidth); BilibiliTimer.widthSet = true; $(window).resize(); }; BilibiliTimer.timeParse = function BilibiliTimerTimeParse(time) { time = parseInt(time); var sec = time % 60, min = (time - sec) / 60; if (sec < 10) sec = '0' + sec; return min + ':' + sec; }; BilibiliTimer.videoPlayListener = function BilibiliTimerVideoPlayListener(e) { if (!e.target) return; var video = e.target; var curTime = video.currentTime || 0; var durTime = video.duration || 0; if (!curTime && !durTime) return; var BilibiliTimer = unsafeWindow.BilibiliTimer; if (!BilibiliTimer || !BilibiliTimer.timer) return; var timer = BilibiliTimer.timer; timer.find('#BilibiliTimerVideoTime').text(BilibiliTimer.timeParse(curTime) + '/' + BilibiliTimer.timeParse(durTime)); if (timer.find('#BilibiliTimerVideoBufferedTime')[0]) { var end; try { end = video.buffered.end(video.buffered.length - 1); } catch (_) { try { end = video.buffered.end(0); } catch (_) { return; } } if (timer.find('#BilibiliTimerVideoBufferedTime').text() === ' - ') $(video).trigger('progress'); timer.find('#BilibiliTimerVideoBufferedTimeRange').text((end - curTime).toFixed(0)); } timer.find('#BilibiliTimerVideoTimePercents').text((curTime * 100 / durTime).toFixed(2)); }; BilibiliTimer.videoProgressListener = function BilibiliTimerVideoProgressListener(e) { if (!e.target) return; var video = e.target; var curTime = video.currentTime || 0; var durTime = video.duration || 0; if (!curTime && !durTime) return; var BilibiliTimer = unsafeWindow.BilibiliTimer; if (!BilibiliTimer || !BilibiliTimer.timer) return; var timer = BilibiliTimer.timer; if (timer.find('#BilibiliTimerVideoBufferedTimeRange')[0]) { var video = e.target, end; try { end = video.buffered.end(video.buffered.length - 1); } catch (_) { try { end = video.buffered.end(0); } catch (_) { return; } } if (timer.find('#BilibiliTimerVideoBufferedTimeRange').text() === ' - ') BilibiliTimer.widthSet = false; if (timer.find('#BilibiliTimerVideoTime').text() === ' - ') $(video).trigger('timeupdate'); timer.find('#BilibiliTimerVideoBufferedTime').text(BilibiliTimer.timeParse(end)); BilibiliTimer.timer.find('#BilibiliTimerVideoBufferedTimeRange').text((end - video.currentTime).toFixed(0)); timer.find('#BilibiliTimerVideoBufferedTimePercents').text((end * 100 / video.duration).toFixed(2)); } timer.find('#BilibiliTimerVideoTimePercents').text((curTime * 100 / durTime).toFixed(2)); }; BilibiliTimer.start = function BilibiliTimerStart() { if (unsafeWindow.BilibiliTimerUninit) return false; if (location.host === 'bangumi.bilibili.com') return false; if (!BilibiliTimer.interval) BilibiliTimer.interval = {}; if (!BilibiliTimer.interval.globalWatcher) BilibiliTimer.interval.globalWatcher = unsafeWindow.setInterval(BilibiliTimer.globalWatcher, 100); if (!BilibiliTimer.interval.autoHideWatcher) BilibiliTimer.interval.autoHideWatcher = unsafeWindow.setInterval(BilibiliTimer.autoHideWatcher, 1e3); if (!BilibiliTimer.interval.lazyWatcher) BilibiliTimer.interval.lazyWatcher = unsafeWindow.setInterval(BilibiliTimer.lazyWatcher, 5e3); try { var video = $('video'); setTimeout(function() { BilibiliTimer.videoPlayListener({ target: video[0] }); BilibiliTimer.videoProgressListener({ target: video[0] }); }, 100); } catch (_) { return; } }; BilibiliTimer.restart = function BilibiliTimerRestart(reason, node) { for (var i in BilibiliTimer.interval) { if (BilibiliTimer.interval[i]) unsafeWindow.clearInterval(BilibiliTimer.interval[i]); } $('.BilibiliTimerAutoHideButton').remove(); if (unsafeWindow.BilibiliTimerUninit) return false; var timer = $('#BilibiliTimer'); if (timer[0]) { timer.dequeue().clearQueue().css('opacity', '0').delay(370).queue(function() { BilibiliTimer.rebuild(reason, node); timer.hide().dequeue(); }); } else BilibiliTimer.rebuild(reason, node); }; BilibiliTimer.rebuild = function BilibiliTimerRebuild(reason, node) { console.groupCollapsed('BilibiliTimerRebuildTrace:', reason, node); console.trace(); console.groupEnd(); unsafeWindow.BilibiliTimer = undefined; delete BilibiliTimer; if (unsafeWindow.BilibiliTimerUninit) return false; setTimeout(function() { code() }, 0); }; BilibiliTimer.uninit = function BilibiliTimerUninit() { for (var i in BilibiliTimer.interval) { if (BilibiliTimer.interval[i]) unsafeWindow.clearInterval(BilibiliTimer.interval[i]); } $('.BilibiliTimerAutoHideButton').remove(); $('#BilibiliTimer').remove(); unsafeWindow.BilibiliTimer = undefined; unsafeWindow.BilibiliTimerUninit = true; }; BilibiliTimer.start(); }; var css = [ "#BilibiliTimer {", " cursor: move;", " display: block;", " transition-property: opacity, width;", " transition-duration: .37s;", " transition-timing-function: initial;", " transition-delay: initial;", "}", ".bilibili-player-no-cursor #BilibiliTimer {", " opacity: .73;", " cursor: none;", "}", "#BilibiliTimer .info-title {", " width: 6em;", " margin: 0;", "}", "#BilibiliTimer .info-data {", " max-width: 25em;", " white-space: normal;", " vertical-align: top;", "}", "#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 {", " top: auto;", " bottom: 10px;", "}", ".BilibiliTimerAutoHideButton-live {", " -webkit-text-emphasis-color: white;", " -webkit-text-fill-color: white;", " -webkit-text-stroke-color: white;", " background-color: rgb(35, 173, 229);", " border: 0 solid white;", " border-width: 0 1px;", " caret-color: white;", " color: white;", " column-rule-color: white;", " height: 22px;", " line-height: 22px;", " outline-color: white;", " perspective-origin: 33px 11px;", " text-align: center;", " text-decoration: none solid white;", " text-decoration-color: white;", " transform-origin: 33px 11px;", " vertical-align: middle;", " padding: 0 .25em;", "}", ".bgray-btn-wrap .BilibiliTimer-hr {", " border-style: inset;", " border-width: 1px;", " margin: 0.5em auto;", " overflow: hidden;", "}", "#BilibiliTimerTitleDescription {", " height: 100%;", " position: relative;", "}", "#BilibiliTimerTitleDescriptionLabel {", " width: 100%;", " top: 50%;", " left: 0;", " position: absolute;", "}", ".BilibiliTimerAutoHideButton {", " user-select: none;", "}", "#arc_toolbar_report > .ops > .more > .more-ops-list {", " width: auto;", "}", "#arc_toolbar_report > .ops > .more > .more-ops-list .BilibiliTimerAutoHideButton {", " padding: 0 1em;", "}", ].join('\n'); var c; c = unsafeWindow.setInterval(function() { if (!unsafeWindow.jQuery) return false; if (unsafeWindow.BilibiliTimerUninit || unsafeWindow.BilibiliTimer.start) return unsafeWindow.clearInterval(c); if (!unsafeWindow.document.querySelector('.bilibili-live-player-video-area, .bilibili-player-video-wrap') || !unsafeWindow.document.querySelector('.bilibili-live-player-video-area, .bilibili-player-video-wrap').querySelector('video')) return; if (/^https:\/\/www\.bilibili\.com\/video\/av\d+/i.test(location.href) && parseInt((unsafeWindow.document.cookie.match(/stardustvideo=(-?\d+)/) || [0, '-1'])[1]) > 0) { if ([ unsafeWindow.document.querySelector('#arc_toolbar_report > .ops > .like') ? unsafeWindow.document.querySelector('#arc_toolbar_report > .ops > .like').innerText : '--', unsafeWindow.document.querySelector('#arc_toolbar_report > .ops > .coin') ? unsafeWindow.document.querySelector('#arc_toolbar_report > .ops > .coin').innerText : '--', unsafeWindow.document.querySelector('#arc_toolbar_report > .ops > .collect') ? unsafeWindow.document.querySelector('#arc_toolbar_report > .ops > .collect').innerText : '--' ].includes('--')) return false; } unsafeWindow.console.info('%c' + script.name + '@' + script.version + ' by ' + script.author + ' is running!', "padding: 34px 66px 34px 66px; line-height: 64px; background:url('" + script.icon64 + "') top left no-repeat; background-position-y: 4px;"); GM_addStyle(css); code(); }, 100); })();