多倍速调节+倍速同步+回车全屏+播完退出全屏

按自己的使用习惯用ChatGPT写的脚本,我自己测试过了没啥问题,分享给有同样习惯的小伙伴,以后应该不怎么改了,有自己需求的可以自行更改。

// ==UserScript==
// @name         多倍速调节+倍速同步+回车全屏+播完退出全屏
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  按自己的使用习惯用ChatGPT写的脚本,我自己测试过了没啥问题,分享给有同样习惯的小伙伴,以后应该不怎么改了,有自己需求的可以自行更改。
// @author       ChatGPT
// @match        *://www.bilibili.com/video/*
// @grant        none
// ==/UserScript==

(function() {
  'use strict';

      // 创建音量提示的div元素
    var volumeHint = document.createElement('div');
    volumeHint.classList.add('bpx-player-volume-hint');
    volumeHint.style.display = 'none';  // 初始隐藏

    // 创建音量提示文本元素
    var volumeText = document.createElement('span');
    volumeText.classList.add('bpx-player-volume-hint-text');
    volumeHint.appendChild(volumeText);

    // 将音量提示添加到B站播放器容器中
    var playerContainer = document.querySelector("#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area");
    playerContainer.appendChild(volumeHint);

  const BILIBILI_PLAYBACKRATE = "bilibili_playbackRate";

  // 监听视频播放事件
  const videoElement = document.querySelector('video');
  if (!videoElement) return;

  // 退出全屏函数
  function exitFullscreen() {
    if (document.exitFullscreen) {
      document.exitFullscreen();
    } else if (document.webkitExitFullscreen) {
      document.webkitExitFullscreen();
    } else if (document.mozCancelFullScreen) {
      document.mozCancelFullScreen();
    } else if (document.msExitFullscreen) {
      document.msExitFullscreen();
    }
  }

  function triggerFullScreenButton() {
    const fullScreenButton = document.querySelector('.bpx-player-ctrl-btn.bpx-player-ctrl-full');
    if (fullScreenButton) {
      fullScreenButton.click();
    }
  }

  // 监听回车键事件
  document.addEventListener('keydown', function(event) {
    if (event.key === 'Enter') {
      triggerFullScreenButton();
    }else if (event.key === 'PageUp' || event.key === '+') {
        setVideoPlaybackRate(getSavedPlaybackRate() + 0.5,true);
        event.preventDefault();
    } else if (event.key === 'PageDown' || event.key === '-') {
        setVideoPlaybackRate(getSavedPlaybackRate() - 0.5,true);
        event.preventDefault();
    }
  });

  videoElement.addEventListener('ended', () => {
    // 判断当前是否处于全屏状态
    if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement) {
      // 连播状态是否开启,开启状态则不退出
      const switchButtonSpan = document.querySelector('.switch-button:not(.on)');
      if (switchButtonSpan) {
        // 退出全屏
        exitFullscreen();
      }
    }
  });

  // 设置视频倍速
  const observer = new MutationObserver(() => {
    const menu = document.querySelector('.bpx-player-ctrl-playbackrate-menu');
    if (!menu) {
      return;
    }

    observer.disconnect();

    const speeds = [4.0, 3.5, 3.0, 2.5, 2.0, 1.75, 1.5, 1.25, 1.0, 0.75, 0.5];

    const items = menu.querySelectorAll('.bpx-player-ctrl-playbackrate-menu-item');
    items.forEach(item => item.remove());

    speeds.forEach(speed => {
      const item = document.createElement('li');
      item.classList.add('bpx-player-ctrl-playbackrate-menu-item');
      item.setAttribute('data-value', speed.toString());
      item.textContent = speed.toString();
      menu.appendChild(item);

      // 添加点击事件处理程序
      item.addEventListener('click', () => {
        const selectedSpeed = parseFloat(item.getAttribute('data-value'));
        // 将选中的倍速值保存到localStorage
        localStorage.setItem(BILIBILI_PLAYBACKRATE, selectedSpeed.toString());

        // 移除其他项的选中状态,只在点击的项上添加选中状态
        items.forEach(otherItem => otherItem.classList.remove('bpx-state-active'));
        item.classList.add('bpx-state-active');

        setVideoPlaybackRate(selectedSpeed); // 设置视频倍速
      });
    });

    const defaultSpeed = 1.0;
    const savedSpeed = getSavedPlaybackRate();
    if (savedSpeed) {
      setVideoPlaybackRate(savedSpeed);
      const activeItem = menu.querySelector(`.bpx-player-ctrl-playbackrate-menu-item[data-value="${savedSpeed}"]`);
      if (activeItem) {
        activeItem.classList.add('bpx-state-active');
      }
      console.log('设置为上次设置的倍速: ', savedSpeed);
    } else {
      setVideoPlaybackRate(defaultSpeed);
      const activeItem = menu.querySelector(`.bpx-player-ctrl-playbackrate-menu-item[data-value="${defaultSpeed}"]`);
      if (activeItem) {
        activeItem.classList.add('bpx-state-active');
      }
      console.log('缓存未找到上次设置的倍速,使用默认倍速: ', defaultSpeed);
    }

  });

  observer.observe(document.documentElement, {
    childList: true,
    subtree: true
  });

  // 读取localStorage中的倍速值
  function getSavedPlaybackRate() {
    const savedSpeed = localStorage.getItem(BILIBILI_PLAYBACKRATE);
    if (savedSpeed) {
      return parseFloat(savedSpeed);
    }
    return null;
  }

  function formatNumber(number) {
    // 判断是否为整数
    if (number % 1 === 0) {
        return number + '.0';
    } else {
        return number.toString();
    }
  }

  // 定义一个函数来设置视频倍速
  function setVideoPlaybackRate(rate,isHint) {
    const menu = document.querySelector('.bpx-player-ctrl-playbackrate-menu');
    if (!menu) return;

    const menuItem = menu.querySelector(`.bpx-player-ctrl-playbackrate-menu-item[data-value="${rate}"]`);
    if (menuItem) {
      menuItem.click(); // Simulate clicking the menu item
    }

    if(isHint){
      // 在事件处理程序中设置音量提示文本
      var customText = '倍速 ' + formatNumber(getSavedPlaybackRate());  // 替换为您想要的文本
      volumeText.textContent = customText;

      // 显示音量提示
      volumeHint.style.display = 'block';

      // 设置1秒后自动隐藏音量提示
      setTimeout(function() {
          volumeHint.style.display = 'none';
      }, 500); // 1秒后隐藏
    }
  }

})();