// ==UserScript== // @name BilibiliTimer - B站H5播放器全屏下实时显示当前系统时间和播放进度 // @version 3.3.1 // @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 // @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 data:image/png;base64,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 // @icon64 data:image/png;base64,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 // @downloadURL none // ==/UserScript== /* eslint-disable require-atomic-updates */ "use strict"; (function () { /* 防止重复加载 */ 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 result = Date.prototype[key].apply(_date, a); if (key.includes("Month")) { result++; } if (typeof result === "number" && `${result}`.length === 1) { return `0${result}`; } return `${result}`; }; }); 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", controller: ".bilibili-player-video-control", fullscreenSendbar: ".bilibili-player-video-sendbar.active", autoHideCheck: ".bilibili-player-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", closeButton: "bilibili-player-video-info-close", panel: "bilibili-player-video-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 = $("
"); timer.attr("id", "BilibiliTimer").addClass(unsafeWindow.BilibiliTimer.classList.timer); const closeButton = unsafeWindow.BilibiliTimer.template.closeButton = $(""); closeButton.text(unsafeWindow.BilibiliTimer.closeButtonText).attr({ href: "javascript:void(0);", id: "BilibiliTimerCloseButton", }); closeButton.addClass(unsafeWindow.BilibiliTimer.classList.closeButton); const restartButton = unsafeWindow.BilibiliTimer.template.restartButton = $(""); 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 = $(""); 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 = $(""); panel.addClass(unsafeWindow.BilibiliTimer.classList.panel); panel.append('