Как сделать удобный плеер для специфичного контента на Kotlin и Compose

29 May, 2026

Иногда на 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.
  • Любителям аниме, которым надоел мобильный браузер.

Главное — помнить о предупреждении автора: не стоит слишком сильно светить этот репозиторий, иначе он может исчезнуть так же внезапно, как и появился.