Crunchyroll 自动跳过设置

自动跳过片头和片尾(如果可用)。

// ==UserScript==
// @name           Crunchyroll Auto Skip with Settings
// @name:fr        Crunchyroll Saut Automatique avec Paramètres
// @name:ar        تخطي تلقائي لـ Crunchyroll مع الإعدادات
// @name:ca        Crunchyroll Auto Skip amb Configuracions
// @name:zh-CN     Crunchyroll 自动跳过设置
// @name:de        Crunchyroll Automatisches Überspringen mit Einstellungen
// @name:hi        क्रंचीरोल ऑटो स्किप सेटिंग्स के साथ
// @name:id        Crunchyroll Lewati Otomatis dengan Pengaturan
// @name:it        Crunchyroll Salta Automaticamente con Impostazioni
// @name:ja        Crunchyroll 自動スキップ設定付き
// @name:ms        Crunchyroll Langkau Auto dengan Tetapan
// @name:pl        Crunchyroll Automatyczne Pomijanie z Ustawieniami
// @name:pt-PT     Crunchyroll Pular Automático com Configurações
// @name:ru        Crunchyroll Автоматическое Пропускание с Настройками
// @name:es        Crunchyroll Salto Automático con Configuraciones
// @name:ta        க்ரஞ்சிரோல் தானியங்கி தவிர்க்கும் அமைப்புகளுடன்
// @name:te        క్రంచిరోల్ ఆటో స్కిప్ సెట్టింగులతో
// @name:th        Crunchyroll ข้ามอัตโนมัติพร้อมการตั้งค่า
// @name:tr        Crunchyroll Ayarlarla Otomatik Geçiş
// @name:vi        Crunchyroll Tự động Bỏ qua với Cài đặt

// @description    Automatically skip the intro and ending if available.
// @description:fr Sauter automatiquement l'intro et la fin si elles sont disponibles.
// @description:ar تخطي تلقائي للمقدمة والنهاية إذا كانت متوفرة.
// @description:ca Salta automàticament la introducció i el final si estan disponibles。
// @description:zh-CN 自动跳过片头和片尾(如果可用)。
// @description:de Überspringt automatisch das Intro und Ende, wenn verfügbar。
// @description:hi परिचय और अंत को स्वचालित रूप से छोड़ें, यदि उपलब्ध हो。
// @description:id Lewati intro dan akhir secara otomatis jika tersedia。
// @description:it Salta automaticamente l'intro e il finale se disponibili。
// @description:ja イントロとエンディングを自動的にスキップします(利用可能な場合)。
// @description:ms Langkau intro dan akhir secara automatik jika tersedia。
// @description:pl Automatycznie pomija intro i zakończenie, jeśli są dostępne。
// @description:pt-PT Pule automaticamente a introdução e o final, se disponível。
// @description:ru Автоматически пропускать вступление и концовку, если они доступны。
// @description:es Omite automáticamente la introducción y el final si están disponibles。
// @description:ta தொடக்கமும் முடிவும் கிடைத்தால் தானாகவே தவிர்க்கப்படும்。
// @description:te యింట్రో మరియు ఎండింగ్‌ను ఆటోమేటిక్‌గా స్కిప్ చేయండి, అందుబాటులో ఉంటే。
// @description:th ข้ามส่วนเปิดและส่วนท้ายโดยอัตโนมัติหากมีให้。
// @description:tr Giriş ve bitişi otomatik olarak atlar (eğer mevcutsa)。
// @description:vi Tự động bỏ qua phần giới thiệu và phần kết nếu có。

// @namespace    https://greasyfork.org/scripts/513644
// @version      2.0
// @author       MASTERD
// @match        *://*.crunchyroll.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=crunchyroll.com
// @grant        none
// ==/UserScript==


(function() {
    'use strict';

    // Langues prises en charge
    const supportedLanguages = ['ar', 'ca', 'zh', 'en', 'fr', 'de', 'hi', 'id', 'it', 'ja', 'ms', 'pl', 'pt', 'ru', 'es', 'ta', 'te', 'th', 'tr', 'vi'];
    const userLanguage = supportedLanguages.find(lang => navigator.language.startsWith(lang)) || 'en';

    ['active', 'delay', 'exsave', 'show'].forEach((key, index) => {
        if (localStorage.getItem(key) === null) {
            localStorage.setItem(key, ['true', '0', 'false', 'true'][index]);
        }
    });

    // Variables pour gérer les paramètres stockés
    let settings = {
        active: localStorage.getItem('active') === 'true',
        delay: parseInt(localStorage.getItem('delay'), 10) || 0,
        exsave: localStorage.getItem('exsave') === 'true',
        show: localStorage.getItem('show') === 'true'
    };
    let previousDelay = localStorage.getItem('delay') || '0';
    let previousActive = localStorage.getItem('active') || 'true';
    let firstLoad = true;

    let ObsSettingsButton = true, observerSkipButt = true;
    new MutationObserver(() => {
        if (ObsSettingsButton) addSettingsButton();
        if (observerSkipButt) observeSkipButton();
    }).observe(document.body, { childList: true, subtree: true });

    const applyHoverFocusStyles = (element, OnBackColor, OffBackColor, boxShadow) => {
        const addStyles = () => {
            element.style.backgroundColor = OnBackColor;
            element.style.boxShadow = boxShadow;
        };
        const removeStyles = () => {
            element.style.backgroundColor = OffBackColor;
            element.style.boxShadow = '';
        };
        element.addEventListener('mouseover', addStyles);
        element.addEventListener('mouseout', removeStyles);
        element.addEventListener('focus', addStyles);
        element.addEventListener('blur', removeStyles);
    };

    function addSettingsButton() {
        const userActionsList = document.querySelector('.erc-user-actions');
        if (userActionsList) {
            const svgDiv = document.createElement('div');
            svgDiv.innerHTML = `
            <svg class="header-svg-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" data-t="settings-svg" aria-labelledby="settings-svg" aria-hidden="false" role="img" style="height: 2.5rem;">
            <path d="M12,15.2 C10.2331429,15.2 8.8,13.7668571 8.8,12 C8.8,10.2331429 10.2331429,8.8 12,8.8 C13.7668571,8.8 15.2,10.2331429 15.2,12 C15.2,13.7668571 13.7668571,15.2 12,15.2 L12,15.2 Z M19.9691429,11.5005714 C19.9691429,11.3542857 19.9108571,11.224 19.7965714,11.1097143 C19.6822857,10.9954286 19.5622857,10.928 19.4377143,10.9062857 L18.344,10.7497143 C18.0102857,10.7085714 17.792,10.5314286 17.688,10.2182857 L17.2811429,9.21828571 C17.1348571,8.928 17.1565714,8.64571429 17.344,8.37485714 L18.0308571,7.50057143 C18.2182857,7.22971429 18.208,6.96914286 18,6.71885714 L17.2502857,6 C17.0205714,5.792 16.7702857,5.78171429 16.4994286,5.96914286 L15.6251429,6.62514286 C15.3542857,6.83314286 15.072,6.86514286 14.7817143,6.71885714 L13.7817143,6.312 C13.656,6.27085714 13.536,6.18285714 13.4217143,6.04685714 C13.3062857,5.912 13.2502857,5.78171429 13.2502857,5.656 L13.0937143,4.56228571 C13.072,4.43771429 13.0045714,4.31771429 12.8902857,4.20342857 C12.776,4.08914286 12.6457143,4.03085714 12.4994286,4.03085714 C12.3954286,4.01028571 12.2285714,4 12,4 L11.5005714,4.03085714 C11.3542857,4.03085714 11.224,4.08914286 11.1097143,4.20342857 C10.9942857,4.31771429 10.9268571,4.43771429 10.9062857,4.56228571 L10.7497143,5.656 C10.7085714,5.98971429 10.5314286,6.208 10.2194286,6.312 L9.21942857,6.71885714 C8.92685714,6.86514286 8.64571429,6.83314286 8.37485714,6.62514286 L7.50057143,5.96914286 C7.22971429,5.78171429 6.96914286,5.792 6.71885714,6 L6,6.71885714 C5.792,6.96914286 5.78171429,7.22971429 5.96914286,7.50057143 L6.62514286,8.37485714 C6.83314286,8.64685714 6.864,8.928 6.71885714,9.21942857 L6.312,10.2194286 C6.27085714,10.344 6.18171429,10.464 6.04685714,10.5782857 C5.91085714,10.6937143 5.78171429,10.7497143 5.656,10.7497143 L4.56228571,10.9062857 C4.43771429,10.928 4.31771429,10.9954286 4.20342857,11.1097143 C4.088,11.224 4.03085714,11.3542857 4.03085714,11.5005714 C4.01028571,11.6045714 4,11.7714286 4,12 L4.03085714,12.4994286 C4.03085714,12.6457143 4.088,12.776 4.20342857,12.8902857 C4.31771429,13.0057143 4.43771429,13.0731429 4.56228571,13.0937143 L5.656,13.2502857 C5.78171429,13.2502857 5.91085714,13.3074286 6.04685714,13.4217143 C6.18171429,13.5371429 6.27085714,13.656 6.312,13.7817143 L6.71885714,14.7817143 C6.864,15.0731429 6.83314286,15.3542857 6.62514286,15.6251429 L5.96914286,16.5005714 C5.78171429,16.7714286 5.76,16.9897143 5.90628571,17.1565714 C5.92685714,17.1771429 5.95314286,17.208 5.984,17.2502857 C6.016,17.2914286 6.05142857,17.3382857 6.09371429,17.3908571 C6.13485714,17.4422857 6.17714286,17.4902857 6.21828571,17.5314286 C6.26057143,17.5737143 6.30171429,17.6148571 6.344,17.656 C6.38514286,17.6982857 6.42628571,17.7394286 6.46857143,17.7817143 C6.50971429,17.8228571 6.552,17.8548571 6.59428571,17.8742857 C6.67657143,17.9588571 6.81714286,18.0205714 7.016,18.0628571 C7.21371429,18.104 7.37485714,18.0937143 7.50057143,18.0308571 L8.37485714,17.3748571 C8.64571429,17.1668571 8.92685714,17.136 9.21828571,17.2811429 L10.2182857,17.688 C10.344,17.7291429 10.464,17.8182857 10.5782857,17.9531429 C10.6925714,18.0891429 10.7497143,18.2182857 10.7497143,18.344 L10.9062857,19.4377143 C10.9268571,19.5622857 10.9942857,19.6822857 11.1097143,19.7965714 C11.224,19.9108571 11.3542857,19.968 11.4994286,19.968 C11.6034286,19.9897143 11.7702857,20 12,20 L12.4994286,19.9691429 C12.6457143,19.9691429 12.776,19.9108571 12.8902857,19.7965714 C13.0045714,19.6822857 13.072,19.5622857 13.0937143,19.4377143 L13.2502857,18.344 C13.2502857,18.2182857 13.3074286,18.0891429 13.4217143,17.9531429 C13.536,17.8182857 13.656,17.7291429 13.7817143,17.688 L14.7817143,17.2811429 C15.0731429,17.136 15.3542857,17.1668571 15.6251429,17.3748571 L16.5005714,18.0308571 C16.7702857,18.2182857 17.0308571,18.208 17.2811429,18 L18,17.2811429 C18.208,17.0308571 18.2182857,16.7714286 18.032,16.4994286 L17.344,15.6251429 C17.1565714,15.3542857 17.136,15.0731429 17.2811429,14.7817143 L17.688,13.7817143 C17.792,13.4685714 18.0102857,13.2914286 18.344,13.2502857 L19.4377143,13.0937143 C19.5622857,13.0731429 19.6822857,13.0057143 19.7965714,12.8902857 C19.9108571,12.776 19.9691429,12.6457143 19.9691429,12.4994286 C19.9897143,12.3965714 20,12.2297143 20,12 L19.9691429,11.5005714 Z"></path>
            </svg>`;
            svgDiv.classList.add('erc-header-svg');

            const settingsButton = document.createElement('div');
            settingsButton.classList.add('erc-header-tile');
            settingsButton.classList.add('state-icon-only');
            settingsButton.setAttribute('tabindex', '0');
            settingsButton.addEventListener('keydown', (event) => {
                if (event.key === ' ' || event.key === 'Enter') {
                    event.preventDefault();
                    showSettingsWindow(); // Ouvrir la fenêtre de paramètres
                }
            });
            settingsButton.addEventListener('click', showSettingsWindow);

            // Créer un nouvel élément <li> et y ajouter le bouton
            const newLi = document.createElement('li');
            newLi.classList.add('user-actions-item');

            settingsButton.appendChild(svgDiv);
            newLi.appendChild(settingsButton);
            userActionsList.appendChild(newLi);
            ObsSettingsButton = false;
        }
    }

    // Fonction pour afficher la fenêtre de paramètres
    function showSettingsWindow() {
        const overlay = document.createElement('div');
        overlay.id = 'settingsOverlay';
        overlay.style.position = 'fixed';
        overlay.style.top = '0';
        overlay.style.left = '0';
        overlay.style.width = '100%';
        overlay.style.height = '100%';
        overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.4)';
        overlay.style.zIndex = '9994';

        const settingsWindow = document.createElement('div');
        settingsWindow.id = 'settingsWindow';
        settingsWindow.style.position = 'fixed';
        settingsWindow.style.top = '10%';
        settingsWindow.style.left = '25%';
        settingsWindow.style.width = '50%';
        settingsWindow.style.backgroundColor = 'white';
        settingsWindow.style.zIndex = '9995';
        settingsWindow.style.boxShadow = '0px 0px 10px rgba(0,0,0,0.5)';
        settingsWindow.style.borderRadius = '10px';
        settingsWindow.style.padding = '20px';

        // Bouton de fermeture "X"
        const closeButton = document.createElement('span');
        closeButton.tabIndex = '1';
        closeButton.textContent = 'X';
        closeButton.style.position = 'absolute';
        closeButton.style.top = '10px';
        closeButton.style.right = '20px';
        closeButton.style.cursor = 'pointer';
        closeButton.style.fontSize = '200%';
        closeButton.style.color = 'black';
        closeButton.style.backgroundColor = 'lightgray';
        closeButton.style.padding = '5px';
        closeButton.style.border = '2px solid';
        closeButton.style.borderRadius = 'inherit';
        closeButton.style.transition = 'background-color 0.2s ease';
        applyHoverFocusStyles(closeButton, '#ff640a', 'lightgrey', '0 0 15px rgba(255, 124, 0, 1)');

        // Formulaire de paramètres
        const activeToggle = createToggle(translations[userLanguage].activeToggle, settings.active, (value) => settings.active = value);
        const showToggle = createToggle(translations[userLanguage].showToggle, settings.show, (value) => settings.show = value);
        const exsaveToggle = createToggle(translations[userLanguage].exsaveToggle, settings.exsave, (value) => settings.exsave = value);
        const delayInput = createInput(translations[userLanguage].delayInput, settings.delay, (value) => settings.delay = parseInt(value, 10));

        // Boutons de gestion des paramètres
        const saveButton = createButton(translations[userLanguage].saveButton, saveAndClose);
        const cancelButton = createButton(translations[userLanguage].cancelButton, hideSettingsWindow);
        const defaultButton = createButton(translations[userLanguage].defaultButton, resetDefaults);

        defaultButton.addEventListener('keydown', (event) => {
            if (event.key === 'Tab') {
                event.preventDefault();
                closeButton.focus();
            }
        });

        // Ajouter les éléments à la fenêtre
        settingsWindow.appendChild(closeButton);
        settingsWindow.appendChild(activeToggle);
        settingsWindow.appendChild(delayInput);
        settingsWindow.appendChild(document.createElement("br"));
        settingsWindow.appendChild(showToggle);
        settingsWindow.appendChild(exsaveToggle);
        settingsWindow.appendChild(document.createElement("br"));
        settingsWindow.appendChild(saveButton);
        settingsWindow.appendChild(cancelButton);
        settingsWindow.appendChild(defaultButton);

        document.body.appendChild(overlay);
        document.body.appendChild(settingsWindow);

        // Gestion des événements
        closeButton.addEventListener('click', hideSettingsWindow);
        overlay.addEventListener('click', handleOverlayClick);
        closeButton.addEventListener('keydown', (event) => {
            if (event.key === ' ' || event.key === 'Enter') {
                event.preventDefault();
                document.activeElement.click();
            }
        });
        closeButton.focus();
    }

    // Création des éléments de formulaire
    function createToggle(labelText, isChecked, onChange) {
        const container = document.createElement('div');
        container.style.display = 'flex';
        container.style.alignItems = 'center';
        container.style.cursor = 'pointer';
        container.tabIndex = '1';
        container.style.padding = '5px';
        container.style.width = 'fit-content';
        container.style.transition = 'background-color 0.2s ease';
        container.style.borderRadius = 'inherit';
        applyHoverFocusStyles(container, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)');
        container.addEventListener('click', () => {
            checkbox.checked = !checkbox.checked;
            onChange(checkbox.checked);
        });
        container.addEventListener('keydown', (event) => {
            if (event.key === ' ' || event.key === 'Enter') {
                event.preventDefault();
                checkbox.checked = !checkbox.checked;
                onChange(checkbox.checked);
            }
        });

        const checkbox = document.createElement('input');
        checkbox.type = 'checkbox';
        checkbox.checked = isChecked;
        checkbox.style.cursor = 'pointer';
        applyHoverFocusStyles(checkbox, '', '', '0 0 15px rgba(255, 124, 0, 1)');
        checkbox.addEventListener('click', () => {
            checkbox.checked = !checkbox.checked;
            onChange(checkbox.checked);
        });

        const label = document.createElement('label');
        label.textContent = labelText;
        label.style.color = 'black';
        label.style.padding = '0 10px';
        label.style.cursor = 'pointer';
        container.appendChild(label);
        container.appendChild(checkbox);

        return container;
    }

    function createInput(labelText, value, onChange) {
        const container = document.createElement('div');
        container.style.display = 'flex';
        container.style.alignItems = 'center';
        container.style.padding = '5px';
        container.style.width = 'fit-content';
        container.style.transition = 'background-color 0.2s ease';
        container.style.borderRadius = 'inherit';
        container.style.cursor = 'pointer';
        container.addEventListener('click', () => {
            if (document.activeElement !== input) {
                input.focus();
                input.select();
            }
        });
        applyHoverFocusStyles(container, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)');

        const input = document.createElement('input');
        input.type = 'text';
        input.value = value;
        input.tabIndex = '1';
        applyHoverFocusStyles(input, '', '', '0 0 15px rgba(255, 124, 0, 1)');
        input.addEventListener('input', () => onChange(input.value));

        const label = document.createElement('label');
        label.textContent = labelText;
        label.style.color = 'black';
        label.style.padding = '0 10px';
        label.style.cursor = 'pointer';
        container.appendChild(label);
        container.appendChild(input);

        return container;
    }

    function createButton(text, onClick) {
        const button = document.createElement('button');
        button.textContent = text;
        button.tabIndex = '1';
        button.style.cursor = 'pointer';
        button.style.padding = '10px';
        button.style.margin = '3px';
        button.style.border = 'revert';
        button.style.borderRadius = 'inherit';
        button.style.backgroundColor = 'lightgrey';
        button.style.transition = 'background-color 0.2s ease';
        applyHoverFocusStyles(button, '#ff640a', 'lightgrey', '0 0 15px rgba(255, 124, 0, 1)');
        button.addEventListener('click', onClick);
        button.addEventListener('keydown', (event) => {
            if (event.key === ' ' || event.key === 'Enter') {
                event.preventDefault();
                document.activeElement.click();
            }
        });

        return button;
    }

    // Gérer les actions du formulaire
    function saveAndClose() {
        saveSettings();
        hideSettingsWindow();
    }

    function resetDefaults() {
        settings.active = true;
        settings.delay = 0;
        settings.exsave = false;
        settings.show = true;
        saveSettings();
        hideSettingsWindow();
    }

    function hideSettingsWindow() {
        const overlay = document.getElementById('settingsOverlay');
        const settingsWindow = document.getElementById('settingsWindow');

        if (overlay) {
            document.body.removeChild(overlay);
        }
        if (settingsWindow) {
            document.body.removeChild(settingsWindow);
        }
        settings = {
            active: localStorage.getItem('active') === 'true',
            delay: parseInt(localStorage.getItem('delay'), 10) || 0,
            exsave: localStorage.getItem('exsave') === 'true',
            show: localStorage.getItem('show') === 'true'
        };
    }

    // Fonction pour sauvegarder les paramètres dans localStorage
    function saveSettings() {
        localStorage.setItem('active', settings.active);
        localStorage.setItem('delay', settings.delay);
        localStorage.setItem('exsave', settings.exsave);
        localStorage.setItem('show', settings.show);
        waitForIframe();
    }

    // Gérer le clic sur l'overlay
    function handleOverlayClick() {

        if (localStorage.getItem('show') === 'true') {
            // Créer l'overlay
            const overlay = document.createElement('div');
            overlay.id = 'customOverlay';
            overlay.style.position = 'fixed';
            overlay.style.top = '0';
            overlay.style.left = '0';
            overlay.style.width = '100%';
            overlay.style.height = '100%';
            overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; // Fond semi-transparent
            overlay.style.zIndex = '9998'; // Derrière la boîte de dialogue

            // Créer le conteneur pour l'alerte
            const alertDiv = document.createElement('div');
            alertDiv.id = 'customAlert';
            alertDiv.style.position = 'fixed';
            alertDiv.style.top = '50%';
            alertDiv.style.left = '50%';
            alertDiv.style.transform = 'translate(-50%, -50%)';
            alertDiv.style.padding = '20px';
            alertDiv.style.backgroundColor = '#fff';
            alertDiv.style.border = '1px solid #ccc';
            alertDiv.style.borderRadius = '10px';
            alertDiv.style.zIndex = '9999';
            alertDiv.style.boxShadow = '0px 0px 10px rgba(0, 0, 0, 0.1)';
            alertDiv.style.color = '#000'; // Texte noir

            // Ajouter le texte du message
            const message = document.createElement('p');
            message.textContent = translations[userLanguage].confirmExit;
            alertDiv.appendChild(message);

            // Ajouter une checkbox avec le texte "Sauvegarder votre choix"
            const checkboxDiv = createToggle(translations[userLanguage].saveChoice, false, '');
            checkboxDiv.style.justifySelf = 'center';

            // Ajouter les boutons Oui et Non
            const buttonContainer = document.createElement('div');
            buttonContainer.style.marginTop = '10px';
            buttonContainer.style.display = 'flex';
            buttonContainer.style.borderRadius = '10px';
            buttonContainer.style.justifyContent = 'space-between';

            // Bouton Oui
            const yesButton = createButton(translations[userLanguage].yes, saveAndClose);
            yesButton.onclick = function () {
                if (checkboxDiv.querySelector('input[type="checkbox"]').checked) {
                    settings.show = false;
                    localStorage.setItem('show', settings.show);
                }
                settings.exsave = true;
                localStorage.setItem('exsave', settings.exsave);
                saveSettings();
                hideSettingsWindow();
                closeAlert();
            };

            // Bouton Non
            const noButton = createButton(translations[userLanguage].no, hideSettingsWindow);
            noButton.onclick = function () {
                if (checkboxDiv.querySelector('input[type="checkbox"]').checked) {
                    settings.show = false;
                    localStorage.setItem('show', settings.show);
                }
                settings.exsave = false;
                localStorage.setItem('exsave', settings.exsave);
                hideSettingsWindow();
                closeAlert();
                // Rechargement des paramètres depuis le localStorage
                settings = {
                    active: localStorage.getItem('active') === 'true',
                    delay: parseInt(localStorage.getItem('delay'), 10) || 0,
                    exsave: localStorage.getItem('exsave') === 'true',
                    show: localStorage.getItem('show') === 'true',
                };
            };
            noButton.addEventListener('keydown', (event) => {
                if (event.key === 'Tab') {
                    event.preventDefault();
                    checkboxDiv.focus();
                }
            });

            // Ajouter les boutons au conteneur
            buttonContainer.appendChild(yesButton);
            buttonContainer.appendChild(noButton);
            alertDiv.appendChild(checkboxDiv);
            alertDiv.appendChild(buttonContainer);

            // Ajouter la boîte de dialogue et l'overlay à la page
            document.body.appendChild(overlay);
            document.body.appendChild(alertDiv);

            checkboxDiv.focus();

            // Fonction pour fermer l'alerte
            function closeAlert() {
                document.body.removeChild(alertDiv);
                document.body.removeChild(overlay);
            }
        } else {
            if (settings.exsave) {
                saveSettings();
            }
            hideSettingsWindow();
        }
    }

    // Observer les changements de style sur le bouton "Passer l'intro"
    function observeSkipButton() {
        const skipButton = document.querySelector('div[data-testid="skipButton"]');

        if (skipButton) {
            let noSkipButton = document.querySelector('#noSkipButton');
            if (!noSkipButton) {
                noSkipButton = document.createElement('button');
                noSkipButton.id = 'noSkipButton';
                noSkipButton.textContent = translations[userLanguage].AutoSkOff;
                noSkipButton.style.position = 'absolute';
                noSkipButton.style.right = '200px';
                noSkipButton.style.bottom = '100px';
                noSkipButton.style.height = '40px';
                noSkipButton.style.padding = '0 16px';
                noSkipButton.style.zIndex = '1';
                noSkipButton.style.display = 'block';
                noSkipButton.classList.add("css-1dbjc4n");
                noSkipButton.style.cursor = 'pointer';
                noSkipButton.value = '0';
                skipButton.parentNode.insertBefore(noSkipButton, skipButton);

                // Gérer le clic sur le bouton "no skip"
                noSkipButton.addEventListener('click', () => {
                    if (noSkipButton.value === "0") {
                        noSkipButton.value = '1';
                        noSkipButton.textContent = translations[userLanguage].AutoSkON;
                        const message = { type: 'noskip', value: noSkipButton.value };
                        sendMessageToParent(message);
                    } else {
                        noSkipButton.value = '0';
                        noSkipButton.textContent = translations[userLanguage].AutoSkOff;
                        const message = { type: 'noskip', value: noSkipButton.value };
                        sendMessageToParent(message);
                    }
                });

                // Variable pour stocker temporairement l'observateur
                let mutationObserverActive = true;

                // Observer les changements de style du bouton "Passer l'intro"
                const observerSkipButtAtt = new MutationObserver((mutations) => {
                    mutations.forEach((mutation) => {
                        if (!mutationObserverActive) return; // Désactiver les mutations pendant le survol du bouton "No Skip"
                        const skipButt = document.querySelector('div[data-testid="skipButton"]');
                        const innerButton = skipButt.querySelector('div[tabindex="0"]');
                        if (innerButton) {
                            if (localStorage.getItem('active') === 'true' && noSkipButton.value === "0") {
                                const x = parseInt(localStorage.getItem('delay'), 10) || 0;
                                setTimeout(function() {
                                    if (noSkipButton.value === "0" && mutationObserverActive) {
                                        observerSkipButtAtt.disconnect();
                                        innerButton.click(); // Ne pas exécuter si "no skip" est activé
                                    }
                                }, x);
                            }
                        }
                        // Gérer l'affichage du bouton "no skip"
                        if (skipButt.style.opacity === '0') {
                            if (noSkipButton) {
                                noSkipButton.style.display = 'none';
                            }
                        } else {
                            if (noSkipButton) {
                                noSkipButton.style.display = 'block';
                            }
                        }
                    });
                });

                observerSkipButtAtt.observe(skipButton, { attributes: true });

                // Observer si le bouton "Passer l'intro" est supprimé du DOM
                const skipButtonRemovalObserver = new MutationObserver((mutations) => {
                    mutations.forEach((mutation) => {
                        mutation.removedNodes.forEach((removedNode) => {
                            if (removedNode === skipButton) {
                                if (noSkipButton) {
                                    skipButtonRemovalObserver.disconnect();
                                    noSkipButton.remove(); // Supprimer le bouton "No Skip" quand "skipButton" disparaît
                                }
                            }
                        });
                    });
                });

                skipButtonRemovalObserver.observe(document.body, { childList: true, subtree: true });

                // Désactiver temporairement l'observateur lorsque la souris est sur "noSkipButton"
                noSkipButton.addEventListener('mouseover', () => {
                    mutationObserverActive = false; // Désactive l'observateur temporairement

                    if (skipButton) {
                        // Ajouter un MutationObserver pour surveiller les changements du style
                        const observerSkipOpa = new MutationObserver(() => {
                            // Vérifier et forcer l'affichage du bouton "skipButton"
                            if (getComputedStyle(skipButton).opacity !== '1') {
                                skipButton.style.opacity = '1'; // Forcer l'affichage
                            }
                        });

                        // Observer uniquement les modifications d'attributs de "skipButton"
                        observerSkipOpa.observe(skipButton, { attributes: true, attributeFilter: ['style'] });

                        // Arrêter l'observation après un certain temps ou à la sortie de la souris
                        noSkipButton.addEventListener('mouseout', () => {
                            mutationObserverActive = true; // Réactiver l'observateur principal
                            observerSkipOpa.disconnect(); // Arrêter l'observation
                            if (skipButton) {
                                skipButton.style.opacity = ''; // Rétablir l'état initial
                            }
                        }, { once: true });
                    }
                });
            }
        }
    }

    // Fonction pour envoyer un message au parent
    function sendMessageToParent(message) {
        window.parent.postMessage(message, '*');
    }

    // Fonction pour envoyer les valeurs de delay et active à l'iframe
    function sendValuesToIframe(iframe) {
        const delayValue = localStorage.getItem('delay') || '0'; // Valeur de delay
        const activeValue = localStorage.getItem('active') || 'true'; // Valeur de active

        // Envoyer seulement si la valeur de delay a changé
        if (delayValue !== previousDelay || firstLoad == true) {
            const message = {
                type: 'delay',
                value: delayValue
            };

            iframe.contentWindow.postMessage(message, 'https://static.crunchyroll.com');
            previousDelay = delayValue; // Mettre à jour la valeur précédente
        }

        // Envoyer seulement si la valeur de active a changé
        if (activeValue !== previousActive || firstLoad == true) {
            const message = {
                type: 'active',
                value: activeValue
            };

            iframe.contentWindow.postMessage(message, 'https://static.crunchyroll.com');
            previousActive = activeValue; // Mettre à jour la valeur précédente
            firstLoad = false;
        }
    }

    // Vérifier si l'iframe est chargé et disponible
    function waitForIframe() {
        const iframe = document.querySelector('.video-player');
        if (iframe && iframe.src.includes('https://static.crunchyroll.com')) {

            // Envoyer les valeurs lors du premier chargement de l'iframe
            iframe.onload = function() {
                sendValuesToIframe(iframe);
            };

            // Vérifier périodiquement si les valeurs de delay ou active ont changé
            setInterval(function() {
                sendValuesToIframe(iframe); // Envoyer à chaque changement de delay ou active
            }, 1000); // Vérifier toutes les secondes
        } else {
            setTimeout(waitForIframe, 500); // Réessayer après 500 ms si l'iframe n'est pas trouvé
        }
    }

    // Lancer la fonction de vérification lorsque la page est complètement chargée
    window.addEventListener('load', waitForIframe);

    // Récupérer les données envoyées à l'iframe
    window.addEventListener('message', function(event) {
        if (event.origin !== 'https://www.crunchyroll.com') {
            return;
        }
        const receivedMessage = event.data;
        if (receivedMessage.type === 'delay') {
            const delay = receivedMessage.value;
            localStorage.setItem('delay', delay);
        }
        if (receivedMessage.type === 'active') {
            const active = receivedMessage.value;
            localStorage.setItem('active', active);
        }
    });

    //traduction
    const translations = {
        ar: {
            activeToggle: "تفعيل التخطي التلقائي",
            showToggle: "عرض تنبيه التراكب",
            exsaveToggle: "حفظ عند الخروج من التراكب",
            delayInput: "التأخير قبل التخطي (مللي ثانية)",
            saveButton: "حفظ",
            cancelButton: "إلغاء",
            defaultButton: "الإفتراضي",
            confirmExit: "هل تريد الخروج وحفظ الإعدادات؟",
            saveChoice: "حفظ اختيارك",
            yes: "نعم",
            no: "لا",
            AutoSkOff: "تعطيل التخطي التلقائي",
            AutoSkON: "إعادة تفعيل التخطي التلقائي"
        },
        ca: {
            activeToggle: "Activar el salt automàtic",
            showToggle: "Mostra l'alerta de superposició",
            exsaveToggle: "Desa en sortir de la superposició",
            delayInput: "Retard abans de saltar (ms)",
            saveButton: "Desa",
            cancelButton: "Cancel·lar",
            defaultButton: "Per defecte",
            confirmExit: "Vols sortir i desar la configuració?",
            saveChoice: "Desa la teva elecció",
            yes: "Sí",
            no: "No",
            AutoSkOff: "Desactivar Salt Automàtic",
            AutoSkON: "Reactivar Salt Automàtic"
        },
        zh: {
            activeToggle: "启用自动跳过",
            showToggle: "显示覆盖警报",
            exsaveToggle: "退出覆盖时保存",
            delayInput: "跳过前的延迟(毫秒)",
            saveButton: "保存",
            cancelButton: "取消",
            defaultButton: "默认",
            confirmExit: "是否要退出并保存设置?",
            saveChoice: "保存您的选择",
            yes: "是",
            no: "否",
            AutoSkOff: "禁用自动跳过",
            AutoSkON: "重新启用自动跳过"
        },
        en: {
            activeToggle: "Enable automatic skip",
            showToggle: "Show overlay alert",
            exsaveToggle: "Save when exiting overlay",
            delayInput: "Delay before skipping (ms)",
            saveButton: "Save",
            cancelButton: "Cancel",
            defaultButton: "Default",
            confirmExit: "Do you want to quit and save the settings?",
            saveChoice: "Save your choice",
            yes: "Yes",
            no: "No",
            AutoSkOff: "Disable Auto Skip",
            AutoSkON: "Re-enable Auto Skip"
        },
        fr: {
            activeToggle: "Activer le skip automatique",
            showToggle: "Afficher l'alerte de l'overlay",
            exsaveToggle: "Sauvegarder en quittant l'overlay",
            delayInput: "Délai avant de skip (ms)",
            saveButton: "Sauvegarder",
            cancelButton: "Annuler",
            defaultButton: "Défaut",
            confirmExit: "Voulez-vous quitter et sauvegarder les paramètres?",
            saveChoice: "Sauvegarder votre choix",
            yes: "Oui",
            no: "Non",
            AutoSkOff: "Désactiver Auto Skip",
            AutoSkON: "Réactiver Auto Skip"
        },
        de: {
            activeToggle: "Automatisches Überspringen aktivieren",
            showToggle: "Overlay-Warnung anzeigen",
            exsaveToggle: "Beim Verlassen des Overlays speichern",
            delayInput: "Verzögerung vor dem Überspringen (ms)",
            saveButton: "Speichern",
            cancelButton: "Abbrechen",
            defaultButton: "Standard",
            confirmExit: "Möchten Sie beenden und die Einstellungen speichern?",
            saveChoice: "Speichern Sie Ihre Wahl",
            yes: "Ja",
            no: "Nein",
            AutoSkOff: "Automatisches Überspringen deaktivieren",
            AutoSkON: "Automatisches Überspringen erneut aktivieren"
        },
        hi: {
            activeToggle: "स्वचालित स्किप सक्षम करें",
            showToggle: "ओवरले चेतावनी दिखाएं",
            exsaveToggle: "ओवरले से बाहर निकलते समय सहेजें",
            delayInput: "स्किप करने से पहले विलंब (मिलीसेकंड)",
            saveButton: "सहेजें",
            cancelButton: "रद्द करें",
            defaultButton: "डिफ़ॉल्ट",
            confirmExit: "क्या आप बाहर निकलना और सेटिंग्स सहेजना चाहते हैं?",
            saveChoice: "अपनी पसंद सहेजें",
            yes: "हां",
            no: "नहीं",
            AutoSkOff: "स्वचालित स्किप अक्षम करें",
            AutoSkON: "स्वचालित स्किप फिर से सक्षम करें"
        },
        id: {
            activeToggle: "Aktifkan lewati otomatis",
            showToggle: "Tampilkan peringatan overlay",
            exsaveToggle: "Simpan saat keluar dari overlay",
            delayInput: "Tunda sebelum melewati (ms)",
            saveButton: "Simpan",
            cancelButton: "Batal",
            defaultButton: "Default",
            confirmExit: "Apakah Anda ingin keluar dan menyimpan pengaturan?",
            saveChoice: "Simpan pilihan Anda",
            yes: "Ya",
            no: "Tidak",
            AutoSkOff: "Nonaktifkan Lewati Otomatis",
            AutoSkON: "Aktifkan kembali Lewati Otomatis"
        },
        it: {
            activeToggle: "Abilita salto automatico",
            showToggle: "Mostra avviso sovrapposizione",
            exsaveToggle: "Salva quando esci dalla sovrapposizione",
            delayInput: "Ritardo prima del salto (ms)",
            saveButton: "Salva",
            cancelButton: "Annulla",
            defaultButton: "Predefinito",
            confirmExit: "Vuoi uscire e salvare le impostazioni?",
            saveChoice: "Salva la tua scelta",
            yes: "Sì",
            no: "No",
            AutoSkOff: "Disabilita Salto Automatico",
            AutoSkON: "Riattiva Salto Automatico"
        },
        ja: {
            activeToggle: "自動スキップを有効にする",
            showToggle: "オーバーレイ警告を表示",
            exsaveToggle: "オーバーレイを終了するときに保存",
            delayInput: "スキップ前の遅延 (ミリ秒)",
            saveButton: "保存",
            cancelButton: "キャンセル",
            defaultButton: "デフォルト",
            confirmExit: "終了して設定を保存しますか?",
            saveChoice: "選択を保存する",
            yes: "はい",
            no: "いいえ",
            AutoSkOff: "自動スキップを無効にする",
            AutoSkON: "自動スキップを再度有効にする"
        },
        ms: {
            activeToggle: "Aktifkan lompat automatik",
            showToggle: "Tunjukkan amaran overlay",
            exsaveToggle: "Simpan apabila keluar dari overlay",
            delayInput: "Kelewatan sebelum melompat (ms)",
            saveButton: "Simpan",
            cancelButton: "Batal",
            defaultButton: "Lalai",
            confirmExit: "Adakah anda mahu keluar dan menyimpan tetapan?",
            saveChoice: "Simpan pilihan anda",
            yes: "Ya",
            no: "Tidak",
            AutoSkOff: "Lumpuhkan Lompat Automatik",
            AutoSkON: "Dayakan semula Lompat Automatik"
        },
        pl: {
            activeToggle: "Włącz automatyczne pomijanie",
            showToggle: "Pokaż alert nakładki",
            exsaveToggle: "Zapisz przy wychodzeniu z nakładki",
            delayInput: "Opóźnienie przed pominięciem (ms)",
            saveButton: "Zapisz",
            cancelButton: "Anuluj",
            defaultButton: "Domyślnie",
            confirmExit: "Czy chcesz zakończyć i zapisać ustawienia?",
            saveChoice: "Zapisz swój wybór",
            yes: "Tak",
            no: "Nie",
            AutoSkOff: "Wyłącz automatyczne pomijanie",
            AutoSkON: "Włącz ponownie automatyczne pomijanie"
        },
        pt: {
            activeToggle: "Ativar pulo automático",
            showToggle: "Mostrar alerta de sobreposição",
            exsaveToggle: "Salvar ao sair da sobreposição",
            delayInput: "Atraso antes de pular (ms)",
            saveButton: "Salvar",
            cancelButton: "Cancelar",
            defaultButton: "Padrão",
            confirmExit: "Deseja sair e salvar as configurações?",
            saveChoice: "Salve sua escolha",
            yes: "Sim",
            no: "Não",
            AutoSkOff: "Desativar Pulo Automático",
            AutoSkON: "Reativar Pulo Automático"
        },
        ru: {
            activeToggle: "Включить автоматический пропуск",
            showToggle: "Показать предупреждение наложения",
            exsaveToggle: "Сохранить при выходе из наложения",
            delayInput: "Задержка перед пропуском (мс)",
            saveButton: "Сохранить",
            cancelButton: "Отмена",
            defaultButton: "По умолчанию",
            confirmExit: "Вы хотите выйти и сохранить настройки?",
            saveChoice: "Сохраните свой выбор",
            yes: "Да",
            no: "Нет",
            AutoSkOff: "Отключить автоматический пропуск",
            AutoSkON: "Повторно включить автоматический пропуск"
        },
        es: {
            activeToggle: "Habilitar omisión automática",
            showToggle: "Mostrar alerta de superposición",
            exsaveToggle: "Guardar al salir de la superposición",
            delayInput: "Retraso antes de omitir (ms)",
            saveButton: "Guardar",
            cancelButton: "Cancelar",
            defaultButton: "Por defecto",
            confirmExit: "¿Quieres salir y guardar la configuración?",
            saveChoice: "Guarda tu elección",
            yes: "Sí",
            no: "No",
            AutoSkOff: "Desactivar Omisión Automática",
            AutoSkON: "Reactivar Omisión Automática"
        },
        ta: {
            activeToggle: "தானியங்கி குதிப்பை இயக்கவும்",
            showToggle: "மேல்பட வருகையை காட்டவும்",
            exsaveToggle: "மேல்பட வருகையை விட்டு வெளியேறும்போது சேமிக்கவும்",
            delayInput: "குதிக்கும் முன் தாமதம் (மில்லி வினாடிகள்)",
            saveButton: "சேமிக்கவும்",
            cancelButton: "ரத்துசெய்",
            defaultButton: "இயல்புநிலை",
            confirmExit: "வெளியேறி அமைப்புகளைச் சேமிக்க விரும்புகிறீர்களா?",
            saveChoice: "உங்கள் தேர்வைச் சேமிக்கவும்",
            yes: "ஆம்",
            no: "இல்லை",
            AutoSkOff: "தானியங்கி குதிப்பை முடக்கு",
            AutoSkON: "தானியங்கி குதிப்பை மீண்டும் இயக்கவும்"
        },
        te: {
            activeToggle: "ఆటోమేటిక్ స్కిప్‌ని ఎనేబుల్ చేయండి",
            showToggle: "ఓవర్‌లే అలర్ట్‌ను చూపించండి",
            exsaveToggle: "ఓవర్‌లే నుండి నిష్క్రమించే సమయంలో సేవ్ చేయండి",
            delayInput: "స్కిప్ చేయడానికి ముందు ఆలస్యం (మిల్లీసెకన్లు)",
            saveButton: "సేవ్ చేయండి",
            cancelButton: "రద్దు చేయండి",
            defaultButton: "డిఫాల్ట్",
            confirmExit: "మీరు నిష్క్రమించి సెట్టింగ్‌లను సేవ్ చేయాలనుకుంటున్నారా?",
            saveChoice: "మీ ఎంపికను సేవ్ చేయండి",
            yes: "అవును",
            no: "కాదు",
            AutoSkOff: "ఆటోమేటిక్ స్కిప్‌ని ఆపివేయండి",
            AutoSkON: "ఆటోమేటిక్ స్కిప్‌ని తిరిగి ఎనేబుల్ చేయండి"
        },
        th: {
            activeToggle: "เปิดใช้งานข้ามอัตโนมัติ",
            showToggle: "แสดงการแจ้งเตือนซ้อนทับ",
            exsaveToggle: "บันทึกเมื่อออกจากการซ้อนทับ",
            delayInput: "ความล่าช้าก่อนข้าม (ms)",
            saveButton: "บันทึก",
            cancelButton: "ยกเลิก",
            defaultButton: "ค่าเริ่มต้น",
            confirmExit: "คุณต้องการออกและบันทึกการตั้งค่าหรือไม่?",
            saveChoice: "บันทึกการเลือกของคุณ",
            yes: "ใช่",
            no: "ไม่",
            AutoSkOff: "ปิดใช้งานการข้ามอัตโนมัติ",
            AutoSkON: "เปิดใช้งานการข้ามอัตโนมัติอีกครั้ง"
        },
        tr: {
            activeToggle: "Otomatik atlamayı etkinleştir",
            showToggle: "Bindirme uyarısını göster",
            exsaveToggle: "Bindirmeden çıkarken kaydet",
            delayInput: "Atlamadan önce gecikme (ms)",
            saveButton: "Kaydet",
            cancelButton: "İptal",
            defaultButton: "Varsayılan",
            confirmExit: "Çıkmak ve ayarları kaydetmek istiyor musunuz?",
            saveChoice: "Seçiminizi kaydedin",
            yes: "Evet",
            no: "Hayır",
            AutoSkOff: "Otomatik Atlama'yı devre dışı bırak",
            AutoSkON: "Otomatik Atlama'yı yeniden etkinleştir"
        },
        vi: {
            activeToggle: "Bật bỏ qua tự động",
            showToggle: "Hiển thị cảnh báo lớp phủ",
            exsaveToggle: "Lưu khi thoát lớp phủ",
            delayInput: "Độ trễ trước khi bỏ qua (ms)",
            saveButton: "Lưu",
            cancelButton: "Hủy bỏ",
            defaultButton: "Mặc định",
            confirmExit: "Bạn có muốn thoát và lưu cài đặt không?",
            saveChoice: "Lưu lựa chọn của bạn",
            yes: "Có",
            no: "Không",
            AutoSkOff: "Tắt bỏ qua tự động",
            AutoSkON: "Bật lại bỏ qua tự động"
        }
    };

})();