feat(player): add radio recording and real waveform
Build & Deploy Pluriwave / Análisis de código (push) Successful in 12s
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m27s

This commit is contained in:
2026-05-21 21:17:51 +02:00
parent 6aa9a59d7b
commit a6a91af402
12 changed files with 1518 additions and 286 deletions
+75 -39
View File
@@ -8,47 +8,48 @@ import 'package:pluriwave/servicios/servicio_radio.dart';
void main() {
group('ServicioRadio retry + rotación', () {
test(
'reintenta con otro host cuando el primero falla y recupera en el segundo',
() async {
final hostsSolicitados = <String>[];
final servicio = ServicioRadio(
cliente: MockClient((request) async {
hostsSolicitados.add(request.url.host);
if (request.url.host == 'host-1.api.radio-browser.info') {
return http.Response('fallo', 500);
}
return http.Response(
jsonEncode([
{
'stationuuid': 'uuid-ok',
'name': 'Radio Recuperada',
'url_resolved': 'https://stream.recuperada/audio',
},
]),
200,
headers: {'content-type': 'application/json'},
);
}),
servidores: const [
'host-1.api.radio-browser.info',
'host-2.api.radio-browser.info',
],
maxIntentos: 3,
retryDelay: Duration.zero,
);
'reintenta con otro host cuando el primero falla y recupera en el segundo',
() async {
final hostsSolicitados = <String>[];
final servicio = ServicioRadio(
cliente: MockClient((request) async {
hostsSolicitados.add(request.url.host);
if (request.url.host == 'host-1.api.radio-browser.info') {
return http.Response('fallo', 500);
}
return http.Response(
jsonEncode([
{
'stationuuid': 'uuid-ok',
'name': 'Radio Recuperada',
'url_resolved': 'https://stream.recuperada/audio',
},
]),
200,
headers: {'content-type': 'application/json'},
);
}),
servidores: const [
'host-1.api.radio-browser.info',
'host-2.api.radio-browser.info',
],
maxIntentos: 3,
retryDelay: Duration.zero,
);
final emisoras = await servicio.obtenerPopulares(limit: 1);
final emisoras = await servicio.obtenerPopulares(limit: 1);
expect(emisoras, hasLength(1));
expect(emisoras.first.uuid, 'uuid-ok');
expect(
hostsSolicitados,
equals([
'host-1.api.radio-browser.info',
'host-2.api.radio-browser.info',
]),
);
});
expect(emisoras, hasLength(1));
expect(emisoras.first.uuid, 'uuid-ok');
expect(
hostsSolicitados,
equals([
'host-1.api.radio-browser.info',
'host-2.api.radio-browser.info',
]),
);
},
);
test('corta al llegar al tope de intentos y propaga error final', () async {
var intentos = 0;
@@ -68,5 +69,40 @@ void main() {
);
expect(intentos, 2);
});
test('prioriza emisoras verificadas de mayor bitrate', () async {
final servicio = ServicioRadio(
cliente: MockClient((request) async {
expect(request.url.queryParameters['order'], 'bitrate');
expect(request.url.queryParameters['reverse'], 'true');
return http.Response(
jsonEncode([
{
'stationuuid': 'baja',
'name': 'Baja',
'url_resolved': 'https://stream.example/low',
'bitrate': 64,
'votes': 999,
},
{
'stationuuid': 'alta',
'name': 'Alta',
'url_resolved': 'https://stream.example/high',
'bitrate': 320,
'votes': 1,
},
]),
200,
headers: {'content-type': 'application/json'},
);
}),
servidores: const ['host.api.radio-browser.info'],
retryDelay: Duration.zero,
);
final emisoras = await servicio.buscar(nombre: 'radio');
expect(emisoras.map((e) => e.uuid), equals(['alta', 'baja']));
});
});
}