HyperLite Web Accelerator [NG]

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

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

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