Unpauses the video when changing tabs on Acellus ;)
当前为
// ==UserScript==
// @name Make any Acellus Video Unpaused
// @namespace https://greasyfork.org/en/users/1291009
// @version 1.8
// @description Unpauses the video when changing tabs on Acellus ;)
// @author BadOrBest
// @license MIT
// @icon https://www.google.com/s2/favicons?sz=64&domain=acellus.com
// @match https://admin192c.acellus.com/student/*
// @grant none
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
let isInPiPMode = false;
let isTabFocused = true;
let shouldTogglePlayer = true;
function unpauseMedia(mediaElements) {
mediaElements.forEach(function(mediaElement) {
if (document.hidden && !isTabFocused && mediaElement.paused && !mediaElement.getAttribute('data-user-paused')) {
mediaElement.play();
}
});
}
function controlMedia(mediaElements) {
unpauseMedia(mediaElements);
}
function handleVisibilityChange(mediaElements) {
if (document.hidden && !isTabFocused) {
controlMedia(mediaElements);
if (shouldTogglePlayer && !isInPiPMode) {
enterPIPMode(mediaElements);
}
} else {
if (!isTabFocused && isInPiPMode) {
exitPIPMode();
}
}
}
function handleMutations(mutationsList, observer) {
const mediaElements = document.querySelectorAll('video, audio, .plyr');
controlMedia(mediaElements);
}
const observer = new MutationObserver(handleMutations);
observer.observe(document.body, { subtree: true, childList: true });
// Initial check for existing media elements
controlMedia(document.querySelectorAll('video, audio, .plyr'));
// Function to enter Picture-in-Picture mode
function enterPIPMode(mediaElements) {
console.log('Attempting to enter PiP mode...');
if (document.pictureInPictureEnabled) {
mediaElements.forEach(function(mediaElement) {
if (mediaElement instanceof HTMLVideoElement && mediaElement.readyState >= 2) {
mediaElement.requestPictureInPicture()
.then(() => {
isInPiPMode = true;
console.log('Entered PiP mode successfully.');
})
.catch(error => {
console.error('Error entering PiP mode:', error);
});
}
});
} else {
console.error('Picture-in-Picture is not supported in this browser.');
}
}
// Function to exit Picture-in-Picture mode
function exitPIPMode() {
console.log('Exiting PiP mode...');
if (document.pictureInPictureElement) {
document.exitPictureInPicture()
.then(() => {
isInPiPMode = false;
console.log('Exited PiP mode successfully.');
})
.catch(error => {
console.error('Error exiting PiP mode:', error);
});
}
}
// Function to toggle the PiP mode
function togglePlayer(enabled) {
shouldTogglePlayer = enabled;
}
// Example usage: togglePlayer(true) to enable PiP mode, togglePlayer(false) to disable
// togglePlayer(false);
togglePlayer(false); // Default is disabled
// Event listener for visibility change
document.addEventListener('visibilitychange', function() {
const mediaElements = document.querySelectorAll('video, audio, .plyr');
handleVisibilityChange(mediaElements);
});
// Event listeners for focus change
window.addEventListener('focus', function() {
isTabFocused = true;
});
window.addEventListener('blur', function() {
isTabFocused = false;
});
// Event listeners to set and remove data-user-paused attribute when the user manually pauses or plays the video
document.addEventListener('play', function(event) {
event.target.removeAttribute('data-user-paused');
});
document.addEventListener('pause', function(event) {
event.target.setAttribute('data-user-paused', 'true');
});
})();