Как сделать удобный плеер для специфичного контента на Kotlin и Compose
Иногда на GitHub натыкаешься на проекты, которые авторы буквально умоляют не рекламировать. Han1meViewer — как раз из таких. Это сторонний клиент для известного ресурса с аниме для взрослых (18+), и его создатель в первом же предложении README грозится удалить репозиторий, если о нем начнут трубить на каждом углу. Но с технической точки зрения проект любопытен тем, как автор упаковал веб-ресурс в современное Android-приложение, решив при этом кучу типичных проблем мобильной разработки.
Зачем вообще писать свой клиент для сайта
Казалось бы, зачем городить огород с Kotlin и Jetpack Compose, если есть браузер? Ответ кроется в пользовательском опыте. Веб-интерфейсы подобных площадок часто перегружены рекламой, плохо адаптированы под жесты и не умеют в нормальный офлайн.
Han1meViewer превращает просмотр в нативное приключение. Это форк другого проекта, который автор допилил под свои нужды, добавив туда поддержку современных библиотек и несколько специфичных фишек вроде «умного» поиска и кастомных движков воспроизведения.
Что внутри под капотом
Если заглянуть в список зависимостей, становится понятно, что проект написан по всем канонам современной Android-разработки 2024-2025 годов.
Автор использует:
- Jetpack Compose для интерфейса. Это позволило реализовать динамические темы (Monet/Material You), которые подстраиваются под обои рабочего стола.
- ExoPlayer и MpvPlayer. В приложении можно переключать движки плеера. Если ExoPlayer не справляется с каким-то кодеком, на помощь приходит MPV.
- Jsoup для парсинга. Поскольку официального API у сайта нет, приложение «на лету» разбирает DOM-структуру страниц и вытягивает оттуда ссылки на видео, комментарии и картинки.
- StateFlow и ViewModel. Состояние экрана четко отделено от логики, данные текут предсказуемо, без лишних перерисовок.
Фишки для тех, кто ценит приватность
Разработчик явно понимал, для какого контента создается приложение. Поэтому в Han1meViewer встроены функции, которые редко встретишь в обычном видеоплеере:
- Иконка-маскировка. Можно сменить значок приложения на что-то безобидное, чтобы лишние глаза ничего не заподозрили.
- Приватный замок. Вход в приложение можно закрыть паролем или биометрией.
- Управление загрузками. Видео можно скачивать в зашифрованном виде или просто в скрытые папки, причем плеер умеет подхватывать их для просмотра без интернета.
Интересно реализована работа с сетью. В приложении есть встроенный детектор задержек для CDN-узлов. Если видео тормозит, можно в один тап переключиться на другое зеркало или настроить альтернативный домен.
Технические нюансы и грабли
Проект требует свежий стек. Чтобы собрать его самостоятельно, понадобится Android Studio версии Narwhal (начало 2025 года) и Kotlin 2.2.0. Это говорит о том, что автор не боится использовать экспериментальные фичи компилятора и плагинов (например, KSP и Serialization последних версий).
В коде активно используется ConcatAdapter для сложных списков, где перемешаны разные типы данных: видео, баннеры, комментарии и рекомендации. Это классический подход, когда нужно сделать «бесконечную» ленту с разнородным контентом.

Стоит ли в этом копаться
Если вы Android-разработчик, Han1meViewer — хороший пример того, как сделать качественный парсер-клиент. Здесь можно подсмотреть реализацию системы уведомлений (через встроенный WebUI), работу с картинка-в-картинке (PiP) и грамотную обработку Cookies для обхода ограничений сайта.
Конечно, проект специфический. Но если отбросить этическую сторону вопроса и взглянуть на код, перед нами добротное приложение на Compose, которое решает реальные боли пользователей: медленную загрузку, назойливую рекламу и отсутствие приватности.
Итоги
Проект живой, активно обновляется (последний коммит буквально на днях) и имеет свое комьюнити в Telegram.
Кому пригодится:
- Разработчикам, изучающим Jetpack Compose и кастомные плееры.
- Тем, кто хочет научиться эффективно парсить сайты без API.
- Любителям аниме, которым надоел мобильный браузер.
Главное — помнить о предупреждении автора: не стоит слишком сильно светить этот репозиторий, иначе он может исчезнуть так же внезапно, как и появился.
