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);
})();