Extra Youtube Features

Youtube Auto-Skip ads | Download Button | Sponsor Skip | Redirect to YouTubePi | Anti-Adblock Removal

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!)

Advertisement:

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!)

Advertisement:

// ==UserScript==
// @name         Extra Youtube Features
// @namespace    Violentmonkey Scripts
// @version      1.3
// @license      MIT
// @author       Orbitt
// @description  Youtube Auto-Skip ads | Download Button | Sponsor Skip | Redirect to YouTubePi | Anti-Adblock Removal
// @match        *://www.youtube.com/*
// @match        *://m.youtube.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    function skipAds() {
        const skipButtons = [
            '.ytp-ad-skip-button',
            '.ytp-ad-skip-button-modern',
            '.ytp-skip-ad-button',
            'ytd-miniplayer .ytp-ad-skip-button',
            '[class*="skip"][class*="ad"]'
        ];
        skipButtons.forEach(sel => {
            document.querySelectorAll(sel).forEach(btn => btn.click());
        });
        document.querySelectorAll('.ytp-ad-overlay-container, .ytp-ad-image-overlay, .video-ads.ytp-ad-module').forEach(el => el.remove());
    }

    function addDownloadButton() {
        const existing = document.querySelector('#my-download-btn');
        const container = document.querySelector('#above-the-fold #top-level-buttons-computed');
        if (container && !existing) {
            const btn = document.createElement('button');
            btn.id = "my-download-btn";
            btn.className = "yt-spec-button-shape-next yt-spec-button-shape-next--tonal yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m";
            const span = document.createElement('span');
            span.className = "yt-spec-button-shape-next__button-text-content";
            span.innerText = "Download";
            btn.appendChild(span);
            btn.onclick = () => {
                const videoId = new URLSearchParams(window.location.search).get("v");
                if (videoId) window.open(`https://en.y2mate.is/pZuT/watch?v=${videoId}`, '_blank');
            };
            container.appendChild(btn);
        }
    }

    function sponsorSkip() {
        const video = document.querySelector('video');
        const chapters = document.querySelectorAll('.ytp-chapter-hover-container');
        if (video && chapters.length > 0) {
            chapters.forEach(ch => {
                if (ch.innerText.toLowerCase().includes('sponsor')) video.currentTime += 30;
            });
        }
    }

    function removeAntiAdblockPopup() {
        const selectors = [
            'tp-yt-paper-dialog',
            'ytd-popup-container',
            '.ytd-consent-bump-v2-lightbox',
            '[class*="dialog"][class*="popup"]',
            '[role="dialog"]',
            '.ytp-popup',
            '.video-ads.ytp-ad-module'
        ];
        selectors.forEach(sel => {
            document.querySelectorAll(sel).forEach(dlg => {
                const isAdblockWarning =
                    dlg.querySelector('a[href*="support.google.com"]') ||
                    /adblock|allow\s+ads|blocker|advertising|turn\s+off/i.test(dlg.textContent) ||
                    dlg.querySelector('[class*="adblock"], [class*="blocker"]') ||
                    dlg.classList.contains('video-ads');
                if (isAdblockWarning) {
                    dlg.remove();
                    document.body.style.overflow = 'auto';
                }
            });
        });

        const backdrops = [
            'tp-yt-iron-overlay-backdrop.opened',
            '.ytp-ad-overlay-container',
            '[class*="backdrop"][class*="opened"]',
            '[class*="overlay"][style*="display: block"]',
            '.ytp-ad-module'
        ];
        backdrops.forEach(sel => {
            document.querySelectorAll(sel).forEach(el => {
                el.remove();
                document.body.style.overflow = 'auto';
            });
        });

        const player = document.querySelector('#movie_player, .html5-video-player');
        if (player) {
            if (player.style.display === 'none' || player.classList.contains('ad-showing')) {
                player.style.display = 'block';
                player.classList.remove('ad-showing', 'ad-interrupting');
            }
            const video = player.querySelector('video');
            if (video && video.paused) video.play().catch(() => {});
        }
    }

    function bypassAgeRestriction() {
        const ageDialog = document.querySelector('ytd-enforcement-message-view-model, [class*="age-restriction"]');
        if (ageDialog) ageDialog.remove();

        const video = document.querySelector('video');
        if (video && video.paused && video.readyState === 0) {
            const isAgeBlocked = document.querySelector('ytd-player .ytd-watch-flexy[ad-blocked], [class*="age-restricted"]');
            const videoId = new URLSearchParams(window.location.search).get('v');
            if (isAgeBlocked && videoId) window.location.href = `https://www.youtube-nocookie.com/embed/${videoId}?autoplay=1`;
        }
    }

    function removeAdBanners() {
        const selectors = [
            '#player-ads',
            '#masthead-ad',
            '.ytp-ad-overlay-container',
            '.ytp-ad-image-overlay',
            '.yt-mealbar-promo-renderer',
            '.ytp-featured-product',
            'ytd-merch-shelf-renderer',
            'ytd-in-feed-ad-layout-renderer',
            '.tp-yt-iron-a11y-announcer',
            'ytd-ad-slot-renderer',
            '[class*="sponsored"], [class*="ad-slot"]'
        ];
        selectors.forEach(sel => {
            document.querySelectorAll(sel).forEach(el => {
                if (/ad|advertisement|sponsored|promo/i.test(el.textContent) ||
                    el.querySelector('[class*="ad"], [class*="sponsor"]') ||
                    el.classList.contains('video-ads')) el.remove();
            });
        });
    }

    function keepVideoPlayingEarly() {
        const video = document.querySelector('video');
        if (!video || video.dataset.keepPlayingEarly) return;
        video.dataset.keepPlayingEarly = 'true';
        const onPause = () => {
            if (video.currentTime <= 3) video.play().catch(() => {});
        };
        video.removeEventListener('pause', onPause);
        video.addEventListener('pause', onPause);
    }

    let debounceTimeout;
    const observer = new MutationObserver(() => {
        clearTimeout(debounceTimeout);
        debounceTimeout = setTimeout(() => {
            removeAntiAdblockPopup();
            bypassAgeRestriction();
            skipAds();
            removeAdBanners();
            keepVideoPlayingEarly();
            addDownloadButton();
        }, 50);
    });

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

    removeAntiAdblockPopup();
    bypassAgeRestriction();
    skipAds();
    removeAdBanners();
    keepVideoPlayingEarly();
    addDownloadButton();

    setInterval(() => {
        sponsorSkip();
        skipAds();
        removeAdBanners();
    }, 5000);

})();