// ==UserScript==
// @name 🧠 X.com Heavy JS Optimizer+
// @name:vi 🧠 Trình tối ưu JavaScript nặng cho X.com+
// @name:en 🧠 X.com Heavy JS Optimizer+
// @name:zh-CN 🧠 X.com 高级 JavaScript 优化器+
// @name:zh-TW 🧠 X.com 高級 JavaScript 優化器+
// @name:ja 🧠 X.com 高性能 JavaScript オプティマイザー+
// @name:ko 🧠 X.com 고급 JS 최적화기+
// @name:fr 🧠 Optimiseur JavaScript Avancé pour X.com+
// @name:de 🧠 X.com Erweiterter JS-Optimierer+
// @name:es 🧠 Optimizador JS Avanzado para X.com+
// @name:pt 🧠 Otimizador JS Avançado para X.com+
// @name:it 🧠 Ottimizzatore JS Avanzato per X.com+
// @name:ru 🧠 Расширенный оптимизатор JS для X.com+
// @name:pl 🧠 Zaawansowany optymalizator JS dla X.com+
// @name:tr 🧠 X.com Gelişmiş JS Optimize Edici+
// @name:ar 🧠 مُحسِّن JavaScript متقدم لـ X.com+
// @name:hi 🧠 X.com के लिए उन्नत JS ऑप्टिमाइज़र+
// @name:th 🧠 ตัวเพิ่มประสิทธิภาพ JS ระดับสูงสำหรับ X.com+
// @name:id 🧠 Pengoptimal JS Tingkat Lanjut untuk X.com+
// @name:nl 🧠 Geavanceerde JS-Optimizer voor X.com+
// @name:uk 🧠 Розширений оптимізатор JS для X.com+
// @name:sv 🧠 X.com Tung JS-optimerare+
// @name:no 🧠 X.com Tung JS-optimaliserer+
// @name:da 🧠 X.com Tung JS-optimerer+
// @name:fi 🧠 X.com Raskas JS-optimoija+
// @name:el 🧠 Βελτιστοποιητής βαρέων JS του X.com+
// @name:cs 🧠 Těžký JS optimalizátor pro X.com+
// @name:hu 🧠 X.com Nehéz JS Optimalizáló+
// @name:ro 🧠 Optimizator JS Greu pentru X.com+
// @name:bg 🧠 Тежък JS оптимизатор за X.com+
// @name:sr 🧠 Тешки ЈС оптимизатор за X.com+
// @name:hr 🧠 Teški JS optimizator za X.com+
// @name:sk 🧠 Ťažký JS optimalizátor pre X.com+
// @name:sl 🧠 Težki JS optimizator za X.com+
// @name:lt 🧠 Sunkus JS optimizatorius, skirtas X.com+
// @name:lv 🧠 Smagais JS optimizētājs vietnei X.com+
// @name:et 🧠 Raske JS-i optimeerija X.com-i jaoks+
// @name:fil 🧠 Malakas na JS Optimizer para sa X.com+
// @name:ms 🧠 Pengoptimum JS Berat X.com+
// @name:bn 🧠 X.com ভারী জেএস অপটিমাইজার+
// @name:pa 🧠 X.com ਹੈਵੀ ਜੇਐਸ ਆਪਟੀਮਾਈਜ਼ਰ+
// @name:jv 🧠 Optimizer JS Abot kanggo X.com+
// @name:te 🧠 X.com హెవీ JS ఆప్టిమైజర్+
// @name:mr 🧠 X.com हेवी जेएस ऑप्टિમાઇઝર+
// @name:ta 🧠 X.com கனமான ஜேஎஸ் ஆப்டிమైజర్+
// @name:ur 🧠 X.com ہیوی جے ایس آپٹیمائزر+
// @name:fa 🧠 بهینه ساز سنگین جاوا اسکریپت X.com+
// @name:he 🧠 מייעל JS כבד של X.com+
// @name:sw 🧠 Kiongeza kasi cha JS Kizito cha X.com+
// @name:af 🧠 X.com Swaar JS-optimeerder+
// @description Enhance X.com/Twitter performance by removing heavy CSS, throttling FPS, limiting feed DOM, blocking analytics, and optimizing offscreen videos.
// @description:vi Cải thiện hiệu năng X.com/Twitter bằng cách loại bỏ CSS nặng, giới hạn FPS, giảm tải DOM feed, chặn theo dõi và tối ưu video ngoài màn hình.
// @description:en Improve X.com/Twitter performance: removes heavy CSS, throttles FPS, limits DOM size, pauses offscreen videos, blocks analytics, and auto-enables aggressive mode when lag is detected.
// @description:zh-CN 优化 X.com/Twitter 性能:移除高负载 CSS、限制 FPS、减少 DOM、暂停屏幕外视频、屏蔽分析并在卡顿时自动启用高性能模式。
// @description:zh-TW 優化 X.com/Twitter 效能:移除高負載 CSS、限制 FPS、減少 DOM、暫停螢幕外影片、封鎖分析並在延遲時自動啟用高效模式。
// @description:ja X.com/Twitter のパフォーマンスを向上: 重い CSS を削除し、FPS を制限し、フィード DOM を縮小し、画面外の動画を一時停止し、分析をブロックし、遅延時に自動的にアグレッシブモードを有効化。
// @description:ko X.com/Twitter 성능 최적화: 무거운 CSS 제거, FPS 제한, 피드 DOM 축소, 화면 밖 동영상 일시정지, 분석 차단, 렉 발생 시 자동 공격적 모드 전환.
// @description:fr Améliorez les performances de X.com/Twitter : supprime les filtres CSS lourds, limite les FPS, réduit le DOM, met en pause les vidéos hors écran, bloque l’analytique et active le mode agressif en cas de ralentissement.
// @description:de Optimiert die Leistung von X.com/Twitter: Entfernt schwere CSS-Filter, begrenzt FPS, reduziert das DOM, pausiert Videos außerhalb des Bildschirms, blockiert Analysen und aktiviert bei Lag den aggressiven Modus automatisch.
// @description:es Mejora el rendimiento de X.com/Twitter: elimina CSS pesados, limita FPS, reduce DOM, pausa videos fuera de pantalla, bloquea analíticas y activa modo agresivo automáticamente al detectar lag.
// @description:pt Melhora o desempenho do X.com/Twitter: remove CSS pesado, limita FPS, reduz o DOM, pausa vídeos fora da tela, bloqueia análises e ativa o modo agressivo automaticamente quando há lag.
// @description:it Migliora le prestazioni di X.com/Twitter: rimuove CSS pesanti, limita FPS, riduce DOM, mette in pausa i video fuori schermo, blocca le analisi e attiva la modalità aggressiva quando rileva lag.
// @description:ru Оптимизирует X.com/Twitter: удаляет тяжелые CSS, ограничивает FPS, сокращает DOM, приостанавливает видео вне экрана, блокирует аналитику и автоматически включает агрессивный режим при лагах.
// @description:pl Popraw wydajność X.com/Twitter: usuwa ciężkie style CSS, ogranicza FPS, zmniejsza DOM, wstrzymuje filmy poza ekranem, blokuje analitykę i automatycznie włącza tryb agresywny przy lagach.
// @description:tr X.com/Twitter performansını artırır: ağır CSS filtrelerini kaldırır, FPS sınırlar, DOM’u küçültür, ekrandışı videoları duraklatır, analitiği engeller ve gecikme durumunda agresif modu otomatik açar.
// @description:ar تحسين أداء X.com/Twitter: إزالة CSS الثقيل، تحديد معدل الإطارات، تقليل DOM، إيقاف الفيديوهات خارج الشاشة، حظر التحليلات، وتفعيل الوضع العدواني تلقائيًا عند التأخير.
// @description:hi X.com/Twitter का प्रदर्शन बेहतर करें: भारी CSS हटाएं, FPS सीमित करें, DOM कम करें, ऑफस्क्रीन वीडियो रोकें, एनालिटिक्स ब्लॉक करें और लैग पर स्वतः आक्रामक मोड चालू करें.
// @description:th ปรับปรุงประสิทธิภาพ X.com/Twitter: ลบ CSS หนัก, จำกัด FPS, ลด DOM, หยุดวิดีโอนอกหน้าจอ, บล็อกการวิเคราะห์ และเปิดโหมดแรงอัตโนมัติเมื่อแลค.
// @description:id Meningkatkan performa X.com/Twitter: menghapus CSS berat, membatasi FPS, mengurangi DOM, menjeda video di luar layar, memblokir analitik, dan otomatis mengaktifkan mode agresif saat lag terdeteksi.
// @description:nl Verbeter de prestaties van X.com/Twitter: verwijdert zware CSS, beperkt FPS, vermindert DOM, pauzeert video's buiten beeld, blokkeert analyses en activeert automatisch agressieve modus bij lag.
// @description:uk Оптимізує X.com/Twitter: видаляє важкі CSS, обмежує FPS, скорочує DOM, призупиняє відео поза екраном, блокує аналітику та автоматично вмикає агресивний режим при лагах.
// @description:sv Förbättra prestandan för X.com/Twitter: tar bort tung CSS, stryper FPS, begränsar DOM-storleken, pausar videor utanför skärmen, blockerar analyser och aktiverar automatiskt aggressivt läge när fördröjning upptäcks.
// @description:no Forbedre ytelsen til X.com/Twitter: fjerner tung CSS, struper FPS, begrenser DOM-størrelse, pauser videoer utenfor skjermen, blokkerer analyser og aktiverer automatisk aggressiv modus når etterslep oppdages.
// @description:da Forbedre ydeevnen for X.com/Twitter: fjerner tung CSS, drosler FPS, begrænser DOM-størrelse, pauser videoer uden for skærmen, blokerer analyser og aktiverer automatisk aggressiv tilstand, når der registreres forsinkelse.
// @description:fi Paranna X.com/Twitter-suorituskykyä: poistaa raskaat CSS-tyylit, rajoittaa FPS:ää, pienentää DOM-kokoa, keskeyttää ruudun ulkopuoliset videot, estää analytiikan ja ottaa aggressiivisen tilan automaattisesti käyttöön viiveen sattuessa.
// @description:el Βελτιώστε την απόδοση του X.com/Twitter: αφαιρεί βαριά CSS, περιορίζει τα FPS, μειώνει το μέγεθος του DOM, θέτει σε παύση βίντεο εκτός οθόνης, αποκλείει τα αναλυτικά στοιχεία και ενεργοποιεί αυτόματα την επιθετική λειτουργία όταν εντοπίζεται καθυστέρηση.
// @description:cs Zlepšete výkon X.com/Twitter: odstraňuje těžké CSS, omezuje FPS, zmenšuje velikost DOM, pozastavuje videa mimo obrazovku, blokuje analytiku a automaticky povoluje agresivní režim při zpoždění.
// @description:hu Javítsa az X.com/Twitter teljesítményét: eltávolítja a nehéz CSS-t, korlátozza az FPS-t, csökkenti a DOM méretét, szünetelteti a képernyőn kívüli videókat, letiltja az analitikát, és késés esetén automatikusan engedélyezi az agresszív módot.
// @description:ro Îmbunătățiți performanța X.com/Twitter: elimină CSS-ul greu, limitează FPS-ul, reduce dimensiunea DOM-ului, întrerupe videoclipurile din afara ecranului, blochează analizele și activează automat modul agresiv la detectarea întârzierilor.
// @description:bg Подобрете производителността на X.com/Twitter: премахва тежък CSS, ограничава FPS, намалява размера на DOM, поставя на пауза видеоклипове извън екрана, блокира анализи и автоматично активира агресивен режим при забавяне.
// @description:sr Побољшајте перформансе X.com/Twitter-а: уклања тежак ЦСС, ограничава ФПС, смањује величину ДОМ-а, паузира видео снимке ван екрана, блокира аналитику и аутоматски омогућава агресивни режим када се открије кашњење.
// @description:hr Poboljšajte performanse X.com/Twittera: uklanja teški CSS, ograničava FPS, smanjuje veličinu DOM-a, pauzira videozapise izvan zaslona, blokira analitiku i automatski omogućuje agresivan način rada kada se otkrije kašnjenje.
// @description:sk Zlepšite výkon X.com/Twitter: odstraňuje ťažké CSS, obmedzuje FPS, zmenšuje veľkosť DOM, pozastavuje videá mimo obrazovky, blokuje analytiku a automaticky povoľuje agresívny režim pri oneskorení.
// @description:sl Izboljšajte delovanje X.com/Twitter: odstrani težke CSS, omeji FPS, zmanjša velikost DOM, zaustavi videoposnetke zunaj zaslona, blokira analitiko in samodejno omogoči agresiven način ob zaznavi zaostanka.
// @description:lt Pagerinkite „X.com“ / „Twitter“ našumą: pašalina sunkų CSS, riboja FPS, sumažina DOM dydį, pristabdo vaizdo įrašus už ekrano ribų, blokuoja analizę ir automatiškai įjungia agresyvųjį režimą, kai aptinkamas vėlavimas.
// @description:lv Uzlabojiet X.com/Twitter veiktspēju: noņem smago CSS, ierobežo FPS, samazina DOM lielumu, aptur video ārpus ekrāna, bloķē analīzi un automātiski ieslēdz agresīvo režīmu, kad tiek konstatēta aizkave.
// @description:et Parandage X.com/Twitteri jõudlust: eemaldab raske CSS-i, piirab FPS-i, vähendab DOM-i suurust, peatab ekraanivälised videod, blokeerib analüütika ja lubab viivituse tuvastamisel automaatselt agressiivse režiimi.
// @description:fil Pahusayin ang pagganap ng X.com/Twitter: nag-aalis ng mabibigat na CSS, nag-throttle ng FPS, nililimitahan ang laki ng DOM, ipinapahinga ang mga video na wala sa screen, hinaharangan ang analytics, at awtomatikong pinapagana ang agresibong mode kapag may na-detect na lag.
// @description:ms Tingkatkan prestasi X.com/Twitter: membuang CSS berat, mengurangkan FPS, mengehadkan saiz DOM, menjedakan video di luar skrin, menyekat analitik dan mengaktifkan mod agresif secara automatik apabila ketinggalan dikesan.
// @description:bn X.com/Twitter এর পারফরম্যান্স উন্নত করুন: ভারী CSS সরিয়ে দেয়, FPS থ্রোটল করে, DOM আকার সীমিত করে, অফস্ক্রিন ভিডিও পজ করে, বিশ্লেষণ ব্লক করে এবং ল্যাগ সনাক্ত হলে স্বয়ংক্রিয়ভাবে আক্রমণাত্মক মোড সক্ষম করে।
// @description:pa X.com/Twitter ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ: ਭਾਰੀ CSS ਨੂੰ ਹਟਾਉਂਦਾ ਹੈ, FPS ਨੂੰ ਥ੍ਰੋਟਲ ਕਰਦਾ ਹੈ, DOM ਆਕਾਰ ਨੂੰ ਸੀਮਿਤ ਕਰਦਾ ਹੈ, ਆਫਸਕ੍ਰੀਨ ਵੀਡੀਓ ਨੂੰ ਰੋਕਦਾ ਹੈ, ਵਿਸ਼ਲੇਸ਼ਣ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ, ਅਤੇ ਪਛੜ ਜਾਣ 'ਤੇ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਹਮਲਾਵਰ ਮੋਡ ਨੂੰ ਸਮਰੱਥ ਬਣਾਉਂਦਾ ਹੈ।
// @description:jv Ningkatake kinerja X.com/Twitter: mbusak CSS abot, matesi FPS, matesi ukuran DOM, ngaso video ing njaba layar, mblokir analitik, lan ngaktifake mode agresif kanthi otomatis nalika ana lag.
// @description:te X.com/Twitter పనితీరును మెరుగుపరచండి: భారీ CSSను తొలగిస్తుంది, FPSని థ్రోటిల్ చేస్తుంది, DOM పరిమాణాన్ని పరిమితం చేస్తుంది, ఆఫ్-స్క్రీన్ వీడియోలను పాజ్ చేస్తుంది, విశ్లేషణలను బ్లాక్ చేస్తుంది మరియు లాగ్ కనుగొనబడినప్పుడు స్వయంచాలకంగా దూకుడు మోడ్ను ప్రారంభిస్తుంది.
// @description:mr X.com/Twitter कार्यप्रदर्शन सुधारा: जड CSS काढते, FPS थ्रॉटल करते, DOM आकार मर्यादित करते, ऑफस्क्रीन व्हिडिओ थांबवते, विश्लेषण ब्लॉक करते आणि लॅग आढळल्यास स्वयंचलितपणे आक्रमक मोड सक्षम करते.
// @description:ta X.com/Twitter செயல்திறனை மேம்படுத்தவும்: கனமான CSS ஐ நீக்குகிறது, FPS ஐக் கட்டுப்படுத்துகிறது, DOM அளவைக் கட்டுப்படுத்துகிறது, திரைக்கு வெளியே உள்ள வீடியோக்களை இடைநிறுத்துகிறது, பகுப்பாய்வுகளைத் தடுக்கிறது, மற்றும் தாமதம் கண்டறியப்படும்போது தானாகவே தீவிர பயன்முறையை இயக்குகிறது.
// @description:ur X.com/Twitter کی کارکردگی کو بہتر بنائیں: بھاری CSS کو ہٹاتا ہے، FPS کو تھروٹل کرتا ہے، DOM کے سائز کو محدود کرتا ہے، آف اسکرین ویڈیوز کو روکتا ہے، تجزیات کو بلاک کرتا ہے، اور وقفے کا پتہ چلنے پر خود بخود جارحانہ موڈ کو فعال کرتا ہے۔
// @description:fa بهبود عملکرد X.com/Twitter: حذف CSS سنگین، محدود کردن FPS، محدود کردن اندازه DOM، توقف ویدیوهای خارج از صفحه، مسدود کردن تجزیه و تحلیل و فعال کردن خودکار حالت تهاجمی هنگام تشخیص تاخیر.
// @description:he שפר את הביצועים של X.com/Twitter: מסיר CSS כבד, מווסת FPS, מגביל את גודל ה-DOM, משהה סרטונים מחוץ למסך, חוסם אנליטיקה ומפעיל אוטומטית מצב אגרסיבי כאשר מזוהה השהיה.
// @description:sw Boresha utendaji wa X.com/Twitter: huondoa CSS nzito, hupunguza FPS, hupunguza ukubwa wa DOM, husitisha video zilizo nje ya skrini, huzuia uchanganuzi, na huwasha kiotomatiki hali ya fujo wakati ucheleweshaji unapogunduliwa.
// @description:af Verbeter X.com/Twitter se werkverrigting: verwyder swaar CSS, smoor FPS, beperk DOM-grootte, onderbreek video's buite die skerm, blokkeer analise, en aktiveer outomaties aggressiewe modus wanneer vertraging bespeur word.
// @author Oppai1442
// @namespace https://greasyfork.org/users/oppai1442
// @license MIT
// @homepageURL https://greasyfork.org/scripts/553367-x-com-heavy-js-optimizer
// @version 1.3.5
// @icon https://x.com/favicon.ico
// @match https://x.com/*
// @match https://twitter.com/*
// @grant GM_registerMenuCommand
// @run-at document-start
// ==/UserScript==
(() => {
'use strict';
// Kill React DevTools hook & metrics early
delete window.__REACT_DEVTOOLS_GLOBAL_HOOK__;
Object.defineProperty(window, '__REACT_DEVTOOLS_GLOBAL_HOOK__', {
value: {},
writable: false,
configurable: false
});
// ========= Config =========
const LS_KEY_MODE = '__x_opt_aggressive__';
const LS_KEY_LIMIT = '__x_opt_limit__';
const LS_KEY_BLOCK = '__x_opt_block_metrics__';
let AGGRESSIVE = localStorage.getItem(LS_KEY_MODE) === '1';
let LIMIT_FEED = Number(localStorage.getItem(LS_KEY_LIMIT) ?? 60); // số tweet tối đa giữ lại trong DOM
let BLOCK_METRICS = localStorage.getItem(LS_KEY_BLOCK) === '1';
const TARGET_FPS = 45; // Aggressive rAF cap
const LONGTASK_AUTO_ON_MS = 1500; // tổng longtask trong ~5s để tự bật aggressive
const LONGTASK_ULTRA_ON_MS = 3000; // ngưỡng bật "siêu gắt" trong runtime
const MAX_VIDEOS_DECODE = 1; // chỉ 1 video hoạt động
// ========= Menu =========
if (typeof GM_registerMenuCommand === 'function') {
GM_registerMenuCommand(`Aggressive: ${AGGRESSIVE ? 'ON' : 'OFF'}`, () => {
AGGRESSIVE = !AGGRESSIVE;
localStorage.setItem(LS_KEY_MODE, AGGRESSIVE ? '1' : '0');
location.reload();
});
GM_registerMenuCommand(`Giới hạn tweet DOM (hiện: ${LIMIT_FEED})`, () => {
const v = prompt('Giới hạn số tweet giữ lại trong DOM (0 = không giới hạn):', String(LIMIT_FEED));
if (v == null) return;
const n = Math.max(0, parseInt(v, 10) || 0);
LIMIT_FEED = n;
localStorage.setItem(LS_KEY_LIMIT, String(n));
alert('OK! Reload để áp dụng.');
});
GM_registerMenuCommand(`Block metrics rác: ${BLOCK_METRICS ? 'ON' : 'OFF'}`, () => {
BLOCK_METRICS = !BLOCK_METRICS;
localStorage.setItem(LS_KEY_BLOCK, BLOCK_METRICS ? '1' : '0');
alert('OK! Reload để áp dụng.');
});
}
// ========= Utils =========
const onReady = (fn) => (document.readyState === 'loading')
? document.addEventListener('DOMContentLoaded', fn, { once: true })
: fn();
const injectCSS = (css) => {
const el = document.createElement('style');
el.textContent = css;
document.documentElement.appendChild(el);
return el;
};
// ========= CSS: dọn compositor nặng + skip paint offscreen =========
// - content-visibility: auto → bỏ render offscreen, cực kỳ lợi cho feed dài
// - contain-intrinsic-size: tránh layout nhảy; 800px là giá trị "đệm" hợp lý cho tweet có media
injectCSS(`
* { backdrop-filter: none !important; }
[style*="backdrop-filter"], [style*="filter: blur"], *[style*="blur("] { filter: none !important; }
html, body, * { scroll-behavior: auto !important; }
video { transform: none !important; will-change: auto !important; background-color: black !important; }
article[role="article"], [data-testid="cellInnerDiv"] {
content-visibility: auto !important;
contain: layout paint style !important;
contain-intrinsic-size: 800px !important;
}
/* bớt gradient layer nặng */
[style*="linear-gradient("] { background-image: none !important; }
* { will-change: auto !important; transform: none !important; }
`);
if (AGGRESSIVE) {
injectCSS(`
* { animation: none !important; transition: none !important; }
`);
}
// ========= Ép passive listeners cho scroll/touch/wheel =========
(function patchAddEventListener() {
const origAdd = EventTarget.prototype.addEventListener;
const passiveEvents = new Set(['touchstart', 'touchmove', 'wheel', 'mousewheel', 'scroll']);
EventTarget.prototype.addEventListener = function (type, listener, options) {
if (passiveEvents.has(type)) {
if (options == null) options = { passive: true };
else if (typeof options === 'boolean') options = { capture: options, passive: true };
else if (typeof options === 'object' && options.passive == null) options = { ...options, passive: true };
}
return origAdd.call(this, type, listener, options);
};
})();
// ========= Chặn preload/prefetch link =========
const nukePreloads = () => {
document.querySelectorAll('link[rel="preload"], link[rel="prefetch"]').forEach(l => l.remove());
};
new MutationObserver(nukePreloads).observe(document.documentElement, { childList: true, subtree: true });
onReady(nukePreloads);
// ========= (Tuỳ chọn) Block metrics rác (an toàn, không đụng feed chính) =========
// Chặn những endpoint "client_event", "impression", "engagement", "scribe", "metrics" để bớt spam
if (BLOCK_METRICS) {
const noisy = /\/(client_event|impression|engagement|scribe|metrics|ad_event)/i;
const origFetch = window.fetch.bind(window);
window.fetch = (input, init) => {
try {
const url = (typeof input === 'string') ? input : (input?.url ?? '');
if (noisy.test(url)) {
// trả response rỗng 204
return Promise.resolve(new Response(null, { status: 204 }));
}
} catch { }
return origFetch(input, init);
};
}
// ========= Video: tối ưu + pause offscreen + chỉ 1 video hoạt động =========
const activeVideos = new Set();
let playingNow = null;
const optimizeVideo = (v) => {
if (!v || v.__xOptimized) return;
v.__xOptimized = true;
v.autoplay = false;
v.loop = false;
v.removeAttribute('controls');
v.preload = 'metadata';
v.style.transform = 'none';
v.style.willChange = 'auto';
v.style.backgroundColor = 'black';
// chỉ 1 video hoạt động → pause cái khác khi play cái này
v.addEventListener('play', () => {
if (playingNow && playingNow !== v) {
try { playingNow.pause(); } catch { }
}
playingNow = v;
activeVideos.add(v);
}, { passive: true });
v.addEventListener('pause', () => {
activeVideos.delete(v);
if (playingNow === v) playingNow = null;
}, { passive: true });
};
const scanVideos = (root = document) => {
if (!root || typeof root.querySelectorAll !== 'function') return;
root.querySelectorAll('video').forEach(optimizeVideo);
};
onReady(scanVideos);
new MutationObserver((muts) => {
for (const m of muts) {
if (m.addedNodes) {
m.addedNodes.forEach(node => {
if (node && node.nodeType === 1) {
if (node.tagName === 'VIDEO') optimizeVideo(node);
else if (node.querySelectorAll) scanVideos(node);
}
});
}
}
}).observe(document.documentElement, { childList: true, subtree: true });
// Pause video khi offscreen (tiết kiệm decode)
const io = new IntersectionObserver((entries) => {
for (const e of entries) {
const v = e.target;
if (!(v instanceof HTMLVideoElement)) continue;
if (e.isIntersecting) {
// nếu không có video nào đang chạy, cho phép play khi user bấm
} else {
try { v.pause(); } catch { }
}
}
}, { root: null, threshold: 0.001 });
onReady(() => document.querySelectorAll('video').forEach(v => io.observe(v)));
// ========= Giới hạn DOM feed: giữ tối đa N tweet để giảm memory/layout =========
function gcFeed() {
if (!LIMIT_FEED) return;
const nodes = document.querySelectorAll('article[role="article"]');
if (nodes.length <= LIMIT_FEED) return;
// ẩn bớt mấy cái quá cũ (nhanh, ít rủi ro hơn remove)
for (let i = 0; i < nodes.length - LIMIT_FEED; i++) {
const el = nodes[i];
if (!el.__xHidden) {
el.style.display = 'none';
el.__xHidden = true;
// giải phóng video nếu có
el.querySelectorAll('video').forEach(v => {
try { v.pause(); } catch { }
});
}
}
}
setInterval(gcFeed, 1500);
// ========= Aggressive mode runtime (rAF cap + min setInterval) =========
const origRAF = window.requestAnimationFrame.bind(window);
const origSetInterval = window.setInterval.bind(window);
let lastRAF = 0;
let useRAFCap = AGGRESSIVE;
let minInterval = AGGRESSIVE ? 100 : 0;
window.requestAnimationFrame = (cb) => {
if (!useRAFCap) return origRAF(cb);
return origRAF((ts) => {
if (ts - lastRAF >= (1000 / TARGET_FPS)) {
lastRAF = ts;
try { cb(ts); } catch { }
} else {
origRAF(cb);
}
});
};
window.setInterval = (fn, delay, ...args) => {
const d = (delay == null || delay < minInterval) ? (minInterval || delay || 0) : delay;
return origSetInterval(fn, d, ...args);
};
// ========= Auto-detect long tasks → tự bật Aggressive/Ultra =========
try {
// dùng PerformanceObserver (Long Task API)
let bucket = 0;
const po = new PerformanceObserver((list) => {
for (const e of list.getEntries()) {
bucket += e.duration || 0;
}
});
po.observe({ type: 'longtask', buffered: true });
setInterval(() => {
const total = bucket; bucket = 0;
// tự bật aggressive nếu lag nhiều
if (!useRAFCap && total > LONGTASK_AUTO_ON_MS) {
useRAFCap = true; minInterval = 100;
console.warn('[Oppai1442] Aggressive ON (auto): longtasks=%dms', total | 0);
}
// siêu gắt nếu quá nặng
if (total > LONGTASK_ULTRA_ON_MS) {
useRAFCap = true; minInterval = 150; // nâng min interval lên thêm
document.documentElement.classList.add('x-ultra');
injectCSS(`.x-ultra *{ animation:none!important; transition:none!important; }`);
console.warn('[Oppai1442] Ultra mode ON: longtasks=%dms', total | 0);
}
}, 5000);
} catch { }
// ========= Safety: pause hết khi tab ẩn =========
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
document.querySelectorAll('video').forEach(v => { try { v.pause(); } catch { } });
}
}, { passive: true });
// ========= Ảnh: ép lazy/async decode (nhẹ layout) =========
const tuneImg = (img) => {
if (!img) return;
img.loading = 'lazy';
img.decoding = 'async';
};
const scanImg = (root = document) => {
if (!root || typeof root.querySelectorAll !== 'function') return;
root.querySelectorAll('img').forEach(tuneImg);
};
onReady(scanImg);
new MutationObserver((muts) => {
for (const m of muts) for (const n of m.addedNodes) {
if (n && n.nodeType === 1) {
if (n.tagName === 'IMG') tuneImg(n);
else if (n.querySelectorAll) scanImg(n);
}
}
}).observe(document.documentElement, { childList: true, subtree: true });
// Brutal block all beacons & performance observers
navigator.sendBeacon = () => true;
const origPO = window.PerformanceObserver;
window.PerformanceObserver = class extends origPO {
constructor(arg, ...rest) {
if (typeof arg === 'object' && /(paint|longtask|resource)/i.test(arg.type||'')) {
return { observe(){}, disconnect(){}, takeRecords(){ return []; } };
}
return new origPO(arg, ...rest);
}
};
setInterval(() => {
const articles = document.querySelectorAll('article[role="article"]');
if (articles.length > 80) {
for (let i = 0; i < articles.length - 60; i++) {
articles[i].remove();
}
}
}, 2000);
(function softThrottleMO(){
const OrigMO = window.MutationObserver;
window.MutationObserver = class extends OrigMO {
constructor(cb, opt) {
let buf = [];
let scheduled = false;
const wrap = (muts, obs) => {
buf.push(...muts);
if (!scheduled) {
scheduled = true;
requestAnimationFrame(() => {
scheduled = false;
const batch = buf.splice(0);
try { cb(batch, obs); } catch {}
});
}
};
return new OrigMO(wrap);
}
};
})();
})();