您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds 3 additional thumbnails per row
当前为
- // ==UserScript==
- // @name YouTube Smaller Thumbnails
- // @namespace http://greasyfork.org
- // @version 0.0.2
- // @description Adds 3 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 = 3; // Amount of columns to add.
- const MAX_COLUMNS = 6; // Maximum amount of columns.
- function getTargetValue(currentValue) {
- let newValue = currentValue + DELTA;
- if (newValue > MAX_COLUMNS) {
- newValue = MAX_COLUMNS;
- }
- return newValue;
- }
- 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 (isNaN(currentValue)) {
- return;
- }
- const newValue = getTargetValue(currentValue);
- if (currentValue === newValue) {
- return;
- }
- const newStyle = currentStyle.replace(
- /--ytd-rich-grid-items-per-row:\s*\d+/,
- `--ytd-rich-grid-items-per-row: ${newValue}`
- );
- gridElement.setAttribute('style', newStyle);
- console.log(`[YouTube Smaller Thumbnails] Modified grid items per row: ${currentValue} -> ${newValue}`);
- }
- function modifyItemsPerRow(itemElement) {
- const currentValue = parseInt(itemElement.getAttribute('items-per-row'), 10);
- if (isNaN(currentValue)) {
- return;
- }
- const newValue = getTargetValue(currentValue)
- if (currentValue === newValue) {
- return;
- }
- itemElement.setAttribute('items-per-row', newValue);
- console.log(`[YouTube Smaller Thumbnails] Modified item renderer items per row: ${currentValue} -> ${newValue}`);
- }
- 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);
- })();