SpletnaTV
Aplicaciones nativas de Android e iOS para un servicio de TV web eslovena — transmisiones en vivo, catálogo VOD, reproducción de vídeo desde múltiples fuentes y navegación por categorías — todo respaldado por WordPress REST API y la plataforma de medios de RTV SLO.
Resumen
Como desarrollador principal en ambas plataformas, asumí toda la construcción — desde las decisiones de arquitectura y la integración de APIs hasta el ciclo de vida del reproductor y las notificaciones push. SpletnaTV es un servicio esloveno de TV web que ofrece transmisiones en vivo, un catálogo VOD y contenido que abarca ocho categorías editoriales (noticias, deportes, cultura, videoclips musicales, programación infantil y emisiones en lengua de signos).
La aplicación Android — escrita en Kotlin con Jetpack Navigation — obtiene contenido desde un backend WordPress REST y lo presenta como un feed paginado y navegable por categorías. Al tocar cualquier elemento, en tiempo de ejecución se resuelve la fuente de vídeo correcta: un flujo HLS/MP4 directo vía ExoPlayer, un embebido de YouTube mediante la YouTube Android Player API oficial, o una grabación protegida con DRM de la plataforma RTV SLO AVA que requiere un intercambio JWT en vivo antes de iniciar la reproducción.
La aplicación complementaria de iOS se entregó en Swift 5 / UIKit dirigida a iOS 16.4, ofreciendo paridad de funciones en dispositivos Apple. Firebase (Analytics, Crashlytics, FCM) funciona en toda la versión Android, complementado por un broker secundario de notificaciones push para fiabilidad en dispositivos con recursos limitados.
Arquitectura
Leyendo el diagrama: las aplicaciones Android (Kotlin/ExoPlayer) e iOS (Swift/UIKit) se comunican a través de una capa unificada de pasarela API que envuelve tres backends: el WordPress CMS para entradas y metadatos VOD, la plataforma RTV SLO AVA para flujos HLS protegidos con DRM (resueltos mediante un intercambio JWT en dos pasos) y YouTube para contenido embebido. Firebase gestiona push, analítica y reportes de fallos. Un saneador Jsoup elimina widgets sociales e iframes del HTML de WordPress antes de que llegue al WebView.
Lo más difícil no fue el streaming — fue unificar tres fuentes de vídeo completamente distintas tras un único toque. Cada una tenía su propio modelo de autenticación, formato de URL y modo de fallo.
Seis cosas entregadas,
tres difíciles resueltas.
Contribuciones clave
- Construí la aplicación Android de extremo a extremo en Kotlin — arquitectura de navegación, lógica del reproductor multi-fuente, feeds paginados.
- Integré tres backends de vídeo: ExoPlayer para HLS/MP4 directo, YouTube Android Player API y RTV SLO AVA para flujos protegidos con DRM mediante intercambio de tokens JWT.
- Conecté la WordPress REST API (
/wp-json/wp/v2/) para entradas, categorías y búsqueda de texto completo con debounce. - Conecté la plataforma AVA de RTV SLO (
api.rtvslo.si/ava/) — obteniendo tokens JWT por grabación y resolviendo la URL del flujo adaptativohls_sec. - Implementé búsqueda en tiempo real con debounce (1 s de retardo, mínimo 3 caracteres) sobre la WP API.
- Configuré Firebase Analytics, Crashlytics y notificaciones push FCM; integré un segundo broker push para entrega personalizada.
- Entregué la aplicación complementaria de iOS en Swift 5 / UIKit dirigida a iOS 16.4.
Desafíos resueltos
- Tres fuentes de vídeo heterogéneas — un flujo CDN directo, embebidos de YouTube y contenido de RTV SLO protegido con DRM — requerían lógica de reproductor ramificada en una sola pantalla de detalle.
- Los flujos de RTV SLO requerían un baile de tokens en dos pasos: obtener un JWT mediante un endpoint y luego resolver la URL HLS adaptativa mediante otro — todo antes de que el usuario pulsara play.
- El contenido de WordPress contenía HTML mixto (iframes, bloques de galería, widgets de compartir en redes sociales) que debía limpiarse en el servidor con Jsoup antes de renderizarse en un WebView.
Cliente
Llevamos años trabajando con Numen — desde el portal de reservas hasta la aplicación del museo y las herramientas de accesibilidad. Davor entiende de verdad las necesidades de la comunidad sorda y con dificultades auditivas.
Qué hay bajo el capó.
¿Listo para arreglar, construir
o escalar?
30 minutos, conmigo personalmente. Leo tu sistema como un archivo de logs y te digo qué haría primero. Sin presentaciones, sin embudo de ventas.
— Davor Majc, fundador, Numen





