SpletnaTV
Native Android and iOS apps for a Slovenian web TV service — live streams, VOD catalogue, multi-source video playback, and category-based browsing — all backed by WordPress REST API and the RTV SLO media platform.
Overview
As lead developer on both platforms, I owned the full build — from architecture decisions and API integration down to player lifecycle and push notifications. SpletnaTV is a Slovenian web TV service offering live streams, a VOD catalogue, and content spanning eight editorial categories (news, sports, culture, music videos, children’s programming, and sign-language broadcasts).
The Android app — written in Kotlin with Jetpack Navigation — pulls content from a WordPress REST backend and surfaces it as a paginated, category-browsable feed. Tapping any item resolves the correct video source at runtime: a direct HLS/MP4 stream via ExoPlayer, a YouTube embed via the official YouTube Android Player API, or a DRM-protected recording from the RTV SLO AVA platform that requires a live JWT exchange before playback begins.
The iOS companion app was delivered in Swift 5 / UIKit targeting iOS 16.4, providing feature parity on Apple devices. Firebase (Analytics, Crashlytics, FCM) runs across Android, complemented by a secondary push notification broker for reliability on constrained devices.
Architecture
Reading the diagram: Android (Kotlin/ExoPlayer) and iOS (Swift/UIKit) apps talk through a unified API gateway layer that wraps three backends: the WordPress CMS for posts and VOD metadata, the RTV SLO AVA platform for DRM-protected HLS streams (resolved via a two-step JWT exchange), and YouTube for embedded content. Firebase handles push, analytics, and crash reporting. A Jsoup sanitiser strips social widgets and iframes from WordPress HTML before it reaches the WebView.
Phone mockup
Six things shipped,
three hard ones solved.
Key contributions
- Built the Android app end-to-end in Kotlin — navigation architecture, multi-source player logic, paginated feeds.
- Integrated three video backends: ExoPlayer for direct HLS/MP4, YouTube Android Player API, and RTV SLO AVA for DRM-secured streams with JWT token exchange.
- Wired the WordPress REST API (
/wp-json/wp/v2/) for posts, categories, and full-text search with debounce. - Connected RTV SLO's AVA platform (
api.rtvslo.si/ava/) — fetching JWT tokens per recording and resolving the adaptivehls_secstream URL. - Built debounced real-time search (1 s delay, 3-character minimum) over the WP API.
- Configured Firebase Analytics, Crashlytics, and FCM push notifications; integrated a second push broker for custom delivery.
- Delivered the iOS companion app in Swift 5 / UIKit targeting iOS 16.4.
Challenges solved
- Three heterogeneous video sources — a direct CDN stream, YouTube embeds, and DRM-protected RTV SLO content — required branching player logic in a single detail screen.
- RTV SLO streams required a two-step token dance: fetch a JWT via one endpoint, then resolve the adaptive HLS URL via a second — all before the user taps play.
- WordPress content contained mixed HTML (iframes, gallery blocks, social share widgets) that needed server-side stripping with Jsoup before rendering in a WebView.
The hardest part wasn't streaming — it was unifying three completely different video sources behind a single tap. Each had its own auth model, URL format, and failure mode.
What's under the hood.
¿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