// ==UserScript==
// @name 自定义哔哩哔哩视频播放速度
// @namespace http://tampermonkey.net/
// @version 0.1.2
// @description 可以使用按键 z(恢复1倍速)、x(减0.1)、c(加0.1)调整倍速,支持0.1-5倍速,支持记住播放速度
// @author felix
// @match https://www.bilibili.com/video/*
// @grant GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @downloadURL none
// ==/UserScript==
(function () {
'use strict';
var STORAGE_KEY = {
BILIBILI_VIDEO_SPEED: "bilibili_video_speed"
}
var SETTING = {
STEP_SIZE: 0.1,
MAX_SPEED: 5,
MIN_SPEED: 0.1,
REMEMBER_SPEED_MENU_ID: null
};
var autoAddInterval = setInterval(addButton, 5000);
function addButton() {
clearInterval(autoAddInterval);
var viewboxReport = document.getElementById("arc_toolbar_report");
var div = document.createElement("div");
div.innerHTML = '';
viewboxReport.appendChild(div);
document.getElementById("reduce").onclick = function () { reduceSpeed(); };
document.getElementById("add").onclick = function () { addSpeed(); };
loadSpeed();
}
function loadSpeed() {
var speed = localStorage.getItem(STORAGE_KEY.BILIBILI_VIDEO_SPEED);
if (speed) {
changeSpeed(speed)
loadRemoveSpeedMenu();
} else {
changeSpeed(1)
loadSaveSpeedMenu();
}
}
function reduceSpeed(STEP_SIZE) {
if (!STEP_SIZE) STEP_SIZE = SETTING.STEP_SIZE;
var speedSpan = document.getElementById("speed");
var playSpeed = Number((Number(speedSpan.innerText) * 10 - STEP_SIZE * 10) / 10).toFixed(1);
changeSpeed(playSpeed);
}
function addSpeed(STEP_SIZE) {
if (!STEP_SIZE) STEP_SIZE = SETTING.STEP_SIZE;
var speedSpan = document.getElementById("speed");
var playSpeed = Number((Number(speedSpan.innerText) * 10 + STEP_SIZE * 10) / 10).toFixed(1);
changeSpeed(playSpeed);
}
function changeSpeed(playSpeed) {
if (playSpeed && playSpeed >= SETTING.MIN_SPEED && playSpeed <= SETTING.MAX_SPEED) {
document.querySelector('video').PLAYBACKRATE = playSpeed;
var speedSpan = document.getElementById("speed");
speedSpan.innerText = playSpeed;
}
}
function setSpeedToStorage() {
localStorage.setItem(STORAGE_KEY.BILIBILI_VIDEO_SPEED, document.querySelector('video').playbackRate);
GM_unregisterMenuCommand(SETTING.remember_speed_menu_id);
loadRemoveSpeedMenu();
}
function removeSpeedFromStorage() {
localStorage.removeItem(STORAGE_KEY.BILIBILI_VIDEO_SPEED);
GM_unregisterMenuCommand(SETTING.remember_speed_menu_id);
loadSaveSpeedMenu();
}
function loadSaveSpeedMenu() {
var remember_speed_menu_id = GM_registerMenuCommand("记住播放速度", setSpeedToStorage);
SETTING.remember_speed_menu_id = remember_speed_menu_id;
}
function loadRemoveSpeedMenu() {
var remember_speed_menu_id = GM_registerMenuCommand("忘记播放速度", removeSpeedFromStorage);
SETTING.remember_speed_menu_id = remember_speed_menu_id;
}
// 键盘快捷键
document.onkeydown = function (e) {
if (e.target.nodeName !== 'BODY') return;
if (/^[zxcZXC]$/.test(e.key)) {
if (e.key === 'z' || e.key === 'Z') {
changeSpeed(1);
}
if (e.key === 'x' || e.key === 'X') {
reduceSpeed();
}
if (e.key === 'c' || e.key === 'C') {
addSpeed();
}
}
};
})();