[🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube

[🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube blocks all YouTube ads, letting you watch videos uninterrupted, faster, and privately for a smooth, ad-free viewing experience, boost your FPS while streaming videos.

// ==UserScript==
// @name:zh-CN      [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube - YouTube 广告拦截器
// @name:es        [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube - Bloqueador de Anuncios de YouTube
// @name:hi        [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube - YouTube विज्ञापन ब्लॉकर
// @name           [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube
// @name:vi        [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube - Công cụ bỏ qua quảng cáo
// @namespace      https://twisk.com
// @version        1.1.4
// @description:zh-CN   [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube屏蔽所有YouTube广告,让您无需干扰、快速且私密地观看视频。
// @description:es       [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube bloquea todos los anuncios de YouTube, permitiéndote ver videos sin interrupciones y de forma privada.
// @description:hi       [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube सभी YouTube विज्ञापनों को ब्लॉक करता है, जिससे आप बिना रुकावट, तेज़ और निजी तरीके से वीडियो देख सकते हैं।
// @description         [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube blocks all YouTube ads, letting you watch videos uninterrupted, faster, and privately for a smooth, ad-free viewing experience, boost your FPS while streaming videos.
// @description:vi      [🔍Bypass Age & Anti-Detected🔒] AdGuard For YouTube chặn tất cả YouTube quảng cáo, tạo trải nghiệm xem video nhanh hơn, bảo mật hơn, không quảng cáo.
// @author             airpl4ne
// @author w_irylis
// @icon               https://i.ibb.co/k6kVh2wf/Untitled-design.png
// @match              https://www.youtube.com/*
// @match              https://m.youtube.com/*
// @grant              none
// @license            MIT
// @noframes
// ==/UserScript==

// 💲Free Adblocker API at our Discord : https://discord.gg/Gvmd7deFtS
// 💦Free-To-Use , No Money Cost !
(function () {
    'use strict';

    let lastSkipTime = 0;
    const SKIP_DELAY = 500;

    function skipAds() {
        const player = document.querySelector('#movie_player, .html5-video-player');
        if (!player) return;

        const adIsPlaying =
            player.classList.contains('ad-showing') ||
            player.classList.contains('ad-interrupting') ||
            document.querySelector('.video-ads, .ytp-ad-module, .ytp-ad-text, .ytp-ad-preview');

        if (!adIsPlaying) return;

        const now = Date.now();
        if (now - lastSkipTime < SKIP_DELAY) return;

        const video = player.querySelector('video');
        if (video && video.duration) {
            const looksLikeAd =
                video.duration < 60 ||
                document.querySelector('.ytp-ad-text, .ytp-ad-skip-button-container, .ytp-ad-preview');

            if (looksLikeAd && !video.ended) {
                video.currentTime = video.duration;
                video.muted = true;
                lastSkipTime = now;
            } else {
                return;
            }
        }

        const skipButtons = [
            '.ytp-ad-skip-button',
            '.ytp-ad-skip-button-modern',
            '.ytp-skip-ad-button',
            'button.ytp-ad-skip-button',
            '.ytp-ad-overlay-close-button',
        ];

        skipButtons.forEach(selector => {
            const found = document.querySelectorAll(selector);
            found.forEach(btn => {
                if (btn.offsetParent !== null) {
                    btn.click();
                }
            });
        });

        if (player.classList.contains('ad-showing') || player.classList.contains('ad-interrupting')) {
            player.classList.remove('ad-showing', 'ad-interrupting');
        }

        if (video && video.paused) {
            video.play().catch(() => console.log('Error resuming video after ad.'));
        }
    }

    function removeAdElements() {
        const adSelectors = [
            'ytd-in-feed-ad-layout-renderer',
            'ytd-ad-slot-renderer',
            '#player-ads',
            '#masthead-ad',
            '.ytp-featured-product',
            'ytd-companion-slot-renderer',
            'ytd-player-legacy-desktop-watch-ads-renderer',
        ];

        adSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(el => {
                if (el && el.parentNode) {
                    el.parentNode.removeChild(el);
                }
            });
        });

        const relatedItems = document.querySelectorAll('#related ytd-rich-item-renderer');
        relatedItems.forEach(item => {
            if (
                item.querySelector('ytd-ad-slot-renderer, [class*="ad"], [class*="sponsored"]') &&
                item.parentNode
            ) {
                item.parentNode.removeChild(item);
            }
        });
    }

    function bypassAgeGate() {
        const url = window.location.href;
        const ageMessage = document.querySelector(
            '.ytp-error-content, .ytp-error, [aria-label*="age-restricted"]'
        );

        if (ageMessage && url.includes('watch?v=')) {
            const videoId = url.match(/v=([^&]+)/)?.[1];
            if (videoId) {
                const newUrl = `https://www.youtube-nocookie.com/embed/${videoId}`;
                window.location.href = newUrl;
            } else {
                console.log('Could not find video ID in URL.');
            }
        } else if (url.includes('/v/')) {
            const player = document.querySelector('#movie_player, .html5-video-player');
            const video = player?.querySelector('video');
            if (video && video.paused) {
                video.play().catch(() => console.log('Error trying to play age-restricted video.'));
            }
        }
    }

    function handleAll() {
        try {
            skipAds();
            removeAdElements();
            bypassAgeGate();
        } catch (err) {
            console.log('Error while handling ads or restrictions:', err);
        }
    }

    function setupObserver() {
        const observer = new MutationObserver(mutations => {
            if (mutations.length > 50) return;
            handleAll();
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true,
        });

        console.log('Mutation observer is running to detect ads.');
    }

    window.addEventListener('load', () => {
        console.log('Page loaded, ad handler started.');
        handleAll();
        setupObserver();
    });

    handleAll();

    setInterval(handleAll, 1000);
})();