Ultra Data Saver - Maximum Compression

Blocks ads, trackers, autoplay, compresses images, removes bloat. Saves 60-80% data.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==  
// @name         Ultra Data Saver - Maximum Compression  
// @namespace    http://tampermonkey.net/  
// @version      4.0  
// @description  Blocks ads, trackers, autoplay, compresses images, removes bloat. Saves 60-80% data.  
// @author       You  
// @match        *://*/*  
// @grant        none  
// @run-at       document-start  
// ==/UserScript==   
  
(function() {  
    'use strict';  
  
    // ==========================================  
    // CONFIGURATION - Toggle features on/off  
    // ==========================================  
    const CONFIG = {  
        blockAds: true,              // Block ad containers  
        blockTrackers: true,         // Block tracking scripts  
        blockAutoplay: true,         // Stop autoplay videos  
        compressImages: true,        // Force low-res images  
        removeWebFonts: true,        // Disable custom fonts  
        removeAnimations: true,      // Stop CSS animations  
        lazyLoadAll: true,           // Force lazy loading  
        blockSocialWidgets: true,    // Remove social buttons  
        blockComments: false,        // Remove comment sections (optional)  
        aggressiveMode: true         // Extra data saving measures  
    };  
  
    // ==========================================  
    // TRACKING & AD DOMAIN BLOCKLIST  
    // ==========================================  
    const BLOCKED_DOMAINS = [  
        'google-analytics', 'googletagmanager', 'googlesyndication',  
        'googleadservices', 'doubleclick', 'facebook.com/tr',  
        'facebook.net', 'connect.facebook', 'platform.twitter',  
        'analytics.twitter', 'linkedin.com/analytics',  
        'adsystem', 'amazon-adsystem', 'googletagservices',  
        'outbrain', 'taboola', 'scorecardresearch',  
        'quantserve', 'googletagmanager', 'hotjar',  
        'mixpanel', 'segment.io', 'amplitude',  
        'adsafeprotected', 'moatads', 'adsrvr',  
        'adnxs', 'rubiconproject', 'openx',  
        'pubmatic', 'casalemedia', 'advertising'  
    ];  
  
    const BLOCKED_SCRIPTS = [  
        'analytics', 'tracking', 'telemetry', 'metrics',  
        'advertisement', 'sponsored', 'promotion'  
    ];  
  
    // ==========================================  
    // UTILITY FUNCTIONS  
    // ==========================================  
  
    // Check if URL matches blocked patterns  
    const isBlocked = (url) => {  
        if (!url) return false;  
        const lowerUrl = url.toLowerCase();  
        return BLOCKED_DOMAINS.some(domain => lowerUrl.includes(domain)) ||  
               BLOCKED_SCRIPTS.some(script => lowerUrl.includes(script));  
    };  
  
    // Log blocking activity (remove in production)  
    const log = (msg) => {  
        // console.log('[DataSaver]', msg);  
    };  
  
    // ==========================================  
    // 1. BLOCK NETWORK REQUESTS (Fetch/XHR)  
    // ==========================================  
    if (CONFIG.blockTrackers) {  
        const originalFetch = window.fetch;  
        window.fetch = function(...args) {  
            const url = args[0] instanceof Request ? args[0].url : args[0];  
            if (isBlocked(url)) {  
                log(`Blocked fetch: ${url}`);  
                return Promise.resolve(new Response('', { status: 200 }));  
            }  
            return originalFetch.apply(this, args);  
        };  
  
        const originalXHR = window.XMLHttpRequest;  
        window.XMLHttpRequest = function() {  
            const xhr = new originalXHR();  
            const originalOpen = xhr.open;  
            xhr.open = function(method, url, ...rest) {  
                if (isBlocked(url)) {  
                    log(`Blocked XHR: ${url}`);  
                    // Override send to do nothing  
                    xhr.send = () => {};  
                }  
                return originalOpen.call(this, method, url, ...rest);  
            };  
            return xhr;  
        };  
    }  
  
    // ==========================================  
    // 2. BLOCK SCRIPT LOADING  
    // ==========================================  
    if (CONFIG.blockTrackers || CONFIG.blockAds) {  
        const originalAppendChild = Element.prototype.appendChild;  
        Element.prototype.appendChild = function(node) {  
            if (node.tagName === 'SCRIPT' && node.src && isBlocked(node.src)) {  
                log(`Blocked script: ${node.src}`);  
                return node; // Return without appending  
            }  
            return originalAppendChild.call(this, node);  
        };  
  
        const originalInsertBefore = Element.prototype.insertBefore;  
        Element.prototype.insertBefore = function(newNode, referenceNode) {  
            if (newNode.tagName === 'SCRIPT' && newNode.src && isBlocked(newNode.src)) {  
                log(`Blocked script: ${newNode.src}`);  
                return newNode;  
            }  
            return originalInsertBefore.call(this, newNode, referenceNode);  
        };  
    }  
  
    // ==========================================  
    // 3. IMAGE COMPRESSION & OPTIMIZATION  
    // ==========================================  
    if (CONFIG.compressImages) {  
        // Force low quality images  
        const compressImage = (img) => {  
            // Skip tiny icons  
            if (img.width < 50 && img.height < 50) return;  
  
            // Add compression parameters for major CDNs  
            const src = img.src;  
            if (src.includes('googleusercontent') || src.includes('ggpht')) {  
                img.src = src.replace(/=s\d+/, '=s480').replace(/=w\d+/, '=w480');  
            } else if (src.includes('cloudinary')) {  
                img.src = src.replace('/upload/', '/upload/q_auto:low,w_480/');  
            } else if (src.includes('imgur')) {  
                img.src = src.replace(/\.jpg$/, 'l.jpg').replace(/\.png$/, 'l.png');  
            }  
  
            // Lazy load all images  
            img.loading = 'lazy';  
            img.decoding = 'async';  
  
            // Reduce quality for data savings  
            if (CONFIG.aggressiveMode && !src.includes('data:image')) {  
                img.style.imageRendering = 'pixelated';  
            }  
        };  
  
        // Process existing images  
        document.querySelectorAll('img').forEach(compressImage);  
  
        // Watch for new images  
        const imgObserver = new MutationObserver((mutations) => {  
            mutations.forEach((mutation) => {  
                mutation.addedNodes.forEach((node) => {  
                    if (node.tagName === 'IMG') compressImage(node);  
                    if (node.querySelectorAll) {  
                        node.querySelectorAll('img').forEach(compressImage);  
                    }  
                });  
            });  
        });  
    }  
  
    // ==========================================  
    // 4. VIDEO & AUDIO AUTOPAY BLOCKING  
    // ==========================================  
    if (CONFIG.blockAutoplay) {  
        // Override video autoplay  
        const originalPlay = HTMLMediaElement.prototype.play;  
        HTMLMediaElement.prototype.play = function() {  
            // Only block if not user-initiated (heuristic)  
            if (!this.hasAttribute('data-user-initiated')) {  
                log('Blocked autoplay');  
                this.pause();  
                this.currentTime = 0;  
                this.muted = true;  
                this.preload = 'none';  
                return Promise.resolve();  
            }  
            return originalPlay.call(this);  
        };  
  
        // Force preload=none on all media  
        document.querySelectorAll('video, audio').forEach(media => {  
            media.preload = 'none';  
            media.autoplay = false;  
            media.muted = true;  
        });  
  
        // Block new media elements  
        const mediaObserver = new MutationObserver((mutations) => {  
            mutations.forEach((mutation) => {  
                mutation.addedNodes.forEach((node) => {  
                    if (node.tagName === 'VIDEO' || node.tagName === 'AUDIO') {  
                        node.preload = 'none';  
                        node.autoplay = false;  
                        node.muted = true;  
                    }  
                });  
            });  
        });  
    }  
  
    // ==========================================  
    // 5. REMOVE ADS & BLOAT ELEMENTS  
    // ==========================================  
    if (CONFIG.blockAds || CONFIG.aggressiveMode) {  
        const BLOAT_SELECTORS = [  
            // Ads  
            '[class*="ad-"]', '[class*="ads-"]', '[id*="ad-"]',  
            '[class*="advertisement"]', '[id*="advertisement"]',  
            'ins.adsbygoogle', '.ad-container', '.ad-wrapper',  
            // Trackers  
            '[class*="analytics"]', '[id*="analytics"]',  
            '[class*="tracking"]', '[id*="tracking"]',  
            // Social widgets  
            '.fb-like', '.fb-share', '.twitter-share',  
            '.linkedin-share', '.social-share', '.share-buttons',  
            // Popups & overlays  
            '.modal', '.popup', '.overlay', '[class*="newsletter"]',  
            '.cookie-banner', '.gdpr-banner', '.consent-banner',  
            // Comments (optional)  
            CONFIG.blockComments ? '.comments, #comments, .disqus' : '',  
            // Other bloat  
            '.related-articles', '.recommended', '.trending',  
            '.sidebar', '.widget-area', '.newsletter-signup'  
        ].filter(Boolean);  
  
        const removeBloat = () => {  
            BLOAT_SELECTORS.forEach(selector => {  
                document.querySelectorAll(selector).forEach(el => {  
                    // Don't remove if it's the main content  
                    if (el.tagName === 'ARTICLE' || el.tagName === 'MAIN') return;  
                    el.style.display = 'none';  
                    el.remove();  
                    log(`Removed: ${selector}`);  
                });  
            });  
        };  
  
        // Run immediately and periodically  
        removeBloat();  
        setInterval(removeBloat, 2000);  
    }  
  
    // ==========================================  
    // 6. DISABLE WEB FONTS  
    // ==========================================  
    if (CONFIG.removeWebFonts) {  
        // Block font loading  
        const originalFontFace = window.FontFace;  
        if (originalFontFace) {  
            window.FontFace = function(family, source, descriptors) {  
                log(`Blocked font: ${family}`);  
                return {  
                    load: () => Promise.resolve(),  
                    family: 'system-ui'  
                };  
            };  
        }  
  
        // Remove font stylesheets  
        document.querySelectorAll('link[rel="stylesheet"]').forEach(link => {  
            if (link.href && (link.href.includes('font') || link.href.includes('googleapis'))) {  
                link.remove();  
                log(`Removed font stylesheet: ${link.href}`);  
            }  
        });  
  
        // Inject system font override  
        const style = document.createElement('style');  
        style.textContent = `  
            * { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; }  
            @font-face { font-display: swap !important; }  
        `;  
        document.head.appendChild(style);  
    }  
  
    // ==========================================  
    // 7. DISABLE ANIMATIONS  
    // ==========================================  
    if (CONFIG.removeAnimations) {  
        const style = document.createElement('style');  
        style.textContent = `  
            *, *::before, *::after {  
                animation-duration: 0.01ms !important;  
                animation-iteration-count: 1 !important;  
                transition-duration: 0.01ms !important;  
                scroll-behavior: auto !important;  
            }  
        `;  
        document.head.appendChild(style);  
    }  
  
    // ==========================================  
    // 8. FORCE LAZY LOADING  
    // ==========================================  
    if (CONFIG.lazyLoadAll) {  
        // Lazy load iframes  
        document.querySelectorAll('iframe').forEach(iframe => {  
            iframe.loading = 'lazy';  
        });  
  
        // Lazy load background images  
        const lazyStyle = document.createElement('style');  
        lazyStyle.textContent = `  
            [style*="background-image"] { content-visibility: auto; }  
        `;  
        document.head.appendChild(lazyStyle);  
    }  
  
    // ==========================================  
    // 9. SERVICE WORKER INTERCEPTION  
    // ==========================================  
    if ('serviceWorker' in navigator && CONFIG.aggressiveMode) {  
        // Unregister service workers that might cache aggressively  
        navigator.serviceWorker.getRegistrations().then(registrations => {  
            registrations.forEach(registration => {  
                // Keep legitimate SWs, unregister ad/tracking ones  
                if (registration.scope.includes('cdn') ||  
                    registration.scope.includes('ads')) {  
                    registration.unregister();  
                    log('Unregistered SW:', registration.scope);  
                }  
            });  
        });  
    }  
  
    // ==========================================  
    // 10. DATA USAGE MONITORING  
    // ==========================================  
    if (CONFIG.aggressiveMode) {  
        // Estimate data saved  
        let originalSize = 0;  
        let blockedSize = 0;  
  
        const updateStats = () => {  
            const images = document.querySelectorAll('img');  
            let currentSize = 0;  
            images.forEach(img => {  
                if (img.naturalWidth) {  
                    currentSize += (img.naturalWidth * img.naturalHeight * 3) / 1024; // KB  
                }  
            });  
        };  
  
        // Display stats (optional - remove if not needed)  
        window.addEventListener('load', () => {  
            setTimeout(() => {  
                const stats = document.createElement('div');  
                stats.style.cssText = `  
                    position: fixed;  
                    bottom: 10px;  
                    right: 10px;  
                    background: rgba(0,0,0,0.7);  
                    color: #0f0;  
                    padding: 10px;  
                    border-radius: 5px;  
                    font-size: 12px;  
                    z-index: 999999;  
                    font-family: monospace;  
                `;  
                stats.innerHTML = '💾 Data Saver: ACTIVE';  
                document.body.appendChild(stats);  
                setTimeout(() => stats.remove(), 5000);  
            }, 1000);  
        });  
    }  
  
    log('Ultra Data Saver initialized');  
  
})();