// ==UserScript== // @name YouTube Split // @namespace http://tampermonkey.net/ // @version 1.1 // @author ChatGPT // @match *://www.youtube.com/watch* // @grant none // @description Устанавливает сплит по времени, выводит панель управления в clarify-box и, при достижении порога, показывает оверлей "СПЛИТ НЕ ОПЛАЧЕН" с кнопкой продления (+ 1 минута) // @downloadURL none // ==/UserScript== (function() { 'use strict'; // Глобальные переменные let splitMinutes = null; // Значение сплита в минутах let video = null; // Элемент видео let overlay = null; // Элемент оверлея let splitTriggered = false; // Флаг, что сплит активирован // Обновление отображения значения сплита в спинере function updateSplitDisplay() { const inputField = document.getElementById("split-input"); if (inputField && splitMinutes !== null) { inputField.value = splitMinutes; } } // Создание панели управления сплитом внутри элемента "clarify-box" function addControlPanel() { const clarifyBox = document.getElementById("clarify-box"); if (!clarifyBox) return; if (document.getElementById("split-control-panel")) return; // панель уже существует // Создаем контейнер панели (под тёмную тему) const panel = document.createElement("div"); panel.id = "split-control-panel"; panel.style.cssText = "margin-top: 10px; padding: 10px; background: #181818; border: 1px solid #373737; display: flex; align-items: center; gap: 10px; color: #fff;"; // Кнопка "НАЧАТЬ СПЛИТ" const setButton = document.createElement("button"); setButton.textContent = "НАЧАТЬ СПЛИТ"; setButton.style.cssText = "padding: 5px 10px; font-size: 16px; cursor: pointer; background: #303030; color: #fff; border: 1px solid #444; border-radius: 4px;"; setButton.addEventListener("click", function() { const inputField = document.getElementById("split-input"); const inputVal = parseInt(inputField.value, 10); if (!isNaN(inputVal) && inputVal >= 0) { splitMinutes = inputVal; video.pause(); // Останавливаем видео splitTriggered = true; showOverlay(); // Показываем оверлей } else { alert("Введите корректное число минут."); } }); // Метка "СПЛИТ (мин):" const label = document.createElement("span"); label.textContent = "СПЛИТ (мин):"; label.style.cssText = "font-size: 16px;"; // Кнопка уменьшения (стрелка вниз) const decrementButton = document.createElement("button"); decrementButton.textContent = "↓"; decrementButton.style.cssText = "padding: 5px; font-size: 16px; cursor: pointer; background: #303030; color: #fff; border: 1px solid #444; border-radius: 4px;"; decrementButton.addEventListener("click", function() { const inputField = document.getElementById("split-input"); let currentVal = parseInt(inputField.value, 10); if (!isNaN(currentVal) && currentVal > 0) { inputField.value = currentVal - 1; updateSplitTime(); } }); // Поле ввода (spinner) для установки минут сплита const inputField = document.createElement("input"); inputField.type = "number"; inputField.id = "split-input"; inputField.value = "0"; inputField.min = "0"; inputField.style.cssText = "width: 60px; text-align: center; font-size: 16px; background: #303030; color: #fff; border: 1px solid #444; border-radius: 4px;"; inputField.addEventListener("change", updateSplitTime); // Кнопка увеличения (стрелка вверх) const incrementButton = document.createElement("button"); incrementButton.textContent = "↑"; incrementButton.style.cssText = "padding: 5px; font-size: 16px; cursor: pointer; background: #303030; color: #fff; border: 1px solid #444; border-radius: 4px;"; incrementButton.addEventListener("click", function() { const inputField = document.getElementById("split-input"); let currentVal = parseInt(inputField.value, 10); if (!isNaN(currentVal)) { inputField.value = currentVal + 1; updateSplitTime(); } }); // Собираем панель panel.appendChild(setButton); panel.appendChild(label); panel.appendChild(decrementButton); panel.appendChild(inputField); panel.appendChild(incrementButton); // Вставляем панель в "clarify-box" clarifyBox.appendChild(panel); } // Обновление значения сплита при изменении в спинере function updateSplitTime() { const inputField = document.getElementById("split-input"); const newVal = parseInt(inputField.value, 10); if (!isNaN(newVal)) { splitMinutes = newVal; updateSplitDisplay(); // Если видео остановлено из-за сплита и текущее время стало меньше нового порога, // убираем оверлей и продолжаем воспроизведение if (video && splitTriggered && video.currentTime < splitMinutes * 60) { video.play(); splitTriggered = false; removeOverlay(); } } } // Проверка времени видео – если текущее время достигло или превысило порог, останавливаем видео и показываем оверлей function checkSplitCondition() { if (!video || splitMinutes === null) return; const thresholdSeconds = splitMinutes * 60; if (video.currentTime >= thresholdSeconds && !splitTriggered) { video.pause(); splitTriggered = true; showOverlay(); } // Если сплит активирован, но пользователь увеличил его и текущее время стало меньше порога, // возобновляем воспроизведение if (splitTriggered && video.currentTime < thresholdSeconds) { video.play(); splitTriggered = false; removeOverlay(); } } // Функция показа полноэкранного оверлея с надписями function showOverlay() { if (overlay) return; overlay = document.createElement("div"); overlay.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.95); color: white; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 99999; `; // Надпись с предупреждением const warningMessage = document.createElement("div"); warningMessage.textContent = "⚠️ НУЖНО ДОНАТНОЕ ТОПЛИВО ⚠️"; warningMessage.style.cssText = "font-size: 48px; margin-bottom: 20px;"; // Надпись "СПЛИТ НЕ ОПЛАЧЕН" const splitMessage = document.createElement("div"); splitMessage.textContent = "СПЛИТ НЕ ОПЛАЧЕН"; splitMessage.style.cssText = "font-size: 64px; font-weight: bold; margin-bottom: 30px;"; // Кнопка для продления сплита (увеличение на 1 минуту) const extendButton = document.createElement("button"); extendButton.textContent = "+ 1 минута - 300 рублей"; extendButton.style.cssText = "padding: 10px 20px; font-size: 24px; cursor: pointer; background: #ff4500; border: none; color: white; border-radius: 4px;"; extendButton.addEventListener("click", function() { extendSplit(); }); // Собираем оверлей overlay.appendChild(warningMessage); overlay.appendChild(splitMessage); overlay.appendChild(extendButton); document.body.appendChild(overlay); } // Удаление оверлея function removeOverlay() { if (overlay) { overlay.remove(); overlay = null; } } // Продление сплита – увеличение на 1 минуту function extendSplit() { if (splitMinutes === null) return; splitMinutes += 1; updateSplitDisplay(); // Если текущее время стало меньше нового порога, убираем оверлей и продолжаем воспроизведение if (video.currentTime < splitMinutes * 60) { removeOverlay(); video.play(); splitTriggered = false; } else { alert("Продление недостаточно для продолжения воспроизведения. Продлите сплит ещё раз."); } } // Инициализация скрипта function init() { video = document.querySelector("video"); if (!video) return; addControlPanel(); setInterval(checkSplitCondition, 500); } // Ждем загрузки страницы setTimeout(init, 3000); setInterval(addControlPanel, 2000); })();