YouTube Music - Skip Liked/Disliked

Автоматически пропускает лайкнутые/дизлайкнутые песни. Используйте 'D' для дизлайка. Добавлена плавающая кнопка для паузы/возобновления скрипта.

// ==UserScript==
// @name         YouTube Music - Skip Liked/Disliked
// @namespace    http://tampermonkey.net/
// @version      1.6
// @description  Автоматически пропускает лайкнутые/дизлайкнутые песни. Используйте 'D' для дизлайка. Добавлена плавающая кнопка для паузы/возобновления скрипта.
// @author       torch
// @match        https://music.youtube.com/*
// @require      https://code.jquery.com/jquery-3.7.1.min.js
// @grant        GM_addStyle
// @license MIT
// ==/UserScript==

(function($) {
    'use strict';

    // =================================================
    // ЧАСТЬ 0: УПРАВЛЕНИЕ СОСТОЯНИЕМ СКРИПТА (НОВОЕ)
    // =================================================

    let isScriptPaused = false;
    let currentSongTitle = "";

    // Функция для создания и добавления кнопки и индикатора на страницу
    function createPauseButton() {
        const buttonHtml = `
            <div id="userscript-controls">
                <span id="script-status">Статус: Активен</span>
                <button id="toggle-script-btn">Пауза</button>
            </div>
        `;
        $('body').append(buttonHtml);

        // Обработчик клика по кнопке
        $('#toggle-script-btn').on('click', function() {
            isScriptPaused = !isScriptPaused; // Инвертируем состояние
            const statusText = isScriptPaused ? 'Пауза' : 'Активен';
            const buttonText = isScriptPaused ? 'Возобновить' : 'Пауза';

            $('#script-status').text(`Статус: ${statusText}`);
            $(this).text(buttonText);

            if (isScriptPaused) {
                console.log("[YT Music Skipper] Скрипт приостановлен.");
            } else {
                console.log("[YT Music Skipper] Скрипт возобновлен.");
            }
        });
    }

    // Стили для плавающей кнопки и индикатора
    GM_addStyle(`
        #userscript-controls {
            position: fixed;
            bottom: 15px;
            right: 15px;
            z-index: 9999;
            background-color: rgba(28, 28, 28, 0.9);
            border: 1px solid #444;
            border-radius: 8px;
            padding: 10px;
            display: flex;
            align-items: center;
            font-family: 'Roboto', 'Arial', sans-serif;
            color: white;
            box-shadow: 0 2px 10px rgba(0,0,0,0.5);
        }
        #script-status {
            margin-right: 12px;
            font-size: 14px;
        }
        #toggle-script-btn {
            background-color: #f44336;
            color: white;
            border: none;
            padding: 8px 12px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            font-size: 14px;
            border-radius: 5px;
            cursor: pointer;
            transition: background-color 0.3s;
        }
        #toggle-script-btn:hover {
            background-color: #d32f2f;
        }
    `);

    // Создаем кнопку при загрузке страницы
    createPauseButton();


    // =================================================
    // ЧАСТЬ 1: АВТОМАТИЧЕСКИЙ ПРОПУСК ПЕСЕН (изменено)
    // =================================================

    function waitForButtonsAndSkip(songTitle) {
        // Проверяем состояние паузы в самом начале
        if (isScriptPaused) return;

        const maxAttempts = 10;
        const intervalMs = 100;
        let attempts = 0;

        const checkInterval = setInterval(function() {
            // Проверяем состояние паузы внутри интервала
            if (isScriptPaused) {
                clearInterval(checkInterval);
                return;
            }
            attempts++;

            const $playerBar = $('ytmusic-player-bar');
            const $likeButton = $playerBar.find('ytmusic-like-button-renderer[like-status="LIKE"]');
            const $dislikeButton = $playerBar.find('ytmusic-like-button-renderer[like-status="DISLIKE"]');
            const $skipButton = $playerBar.find('.next-button');

            if ($skipButton.length > 0 && ($likeButton.length > 0 || $dislikeButton.length > 0)) {
                console.log(`[YT Music Skipper] Пропускаем "${songTitle}". Статус: ${$likeButton.length ? 'Лайк' : 'Дизлайк'}.`);
                $skipButton[0].click();
                clearInterval(checkInterval);
                return;
            }

            if (attempts >= maxAttempts) {
                clearInterval(checkInterval);
            }
        }, intervalMs);
    }

    setInterval(function() {
        // Проверяем, не на паузе ли скрипт
        if (isScriptPaused) return;

        const $titleElement = $('ytmusic-player-bar .title');
        const newTitle = $titleElement.text();

        if ($titleElement.length > 0 && newTitle && newTitle !== currentSongTitle) {
            console.log(`[YT Music Skipper] Новый трек: "${newTitle}". Проверяем статус...`);
            currentSongTitle = newTitle;
            waitForButtonsAndSkip(newTitle);
        }
    }, 500);

    // =================================================
    // ЧАСТЬ 2 (БОНУС): ДИЗЛАЙК ПО КЛАВИШЕ "D" (изменено)
    // =================================================

    $(document).on('keydown', function(e) {
        // Добавляем проверку на паузу
        if (isScriptPaused) return;

        if (e.key.toUpperCase() === 'D' && !$(e.target).is('input, ytmusic-search-box, [contenteditable="true"]')) {
            e.preventDefault();

            const $dislikeButton = $('ytmusic-player-bar .middle-controls .dislike button');

            if ($dislikeButton.length > 0) {
                const songTitleForLog = $('ytmusic-player-bar .title').text();
                console.log(`[YT Music Hotkey] Дизлайк треку: "${songTitleForLog}"`);
                $dislikeButton[0].click();
            } else {
                console.warn('[YT Music Hotkey] Не удалось найти кнопку дизлайка.');
            }
        }
    });

    console.log("[YT Music Skipper] Скрипт запущен. Используйте 'D' для дизлайка и плавающую кнопку для паузы.");

})(window.jQuery);