您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
纯净 & 原生
- // ==UserScript==
- // @name Bilibili Pure
- // @name:zh-CN Bilibili 纯净
- // @description Pure & Native
- // @description:zh-CN 纯净 & 原生
- // @namespace https://greasyfork.org/users/197529
- // @version 0.5.1
- // @author kkocdko
- // @license Unlicense
- // @match *://*.bilibili.com/robots.txt
- // @match *://*.bilibili.com/video/*
- // ==/UserScript==
- "use strict";
- if (location.host === "m.bilibili.com")
- throw alert("Bilibili Pure dosen't supports m.bilibili.com domain.");
- if (location.pathname !== "/robots.txt") {
- localStorage.bpTitle = __INITIAL_STATE__.videoData.title;
- localStorage.bpBvid = __INITIAL_STATE__.bvid;
- localStorage.bpDash = JSON.stringify(__playinfo__.data.dash);
- location = "https://www.bilibili.com/robots.txt#" + __INITIAL_STATE__.bvid;
- throw "jump to clean page";
- }
- document.head.insertAdjacentHTML(
- "beforeend",
- `
- <meta name="viewport" content="width=device-width">
- <!-- <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> -->
- <style>
- body { display: flex; justify-content: center; align-items: center; margin: 0; height: 100vh; overflow: hidden; }
- body > :not(video) { display: none; }
- video { max-width: 100%; max-height: 100%; outline: none; }
- </style>
- `
- );
- // TODO: show parts and serials list
- (async () => {
- if (!localStorage.bpTitle) return;
- document.title = localStorage.bpTitle;
- localStorage.bpTitle = undefined;
- const bvid = localStorage.bpBvid;
- localStorage.bpBvid = undefined;
- history.pushState(null, null, `https://www.bilibili.com/video/${bvid}`);
- const dash = JSON.parse(localStorage.bpDash);
- localStorage.bpDash = undefined;
- const min = (arr, f = (e) => e) => {
- let ret = null;
- for (const e of arr) if (ret === null || f(e) < f(ret)) ret = e;
- return ret;
- }; // TODO: HD
- const aInfo = min(dash.audio, (e) => e.bandwidth);
- const vInfo = min(dash.video, (e) => (e.codecid === 7 ? -e.width : 9e9));
- const audio = document.createElement("audio");
- audio.src = aInfo.baseUrl;
- const video = document.createElement("video");
- video.src = vInfo.baseUrl;
- video.controls = true;
- video.onplay = () => {
- audio.play();
- };
- video.onpause = () => {
- audio.pause();
- };
- video.onratechange = () => {
- audio.playbackRate = video.playbackRate;
- };
- video.onseeking = () => {
- audio.pause();
- };
- let lastLostSync = 0;
- const sync = () => {
- const diff = Math.abs(audio.currentTime - video.currentTime); // unit: seconds
- if (diff <= 0.2) return;
- const now = Date.now();
- let reason = "";
- if (diff > 0.5) reason = "big_drop";
- if (now - lastLostSync < 750) reason = "double_miss";
- if (reason) {
- console.log(`[bp] sync, reason = ${reason}, diff = ${diff}`);
- audio.currentTime = video.currentTime;
- }
- lastLostSync = now;
- };
- video.onseeked = () => {
- sync();
- audio.play();
- };
- setInterval(sync, 500);
- // TODO: fix, chrome will auto pause slient video if you switch the tab
- document.body.innerHTML = "";
- document.body.appendChild(video);
- })();