// ==UserScript==
// @name Video Speed Controller
// @namespace http://mijikawa.top
// @version 0.11
// @description 中小学智慧教育平台加速、跳过视频,仅低于2倍速可用,跳过视频能正常答题
// @author mijikawa
// @match *://basic.smartedu.cn/*
// @grant none
// @downloadURL https://update.greasyfork.icu/scripts/491096/Video%20Speed%20Controller.user.js
// @updateURL https://update.greasyfork.icu/scripts/491096/Video%20Speed%20Controller.meta.js
// ==/UserScript==
(function() {
'use strict';
let autoPauseEnabled = true; // Flag to control automatic pause behavior
let lastPlayedVideo = null; // Variable to store the last played video element
// Function to detect video player type
function detectVideoPlayer() {
const videoPlayers = {
'html5': () => !!document.querySelector('video'), // HTML5 video player
'youtube': () => window.location.hostname.includes('youtube.com'), // YouTube video player
// Add more video player detection methods as needed
};
for (const [player, detect] of Object.entries(videoPlayers)) {
if (detect()) {
return player;
}
}
return null; // No supported video player detected
}
// Function to adjust video speed based on player type
function adjustVideoSpeed(speed) {
const playerType = detectVideoPlayer();
if (playerType === 'html5') {
const videos = document.querySelectorAll('video');
videos.forEach(video => {
video.playbackRate = speed;
});
} else if (playerType === 'youtube') {
// Adjust YouTube player speed
// Example: If using YouTube API, you can adjust speed with player.setPlaybackRate(speed);
// For simplicity, this example doesn't include the YouTube player API integration
console.log('Adjust YouTube player speed to ' + speed);
}
// Add more cases for other video player types as needed
}
// Create the floating control for toggling automatic pause
const autoPauseControl = document.createElement('div');
autoPauseControl.style.position = 'fixed';
autoPauseControl.style.top = '20px';
autoPauseControl.style.right = '20px';
autoPauseControl.style.backgroundColor = '#ffffff';
autoPauseControl.style.padding = '10px';
autoPauseControl.style.border = '1px solid #000000';
autoPauseControl.style.zIndex = '9999'; // Set z-index to a high value
autoPauseControl.innerHTML = `
`;
document.body.appendChild(autoPauseControl);
// Function to toggle automatic pause behavior
function toggleAutoPause() {
autoPauseEnabled = !autoPauseEnabled;
document.getElementById('autoPauseToggle').textContent = `Auto Pause: ${autoPauseEnabled ? 'On' : 'Off'}`;
}
// Listen for click event on auto pause toggle button
document.getElementById('autoPauseToggle').addEventListener('click', toggleAutoPause);
// Function to pause all videos
function pauseAllVideos() {
const videos = document.querySelectorAll('video');
videos.forEach(video => {
video.pause();
});
}
// Listen for visibility change to pause videos when the page is hidden
document.addEventListener('visibilitychange', function() {
if (document.visibilityState === 'hidden' && autoPauseEnabled) {
pauseAllVideos();
}
});
// Function to adjust video speed based on user selection
function adjustVideoSpeedOnSelection(speed) {
const videos = document.querySelectorAll('video');
videos.forEach(video => {
video.playbackRate = speed;
});
}
// Create the floating control for adjusting video speed
const speedControl = document.createElement('div');
speedControl.style.position = 'fixed';
speedControl.style.top = '60px';
speedControl.style.right = '20px';
speedControl.style.backgroundColor = '#ffffff';
speedControl.style.padding = '10px';
speedControl.style.border = '1px solid #000000';
speedControl.style.zIndex = '9999'; // Set z-index to a high value
speedControl.innerHTML = `
`;
document.body.appendChild(speedControl);
// Listen for changes in the speed selection
document.getElementById('speed').addEventListener('change', function() {
const selectedSpeed = parseFloat(this.value);
adjustVideoSpeedOnSelection(selectedSpeed);
});
// Function to skip video
function skipVideo() {
let video = document.getElementsByTagName('video')[0];
video.currentTime = video.duration;
}
// Create the floating control for skipping video
const skipButton = document.createElement('button');
skipButton.innerText = 'Skip Video';
skipButton.style.position = 'fixed';
skipButton.style.top = '100px'; // Adjust top position as needed
skipButton.style.right = '20px';
skipButton.style.backgroundColor = '#ffffff';
skipButton.style.padding = '10px';
skipButton.style.border = '1px solid #000000';
skipButton.style.zIndex = '9999'; // Set z-index to a high value
document.body.appendChild(skipButton);
// Listen for click event on skip video button
skipButton.addEventListener('click', skipVideo);
// Calculate the position for the skip button
function calculateSkipButtonPosition() {
const speedControlHeight = document.getElementById('speed').offsetHeight;
const autoPauseControlHeight = document.getElementById('autoPauseToggle').offsetHeight;
const skipButtonTop = 60 + speedControlHeight + autoPauseControlHeight + 20; // Adjust top position based on speed and auto pause control
skipButton.style.top = skipButtonTop + 'px';
}
// Listen for window resize to recalculate skip button position
window.addEventListener('resize', calculateSkipButtonPosition);
// Initial calculation of skip button position
calculateSkipButtonPosition();
// Function to monitor video playback and resume playback if video stops
function monitorVideoPlayback() {
const videos = document.querySelectorAll('video');
videos.forEach(video => {
if (!video.paused && video.currentTime === video.duration) {
video.currentTime = 0;
video.play();
}
lastPlayedVideo = video;
});
}
// Set an interval to monitor video playback periodically
setInterval(monitorVideoPlayback, 1000);
// Disable default pause behavior on all videos
document.querySelectorAll('video').forEach(video => {
video.addEventListener('pause', event => {
if (autoPauseEnabled) {
event.preventDefault();
event.stopPropagation();
lastPlayedVideo.play();
}
});
});
})();