No description
  • Kotlin 94.7%
  • PowerShell 5.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
MineplayTY 1f135d5802
Some checks are pending
build / build (push) Waiting to run
Software EQ and UI refinements
- Add SoftwareEq: a biquad-based software equalizer that runs inside
  ExoPlayer's audio pipeline, replacing the system Equalizer effect
  that many devices fail to expose
- Refactor AudioFx to integrate with SoftwareEq
- Update CliampViewModel for new EQ architecture
- Rework PlayerScreen EQ controls and spectrum rendering
- Update Overlays and Catalog for current API usage
- Add airpods/ to .gitignore (local test data)
2026-10-16 19:16:38 +05:00
.github/workflows cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
app Software EQ and UI refinements 2026-10-16 19:16:38 +05:00
docs cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
gradle cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
.gitignore Software EQ and UI refinements 2026-10-16 19:16:38 +05:00
build.gradle.kts cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
gradle.properties cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
gradlew cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
gradlew.bat cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
gw.ps1 cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
LICENSE cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
NOTICE.md cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
package-release.ps1 cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
README.md cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00
settings.gradle.kts cliamp-mobile v1.0 2026-09-03 21:07:01 +05:00

CLIAMP-MOBILE

Неофициальный Android-порт bjarneo/cliamp — терминальное интернет-радио прямо в кармане.

cliamp-mobile

Моноширинный интерфейс, ASCII, никаких эмодзи и лишнего мусора — дух терминала, адаптированный под 9:16.

Возможности

  • Аутентичный дизайн — строгий терминальный UI, портирован под вертикальную ориентацию
  • ExoPlayer (Media3) — фоновый плейбек, автопереподключение при обрыве потока
  • Спектроанализатор — реальный FFT по PCM из аудиотракта, отрисовка на частоте кадров дисплея
  • Эквалайзер — системный Equalizer, пресеты и перетаскивание отдельных полос
  • ICY-метаданные — трек/исполнитель парсятся прямо из потока
  • Каталог станций — Lofi, Synthwave, EDM, NCS, включая избранный omarchy*
  • Онлайн-каталог — поиск по Radio Browser (~58 000 станций)
  • Локальные файлы — воспроизведение аудио с устройства через MediaStore
  • VOL — привязана к системной громкости медиа
  • Состояние переживает перезапуск — избранное, станция, кривая EQ, shuffle/repeat/скорость

Управление

Кнопки — настоящие кнопки: цель нажатия 44 dp, инверсия кейкапа, пружина и тактильный отклик.

Кнопка Действие
Space play / pause
[ ] предыдущая / следующая запись
N онлайн-каталог станций
Ctrl+K справка по кнопкам и жестам
Esc закрыть панель, иначе свернуть приложение
SPD цикл скорости 0.5x … 2x
SRC переключение Radio / Local
[Shuffle] [Repeat] режимы плейлиста

Жесты:

Жест Действие
свайп по названию трека переключить запись (резинка + тик на пороге)
двойной тап по спектру play / pause
удержание спектра стоп
перетаскивание VOL громкость, детент на каждый блок
перетаскивание цифр EQ по горизонтали — выбор полосы, по вертикали — усиление
двойной тап по EQ сбросить кривую
удержание пресета EQ байпас эквалайзера
удержание записи в списке закрепить / снять закрепление
удержание CLIAMP справка

Сборка

./gradlew :app:testDebugUnitTest   # 38 unit-тестов
./gradlew :app:assembleRelease     # 5 APK по ABI + universal

Затем раскладка артефактов и сборка .xapk:

pwsh -File package-release.ps1

В корне также лежит gw.ps1 — обёртка для Windows, которая сама находит JDK и Android SDK и обходит один баг окружения:

Windows с нелатинским именем пользователя. Gradle передаёт classpath тестового воркера через argfile, а JVM читает argfile в системной кодировке — путь вида C:\Users\ДОМ\... при этом бьётся, и каждый воркер падает с Could not find or load main class ...GradleWorkerMain. gw.ps1 определяет это и переносит GRADLE_USER_HOME в ./.gradle-home, один раз скопировав кэш зависимостей. На обычных путях и на CI достаточно ./gradlew.

Подпись

Ключа в репозитории нет и быть не должно. assembleRelease ищет его в таком порядке:

  1. keystore.properties в корне проекта;
  2. переменные окружения KEYSTORE_PATH, STORE_PASSWORD, KEY_ALIAS, KEY_PASSWORD.
storeFile=my-upload-key.jks
storePassword=...
keyAlias=upload
keyPassword=...

Если материала для подписи нет, сборка не падает — получаются неподписанные APK, которые можно подписать отдельно через apksigner. Свой ключ создаётся так:

keytool -genkeypair -keystore my-upload-key.jks -storetype PKCS12 \
  -alias upload -keyalg RSA -keysize 4096 -validity 36500 \
  -dname "CN=cliamp mobile, O=cliamp, C=RU"

my-upload-key.jks и keystore.properties в .gitignore. Сохраните оба файла: без них нельзя выпустить обновление, которое встанет поверх уже установленного cliamp.

Для CI положите ключ в секреты репозитория: KEYSTORE_BASE64 (base64 -w0 my-upload-key.jks), STORE_PASSWORD, KEY_ALIAS, KEY_PASSWORD. Без них workflow всё равно проходит.

Артефакты

Файл Для чего
app-arm64-v8a-release.apk большинство современных устройств
app-armeabi-v7a-release.apk старые 32-бит устройства
app-x86_64-release.apk / app-x86-release.apk эмуляторы
app-universal-release.apk универсальный билд
cliamp.xapk пакет для сторонних установщиков

Структура

app/src/main/java/io/github/mineplayty/cliamp/
├── audio/     ExoPlayer-сервис, тап спектра, FFT, эквалайзер, счётчики трафика
├── data/      каталог станций, MediaStore, Radio Browser, настройки
├── ui/        терминальный экран, кейкапы, жесты, визуализация, оверлеи
├── CliampViewModel.kt
├── Formatting.kt
└── MainActivity.kt

Стек

Kotlin · Jetpack Compose · MediaSessionService + ExoPlayer · OkHttp · StateFlow/ViewModel

Лицензия

MIT. Сторонние компоненты, происхождение потоков и артворка — в NOTICE.md.

Проект не связан с автором оригинального cliamp и не одобрен им. Используйте на свой риск.