YouTube Split

Устанавливает сплит по времени, выводит панель управления в clarify-box и, при достижении порога, показывает оверлей "СПЛИТ НЕ ОПЛАЧЕН" с кнопкой продления (+ 1 минута)

Versão de: 09/02/2025. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         YouTube Split 
// @namespace    http://tampermonkey.net/
// @version      1.1
// @author       ChatGPT
// @match        *://www.youtube.com/watch*
// @grant        none
// @description Устанавливает сплит по времени, выводит панель управления в clarify-box и, при достижении порога, показывает оверлей "СПЛИТ НЕ ОПЛАЧЕН" с кнопкой продления (+ 1 минута)
// ==/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);
})();