YouTube layout fix

Forces 6 videos per row, adjusts text sizes, adds spacing, fixes truncation, applies specific alignments based on user tuning.

目前為 2025-04-06 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         YouTube layout fix
// @namespace    http://tampermonkey.net/
// @version      1.74
// @description  Forces 6 videos per row, adjusts text sizes, adds spacing, fixes truncation, applies specific alignments based on user tuning.
// @author       Kalakaua
// @match        *://www.youtube.com/
// @match        *://www.youtube.com/feed/subscriptions*
// @match        *://www.youtube.com/watch*
// @grant        GM_addStyle
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- FINAL ADJUSTABLE VALUES (User Prefs) ---
    const commentTextScale = 1.15;
    const commentMetaScale = 1.1;

    // === Grid Text Sizes (Home/Subs Feed) ===
    const gridTitleScale = 1.12;
    const gridChannelScale = 1.0;
    const gridMetadataScale = 1.7;

    // === Grid Internal Spacing ===
    const gridChannelMarginTop = "-2px"; // Space ABOVE channel name line
    const gridMetaMarginTop = "-2px";    // Space ABOVE views/date line

    // === Sidebar Text Sizes ===
    const sidebarTitleScale = 1.05;
    const sidebarChannelNameScale = 1.0;
    const sidebarViewsDateScale = 1.65;

    // === Watch Page Owner Text Size ===
    const watchOwnerChannelScale = 2.1;

    // === Watch Page Top Row Spacing ===
    const watchTopRowMarginTop = "-4px";
    const watchSubCountMarginTop = "-3.5px";

    // === Sidebar Badge Styling ===
    const sidebarBadgeScale = 0.85;
    const sidebarBadgeMarginTop = "2px";
    const sidebarBadgeMarginBottom = "0px";

    // --- Grid Layout Spacing ---
    const gridEdgePadding = "24px";
    const gridItemHorizontalMargin = "6px";
    const gridItemBottomMargin = "24px";

    // === Sidebar Title Spacing ===
    const sidebarTitleMarginBottom = "6px";

     // === Grid Badge Spacing ===
     const gridBadgeMarginLeft = -5;

    // --- END OF ADJUSTABLE VALUES ---


    const css = `
        /* --- 6 VIDEOS PER ROW (via Item Width) & EDGE SPACING --- */
        ytd-browse[page-subtype="home"] #contents.ytd-rich-grid-renderer,
        ytd-browse[page-subtype="subscriptions"] #contents.ytd-rich-grid-renderer {
            padding-left: ${gridEdgePadding} !important;
            padding-right: ${gridEdgePadding} !important;
            box-sizing: border-box !important;
        }
         ytd-browse[page-subtype="home"] ytd-rich-item-renderer,
         ytd-browse[page-subtype="subscriptions"] ytd-rich-item-renderer {
             margin-left: ${gridItemHorizontalMargin} !important;
             margin-right: ${gridItemHorizontalMargin} !important;
             margin-bottom: ${gridItemBottomMargin} !important;
             max-width: calc(100% / 6 - ${gridItemHorizontalMargin} * 2 - 0.01px) !important;
             overflow: hidden;
         }


        /* --- ADJUST TEXT SIZES --- */
        :root {
           /* Grid Specific */
           --gm-grid-title-size: ${gridTitleScale}em;
           --gm-grid-channel-size: ${gridChannelScale}em;
           --gm-grid-metadata-size: ${gridMetadataScale}em;
           /* Comment Specific */
           --gm-comment-text-size: ${commentTextScale}em;
           --gm-comment-meta-size: ${commentMetaScale}em;
           /* Sidebar Specific */
           --gm-sidebar-title-size: ${sidebarTitleScale}em;
           --gm-sidebar-channel-size: ${sidebarChannelNameScale}em;
           --gm-sidebar-viewsdate-size: ${sidebarViewsDateScale}em;
           --gm-sidebar-badge-size: ${sidebarBadgeScale}em;
           /* Watch Page Owner Specific */
           --gm-watch-owner-channel-size: ${watchOwnerChannelScale}em;
           /* Other derived */
           --gm-watch-title-size: 1.5rem;
           --gm-search-title-size: 1.0rem;
        }

        /* === GRID VIEW (Home/Subs) - Final Styles === */
        #video-title.ytd-rich-grid-media { /* Title */
            font-size: var(--gm-grid-title-size) !important;
            line-height: 1.2em !important;
            max-height: 2.4em !important;
            overflow: hidden;
            margin-bottom: 1px !important; /* Ensure minimal space below title */
        }

        /* Channel Name Line Container */
        ytd-rich-grid-media #byline-container {
             white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important;
             display: flex !important; align-items: center !important;
             margin-top: ${gridChannelMarginTop} !important; /* ADJUSTED Space above channel */
             line-height: 1.2em !important; gap: 0 !important;
        }
        /* Grid Channel Name Container */
        ytd-rich-grid-media ytd-channel-name {
            font-size: var(--gm-grid-channel-size) !important; line-height: 1.25em !important;
            display: inline-block !important; overflow: hidden !important; text-overflow: ellipsis !important;
            flex-shrink: 1 !important; min-width: 0 !important;
            margin: 0 !important; padding: 0 !important;
            vertical-align: baseline !important;
        }
         /* Verified Badge */
        ytd-rich-grid-media ytd-channel-name ytd-badge-supported-renderer {
             display: inline-flex !important; align-items: center !important; justify-content: center !important;
             margin: 0 0 0 ${gridBadgeMarginLeft}px !important; padding: 0 !important;
             flex-shrink: 0 !important; line-height: 1 !important;
         }
         /* Icon DIV Container */
         ytd-rich-grid-media ytd-channel-name ytd-badge-supported-renderer yt-icon .yt-icon-shape > div {
             transform: translate(1px, -3px) !important; margin: 0 !important; padding: 0 !important; line-height: initial !important;
         }
         /* Icon element */
         ytd-rich-grid-media ytd-channel-name ytd-badge-supported-renderer yt-icon {
             margin: 0 !important; padding: 0 !important; vertical-align: initial !important;
         }

        /* --- Metadata Line (Views/Date) --- */
        /* Grid metadata line container */
         ytd-rich-grid-media #metadata-line {
            line-height: 1.3em !important;
            margin-top: ${gridMetaMarginTop} !important; /* ADJUSTED Space above metadata */
            display: block !important;
            white-space: nowrap !important;
            overflow: hidden !important;
            text-overflow: ellipsis !important;
         }
        /* Grid Video Metadata Spans */
        ytd-rich-grid-media #metadata-line > span {
             font-size: var(--gm-grid-metadata-size) !important;
             line-height: 1.2em !important;
             display: inline !important;
             vertical-align: baseline !important;
         }
         /* Add space ONLY after the first span */
        ytd-rich-grid-media #metadata-line > span:first-of-type {
              margin-right: 0.5em !important;
         }
         /* REMOVE the ::after pseudo-element (bullet point) */
        ytd-rich-grid-media #metadata-line > span:first-of-type::after {
             content: none !important;
         }


        /* === WATCH PAGE METADATA (BELOW VIDEO) === */
         .title.ytd-video-primary-info-renderer h1.ytd-video-primary-info-renderer { font-size: var(--gm-watch-title-size) !important; line-height: 1.2em !important; }
         #top-row.ytd-watch-metadata { margin-top: ${watchTopRowMarginTop} !important; }
         ytd-video-owner-renderer ytd-channel-name { font-size: var(--gm-watch-owner-channel-size) !important; line-height: 1.05em !important; margin: 0 !important; padding: 0 !important; display: block !important; }
         #owner-sub-count.ytd-video-owner-renderer { margin-top: ${watchSubCountMarginTop} !important; margin-bottom: 0 !important; }
         #description-inner #description .content.ytd-video-secondary-info-renderer, .ytd-expander.ytd-video-secondary-info-renderer { font-size: 0.8em !important; line-height: 1.35em !important; }
         #info-text.ytd-video-primary-info-renderer { font-size: 0.8em !important; }


        /* === SIDEBAR STYLING === */
        ytd-compact-video-renderer h3.ytd-compact-video-renderer { margin-bottom: ${sidebarTitleMarginBottom} !important; margin-top: 0 !important; }
        #video-title.ytd-compact-video-renderer { font-size: var(--gm-sidebar-title-size) !important; line-height: 1.3em !important; max-height: 2.6em !important; overflow: hidden; }
         ytd-compact-video-renderer ytd-channel-name { font-size: var(--gm-sidebar-channel-size) !important; line-height: 1.35em !important; margin-bottom: 1px !important; }
        ytd-compact-video-renderer #metadata-line span.inline-metadata-item { font-size: var(--gm-sidebar-viewsdate-size) !important; line-height: 1.45em !important; }
         ytd-compact-video-renderer ytd-badge-supported-renderer.badges { margin-top: ${sidebarBadgeMarginTop} !important; margin-bottom: ${sidebarBadgeMarginBottom} !important; font-size: var(--gm-sidebar-badge-size) !important; line-height: 1.2 !important; }


         /* === SEARCH RESULTS === */
         a#video-title.ytd-video-renderer { font-size: var(--gm-search-title-size) !important; margin-bottom: 1px !important; line-height: 1.15em !important; }
          #metadata-line.ytd-video-meta-block { font-size: 0.75em !important; }
          #channel-name.ytd-video-renderer .ytd-channel-name#text, .ytd-channel-name a { font-size: 0.75em !important; }
           .metadata-snippet-container.ytd-video-renderer { font-size: 0.75em !important; }

        /* === VIDEO PAGE: COMMENT SECTION === */
        yt-attributed-string#content-text.ytd-comment-view-model { font-size: var(--gm-comment-text-size) !important; line-height: 1.5em !important; }
        #header-author #author-text, .published-time-text.ytd-comment-renderer { font-size: var(--gm-comment-meta-size) !important; }
         #toolbar.ytd-comment-action-buttons-renderer { font-size: var(--gm-comment-meta-size) !important; }
         #header-author #author-text.ytd-comment-renderer { color: #aaa !important; }

    `;

    // Inject the CSS using GM_addStyle
    if (typeof GM_addStyle === 'function') {
        GM_addStyle(css);
        console.log("YouTube Layout Script: Final Version");
    } else {
        console.error("YouTube Layout Script: GM_addStyle is not defined.");
        const style = document.createElement('style');
        style.textContent = css;
        document.head.appendChild(style);
    }

})();