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.