// ==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 3.0 // @author MASTERD // @match *://*.crunchyroll.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=crunchyroll.com // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; // Langues prises en charge const supportedLanguages = ['en', 'fr', 'ar', 'ca', 'zh', 'de', 'es', 'hi', 'id', 'it', 'ja', 'ms', 'pl', 'pt', 'ru', 'ta', 'te', 'th', 'tr', 'vi']; const userLanguage = supportedLanguages.find(lang => navigator.language.startsWith(lang)) || 'en'; const defaultSettings = { AutoSkipActive: true, AutoSkipDelay: 0, OverlayAutoSave: false, OverlayAlertShow: true, HistoryButton: true, WatchlistButton: true, ArrowLeftAutoSkip: true, ArrowRightAutoSkip: true, }; const storedSettings = JSON.parse(localStorage.getItem("AutoSkipParameter")) || {}; const updatedSettings = { ...defaultSettings, ...storedSettings }; localStorage.setItem("AutoSkipParameter", JSON.stringify(updatedSettings)); let settings = JSON.parse(localStorage.getItem("AutoSkipParameter")); CleanUpdate(); let OrigineLoad = JSON.parse(localStorage.getItem("AutoSkipParameter")); let firstLoad = true; let mutationObserverActive = true; let ObsSettingsButton = true, observerSkipButt = true; new MutationObserver(() => { if (ObsSettingsButton) addSettingsButton(); if (observerSkipButt) observeSkipButton(); const historyCollection = document.querySelector('.erc-history-collection[data-t="history"]'); if ( historyCollection && historyCollection.previousElementSibling && historyCollection.previousElementSibling.classList.contains('feed-header--ihqym') ) { if (settings.HistoryButton) { HistoryWatchlistButt(historyCollection.previousElementSibling); } else if (historyCollection.previousElementSibling.querySelector('button')) { historyCollection?.previousElementSibling?.querySelector('#HistoryButton').remove(); } } const watchlistCollection = document.querySelector('.erc-watchlist-collection[data-t="watchlist"]'); if ( watchlistCollection && watchlistCollection.previousElementSibling && watchlistCollection.previousElementSibling.classList.contains('feed-header--ihqym') ) { if (settings.WatchlistButton) { HistoryWatchlistButt(watchlistCollection.previousElementSibling); } else if (watchlistCollection.previousElementSibling.querySelector('button')) { watchlistCollection?.previousElementSibling?.querySelector('#WatchlistButton').remove(); } } }).observe(document.body, { childList: true, subtree: true }); const applyHoverFocusStyles = (element1, BackColorOn1, BackColorOff1, boxShadowOn1, boxShadowOff1, element2, BackColorOn2, BackColorOff2, boxShadowOn2, boxShadowOff2) => { const addStyles = () => { element1.style.backgroundColor = BackColorOn1; element1.style.boxShadow = boxShadowOn1; if(element2){ element2.style.backgroundColor = BackColorOn2; element2.style.boxShadow = boxShadowOn2; }; }; const removeStyles = () => { element1.style.backgroundColor = BackColorOff1; element1.style.boxShadow = boxShadowOff1; if(element2){ element2.style.backgroundColor = BackColorOff2; element2.style.boxShadow = boxShadowOff2; }; }; element1.addEventListener('mouseover', addStyles); element1.addEventListener('mouseout', removeStyles); element1.addEventListener('focus', addStyles); element1.addEventListener('blur', removeStyles); }; function CleanUpdate() { const oldKeys = ['active', 'delay', 'exsave', 'show']; const newKeys = ['AutoSkipActive', 'AutoSkipDelay', 'OverlayAutoSave', 'OverlayAlertShow']; const parseValue = (value) => { if (value === '"true"') return true; if (value === '"false"') return false; if (!isNaN(value)) return Number(value); // Convertir en nombre si possible return value; // Retourne la valeur telle quelle si ce n'est ni un booléen ni un nombre }; oldKeys.forEach((key, i) => { let value = localStorage.getItem(key); if (value !== null) { settings[newKeys[i]] = parseValue(value); localStorage.removeItem(key); } }); Object.keys(settings).forEach((key) => { if (!(key in defaultSettings)) { delete settings[key]; } }); localStorage.setItem("AutoSkipParameter", JSON.stringify(settings)); } function addSettingsButton() { const userActionsList = document.querySelector('.erc-user-actions'); if (userActionsList) { const svgDiv = document.createElement('div'); svgDiv.innerHTML = ` `; 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
  • 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 = createElementWithStyles('div', { position: 'fixed', top: '0', left: '0', width: '100%', height: '100%', backgroundColor: 'rgba(0, 0, 0, 0.4)', zIndex: '9994' }); overlay.id = 'settingsOverlay'; const settingsWindow = createElementWithStyles('div', { position: 'fixed', top: '10%', left: '25%', width: '50%', maxHeight: '80vh', overflow: 'auto', backgroundColor: 'white', zIndex: '9995', boxShadow: '0px 0px 10px rgba(0,0,0,0.5)', borderRadius: '10px', padding: '20px' }); settingsWindow.id = 'settingsWindow'; const HeadBanner = createElementWithStyles('div', { maxWidth: '100vw', display: 'flex', justifyContent: 'space-between', borderRadius: 'inherit', position: 'sticky', top: '0px', userSelect: 'none', border: 'outset' }); const closeButton = createButton('X', hideSettingsWindow, { fontSize: '4vw', padding: '0.5vw', maxWidth: '5vw', maxHeight: '5vw', minWidth: '5vw', minHeight: '5vw' }); const HeadLabelTitle = createElementWithStyles('p', { flexGrow: '1', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', fontSize: '2vw', color: 'rgb(255, 124, 0)', webkitTextStroke: '1px black', textShadow: 'rgb(255, 124, 0) 0px 0px 12px', display: 'flex', alignItems: 'center', fontFamily: 'auto', fontWeight: 'bold', background: 'rgba(255, 255, 255, 0.2)', backdropFilter: 'blur(0.5px)', borderRadius: 'inherit', padding: '10px' }, translations[userLanguage].HeadLabelTitle); const img = createElementWithStyles('img', { sizes: '114x114', margin: '10px', width: '1.5em', height: '1.5em', boxShadow: 'inset 0 0 20px 0 rgb(255, 124, 0), 0 0 15px 4px rgb(255, 124, 0)', borderRadius: '2000px' }); img.src = '/build/assets/img/favicons/apple-touch-icon-v2-114x114.png'; HeadLabelTitle.insertBefore(img, HeadLabelTitle.firstChild); HeadBanner.append(HeadLabelTitle, closeButton); const HeadAutoSkip = createSection([ createToggle(translations[userLanguage].AutoSkipActiveToggle, settings.AutoSkipActive, v => settings.AutoSkipActive = v), createInput(translations[userLanguage].AutoSkipDelayInput, settings.AutoSkipDelay, v => settings.AutoSkipDelay = parseInt(v, 10)), createArrowSkipSection() ]); const HeadOverlay = createSection([ createToggle(translations[userLanguage].OverlayAlertShowToggle, settings.OverlayAlertShow, v => settings.OverlayAlertShow = v), createToggle(translations[userLanguage].OverlayAutoSaveToggle, settings.OverlayAutoSave, v => settings.OverlayAutoSave = v) ]); const HeadOther = createSection([ createToggle(translations[userLanguage].HistoryButtonToggle, settings.HistoryButton, v => settings.HistoryButton = v), createToggle(translations[userLanguage].WatchlistButtonToggle, settings.WatchlistButton, v => settings.WatchlistButton = v) ]); const defaultButton = createButton(translations[userLanguage].defaultButton, resetDefaults); defaultButton.addEventListener('keydown', (event) => { if (event.key === 'Tab') { event.preventDefault(); closeButton.focus(); } }); const HeadButton = createSection([ createButton(translations[userLanguage].saveButton, saveAndClose), createButton(translations[userLanguage].cancelButton, hideSettingsWindow), defaultButton ], { display: 'flex', justifyContent: 'space-between' }); settingsWindow.append(HeadBanner, document.createElement('br'), HeadAutoSkip, document.createElement('br'), HeadOverlay, document.createElement('br'), HeadOther, document.createElement('br'), HeadButton); document.body.append(overlay, settingsWindow); overlay.addEventListener('click', handleOverlayClick); closeButton.focus(); } function createElementWithStyles(tag, styles, textContent = '') { const element = document.createElement(tag); Object.assign(element.style, styles); if (textContent) element.textContent = textContent; return element; } function createSection(children, styles = {}) { const section = createElementWithStyles('div', { borderRadius: 'inherit', userSelect: 'none', border: 'outset', padding: '5px', ...styles }); children.forEach(child => section.appendChild(child)); return section; } function createArrowSkipSection() { const section = createElementWithStyles('div', { display: 'flex', alignItems: 'center', padding: '5px', width: 'fit-content', borderRadius: 'inherit' }); const label = createElementWithStyles('p', { color: 'black', padding: '5px 10px', width: 'fit-content', borderRadius: 'inherit', transition: 'background-color 0.2s ease' }, translations[userLanguage].ArrowAutoSkipToggle); applyHoverFocusStyles(label, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)', ''); const leftToggle = createToggle('⬅', settings.ArrowLeftAutoSkip, v => settings.ArrowLeftAutoSkip = v); const rightToggle = createToggle('➡', settings.ArrowRightAutoSkip, v => settings.ArrowRightAutoSkip = v); const leftCheckbox = leftToggle.querySelector('input[type="checkbox"]'); const rightCheckbox = rightToggle.querySelector('input[type="checkbox"]'); function syncCheckboxes(value) { leftCheckbox.checked = value; rightCheckbox.checked = value; settings.ArrowLeftAutoSkip = value; settings.ArrowRightAutoSkip = value; } label.addEventListener('click', () => { syncCheckboxes(!leftCheckbox.checked); }); section.append(label, leftToggle, rightToggle); return section; } // Création des éléments de formulaire function createToggle(labelText, isChecked, onChange) { const container = document.createElement('div'); Object.assign(container.style, { display: 'flex', alignItems: 'center', cursor: 'pointer', padding: '5px', width: 'fit-content', transition: 'background-color 0.2s ease', borderRadius: 'inherit' }); container.tabIndex = '1'; 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; Object.assign(label.style, { color: 'black', padding: '0 10px', cursor: 'pointer' }); container.appendChild(label); container.appendChild(checkbox); return container; } function createInput(labelText, value, onChange) { const container = document.createElement('div'); Object.assign(container.style, { display: 'flex', alignItems: 'center', padding: '5px', width: 'fit-content', transition: 'background-color 0.2s ease', borderRadius: 'inherit', 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)', '', container, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)', ''); input.addEventListener('input', () => onChange(input.value)); const label = document.createElement('label'); label.textContent = labelText; Object.assign(label.style, { color: 'black', padding: '0 10px', cursor: 'pointer' }); container.appendChild(label); container.appendChild(input); return container; } function createButton(text, onClick) { const button = document.createElement('button'); Object.assign(button.style, { cursor: 'pointer', padding: '10px', margin: '3px', border: 'revert', borderRadius: 'inherit', backgroundColor: 'lightgrey', transition: 'background-color 0.2s ease' }); button.textContent = text; button.tabIndex = '1'; 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 = defaultSettings; 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 = JSON.parse(localStorage.getItem("AutoSkipParameter")); } // Fonction pour sauvegarder les paramètres dans localStorage function saveSettings() { localStorage.setItem("AutoSkipParameter", JSON.stringify(settings)); waitForIframe(); } // Gérer le clic sur l'overlay function handleOverlayClick() { const UniqueLoadOverlay = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (UniqueLoadOverlay.OverlayAlertShow) { // Créer l'overlay const overlay = document.createElement('div'); overlay.id = 'customOverlay'; Object.assign(overlay.style, { position: 'fixed', top: '0', left: '0', width: '100%', height: '100%', backgroundColor: 'rgba(0, 0, 0, 0.5)', zIndex: '9998' }); // Créer le conteneur pour l'alerte const alertDiv = document.createElement('div'); alertDiv.id = 'customAlert'; Object.assign(alertDiv.style, { position: 'fixed', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', padding: '20px', backgroundColor: '#fff', border: '1px solid #ccc', borderRadius: '10px', zIndex: '9999', boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.1)', color: '#000' }); // 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'); Object.assign(buttonContainer.style, { marginTop: '10px', display: 'flex', borderRadius: '10px', justifyContent: 'space-between' }); // Bouton Oui const yesButton = createButton(translations[userLanguage].yes, saveAndClose); yesButton.onclick = function () { if (checkboxDiv.querySelector('input[type="checkbox"]').checked) { settings.OverlayAlertShow = false; } settings.OverlayAutoSave = true; saveSettings(); hideSettingsWindow(); closeAlert(); }; // Bouton Non const noButton = createButton(translations[userLanguage].no, hideSettingsWindow); noButton.onclick = function () { const UniqueSettings = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (checkboxDiv.querySelector('input[type="checkbox"]').checked) { UniqueSettings.OverlayAlertShow = false; } UniqueSettings.OverlayAutoSave = false; localStorage.setItem("AutoSkipParameter", JSON.stringify(UniqueSettings)); hideSettingsWindow(); closeAlert(); // Rechargement des paramètres depuis le localStorage settings = JSON.parse(localStorage.getItem("AutoSkipParameter")); }; 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 (UniqueLoadOverlay.OverlayAutoSave) { 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 = createButton(translations[userLanguage].AutoSkOff, toggleNoSkip); function toggleNoSkip() { const newValue = noSkipButton.value === "0" ? "1" : "0"; noSkipButton.value = newValue; noSkipButton.textContent = newValue === "1" ? translations[userLanguage].AutoSkON : translations[userLanguage].AutoSkOff; sendMessageToParent({ type: 'noskip', value: noSkipButton.value }); } noSkipButton.id = 'noSkipButton'; noSkipButton.value = '0'; const skipButtonSize = skipButton.querySelector('.css-1dbjc4n.r-1awozwy'); if (skipButtonSize) { const rect = skipButtonSize.getBoundingClientRect(); Object.assign(noSkipButton.style, { position: 'absolute', right: `${20 + rect.width}px`, bottom: '96px', height: '40px', zIndex: '1', fontWeight: 'bold', }); } skipButton.parentNode.insertBefore(noSkipButton, skipButton); // Observer les changements de style du bouton "Passer l'intro" const observerSkipButtAtt = new MutationObserver((mutations) => { mutations.forEach((mutation) => { Skip(observerSkipButtAtt); // Gérer l'affichage du bouton "no skip" const skipButt = document.querySelector('div[data-testid="skipButton"]'); 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 }); } }); } } } function Skip(observerSkipButtAtt){ 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"]'); let noSkipButton = document.querySelector('#noSkipButton'); if (innerButton) { const UniqueLoadSkip = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (UniqueLoadSkip.AutoSkipActive && noSkipButton.value === "0") { const x = UniqueLoadSkip.AutoSkipDelay || 0; setTimeout(function() { if (noSkipButton.value === "0" && mutationObserverActive) { if (observerSkipButtAtt) { observerSkipButtAtt.disconnect(); } innerButton.click(); // Ne pas exécuter si "no skip" est activé } }, x); } } } function sendMessageToParent(message) { window.parent.postMessage(message, '*'); } function sendValuesToIframe(iframe) { const UniqueLoadToIframe = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (JSON.stringify(UniqueLoadToIframe) !== JSON.stringify(OrigineLoad) || firstLoad) { const message = { type: 'AutoSkipParameter', value: UniqueLoadToIframe }; iframe.contentWindow.postMessage(message, 'https://static.crunchyroll.com'); OrigineLoad = UniqueLoadToIframe; // Mettre à jour la valeur précédente firstLoad = false; } } function waitForIframe() { let iframe = document.querySelector('.video-player'); if (iframe && iframe.src.includes('https://static.crunchyroll.com')) { iframe.onload = function() { sendValuesToIframe(iframe); }; const intervalId = setInterval(function() { iframe = document.querySelector('.video-player'); if (iframe) { sendValuesToIframe(iframe); } else { clearInterval(intervalId); } }, 1000); } else { setTimeout(waitForIframe, 500); // Réessayer après 500 ms si l'iframe n'est pas trouvé } } function HistoryWatchlistButt(headerDiv) { if (!headerDiv.querySelector('button')) { let isExpanded = false; const collectionDiv = headerDiv.nextElementSibling; const history = collectionDiv.classList.contains('erc-history-collection'); const watchlist = collectionDiv.classList.contains('erc-watchlist-collection'); const button = createButton('▶', () => { if (collectionDiv && (history || watchlist)) { const items = collectionDiv.querySelectorAll('.collection-item'); isExpanded = !isExpanded; button.textContent = isExpanded ? '▼' : '▶'; items.forEach((item, index) => { if (index >= 5) { if (isExpanded) { Object.assign(item.style, { display: 'block', maxHeight: '0px', overflow: 'hidden', transition: 'max-height 1s' }); item.offsetHeight; item.style.maxHeight = '1000px'; } else { item.style.maxHeight = '0px'; } } }); } }); // Bouton stylé en cercle Object.assign(button.style, { width: '40px', height: '40px', borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: '1.5rem', marginLeft: '10px', boxShadow: '0 0 15px rgba(255, 255, 255, 1)' }); button.tabIndex = '0'; button.id = history ? 'HistoryButton' : 'WatchlistButton'; // Styles au survol et au focus applyHoverFocusStyles(button, '#ff640a', 'white', '0 0 15px rgba(255, 124, 0, 1)', '0 0 15px rgba(255, 255, 255, 1)'); headerDiv.appendChild(button); } } // 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 === 'AutoSkipParameter') { const AutoSkipParameter = receivedMessage.value; localStorage.setItem("AutoSkipParameter", JSON.stringify(AutoSkipParameter)); } }); if (window.location.hostname === "static.crunchyroll.com") { document.addEventListener("keydown", function(event) { const noSkipButton = document.querySelector("#noSkipButton"); const settingsStatic = JSON.parse(localStorage.getItem("AutoSkipParameter")); //event.key === "ArrowLeft" || if (noSkipButton && ((event.key === "ArrowLeft" && settingsStatic.ArrowLeftAutoSkip) || (event.key === "ArrowRight" && settingsStatic.ArrowRightAutoSkip))) { const skipButt = document.querySelector('div[data-testid="skipButton"]'); const innerButton = skipButt.querySelector('div[tabindex="0"]'); const UniqueLoadStatic = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (UniqueLoadStatic.AutoSkipActive) innerButton.click(); } }); } //traduction const translations = { en: { HeadLabelTitle: "Auto Skip Parameter", AutoSkipActiveToggle: "Enable automatic skip", AutoSkipDelayInput: "Delay before skipping (ms)", ArrowAutoSkipToggle: "Enable arrow automatic skip", OverlayAlertShowToggle: "Show overlay alert", OverlayAutoSaveToggle: "Save when exiting overlay", HistoryButtonToggle: "Activate the button on the main page for more history", WatchlistButtonToggle: "Activate the button on the main page for more watchlist", 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: { HeadLabelTitle: "Paramètre du saut automatique", AutoSkipActiveToggle: "Activer le saut automatique", AutoSkipDelayInput: "Délai avant de sauter (ms)", ArrowAutoSkipToggle: "Activer le saut automatique avec les flèches", OverlayAlertShowToggle: "Afficher l'alerte en superposition", OverlayAutoSaveToggle: "Sauvegarder en quittant la superposition", HistoryButtonToggle: "Activer le bouton sur la page principale pour plus d'historique", WatchlistButtonToggle: "Activer le bouton sur la page principale pour plus de watchlist", saveButton: "Enregistrer", cancelButton: "Annuler", defaultButton: "Par défaut", confirmExit: "Voulez-vous quitter et enregistrer les paramètres ?", saveChoice: "Enregistrer votre choix", yes: "Oui", no: "Non", AutoSkOff: "Désactiver le saut automatique", AutoSkON: "Réactiver le saut automatique" }, ar: { HeadLabelTitle: "معلمة التخطي التلقائي", AutoSkipActiveToggle: "تمكين التخطي التلقائي", AutoSkipDelayInput: "التأخير قبل التخطي (مللي ثانية)", ArrowAutoSkipToggle: "تمكين التخطي التلقائي بالسهم", OverlayAlertShowToggle: "عرض تنبيه التراكب", OverlayAutoSaveToggle: "حفظ عند الخروج من التراكب", HistoryButtonToggle: "تفعيل الزر في الصفحة الرئيسية للمزيد من السجل", WatchlistButtonToggle: "تفعيل الزر في الصفحة الرئيسية للمزيد من قائمة المشاهدة", saveButton: "حفظ", cancelButton: "إلغاء", defaultButton: "افتراضي", confirmExit: "هل تريد الخروج وحفظ الإعدادات؟", saveChoice: "حفظ اختيارك", yes: "نعم", no: "لا", AutoSkOff: "تعطيل التخطي التلقائي", AutoSkON: "إعادة تمكين التخطي التلقائي" }, ca: { HeadLabelTitle: "Paràmetre de salt automàtic", AutoSkipActiveToggle: "Habilita el salt automàtic", AutoSkipDelayInput: "Retard abans de saltar (ms)", ArrowAutoSkipToggle: "Habilita el salt automàtic amb fletxes", OverlayAlertShowToggle: "Mostra l'alerta de superposició", OverlayAutoSaveToggle: "Desa en sortir de la superposició", HistoryButtonToggle: "Activa el botó a la pàgina principal per més historial", WatchlistButtonToggle: "Activa el botó a la pàgina principal per més llista de seguiment", saveButton: "Desa", cancelButton: "Cancel·la", defaultButton: "Per defecte", confirmExit: "Vols sortir i desar la configuració?", saveChoice: "Desa la teva elecció", yes: "Sí", no: "No", AutoSkOff: "Desactiva el salt automàtic", AutoSkON: "Torna a activar el salt automàtic" }, zh: { HeadLabelTitle: "自动跳过参数", AutoSkipActiveToggle: "启用自动跳过", AutoSkipDelayInput: "跳过前的延迟(毫秒)", ArrowAutoSkipToggle: "启用箭头自动跳过", OverlayAlertShowToggle: "显示叠加警报", OverlayAutoSaveToggle: "退出叠加时保存", HistoryButtonToggle: "在主页上启用按钮以查看更多历史记录", WatchlistButtonToggle: "在主页上启用按钮以查看更多观看列表", saveButton: "保存", cancelButton: "取消", defaultButton: "默认", confirmExit: "您想退出并保存设置吗?", saveChoice: "保存您的选择", yes: "是", no: "否", AutoSkOff: "禁用自动跳过", AutoSkON: "重新启用自动跳过" }, de: { HeadLabelTitle: "Automatischer Überspring-Parameter", AutoSkipActiveToggle: "Automatisches Überspringen aktivieren", AutoSkipDelayInput: "Verzögerung vor dem Überspringen (ms)", ArrowAutoSkipToggle: "Pfeil-Auto-Skip aktivieren", OverlayAlertShowToggle: "Overlay-Warnung anzeigen", OverlayAutoSaveToggle: "Beim Verlassen des Overlays speichern", HistoryButtonToggle: "Schaltfläche auf der Hauptseite für mehr Verlauf aktivieren", WatchlistButtonToggle: "Schaltfläche auf der Hauptseite für mehr Watchlist aktivieren", saveButton: "Speichern", cancelButton: "Abbrechen", defaultButton: "Standard", confirmExit: "Möchten Sie beenden und die Einstellungen speichern?", saveChoice: "Ihre Auswahl speichern", yes: "Ja", no: "Nein", AutoSkOff: "Automatisches Überspringen deaktivieren", AutoSkON: "Automatisches Überspringen wieder aktivieren" }, es: { HeadLabelTitle: "Parámetro de omisión automática", AutoSkipActiveToggle: "Habilitar salto automático", AutoSkipDelayInput: "Retraso antes de saltar (ms)", ArrowAutoSkipToggle: "Habilitar salto automático con flechas", OverlayAlertShowToggle: "Mostrar alerta superpuesta", OverlayAutoSaveToggle: "Guardar al salir de la superposición", HistoryButtonToggle: "Activar el botón en la página principal para más historial", WatchlistButtonToggle: "Activar el botón en la página principal para más lista de seguimiento", saveButton: "Guardar", cancelButton: "Cancelar", defaultButton: "Predeterminado", confirmExit: "¿Quieres salir y guardar la configuración?", saveChoice: "Guardar tu elección", yes: "Sí", no: "No", AutoSkOff: "Deshabilitar salto automático", AutoSkON: "Rehabilitar salto automático" }, hi: { HeadLabelTitle: "स्वचालित छोड़ने का पैरामीटर", AutoSkipActiveToggle: "स्वचालित स्किप सक्षम करें", AutoSkipDelayInput: "स्किप से पहले विलंब (मि.से.)", ArrowAutoSkipToggle: "तीर स्वचालित स्किप सक्षम करें", OverlayAlertShowToggle: "ओवरले अलर्ट दिखाएं", OverlayAutoSaveToggle: "ओवरले से बाहर निकलते समय सहेजें", HistoryButtonToggle: "अधिक इतिहास के लिए मुख्य पृष्ठ पर बटन सक्रिय करें", WatchlistButtonToggle: "अधिक वॉचलिस्ट के लिए मुख्य पृष्ठ पर बटन सक्रिय करें", saveButton: "सहेजें", cancelButton: "रद्द करें", defaultButton: "डिफ़ॉल्ट", confirmExit: "क्या आप बाहर निकलना और सेटिंग्स सहेजना चाहते हैं?", saveChoice: "अपनी पसंद सहेजें", yes: "हाँ", no: "नहीं", AutoSkOff: "स्वचालित स्किप अक्षम करें", AutoSkON: "स्वचालित स्किप पुनः सक्षम करें" }, id: { HeadLabelTitle: "Parameter Lewati Otomatis", AutoSkipActiveToggle: "Aktifkan lompatan otomatis", AutoSkipDelayInput: "Tunda sebelum melompat (ms)", ArrowAutoSkipToggle: "Aktifkan lompatan otomatis dengan panah", OverlayAlertShowToggle: "Tampilkan peringatan overlay", OverlayAutoSaveToggle: "Simpan saat keluar dari overlay", HistoryButtonToggle: "Aktifkan tombol di halaman utama untuk riwayat lebih lanjut", WatchlistButtonToggle: "Aktifkan tombol di halaman utama untuk daftar tontonan lebih lanjut", saveButton: "Simpan", cancelButton: "Batal", defaultButton: "Default", confirmExit: "Apakah Anda ingin keluar dan menyimpan pengaturan?", saveChoice: "Simpan pilihan Anda", yes: "Ya", no: "Tidak", AutoSkOff: "Nonaktifkan Lompatan Otomatis", AutoSkON: "Aktifkan kembali Lompatan Otomatis" }, it: { HeadLabelTitle: "Parametro di salto automatico", AutoSkipActiveToggle: "Abilita il salto automatico", AutoSkipDelayInput: "Ritardo prima di saltare (ms)", ArrowAutoSkipToggle: "Abilita il salto automatico con le frecce", OverlayAlertShowToggle: "Mostra avviso in sovrimpressione", OverlayAutoSaveToggle: "Salva quando si esce dalla sovrimpressione", HistoryButtonToggle: "Attiva il pulsante nella pagina principale per più cronologia", WatchlistButtonToggle: "Attiva il pulsante nella pagina principale per più lista di visione", saveButton: "Salva", cancelButton: "Annulla", defaultButton: "Predefinito", confirmExit: "Vuoi uscire e salvare le impostazioni?", saveChoice: "Salva la tua scelta", yes: "Sì", no: "No", AutoSkOff: "Disattiva il salto automatico", AutoSkON: "Riattiva il salto automatico" }, ja: { HeadLabelTitle: "自動スキップパラメータ", AutoSkipActiveToggle: "自動スキップを有効にする", AutoSkipDelayInput: "スキップ前の遅延(ミリ秒)", ArrowAutoSkipToggle: "矢印キーの自動スキップを有効にする", OverlayAlertShowToggle: "オーバーレイアラートを表示", OverlayAutoSaveToggle: "オーバーレイを終了するときに保存", HistoryButtonToggle: "メインページでボタンを有効にして履歴を表示", WatchlistButtonToggle: "メインページでボタンを有効にしてウォッチリストを表示", saveButton: "保存", cancelButton: "キャンセル", defaultButton: "デフォルト", confirmExit: "終了して設定を保存しますか?", saveChoice: "選択を保存", yes: "はい", no: "いいえ", AutoSkOff: "自動スキップを無効にする", AutoSkON: "自動スキップを再有効化する" }, ms: { HeadLabelTitle: "Parameter Langkau Automatik", AutoSkipActiveToggle: "Aktifkan langkau automatik", AutoSkipDelayInput: "Kelewatan sebelum melangkau (ms)", ArrowAutoSkipToggle: "Aktifkan langkau automatik dengan anak panah", OverlayAlertShowToggle: "Tunjukkan amaran lapisan atas", OverlayAutoSaveToggle: "Simpan apabila keluar dari lapisan atas", HistoryButtonToggle: "Aktifkan butang di halaman utama untuk sejarah tambahan", WatchlistButtonToggle: "Aktifkan butang di halaman utama untuk senarai tontonan tambahan", saveButton: "Simpan", cancelButton: "Batal", defaultButton: "Default", confirmExit: "Adakah anda ingin keluar dan menyimpan tetapan?", saveChoice: "Simpan pilihan anda", yes: "Ya", no: "Tidak", AutoSkOff: "Nyahaktifkan Langkau Automatik", AutoSkON: "Aktifkan semula Langkau Automatik" }, pl: { HeadLabelTitle: "Parametr automatycznego pomijania", AutoSkipActiveToggle: "Włącz automatyczne pomijanie", AutoSkipDelayInput: "Opóźnienie przed pominięciem (ms)", ArrowAutoSkipToggle: "Włącz automatyczne pomijanie strzałkami", OverlayAlertShowToggle: "Pokaż alert nakładki", OverlayAutoSaveToggle: "Zapisz po wyjściu z nakładki", HistoryButtonToggle: "Aktywuj przycisk na stronie głównej, aby zobaczyć więcej historii", WatchlistButtonToggle: "Aktywuj przycisk na stronie głównej, aby zobaczyć więcej listy obserwowanych", saveButton: "Zapisz", cancelButton: "Anuluj", defaultButton: "Domyślne", confirmExit: "Czy chcesz wyjść i zapisać ustawienia?", saveChoice: "Zapisz swój wybór", yes: "Tak", no: "Nie", AutoSkOff: "Wyłącz automatyczne pomijanie", AutoSkON: "Ponownie włącz automatyczne pomijanie" }, pt: { HeadLabelTitle: "Parâmetro de Pular Automático", AutoSkipActiveToggle: "Ativar pulo automático", AutoSkipDelayInput: "Atraso antes de pular (ms)", ArrowAutoSkipToggle: "Ativar pulo automático com setas", OverlayAlertShowToggle: "Mostrar alerta em sobreposição", OverlayAutoSaveToggle: "Salvar ao sair da sobreposição", HistoryButtonToggle: "Ativar botão na página principal para mais histórico", WatchlistButtonToggle: "Ativar botão na página principal para mais lista de observação", saveButton: "Salvar", cancelButton: "Cancelar", defaultButton: "Padrão", confirmExit: "Deseja sair e salvar as configurações?", saveChoice: "Salvar sua escolha", yes: "Sim", no: "Não", AutoSkOff: "Desativar Pulo Automático", AutoSkON: "Reativar Pulo Automático" }, ru: { HeadLabelTitle: "Параметр автоматического пропуска", AutoSkipActiveToggle: "Включить автоматическое пропускание", AutoSkipDelayInput: "Задержка перед пропуском (мс)", ArrowAutoSkipToggle: "Включить автоматический пропуск с помощью стрелок", OverlayAlertShowToggle: "Показать уведомление в оверлее", OverlayAutoSaveToggle: "Сохранить при выходе из оверлея", HistoryButtonToggle: "Активировать кнопку на главной странице для просмотра истории", WatchlistButtonToggle: "Активировать кнопку на главной странице для списка просмотра", saveButton: "Сохранить", cancelButton: "Отмена", defaultButton: "По умолчанию", confirmExit: "Вы хотите выйти и сохранить настройки?", saveChoice: "Сохранить ваш выбор", yes: "Да", no: "Нет", AutoSkOff: "Отключить автоматическое пропускание", AutoSkON: "Включить автоматическое пропускание" }, ta: { HeadLabelTitle: "தானியங்கும் தாண்டும் அளவுரு", AutoSkipActiveToggle: "தானியங்கி தவிர்க்கலை இயக்கவும்", AutoSkipDelayInput: "தவிர்க்கும் முன் தாமதம் (மில்லி விநாடிகள்)", ArrowAutoSkipToggle: "அம்பு தானியங்கி தவிர்க்கலை இயக்கவும்", OverlayAlertShowToggle: "மேலே இடப்படும் எச்சரிக்கையை காட்டு", OverlayAutoSaveToggle: "மேலே இடப்பட்டதை விட்டு வெளியேறும்போது சேமிக்கவும்", HistoryButtonToggle: "மேலும் வரலாற்றை காண முதன்மை பக்கத்தில் பொத்தானை செயல்படுத்தவும்", WatchlistButtonToggle: "மேலும் பார்வை பட்டியலை காண முதன்மை பக்கத்தில் பொத்தானை செயல்படுத்தவும்", saveButton: "சேமிக்கவும்", cancelButton: "ரத்துசெய்", defaultButton: "இயல்புநிலை", confirmExit: "நீங்கள் வெளியேறி அமைப்புகளைச் சேமிக்க விரும்புகிறீர்களா?", saveChoice: "உங்கள் தேர்வைச் சேமிக்கவும்", yes: "ஆம்", no: "இல்லை", AutoSkOff: "தானியங்கி தவிர்க்கலை முடக்கு", AutoSkON: "தானியங்கி தவிர்க்கலை மீண்டும் இயக்கு" }, te: { HeadLabelTitle: "ఆటో స్కిప్ పరామితి", AutoSkipActiveToggle: "ఆటో స్కిప్‌ను ప్రారంభించండి", AutoSkipDelayInput: "స్కిప్ చేసేముందు ఆలస్యం (మి.సె.)", ArrowAutoSkipToggle: "ఆరో స్కిప్‌ను ప్రారంభించండి", OverlayAlertShowToggle: "ఓవర్లే అలర్ట్‌ను చూపించండి", OverlayAutoSaveToggle: "ఓవర్లే నుండి బయటకు వచ్చినప్పుడు సేవ్ చేయండి", HistoryButtonToggle: "మరింత చరిత్ర కోసం ప్రధాన పేజీలో బటన్‌ను ప్రారంభించండి", WatchlistButtonToggle: "మరింత వీక్షణ జాబితా కోసం ప్రధాన పేజీలో బటన్‌ను ప్రారంభించండి", saveButton: "సేవ్", cancelButton: "రద్దు చేయండి", defaultButton: "అప్రమేయం", confirmExit: "మీరు నిష్క్రమించి సెట్టింగ్‌లను సేవ్ చేయాలనుకుంటున్నారా?", saveChoice: "మీ ఎంపికను సేవ్ చేయండి", yes: "అవును", no: "కాదు", AutoSkOff: "ఆటో స్కిప్‌ను నిలిపివేయి", AutoSkON: "ఆటో స్కిప్‌ను మళ్లీ ప్రారంభించండి" }, th: { HeadLabelTitle: "พารามิเตอร์ข้ามอัตโนมัติ", AutoSkipActiveToggle: "เปิดใช้งานการข้ามอัตโนมัติ", AutoSkipDelayInput: "หน่วงเวลาก่อนข้าม (มิลลิวินาที)", ArrowAutoSkipToggle: "เปิดใช้งานการข้ามอัตโนมัติด้วยลูกศร", OverlayAlertShowToggle: "แสดงการแจ้งเตือนแบบซ้อนทับ", OverlayAutoSaveToggle: "บันทึกเมื่อออกจากการซ้อนทับ", HistoryButtonToggle: "เปิดใช้งานปุ่มบนหน้าแรกเพื่อดูประวัติเพิ่มเติม", WatchlistButtonToggle: "เปิดใช้งานปุ่มบนหน้าแรกเพื่อดูรายการที่ต้องการ", saveButton: "บันทึก", cancelButton: "ยกเลิก", defaultButton: "ค่าเริ่มต้น", confirmExit: "คุณต้องการออกและบันทึกการตั้งค่าหรือไม่?", saveChoice: "บันทึกตัวเลือกของคุณ", yes: "ใช่", no: "ไม่", AutoSkOff: "ปิดการข้ามอัตโนมัติ", AutoSkON: "เปิดใช้งานการข้ามอัตโนมัติอีกครั้ง" }, tr: { HeadLabelTitle: "Otomatik Atlatma Parametresi", AutoSkipActiveToggle: "Otomatik geçişi etkinleştir", AutoSkipDelayInput: "Geçmeden önce gecikme (ms)", ArrowAutoSkipToggle: "Ok tuşlarıyla otomatik geçişi etkinleştir", OverlayAlertShowToggle: "Bindirme uyarısını göster", OverlayAutoSaveToggle: "Bindirmeden çıkarken kaydet", HistoryButtonToggle: "Daha fazla geçmiş için ana sayfada düğmeyi etkinleştir", WatchlistButtonToggle: "Daha fazla izleme listesi için ana sayfada düğmeyi etkinleştir", 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 geçişi devre dışı bırak", AutoSkON: "Otomatik geçişi yeniden etkinleştir" }, vi: { HeadLabelTitle: "Tham số bỏ qua tự động", AutoSkipActiveToggle: "Bật bỏ qua tự động", AutoSkipDelayInput: "Độ trễ trước khi bỏ qua (ms)", ArrowAutoSkipToggle: "Bật bỏ qua tự động bằng phím mũi tên", OverlayAlertShowToggle: "Hiển thị cảnh báo lớp phủ", OverlayAutoSaveToggle: "Lưu khi thoát lớp phủ", HistoryButtonToggle: "Bật nút trên trang chính để xem lịch sử nhiều hơn", WatchlistButtonToggle: "Bật nút trên trang chính để xem danh sách theo dõi nhiều hơn", saveButton: "Lưu", cancelButton: "Hủy", 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" } }; })();