Гипер-оптимизатор YouTube (Без изменения интерфейса)

Низкоуровневые оптимизации: перехватывает конфигурацию ytcfg, отключает фоновое логирование, замораживает hover-эффекты при скролле для максимального FPS, оптимизирует память и эмбиент. Без изменений интерфейса.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         YouTube Performance Booster HYPER
// @name:ru      Гипер-оптимизатор YouTube (Без изменения интерфейса)
// @namespace    http://tampermonkey.net/
// @version      4.0
// @description  Maximum low-level optimizations: tames ytcfg experiment flags, bypasses useless logging, pauses hover/transitions during scroll for flawless FPS, throttles ambient glow, and safely mitigates memory leaks. Zero UI changes.
// @description:ru Низкоуровневые оптимизации: перехватывает конфигурацию ytcfg, отключает фоновое логирование, замораживает hover-эффекты при скролле для максимального FPS, оптимизирует память и эмбиент. Без изменений интерфейса.
// @author       torch
// @match        https://*.youtube.com/*
// @run-at       document-start
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // --- 1. ПЕРЕХВАТ И ОПТИМИЗАЦИЯ YTCFG (EXPERIMENT FLAGS) ---
    // На лету перехватывает конфигурацию YouTube и отключает ресурсоемкое фоновое логирование.
    function optimizeConfig(cfg) {
        if (!cfg) return;
        if (cfg.EXPERIMENT_FLAGS) {
            cfg.EXPERIMENT_FLAGS.web_attention_logging_scroll_throttle = 1500; // Реже трекать внимание при прокрутке
            cfg.EXPERIMENT_FLAGS.log_window_onerror_fraction = 0.0;            // Отключить отправку логов ошибок на сервер
        }
        if (cfg.web_attention_logging_scroll_throttle !== undefined) cfg.web_attention_logging_scroll_throttle = 1500;
        if (cfg.log_window_onerror_fraction !== undefined) cfg.log_window_onerror_fraction = 0.0;
        if (cfg.polymer_property_access_logging_percent !== undefined) cfg.polymer_property_access_logging_percent = 0.0;
    }

    let ytcfgVal = window.ytcfg;
    Object.defineProperty(window, 'ytcfg', {
        get() { return ytcfgVal; },
        set(newVal) {
            ytcfgVal = newVal;
            if (ytcfgVal && typeof ytcfgVal.set === 'function' && !ytcfgVal.set.isPatched) {
                const originalSet = ytcfgVal.set;
                ytcfgVal.set = function(key, val) {
                    if (typeof key === 'object') {
                        optimizeConfig(key);
                    } else if (key === 'EXPERIMENT_FLAGS' && val) {
                        optimizeConfig({ EXPERIMENT_FLAGS: val });
                    }
                    return originalSet.apply(this, arguments);
                };
                ytcfgVal.set.isPatched = true;
            }
        },
        configurable: true
    });

    if (window.ytcfg && typeof window.ytcfg.set === 'function') {
        optimizeConfig(window.ytcfg);
    }

    // --- 2. УСТРАНЕНИЕ ЛАГОВ ПРИ СКРОЛЛИНГЕ (TRANSITION SUSPENDER) ---
    // Отключает hover-эффекты и анимации строго на время прокрутки. Поднимает FPS до стабильных 60/120/144 Гц.
    const disableHoverStyles = document.createElement('style');
    disableHoverStyles.id = 'yt-scroll-hover-disable';
    disableHoverStyles.textContent = `
        body.is-scrolling * {
            pointer-events: none !important;
            transition: none !important;
            animation-play-state: paused !important;
        }
    `;
    document.documentElement.appendChild(disableHoverStyles);

    let isScrollingTimeout;
    window.addEventListener('scroll', () => {
        window.clearTimeout(isScrollingTimeout);
        if (!document.body.classList.contains('is-scrolling')) {
            document.body.classList.add('is-scrolling');
        }
        isScrollingTimeout = setTimeout(() => {
            document.body.classList.remove('is-scrolling');
        }, 150);
    }, { passive: true });

    // --- 3. ОЧИСТКА ПАМЯТИ ПРИ НАВИГАЦИИ (SPA GC ASSIST) ---
    // Предотвращает утечки ОЗУ при переходе от одного видео к другому.
    window.addEventListener('yt-navigate-start', () => {
        // Очищаем кэшированные браузером изображения и тяжелые неактивные элементы
        window.clearTimeout(isScrollingTimeout);
        if (typeof window.gc === 'function') {
            try { window.gc(); } catch(e) {}
        }
    }, { passive: true });

    // --- 4. ОГРАНИЧЕНИЕ ЭМБИЕНТ-СВЕЧЕНИЯ ПЛЕЕРА ---
    const originalGetContext = HTMLCanvasElement.prototype.getContext;
    HTMLCanvasElement.prototype.getContext = function(type, attributes) {
        const context = originalGetContext.call(this, type, attributes);
        if (type === '2d' && (this.id === 'cinematic' || this.classList.contains('ytp-glow-canvas') || this.closest('#cinematic-container'))) {
            const originalDrawImage = context.drawImage;
            let lastDrawTime = 0;
            context.drawImage = function(...args) {
                const now = performance.now();
                if (now - lastDrawTime < 50) return; // Лимит 20 FPS для размытого свечения
                lastDrawTime = now;
                return originalDrawImage.apply(this, args);
            };
        }
        return context;
    };

    // --- 5. ОГРАНИЧЕНИЕ ЧАСТОТЫ LAYOUT OBSERVERS ---
    const OriginalResizeObserver = window.ResizeObserver;
    window.ResizeObserver = class ThrottledResizeObserver extends OriginalResizeObserver {
        constructor(callback) {
            let timeout;
            const throttledCallback = (entries, observer) => {
                if (timeout) return;
                timeout = setTimeout(() => {
                    callback(entries, observer);
                    timeout = null;
                }, 30);
            };
            super(throttledCallback);
        }
    };

    // --- 6. КОРРЕКТИРОВКА ЧАСТОТЫ ФОНОВЫХ ТАЙМЕРОВ ---
    const originalSetInterval = window.setInterval;
    window.setInterval = function(fn, delay, ...args) {
        if (delay > 0 && delay < 100) {
            delay = 100;
        }
        return originalSetInterval.call(window, fn, delay, ...args);
    };

    // --- 7. БЛОКИРОВКА ИЗБЫТОЧНОЙ СЕТЕВОЙ ТЕЛЕМЕТРИИ ---
    const originalSendBeacon = Navigator.prototype.sendBeacon;
    Navigator.prototype.sendBeacon = function(url, data) {
        if (url.includes('/csi_204') || url.includes('/error_204') || url.includes('/api/stats/qoe')) {
            if (Math.random() > 0.2) return true;
        }
        return originalSendBeacon.call(this, url, data);
    };

    // --- 8. ОГРАНИЧЕНИЕ МЫШИ НА PROGRESS BAR ---
    let lastMoveTime = 0;
    document.addEventListener('mousemove', (e) => {
        const now = performance.now();
        if (e.target.closest && e.target.closest('.ytp-progress-bar')) {
            if (now - lastMoveTime < 16.6) {
                e.stopPropagation();
            } else {
                lastMoveTime = now;
            }
        }
    }, { passive: true, capture: true });

    // --- 9. ПАССИВНЫЕ ОБРАБОТЧИКИ СОБЫТИЙ ДЛЯ СКРОЛЛА ---
    const originalAddEventListener = EventTarget.prototype.addEventListener;
    EventTarget.prototype.addEventListener = function(type, listener, options) {
        if (['touchstart', 'touchmove', 'wheel', 'mousewheel'].includes(type)) {
            if (typeof options === 'boolean') {
                options = { passive: true, capture: options };
            } else if (typeof options === 'object') {
                options.passive = options.passive !== undefined ? options.passive : true;
            } else {
                options = { passive: true };
            }
        }
        return originalAddEventListener.call(this, type, listener, options);
    };

    // --- 10. АСИНХРОННОЕ ДЕКОДИРОВАНИЕ ИЗОБРАЖЕНИЙ ---
    const originalCreateElement = Document.prototype.createElement;
    Document.prototype.createElement = function(tagName, options) {
        const element = originalCreateElement.call(this, tagName, options);
        if (tagName.toLowerCase() === 'img') {
            element.setAttribute('decoding', 'async');
        }
        return element;
    };

    // --- 11. ОПТИМАЛЬНЫЕ CSS-ПРАВИЛА Отрисовки ---
    const injectOptimizeStyles = () => {
        if (document.head) {
            const style = document.createElement('style');
            style.id = 'yt-perf-optimizer-hyper-styles';
            style.textContent = `
                ytd-rich-grid-renderer,
                ytd-rich-item-renderer,
                ytd-video-renderer,
                ytd-compact-video-renderer,
                ytd-comment-thread-renderer,
                #player-container,
                .html5-video-container,
                #columns {
                    will-change: transform;
                    transform: translateZ(0);
                    backface-visibility: hidden;
                    perspective: 1000px;
                }

                ytd-rich-item-renderer,
                ytd-comment-thread-renderer,
                ytd-compact-video-renderer {
                    content-visibility: auto;
                    contain-intrinsic-size: auto 320px;
                }

                img {
                    content-visibility: auto;
                }
            `;
            document.head.appendChild(style);
        } else {
            setTimeout(injectOptimizeStyles, 10);
        }
    };

    injectOptimizeStyles();
})();