您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds two additional thumbnails per row
当前为
// ==UserScript== // @name YouTube Smaller Thumbnails // @namespace http://greasyfork.org // @version 0.0.1 // @description Adds two additional thumbnails per row // @author you // @license MIT // @match *://www.youtube.com/* // @match *://youtube.com/* // @run-at document-start // @grant none // ==/UserScript== (function() { 'use strict'; const DELTA = 2; // Amount of rows to add. const PROCESSED_FLAG = 'yt-thumbnails-processed'; let targetValue = 0 function modifyGridStyle(gridElement) { const currentStyle = gridElement.getAttribute('style'); if (!currentStyle) return; const itemsPerRowMatch = currentStyle.match(/--ytd-rich-grid-items-per-row:\s*(\d+)/); if (!itemsPerRowMatch) return; const currentValue = parseInt(itemsPerRowMatch[1], 10); if (targetValue === 0) { targetValue = currentValue + DELTA; } if (currentValue === targetValue) { return; } const newStyle = currentStyle.replace( /--ytd-rich-grid-items-per-row:\s*\d+/, `--ytd-rich-grid-items-per-row: ${targetValue}` ); gridElement.setAttribute('style', newStyle); console.log(`[YouTube Smaller Thumbnails] Modified grid items per row: ${currentValue} -> ${targetValue}`); } function modifyItemsPerRow(itemElement) { const currentValue = parseInt(itemElement.getAttribute('items-per-row'), 10); if (isNaN(currentValue)) return; if (targetValue === 0) { targetValue = currentValue + DELTA; } if (currentValue === targetValue) { return; } itemElement.setAttribute('items-per-row', targetValue); console.log(`[YouTube Smaller Thumbnails] Modified item renderer items per row: ${currentValue} -> ${targetValue}`); } function processExistingElements() { document.querySelectorAll('ytd-rich-grid-renderer').forEach(gridElement => { modifyGridStyle(gridElement); }); document.querySelectorAll('ytd-rich-item-renderer').forEach(itemElement => { modifyItemsPerRow(itemElement); }); } const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.addedNodes && mutation.addedNodes.length > 0) { mutation.addedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { if (node.tagName === 'YTD-RICH-GRID-RENDERER') { modifyGridStyle(node); } if (node.tagName === 'YTD-RICH-ITEM-RENDERER') { modifyItemsPerRow(node); } node.querySelectorAll('ytd-rich-grid-renderer').forEach(gridElement => { modifyGridStyle(gridElement); }); node.querySelectorAll('ytd-rich-item-renderer').forEach(itemElement => { modifyItemsPerRow(itemElement); }); } }); } if (mutation.type === 'attributes') { const target = mutation.target; if (target.tagName === 'YTD-RICH-GRID-RENDERER' && mutation.attributeName === 'style') { modifyGridStyle(target); } if (target.tagName === 'YTD-RICH-ITEM-RENDERER' && mutation.attributeName === 'items-per-row') { modifyItemsPerRow(target); } } }); }); function startObserver() { processExistingElements(); observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'items-per-row'] }); console.log('[YouTube Smaller Thumbnails] Observer started'); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startObserver); } else { startObserver(); } setInterval(processExistingElements, 3000); })();