Как собрать музыку из разных сервисов в одном Android приложении
Знакомая история: любимый плейлист лежит в Spotify, редкие лайв-записи — на YouTube, а какие-то старые треки пылятся в памяти телефона. Переключаться между тремя приложениями, чтобы просто послушать музыку в дороге, быстро надоедает. Китайские разработчики часто создают специфические, но технически любопытные инструменты для решения таких бытовых проблем. На днях я наткнулся на NeriPlayer — плеер на Jetpack Compose, который пытается объединить локальную медиатеку и стриминг с нескольких площадок в одном интерфейсе.
Что это за плеер
NeriPlayer — это нативный Android-клиент, написанный на Kotlin. Его главная фишка в том, что он не предлагает свой облачный сервис, а выступает агрегатором. Проект использует современные библиотеки вроде Media3 и ExoPlayer для воспроизведения, а интерфейс полностью построен на Compose.
Автор вдохновлялся персонажем из визуальной новеллы «The Railway to Starlight and Shiro», что объясняет аниме-стилистику и название. Но если отбросить визуальную часть, внутри скрывается серьезная работа с API разных платформ.
Чем он интересен на практике
Самое полезное здесь — работа с источниками. Плеер умеет «подтягивать» контент из NetEase Cloud Music, Bilibili и YouTube Music. Причем это не просто поиск по названиям, а полноценная интеграция.
Аккаунты как источник данных
В приложении нет общей базы музыки. Вы авторизуетесь в своих аккаунтах на сторонних сервисах, и плеер получает доступ к вашим плейлистам и истории. Это удобно, если вы не хотите переносить медиатеку вручную. Все данные авторизации и куки шифруются через Android Keystore, так что за безопасность токенов можно не переживать.
Умное кэширование и загрузка
Разработчик реализовал кастомный слой управления воспроизведением на базе Media3. Плеер использует SimpleCache с алгоритмом LRU. По умолчанию лимит кэша составляет 1 ГБ, но его можно почистить в настройках. Если песня понравилась, ее можно скачать прямо в приложении. Треки сохраняются в закрытый каталог вместе с обложками и текстами песен.
Синхронизация через GitHub
Это, пожалуй, самая необычная фича. Вместо того чтобы поднимать свой бэкенд для синхронизации настроек и плейлистов между устройствами, автор предлагает использовать приватный репозиторий на GitHub. Плеер через WorkManager периодически пушит JSON-файлы с метаданными в ваш репозиторий. Это бесплатно, надежно и полностью под вашим контролем.
Работа с локальными файлами
NeriPlayer не забывает про классику. Он умеет сканировать память устройства и подхватывать аудиофайлы, которыми вы делитесь через системное меню Android. При импорте плеер ищет рядом файлы .lrc и картинки, чтобы автоматически подтянуть тексты и обложки.
Техническая начинка
С точки зрения кода проект выглядит как хороший пример современной Android-разработки. Здесь используется архитектура с одной Activity и навигацией через Compose NavHost.
Интересно реализована работа с Bilibili: так как сервис часто проверяет заголовки запросов, автор добавил ConditionalHttpDataSourceFactory, которая на лету подставляет нужные Referer и User-Agent в зависимости от источника аудио.
Для любителей визуальных эффектов в плеере есть динамические фоны. На Android 13+ они работают через RuntimeShader, создавая реактивную подложку, которая меняется в такт музыке.
Как это пощупать
Проект сейчас в активной разработке (Work in progress), поэтому баги встречаются. Чтобы увидеть скрытые возможности, в настройках нужно семь раз нажать на номер версии — откроется вкладка Debug. Там можно посмотреть логи и проверить работу API-зондов для каждого сервиса.
Для запуска понадобится устройство на Android 9 или выше. Проще всего скачать готовую сборку из разделов Releases или воспользоваться CI-билдами в их Telegram-канале. Если решите собирать сами, понадобится актуальная Android Studio и Java 17.
NeriPlayer подойдет тем, кто устал от тяжелых официальных приложений стриминговых сервисов и хочет иметь легкий плеер «все в одном». Это отличный пример того, как можно использовать GitHub не только для кода, но и как бесплатное облако для пользовательских данных.
Конечно, проект сильно завязан на китайские сервисы, но поддержка YouTube Music делает его актуальным и для нас. Если вы ищете проект на Media3 и Compose для изучения — это достойный кандидат для разбора.
