bilibili视频倍速

在B站的倍速选择中添加拖动条设置倍速

// ==UserScript==
// @name         bilibili视频倍速
// @namespace    http://tampermonkey.net/
// @version      2025-08-17
// @description  在B站的倍速选择中添加拖动条设置倍速
// @author       Peng
// @match        *://bilibili.tv/*
// @match        *://www.bilibili.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==
const sliderHTML = `
    <div class="bpx-player-speed-slider" style="padding: 8px 12px;">
        <div class="bpx-player-speed-slider-header">
            <div class="bpx-player-speed-selected">custom speed (<span class="bpx-player-speed-value">1.0</span>)</div>
        </div>
        <div class="bpx-player-speed-slider-container">
            <div class="bpx-player-speed-indicator">
                <li class="bpx-player-speed-text bpx-player-ctrl-playbackrate-menu-item" data-value="1.00">1.00x</li>
            </div>
            <input id="bpx-player-speed-slider"
                   type="range"
                   min="0.25"
                   max="4"
                   step="0.05"
                   value="1.0"
                   style="width: 100%; margin: 8px 0;">
        </div>
    </div>
    `; // 拖动条html ai写的,感觉比较蠢,不过html只要能用就行,就懒得改了
function changeSpeed()
{
    // const text=[1.75,2,2.25,2.5,2.75,3,3.25,3.5,3.75,4].reverse();
    // text=text.map(sp=>`<li class="bpx-player-ctrl-playbackrate-menu-item" data-value="${sp}">${sp}x</li>`).join("");
    const a = document.querySelector(".bpx-player-ctrl-playbackrate-menu"); // ul 菜单
    if (!a) return;
    // document.querySelectorAll(".bpx-player-ctrl-playbackrate-menu-item")[0].remove(); //移除2倍速
    a.insertAdjacentHTML('afterbegin',sliderHTML);
    const slider = document.getElementById('bpx-player-speed-slider'); // 拖动条 input
    const speedText = document.querySelector(".bpx-player-speed-text"); // li
    const speedValue = document.querySelector(".bpx-player-speed-value"); // 文本显示 div
    // const result=document.querySelector(".bpx-player-ctrl-playbackrate-result");
    slider.addEventListener("input", function() { // 用户拖动时
        const value = parseFloat(this.value).toFixed(2);
        console.log(slider.value);
        speedText.textContent = `${value}x`;
        speedValue.textContent = value;
        speedText.dataset.value = value;
    });
    slider.addEventListener("change", function() { // 用户拖动结束后
        speedText.click();
    });
}
(function() {
    'use strict';
    const timeout = 5000; // 5秒超时
    const startTime = Date.now();

    var interval = setInterval(function() {
    var confirmButton = document.querySelector('.bpx-player-ctrl-playbackrate-menu');
    if (confirmButton) {
        changeSpeed();
        clearInterval(interval); // 取消定时器
    } else if (Date.now() - startTime > timeout) {
        clearInterval(interval);
    }
}, 500);
})();