Guía de integración: API, visor, reproductor y ejemplos
Manual ELI STREAMING
Un solo mapa de lo que hace la aplicación. Cada módulo va aparte. Lo privado no se pinta: solo el video.
1. Checklist único
- Arranque con
INICIAR.bat. Queda enhttp://127.0.0.1:4174. - El visor incorpora las nueve fuentes, de TB1 a TB9, según su disponibilidad. Los filtros van en una fila. La lista a la izquierda y el video a la derecha.
- Las fuentes con video HLS (TB1, TB2, TB3, TB7, TB8 y TB9) se reproducen con el reproductor propio.
- TB4 no abre la URL del video sola. La página permitida va por dentro y no se muestra. En pantalla solo queda el video, sin selector ni revistas.
- Por defecto existe
sala1con todas las fuentes (TB1 a TB9).sala2ysala3son otras pantallas y no se pisan. - El mando está en
/remoto. La imagen está en/sala?player=sala1. - El JSON local sirve para armar otro front en esta PC: total, por sala o por una sola TV. Para otros equipos usa la API pública y consulta la guía de integración.
- Iframe y Exportar siguen para embeber sin la barra de la aplicación.
- Este manual sale del botón Manual. No cambia el visor.
2. Carpetas que se mantienen
Abre el puerto, reparte rutas y, si hace falta, el puente de TB4.
Reserva el puerto antes de iniciar tareas. Usa 127.0.0.1:4174 por defecto y reconoce una instancia ELI ya abierta sin duplicarla.
Una carpeta, nueve fuentes (TB1 a TB9). Cada una trae catálogo y resuelve su canal. El deporte de cada fuente se traduce a un solo catálogo común (por ejemplo, «Football» de TB1 pasa a Fútbol).
Junta las nueve fuentes y guarda la última copia buena.
Prueba señales en segundo plano. No tumba el video que ya se ve.
Memoria de salas. Cada nombre guarda su fuente y su canal.
JSON del visor, de la API y del control.
Visor, reproductor, remoto, sala, manual y prueba.
3. Las fuentes
Catálogo de partidos. El video es HLS y pasa por el proxy /v/…/m.m3u8. La URL de origen no sale al navegador.
Otra lista de canales. Mismo reproductor. Se elige sola o junto con las demás.
Lista de streamxhd.st. Mismo reproductor HLS.
Canales con reproductor propio. La página permitida queda detrás. El visor recorta el menú interno. No se escribe la dirección, ni en el visor ni en la sala.
Eventos con configuración privada en datos\tb5-privado.json. Sin canales configurados queda en reposo.
Canal con enlace firmado en datos\tb6-privado.json. Cuando el enlace vence hay que renovarlo.
Agenda de partidos. Solo se marca EN VIVO cuando entrega video comprobable.
Canales y partidos por país. Mismo reproductor HLS.
Catálogo amplio. Su señal se obtiene con un navegador interno, por eso se comprueba al abrir el evento y no en el barrido general.
4. Sincronía
- Al abrir, se leen las nueve fuentes. Si una falla, se conserva el catálogo anterior y el video que ya estaba.
- El visor vuelve a pedir la lista cada 12 segundos. No recarga el iframe si el canal no cambió.
- TB4 se comprueba con un navegador y avance real de video. Su lista distingue la última prueba de la reproducción actual. El barrido comparte una sola reproducción entre clientes, respeta pausas y revisa gradualmente; consultar el catálogo no reproduce todos los canales.
- Elegir un canal en el visor no cambia la sala remota. Son dos mandos distintos.
- La sala pregunta cada segundo qué canal le toca. Si el mando no cambió, no reinicia el video.
5. Remoto y WebView
Hay dos direcciones. No son la misma ventana.
- Mando:
http://127.0.0.1:4174/remoto - Pantalla de sala1:
http://127.0.0.1:4174/sala?player=sala1 - Otra pantalla: cambie el nombre, por ejemplo
sala2. Solo obedece a ese nombre.
En el mando se elige la sala, luego «todas» o una sola TV, y el canal. La sala abierta en otra ventana, o dentro de un WebView, cambia sola.
WebView de sala1 http://127.0.0.1:4174/sala?player=sala1 WebView de sala2 http://127.0.0.1:4174/sala?player=sala2
Si no hay un canal seleccionado, el televisor muestra una animación de espera. La operadora selecciona el canal en el remoto de caja; la pantalla no ofrece botones. Cada sala conserva su propia selección.
6. JSON vivo para otro front
Solo responde en esta PC. Sirve para armar su propia pantalla y cambiar el canal en el momento.
GET http://127.0.0.1:4174/api/json
GET http://127.0.0.1:4174/api/json/sala/sala1
GET http://127.0.0.1:4174/api/json/fuente/TB1
POST http://127.0.0.1:4174/api/json/sala/sala1
{"fuente":"TB4","evento_id":"ID_PUBLICADO_EN_EL_CATALOGO"}
Volver a todas las fuentes:
{"fuente":"todas","evento_id":null}
El total trae sala1 y el recuento de TB1 a TB9. Una sala trae solo lo que esa sala está usando. Una fuente trae solo esa TV. El botón JSON del visor muestra lo mismo, sin sustituir la lista ni el video.
7. Meterlo en otra aplicación
Panel local de operación http://127.0.0.1:4174 Visor público insertable, sin la barra de administración http://127.0.0.1:4174/embed Un partido ya elegido http://127.0.0.1:4174/embed?evento=EVENTO Iframe del botón Iframe copia el marco del canal que está en pantalla
Exportar abre una ventana con el video del tamaño del contenedor. No fija un tamaño de escritorio.
Estas direcciones 127.0.0.1 son locales. En otra página usa la dirección accesible del servidor ELI. Consulta la guía de integración para autenticación, IDs, LIVE y las limitaciones de HLS directo. El feed disponible es JSON/API; no hay un feed RSS o M3U permanente independiente.
8. Audio de TB4
El video de TB4 lo pinta la página permitida, dentro de un marco. El navegador suele empezarlo en silencio hasta que hay un clic en esa imagen. Un clic sobre el video habilita el sonido. ELI no puede subir el volumen desde fuera de ese marco: es la misma cerradura que impide llevarse el video.
9. Referencia Python
Esta edición ejecuta el servidor, la API, las fuentes y el puente TB4 en Python. El navegador conserva el visor y el reproductor web. Instale con INSTALAR.bat y arranque con INICIAR.bat. Para detener esta copia, presione Ctrl+C en su ventana.
10. Qué no se toca al mantener
- No borrar
public/vendorni la carpetaelidel paquete. - No publicar
clave-api.txtnicontinuidad-privada.json. - No poner direcciones de origen en el visor, en la sala ni en el remoto.
- Los adaptadores Python están en
eli/fuentes.py. Un cambio de fuente requiere revisar su normalización, resolución, encabezados, salud y pruebas. No usar la estructura de la edición Node como ruta de esta edición.
11. Mantenimiento y pruebas
La guía técnica completa está en MANTENIMIENTO.md, en la carpeta del proyecto. Ejecutar PROBAR.bat para las pruebas locales; los informes guardan fecha y resultados. Las pruebas reales de proveedores son separadas y deben hacerse secuencialmente. No borrar datos ni toda la carpeta informes: contienen estado y archivos utilizados por la aplicación.
12. Seguridad del video
Botón Seguridad del panel. Está activa por defecto y no agrega retraso: el video sigue el mismo camino.
- El reproductor solo se abre dentro de esta aplicación o de los dominios permitidos (hasta 200, se guarda solo el origen).
- Cada reproductor crea al abrirse una clave secreta que vive solo en su memoria. El video queda atado a esa clave, a la IP, al navegador y a la sesión. Si alguien copia la dirección
/v/…/m.m3u8en una extensión, VLC u otra pestaña, recibe «acceso denegado». - Opcional: bloquear inspección (F12, clic derecho). Es un freno para curiosos, no una barrera total: lo único que impide del todo copiar un video en la web es el cifrado DRM, que agrega retraso.
- En Safari (iPhone/Mac) el reproductor usa HLS nativo y no puede enviar la clave; ahí aplica la protección por IP, navegador y sesión.
- Para volver: botón «Volver al panel principal».
13. Cómo se decide EN VIVO
- Solo se marca EN VIVO una señal comprobada: lista de video que avanza y un pedazo de video real. Una página externa sin video comprobable no cuenta.
- Cada señal en vivo se vuelve a comprobar cada minuto y vale 2 minutos. El comprobador revisa hasta 16 eventos a la vez y como máximo 8 de una misma fuente, para que un proveedor lento no frene a los demás.
- Tras reiniciar, la cobertura completa tarda unos minutos en llenarse.
- En la TV, «En vivo» respeta el deporte, el país y la liga elegidos.
13b. Menú de la TV y estados
Una sola regla, calculada en el servidor (eli/duracion.py), decide el estado de cada elemento, y toda la TV la usa.
- ● En vivo: señal comprobada ahora. Partidos y canales.
- ◐ Por comenzar: partido que empieza en 60 min o menos, o cuya hora anunciada pasó hace 2 h o menos sin señal todavía.
- ○ Próximos: partido que empieza más adelante.
- Canales 24 h: canales sin partido fijo (TB2, Hípica de TB4, canales de TB8 y streamers de TB1).
- No disponible: solo en la Guía y en la búsqueda.
Menú: Inicio · En vivo · Por comenzar · Próximos · Canales 24 h · Mi lista · Guía. «Para ti» y «Tendencias» están dentro de Inicio. Los canales se agrupan por cadena (ESPN, Fox Sports, DSports, TNT, DAZN, beIN, Sky, TyC, TUDN, Win, Perú, LaLiga, Brasil, Portugal, regional, TV abierta, Hípica, Streamers) en Canales 24 h y en filas de Inicio. Un canal que no emite muestra «Fuera del aire». Cuando la fuente informa logos de los equipos (TB3), la tarjeta los muestra; si no cargan, usa el monograma propio.
13c. Guía en parrilla
Como la guía de Disney+/ESPN: columnas de 30 min con la línea de «ahora», una fila por deporte (los partidos simultáneos bajan a otra línea) y, debajo, los canales en vivo por cadena. Cada bloque dice EN VIVO con el tiempo restante, EMPIEZA a qué hora, PRÓXIMO o FINALIZADO. OK abre una ficha con imagen, horario y «VER EN VIVO»; ‹ › mueven 2 h y ⚡ vuelve a ahora. Funciona con control remoto (Android TV), teclado, mouse, táctil y móvil. TB8 y TB9 solo publican la hora: si a esa hora de hoy el partido ya habría terminado, es de mañana.
14. Diagnóstico de red
DIAGNOSTICO-RED.bat (con ELI abierto) prueba DNS, conexión y video de cada fuente, y luego pide señales nuevas a ELI solo de partidos ya empezados (fútbol primero). El resultado queda en informes\diagnostico-red.json.
15. Portadas y escudos
Botón Portadas del panel. Las fotos nuevas quedan pendientes hasta aprobarlas; las rechazadas no vuelven. La actualización semanal (escudos, portadas y optimización de imágenes) es automática.
15b. Hipódromos: país y portada propia
Las señales de hípica solo traen el nombre de la pista (por ejemplo «11:20 A.M. GULFSTREAM PARK»). ELI reconoce más de 110 hipódromos de Estados Unidos, Canadá, Latinoamérica y el resto del mundo (archivo eli/hipodromos.py) y les asigna país y región, así ya no aparecen como «Sin país informado». Las siglas que publica la fuente, como (UK), (AUS), (NZ) o (KRA), también indican el país.
Cada pista tiene su propia carpeta de portadas (img/portadas/hipica-gulfstream, etc.). DESCARGAR-PORTADAS.bat busca hasta 3 fotos por pista en Wikimedia Commons, primero las de América; quedan pendientes en Revisión de portadas hasta que las apruebes. Mientras una pista no tenga portada aprobada, usa las fotos generales de hípica.
15c. Portadas de canales
Los canales usan su portada oficial desde public/img/canales/ (formato SVG, nítido en 4K). El servidor reconoce las variantes del nombre: «ESPN2», «ESPN 2 HD» → espn-2.svg; «DirecTV Sports 2» → dsports-2.svg; «FOX SPORTS 1 ARG» → fox-sports-1.svg. La lista está en eli/canales_portada.py. Para un canal nuevo basta copiar su portada con el nombre del canal (liga1-max.jpg) o agregar una línea a esa lista.
Los canales de hípica (TVG, Capital OTB, INHTV) usan su logo como portada desde img/portadas/hipica-tvg, hipica-capital-otb e hipica-inhtv.
15d. Fuentes en cascada (TB8 y sus espejos)
TB8 lee la agenda de todos sus espejos a la vez (rojadirecta, tarjeta roja, pirlotv, elitegol, pelotalibre, futbol libre, viperplay, televisión libre, rústico TV…). Lo que publica cada espejo se suma: un evento junta las señales de todos y nunca se pisan. De una misma señal repetida en varios espejos se guardan dos (principal y respaldo). Si un espejo cae, los demás siguen; el caído se vuelve a probar en 5 minutos y, si sigue caído, la espera sube hasta 1 hora. El estado de cada espejo queda en informes/espejos-tb8.json.
15e. Herramientas de seguridad (panel de Seguridad)
Todas activas por defecto; cada una se apaga con su interruptor en /seguridad/panel.html (carpeta del módulo: eli/seguridad/ y public/seguridad/; ver eli/seguridad/LEEME-SEGURIDAD.md).
- Anti-inspección: bloquea F12, clic derecho y ver código. Si se abren las herramientas de desarrollador, con «Limpiar al detectar» se destruye el video, se cortan todas las peticiones (no se ve ningún m3u8), se borra la página y cuenta un intento.
- Video protegido: la dirección del video copiada a VLC, otra pestaña o un descargador no reproduce; muestra «Video protegido… Tu IP fue registrada» y cuenta un intento.
- Anti-scraping y programas: rechaza curl, wget, Python, Scrapy, Postman, navegadores automáticos, VLC, ffmpeg, yt-dlp, streamlink… Esta PC está exenta.
- Límite de peticiones: por defecto 150 páginas o consultas cada 10 segundos por IP (el video y las imágenes no cuentan).
- Aviso al visitante: al detectar DevTools se muestra «Transmisión detenida… tu conexión fue identificada» con IP, puerto, país y ciudad, proveedor de internet, fecha y hora, navegador, sistema e intento N de M. País y proveedor se consultan en ipwho.is (máximo 2,5 s; las IPs locales no se consultan).
- Pantalla de alerta y sirena: consola de seguridad que identifica la conexión dato por dato y marca «Intento registrado»; con la sirena activa suena una alarma de dos tonos sin parar mientras la alerta esté en pantalla, con el fondo parpadeando como sirena (el navegador solo la deja sonar si la persona ya tocó la página).
- Solicitudes registradas: el panel lista las últimas 300 solicitudes que intentaron forzar el sistema (motivo, IP y puerto, país y proveedor, página, navegador y cuántas veces) y se actualiza cada 10 segundos.
- Ficha detallada: por IP, país, región, ciudad, código postal, coordenadas aproximadas (con enlace al mapa), zona horaria, proveedor, organización y red (ASN); del equipo, modelo (en Android), sistema y versión, arquitectura, núcleos, memoria, tarjeta gráfica, pantalla, táctil, idioma y zona horaria del equipo. La ubicación exacta por GPS no es posible sin el permiso de la persona; la ubicación es aproximada por IP.
- Solicitudes guardadas: en
informes/seguridad-solicitudes.json(se conservan al reiniciar). Desde el panel se borra una, varias o todas. - IPs permitidas (equipo de desarrollo): «Permitir IP» la desbloquea y la deja inspeccionar sin alerta, sin registro y sin bloqueo; se quita con «Quitar permiso».
- Mensaje personalizado: desde la ficha de una solicitud se le escribe a esa IP; lo ve en vivo en la alerta (5 s), sobre la TV (30 s) o en la página de acceso prohibido.
- ELI Escudo (tráfico masivo): ráfagas imposibles para un humano (bloqueo inmediato), redes completas atacando (bloque /24), conexiones simultáneas por IP y «Modo bajo ataque» automático con verificación invisible para conexiones nuevas; gráfico en vivo de peticiones por segundo en el panel.
- Cortafuegos: bloqueo inmediato a quien busca agujeros (/.env, /.git, /wp-admin, ../../etc/passwd, inyección SQL o de scripts, ejecución de comandos).
- Módulo reutilizable: todo vive en
eli/seguridad/(incluidos el panel y la parte del navegador enpublico/); se conecta a otro proyecto coninstalar(app). Guía completa, mantenimiento y fase 2 (escudos en VPS):eli/seguridad/LEEME-SEGURIDAD.md. - Bloqueo de IP: con 3 intentos en 1 hora (configurable), la IP queda bloqueada de forma permanente en todo el proyecto: página «Acceso prohibido, tu IP fue registrada» o redirección a la página que elijas. Solo se levanta desde el panel («Desbloquear»). Opcional (apagado por defecto): bloqueo temporal por los minutos que indiques. Al visitante nunca se le dicen las reglas (cuántos intentos ni cuánto dura). Desde esta PC el panel siempre abre para desbloquear. Registro:
informes/seguridad-incidentes.log.
Ningún sitio web puede impedir del todo las herramientas de desarrollador: esto frena y registra a la mayoría; la defensa principal sigue siendo el servidor (tokens atados a IP, navegador, sesión y clave de página).
16. Versión
Edición 6.8.76. Los archivos reemplazados en cada entrega se guardan en ELI-STREAMING-HISTORICO.