0a47c327f115245c65e7779a59e719d7fb640d7a
The guard added in the previous commit reported all three drawables as missing on its first run, including ic_stat_pluriwave -- which is verifiably present: it was read out of the base.apk pulled off the device byte by byte. The step also finished in 0s, so it never opened the file at all. Either the APK is not at the assumed path on this runner or unzip is unavailable, and the failing pipeline silently produced an empty listing that every grep then "failed" against. A guard that lies is worse than no guard: it sends you hunting ghosts, which is exactly the failure mode this whole episode has been about. It now verifies its own preconditions before judging anything: - the APK must exist, and if it does not the step prints where the APKs actually are (find over build/app/outputs) instead of guessing; - it needs unzip or python3, and says so plainly if neither is there; - an empty listing is treated as "inspection unreliable", not as "everything is missing"; - it dumps the real res/drawable inventory before the verdict, so a future failure is readable without another round trip. Matching is now exact (grep -qx) rather than substring. The logic was run locally against the real 45MB base.apk taken off the device: ic_stat_pluriwave OK, ic_auto_eq_on and ic_auto_eq_off missing -- which is precisely what an independent zipfile inspection of the same APK reported yesterday. The check agrees with reality before shipping.
PluriWave
Radio mundial con ecualizador personalizable, reconocimiento de canciones y UI premium.
Features
- +53.000 emisoras de 238 países (Radio Browser API)
- Ecualizador por emisora — guarda tu preset favorito para cada radio
- Reconocimiento de canciones — "¿Qué suena?" sin salir de la app
- Timer de auto-apagado — perfecto para dormir
- Reproducción en segundo plano — sigue sonando con la pantalla apagada
- Favoritos — acceso rápido a emisoras preferidas
- Compartir — envía emisoras a tus amigos
- UI premium — Material You, visualizador de audio, animaciones fluidas
Monetización
- 14 días PRO gratis al instalar
- Free: radio + favoritos + timer + background (con ads)
- PRO €2.99/año: sin ads + ecualizador + reconocimiento ilimitado
Stack
- Frontend: Flutter (Android + iOS)
- Radio API: Radio Browser (gratis, +53K emisoras)
- Audio: just_audio + audio_service
- Ecualizador: just_audio equalizer (Android nativo)
- Reconocimiento: AudD API (1000 req/mes free)
- Ads: Google AdMob
- Compras: in_app_purchase
CI/CD
Workflow Gitea Actions en .gitea/workflows/ci.yml, runner macmini-flutter.
Jobs: flutter pub get → flutter test → build apk --release → build appbundle --release
Artifacts: APK y AAB guardados en Gitea con nombre pluriwave-apk-<sha> / pluriwave-aab-<sha>.
Notificaciones: Telegram al completar (éxito ✅ / fallo ❌).
Secrets necesarios en el repo:
| Secret | Uso |
|---|---|
TELEGRAM_BOT_TOKEN |
Notificaciones CI |
TELEGRAM_CHAT_ID |
Canal de destino |
Signing: build de release usa clave debug (válido para CI interno). Para Play Store se requiere keystore como secret adicional.
Desarrollador
FreeTimeLab — freetimelab.es
Licencia
MIT
Description
PluriWave — Radio mundial con ecualizador, reconocimiento de canciones y UI premium
49 MiB
Languages
Dart
86%
HTML
7.1%
Kotlin
5.1%
JavaScript
1.6%
Swift
0.1%