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 · 1h ago
README.md

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.