// ==UserScript== // @name Disney Plus Enchantments // @namespace http://tampermonkey.net/ // @version 0.6.1 // @description Enhancements for Disney Plus video player: auto fullscreen, skip intro, skip credits, and more. // @author JJJ // @match https://www.disneyplus.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=disneyplus.com // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @license MIT // @downloadURL none // ==/UserScript== (function () { 'use strict'; const CONFIG = { enableAutoFullscreen: GM_getValue('enableAutoFullscreen', true), enableSkipIntro: GM_getValue('enableSkipIntro', true), enableAutoPlayNext: GM_getValue('enableAutoPlayNext', false) }; const SELECTORS = { skipIntroButton: 'button.skip__button:not([class*="overlay_upnextlite"])', autoPlayButton: '.overlay_upnextlite_button-container button, *[data-testid="up-next-play-button"]', fullscreenButton: 'button.fullscreen-icon' }; const CONSTANTS = { CLICK_DELAY: 5000, BUTTON_TRACKING_TIMEOUT: 30000 }; let lastSkipClickTime = 0; const clickedButtons = new Set(); function createSettingsDialog() { const dialogHTML = `

Disney Plus Enchantments

${createToggle('enableAutoFullscreen', 'Auto Fullscreen', 'Automatically enter fullscreen mode')} ${createToggle('enableSkipIntro', 'Skip Intro', 'Automatically skip the intro of episodes')} ${createToggle('enableAutoPlayNext', 'Auto Play Next Episode', 'Automatically play the next episode')}
`; const styleSheet = ` `; const dialogWrapper = document.createElement('div'); dialogWrapper.innerHTML = styleSheet + dialogHTML; document.body.appendChild(dialogWrapper); document.getElementById('saveSettingsButton').addEventListener('click', saveAndCloseDialog); document.getElementById('cancelSettingsButton').addEventListener('click', closeDialog); } function createToggle(id, label, title) { return `
`; } function saveAndCloseDialog() { Object.keys(CONFIG).forEach(key => { CONFIG[key] = document.getElementById(key).checked; GM_setValue(key, CONFIG[key]); }); closeDialog(); } function closeDialog() { const dialog = document.getElementById('disneyPlusEnchantmentsDialog'); if (dialog) { dialog.remove(); if (document.fullscreenElement) { document.exitFullscreen(); } } } function isElementVisible(element) { if (!element) return false; const rect = element.getBoundingClientRect(); return ( element.offsetParent !== null && rect.width > 0 && rect.height > 0 && rect.top >= 0 && rect.left >= 0 ); } function clickButton(selector) { const button = document.querySelector(selector); if (button && isElementVisible(button)) { if (selector === SELECTORS.skipIntroButton) { handleSkipIntroButton(button); } else if (selector === SELECTORS.autoPlayButton) { button.click(); } } } function handleSkipIntroButton(button) { const currentTime = Date.now(); if (currentTime - lastSkipClickTime < CONSTANTS.CLICK_DELAY) return; const buttonText = button.textContent.toLowerCase(); if (isValidSkipButton(buttonText) && !clickedButtons.has(buttonText)) { button.click(); lastSkipClickTime = currentTime; clickedButtons.add(buttonText); setTimeout(() => clickedButtons.delete(buttonText), CONSTANTS.BUTTON_TRACKING_TIMEOUT); } } function isValidSkipButton(buttonText) { return (buttonText.includes('skip') || buttonText.includes('saltar')) && !buttonText.includes('next') && !buttonText.includes('próximo'); } function enterFullscreen() { if (!document.fullscreenElement) { document.documentElement.requestFullscreen(); } } function exitFullscreen() { if (document.fullscreenElement) { document.exitFullscreen(); } } function maintainFullscreen() { const fullscreenButton = document.querySelector(SELECTORS.fullscreenButton); if (fullscreenButton && !document.fullscreenElement) { fullscreenButton.click(); } } function handleEnhancements() { try { if (CONFIG.enableAutoFullscreen) { enterFullscreen(); maintainFullscreen(); } if (CONFIG.enableSkipIntro) { clickButton(SELECTORS.skipIntroButton); } if (CONFIG.enableAutoPlayNext) { clickButton(SELECTORS.autoPlayButton); } } catch (error) { console.error('Disney Plus Enchantments error:', error); } } const observer = new MutationObserver(handleEnhancements); observer.observe(document.body, { childList: true, subtree: true }); GM_registerMenuCommand('Disney Plus Enchantments Settings', createSettingsDialog); let isSettingsDialogOpen = false; function toggleSettingsDialog() { if (isSettingsDialogOpen) { closeDialog(); isSettingsDialogOpen = false; } else { createSettingsDialog(); isSettingsDialogOpen = true; } } document.addEventListener('keyup', (event) => { if (event.key === 'F2') { toggleSettingsDialog(); } else if (event.key === 'Escape') { exitFullscreen(); closeDialog(); } }); })();