- Kotlin 94.7%
- PowerShell 5.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
Some checks are pending
build / build (push) Waiting to run
- 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) |
||
| .github/workflows | ||
| app | ||
| docs | ||
| gradle | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| gw.ps1 | ||
| LICENSE | ||
| NOTICE.md | ||
| package-release.ps1 | ||
| README.md | ||
| settings.gradle.kts | ||
CLIAMP-MOBILE
Неофициальный Android-порт bjarneo/cliamp — терминальное интернет-радио прямо в кармане.
Моноширинный интерфейс, 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 ищет его в таком порядке:
keystore.propertiesв корне проекта;- переменные окружения
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 и не одобрен им. Используйте на свой риск.