中国继续教育倍速控制

Adds a speed control UI to the left center of the page for controlling playback speed on NCME course videos.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         中国继续教育倍速控制
// @namespace    http://your-namespace.com
// @version      1.2
// @description  Adds a speed control UI to the left center of the page for controlling playback speed on NCME course videos.
// @match        https://www.ncme.org.cn/*
// @run-at       document-idle
// @license MIT
// ==/UserScript==
(function() {
  'use strict';

  const playbackSpeeds = [1.0, 10.0, 16.0]; // 可选的播放速度倍数
  let selectedSpeed = 10.0; // 默认选择10.0倍速
  let lastSetSpeed = 10.0; // 上一次设置的播放速度

  // 添加播放速度控制面板
  function addSpeedControlPanel() {
    const controlPanel = document.createElement('div');
    controlPanel.style.position = 'fixed';
    controlPanel.style.top = '50%';
    controlPanel.style.left = '10px';
    controlPanel.style.transform = 'translateY(-50%)';
    controlPanel.style.zIndex = '9999';

    // 添加速度按钮
    playbackSpeeds.forEach(speed => {
      const speedButton = document.createElement('button');
      speedButton.innerText = speed + 'X';
      speedButton.style.display = 'block';
      speedButton.style.margin = '5px 0';
      speedButton.addEventListener('click', () => {
        setPlaybackSpeed(speed);
      });
      controlPanel.appendChild(speedButton);
    });

    // 显示当前播放速度
    const speedDisplay = document.createElement('div');
    speedDisplay.id = 'speedDisplay';
    speedDisplay.innerText = '当前播放速度:' + selectedSpeed + 'X';
    controlPanel.appendChild(speedDisplay);

    document.body.appendChild(controlPanel);
  }

  // 设置视频播放速度
  function setPlaybackSpeed(speed) {
    const videoElement = document.querySelector('video');
    if (videoElement) {
      videoElement.playbackRate = speed;
      selectedSpeed = speed;
      lastSetSpeed = speed;
      updateSpeedDisplay();
    }
  }

  // 更新当前播放速度显示
  function updateSpeedDisplay() {
    const speedDisplay = document.querySelector('#speedDisplay');
    if (speedDisplay) {
      speedDisplay.innerText = '当前播放速度:' + selectedSpeed + 'X';
    }
  }

  // 获取当前视频播放速度
  function getCurrentPlaybackSpeed() {
    const videoElement = document.querySelector('video');
    return videoElement ? videoElement.playbackRate : null;
  }

  // 每10秒获取一次当前视频播放速度
  function updateCurrentPlaybackSpeed() {
    const currentSpeed = getCurrentPlaybackSpeed();
    if (currentSpeed !== null) {
      selectedSpeed = currentSpeed;
      updateSpeedDisplay();
      if (currentSpeed < lastSetSpeed) {
        setPlaybackSpeed(lastSetSpeed);
      }
    }
  }

  // 每10秒检查一次播放速度是否符合选择的倍数
  function checkPlaybackSpeed() {
    const currentSpeed = getCurrentPlaybackSpeed();
    if (currentSpeed !== selectedSpeed) {
      setPlaybackSpeed(selectedSpeed);
    }
  }

  // 保存和加载播放速度
  function saveSelectedSpeed() {
    localStorage.setItem('ncmeSelectedSpeed', selectedSpeed);
  }

  function loadSelectedSpeed() {
    const storedSpeed = localStorage.getItem('ncmeSelectedSpeed');
    selectedSpeed = storedSpeed ? parseFloat(storedSpeed) : 10.0;
    lastSetSpeed = selectedSpeed;
    setPlaybackSpeed(selectedSpeed);
  }

  // 触发on_player_start事件
  function triggerOnPlayerStart() {
    const event = new Event('on_player_start');
    window.dispatchEvent(event);
  }

  // 在页面加载完成后检查视频并自动播放视频
  function onPageLoaded() {
    loadSelectedSpeed(); // 加载之前保存的播放速度
    const videoElement = document.querySelector('video');
    if (videoElement && videoElement.paused) {
      videoElement.play();
    }

  }

  // 监听视频加载事件和修改播放速度事件
  window.addEventListener('on_cc_live_player_load', onPageLoaded);

  // 每10秒更新当前播放速度
  setInterval(updateCurrentPlaybackSpeed, 10000);

  // 每10秒检查一次播放速度是否符合选择的倍数
  setInterval(checkPlaybackSpeed, 10000);

  // 添加速度控制面板
  addSpeedControlPanel();

  // 在页面关闭前保存播放速度
  window.addEventListener('beforeunload', saveSelectedSpeed);
})();