Advanced YouTube Age Restriction Bypass Pro

Watch age-restricted YouTube videos without login or age verification 😎 with enhanced features!

La data de 18-12-2024. Vezi ultima versiune.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Advanced YouTube Age Restriction Bypass Pro
// @description  Watch age-restricted YouTube videos without login or age verification 😎 with enhanced features!
// @version      4.1.0
// @author       Zerody (Enhanced by Cody)
// @namespace    https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass/
// @supportURL   https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass/issues
// @license      MIT
// @match        https://www.youtube.com/*
// @match        https://www.youtube-nocookie.com/*
// @match        https://m.youtube.com/*
// @match        https://music.youtube.com/*
// @grant        none
// @run-at       document-start
// @compatible   chrome
// @compatible   firefox
// @compatible   opera
// @compatible   edge
// @compatible   safari
// ==/UserScript==

(function () {
    'use strict';

    // Configuration constants
    const CONFIG = {
        ENABLE_UNLOCK_NOTIFICATION: true,
        ENABLE_AUTO_AD_SKIPPER: true,
        DEFAULT_VIDEO_QUALITY: '1080p', // Options: '144p', '240p', '360p', '480p', '720p', '1080p', '4K'
        ENABLE_ERROR_REPORTING: true,
        COUNTRY_SPECIFIC_PROXIES: {
            US: 'https://us-proxy.server.com',
            EU: 'https://eu-proxy.server.com',
        },
        RATE_LIMIT_REQUESTS: 10,
        LOG_LEVEL: 'INFO', // Levels: INFO, WARN, ERROR
    };

    const UNLOCKABLE_PLAYABILITY_STATUSES = ['AGE_VERIFICATION_REQUIRED', 'CONTENT_WARNING'];
    let rateLimitCount = 0;

    const logger = {
        info: (msg) => logMessage('INFO', msg),
        warn: (msg) => logMessage('WARN', msg),
        error: (msg) => logMessage('ERROR', msg),
    };

    function logMessage(level, msg) {
        if (['INFO', 'WARN', 'ERROR'].indexOf(level) >= ['INFO', 'WARN', 'ERROR'].indexOf(CONFIG.LOG_LEVEL)) {
            console.log(`%cYouTube Bypass Pro [${level}]`, `color: ${getLogColor(level)};`, msg);
        }
    }

    function getLogColor(level) {
        return {
            INFO: 'blue',
            WARN: 'orange',
            ERROR: 'red',
        }[level] || 'black';
    }

    // Dynamic notification system
    function showNotification(message) {
        if (!CONFIG.ENABLE_UNLOCK_NOTIFICATION) return;
        const notification = document.createElement('div');
        notification.textContent = message;
        Object.assign(notification.style, {
            position: 'fixed',
            bottom: '10px',
            right: '10px',
            backgroundColor: '#007BFF',
            color: '#FFF',
            padding: '10px',
            borderRadius: '5px',
            zIndex: 9999,
            fontSize: '14px',
        });
        document.body.appendChild(notification);
        setTimeout(() => notification.remove(), 5000);
    }

    // Country-specific proxy selection
    function getProxyForCountry(countryCode) {
        return CONFIG.COUNTRY_SPECIFIC_PROXIES[countryCode] || Object.values(CONFIG.COUNTRY_SPECIFIC_PROXIES)[0];
    }

    // Auto-skip ads
    function enableAdSkipper() {
        if (!CONFIG.ENABLE_AUTO_AD_SKIPPER) return;

        const observer = new MutationObserver((mutations) => {
            mutations.forEach(() => {
                const skipButton = document.querySelector('.ytp-ad-skip-button');
                if (skipButton) {
                    skipButton.click();
                    logger.info('Skipped an ad.');
                    observer.disconnect(); // Temporarily stop observing
                    setTimeout(() => observer.observe(document.body, { childList: true, subtree: true }), 1000); // Reconnect
                }
            });
        });

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

    // Video quality enforcement
    function setDefaultVideoQuality() {
        const observer = new MutationObserver(() => {
            const settingsButton = document.querySelector('.ytp-settings-button');
            if (settingsButton) {
                settingsButton.click();

                const interval = setInterval(() => {
                    const qualityMenu = [...document.querySelectorAll('.ytp-menuitem')].find(
                        (item) => item.textContent.includes(CONFIG.DEFAULT_VIDEO_QUALITY)
                    );
                    if (qualityMenu) {
                        qualityMenu.click();
                        logger.info(`Set video quality to ${CONFIG.DEFAULT_VIDEO_QUALITY}`);
                        clearInterval(interval);
                    }
                }, 200);

                observer.disconnect();
            }
        });

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

    // Error reporting
    function reportError(error) {
        if (!CONFIG.ENABLE_ERROR_REPORTING) return;
        fetch('https://error-reporting.server.com/report', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ error: error.message, timestamp: new Date().toISOString() }),
        });
        logger.error('Error reported to server.');
    }

    // Unlock video response
    async function unlockResponse(response) {
        try {
            if (response.playabilityStatus && UNLOCKABLE_PLAYABILITY_STATUSES.includes(response.playabilityStatus.status)) {
                showNotification('Attempting to unlock video...');
                const proxy = getProxyForCountry('US');

                const unlockedResponse = await fetch(`${proxy}/unlock`, {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ videoId: response.videoDetails.videoId }),
                }).then((res) => res.json());

                if (unlockedResponse.errorMessage) {
                    throw new Error(unlockedResponse.errorMessage);
                }

                Object.assign(response, unlockedResponse);
                logger.info('Video unlocked successfully.');
                showNotification('Video unlocked successfully!');
            }
        } catch (error) {
            logger.warn(`Proxy failed: ${error.message}. Retrying with fallback...`);
            const fallbackProxy = getProxyForCountry('EU');
            if (fallbackProxy && fallbackProxy !== proxy) {
                unlockResponse({ ...response, proxy: fallbackProxy });
            } else {
                reportError(error);
                logger.error(`Failed to unlock video: ${error.message}`);
                showNotification('Failed to unlock video.');
            }
        }
    }

    // Hook into XMLHttpRequest.open
    const nativeXHROpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function (method, url, ...args) {
        if (url.includes('/youtubei/v1/player')) {
            this.addEventListener('readystatechange', function () {
                if (this.readyState === 4 && this.status === 200) {
                    try {
                        const response = JSON.parse(this.responseText);
                        unlockResponse(response);
                        this.responseText = JSON.stringify(response);
                    } catch (err) {
                        logger.error('Error processing video response: ' + err.message);
                    }
                }
            });
        }
        nativeXHROpen.call(this, method, url, ...args);
    };

    // Initialize script features
    function init() {
        logger.info('Initializing Advanced YouTube Bypass Pro...');
        enableAdSkipper();
        setDefaultVideoQuality();
        logger.info('Features initialized successfully!');
    }

    init();
})();