# Proposal: Startup retry, custom stations, and equalizer persistence

## Intent

Make startup resilient to transient Radio Browser/API failures, make user-added stations first-class in the main listing/favorites flow, and persist equalizer choices so the app restores the configured graph and respects station-specific EQ.

## Scope

### In Scope
- Add bounded retry with host rotation for initial radio API fetches.
- Show custom stations from Settings in the main station listing.
- Keep custom stations favorite-capable through existing favorite persistence.
- Persist main EQ and per-favorite station EQ.
- Apply station EQ when present; otherwise apply main EQ.
- Add strict-TDD tests before implementation.

### Out of Scope
- `flutter build` or release packaging.
- Replacing Provider/ChangeNotifier.
- Full redesign of radio browsing/search UX.
- Cloud sync of EQ or station data.

## Capabilities

### New Capabilities
- `startup-radio-loading`: resilient startup station loading with bounded retry.
- `custom-stations-listing`: custom stations appear in the main listing and can be favorites.
- `equalizer-persistence`: main EQ persists and loads on startup.
- `station-equalizer`: favorite stations may own EQ or use main EQ.

### Modified Capabilities
- None; no existing OpenSpec source specs exist yet.

## Approach

Centralize API retry in `ServicioRadio`, add test-friendly dependency injection, expose a combined main listing in `EstadoRadio`, and introduce `ServicioEcualizador` using SharedPreferences JSON. Use null/no entry for station EQ fallback to main EQ.

## Affected Areas

| Area | Impact | Description |
|---|---|---|
| `lib/servicios/servicio_radio.dart` | Modified | Retry/host rotation and injectable HTTP client/delay. |
| `lib/estado/estado_radio.dart` | Modified | Init flow, main listing getter, EQ load/save/apply policy. |
| `lib/servicios/servicio_audio.dart` | Modified | Track current station correctly for UI and EQ. |
| `lib/servicios/servicio_ecualizador.dart` | New | Persist main and station EQ settings. |
| `lib/pantallas/pantalla_inicio.dart` | Modified | Render custom stations in the main list. |
| `lib/pantallas/pantalla_ajustes.dart` | Modified | EQ scope controls/load state. |
| `test/` | Modified | Unit/widget tests for all spec scenarios. |

## Risks

| Risk | Likelihood | Mitigation |
|---|---:|---|
| Startup delay from retries | Med | Cap attempts, short backoff, preserve manual retry. |
| Native EQ unavailable before playback | Med | Persist Provider state independently from Android EQ. |
| Constructor changes break widgets | Low | Keep default constructors backward compatible. |

## Rollback Plan

Revert the change folder and implementation commits. Since persistence uses new SharedPreferences keys, rollback can ignore them safely.

## Dependencies

- Existing `shared_preferences`, `http`, `provider`, `flutter_test`.

## Success Criteria

- [ ] Transient startup API failure retries and succeeds without showing final error.
- [ ] Exhausted startup attempts leave the app usable with manual retry.
- [ ] Custom stations appear in `PantallaInicio` and can be favorited.
- [ ] Main EQ restores after app restart.
- [ ] Favorite station own EQ overrides main EQ only when enabled.
