<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Andrenalina</title>
    <style>
        body {
            text-align: center;
            background-color: #1a1a1a;
            color: #ffffff;
            transition: background-color 0.5s, color 0.5s;
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
            display: flex;
            flex-direction: column;
            align-items: center;
            min-height: 100vh;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
            font-size: 1rem;
            text-align: left;
        }

        th,
        td {
            padding: 10px;
            border: 1px solid #ddd;
        }

        th {
            background-color: rgb(226, 59, 13);
        }

        .loading {
            text-align: center;
            font-size: 1.2rem;
            color: #ff4d4d;
        }

        .tabla-acestream {
            margin-top: 40px;
            text-align: center;
            z
        }

        .tabla-Eventos {
            margin-top: 40px;
            text-align: center;
        }

        }

        h1 {
            text-align: center;
            color: white;
        }

        a {
            text-align: center;
            color: #ff4d4d;
        }

        hr {
            border-color: #404040;
            margin: 15px 0;
        }
    </style>
</head>

<body>
    <h1>/⁠╲⁠/⁠\⁠╭⁠(⁠•⁠‿⁠•⁠)⁠╮⁠/⁠\⁠╱⁠\</h1>
    <h1>Andrenalina</h1>
    <h1>by TokyoGhoull</h1>
    <div id="loading" class="loading">Cargando datos...</div>
    <table id="tablaEventos" class="tabla-Eventos" style="display: none;">
        <thead>
            <tr>
                <th>Hora</th>
                <th>Competición</th>
                <th>Evento</th>
                <th>Canales</th>
                <th>Eventos Acestream</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <!-- Segunda tabla para AceStream -->
    <!-- <h2>Eventos Acestream</h2> -->
    <table id="tablaAcestream" class="tabla-acestream" style="display: none;">
        <thead>
            <tr>
                <th>Nombre</th>
                <th>Content ID</th>
                <th>Eventos</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <script>
        const futbolUrl = 'https://www.futbolenlatv.es/deporte';
        const acestreamUrls = [
            "https://ipfs.io/ipns/elcano.top",
            "https://ipfs.io/ipns/k51qzi5uqu5dgg9al11vomikugim0o1i3l3fxp3ym3jwaswmy9uz8pq4brg1u9",
            "htttps://bafybeihaak6jp7c6y3weyynkfruefwtgchvx2uuppmtts775k4z7kyw4ny.ipfs.dweb.link"
        ];

        // Mapeo de canales a sus correspondientes identificadores AceStream
        const equivalenciasCanales = {
            "La 1 TVE": ["La1", "La1 UHD"],
            "Teledeporte": ["tdp 1080"],
            "Eurosport 1": ["EuroSport 1 1080"],
            "Eurosport 2": ["EuroSport 2 1080"],
            "M+ LaLiga TV (M54-O110)": ["M. LaLiga 1080P", "M. LaLiga 1080 MultiAudio", "M. LaLiga 720"],
            "M+ LaLiga TV UHD (M440 O111)": ["M. LaLiga 1080P", "M. LaLiga 1080 MultiAudio", "M. LaLiga 720"],
            "LaLiga TV M2": ["M. LaLiga 2 1080", "M. LaLiga 2 720"],
            "M+ LaLiga TV (M54-O110)": ["M. LaLiga 1080", "M. LaLiga 720"],
            "M+ LaLiga TV 2 (M57 O112)": ["M. LaLiga 2 1080", "M. LaLiga 2 720"],
            "M+ LaLiga TV 3 (M167 O270)": ["M. LaLiga 3 1080", "M. LaLiga 3 720"],
            "M+ LaLiga TV 4 (M168 O271)": ["M. LaLiga 4 1080", "M. LaLiga 4 720"],
            "LaLiga TV M2": ["M. LaLiga 2 720", "M. LaLiga 2 1080"],
            "LaLiga TV M3": ["M. LaLiga 3 720", "M. LaLiga 3 1080"],
            "LaLiga TV M4": ["M. LaLiga 4 1080", "M. LaLiga 4 720"],
            "LaLiga TV M5": ["M. LaLiga 5 1080", "M. LaLiga 5 720"],
            "LaLiga TV M6": ["M. LaLiga 6 1080", "M. LaLiga 6 720"],

            "LaLiga TV Bar": ["La Liga BAR 1080", "La Liga BAR 720"],

            "LALIGA TV Hypermotion (M56 O 119)": ["LaLiga Smartbank 1080", "LaLiga Smartbank 720"],
            "LALIGA TV Hypermotion 2 (M59 O120)": ["LaLiga Smartbank 2 1080", "LaLiga Smartbank 2 720"],
            "*": ["LaLiga Smartbank 3"],

            "Movistar Plus+ (M7)": ["M.Plus 1080", "M.Plus 720"],
            "Movistar Plus+ 2 (M176)": ["M.Plus 2 1080", "M.Plus 2 720"],

            "M+ Copa del Rey (M52 O107)": ["Copa 1080", "Copa 1080 plus", "Copa 1080 MultiAudio", "Copa 1080", "Copa 720"],

            "M+ Vamos (8 y 53)": ["#Vamos 1080", "#Vamos 720"],
            "M+ #Vamos Bar (304)": ["#Vamos Bar 1080", "#Vamos Bar 720"],
            "M+ #Vamos Bar 2 (305)": ["#Vamos Bar 2 1080", "#Vamos Bar 2 720"],

            "M+ Ellas Vamos (66)": ["#Ellas 1080"],

            "M+ Deportes (63)": ["M. Deportes 1080", "M. Deportes 720"],
            "M+ Deportes 2 (64)": ["M. Deportes 2 1080", "M. Deportes 2 720"],
            "M+ Deportes 3 (65)": ["M. Deportes 3 1080", "M. Deportes 3 720"],
            "M+ Deportes 4 (191)": ["M. Deportes 4 1080", "M. Deportes 4 720"],
            "M+ Deportes 5 (192)": ["M. Deportes 5 1080", "M. Deportes 5 720"],
            "M+ Deportes 6 (193)": ["M. Deportes 6 1080", "M. Deportes 6 720"],
            "M+ Deportes 7 (194)": ["M. Deportes 7 1080", "M. Deportes 7 720"],

            "M+ Liga de Campeones": ["M.L. Campeones1080", "M.L. Campeones 720", "M.L. Campeones 1080 MultiAudio"],
            "M+ Liga de Campeones (M60 O115)": ["M.L. Campeones 1080", "M.L. Campeones 720", "M.L. Campeones 1080 MultiAudio"],
            "M+ Liga de Campeones 2 (M61 O116)": ["M.L. Campeones 2 SD", "M.L. Campeones 2 1080", "M.L. Campeones 2 720"],
            "M+ Liga de Campeones 3 (M62 O118)": ["M.L. Campeones 3 SD", "M.L. Campeones 3 1080", "M.L. Campeones 3 720"],
            "M+ Liga de Campeones 4 (M180 O276)": ["M.L. Campeones 4 SD", "M.L. Campeones 4 1080", "M.L. Campeones 4 720"],
            "M+ Liga de Campeones 5 (M182 O277)": ["M.L. Campeones 5 SD", "M.L. Campeones 5 1080", "M.L. Campeones 5 720"],
            "M+ Liga de Campeones 6 (M183 O278)": ["M.L. Campeones 6 SD", "M.L. Campeones 6 1080", "M.L. Campeones 6 720"],
            "M+ Liga de Campeones 7 (M184 O279)": ["M.L. Campeones 7 SD", "M.L. Campeones 7 1080", "M.L. Campeones 7 720"],
            "M+ Liga de Campeones 8 (M184 O280)": ["M.L. Campeones 8 SD", "M.L. Campeones 8 1080", "M.L. Campeones 8 720"],
            "M+ Liga de Campeones 9 (M185 O281)": ["M.L. Campeones 9 SD", "M.L. Campeones 9 1080", "M.L. Campeones 9 720"],
            "M+ Liga de Campeones 10 (M186 O282)": ["M.L. Campeones 10 SD", "M.L. Campeones 10 1080", "M.L. Campeones 10 720"],
            "M+ Liga de Campeones 11 (M187 O283)": ["M.L. Campeones 11 SD", "M.L. Campeones 11 1080", "M.L. Campeones 11 720"],
            "M+ Liga de Campeones 12 (M 188 O284)": ["M.L. Campeones 12 SD", "M.L. Campeones 12 1080", "M.L. Campeones 12 720"],
            "M+ Liga de Campeones 13 (M189 O285)": ["M.L. Campeones 13 SD", "M.L. Campeones 13 1080", "M.L. Campeones 13 720"],
            "M+ Liga de Campeones 14 (O286)": ["M.L. Campeones 14 1080", "M.L. Campeones 14 720", "M.L. Campeones 14 SD"],
            "M+ Liga de Campeones 15 (O287)": ["M.L. Campeones 15 SD", "M.L. Campeones 15 1080", "M.L. Campeones 15 720"],
            "M+ Liga de Campeones 16 (O288)": ["M.L. Campeones 16 SD", "M.L. Campeones 16 1080", "M.L. Campeones 16 720"],
            "M+ Liga de Campeones 17 (O289)": ["M.L. Campeones 17 SD", "M.L. Campeones 17 1080", "M.L. Campeones 17 720"],
            "M+ Liga de Campeones 18": ["M.L. Campeones 18 SD", "M.L. Campeones 18 1080", "M.L. Campeones 18 720"],
            "M+ Liga de Campeones 19": ["M.L. Campeones 19 SD", "M.L. Campeones 19 1080", "M.L. Campeones 19 720"],

            "Movistar Golf (M67)": ["M. Golf 1080", "M. Golf 720"],
            "Movistar Golf 2 (M68)": ["M. Golf2 1080", "M. Golf2 720"],

            "DAZN 1 (M70)": ["DAZN 1 1080", "DAZN 1 720"],
            "DAZN 1 Bar (Movistar-148)": ["DAZN 1 Bar 1080", "DAZN 1 Bar 720"],
            "DAZN 2 (M71)": ["DAZN 2 1080", "DAZN 2 720"],
            "DAZN 2 Bar (Movistar-149)": ["DAZN 2 Bar 1080", "DAZN 2 Bar 720"],
            "DAZN 3 (M196)": ["DAZN 3 1080", "DAZN 3 720"],
            "DAZN 4 (M197)": ["DAZN 4 1080", "DAZN 4 720"],

            "DAZN F1 (M69)": ["DAZN F1 Multicamara (Fórmula 1)", "DAZN F1 1080 (Fórmula 1)", "DAZN F1 720 (Fórmula 1)"],

            "DAZN LaLiga (M55 O113)": ["DAZN LaLiga 1080 MultiAudio", "DAZN LaLiga 720"],
            "DAZN LaLiga 2 (M58 O274)": ["DAZN LaLiga 2 1080 MultiAudio", "DAZN LaLiga 2 720"],

            "*": ["PPVP 1"],
            "*": ["PPVP 2"],
            "*": ["PPVP 3"],

            "Telecinco": ["Telecinco 1080", "Telecinco 720"],
        };

        // Filtros genéricos basados en palabras clave
        const filtrosGenericos = [
            'YouTube',
            'Twitch',
            'Twitter',
            'Facebook',
            'DIRECTO',
            'directo',
            'Directo',
            'Play',
            'PLAY',
            'play',
            'PPV',
            'Regístrate',
            'acceder',
            'Acceder',
            '.com',
            '.es',
            'Web',
            'Dispositivos',
            'Orange',
            'Zapi',
            'Galicia',
            'Cataluña',
            'OneFootball',
            'Lite',
            '(País Vasco)',
            'Aragón',
            '7Play',

        ];

        // Canales específicos que queremos excluir
        const canalesExcluidos = [
            "NBA League Pass",
            "MAX",
            "Plaiz",
            "Canal por confirmar",
            "FEF TV",
            "GolStadium Premium",
            "Esport3 Web",
            "DAZN App Gratis",
            "EHF TV",
            "Barça One",
            "Amazon Prime Video",
            "FCF TV",
            //"Real Betis TV",
            "RFEF",
            "CONCACAF GO",
            "LaLiga+",
            "LaLiga+ Plus",
            "GolStadium",
            "CMMPlay",
            "La Xarxa+",
            "FEB TV",
            "TV FootballClub",
            "FANSEA",
            "FANSEAT",
            "Fight Sports Max",
            "À Punt (C. Valenciana)",
            "TV5 Monde",
            "ElCanalDelFutbol",
            "RTP Internacional",
            "RCN Nuestra Tele",
            "RFAF TV",
            "NWSL+",
            "7 TV Linares",
            "La Otra (Madrid)",
            "FIFA+",
            "Extv",
            "101 TV (Málaga)",
            "Real Avilés Industrial TV",
            "VivamóvilTV",
            "Telecartagena",
            "UEFA TV",
            "TV Melilla",
            "La 8 Burgos",
            "IB3 (Baleares)",
            "Popular TV Murcia",
            "Betevé (Barcelona)",
            "7 TV Jaén",
            "Canal Sur",
            "TPA 1 (Asturias)",
            "TV Canaria",
            "Real Madrid TV",
            "Lleida Televisió",
            "À Punt Mèdia",
            "Red Bull TV",
            "Eurovision Sports TV",
            "ATP Tennis TV",
            "Movistar+"
        ];

        function debeExcluirCanal(canalTitulo) {
            // Comprobar si el canal está en la lista de excluidos específicos
            if (canalesExcluidos.some(canal => canalTitulo.includes(canal))) {
                return true;
            }

            // Comprobar si el canal contiene alguna palabra clave genérica
            if (filtrosGenericos.some(filtro => canalTitulo.includes(filtro))) {
                return true;
            }

            return false;
        }



        async function cargarDatosFutbol() {
            const tablaEventos = document.getElementById('tablaEventos');
            const tbodyEventos = tablaEventos.querySelector('tbody');
            const loading = document.getElementById('loading');

            try {
                const respuesta = await fetch(futbolUrl);
                const texto = await respuesta.text();
                const parser = new DOMParser();
                const doc = parser.parseFromString(texto, 'text/html');
                const tablaPrincipal = doc.querySelector('table.tablaPrincipal.detalleVacio');

                if (!tablaPrincipal) {
                    loading.textContent = 'No se encontró información.';
                    return;
                }

                const filas = tablaPrincipal.querySelectorAll('tr');
                let fechaActual = '';

                filas.forEach(fila => {
                    if (fila.classList.contains('cabeceraTabla')) {
                        const fechaTexto = fila.querySelector('td[colspan="5"]').innerText;
                        const match = fechaTexto.match(/(\d{2}\/\d{2}\/\d{4})/);
                        if (match) fechaActual = match[1];
                    } else {
                        const hora = fila.querySelector('.hora')?.innerText.trim();
                        const competicion = fila.querySelector('.ajusteDoslineas label')?.getAttribute('title');
                        const canalesList = fila.querySelectorAll('.listaCanales li');
                        const canales = [];

                        // Obtener el evento (puede ser partido o evento individual)
                        let evento = '';
                        const eventoUnico = fila.querySelector('.eventoUnico');
                        if (eventoUnico) {
                            // Es un evento individual (como una carrera)
                            evento = eventoUnico.innerHTML;
                        } else {
                            // Es un partido con local y visitante
                            const local = fila.querySelector('.local span')?.getAttribute('title');
                            const visitante = fila.querySelector('.visitante span')?.getAttribute('title');
                            if (local && visitante) {
                                evento = `${local}<br>-<br>${visitante}`;
                            }
                        }

                        // Mantener el procesamiento original de canales con todos los filtros
                        canalesList.forEach(canal => {
                            const canalTitulo = canal.getAttribute('title');
                            if (canalTitulo && !debeExcluirCanal(canalTitulo)) {
                                canales.push(canalTitulo);
                            }
                        });

                        // Mostrar el evento si tiene hora, competición, evento (de cualquier tipo) y canales válidos
                        if (hora && competicion && evento && canales.length > 0) {
                            const row = document.createElement('tr');
                            row.innerHTML = `
                <td>${hora}</td>
                <td>${competicion}</td>
                <td>${evento}</td>
                <td>${canales.join('<br>')}</td>
                <td>-</td>
            `;
                            tbodyEventos.appendChild(row);
                        }
                    }
                });

                loading.style.display = 'none';
                tablaEventos.style.display = 'table';
            } catch (error) {
                loading.textContent = 'Error al cargar los datos.';
                console.error(error);
            }
        }

        async function cargarDatosAcestream() {
            const tablaAcestream = document.getElementById('tablaAcestream');
            const tbodyAcestream = tablaAcestream.querySelector('tbody');

            const enlacesAcestream = [];

            for (const url of acestreamUrls) {
                try {
                    const respuesta = await fetch(url);
                    const textoHTML = await respuesta.text();
                    const parser = new DOMParser();
                    const doc = parser.parseFromString(textoHTML, "text/html");

                    const scriptContent = [...doc.scripts].find(script => script.textContent.includes("linksData"));
                    if (!scriptContent) continue;

                    const linksDataMatch = scriptContent.textContent.match(/const linksData = ({.*?});/s);
                    if (!linksDataMatch) continue;

                    const linksData = JSON.parse(linksDataMatch[1]);
                    linksData.links.forEach(link => {
                        const contentId = link.url.startsWith("acestream://") ? link.url.replace("acestream://", "") : null;

                        if (contentId && !enlacesAcestream.some(e => e.contentId === contentId)) {
                            enlacesAcestream.push({ nombre: link.name.trim(), contentId });
                        }
                    });
                } catch (error) {
                    console.error("Error al obtener Eventos Acestream:", error);
                }
            }

            enlacesAcestream.forEach(enlace => {
                const row = document.createElement('tr');
                row.innerHTML = `
                    <td>${enlace.nombre}</td>
                    <td>${enlace.contentId}</td>
                    <td><a href="acestream://${enlace.contentId}" target="_blank">${enlace.nombre}</a></td>
                `;
                tbodyAcestream.appendChild(row);
            });

            tablaAcestream.style.display = 'table';
        }

        function asociarCanalesYEnlaces() {
            const tablaEventos = document.getElementById('tablaEventos');
            const filasEventos = tablaEventos.querySelectorAll('tbody tr');
            const tablaAcestream = document.getElementById('tablaAcestream');
            const filasAcestream = tablaAcestream.querySelectorAll('tbody tr');

            // Variable para contar el total de canales restantes en todas las filas
            let totalCanalesRestantes = 0;

            filasEventos.forEach(fila => {
                const columnaCanales = fila.querySelector('td:nth-child(4)');
                const canales = columnaCanales.innerText.split('\n');
                const columnaEnlaces = fila.querySelector('td:nth-child(5)');

                const enlaces = [];
                const canalesRestantes = [];

                canales.forEach(canalEvento => {
                    let canalEncontrado = false;

                    for (const [canalPrincipal, subCanales] of Object.entries(equivalenciasCanales)) {
                        if (canalEvento.toLowerCase() === canalPrincipal.toLowerCase() ||
                            subCanales.some(subcanal => canalEvento.toLowerCase() === subcanal.toLowerCase())) {
                            filasAcestream.forEach(filaAcestream => {
                                const nombre = filaAcestream.querySelector('td:nth-child(1)').innerText;
                                const contentId = filaAcestream.querySelector('td:nth-child(2)').innerText;

                                if (canalEvento === nombre || subCanales.some(subcanal => nombre.includes(subcanal))) {
                                    const enlace = `<a href="acestream://${contentId}" target="_blank">${nombre}</a>`;
                                    enlaces.push(enlace);
                                    canalEncontrado = true;
                                }
                            });
                            break;
                        }
                    }

                    if (!canalEncontrado) {
                        canalesRestantes.push(canalEvento);
                    }
                });

                // Actualizar columnas
                columnaCanales.innerHTML = canalesRestantes.join('<br>');
                columnaEnlaces.innerHTML = enlaces.length > 0 ? enlaces.join('<br>') : 'No disponible';

                // Sumar al total de canales restantes
                totalCanalesRestantes += canalesRestantes.length;
            });

            // Si no hay canales restantes en ninguna fila, ocultar toda la columna de canales
            if (totalCanalesRestantes === 0) {
                // Ocultar el encabezado de la columna de canales
                const encabezados = tablaEventos.querySelectorAll('th');
                encabezados[3].style.display = 'none';

                // Ocultar la columna de canales en todas las filas
                filasEventos.forEach(fila => {
                    const columnaCanales = fila.querySelector('td:nth-child(4)');
                    columnaCanales.style.display = 'none';
                });
            }
        }


        async function main() {
            await cargarDatosFutbol();
            await cargarDatosAcestream();
            await asociarCanalesYEnlaces();
        }

        main();
    </script>
</body>