YouTube Interface Booster

Mejora la interfaz de YouTube con capturas HD, cambio de calidad, bloqueo de anuncios y tema adaptativo.

// ==UserScript==
// @name         YouTube Interface Booster
// @namespace    http://tampermonkey.net/
// @version      4.4
// @description  Mejora la interfaz de YouTube con capturas HD, cambio de calidad, bloqueo de anuncios y tema adaptativo.
// @author       Yeferson Andres
// @license MIT
// @match        https://www.youtube.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    let calidadActual = 'hd720';
    let controlesVisibles = false;

    const eliminarAnuncios = () => {
        const ads = document.querySelectorAll('.ad-showing, ytd-promoted-video-renderer, ytd-display-ad-renderer, .ytp-ad-module');
        ads.forEach(ad => ad.remove());
    };

    const aplicarCalidad = (modo = calidadActual) => {
        const player = document.getElementById('movie_player');
        if (player && player.setPlaybackQualityRange) {
            player.setPlaybackQualityRange(modo);
            player.setPlaybackQuality(modo);
        }
    };

    const capturarVisible = () => {
        const video = document.querySelector('video');
        if (!video) return alert('[BrayanBot] ❌ No se encontró el video');

        try {
            const canvas = document.createElement('canvas');
            canvas.width = video.videoWidth;
            canvas.height = video.videoHeight;
            const ctx = canvas.getContext('2d');
            ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

            canvas.toBlob(blob => {
                const url = URL.createObjectURL(blob);
                const a = document.createElement('a');
                a.href = url;
                a.download = `captura-${Date.now()}.png`;
                a.click();
                URL.revokeObjectURL(url);
            }, 'image/png');
        } catch (e) {
            alert('[BrayanBot] ⚠️ Este video no se puede capturar (DRM activo)');
        }
    };

    const getThemeColors = () => {
        const dark = document.documentElement.getAttribute('dark') !== null || document.documentElement.classList.contains('dark');
        return dark
            ? { bg: '#181818', fg: '#ffffff', accent: '#bb0000' }
            : { bg: '#ffffff', fg: '#000000', accent: '#ff0000' };
    };

    const crearInterfaz = () => {
        if (document.getElementById('brayanHamburguesa')) return;

        const { bg, fg, accent } = getThemeColors();

        const btnHamburguesa = document.createElement('button');
        btnHamburguesa.id = 'brayanHamburguesa';
        btnHamburguesa.textContent = '☰';
        Object.assign(btnHamburguesa.style, {
            position: 'fixed',
            bottom: '20px',
            left: '20px',
            zIndex: 9999,
            padding: '10px 15px',
            backgroundColor: bg,
            color: fg,
            fontSize: '20px',
            border: `2px solid ${fg}`,
            borderRadius: '10px',
            cursor: 'pointer',
            boxShadow: '0 0 10px rgba(0,0,0,0.5)',
        });

        const contenedor = document.createElement('div');
        contenedor.id = 'brayanControles';
        Object.assign(contenedor.style, {
            position: 'fixed',
            bottom: '70px',
            left: '20px',
            zIndex: 9999,
            display: 'none',
            flexDirection: 'column',
            gap: '10px',
        });

        const estiloBoton = {
            padding: '10px 15px',
            backgroundColor: accent,
            color: fg,
            fontWeight: 'bold',
            border: 'none',
            borderRadius: '10px',
            cursor: 'pointer',
            boxShadow: '0 0 10px rgba(0,0,0,0.5)',
        };

        const btnCaptura = document.createElement('button');
        btnCaptura.textContent = '📸 Captura';
        Object.assign(btnCaptura.style, estiloBoton);
        btnCaptura.onclick = capturarVisible;

        const btnCalidad = document.createElement('button');
        btnCalidad.textContent = '🎚 Calidad: 720p';
        Object.assign(btnCalidad.style, estiloBoton);
        btnCalidad.onclick = () => {
            calidadActual = calidadActual === 'hd720' ? 'large' : 'hd720';
            btnCalidad.textContent = `🎚 Calidad: ${calidadActual === 'hd720' ? '720p' : '480p'}`;
            aplicarCalidad();
        };

        btnHamburguesa.onclick = () => {
            controlesVisibles = !controlesVisibles;
            contenedor.style.display = controlesVisibles ? 'flex' : 'none';
        };

        contenedor.appendChild(btnCaptura);
        contenedor.appendChild(btnCalidad);
        document.body.appendChild(btnHamburguesa);
        document.body.appendChild(contenedor);
    };

    // 💡 Reaplica tema si cambia en caliente
    const observarTema = () => {
        const observer = new MutationObserver(() => {
            const old = document.getElementById('brayanHamburguesa');
            const contenedor = document.getElementById('brayanControles');
            if (old) old.remove();
            if (contenedor) contenedor.remove();
        });
        observer.observe(document.documentElement, { attributes: true, attributeFilter: ['dark', 'class'] });
    };

    setInterval(() => {
        eliminarAnuncios();
        crearInterfaz();
        aplicarCalidad();
    }, 1500);

    observarTema();
})();