Files
pluriwave/openspec/changes/startup-retry-custom-stations-eq-persistence/spec.md
Javier Bautista Fernández d579a0e107 feat: Implement startup retry mechanism for custom stations and equalizer persistence
- Added state management for startup retry and custom station handling in `EstadoRadio`.
- Created tasks for implementing strict TDD with RED tests for HTTP failure retries and EQ persistence.
- Developed verification report to ensure compliance with TDD practices.
- Introduced fake services for testing, including `FakeServicioAudio`, `FakeServicioFavoritos`, and `FakeServicioRadio`.
- Implemented widget tests for `PantallaInicio` and `PantallaFavoritos` to validate UI behavior with custom stations.
- Enhanced `ServicioRadio` to support host rotation and retry logic for API calls.
- Established a new configuration file to enforce project constraints and testing rules.
2026-04-27 17:34:04 +02:00

84 lines
3.7 KiB
Markdown

# Spec: Startup retry, custom stations, and equalizer persistence
## Requirement: Startup radio loading resilience
The system MUST retry initial Radio Browser station loading with bounded attempts and host rotation before exposing a startup connection error.
### Scenario: transient startup failure recovers
- GIVEN the first radio API request fails due to a transient connection error
- WHEN the app initializes `EstadoRadio`
- THEN the system MUST retry using an eligible host
- AND popular/tending stations SHALL be populated when a later attempt succeeds
- AND no final startup error SHALL remain visible
### Scenario: startup failures are exhausted
- GIVEN all configured retry attempts fail
- WHEN initial station loading completes
- THEN the system MUST stop retrying automatically
- AND it MUST expose a user-visible connection error
- AND the manual retry action MUST still call station loading again
## Requirement: Custom stations in the main listing
The system MUST include stations added in Settings in the main station listing and MUST allow them to be marked/unmarked as favorites through the same favorite flow as API stations.
### Scenario: added custom station appears on home
- GIVEN a user saves a valid custom station in Settings
- WHEN the main listing is rendered without a genre filter
- THEN the custom station MUST be visible in the listing
- AND selecting it MUST start playback through the normal `EstadoRadio.reproducir` path
### Scenario: custom station can be favorited
- GIVEN a custom station is visible in the main listing
- WHEN the user taps its favorite action
- THEN the station MUST be persisted in favorites
- AND the Favorites screen SHALL show it after favorite state reloads
## Requirement: Main equalizer persistence
The system MUST persist the main equalizer preset/graph and MUST load it during state initialization before the first playback-specific EQ decision.
### Scenario: main EQ restores after restart
- GIVEN the user configures the main EQ to a non-flat graph
- WHEN the app state is recreated
- THEN `EstadoRadio.presetEcualizador` MUST expose the saved graph
- AND the native audio equalizer SHALL receive it when the EQ becomes available
### Scenario: EQ state persists even when native EQ is unavailable
- GIVEN the platform has no available native equalizer at startup
- WHEN persisted EQ settings are loaded
- THEN Provider state MUST still expose the saved EQ graph
- AND no persistence data SHALL be discarded
## Requirement: Favorite station equalizer mode
The system MUST let each favorite station either use the main equalizer or use its own saved equalizer. If own EQ exists for a station, playback MUST respect it.
### Scenario: favorite station own EQ is applied
- GIVEN a favorite station has its own saved EQ graph
- WHEN the user plays that station
- THEN the system MUST apply the station EQ graph
- AND it MUST expose that graph as the current EQ in state
### Scenario: favorite station falls back to main EQ
- GIVEN a favorite station has no own EQ enabled
- AND the main EQ is configured
- WHEN the user plays that station
- THEN the system MUST apply the main EQ graph
### Scenario: disabling own EQ restores main behavior
- GIVEN a favorite station has own EQ enabled
- WHEN the user switches that station to use main EQ
- THEN the station-specific EQ entry MUST be removed or ignored
- AND future playback of that station MUST use the current main EQ
## Requirement: Test-first implementation
The implementation MUST add failing tests for each scenario before production behavior is changed.
### Scenario: strict TDD guardrail
- GIVEN this change is implemented
- WHEN an implementation task begins
- THEN the corresponding test MUST be written first
- AND verification MUST use `flutter test`, never `flutter build`