RSS Podcast Downloader
Un outil en Rust avec interface egui pour télécharger automatiquement des podcasts à partir de flux RSS.
Fonctionnalités
- Gestion des flux RSS : ajout, modification, suppression (avec confirmation) de flux podcast, activation/désactivation, tags de catégorisation
- Synchronisation asynchrone : synchronisation globale ou flux par flux, sans bloquer l'interface, avec indicateur de progression
- Vue détaillée par flux : liste des épisodes avec dates, tailles et durées, téléchargement individuel, filtre par titre, actualisation
- Téléchargement atomique : écriture via un fichier
.partpuis renommage — un téléchargement interrompu n'est jamais confondu avec un épisode complet - Tags ID3 : titre, artiste et album écrits dans les fichiers téléchargés, puis renommage en
[artiste] - [titre](les fichiers déjà existants sont rattrapés à la synchronisation) - Transcodage .m4a → .mp3 (optionnel, menu Paramètres) : les téléchargements
.m4asont réencodés en.mp3viaffmpeg, détecté au démarrage ; sansffmpegou si l'option est désactivée, le fichier original est conservé tel quel - Recherche : filtrage instantané des flux par nom, URL ou tags, avec compteur de résultats
- Filtres par date : périodes personnalisées ou prédéfinies (7/30 derniers jours)
- Playlists : regroupement des flux avec description
- Export / Import : sauvegarde et restauration des flux au format JSON
- Historique : journal des opérations (synchronisations, téléchargements, ajouts/suppressions, import/export) avec filtres par type et statut, persisté entre les sessions
- Statistiques : nombre de flux, épisodes téléchargés, dates de dernière activité, tableau par flux
- Thèmes sombre et clair : palette centralisée, choix persisté entre les sessions
- Notifications : messages flottants non intrusifs (coin haut droit) avec bouton de fermeture
- Menu et raccourcis clavier : barre de menus complète et raccourcis globaux
Prérequis
- Rust 1.92 ou supérieur (exigence MSRV d'egui 0.35)
- Git (optionnel, pour cloner le dépôt)
Installation
À partir des sources
# Cloner le dépôt
git clone https://github.com/votre-utilisateur/rss-podcast-dl-egui.git
cd rss-podcast-dl-egui
# Compiler en mode release
cargo build --release
# Le binaire sera généré dans target/release/rss-podcast-dl-egui.exe
Utilisation
Lancement
cargo run
Ou exécuter directement le binaire compilé :
./target/release/rss-podcast-dl-egui
Interface
L'application s'organise autour d'une barre de menus, d'un écran principal (recherche, filtres, actions, liste des flux et des playlists), d'une barre de statut et de notifications flottantes.
-
Écran principal :
- Barre d'outils compacte regroupant recherche (nom, URL, tags), filtre par période et actions
- Recherche instantanée avec compteur de résultats dès qu'un filtre est actif
- Filtre par période : « 7 derniers jours », « 30 derniers jours » ou plage personnalisée
- Boutons « Ajouter un flux », « Synchroniser tous », « Exporter », « Importer »
- Cartes de flux : statut activé/désactivé, dernière vérification, nombre d'épisodes téléchargés, dernier épisode récupéré, indicateur de synchronisation en cours
- Actions par flux : vue détaillée (📖), synchroniser (🔄), éditer (✏️), supprimer (🗑️ avec confirmation)
-
Vue détaillée d'un flux :
- Liste des épisodes du plus récent au plus ancien, avec date, taille et durée
- Téléchargement individuel d'un épisode, état « téléchargé » détecté sur le disque
- Filtre par titre et bouton d'actualisation
-
Barre de menus :
- Fichier : ajouter un flux, importer, exporter, quitter
- Actions : synchroniser tous les flux, ouvrir les fenêtres Statistiques et Historique
- Affichage : bascule thème sombre/clair
Raccourcis clavier
| Raccourci | Action |
|---|---|
Ctrl+N |
Ajouter un flux |
F5 |
Synchroniser tous les flux |
Ctrl+F |
Focus sur la recherche |
Entrée |
Valider un dialogue (ajout/édition de flux) |
Échap |
Fermer un dialogue ou la vue détaillée |
Configuration
Les fichiers de configuration sont stockés dans un répertoire dédié :
- Windows :
%APPDATA%\rss-podcast-dl\ - Linux/macOS :
~/.config/rss-podcast-dl/
| Fichier | Contenu |
|---|---|
config.json |
Flux configurés |
config_playlists.json |
Playlists |
settings.json |
Préférences (thème) |
history.json |
Historique des opérations |
Format du fichier de configuration
[
{
"id": "9d2c8a4e-1b3f-4c5d-9e6f-7a8b9c0d1e2f",
"url": "https://exemple.com/podcast.rss",
"name": "Nom du Podcast",
"download_path": "C:\\Users\\moi\\Musique\\podcasts",
"last_checked": "2026-09-29T10:00:00Z",
"last_episode_date": null,
"enabled": true,
"tags": ["Tech", "Français"],
"downloaded_episodes_count": 12,
"last_downloaded_episode_name": "Épisode 42",
"last_downloaded_episode_date": "2026-09-28T08:00:00Z"
}
]
Structure du projet
.
├── src/
│ ├── app.rs # Application principale egui
│ ├── main.rs # Point d'entrée
│ ├── config/
│ │ ├── app_state.rs # État global de l'application
│ │ ├── backup.rs # Sauvegardes de la configuration
│ │ ├── episode.rs # Structure Episode
│ │ ├── feed.rs # Structure Feed et méthodes
│ │ ├── history.rs # Historique des opérations
│ │ ├── mod.rs # Exports du module config
│ │ ├── playlist.rs # Structure Playlist
│ │ ├── search.rs # Requêtes de recherche
│ │ ├── settings.rs # Persistance des préférences (thème)
│ │ ├── statistics.rs # Statistiques et formatage
│ │ ├── storage.rs # Sauvegarde/chargement JSON
│ │ └── sync_task.rs # Tâches de synchronisation asynchrones
│ ├── rss/
│ │ ├── async_sync.rs # Synchronisation asynchrone des flux
│ │ ├── audio_metadata.rs # Tags ID3
│ │ ├── downloader.rs # Téléchargement des épisodes (atomique)
│ │ ├── episode_extractor.rs # Extraction des épisodes depuis le RSS
│ │ ├── mod.rs
│ │ └── parser.rs # Récupération et parsing du flux RSS
│ └── ui/
│ ├── add_feed_dialog.rs # Dialogue d'ajout de flux (modal)
│ ├── confirm_dialog.rs # Confirmations de suppression (modales)
│ ├── export_import.rs # Export/Import JSON (modaux)
│ ├── feed_detail.rs # Vue détaillée : épisodes d'un flux
│ ├── feed_edit_dialog.rs # Dialogue d'édition de flux (modal)
│ ├── feed_list.rs # Liste des flux
│ ├── filter_panel.rs # Filtres par date
│ ├── history_panel.rs # Fenêtre Historique
│ ├── home.rs # Écran principal
│ ├── menu_bar.rs # Barre de menus et raccourcis clavier
│ ├── mod.rs # Module UI + helper de tronquage
│ ├── notifications.rs # Notifications flottantes
│ ├── playlist_list.rs # Liste des playlists et dialogues
│ ├── search_bar.rs # Barre de recherche
│ ├── stats_panel.rs # Fenêtre Statistiques
│ ├── status_bar.rs # Barre de statut
│ ├── sync_status.rs # Indicateur de synchronisation
│ ├── theme.rs # Palette de couleurs centralisée
│ └── toolbar.rs # Barre d'outils (recherche, période, actions)
├── spec/
│ ├── init-plan.md # Plan initial du projet
│ └── init-tasks.md # Tâches détaillées
├── assets/
└── Cargo.toml
Technologies utilisées
- Langage : Rust (edition 2021)
- Framework UI : egui 0.35 / eframe - Immediate mode GUI
- Parsing RSS : rss crate
- Sérialisation : serde avec serde_json
- Logging : log avec env_logger
- Requêtes HTTP : reqwest (avec support blocking)
- Tags audio : id3
- Dialogues natifs : rfd (sélecteurs de fichiers et de dossiers)
Dépendances
Voir Cargo.toml pour la liste complète des dépendances.
Variables d'environnement
RUST_LOG: Niveau de logging (ex:RUST_LOG=info)
Tests
cargo test # Exécute la suite de tests (modèles, stockage, parsing, extraction…)
cargo clippy # Lint sans avertissement
Roadmap
- Phase 1 : Structure de base et configuration
- Phase 2 : Modèles et stockage
- Phase 3 : Parsing RSS et téléchargement
- Phase 4 : Interface utilisateur
- Phase 5 : Synchronisation
- Phase 6 : Intégration et tests
- Phase 7 : Finalisation
- Phase 8 : Fonctionnalités avancées (playlists, export/import, thèmes)
- Phase 9 : Fonctionnalités de productivité (recherche, historique, statistiques)
- Phase 10 : Confort d'utilisation (menu, raccourcis, vue détaillée par épisode,
confirmations, notifications flottantes, thème persisté)
Fonctionnalités futures
- Synchronisation planifiée (automatique en arrière-plan)
- Lecteur audio intégré
- Support OPML pour l'import/export
- Taille/position de fenêtre persistées
Contribution
Les contributions sont les bienvenues ! Ouvrez une issue ou soumettez une pull request.
Licence
Ce projet est sous licence MIT (voir l'en-tête license du Cargo.toml).
Développé avec Rust et egui.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
|