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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Lista M3U de Eventos</title>
  <style>
    body {
      background-color: #1a1a1a;
      color: #ffffff;
      font-family: monospace;
      padding: 20px;
      margin: 0;
      display: flex;
      flex-direction: column;
      align-items: center;
    }

    h1 {
      color: #ffffff;
      text-align: center;
    }

    #estado-carga {
      margin: 20px 0;
      text-align: center;
    }

    #m3u-contenido {
      width: 90%;
      max-width: 800px;
      background-color: #2d2d2d;
      border-radius: 8px;
      padding: 20px;
      white-space: pre-wrap; /* Mantiene los saltos de línea */
      word-wrap: break-word;
      margin: 20px auto;
      height: auto; /* Ajusta la altura al contenido */
    }

    button {
      background-color: #4CAF50;
      color: white;
      border: none;
      padding: 10px 20px;
      border-radius: 4px;
      cursor: pointer;
      margin: 10px;
    }

    button:hover {
      background-color: #45a049;
    }
  </style>
</head>

<body>
  <h1>Lista M3U de Eventos</h1>
  <div id="estado-carga">Iniciando la recuperación de datos...</div>
  <div>
    <button id="copiar-datos">Copiar M3U</button>
  </div>
  <pre id="m3u-contenido"></pre>

  <script>
    const urls = [
      "https://ipfs.io/ipns/elcano.top",
      "https://ipfs.io/ipns/k51qzi5uqu5dgg9al11vomikugim0o1i3l3fxp3ym3jwaswmy9uz8pq4brg1u9"
    ];

    const estadoCarga = document.getElementById("estado-carga");
    const m3uContenido = document.getElementById("m3u-contenido");
    const botonCopiar = document.getElementById("copiar-datos");
    let eventos = [];

    function obtenerDatos() {
      estadoCarga.textContent = "Recuperando datos, por favor espera...";
      eventos = [];

      // Usar XMLHttpRequest para mayor compatibilidad
      function fetchUrl(url) {
        return new Promise((resolve, reject) => {
          const xhr = new XMLHttpRequest();
          xhr.open('GET', url, true);
          xhr.onload = function () {
            if (xhr.status === 200) {
              resolve(xhr.responseText);
            } else {
              reject(new Error(`Error al cargar ${url}`));
            }
          };
          xhr.onerror = () => reject(new Error(`Error de red al cargar ${url}`));
          xhr.send();
        });
      }

      // Procesar URL de forma secuencial
      function procesarUrls(urlsRestantes) {
        if (urlsRestantes.length === 0) {
          mostrarM3U(eventos);
          estadoCarga.textContent = eventos.length > 0
            ? "Datos recuperados correctamente."
            : "No se pudieron recuperar datos.";
          return;
        }

        const url = urlsRestantes[0];
        fetchUrl(url)
          .then(textoHTML => {
            const parser = new DOMParser();
            const doc = parser.parseFromString(textoHTML, "text/html");

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

            if (scriptContent) {
              const linksDataMatch = scriptContent.textContent.match(/const linksData = ({.*?});/s);
              if (linksDataMatch) {
                try {
                  const linksData = JSON.parse(linksDataMatch[1]);
                  linksData.links.forEach(link => {
                    const url = link.url;
                    const contentId = url.startsWith("acestream://")
                      ? url.replace("acestream://", "")
                      : null;

                    if (contentId && !eventos.some(evento => evento.contentId === contentId)) {
                      eventos.push({ nombre: link.name, contentId: contentId });
                    }
                  });
                } catch (error) {
                  console.error("Error parsing JSON:", error);
                }
              }
            }

            procesarUrls(urlsRestantes.slice(1));
          })
          .catch(error => {
            console.error("Error al procesar URL:", error);
            procesarUrls(urlsRestantes.slice(1));
          });
      }

      procesarUrls(urls);
    }

    function generarM3U(eventos) {
      // Aquí agregamos el encabezado con las URLs de EPG
      // let m3u = '#EXTM3U url-tvg="https://raw.githubusercontent.com/davidmuma/EPG_dobleM/master/guiatv.xml, https://raw.githubusercontent.com/Icastresana/lista1/refs/heads/main/epg.xml"\n';

      let m3u = '#EXTM3U\n';

      // Agregar los eventos a la lista M3U
      eventos.forEach(evento => {
        m3u += `#EXTINF:-1, group-title="Elcano.top",${evento.nombre}\nacestream://${evento.contentId}\n`;
      });
      return m3u;
    }

    function mostrarM3U(eventos) {
      const m3uString = generarM3U(eventos);
      m3uContenido.textContent = m3uString; // Mostrar la lista M3U generada
    }

    function copiarDatosM3U() {
      const m3u = generarM3U(eventos);

      // Método de copia más compatible
      const tempTextArea = document.createElement('textarea');
      tempTextArea.value = m3u;
      document.body.appendChild(tempTextArea);
      tempTextArea.select();

      try {
        document.execCommand('copy');
        alert('M3U copiado al portapapeles');
      } catch (err) {
        console.error('Error al copiar el M3U:', err);
        prompt('Copia el M3U:', m3u);
      }

      document.body.removeChild(tempTextArea);
    }

    botonCopiar.addEventListener("click", copiarDatosM3U);

    // Iniciar recuperación de datos
    obtenerDatos();
  </script>
</body>

</html>
