msansm1/rss-podcast-dlpublic Fork
⑂ main
Commits
⬇ Clone ▾
git clone https://git.rickub.com/msansm1/rss-podcast-dl.git
git clone ssh://git@rickub.com/msansm1/rss-podcast-dl.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP
UX and transcode updates b0e5d07 · on main · msansm1 · 2h ago
README.md · 233 lines · 10.2 KBmarkdown
Blame HistoryOpen raw

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 .part puis 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 .m4a sont réencodés en .mp3 via ffmpeg, détecté au démarrage ; sans ffmpeg ou 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
# 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 `.part` puis 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 `.m4a` sont réencodés en `.mp3` via `ffmpeg`, détecté au démarrage ; sans `ffmpeg` ou 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](https://www.rust-lang.org/) 1.92 ou supérieur (exigence MSRV d'egui 0.35)
- Git (optionnel, pour cloner le dépôt)

## Installation

### À partir des sources

```bash
# 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

```bash
cargo run
```

Ou exécuter directement le binaire compilé :
```bash
./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

```json
[
  {
    "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](https://github.com/emilk/egui) 0.35 / [eframe](https://github.com/emilk/egui) - Immediate mode GUI
- **Parsing RSS** : [rss](https://crates.io/crates/rss) crate
- **Sérialisation** : [serde](https://crates.io/crates/serde) avec [serde_json](https://crates.io/crates/serde_json)
- **Logging** : [log](https://crates.io/crates/log) avec [env_logger](https://crates.io/crates/env_logger)
- **Requêtes HTTP** : [reqwest](https://crates.io/crates/reqwest) (avec support blocking)
- **Tags audio** : [id3](https://crates.io/crates/id3)
- **Dialogues natifs** : [rfd](https://crates.io/crates/rfd) (sélecteurs de fichiers et de dossiers)

## Dépendances

Voir [Cargo.toml](Cargo.toml) pour la liste complète des dépendances.

## Variables d'environnement

- `RUST_LOG` : Niveau de logging (ex: `RUST_LOG=info`)

## Tests

```bash
cargo test      # Exécute la suite de tests (modèles, stockage, parsing, extraction…)
cargo clippy    # Lint sans avertissement
```

## Roadmap

- [x] Phase 1 : Structure de base et configuration
- [x] Phase 2 : Modèles et stockage
- [x] Phase 3 : Parsing RSS et téléchargement
- [x] Phase 4 : Interface utilisateur
- [x] Phase 5 : Synchronisation
- [x] Phase 6 : Intégration et tests
- [x] Phase 7 : Finalisation
- [x] Phase 8 : Fonctionnalités avancées (playlists, export/import, thèmes)
- [x] Phase 9 : Fonctionnalités de productivité (recherche, historique, statistiques)
- [x] 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](Cargo.toml)).

---

Développé avec Rust et egui.