Greasy Fork is available in English.
Добавляет 3 кнопки на каждом профиле YouTube в разделе «Видео» («Все видео + Shorts», «Все видео», «Только Shorts»)
// ==UserScript== // @name YouTube Autoplay Buttons. Adding “Play all videos” buttons back // @name:de YouTube-Autoplay-Buttons. Bringt die „Alle Videos abspielen“-Buttons zurück // @name:fr Boutons de lecture automatique de YouTube. Retour des boutons « Lire toutes les vidéos // @name:ru Кнопки автовоспроизведения YouTube. Добавление кнопок «Воспроизвести все видео» назад // @description Adds 3 buttons on each YouTube profile under Videos (All videos + shorts, All videos, Shorts only) // @description:de Fügt 3 Schaltflächen auf jedem YouTube-Profil unter Videos hinzu (Alle Videos + Shorts , Alle Videos, Nur Shorts) // @description:fr Ajout de 3 boutons sur chaque profil YouTube sous Vidéos (Toutes les vidéos + Shorts », Toutes les vidéos, Shorts uniquement) // @description:ru Добавляет 3 кнопки на каждом профиле YouTube в разделе «Видео» («Все видео + Shorts», «Все видео», «Только Shorts») // @author Nieme // @version 0.7 // @namespace https://greasyfork.org/users/1376771 // @homepageURL https://greasyfork.org/scripts/511506 // @supportURL https://greasyfork.org/scripts/511506/feedback // @compatible chrome // @compatible firefox // @compatible opera // @compatible safari // @compatible edge // @match https://www.youtube.com/* // @grant none // @license GPLv2 // @run-at document-end // ==/UserScript== (function() { 'use strict'; const translations = { en: { settingsTitle: "YouTube Buttons Settings", playAllVideosShorts: "Play Standard and Shorts together", playStandardOnly: "Play Standard only", playShortsOnly: "Play Shorts only", playFirstVideo: "Play first video of playlist directly", close: "Close", save: "Save", playAll: "Play All", playAllStandard: "Play All Standard", playAllShorts: "Play All Shorts", }, de: { settingsTitle: "YouTube Buttons Einstellungen", playAllVideosShorts: "Play Standard und Shorts zusammen", playStandardOnly: "Nur Standard abspielen", playShortsOnly: "Nur Shorts abspielen", playFirstVideo: "Direkt erstes Video der Playlist abspielen", close: "Schließen", save: "Speichern", playAll: "Alle abspielen", playAllStandard: "Alle Standard abspielen", playAllShorts: "Alle Shorts abspielen", }, fr: { settingsTitle: "Paramètres des boutons YouTube", playAllVideosShorts: "Lire standard et shorts ensemble", playStandardOnly: "Lire uniquement standard", playShortsOnly: "Lire uniquement shorts", playFirstVideo: "Lire directement la première vidéo de la playlist", close: "Fermer", save: "Enregistrer", playAll: "Lire tout", playAllStandard: "Lire tout standard", playAllShorts: "Lire tout shorts", }, ru: { settingsTitle: "Настройки кнопок YouTube", playAllVideosShorts: "Воспроизвести стандартное и короткие вместе", playStandardOnly: "Воспроизвести только стандартное", playShortsOnly: "Воспроизвести только короткие", playFirstVideo: "Воспроизвести первое видео в плейлисте сразу", close: "Закрыть", save: "Сохранить", playAll: "Воспроизвести все", playAllStandard: "Воспроизвести все стандартное", playAllShorts: "Воспроизвести все короткие", } }; function getTranslation(key) { const language = localStorage.getItem('selectedLanguage') || 'en'; return translations[language][key] || translations['en'][key]; } function updateMenuText() { document.getElementById("settingsTitle").textContent = getTranslation('settingsTitle'); document.getElementById("labelAllVideosShorts").textContent = getTranslation('playAllVideosShorts'); document.getElementById("labelStandardOnly").textContent = getTranslation('playStandardOnly'); document.getElementById("labelShortsOnly").textContent = getTranslation('playShortsOnly'); document.getElementById("labelPlayFirstVideo").textContent = getTranslation('playFirstVideo'); document.getElementById("closeSettings").textContent = getTranslation('close'); document.getElementById("saveSettings").textContent = getTranslation('save'); } function getChannelId() { let cId = null; if (typeof ytInitialData !== 'undefined') { cId = ytInitialData?.metadata?.channelMetadataRenderer?.externalId; } if (!cId) { cId = document.querySelector('.ytp-ce-link[href]')?.href?.split('/')?.pop() || document.querySelector('[itemprop="identifier"]')?.content; } return cId; } function createSettingsMenu() { const menu = document.createElement('div'); menu.style.position = 'fixed'; menu.style.top = '50%'; menu.style.left = '50%'; menu.style.transform = 'translate(-50%, -50%)'; menu.style.padding = '20px'; menu.style.zIndex = '10000'; menu.style.display = 'none'; menu.style.maxWidth = '960px'; menu.style.borderRadius = '24px'; menu.style.boxShadow = '0px 0px 45px 30px rgb(0, 0, 0)'; menu.style.color = 'var(--yt-spec-text-primary)'; menu.style.fontFamily = '"Roboto", "Noto", sans-serif'; menu.style.fontSize = 'var(--ytcp-font-subheading_-_font-size,15px)'; menu.style.background = 'var(--paper-dialog-background-color, var(--primary-background-color))'; const selectedLanguage = localStorage.getItem('selectedLanguage') || 'en'; menu.innerHTML = ` <h3 id="settingsTitle">${getTranslation('settingsTitle')}</h3> <label><input type="checkbox" id="toggleAllVideosShorts" ${localStorage.getItem('showAllVideosShorts') !== 'false' ? 'checked' : ''}><span id="labelAllVideosShorts"> ${getTranslation('playAllVideosShorts')}</span></label><br> <label><input type="checkbox" id="toggleStandardOnly" ${localStorage.getItem('showStandardOnly') !== 'false' ? 'checked' : ''}><span id="labelStandardOnly"> ${getTranslation('playStandardOnly')}</span></label><br> <label><input type="checkbox" id="toggleShortsOnly" ${localStorage.getItem('showShortsOnly') !== 'false' ? 'checked' : ''}><span id="labelShortsOnly"> ${getTranslation('playShortsOnly')}</span></label><br><br> <label><input type="checkbox" id="togglePlayFirstVideo" ${localStorage.getItem('playFirstVideo') === 'true' ? 'checked' : ''}><span id="labelPlayFirstVideo"> ${getTranslation('playFirstVideo')}</span></label><br><br> <label for="languageSelect">Language:</label> <select id="languageSelect"> <option value="en" ${selectedLanguage === 'en' ? 'selected' : ''}>English</option> <option value="de" ${selectedLanguage === 'de' ? 'selected' : ''}>Deutsch</option> <option value="fr" ${selectedLanguage === 'fr' ? 'selected' : ''}>Français</option> <option value="ru" ${selectedLanguage === 'ru' ? 'selected' : ''}>Русский</option> </select><br><br> <button id="closeSettings" class="yt-spec-button-shape-next yt-spec-button-shape-next--tonal yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-s yt-spec-button-shape-next--enable-backdrop-filter-experiment" style="font-size:var(--ytcp-font-subheading_-_font-size,15px);float: left;background: rgba(255, 0, 0, 0.1);cursor: pointer;">${getTranslation('close')}</button> <button id="saveSettings" class="yt-spec-button-shape-next yt-spec-button-shape-next--tonal yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-s yt-spec-button-shape-next--enable-backdrop-filter-experiment" style="font-size:var(--ytcp-font-subheading_-_font-size,15px);float: right;background: rgba(0, 255, 0, 0.1);cursor: pointer;">${getTranslation('save')}</button> `; document.body.appendChild(menu); const closeButton = document.getElementById('closeSettings'); const saveButton = document.getElementById('saveSettings'); const languageSelect = document.getElementById('languageSelect'); languageSelect.addEventListener('change', () => { localStorage.setItem('selectedLanguage', languageSelect.value); updateMenuText(); }); closeButton.addEventListener('click', () => { menu.style.display = 'none'; }); saveButton.addEventListener('click', () => { localStorage.setItem('showAllVideosShorts', document.getElementById('toggleAllVideosShorts').checked); localStorage.setItem('showStandardOnly', document.getElementById('toggleStandardOnly').checked); localStorage.setItem('showShortsOnly', document.getElementById('toggleShortsOnly').checked); localStorage.setItem('playFirstVideo', document.getElementById('togglePlayFirstVideo').checked); menu.style.display = 'none'; refreshCustomButtons(); }); return menu; } const settingsMenu = createSettingsMenu(); function addSettingsButton() { const chipsContainer = document.querySelector('ytd-feed-filter-chip-bar-renderer #chips'); if (!chipsContainer || document.getElementById('settingsButton')) return; const settingsButton = document.createElement('button'); settingsButton.textContent = '⚙️'; settingsButton.id = 'settingsButton'; settingsButton.style.marginLeft = '10px'; settingsButton.style.padding = '6px 12px'; settingsButton.style.border = '0px'; settingsButton.style.backgroundColor = 'var(--yt-spec-badge-chip-background)'; settingsButton.style.color = 'var(--yt-spec-text-primary)'; settingsButton.style.borderRadius = '7px'; settingsButton.style.cursor = 'pointer'; settingsButton.addEventListener('click', () => { settingsMenu.style.display = 'block'; }); chipsContainer.appendChild(settingsButton); } function refreshCustomButtons() { document.querySelectorAll('.custom-play-all-button').forEach(button => button.remove()); addCustomButtons(); } async function fetchFirstVideoId(playlistId) { try { const response = await fetch(`https://www.youtube.com/playlist?list=${playlistId}`); const text = await response.text(); const videoIdMatch = text.match(/"videoId":"(.*?)"/); return videoIdMatch ? videoIdMatch[1] : null; } catch (error) { console.error("Error fetching first video ID:", error); return null; } } function addCustomButtons() { const chipsContainer = document.querySelector('ytd-feed-filter-chip-bar-renderer #chips'); if (!chipsContainer) { console.error('Userscript YouTube Autoplay Error: Chips container not found.'); return; } const showAllVideosShorts = localStorage.getItem('showAllVideosShorts') !== 'false'; const showStandardOnly = localStorage.getItem('showStandardOnly') !== 'false'; const showShortsOnly = localStorage.getItem('showShortsOnly') !== 'false'; const playFirstVideo = localStorage.getItem('playFirstVideo') === 'true'; let buttons = []; if (showAllVideosShorts && !showStandardOnly && !showShortsOnly) { buttons = [{ text: getTranslation('playAll'), generator: (cId) => `UU${cId.slice(2)}` }]; } else if (!showAllVideosShorts && showStandardOnly && !showShortsOnly) { buttons = [{ text: getTranslation('playAll'), generator: (cId) => `UULF${cId.slice(2)}` }]; } else if (!showAllVideosShorts && !showStandardOnly && showShortsOnly) { buttons = [{ text: getTranslation('playAll'), generator: (cId) => `UUSH${cId.slice(2)}` }]; } else if (showAllVideosShorts && showStandardOnly && !showShortsOnly) { buttons = [ { text: getTranslation('playAllVideosShorts'), generator: (cId) => `UU${cId.slice(2)}` }, { text: getTranslation('playStandardOnly'), generator: (cId) => `UULF${cId.slice(2)}` } ]; } else if (showAllVideosShorts && !showStandardOnly && showShortsOnly) { buttons = [ { text: getTranslation('playAllVideosShorts'), generator: (cId) => `UU${cId.slice(2)}` }, { text: getTranslation('playShortsOnly'), generator: (cId) => `UUSH${cId.slice(2)}` } ]; } else if (!showAllVideosShorts && showStandardOnly && showShortsOnly) { buttons = [ { text: getTranslation('playAllStandard'), generator: (cId) => `UULF${cId.slice(2)}` }, { text: getTranslation('playAllShorts'), generator: (cId) => `UUSH${cId.slice(2)}` } ]; } else if (showAllVideosShorts && showStandardOnly && showShortsOnly) { buttons = [ { text: getTranslation('playAllVideosShorts'), generator: (cId) => `UU${cId.slice(2)}` }, { text: getTranslation('playStandardOnly'), generator: (cId) => `UULF${cId.slice(2)}` }, { text: getTranslation('playShortsOnly'), generator: (cId) => `UUSH${cId.slice(2)}` } ]; } buttons.forEach(button => { const newButton = document.createElement('button'); newButton.classList.add('custom-play-all-button'); newButton.textContent = button.text; newButton.style.marginLeft = '10px'; newButton.style.padding = '6px 12px'; newButton.style.border = '0px'; newButton.style.backgroundColor = 'var(--yt-spec-badge-chip-background)'; newButton.style.color = 'var(--yt-spec-text-primary)'; newButton.style.borderRadius = '7px'; newButton.style.cursor = 'pointer'; newButton.style.fontFamily = '"Roboto","Arial",sans-serif'; newButton.style.fontSize = '1.4rem'; newButton.style.lineHeight = '2rem'; newButton.style.fontWeight = '500'; newButton.addEventListener('mouseover', () => { newButton.style.backgroundColor = 'var(--yt-spec-button-chip-background-hover)'; }); newButton.addEventListener('mouseout', () => { newButton.style.backgroundColor = 'var(--yt-spec-badge-chip-background)'; }); newButton.addEventListener('click', async (e) => { e.preventDefault(); const cId = getChannelId(); if (!cId) { console.error('Userscript YouTube Autoplay Error: Channel ID could not be retrieved.'); return; } const playlistId = button.generator(cId); let link = `https://www.youtube.com/playlist?list=${playlistId}`; if (playFirstVideo) { const videoId = await fetchFirstVideoId(playlistId); if (videoId) { link = `https://www.youtube.com/watch?v=${videoId}&list=${playlistId}`; } } console.log("Opening link:", link); window.location.href = link; }); chipsContainer.appendChild(newButton); }); } function checkAndAddButtons() { if (window.location.pathname.includes('/videos')) { addSettingsButton(); addCustomButtons(); } } const observer = new MutationObserver(() => { if (document.querySelector('ytd-feed-filter-chip-bar-renderer #chips')) { checkAndAddButtons(); observer.disconnect(); } }); observer.observe(document, { childList: true, subtree: true }); })();