Как выглядит IPTV-плеер для Android TV, который написали на Kotlin и Compose
Знакомая картина? Приставка куплена, подписка у провайдера оплачена, а смотришь всё это через плеер, который заточен под телефон: кнопки мелкие, пульт работает через раз, EPG подгружается вечно. Я не раз ловил себя на том, что на телевизоре ищу канал дольше, чем смотрю его.
Вот на этом месте мне и попался OwnTV — нативный плеер для Android TV, который написан на Kotlin с Jetpack Compose for TV и явно проектировался под пульт, а не под палец на тачскрине.
Что это такое
OwnTV это плеер и только плеер. Никаких каналов, плейлистов и подписок в комплекте. Вы приносите свои источники: логин Xtream, плейлист M3U (по ссылке или локальным файлом) либо портал Stalker/Ministra с MAC-адресом. Авторы прямо пишут, что за легальность источников отвечает пользователь, и это честная позиция для такого класса софта.
Проект распространяется под GPLv3, код оригинальный, а в бейджах на странице репозитория висит любопытная плашка про помощь ИИ при разработке. На момент, когда я смотрел репозиторий, там около 470 звёзд и почти сотня форков.
Сразу оговорюсь про минусы. Приложение только для Android TV: ни телефона, ни планшета, только leanback-лаунчер и D-pad. Хотите на мобильном — есть отдельный репозиторий OwnTV Mobile на том же ядре. Документация разбросана по нескольким файлам в папке extras/, и без User Guide разбираться в настройках придётся дольше обычного.
Два движка воспроизведения
Самое интересное техническое решение. Внутри работают сразу два плеера за одним интерфейсом PlaybackEngine:
- libmpv на базе FFmpeg — для максимальной совместимости с кодеками, аудио и HDR;
- ExoPlayer (Media3) — для быстрого старта живого эфира и HLS.
Между ними есть автоматическая лестница отката из четырёх ступеней, если поток не завёлся. А ещё можно вручную задать, какой движок стартует для Live TV, а какой для фильмов и сериалов: в любом порядке или вообще отключить автопереключение. В настройках это выглядит как обычный переключатель, но под капотом это довольно аккуратная инженерная работа.
Отдельно радует, что живой эфир умеет переходить из мини-плеера на весь экран без перезагрузки потока. Мелочь, а нервы экономит.
Что ещё внутри
Мультивью. До четырёх каналов на одном экране одновременно, звук идёт с одного. Приложение само считает, сколько потоков пускает ваш провайдер, и предупреждает, прежде чем тот откажется отдавать ещё один. В моей практике это самая частая причина «почему не работает» — хорошо, что тут об этом подумали.
Запись эфира. Можно писать прямо из гид-сетки, из списка каналов или во время просмотра. Причём не только текущий показ, но и все сеансы программы.
Гид (EPG). XMLTV парсится потоково с учётом gzip и попадает в скользящее окно, которое потом подчищается. Есть метка «сейчас», несколько источников гида и автоматическое сопоставление каналов. Плюс Catch-up TV до семи дней и функция «вернуться к...» даже для каналов без гида.
Метаданные TMDB. Постеры, описания, актёры и трейлеры на 40 языках. README обещает масштабирование примерно до 50 тысяч каналов и 168 тысяч фильмов. Кстати, в разделе Home есть подборка Now Trending, где рейтинги TMDB пересекаются с тем, что ваш провайдер реально может отдать. Простая идея, а пользы много.
Профили. Несколько профилей со своими избранными, историей и точками возобновления, PIN-замки и детский режим. Стартовый экран тоже настраивается на каждый профиль отдельно.
Настройка с телефона. Добавить источник можно с мобильного по Wi-Fi через QR-код и PIN. Новую приставку можно поднять, скопировав всё с уже настроенного устройства OwnTV по локальной сети. Это предлагают на первом экране, а не прячут в глубине меню.
Технические детали
Стек тут современный и без экзотики:
| Область | Выбор | |---|---| | Язык | Kotlin 2.4.20 | | Сборка | AGP 9.4.0 / Gradle 9.7.1, KSP2 | | UI | Compose for TV, Compose BOM 2026.08.00 | | Медиа | libmpv (FFmpeg) и ExoPlayer/Media3 1.11.1 | | Данные | Room 2.8.5, Paging 3.5.1, FTS4 | | DI и сеть | Koin 4.2.2, OkHttp 5, Coil 3.6.0 |
Интересно устроена работа с памятью. M3U читается построчно, а JSON от Xtream разбирается через JsonReader, поэтому огромный ответ провайдера никогда не буферизуется целиком. Схема базы на 27 сущностей плюс FTS4 для поиска, а Paging 3 с ограниченным окном держит память ровной на списках в десятки тысяч элементов.
Ещё деталь, которая выдаёт внимание к мелочам: в проекте нет плагина kotlin-android. AGP 9 несёт собственный Kotlin, но плагин компилятора Compose подтягивает версию Kotlin Gradle plugin из gradle/libs.versions.toml. Авторы отдельно предупреждают держать эти версии синхронными. Такие заметки обычно появляются после пары вечеров отладки.
Код разделён на три репозитория: сама TV-оболочка, ядро OwnTV_Core с базой, парсерами и движками, и мобильное приложение. Ядро опубликовано в Maven, и Gradle скачивает его сам, без токенов и аккаунтов.
Собрать из исходников можно так:
git clone https://github.com/ahXN00/OwnTV.git
cd OwnTV
./gradlew assembleDebug
Вариант сборки нужно выбрать осознанно: standard для реальных приставок и ARM-эмуляторов, x86_64 для x86-эмуляторов. Нативный плеер загрузится только на совпадающей архитектуре. Минимум — Android 8.0 (API 26).
Кому это пригодится
Если у вас Android TV или Fire TV и вы уже пользуетесь каким-то источником IPTV, OwnTV стоит попробовать хотя бы ради мультивью и нормального гида. Установка простая: APK лежит в последнем релизе, а на Fire TV его можно поставить через Downloader по коду 4308278.
Разработчикам будет интересен не столько сам плеер, сколько архитектура: два движка за общим интерфейсом, потоковые парсеры и продуманная работа с памятью на больших списках. Это хороший пример того, как выглядит взрослое Compose for TV приложение, а не демка из документации.
Что стоит держать в голове: плеер живёт только на телевизоре, а часть документации разбросана по файлам в extras/. Зато проект открытый, есть Telegram-группа, и переводить интерфейс можно через Weblate. Если ваша приставка годами жила с плеером из стоковой прошивки, тут есть что поменять.
