YouTube Music - Skip Liked/Disliked (Robust Polling)

Automatically skips liked/disliked songs. Uses a robust polling method to handle slow UI updates, like playlist refreshes.

目前為 2025-08-03 提交的版本,檢視 最新版本

// ==UserScript==
// @name         YouTube Music - Skip Liked/Disliked (Robust Polling)
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Automatically skips liked/disliked songs. Uses a robust polling method to handle slow UI updates, like playlist refreshes.
// @author       torch & Gemini
// @match        https://music.youtube.com/*
// @require      https://code.jquery.com/jquery-3.7.1.min.js
// @license MIT
// @grant        none
// ==/UserScript==

(function($) {
    'use strict';

    let currentSongTitle = "";

    /**
     * Эта функция не просто ждет, а активно проверяет появление кнопок.
     * Она будет пытаться найти лайк/дизлайк несколько раз в течение секунды.
     * @param {string} songTitle - Название трека для логов.
     */
    function waitForButtonsAndSkip(songTitle) {
        const maxAttempts = 10; // Попыток
        const intervalMs = 100; // Интервал между попытками (10 * 100 = 1000 мс = 1 секунда ожидания)
        let attempts = 0;

        const checkInterval = setInterval(function() {
            attempts++;

            // На каждой итерации ищем элементы заново, чтобы работать с актуальным DOM
            const $likeButton = $('ytmusic-player-bar ytmusic-like-button-renderer[like-status="LIKE"]');
            const $dislikeButton = $('ytmusic-player-bar ytmusic-like-button-renderer[like-status="DISLIKE"]');
            const $skipButton = $('ytmusic-player-bar .next-button');

            // Условие успеха: нашли лайк/дизлайк И есть кнопка "Далее"
            if ($skipButton.length > 0 && ($likeButton.length > 0 || $dislikeButton.length > 0)) {
                console.log(`[YT Music Skipper] Пропускаем "${songTitle}". Статус: ${$likeButton.length ? 'Лайк' : 'Дизлайк'}.`);
                $skipButton.trigger('click');
                clearInterval(checkInterval); // Останавливаем проверку, задача выполнена
                return;
            }

            // Условие выхода: попытки закончились, а лайка/дизлайка не нашли
            if (attempts >= maxAttempts) {
                console.log(`[YT Music Skipper] Воспроизводим "${songTitle}". Лайк/дизлайк не обнаружен.`);
                clearInterval(checkInterval); // Останавливаем проверку
            }
        }, intervalMs);
    }

    // Главный цикл, который следит за сменой трека
    setInterval(function() {
        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); // Проверяем смену трека каждые полсекунды

    console.log('[YT Music Skipper] Надежный скрипт для пропуска песен запущен.');

})(window.jQuery);