# ZPlay Web v9 Split Admin Pro

Versión profesional separada en:

- `backend/`
- `frontend/`

## Recomendación
Sí, separar backend y frontend es recomendable porque:

- ordena mejor el proyecto
- facilita mantenimiento
- hace más profesional el despliegue
- deja listo el camino para migrar luego a API + frontend independiente
- separa lógica de negocio y presentación

## Cómo iniciar
1. Abre la carpeta `backend`
2. Ejecuta:
```bash
npm install
npm run dev
```

## URLs
- Usuario: `http://appzpclprod.zplay.cl:3000/app/plans.html`
- Admin: `http://appzpclprod.zplay.cl:3000/admin/login.html`


## v10
- frontend más modular por páginas
- panel admin más elegante por bloques
- formularios más ordenados
- misma base de panel admin, portal clientes, membresías, pagos, recuperación, correo, backup, branding y configuración


## v10.4 SSL / Let's Encrypt
- Nueva sección SSL / Let's Encrypt en el panel admin
- Generador de comando Certbot
- Ejemplo de reverse proxy para Nginx/Apache/Caddy/IIS
- Guardado centralizado de dominio, correo y paths de certificados
- Mejora: el test SMTP ahora devuelve error controlado y no derriba el backend


## v10.5
- Se quitó el enlace al panel administrador desde el login de usuarios
- Nuevo control visual de la página de acceso cliente desde Branding y mensajes
- Campos para mensajes, logo, imagen principal y recomendaciones
- Vista previa rápida del login de usuario en el panel admin
- Nueva verificación básica SSL/HTTPS desde Configuración


## v10.6
- Subida de imágenes desde el panel para logo login, portada y favicon
- Favicon / logo del navegador configurable por branding
- Temas de color por branding (primario, acento, fondo inicial y final)
- Editor visual más elegante para la portada de login con preview en vivo
- Aplicación de branding extendida a páginas públicas del portal


## v10.7
- Nueva sección Administradores en el panel
- Creación y edición de cuentas admin desde la interfaz
- Cambio de usuario, nombre, correo, rol, estado y contraseña admin
- Permisos por sección para administradores
- Recuperación de acceso administrador por correo
- Login admin acepta usuario o correo


## v10.7.1
- corregido error JS que impedía navegar por el menú admin
- modal de administradores reubicado para evitar referencias nulas
- navegación lateral reforzada


## v10.7.2
- subida de logos de canales desde el panel admin
- vista previa del logo en el formulario de canal
- miniatura del logo en la tabla de canales


## v10.7.3
- número / orden de canal configurable desde el panel
- tabla de canales muestra el orden
- reproductor muestra el número de canal en la columna lateral
- backend y portal ordenan canales por número configurado


## v10.7.4
- imagen del pack configurable desde Planes en el panel admin
- vista expandible del pack incluido en la página pública de planes
- ajuste de tamaños en el menú lateral del reproductor para que no se vea sobredimensionado


## v10.7.5
- reproductor ajustado para mostrar la señal completa sin recortar bordes
- menú lateral del reproductor devuelto al tamaño anterior


## v10.7.6
- el sistema guarda el último canal visto por cada usuario
- al volver a ingresar, reproduce automáticamente ese último canal
- si el último canal ya no está disponible, reproduce el primero disponible


## v10.7.7
- corregida carga de logos de canales en el reproductor
- las tarjetas de canales ahora muestran el logo real si fue cargado desde el panel
- fallback automático a iniciales si el logo no carga


## v10.7.8
- el carril lateral del reproductor vuelve a mostrar solo el número del canal
- el logo se mantiene en la tarjeta principal del menú
- nuevo ajuste de tamaño del menú del reproductor desde Branding y mensajes
- botón para guardar y aplicar cambios en vivo a reproductores conectados
- el reproductor consulta cambios de branding periódicamente y actualiza el menú sin reiniciar sesión


## v10.7.9
- nuevo tamaño de menú reproductor: mini
- nuevo campo para logo del encabezado del menú del reproductor
- subida del logo del encabezado desde Branding y mensajes
- el encabezado del menú puede mostrar imagen en vez de la letra


## v10.8
- navegación del menú de canales con cursores
- izquierda abre/cierra el menú
- arriba y abajo recorren canales
- derecha o Enter reproducen el canal seleccionado
- foco visual en el canal actualmente seleccionado con teclado


## v10.8.1
- corregido fallo del reproductor que impedía mostrar canales
- corregida referencia faltante de focusedChannelIndex
- corregido logo del encabezado del menú para que no entre en recursión infinita
- navegación con cursores estabilizada


## v10.8.2
- reparado el reproductor con una versión limpia de app-player.js
- vuelve a mostrar usuario y canales correctamente
- se conserva autoplay del último canal, navegación con cursores y actualización en vivo


## v10.8.3
- ayuda del reproductor actualizada con teclas visibles
- salto directo a canal escribiendo el número con el teclado
- bloqueo de numeración duplicada de canales en backend/panel
- Esc cierra el menú y limpia el buffer de salto numérico


## v10.9
- mes gratis configurable desde el panel (días y límites)
- control antiabuso básico por correo normalizado, IP y huella de dispositivo
- bloqueo opcional de correos temporales
- el mes gratis se activa al verificar el correo
- al terminar el trial, pasa a suscripción pendiente de pago
- nuevo fondo animado para acceso clientes, cargable desde el panel
- movimiento lento y profesional de derecha a izquierda con múltiples imágenes


## v10.9.2
- gestor visual para imágenes del fondo animado en acceso clientes
- las imágenes quedan en lista dentro del panel
- puedes reordenar, reemplazar y eliminar imágenes del fondo animado


## v11.0
- carga de guía programática XMLTV desde el panel
- configuración por canal para buscar EPG por ID o nombre en el XML
- endpoint del reproductor para obtener programa actual y siguiente
- visualización de guía programática en el reproductor sobre la señal


## v11.1
- soporte para importar la guía XMLTV desde URL pública
- nuevo campo URL XMLTV en el panel
- botón "Importar desde URL"
- guarda la guía descargada en backend para usarla en el reproductor


## v11.1.1
- corregido error `parseXmltv is not defined`
- añadidas funciones internas para interpretar XMLTV y resolver EPG por canal
- protegida la guía remota para que no se sobrescriba accidentalmente al guardar configuración


## v11.1.2
- matching XMLTV más flexible (exacto y difuso)
- prueba EPG desde el panel por canal
- muestra canal XMLTV encontrado, estrategia, programa actual y siguiente
- mensaje más claro en el reproductor cuando no encuentra coincidencia


## v11.1.3
- al importar XMLTV desde URL la guía queda habilitada automáticamente
- al cargar XMLTV manualmente también queda habilitada
- el panel marca el checkbox de guía activa al importar/cargar


## v11.2
- soporte para 2 guías XMLTV a la vez
- puedes importar URL 1 y URL 2 desde el panel
- el backend une canales y programas de ambas guías para buscar coincidencias
- nuevo fondo del reproductor configurable desde el panel
- el fondo se ve muy opaco detrás del video mientras la señal carga


## v11.2.1
- reducido el filtro oscuro del reproductor
- el overlay general ahora es mucho más suave
- el fondo del reproductor ya no lleva una capa negra fuerte encima
- la señal del canal se ve más limpia y luminosa


## v11.2.2
- corregido autoplay del último canal al ingresar
- si el navegador bloquea autoplay con audio, el canal inicia en mute temporalmente
- el audio se restaura en la primera interacción del usuario
- nuevos reintentos automáticos al cargar manifest/canplay y al volver foco a la pestaña


## v11.2.3
- corregido restore de backups grandes
- límite de payload JSON aumentado a 200 MB
- soporte para formularios grandes con urlencoded 200 MB
- mensaje de error más claro cuando el restore supera el tamaño permitido


## v11.2.4
- corregido problema donde los canales quedaban en mute tras el autoplay
- cada nuevo canal intenta iniciar primero con audio
- solo usa mute temporal si el navegador bloquea autoplay con sonido
- el primer gesto del usuario restaura audio y relanza play si hace falta


## v11.2.5
- corregido scroll completo del menú de canales del reproductor
- la lista de canales ahora baja hasta el final
- la columna numérica acompaña el desplazamiento
- barra de scroll oculta visualmente


## v11.2.6
- mejora visual del carril numérico del reproductor
- la barra de números ahora queda más transparente
- el panel principal del menú pasa visualmente por encima del carril numérico
- el canal seleccionado ya no se ve cortado por la columna de números


## v11.2.7
- reforzada la superposición del panel principal sobre la columna numérica
- el borde izquierdo del canal seleccionado ya no debería verse recortado
- la columna de números queda visualmente detrás del menú principal


## v11.2.8
- revertida la superposición agresiva del carril numérico
- fondo del menú mucho más transparente
- columna numérica más discreta y limpia
- reparado el recorte visual del canal seleccionado sin tapar el menú


## v11.2.9
- aro de selección del canal cambiado a estilo interno
- eliminado el recorte visual del borde azulado
- pequeño margen lateral adicional para que la tarjeta no toque el borde del contenedor


## v11.3
- reparación del audio del reproductor
- una vez que el usuario interactúa, el sistema desbloquea audio y evita seguir reproduciendo en mute
- los cambios de canal posteriores intentan reproducir siempre con sonido
- click, touch y teclado ahora restauran audio inmediatamente


## Android TV
- Se agregó la carpeta `androidtv-app/` con el proyecto base de la app Android TV conectada al mismo backend/panel.


## v11.3.1 Android TV
- reparado sync de Android Studio eliminando plugin Compose incorrecto
- agregado soporte HLS correcto con `media3-exoplayer-hls`
- mejorada inicialización de audio en ExoPlayer
- configurados `AudioAttributes` y selección preferente de audio en español
- el canal ahora intenta reproducir con volumen 1 y `playWhenReady` al cambiar


## v11.3.2 Android TV
- corregido error de Gradle por `buildConfigField` mal escapado en Kotlin DSL
- nueva sección en el panel web: **Android TV app**
- desde el panel ahora puedes guardar:
  - Base URL por defecto de la app
  - DNS / dominio preferido
  - notas operativas
- nuevo endpoint público: `/api/public/androidtv-config`
- la app Android TV puede leer esa configuración remota y actualizar su base URL


## v11.3.3 Android TV
- reparado error `AAPT: resource style/Theme.Material3.Dark.NoActionBar`
- agregada dependencia XML de Material Components:
  - `com.google.android.material:material:1.12.0`
- tema cambiado a:
  - `Theme.Material3.DayNight.NoActionBar`
- mejora compatibilidad del proyecto con Android Studio / AAPT


## v11.3.4 Android TV
- corregidos errores Kotlin en `ZPlayTvApp.kt`
- reparado `onPreviewKeyEvent` usando `keyEvent` de forma consistente
- corregidas referencias no resueltas `type` y `key`
- agregada importación faltante de `ChannelDto`
- mejorado ingreso numérico desde D-pad / teclado usando `unicodeChar`


## v11.3.5 Android TV
- rehecho `ZPlayTvApp.kt` de forma limpia
- eliminados errores de sintaxis acumulados en el bloque de navegación por teclas
- revisada compatibilidad de imports, Compose y ExoPlayer
- conservado login, reproductor, drawer lateral, logos, EPG y último canal


## v11.3.6 Android TV
- corregidos imports de Compose para teclado:
  - `key`
  - `type`
  - `nativeKeyEvent`
- `BorderStroke` movido al paquete correcto:
  - `androidx.compose.foundation.BorderStroke`
- reemplazado `Card(onClick=...)` por `Modifier.clickable { ... }` para mayor compatibilidad
- revisión puntual del archivo principal de la app


## v11.3.7 Android TV
- corregido import inválido `nativeKeyEvent` en `ZPlayTvApp.kt`
- el acceso a `keyEvent.nativeKeyEvent` queda sin import explícito


## v11.4 Android TV
- pantalla de acceso adaptada al estilo del portal web
- removido el campo URL del login: ahora solo pide correo y contraseña
- conexión interna al backend usando la URL configurada
- `DEFAULT_BASE_URL` cambiada a `http://appzpclprod.zplay.cl:3000/`
- mapeo interno de `localhost` a `10.0.2.2` para pruebas en emulador Android TV
- icono y banner actualizados con la imagen entregada por el usuario
- cabecera y logo del drawer adaptados al estilo visual de la web


## v11.4.1 Android TV
- pantalla del reproductor Android TV ajustada para parecerse mucho más al portal web
- drawer lateral más similar al menú web: rail numérico compacto + tarjetas translúcidas
- overlays derechos reajustados con hora, canal, ahora/sigue y descripción
- cabecera superior derecha estilo portal con logo + estado EN VIVO
- barra inferior informativa y caja de usuario más cercanas al diseño web
- tipografías, tamaños y espaciados afinados para TV y aspecto casi calcado al portal


## v11.5
- Android TV: navegación con control remoto ajustada a comportamiento tipo app profesional
- Android TV: inicio de sesión por código único y temporal
- web: botón Conectar TV junto a Cerrar sesión
- Android TV: menú más compacto y parecido al portal web


## v11.5.1
- corregidos errores Kotlin del archivo `ZPlayTvApp.kt` relacionados con `type` y `key`
- cambiado el flujo de acceso TV:
  - la web muestra un **código de ingreso** persistente al lado de **Cerrar sesión**
  - el código es único, ligado al usuario y rota cada 2 minutos
  - la app Android TV ahora pide ese código debajo del login tradicional
- recomendación aplicada:
  - un solo código activo por usuario
  - expiración corta (2 min)
  - consumo único al usarlo en TV
  - rotación automática desde la sesión web


## v11.5.2
- Android TV: reforzado el manejo de control remoto haciendo el root focusable y forzando foco al reproductor
- Android TV: PlayerView configurado para no robar foco del D-pad
- Android TV: menú lateral reducido y más compacto
- Android TV: login y bloque de código pulidos visualmente
- web: bloque de “Código de ingreso” más elegante, visible y profesional


## v11.5.3
- Android TV: animación del overlay cambiada a fade in / fade out, sin desplazamiento lateral
- Android TV: navegación mejorada para permitir llegar al bloque de Cerrar sesión con el control remoto
- Android TV: EPG movido a una tarjeta inferior derecha más profesional y legible
- Android TV: pulido visual del bloque de Código de ingreso
- web: refinado extra del bloque Código de ingreso


## v11.5.4
- web: corregido el bloqueo del reproductor causado por código residual del flujo antiguo de vinculación TV
- web: inicialización del player protegida con try/catch para evitar quedar pegado
- web: bloque Código de ingreso más visible y elegante
- Android TV: menú lateral reorganizado y más compacto
- Android TV: tarjeta EPG más ordenada y liviana en la esquina inferior derecha
- Android TV: bloque Código en tu TV rediseñado con estilo más cercano a la referencia enviada
- Android TV: nuevas animaciones del drawer, manteniendo el overlay principal con fade suave


## v11.5.5
- web: bloque Código de ingreso reducido para quedar más uniforme con Cerrar sesión
- web: eliminada la barra inferior de información del reproductor
- web: panel inferior derecho más limpio y menos invasivo sobre la programación


## v11.5.6
- web: eliminada completamente la barra inferior de información del reproductor
- web: bloque Código de ingreso y Cerrar sesión reducidos de tamaño
- web: scrollbar del menú lateral rediseñado para que sea visible, elegante y útil


## v11.5.7
- eliminada completamente la barra inferior de información
- removida tanto de la versión web como de la app Android TV
- limpieza adicional para evitar que reaparezca por CSS, HTML o JS residual


## v11.5.8
- web: botón Cerrar sesión con animación hover
- web: efecto visual de botón presionado al hacer clic
- web: foco visual mejorado para interacción más profesional


## v11.6
- Android TV: pantalla de acceso rediseñada para usar solo código de ingreso
- Android TV: eliminados correo y contraseña de la pantalla inicial
- Android TV: nuevo diseño minimalista y profesional con logo, instrucciones y simbología
- Android TV: vista previa animada del código con líneas que se transforman en caracteres


## v11.6.1
- Android TV: corregido el ingreso por código para evitar el uso del teclado del sistema
- Android TV: nuevo teclado numérico en pantalla, usable con control remoto
- Android TV: soporte para ingreso directo con teclas numéricas del control si existen
- backend: códigos de TV ahora son numéricos de 6 dígitos, más apropiados para TV


## v11.6.2
- Android TV: teclado numérico con animación más elegante
- Android TV: foco visual más marcado en cada tecla del keypad
- Android TV: nueva pantalla breve de “Sesión iniciada” antes de entrar al reproductor


## v11.6.2.1
- corregido error de compilación por referencia faltante a `LoginSuccessScreen`
- agregada la pantalla breve de éxito de inicio de sesión dentro de `ZPlayTvApp.kt`


## v11.6.3
- Android TV: eliminado el keypad numérico
- Android TV: regreso a código alfanumérico de 6 caracteres
- Android TV: acceso solo con selección por control remoto, sin teclado del sistema
- Android TV: pantalla inicial rediseñada con estilo más claro, amigable y profesional
- backend: generador de códigos actualizado a formato alfanumérico seguro


## v11.6.4
- Android TV: pantalla de acceso rediseñada con una línea visual más clara y amigable
- Android TV: fondo con tarjetas en movimiento inspirado en la web
- Android TV: panel principal más moderno, con mejor jerarquía visual
- Android TV: código de ingreso alfanumérico conservado


## v11.6.4.1
- Android TV: corregidos imports faltantes de Material3
- Android TV: agregadas funciones faltantes `InstructionRow` y `CodePreviewRow`
- Android TV: reparados errores de compilación en `ZPlayTvApp.kt`


## v11.6.5
- Android TV: letras del bloque de código con mayor contraste y mejor legibilidad
- Android TV: eliminados texto secundario y campo manual en la mitad derecha
- Android TV: instrucciones movidas a la mitad izquierda
- Android TV: logo ZPlay aplicado con mayor presencia en acceso y presentación
- Android TV: ingreso por selección de caracteres alfanuméricos, sin teclado del sistema


## v11.6.6
- Android TV: mitad blanca simplificada para dejar solo el bloque visual del código y las instrucciones de conexión
- Android TV: eliminado el teclado visible y el campo manual marcados por el usuario
- Android TV: logo ZPlay reforzado en inicio y presentación


## v11.6.6.2
- Android TV: agregado campo para escribir el código en la sección blanca
- Android TV: botón Ingresar código ahora muestra estado de verificación
- Android TV: mensaje de resultado visual al rechazar acceso
- Android TV: pantalla de éxito muestra “Acceso aceptado”


## v11.6.6.3
- Android TV: mitad izquierda rediseñada con logo centrado ZPlay
- Android TV: recuadro principal ahora contiene instrucciones de conexión claras y mejor redactadas
- Android TV: mejor jerarquía visual entre branding e instrucciones


## v11.6.6.4
- Android TV: logo de acceso movido más arriba para mejorar el orden visual
- Android TV: mitad izquierda refinada con estilo más limpio y elegante
- Android TV: paleta más suave y luminosa, con una línea más sobria tipo premium
- Android TV: instrucciones reordenadas para una lectura más clara y profesional


## v11.6.6.5
- Android TV: ajustado el tamaño del logo con nueva versión blanca y fondo transparente
- Android TV: logo reposicionado más arriba para mejorar el orden visual
- Android TV: mitad izquierda reorganizada para una composición más limpia y equilibrada
- Android TV: refinada la paleta para una sensación más sobria y premium


## v11.6.6.6
- Android TV: corregido el recorte del paso 3 en las instrucciones
- Android TV: bloque de instrucciones más alto y mejor espaciado
- Android TV: nueva paleta profesional y amigable, con tonos azul pizarra, lavanda y acero
- Android TV: refinados fondos y tarjetas para evitar contraste excesivo blanco/negro


## v11.6.6.7
- Android TV: aumentada la altura útil del panel izquierdo
- Android TV: logo movido más arriba para liberar espacio
- Android TV: bloque de instrucciones más alto para evitar recorte del paso 3


## v11.6.6.8
- Android TV: actualizado texto de instrucciones 1 y 2


## v11.6.6.9
- Android TV: instrucciones actualizadas a 4 pasos según texto solicitado


## v11.7
- Panel admin: nueva gestión profesional de fondos para inicio Android TV
- Panel admin: agregar, eliminar y reordenar imágenes del fondo Android TV
- App Android TV: lee fondos desde el panel sin recompilar
- App Android TV: movimiento lento o muy lento configurable
- Recomendado: usar entre 6 y 10 imágenes optimizadas, ideal 1920x1080


## v11.7.1
- Android TV: ajustado el espaciado entre instrucciones 3 y 4
- Android TV: mejorado el bloque de instrucciones para evitar saltos visuales extraños
- Android TV: mensaje visible de código erróneo debajo del botón Ingresar código
- Android TV: validación local para mostrar rechazo cuando el código no es válido o incompleto


## v11.7.2
- Android TV: eliminado el espacio sobrante entre instrucciones 3 y 4
- Android TV: bloque de instrucciones reordenado para mantener continuidad visual
- Android TV: corregida la visualización del mensaje “Código erróneo o no válido”
- Android TV: ahora muestra rechazo tanto por código incompleto como por código inválido del backend


## v11.7.3
- Android TV: actualizado icono y banner de la app usando la imagen entregada por el usuario (2526fd33-16f8-428b-97fb-c8cfa12a6d4f.png)
- Android TV: icono adaptado para que la imagen se vea completa, centrada y sin recortes bruscos


## v11.7.4
- Android TV: reproductor reorganizado para parecerse más al portal web
- Android TV: eliminado cualquier bloque de código del reproductor; esa función queda exclusiva de la web
- Android TV: overlay derecho rediseñado con hora, canal, ahora, sigue y descripción en estilo web
- Android TV: bloque inferior derecho simplificado a usuario + cerrar sesión
- Android TV: autoselección del canal actual/primero si la sesión entra sin canal activo


## v11.7.5
- Android TV: guía del reproductor sin recuadro, alineada al estilo de la web
- Android TV: hora, canal, ahora, sigue y descripción quedan fuera de tarjeta
- Android TV: overlay derecho más limpio y más parecido al portal web


## v11.7.5.1
- Android TV: reparado `RightInfoOverlay` en `ZPlayTvApp.kt`
- Android TV: corregidos errores de compilación causados por un bloque incompleto de la guía
- Android TV: overlay EPG mantiene estilo sin recuadro, similar a la web


## v11.7.6
- Android TV: simbología del reproductor movida a la parte inferior izquierda
- Android TV: guía de uso más compacta y sin fondo pesado
- Android TV: botón de menú se mantiene arriba para acceso rápido
- Android TV: texto con estilo más limpio y ligero, inspirado en referencia visual del usuario


## v11.7.7
- Android TV: guía de uso en estilo más TV premium
- Android TV: flechas y Enter ahora usan iconos más finos en lugar de texto plano
- Android TV: simbología inferior izquierda con apariencia más elegante y limpia


## v11.7.8
- Android TV: guía rápida inferior izquierda bajada levemente para mantener visibilidad al abrir el menú de canales


## v11.7.9
- Android TV: guía rápida inferior izquierda bajada un poco más para quedar por debajo visual del menú de canales


## v11.7.10
- Android TV: guía rápida inferior izquierda bajada un ajuste adicional fino


## v11.7.11
- Android TV: guía rápida inferior izquierda bajada un poco más
- Android TV: overlay derecho reducido en tamaño (hora, canal, ahora y sigue)
- Android TV: descripción del programa limitada a un ancho más corto, evitando cubrir de extremo a extremo
- Android TV: descripción con texto más pequeño y máximo 2 líneas


## v11.7.11.1
- Android TV: corregido error de compilación por `widthIn`
- Android TV: agregado import faltante en `ZPlayTvApp.kt`


## v11.7.11.3
- Android TV: icono y banner rehechos con nombres de recurso nuevos para evitar caché del launcher
- Android TV: manifest actualizado para usar directamente `tv_banner_brand`
- Android TV: logos internos alineados a la misma imagen entregada por el usuario
- Android TV: versión incrementada para forzar refresco visual al reinstalar


## v11.7.12.1
- Android TV: flujo de inicio revisado y endurecido para evitar cierres al ingresar el código
- Android TV: carga remota y restauración de sesión ahora son secuenciales, evitando carreras de estado
- Android TV: el reproductor autoselecciona el canal actual o el primero disponible si la sesión entra sin canal activo
- Android TV: PlayerView ajustado para un render más robusto (zoom, pantalla activa, shutter transparente)
- Android TV: mensaje claro cuando la cuenta no tiene canales disponibles


## v11.7.12.2
- Android TV: corregido `PlayerViewModel.kt` en `applyRemoteConfigSafe`
- Android TV: reparado error de compilación provocado por `split("\n")` mal insertado
- Android TV: revisado el bloque de carga de configuración remota para evitar nuevas roturas sintácticas


## v11.7.12.3
- Android TV: corregida una causa probable de cierre al entrar al reproductor (`padding` negativo reemplazado por `offset`)
- Android TV: logo blanco/transparente `ACTION (52)` aplicado nuevamente a la pantalla de inicio
- Android TV: carga del reproductor endurecida con `runCatching` en el enlace del `PlayerView`
- Android TV: reproducción inicial del canal envuelta para evitar cierres por carga de media


## v11.8
- Android TV: ingreso por código rápido con una sola llamada (`/api/tv/pairings/use-code`)
- Android TV: sesión persistente por dispositivo con `deviceId` + `deviceToken`
- Android TV: la app ya no debería pedir código al reabrir mientras el dispositivo siga activo
- Android TV: el backend vuelve a pedir código solo si el usuario cerró sesión, venció la suscripción, expiró la sesión del dispositivo o el panel lo revocó
- Backend/panel: agregados `tvDevices`, `persistentDays`, listado de dispositivos y revocación desde admin
- Android TV: se mantiene el logo blanco/transparente en pantalla de inicio


## v11.8.1
- Android TV: logos de canales corregidos al resolver rutas relativas igual que en la web
- Android TV: backdrop del reproductor también resuelve URL relativa
- Android TV: la app se cierra al salir al launcher, evitando que siga sonando el audio en segundo plano


## v11.8.1.1
- Android TV: corregido error de compilación en `PlayerViewModel.kt` (`String(url ?: "")` -> `(url ?: "")`)
- Android TV: resolución de URLs relativas aplicada también al flujo de sesión persistente del dispositivo
- Android TV: logos de canales y backdrop del reproductor corregidos también al restaurar sesión TV
- Android TV: logo blanco/transparente `ACTION (52)` mantenido en la pantalla de inicio


## v11.8.1.2
- Android TV: corregida carga de logos de canales en menú
- Android TV: agregado soporte explícito para SVG con Coil
- Android TV: fallback visual con iniciales del canal si el logo falla
- Android TV: soporte adicional para URLs relativas y scheme-relative (`//`)


## v11.8.1.3
- Android TV: corregida carga de logos remotos añadiendo `coil-network-okhttp`
- Android TV: `ChannelLogo` ahora usa un `ImageLoader` con `OkHttpClient` y las mismas cookies de sesión que la app
- Android TV: soporte reforzado para logos SVG, HTTP/HTTPS, data URLs y rutas `//`
- Android TV: fallback con iniciales se mantiene solo si el logo realmente falla


## v11.8.1.5
- Android TV: eliminado `io.coil-kt:coil-network-okhttp:2.7.0` porque no existe para Coil 2.7.0 y rompía la compilación
- Android TV: corregida anotación duplicada `@Composable@Composable`
- Android TV: mantenida la URL base `http://appzpclprod.zplay.cl:3000/`
- Android TV: revisión de consistencia en `PlayerViewModel.kt` y `ZPlayTvApp.kt`


## v11.8.1.7
- Android TV: corregido `defaultBaseUrl` remoto para que ya no vuelva a `http://localhost:3000/`
- Android TV: `dnsName` corregido a `appzpclprod.zplay.cl` sin esquema `http://`
- Android TV: `DEFAULT_BASE_URL` de compilación actualizado a `http://appzpclprod.zplay.cl:3000/`
- Backend: `systemConfig.androidTv` persistido con la URL correcta del panel productivo
- Revisión: eliminadas referencias críticas a localhost en configuración principal


## v11.8.1.8
- Unificadas las correcciones de URL base productiva y reconocimiento de código
- Backend: normalización robusta de código (`0/O`, `1/I`, limpieza de símbolos)
- App Android TV: normalización del código antes de enviarlo
- Backend: errores más claros en `/api/tv/pairings/use-code`
- Persistida la URL productiva correcta en `db.json` y configuración remota


## v11.8.1.9
- Android TV: autocorrección de URL guardada localmente si una versión antigua dejó `localhost`, `127.0.0.1` o `10.0.2.2`
- Android TV: la config remota ahora usa `dnsName` como rescate aunque `defaultBaseUrl` llegue incorrecto
- Android TV: `normalizeBaseUrl` fuerza el dominio productivo `http://appzpclprod.zplay.cl:3000/` cuando detecta una URL local heredada
- Android TV: errores de ingreso por código ahora incluyen la URL efectiva usada por la app
- Backend: `db.json` y defaults siguen fijados a la URL productiva


## v11.8.2
- Panel admin: nueva sección **Auditoría Android TV**
- Backend: registro de eventos para configuración, generación de código, autenticación por código y restauración de sesión
- Configuración: opciones para habilitar auditoría y definir máximo de entradas
- Útil para diagnosticar si la app Android TV realmente llega al backend y en qué paso falla


## v11.8.2.1
- Android TV: compatibilidad directa con logos de canal cargados en el panel como `data:image/...;base64,...`
- Android TV: `ChannelLogo` ahora intenta decodificar imágenes base64 antes de usar carga remota
- Android TV: mantiene soporte para logos HTTP/HTTPS y SVG
- Android TV: fallback a iniciales solo si el logo realmente no pudo decodificarse o cargarse


## v11.8.2.2
- Android TV: menú de canales reducido y más compacto
- Android TV: rail numérico, tarjetas, textos y logos ajustados para mejor proporción en pantalla
- Android TV: diseño más equilibrado y profesional, manteniendo legibilidad


## v11.8.2.3
- Android TV: `Enter` en la simbología ya no usa fondo/cápsula, ahora queda igual al resto
- Web: simbología del reproductor movida a la parte inferior izquierda, igual que en la app
- Web: ayuda de controles rediseñada para coincidir visualmente con Android TV


## v11.8.2.4
- Web: menú del reproductor más transparente y ligero
- Web: simbología inferior izquierda con fondo totalmente transparente
- Web: ajuste visual más limpio y profesional sin tocar la app Android TV


## v11.8.2.5
- Backend: actualización automática del EPG todos los días a las 03:00 AM
- Backend: scheduler interno que revisa cada minuto y ejecuta la descarga solo una vez por día
- Backend: actualización desde `sourceUrl` y `sourceUrl2` si están configuradas
- Panel: control para habilitar/deshabilitar auto actualización y definir hora
- Panel: botón para actualizar EPG manualmente y ver último estado de actualización
- Web y app Android TV consumen la guía ya actualizada porque el backend refresca el XMLTV centralmente


## v11.8.2.7
- Android TV: la app ya no vuelve a mostrar la pantalla de código mientras exista una sesión de dispositivo vigente
- Android TV: al iniciar o reabrir, primero intenta restaurar sesión antes de mostrar login
- Android TV: nueva pantalla de “Restaurando sesión” para evitar que el usuario vea el ingreso por código cuando la sesión sigue válida
- Android TV: la pantalla de código solo vuelve a aparecer si no existe sesión válida, si el usuario cerró sesión, si el administrador revocó el dispositivo o si la suscripción ya no permite acceso


## v11.8.3
- agregado proyecto móvil Android en carpeta `movil/`
- inicio vertical para teléfono
- reproductor horizontal
- interfaz táctil basada en la app Android TV
- misma integración con panel, códigos, canales, sesión persistente y EPG


## v11.8.3.1
- móvil: pantalla de inicio ahora usa correo electrónico y contraseña como la web
- móvil: diseño visual vertical inspirado en la referencia entregada por el usuario
- móvil: mantiene logos ZPlay y fondo de imágenes con movimiento lento
- móvil: reproductor sigue pasando a horizontal al ingresar


## v11.8.3.2
- móvil: flujo de login corregido para entrar al reproductor de forma directa después de autenticar correo y contraseña
- móvil: ya no depende de un restore intermedio para abrir canales tras el login
- móvil: diseño de inicio pulido con estilo más premium y coherente con la referencia
- móvil: ajustes visuales en top bar, hoja de canales y estados del reproductor


## v11.8.3.2.1
- móvil: corregido error de compilación en `MobileTopBar`
- faltaba una coma en la llamada a `Row(...)` antes de `verticalAlignment`


## v11.8.3.2.2
- móvil: la pantalla “Restaurando sesión” ahora solo aparece si realmente existe una sesión previa del dispositivo o mientras termina el bootstrap inicial
- móvil: un inicio nuevo muestra directamente el login por correo, sin quedarse atrapado en restauración
- móvil: campos de correo y contraseña con texto blanco y mejor contraste sobre fondo oscuro
- móvil: flujo afinado entre login nuevo y restauración de sesión persistente


## v11.8.3.3
- móvil: autenticación reforzada con sesión por cookies y restauración correcta de sesiones previas
- móvil: conexión HTTP más estable forzando HTTP/1.1 y mejor manejo de cierres inesperados del stream
- móvil: mensajes de error más claros para problemas de conectividad con el panel
- móvil: reproductor y navegación táctil pulidos para un look más comercial
- móvil: hoja de canales y overlays ajustados visualmente


## v11.8.3.4
- móvil: eliminado el paso intermedio de “Acceso aceptado” que provocaba el cambio repetido entre vertical y horizontal
- móvil: ahora, después del login correcto, entra directo al reproductor
- móvil: durante el ingreso se muestra estado inline (“Ingresando…”) en la misma pantalla de login
- móvil: orientación fijada de forma más estable (portrait/landscape) para evitar rebotes
- móvil: agregado estado de “Preparando reproductor” mientras se cargan canales y configuración
- móvil: al iniciar login por correo se limpia sesión TV residual para que no compita con el acceso móvil


## v11.8.3.5
- móvil: login corregido con guardado explícito de sesión en backend (`req.session.save`)
- móvil: la app ahora hace bootstrap con reintentos después del login antes de mostrar error
- móvil: corregido el caso donde decía “La sesión se creó, pero no se pudo validar el usuario”
- móvil: transición más confiable desde login al reproductor


## v11.8.3.6
- móvil: nuevo endpoint backend `/api/mobile/login-bootstrap` para autenticar y entregar canales/configuración en una sola llamada
- móvil: se evita la carrera entre login, guardado de cookie y validación posterior
- móvil: limpieza de cookies/sesiones residuales antes de un login nuevo
- móvil: cliente HTTP simplificado quitando forzado de `Connection: close` y protocolo fijo
- móvil: mensajes de error HTTP más claros


## v11.8.3.6.1
- móvil: corregido error de compilación por import duplicado de `retrofit2.HttpException`
- móvil: limpieza de imports duplicados en archivos Kotlin del proyecto `movil/`
- revisión enfocada en el bloqueo actual de compilación mostrado en Android Studio


## v11.8.3.6.2
- móvil: revisión general del flujo de sesión y reproductor
- móvil: la configuración remota ahora usa `sanitizeRemoteBaseUrl(...)` para no romper la base URL si el panel devuelve un valor incorrecto
- móvil: el login bootstrap ahora resuelve correctamente URLs relativas de logos y streams antes de entrar al reproductor
- móvil: restauración de sesión deja el estado limpio si la sesión persistida ya no es válida
- móvil: mensajes de error HTTP afinados para casos de credenciales/sesión


## v11.8.3.6.3
- móvil: agregado logo de app en recursos y encabezados visuales
- móvil: menú de canales rediseñado al costado izquierdo, inspirado en Android TV pero ajustado a pantalla de celular
- móvil: carga de logos de canal mejorada con soporte para URLs remotas, SVG y data:image base64
- móvil: logos y tarjetas ajustados para permanecer completamente dentro de pantalla, sin cortes
- revisión enfocada en la experiencia general de la app móvil


## v11.8.3.6.4
- móvil: el logo nuevo queda solo como icono de launcher de Android
- móvil: dentro de la app se restauró el logo visual anterior de ZPlay


## v11.8.3.6.5
- móvil: reproductor ajustado para mostrar el video centrado/adaptado a pantalla, sin recorte agresivo
- móvil: menú lateral de canales reposicionado y reducido para teléfonos, inspirado en Android TV pero adecuado al ancho del celular
- móvil: logos de canal reforzados con fallback visible siempre dentro del cuadro
- móvil: mensaje “Toca la pantalla para mostrar controles” ahora aparece solo por unos segundos y luego desaparece
- móvil: overlays del reproductor refinados para una visual más comercial y equilibrada


## v11.8.3.6.6
- móvil: menú lateral de canales más largo
- móvil: fondo del drawer más transparente
- móvil: espaciado interno ajustado para aprovechar mejor la altura visible


## v11.8.3.6.7
- móvil: menú lateral de canales ampliado para llenar mejor el espacio visible
- móvil: fondo del drawer más transparente
- móvil: eliminado por completo el mensaje “Toca la pantalla para mostrar controles”
- móvil: ajuste fino del tamaño del menú para acercarlo al layout solicitado


## v11.8.3.6.7.1
- móvil: corregido error de compilación en `MobilePlayerScreen`
- `AnimatedVisibility(...)` fue sacado de un `LaunchedEffect(...)`, que era la causa del error `@Composable invocations can only happen...`


## v11.8.3.6.8
- móvil: menú lateral expandido más hacia abajo
- móvil: toque simple vuelve a mostrar overlays y controles
- móvil: doble toque abre/cierra el menú de canales
- móvil: overlays permanecen más tiempo visibles antes de ocultarse


## v11.8.3.6.8.1
- móvil: corregido error de compilación por llave `}` extra en `MobilePlayerScreen`
- reparación directa del bloqueo `Expecting a top level declaration`


## v11.8.3.6.8.2
- móvil: toque simple vuelve a mostrar overlays y controles del reproductor
- móvil: doble toque abre/cierra el menú de canales
- móvil: toque largo abre el menú de canales
- móvil: eliminado por completo el texto de ayuda en pantalla
- móvil: overlays visibles por 6 segundos antes de ocultarse


## v11.8.3.6.8.3
- móvil: reconstruido `MobilePlayerScreen` para corregir llaves desbalanceadas y errores de compilación
- móvil: toque simple vuelve a mostrar overlays, doble toque abre/cierra menú, toque largo abre menú
- móvil: mantenidas las mejoras del drawer y overlays de versiones anteriores


## v11.8.3.6.8.4
- móvil: agregadas zonas táctiles invisibles a izquierda y derecha del reproductor
- tocar sector izquierdo cambia al canal anterior
- tocar sector derecho cambia al canal siguiente
- los botones son invisibles, sin alterar la estética visual del player


## v11.8.3.6.8.5
- móvil: quitadas flechas visibles izquierda/derecha del top bar
- móvil: zonas táctiles invisibles laterales quedan detrás del menú superior y del botón de menú
- móvil: al salir o mandar la app al fondo, la actividad se cierra para evitar audio en segundo plano
- móvil: pantalla se mantiene encendida mientras el reproductor está abierto


## v11.8.3.6.8.6
- móvil: modo pantalla completa real, ocultando barra superior e inferior del teléfono
- móvil: la app reoculta barras del sistema al recuperar foco
- móvil: nueva simbología inferior izquierda estilo OTT, moderna y discreta
- móvil: top bar ajustado para aprovechar mejor el fullscreen


## v11.8.3.6.8.7
- móvil: simbología inferior izquierda refinada a estilo más premium
- móvil: iconos más finos y menos texto
- móvil: fondo totalmente transparente en la barra de ayuda OTT


## v11.8.3.6.8.8
- móvil: el botón Salir ahora pide confirmación antes de cerrar sesión
- diálogo con opciones Aceptar y Cancelar
- el cierre de sesión solo ocurre si el usuario confirma


## v11.8.3.6.8.9
- móvil: fondo del login rediseñado como collage inclinado de imágenes, inspirado en la referencia del usuario
- móvil: las imágenes se mueven de derecha a izquierda con desplazamiento lento
- panel: la sección de fondos ahora indica claramente que también alimenta el login de la app móvil


## v11.8.3.6.9
- móvil: fondo del login refinado para parecerse más a la referencia visual
- collage con tarjetas más grandes, mejor inclinación y composición superior más protagonista
- desplazamiento continuo de derecha a izquierda
- gradiente reforzado para dejar una zona inferior más limpia y premium


## v11.8.3.6.9.1
- móvil: el botón “Ingresar a mi cuenta” ahora muestra estado de carga visible
- móvil: durante el login aparece “Ingresando...” con indicador de progreso
- móvil: se muestra mensaje explicando que se está validando el acceso y preparando la app
- móvil: el botón queda deshabilitado mientras dura el proceso de autenticación


## v11.8.3.6.9.2
- móvil: botón Salir elevado por delante de las zonas táctiles invisibles
- móvil: menú superior con mayor prioridad visual y táctil
- móvil: zonas laterales invisibles para cambio de canal reducidas de tamaño
- móvil: zonas táctiles ahora evitan interferir con menú y botón Salir


## v11.8.3.6.9.4
- móvil: corregido de raíz el botón Salir
- el diálogo de confirmación vuelve a estar presente en pantalla
- el detector táctil global del reproductor ya no intercepta toques del top bar
- ahora la detección de toques para overlays/canales se hace en una capa separada detrás de los controles
- zonas invisibles laterales reducidas aún más


## v11.8.3.6.9.5
- móvil: fondo del reproductor ajustado a negro


## v11.8.3.6.9.6
- corregida la carga de imágenes del fondo de inicio desde el panel
- las rutas de las imágenes ahora se resuelven correctamente antes de mostrarse
- ajuste aplicado en móvil y Android TV para evitar fondos vacíos por URLs relativas


## v11.8.3.6.9.7
- móvil: revisión minuciosa del botón Salir
- MobilePlayerScreen reconstruido para incluir de forma explícita el diálogo de confirmación
- diálogo de logout ahora vive en la capa raíz del player, fuera de AnimatedVisibility
- botón Salir convertido a Box clickable con prioridad táctil alta
- zonas invisibles laterales reducidas y alejadas de los controles superiores


## v11.8.3.6.9.8
- móvil: corregido el flujo posterior al logout
- el estado ya no vuelve con `isLoading = true` después de cerrar sesión
- al aceptar “Salir”, la app vuelve limpia al login sin quedarse pegada en “Cargando”


## v11.8.3.7.0
- panel reorganizado con navegación agrupada y dashboard más ejecutivo
- mejora visual general del admin para una apariencia más profesional y ordenada
- accesos rápidos internos para canales, usuarios, pagos, branding y configuración


## Ubuntu deployment bundle
- agregado instalador Ubuntu en `deploy/ubuntu/`
- instalación simple desde ZIP local o URL
- crea servicio systemd, Nginx, logs y persistencia de datos
- pensado para dejar el panel más estable y menos propenso a quedarse pegado


## Ubuntu deployment bundle v2
- agregada versión mejorada del instalador Ubuntu
- SSL opcional con Certbot
- backup previo a actualización
- hardening adicional de systemd y Nginx
- instalación simple desde ZIP o URL
