Rutube Ultimate AdBlock (No preroll)

Полное отключение рекламы на Rutube (включая авторизованных пользователей)

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         Rutube Ultimate AdBlock (No preroll)
// @namespace    http://tampermonkey.net/
// @version      4.0
// @description  Полное отключение рекламы на Rutube (включая авторизованных пользователей)
// @match        https://rutube.ru/*
// @match        https://*.rutube.ru/*
// @run-at       document-start
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    /***************************************
     * 1. Блокировка всех рекламных запросов
     ***************************************/
    const adHosts = [
        'an.yandex.ru',
        'mc.yandex.ru',
        'betacdn.rutube.ru/adv',
        'rutube.ru/api/ads',
        'rutube.ru/api/preroll',
        '/adv/',
        '/ads/'
    ];

    const origFetch = window.fetch;
    window.fetch = function (...args) {
        if (typeof args[0] === 'string' && adHosts.some(h => args[0].includes(h))) {
            // имитируем успешный ответ от рекламы
            return Promise.resolve(new Response(JSON.stringify({ ads: [] }), {
                status: 200,
                headers: { 'Content-Type': 'application/json' }
            }));
        }
        return origFetch.apply(this, args);
    };

    const origXhrOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function (method, url, ...rest) {
        if (typeof url === 'string' && adHosts.some(h => url.includes(h))) {
            this.send = () => {
                this.onload && this.onload({
                    target: {
                        responseText: '{"ads":[]}',
                        status: 200
                    }
                });
            };
        }
        return origXhrOpen.call(this, method, url, ...rest);
    };


    /***************************************
     * 2. Форсируем событие «реклама завершена»
     ***************************************/
    function fakeAdDone() {
        window.postMessage({
            type: 'adCompleted',
            action: 'complete',
            preroll: false
        }, '*');
    }

    // Несколько раз подряд, пока плеер инициализируется
    const interval = setInterval(fakeAdDone, 300);
    setTimeout(() => clearInterval(interval), 8000);


    /***************************************
     * 3. Скрытие всех рекламных DOM-слоёв
     ***************************************/
    const css = `
        .preroll,
        .player__preroll,
        .preroll__container,
        .video-adv,
        [data-adv],
        [data-ad],
        .adv,
        .advertising,
        .player-ads,
        #advertising,
        .player__overlay-adv {
            display: none !important;
            opacity: 0 !important;
            visibility: hidden !important;
            pointer-events: none !important;
        }
    `;
    const style = document.createElement('style');
    style.textContent = css;
    document.documentElement.appendChild(style);


    /***************************************
     * 4. Чистка новых рекламных узлов
     ***************************************/
    const observer = new MutationObserver(() => {
        document.querySelectorAll(`
            .preroll,
            .player__preroll,
            .video-adv,
            [data-ad],
            [data-adv]
        `).forEach(el => el.remove());
    });

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

})();