HyperLite Web Accelerator [NG]

АВТО-РЕЖИМ: видео-хостинги → мгновенный запуск центрального видео. Обычные сайты → текст в видимой области первым. Полная совместимость с Passkey и 2FA на ЛЮБОМ сайте + авто-отключение на grok.x.ai

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         HyperLite Web Accelerator [NG]
// @name:en      HyperLite Web Accelerator [NG]
// @namespace    http://tampermonkey.net/
// @version      1.2.7
// @description  АВТО-РЕЖИМ: видео-хостинги → мгновенный запуск центрального видео. Обычные сайты → текст в видимой области первым. Полная совместимость с Passkey и 2FA на ЛЮБОМ сайте + авто-отключение на grok.x.ai
// @description:en AUTO MODE: Video sites → instant central video play. Full Passkey/2FA compatibility on ANY site + auto-skip on grok.x.ai
// @author       Qwen + Grok
// @match        *://*/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // === АВТО-ОТКЛЮЧЕНИЕ НА GROK / X.AI (чтобы passkey и 2FA работали 100%) ===
    if (location.hostname.endsWith('.x.ai') || location.hostname.includes('grok')) {
        console.log('[HyperLite] 🔥 Полностью отключён на grok.x.ai / x.ai — Passkey и 2FA теперь работают без ошибок');
        return; // ← полностью выходим, скрипт больше ничего не делает на этих доменах
    }

    // === БЕЗОПАСНЫЙ requestIdleCallback ===
    const requestIdleCallback = window.requestIdleCallback
        ? window.requestIdleCallback.bind(window)
        : (callback) => setTimeout(callback, 1);

    const CONFIG = {
        lazyImages: true,
        lazyIframes: true,
        blockAutoPlayOthers: true,
        blockTrackers: true,
        optimizeFonts: true,
        aggressivePrefetch: true,
        maxPrefetch: 12,
        rootMargin: '400px'
    };

    const TRACKER_DOMAINS = [
        'google-analytics.com', 'analytics.google.com', 'googletagmanager.com', 'doubleclick.net',
        'facebook.net', 'connect.facebook.net', 'fb.com', 'hotjar.com', 'intercom.io',
        'mc.yandex.ru', 'mc.yandex.net', 'metrika.yandex.ru', 'yandex.ru/metrika',
        'yandex.ru/adfox', 'clck.ru', 'clck.yandex.ru', 'dzen.ru', 'zen.yandex.ru',
        'pixel.', 'beacon.', 'counter.', 'stat.', 'tracker.', 'analytics.', 'ad.', 'ads.',
        'mail.ru', 't.mail.ru', 'ad.mail.ru', 'my.mail.ru/counter'
    ];

    const VIDEO_HOSTS_REGEX = /youtube|vk\.com|ok\.ru|rutube|dzen|yandex\.ru\/video|mail\.ru\/video|my\.mail\.ru\/video/i;

    // === ЗАЩИТА АУТЕНТИФИКАЦИИ НА ВСЕХ ОСТАЛЬНЫХ САЙТАХ ===
    function isAuthRelated(node) {
        if (!node || node.nodeType !== 1) return false;
        const str = (node.id || node.className || node.getAttribute('data-') || node.src || node.tagName || '').toLowerCase();
        const keywords = ['webauthn','passkey','credential','2fa','otp','mfa','totp','twofactor','verification','auth','login','session','challenge','verify','code','token','invalid_argument'];
        if (keywords.some(k => str.includes(k))) return true;

        // проверка родителей
        let parent = node.parentElement;
        while (parent) {
            const pstr = (parent.id || parent.className || parent.getAttribute('data-') || parent.src || '').toLowerCase();
            if (keywords.some(k => pstr.includes(k))) return true;
            parent = parent.parentElement;
        }
        return false;
    }

    function isCriticalIframe(iframe) {
        if (!iframe || iframe.tagName !== 'IFRAME') return false;
        const src = (iframe.src || '').toLowerCase();
        if (src.startsWith('chrome-extension:') || src.startsWith('moz-extension:') ||
            src.startsWith('ms-browser-extension:') || src.startsWith('safari-web-extension:') ||
            !src || src === 'about:blank') return true;

        if (src.includes('webauthn') || src.includes('credential') || (src.includes('auth') && src.includes('iframe'))) return true;

        const rect = iframe.getBoundingClientRect();
        const style = window.getComputedStyle(iframe);
        if (style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) < 0.1 ||
            rect.width <= 4 || rect.height <= 4) return true;
        return false;
    }

    // === 1. БЛОКИРОВКА ТРЕКЕРОВ ===
    function blockTrackersInNode(node) {
        if (!node || node.nodeType !== 1 || isAuthRelated(node)) return;
        const checkElement = (el) => {
            if (!el || el.nodeType !== 1) return false;
            if (el.tagName === 'SCRIPT' || el.tagName === 'IFRAME' || el.tagName === 'IMG') {
                const src = (el.src || el.href || '').toLowerCase();
                if (TRACKER_DOMAINS.some(d => src.includes(d))) {
                    el.remove();
                    return true;
                }
            }
            return false;
        };
        checkElement(node);
        node.querySelectorAll('script[src], iframe[src], img[src]').forEach(checkElement);
    }

    // === 2. ОПТИМИЗАЦИЯ ШРИФТОВ ===
    function optimizeFonts() {
        if (!CONFIG.optimizeFonts) return;
        const style = document.createElement('style');
        style.textContent = `
            html { -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
            * { font-display: swap !important; }
            @media (prefers-reduced-motion: reduce) {
                *, ::before, ::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
            }
        `;
        document.head.appendChild(style);

        const resources = ['https://www.youtube.com','https://vk.com','https://rutube.ru','https://dzen.ru','https://ok.ru','https://mail.ru','https://my.mail.ru','https://i.ytimg.com','https://fonts.googleapis.com','https://fonts.gstatic.com'];
        resources.forEach(href => {
            const pre = document.createElement('link'); pre.rel = 'preconnect'; pre.href = href; document.head.appendChild(pre);
            const dns = document.createElement('link'); dns.rel = 'dns-prefetch'; dns.href = href; document.head.appendChild(dns);
        });
    }

    // === 3. ОБРАБОТКА МЕДИА ===
    function processMedia(node, isMainVideo = false) {
        if (!node || node.nodeType !== 1 || isAuthRelated(node)) return;

        if (CONFIG.lazyImages) {
            const images = node.tagName === 'IMG' ? [node] : node.querySelectorAll('img');
            images.forEach(img => {
                if (!img.hasAttribute('loading')) img.setAttribute('loading', 'lazy');
                img.decoding = 'async';
            });
        }

        if (CONFIG.lazyIframes) {
            const iframes = node.tagName === 'IFRAME' ? [node] : node.querySelectorAll('iframe');
            iframes.forEach(iframe => {
                if (isCriticalIframe(iframe)) return;
                const src = iframe.src || '';
                const isVideoPlatform = VIDEO_HOSTS_REGEX.test(src);
                if (isVideoPlatform && isMainVideo) {
                    iframe.removeAttribute('loading');
                    iframe.setAttribute('preload', 'auto');
                    if (src.includes('autoplay=0')) iframe.src = src.replace('autoplay=0', 'autoplay=1');
                } else {
                    if (!iframe.hasAttribute('loading')) iframe.setAttribute('loading', 'lazy');
                    if (isVideoPlatform && src.includes('autoplay=1')) iframe.src = src.replace('autoplay=1', 'autoplay=0');
                }
            });
        }

        const videos = node.tagName === 'VIDEO' ? [node] : node.querySelectorAll('video');
        videos.forEach(video => {
            if (isMainVideo) {
                video.removeAttribute('loading');
                video.setAttribute('preload', 'auto');
                video.autoplay = true;
                video.load();
                video.setAttribute('fetchpriority', 'high');
            } else if (CONFIG.blockAutoPlayOthers) {
                video.removeAttribute('autoplay');
                video.setAttribute('preload', 'none');
            }
        });
    }

    // === 4. INTERSECTION OBSERVER ===
    let mainVideoObserver = null;
    function activateMainVideoFocus() {
        if (mainVideoObserver) mainVideoObserver.disconnect();
        mainVideoObserver = new IntersectionObserver((entries) => {
            for (const entry of entries) {
                if (entry.isIntersecting && entry.intersectionRatio > 0.65) {
                    const el = entry.target;
                    const isVideoPlatform = el.tagName === 'VIDEO' || VIDEO_HOSTS_REGEX.test(el.src || '');
                    if (isVideoPlatform) {
                        processMedia(el, true);
                        mainVideoObserver.disconnect();
                        return;
                    }
                }
            }
        }, { threshold: 0.65, rootMargin: CONFIG.rootMargin });

        document.querySelectorAll('video, iframe').forEach(el => {
            if (!isAuthRelated(el)) mainVideoObserver.observe(el);
        });
    }

    // === 5. PREFETCH ===
    let alreadyPrefetched = new Set();
    function prefetchVisibleLinks() {
        if (!CONFIG.aggressivePrefetch) return;
        requestIdleCallback(() => {
            let count = 0;
            document.querySelectorAll('a[href]').forEach(a => {
                if (count >= CONFIG.maxPrefetch) return;
                const rect = a.getBoundingClientRect();
                const href = a.href;
                if (rect.top < window.innerHeight * 1.5 && rect.bottom > -100 && href.startsWith('http') && !alreadyPrefetched.has(href)) {
                    const link = document.createElement('link');
                    link.rel = 'prefetch';
                    link.href = href;
                    document.head.appendChild(link);
                    alreadyPrefetched.add(href);
                    count++;
                }
            });
        });
    }

    // === MUTATIONOBSERVER ===
    const observer = new MutationObserver((mutations) => {
        if (document.hidden) return;
        requestIdleCallback(() => {
            mutations.forEach(mutation => {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === 1) {
                        processMedia(node, false);
                        blockTrackersInNode(node);
                    }
                });
            });
        });
    });

    // === ИНИЦИАЛИЗАЦИЯ ===
    function init() {
        if (!document.body) { setTimeout(init, 50); return; }
        optimizeFonts();
        processMedia(document.body, false);
        blockTrackersInNode(document.body);
        observer.observe(document.documentElement, { childList: true, subtree: true });
        setTimeout(() => { activateMainVideoFocus(); prefetchVisibleLinks(); }, 400);
        setTimeout(() => { 
            if (mainVideoObserver) mainVideoObserver.disconnect();
            activateMainVideoFocus(); 
            prefetchVisibleLinks(); 
        }, 2200);
        window.addEventListener('load', prefetchVisibleLinks);
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();