您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Автоматически пропускает лайкнутые/дизлайкнутые песни. Используйте '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);