diff --git a/CHANGELOG.md b/CHANGELOG.md
index 833c165..ec3e3cc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,28 @@ Toutes les évolutions notables de Cachette sont documentées ici.
Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/)
et le versionnage [SemVer](https://semver.org/lang/fr/).
+## [1.3.0] — 2026-09-13
+
+### Ajouté
+
+- **Radio.** Les stations les plus écoutées via l'annuaire communautaire Radio Browser, avec
+ filtres par genre et recherche par nom. Chaque station s'écoute en direct, ou s'enregistre :
+ un service de premier plan copie le flux dans un fichier jusqu'à l'arrêt demandé, et le verse
+ dans la bibliothèque — déjà hors connexion, sans rien à télécharger ensuite.
+- Relance automatique des téléchargements en échec, après une pause croissante de 5, 15 puis
+ 45 secondes. Une relance manuelle repart d'un compteur neuf.
+
+### Notes
+
+- Les flux HLS sont écartés de la liste des stations : ils se lisent, mais ne s'enregistrent pas
+ par copie d'octets, et un bouton qui échouerait vaudrait moins que pas de bouton.
+- La relance et la reprise sur coupure réseau sont deux mécanismes distincts, et c'est voulu :
+ sans réseau, Media3 met le téléchargement en attente et le reprend de lui-même ; la relance,
+ elle, ne traite que les vrais échecs serveur.
+- Le repli automatique vers une autre source n'a pas été retenu : rien ne garantit qu'un même
+ titre trouvé sur deux catalogues soit le même enregistrement, et l'application téléchargerait
+ silencieusement autre chose que ce qui a été choisi.
+
## [1.2.0] — 2026-09-13
### Ajouté
diff --git a/README.md b/README.md
index 7265ab1..7e8f536 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
[](https://kotlinlang.org)
[](https://developer.android.com/jetpack/compose)
[](https://developer.android.com/media/media3)
-[](VERSION)
+[](VERSION)
[](#-comment-ça-marche)
Cachette est un lecteur audio et vidéo pensé pour les trajets, les tunnels, les avions et les
@@ -41,7 +41,8 @@ sans la moindre connexion.
| 🎛️ **Lecture en arrière-plan** | Notification système, casque, Bluetooth, écran verrouillé |
| ⏯️ **Contrôles complets** | Lecture, pause, arrêt, piste précédente et suivante, ±15 s |
| 🌙 **Thème clair et sombre** | Material 3, palette de marque, contraste garanti |
-| 🔁 **Reprise automatique** | Un téléchargement coupé repart tout seul via WorkManager |
+| 🔁 **Reprise automatique** | Réseau coupé : mise en attente et reprise. Échec serveur : relance seule après 5 s, 15 s, 45 s |
+| 📻 **Radio** | Les stations les plus écoutées, en direct — et enregistrables d'un appui |
| 🆕 **Mise à jour intégrée** | Surveille les releases du dépôt, télécharge l'APK en Wi-Fi et propose l'installation |
---
@@ -56,6 +57,7 @@ sans la moindre connexion.
| 🏛️ Internet Archive | ✅ | Domaine public / Creative Commons |
| 📚 LibriVox | ✅ | Livres audio du domaine public, filtrables par langue |
| 🎼 Wikimedia Commons | ✅ | Enregistrements classiques et archives sonores libres |
+| 📻 Radio | ✅ | Annuaire Radio Browser, direct et enregistrement (flux HLS exclus) |
### 🔎 Catalogues évalués puis écartés
@@ -230,6 +232,7 @@ app/src/main/java/fr/tuxgyver/cachette/
├── sources/ Import URL et RSS, catalogues Internet Archive et LibriVox
├── offline/ Cache Media3, gestionnaire et service de téléchargement
├── playback/ MediaSessionService, ExoPlayer, contrôleur d'interface
+├── radio/ Annuaire des stations, service d'enregistrement du direct
├── update/ Vérification des releases, téléchargement, notification
└── ui/ Compose — thème, bibliothèque, hors ligne, playlists, sources,
parcours des catalogues, choix des pistes, lecteur
diff --git a/VERSION b/VERSION
index 26aaba0..f0bb29e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.0
+1.3.0
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index eb2751f..346c29c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -59,6 +59,11 @@
+
+
>(emptyMap())
+ /** Identifiants dont une relance est programmée. */
+ private val retrying = MutableStateFlow(emptySet())
+
private val ticker = flow {
while (true) {
emit(Unit)
@@ -60,20 +65,58 @@ class DownloadTracker(
}
val states: StateFlow