Greasy Fork is available in English.
B站H5播放器全屏模式下实时显示当前系统时间和播放进度
Du vil måske også kunne lide BilibiliCover - 获取并显示B站视频封面图片
// ==UserScript== // @name BilibiliTimer - B站H5播放器全屏下实时显示当前系统时间和播放进度 // @version 3.4.4 // @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 80 // @match *://www.bilibili.com/video/av* // @match *://www.bilibili.com/video/BV* // @match *://www.bilibili.com/html/*layer.htm* // @match *://www.bilibili.com/blackboard/*layer.htm* // @match *://www.bilibili.com/bangumi/play/* // @match *://www.bilibili.com/medialist/play/watchlater* // @match *://live.bilibili.com/* // @run-at document-start // @grant unsafeWindow // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM.addStyle // @grant GM.setValue // @grant GM.getValue // @icon https://public.annangela.cn/script/Bilibili.png // @icon64 https://public.annangela.cn/script/Bilibili.png // ==/UserScript== /* eslint-disable require-atomic-updates */ "use strict"; (() => { /* 防止重复加载 */ if (unsafeWindow.BilibiliTimer) { return; } const multiValueKeys = ["exclude", "grant", "include", "match", "require", "resource"]; const booleanValueKeys = ["noframes"]; const script = { scriptMeta: {}, }; let GM4Detected = false; try { if (Object.prototype.toString.bind(GM)() === "[object Object]") { GM4Detected = true; } else { GM4Detected = false; } } catch (_) { GM4Detected = false; } script.scriptMetaStr = (GM4Detected ? GM.info : GM_info).scriptMetaStr; script.scriptMetaStr.split(/\n+/).forEach((str) => { const string = str.replace(/^\s*\/\/\s*/, ""); const _temp = string.match(/^@([a-z\d:-]+) +(.+)$/i); if (!_temp) { return; } const key = _temp[1], value = _temp[2].trim(); if (multiValueKeys.includes(key)) { if (script.scriptMeta[key]) { script.scriptMeta[key].push(value); } else { script.scriptMeta[key] = [value]; } } else if (booleanValueKeys.includes(key)) { script.scriptMeta[key] = true; } else { script.scriptMeta[key] = value; } }); /* eslint-disable require-await */ script.addStyle = GM4Detected ? GM.addStyle : async (...args) => { return GM_addStyle(...args); }; script.getValue = GM4Detected ? GM.getValue : async (...args) => { return GM_getValue(...args); }; script.setValue = GM4Detected ? GM.setValue : async (...args) => { return GM_setValue(...args); }; /* eslint-enable require-await */ unsafeWindow.BilibiliTimerUninit = false; unsafeWindow.BilibiliTimer = {}; const code = async function code() { if (unsafeWindow.BilibiliTimerUninit || !unsafeWindow.jQuery) { return false; } if (!String.prototype.includes) { String.prototype.includes = function includes(s) { return this.indexOf(s) !== -1; }; } unsafeWindow.BilibiliTimer = {}; unsafeWindow.BilibiliTimer._loop_count = 0; unsafeWindow.BilibiliTimer.date = function bilibiliPlayerDate() { const _date = new Date(); ["getDate", "getFullYear", "getHours", "getMilliseconds", "getMinutes", "getMonth", "getSeconds", "getTime", "getUTCDate", "getUTCFullYear", "getUTCHours", "getUTCMilliseconds", "getUTCMinutes", "getUTCMonth", "getUTCSeconds", "getYear"].forEach((key) => { _date[key] = (...a) => { let r###lt = Date.prototype[key].apply(_date, a); if (key.includes("Month")) { r###lt++; } if (typeof r###lt === "number" && `${r###lt}`.length === 1) { return `0${r###lt}`; } return `${r###lt}`; }; }); return _date; }; let isEmbedded; try { isEmbedded = location.host === "www.bilibili.com" && ["/blackboard/html5player.html", "/blackboard/player.html"].includes(location.pathname) && top !== window && top.location.host.includes("bilibili.com"); } catch (_) { isEmbedded = false; } unsafeWindow.BilibiliTimer.isEmbedded = isEmbedded; unsafeWindow.BilibiliTimer.realWindow = isEmbedded ? top : window; unsafeWindow.BilibiliTimer.isNewPlayPage = (location.pathname.match(/\/video\/av(\d+)/) || [0, -1])[1] !== -1 && parseInt((document.cookie.match(/stardustvideo=(-?[0-9]+)/i) || [0, "-1"])[1]) > 0 || (location.pathname.match(/\/bangumi\/play\/ep(\d+)/) || [0, -1])[1] !== -1 && document.cookie.includes("stardustpgcv") && document.cookie.match(/stardustpgcv=(-?\d+)/)[1] === "0606"; unsafeWindow.BilibiliTimer.isNewBangumiPlayPage = (location.pathname.match(/\/bangumi\/play\/ep(\d+)/) || [0, -1])[1] !== -1 && document.cookie.includes("stardustpgcv") && document.cookie.match(/stardustpgcv=(-?\d+)/)[1] === "0606"; unsafeWindow.BilibiliTimer.isLive = function bilibiliIsLive(a, b) { return location.host === "live.bilibili.com" ? a !== undefined ? a : true : b !== undefined ? b : false; }; unsafeWindow.BilibiliTimer.selector = unsafeWindow.BilibiliTimer.isLive( { container: ".bilibili-live-player-video-area", controller: ".bilibili-live-player-video-controller", fullscreenSendbar: null, autoHideCheck: null, }, { container: ".bilibili-player-video-wrap, .bpx-player-video-wrap", controller: ".bilibili-player-video-control, .squirtle-controller", fullscreenSendbar: ".bilibili-player-video-sendbar.active, .bpx-player-sending-bar.active", autoHideCheck: ".bilibili-player-no-cursor, .bpx-state-no-cursor", }, ); unsafeWindow.BilibiliTimer.selector.fullscreen = (function () { try { unsafeWindow.document.querySelector(":fullscreen"); // Let's try the standard selector return ":fullscreen"; } catch { // Just keep going } try { unsafeWindow.document.querySelector(":-webkit-full-screen"); // Maybe we should try webkit prefix return ":-webkit-full-screen"; } catch { // Just keep going } try { unsafeWindow.document.querySelector(":-moz-full-screen"); // Or firefox prefix return ":-moz-full-screen"; } catch { // Just keep going } try { unsafeWindow.document.querySelector(":-ms-fullscreen"); // Why you still using IE¿ return ":-ms-fullscreen"; } catch { // Well, I think we should give up console.error("BilibiliTimer: Believe it or not, there's no selector which can bring us the fullscreen node."); if (unsafeWindow.BilibiliTimer && unsafeWindow.BilibiliTimer.uninit) { unsafeWindow.BilibiliTimer.uninit(); } unsafeWindow.BilibiliTimerUninit = true; } })(); unsafeWindow.BilibiliTimer.classList = unsafeWindow.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 bpx-player-info-container", closeButton: "bilibili-player-video-info-close bpx-player-info-close", panel: "bilibili-player-video-info-panel bpx-player-info-panel", restartButton: "bilibili-player-iconfont icon-24repeaton", }, ); unsafeWindow.BilibiliTimer.setting = await script.getValue("setting", { on: ["SystemTime", "Track", "BufferTime", "CurrentPageAndWatchlater", "Watchlater"], off: [], }); $("body").attr("data-bilibiliTimerSettingOn", unsafeWindow.BilibiliTimer.setting.on.join(",")); unsafeWindow.BilibiliTimer.closeButtonText = unsafeWindow.BilibiliTimer.isLive("x", "[×]"); unsafeWindow.BilibiliTimer.smallModeButtonText = unsafeWindow.BilibiliTimer.isLive("_", "[_]"); unsafeWindow.BilibiliTimer.globallock = false; unsafeWindow.BilibiliTimer.widthSet = false; unsafeWindow.BilibiliTimer.onResizing = 0; if (unsafeWindow.BilibiliTimer.selector.autoHideCheck) { unsafeWindow.BilibiliTimer.mousemoveCount = 0; } unsafeWindow.BilibiliTimer.getControllerTop = function BilibiliTimerGetControllerTop() { const controller = $(unsafeWindow.BilibiliTimer.selector.controller); if (controller.closest(".mode-miniscreen")[0]) { return $(window).height(); } let _top = $(window).height() - controller.height(); const fullscreenSendbar = $(unsafeWindow.BilibiliTimer.selector.fullscreenSendbar); if (fullscreenSendbar[0]) { _top -= fullscreenSendbar.outerHeight(true); } return _top; }; $(window).on("resize.BilibiliTimer", () => { try { unsafeWindow.BilibiliTimer.onResizing = 1; } catch (e) { /* */ } }); $(document).on({ "mousemove.BilibiliTimer": function (e) { if (unsafeWindow.BilibiliTimer && unsafeWindow.BilibiliTimer.timer) { if (unsafeWindow.BilibiliTimer.onMousedown) { const maxTop = unsafeWindow.BilibiliTimer.getControllerTop() - unsafeWindow.BilibiliTimer.timer.outerHeight() - 10; const maxLeft = $(window).width() - unsafeWindow.BilibiliTimer.timer.outerWidth() - 10; unsafeWindow.BilibiliTimer.timer.css({ left: Math.max(Math.min(unsafeWindow.BilibiliTimer.timer.data("baseOffset").left + e.clientX, maxLeft), 10), top: Math.max(Math.min(unsafeWindow.BilibiliTimer.timer.data("baseOffset").top + e.clientY, maxTop), 10), }); unsafeWindow.getSelection().removeAllRanges(); } if (unsafeWindow.BilibiliTimer.selector.autoHideCheck) { unsafeWindow.BilibiliTimer.mousemoveCount = 0; } } }, "mouseup.BilibiliTimer": function () { if (unsafeWindow.BilibiliTimer && unsafeWindow.BilibiliTimer.timer && unsafeWindow.BilibiliTimer.onMousedown) { unsafeWindow.BilibiliTimer.onMousedown = false; unsafeWindow.BilibiliTimer.timer.removeClass("dragging"); script.setValue("offset", { top: unsafeWindow.BilibiliTimer.timer.css("top"), left: unsafeWindow.BilibiliTimer.timer.css("left"), }); } }, }); unsafeWindow.BilibiliTimer.template = {}; const timer = unsafeWindow.BilibiliTimer.template.timer = $("<div/>"); timer.attr("id", "BilibiliTimer").addClass(unsafeWindow.BilibiliTimer.classList.timer); const closeButton = unsafeWindow.BilibiliTimer.template.closeButton = $("<a/>"); closeButton.text(unsafeWindow.BilibiliTimer.closeButtonText).attr({ href: "javascript:void(0);", id: "BilibiliTimerCloseButton", }); closeButton.addClass(unsafeWindow.BilibiliTimer.classList.closeButton); const restartButton = unsafeWindow.BilibiliTimer.template.restartButton = $("<a/>"); restartButton.attr({ href: "javascript:void(0);", id: "BilibiliTimerRestartButton", title: "如果发现浮窗出现问题,\n例如无法正常拖动,无法正常显示时间等,\n请点击该按钮重建浮窗尝试修复!", }); restartButton.addClass(unsafeWindow.BilibiliTimer.classList.closeButton).addClass(unsafeWindow.BilibiliTimer.classList.restartButton); const smallModeButton = unsafeWindow.BilibiliTimer.template.smallModeButton = $("<a/>"); smallModeButton.text(unsafeWindow.BilibiliTimer.smallModeButtonText).attr({ href: "javascript:void(0);", id: "BilibiliTimerSmallModeButton", title: "点击切换显示模式", }); smallModeButton.addClass(unsafeWindow.BilibiliTimer.classList.closeButton); const panel = unsafeWindow.BilibiliTimer.template.panel = $("<div/>"); panel.addClass(unsafeWindow.BilibiliTimer.classList.panel); panel.append('<div class="info-line BilibiliTimerDisplayInlineInSmallMode" id="BilibiliTimerSystemTime"><span class="info-title">系统时间:</span><span class="info-data" id="BilibiliTimerNowTime"> - </span></div>'); panel.append(unsafeWindow.BilibiliTimer.isLive('<div class="info-line BilibiliTimerDisplayInlineInSmallMode" id="BilibiliTimerTrack"><span class="info-title">缓冲质量:</span><span class="info-data">当前缓冲时长 <span id="BilibiliTimerVideoBufferedTimeRange"> - </span>s</span></div>', '<div class="info-line BilibiliTimerDisplayInlineInSmallMode" id="BilibiliTimerTrack"><span class="info-title">播放进度:</span><span class="info-data"><span id="BilibiliTimerVideoTime"> - </span><span class="BilibiliTimerHideInSmallMode">(已播放<span id="BilibiliTimerVideoTimePercents"> - </span>%)</span></span></div><div class="info-line BilibiliTimerDisplayInlineInSmallMode" id="BilibiliTimerBufferTime"><span class="info-title">加载进度:</span><span class="info-data"><span class="BilibiliTimerHideInSmallMode"><span id="BilibiliTimerVideoBufferedTime"> - </span>(剩余</span>缓冲时长 <span id="BilibiliTimerVideoBufferedTimeRange"> - </span>s<span class="BilibiliTimerHideInSmallMode">,已缓冲<span id="BilibiliTimerVideoBufferedTimePercents"> - </span>%)</span></span></div>')); unsafeWindow.BilibiliTimer.init = async function BilibiliTimerInit() { if (unsafeWindow.BilibiliTimerUninit) { return false; } if (!$(unsafeWindow.BilibiliTimer.selector.container)[0] && ++unsafeWindow.BilibiliTimer._loop_count > 150) { return unsafeWindow.BilibiliTimer.uninit(); } unsafeWindow.BilibiliTimer.onResizing = 0; unsafeWindow.BilibiliTimer.widthSet = false; unsafeWindow.BilibiliTimer.timer = unsafeWindow.BilibiliTimer.template.timer.clone(); unsafeWindow.BilibiliTimer.closeButton = unsafeWindow.BilibiliTimer.template.closeButton.clone(); unsafeWindow.BilibiliTimer.restartButton = unsafeWindow.BilibiliTimer.template.restartButton.clone(); unsafeWindow.BilibiliTimer.smallModeButton = unsafeWindow.BilibiliTimer.template.smallModeButton.clone(); unsafeWindow.BilibiliTimer.panel = unsafeWindow.BilibiliTimer.template.panel.clone(); unsafeWindow.BilibiliTimer.timer.append(unsafeWindow.BilibiliTimer.closeButton).append(unsafeWindow.BilibiliTimer.restartButton).append(unsafeWindow.BilibiliTimer.smallModeButton).append(unsafeWindow.BilibiliTimer.panel); (function loop(BilibiliTimer, $) { if (BilibiliTimer.isNewPlayPage && [ $("#arc_toolbar_report > .ops > .like").text(), $("#arc_toolbar_report > .ops > .coin, #toolbar_module .coin-info span").text(), $("#arc_toolbar_report > .ops > .collect").text(), ].includes("--")) { return setTimeout(loop, 200, BilibiliTimer, $); } })(unsafeWindow.BilibiliTimer, $); unsafeWindow.BilibiliTimer.timer.on("mousedown", (e) => { const baseX = Math.max(e.clientX, 0); const baseY = Math.max(e.clientY, 0); const baseOffsetX = Math.max(parseInt(unsafeWindow.BilibiliTimer.timer.css("left")), 0); const baseOffsetY = Math.max(parseInt(unsafeWindow.BilibiliTimer.timer.css("top")), 0); unsafeWindow.BilibiliTimer.timer.data("baseOffset", { left: baseOffsetX - baseX, top: baseOffsetY - baseY, }); unsafeWindow.BilibiliTimer.onMousedown = true; unsafeWindow.BilibiliTimer.timer.addClass("dragging"); }); unsafeWindow.BilibiliTimer.closeButton.on("click", () => { unsafeWindow.BilibiliTimer.globallock = true; unsafeWindow.BilibiliTimer.timer.dequeue().clearQueue().css({ opacity: "0", "pointer-events": "none", }).delay(370).queue(() => { timer.hide().dequeue(); }); return false; }); unsafeWindow.BilibiliTimer.restartButton.on("click", () => { unsafeWindow.BilibiliTimer.restart("User order", ""); return false; }); unsafeWindow.BilibiliTimer.smallModeButton.on("click", () => { $("body").toggleClass("BilibiliTimerSmallMode"); localStorage.setItem("BilibiliTimerSmallMode", $("body").is(".BilibiliTimerSmallMode") ? "true" : "false"); return false; }); if (localStorage.getItem("BilibiliTimerSmallMode") === "true") { $("body").addClass("BilibiliTimerSmallMode"); } if (!await script.getValue("offset")) { unsafeWindow.BilibiliTimer.timer.css({ left: "auto", right: "10px", top: "10px", }); } else { unsafeWindow.BilibiliTimer.timer.css(await script.getValue("offset")); } $(unsafeWindow.BilibiliTimer.selector.container).append(unsafeWindow.BilibiliTimer.timer); $(window).resize(); }; unsafeWindow.BilibiliTimer.globalWatcher = async function BilibiliTimerGlobalWatcher() { if (unsafeWindow.BilibiliTimerUninit) { return false; } const timer = unsafeWindow.BilibiliTimer.timer; if (!timer || !timer[0]) { unsafeWindow.BilibiliTimer.init(); return; } if ($("object#player_placeholder, object#player_object")[0]) { unsafeWindow.BilibiliTimer.uninit(); return; } if (!timer.closest("body")[0]) { unsafeWindow.BilibiliTimer.restart("Timer did not exist in document.body", timer.closest("body")[0]); return; } if (unsafeWindow.BilibiliTimer.realWindow.document.querySelector(unsafeWindow.BilibiliTimer.selector.fullscreen)) { if (await script.getValue("autoHidden") && (unsafeWindow.BilibiliTimer.selector.autoHideCheck ? $(unsafeWindow.BilibiliTimer.selector.autoHideCheck)[0] : unsafeWindow.BilibiliTimer.mousemoveCount >= 3)) { unsafeWindow.BilibiliTimer.autoHidden = true; } else { unsafeWindow.BilibiliTimer.autoHidden = false; } if (!unsafeWindow.BilibiliTimer.globallock && !unsafeWindow.BilibiliTimer.autoHidden) { if (!timer.is(":visible") || timer.css("opacity") !== "1") { timer.dequeue().clearQueue().show().css({ opacity: "1", "pointer-events": "auto", }); } if (unsafeWindow.BilibiliTimer.onResizing === 2) { unsafeWindow.BilibiliTimer.onResizing = 0; const maxTop = unsafeWindow.BilibiliTimer.getControllerTop() - timer.outerHeight() - 10; const 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), }); script.setValue("offset", { top: timer.css("top"), left: timer.css("left"), }); } else if (unsafeWindow.BilibiliTimer.onResizing === 1) { unsafeWindow.BilibiliTimer.onResizing = 2; } const date = unsafeWindow.BilibiliTimer.date(); timer.find("#BilibiliTimerNowTime").html(`<span class="BilibiliTimerHideInSmallMode BilibiliTimerWhiteSpacePre">${date.getFullYear()}-${date.getMonth()}-${date.getDate()} </span>${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`); if (!unsafeWindow.BilibiliTimer.widthSet) { unsafeWindow.BilibiliTimer.heightCalc(); } } } else { unsafeWindow.BilibiliTimer.onResizing = 0; unsafeWindow.BilibiliTimer.globallock = false; timer.dequeue().clearQueue().css("opacity", "0").delay(370).queue(() => { timer.hide().dequeue(); }); } const video = $("video")[0]; if (!video) { unsafeWindow.BilibiliTimer.restart("No Video", null); return; } if (!video.dataset.isTrusted) { video.dataset.isTrusted = "true"; video.addEventListener("timeupdate", unsafeWindow.BilibiliTimer.videoPlayListener); video.addEventListener("progress", unsafeWindow.BilibiliTimer.videoProgressListener); } if ((timer.find("#BilibiliTimerVideoTimePercents").text() + timer.find("#BilibiliTimerVideoBufferedTimeRange").text() + timer.find("#BilibiliTimerVideoTime").text()).includes("-")) { unsafeWindow.BilibiliTimer.videoPlayListener({ target: video[0], }); unsafeWindow.BilibiliTimer.videoProgressListener({ target: video[0], }); } }; unsafeWindow.BilibiliTimer.autoHideWatcher = async function BilibiliTimerAutoHideWatcher() { if (!await script.getValue("autoHidden")) { return; } if (unsafeWindow.BilibiliTimer.selector.autoHideCheck ? $(unsafeWindow.BilibiliTimer.selector.autoHideCheck)[0] : unsafeWindow.BilibiliTimer.mousemoveCount >= 3) { unsafeWindow.BilibiliTimer.autoHidden = true; unsafeWindow.BilibiliTimer.timer.dequeue().clearQueue().css("opacity", "0").delay(370).queue(() => { timer.hide().dequeue(); }); } if (unsafeWindow.BilibiliTimer.selector.autoHideCheck) { unsafeWindow.BilibiliTimer.mousemoveCount++; } }; unsafeWindow.BilibiliTimer.lazyWatcher = function BilibiliTimerLazyWatcher() { if (!unsafeWindow.BilibiliTimer || !unsafeWindow.BilibiliTimer.timer) { return; } unsafeWindow.BilibiliTimer.heightCalc(); }; unsafeWindow.BilibiliTimer.heightCalc = function BilibiliTimerWidthCalc() { if (!unsafeWindow.BilibiliTimer || !unsafeWindow.BilibiliTimer.timer) { return; } const timer = unsafeWindow.BilibiliTimer.timer; timer.find(".info-line").each(function () { if ($(this).css("height", "unset").height() === 0) { return; } let maxHeight = 0; $(this).css("height", "unset").children().each(function () { const _height = $(this).height(); if (maxHeight < _height) { maxHeight = _height; } }); $(this).height(maxHeight); }); unsafeWindow.BilibiliTimer.widthSet = true; $(window).resize(); }; unsafeWindow.BilibiliTimer.timeParse = function BilibiliTimerTimeParse(_time) { const time = parseInt(_time); let sec = time % 60; const min = (time - sec) / 60; if (sec < 10) { sec = `0${sec}`; } return `${min}:${sec}`; }; unsafeWindow.BilibiliTimer.videoPlayListener = function BilibiliTimerVideoPlayListener(e) { if (!e.target) { return; } const video = e.target; const curTime = video.currentTime || 0; const durTime = video.duration || 0; if (!curTime && !durTime) { return; } if (!unsafeWindow.BilibiliTimer || !unsafeWindow.BilibiliTimer.timer) { return; } const timer = unsafeWindow.BilibiliTimer.timer; timer.find("#BilibiliTimerVideoTime").text(`${unsafeWindow.BilibiliTimer.timeParse(curTime)} / ${unsafeWindow.BilibiliTimer.timeParse(durTime)}`); if (timer.find("#BilibiliTimerVideoBufferedTime")[0]) { let 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)); }; unsafeWindow.BilibiliTimer.videoProgressListener = function BilibiliTimerVideoProgressListener(e) { if (!e.target) { return; } let video = e.target; const curTime = video.currentTime || 0; const durTime = video.duration || 0; if (!curTime && !durTime) { return; } if (!unsafeWindow.BilibiliTimer || !unsafeWindow.BilibiliTimer.timer) { return; } const timer = unsafeWindow.BilibiliTimer.timer; if (timer.find("#BilibiliTimerVideoBufferedTimeRange")[0]) { video = e.target; let end; try { end = video.buffered.end(video.buffered.length - 1); } catch (_) { try { end = video.buffered.end(0); } catch (_) { return; } } if (timer.find("#BilibiliTimerVideoBufferedTimeRange").text() === " - ") { unsafeWindow.BilibiliTimer.widthSet = false; } if (timer.find("#BilibiliTimerVideoTime").text() === " - ") { $(video).trigger("timeupdate"); } timer.find("#BilibiliTimerVideoBufferedTime").text(unsafeWindow.BilibiliTimer.timeParse(end)); unsafeWindow.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)); }; unsafeWindow.BilibiliTimer.start = function BilibiliTimerStart() { if (unsafeWindow.BilibiliTimerUninit) { return false; } if (location.host === "bangumi.bilibili.com") { return false; } if (!unsafeWindow.BilibiliTimer.interval) { unsafeWindow.BilibiliTimer.interval = {}; } if (!unsafeWindow.BilibiliTimer.interval.globalWatcher) { unsafeWindow.BilibiliTimer.interval.globalWatcher = unsafeWindow.setInterval(unsafeWindow.BilibiliTimer.globalWatcher, 100); } if (!unsafeWindow.BilibiliTimer.interval.autoHideWatcher) { unsafeWindow.BilibiliTimer.interval.autoHideWatcher = unsafeWindow.setInterval(unsafeWindow.BilibiliTimer.autoHideWatcher, 1e3); } if (!unsafeWindow.BilibiliTimer.interval.lazyWatcher) { unsafeWindow.BilibiliTimer.interval.lazyWatcher = unsafeWindow.setInterval(unsafeWindow.BilibiliTimer.lazyWatcher, 5e3); } try { const video = $("video"); setTimeout(() => { unsafeWindow.BilibiliTimer.videoPlayListener({ target: video[0], }); unsafeWindow.BilibiliTimer.videoProgressListener({ target: video[0], }); }, 100); } catch (_) { return; } }; unsafeWindow.BilibiliTimer.restart = function BilibiliTimerRestart(reason, node) { for (const i in unsafeWindow.BilibiliTimer.interval) { if (unsafeWindow.BilibiliTimer.interval[i]) { unsafeWindow.clearInterval(unsafeWindow.BilibiliTimer.interval[i]); } } if (unsafeWindow.BilibiliTimerUninit) { return false; } const timer = $("#BilibiliTimer"); if (timer[0]) { timer.dequeue().clearQueue().css("opacity", "0").delay(370).queue(() => { unsafeWindow.BilibiliTimer.rebuild(reason, node); timer.hide().dequeue(); }); } else { unsafeWindow.BilibiliTimer.rebuild(reason, node); } }; unsafeWindow.BilibiliTimer.rebuild = function BilibiliTimerRebuild(reason, node) { console.groupCollapsed("BilibiliTimerRebuildTrace:", reason, node); console.trace(); console.groupEnd(); unsafeWindow.BilibiliTimer = undefined; $("#BilibiliTimer").remove(); if (unsafeWindow.BilibiliTimerUninit) { return false; } setTimeout(() => { code(); }, 0); }; unsafeWindow.BilibiliTimer.uninit = function BilibiliTimerUninit() { for (const i in unsafeWindow.BilibiliTimer.interval) { if (unsafeWindow.BilibiliTimer.interval[i]) { unsafeWindow.clearInterval(unsafeWindow.BilibiliTimer.interval[i]); } } $("#BilibiliTimer").remove(); unsafeWindow.BilibiliTimer = undefined; unsafeWindow.BilibiliTimerUninit = true; }; unsafeWindow.BilibiliTimer.start(); }; const css = ` #BilibiliTimer { cursor: move; display: block; width: auto; z-index: 68; } #BilibiliTimer:not(.dragging){ transition: all .37s ease-in-out; } #BilibiliTimer.bpx-player-info-container a { color: #fff; } #BilibiliTimer.bilibili-player-video-info-container .bilibili-player-video-info-panel .info-line, #BilibiliTimer.bpx-player-info-container .bpx-player-info-panel .info-line { min-width: auto; max-width: 320px; display: flex; } #BilibiliTimer.bilibili-player-video-info-container .bilibili-player-video-info-panel .info-line span, #BilibiliTimer.bpx-player-info-container .bpx-player-info-panel .info-line span { display: inline; } #BilibiliTimer.bilibili-player-video-info-container .bilibili-player-video-info-panel .info-line>span #BilibiliTimer.bpx-player-info-container .bpx-player-info-panel .info-line>span { display: inline-block; } .bilibili-player-no-cursor #BilibiliTimer, .bpx-state-no-cursor #BilibiliTimer { opacity: .73; cursor: none; } #BilibiliTimer .info-title { width: 6em; margin: 0; } #BilibiliTimer .info-data { white-space: normal; vertical-align: top; } #BilibiliTimer .info-line:not(.BilibiliTimerDisplayInlineInSmallMode) .info-data { width: calc(100% - 6em); } #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; z-index: 99; } #BilibiliTimerRestartButton { top: auto; bottom: 10px; z-index: 99; } .bpx-player-info-container #BilibiliTimerRestartButton { bottom: 3px; right: 11px; } .bgray-btn-wrap .BilibiliTimer-hr { border-style: inset; border-width: 1px; margin: 0.5em auto; overflow: hidden; } #arc_toolbar_report>.ops>.more>.more-ops-list { width: auto; } body:not([data-bilibilitimersettingon*="SystemTime"]) #BilibiliTimerSystemTime, body:not([data-bilibilitimersettingon*="Track"]) #BilibiliTimerTrack, body:not([data-bilibilitimersettingon*="BufferTime"]) #BilibiliTimerBufferTime { height: 0 !important; overflow: hidden; width: 0; } .bilibili-player-video-info-container .bilibili-player-video-info-close#BilibiliTimerSmallModeButton, .bilibili-live-player-video-info-container .bilibili-live-player-video-info-close#BilibiliTimerSmallModeButton { right: 28px; z-index: 99; } .bpx-player-info-container .bpx-player-info-close#BilibiliTimerSmallModeButton { right: 30px; z-index: 99; } .bpx-player-info-container .icon-24repeaton:before { content: "🔄" } .BilibiliTimerSmallMode #BilibiliTimer { padding-right: 54px; } .BilibiliTimerSmallMode .BilibiliTimerHideInSmallMode, .BilibiliTimerSmallMode .BilibiliTimerDisplayInlineInSmallMode .info-title { display: none !important; } .BilibiliTimerSmallMode .BilibiliTimerDisplayInlineInSmallMode { display: inline !important; } .BilibiliTimerSmallMode .BilibiliTimerDisplayInlineInSmallMode:first-child { padding-left: 1em; } .BilibiliTimerSmallMode .BilibiliTimerDisplayInlineInSmallMode+.BilibiliTimerDisplayInlineInSmallMode::before { content: " | "; } .BilibiliTimerWhiteSpacePre { white-space: pre; } `; const c = unsafeWindow.setInterval(async () => { if (!unsafeWindow.jQuery) { return false; } if (!unsafeWindow.document.querySelector(".bilibili-live-player-video-area, .bilibili-player-video-wrap, .bpx-player-video-wrap") || !unsafeWindow.document.querySelector(".bilibili-live-player-video-area, .bilibili-player-video-wrap, .bpx-player-video-wrap").querySelector("video")) { return; } if (unsafeWindow.BilibiliTimerUninit || unsafeWindow.BilibiliTimer && unsafeWindow.BilibiliTimer.start) { return unsafeWindow.clearInterval(c); } if (/^https:\/\/www\.bilibili\.com\/video\/[ab]v/i.test(location.href) && parseInt((unsafeWindow.document.cookie.match(/stardustvideo=(-?\d+)/) || [0, "-1"])[1]) > 0) { if ([ unsafeWindow.document.querySelector("#arc_toolbar_report > .ops > .like")?.innerText || "--", unsafeWindow.document.querySelector("#arc_toolbar_report > .ops > .coin")?.innerText || "--", unsafeWindow.document.querySelector("#arc_toolbar_report > .ops > .collect")?.innerText || "--", ].includes("--")) { return false; } } unsafeWindow.console.info(`%c${script.scriptMeta.name}@${script.scriptMeta.version} by ${script.scriptMeta.author} is running!`, `padding: 34px 66px 34px 66px; line-height: 64px; background:url('${script.scriptMeta.icon64}') top left no-repeat; background-position-y: 4px;`); script.addStyle(css); if (unsafeWindow.top === unsafeWindow.window) { const div = document.createElement("div"); div.id = "BilibiliTimerConfig"; div.setAttribute("style", "position: fixed; right: 1em; bottom: 1em; background: white; border: 1px solid gray; border-radius: 0.2em; width: 4em; height: 3em; padding: 0.25em; line-height: 1; font-size: 16px; text-align: center; cursor: pointer; display: none;"); let visibility = await script.getValue("visibility", true) !== false; div.innerText = visibility ? "关闭全屏时间进度浮窗" : "开启全屏时间进度浮窗"; div.addEventListener("click", () => { visibility = !visibility; script.setValue("visibility", visibility); div.innerText = visibility ? "关闭全屏时间进度浮窗" : "开启全屏时间进度浮窗"; if (visibility) { unsafeWindow.BilibiliTimerUninit = false; unsafeWindow.BilibiliTimer = {}; code(); } else if (unsafeWindow.BilibiliTimer && unsafeWindow.BilibiliTimer.uninit) { unsafeWindow.BilibiliTimer.uninit(); } }); document.body.append(div); } unsafeWindow.$("#BilibiliTimerConfig").show(); code(); }, 100); })();