PodcastFeedMaker
Publié le · Mis à jour le · 13 min
L'histoire
Tout a commencé par un besoin simple : générer des flux RSS podcast propres, conformes aux standards, sans bidouiller du XML à la main.
Entre 2006 et 2012, je produisais des podcasts de musique électronique. À l'époque, je gérais tout avec un backoffice maison en PHP — du bricolage qui fonctionnait, mais qui demandait une énergie folle pour rester compatible avec iTunes, les agrégateurs, les validateurs.
Des années plus tard, en travaillant sur des projets audio, le besoin est revenu. Sauf que cette fois, je voulais faire les choses bien : une lib Swift moderne, typée, testée, qui respecte tous les standards actuels — Apple Podcasts, Podcast Namespace, PSP-1.
C'est en développant cette librairie que l'idée de Podcast Maker est née. La lib d'abord, l'app ensuite.
C'est quoi PodcastFeedMaker ?
PodcastFeedMaker est une bibliothèque Swift pour générer, parser et valider des flux RSS podcast. Pas un wrapper, pas un générateur de templates — une vraie modélisation complète du format RSS avec tous ses namespaces.
La particularité ? Elle est bidirectionnelle. Vous pouvez construire un feed depuis zéro avec des modèles Swift, générer le XML, mais aussi parser un XML existant et le récupérer sous forme de modèles typés. Round-trip complet, sans perte de données.
Elle couvre les 7 namespaces XML qu'on retrouve dans le monde du podcast : RSS 2.0, iTunes, Podcast Namespace 2.0 (avec les 32 tags), Atom, Dublin Core, Content Module, et Podlove Simple Chapters. Côté validation, cinq plateformes majeures sont supportées : Apple Podcasts, Spotify, Amazon Music, Podcast Index, et le standard PSP-1.
Le tout sans aucune dépendance externe dans la lib core — du Swift pur avec Foundation, compatible Linux dès le départ.
Ce qu'elle sait faire
Générer — Du XML propre, en mode synchrone ou streaming pour les gros catalogues. Formatage configurable, wrapping CDATA automatique, 4 modes de gestion des namespaces
Parser — Lecture complète avec diagnostics et récupération d'erreurs. Supporte 12 formats de dates différents (RFC 2822, ISO 8601, et les formats "bizarres" qu'on trouve dans la nature)
Valider — Vérification contre 5 plateformes avec trois niveaux : erreurs, warnings, infos. Vous savez exactement ce qui bloque avant de soumettre
Round-trip — Parser un feed existant, le modifier, le régénérer. Les éléments inconnus, les sections CDATA, les commentaires XML, les préfixes de namespaces — tout est préservé
Builder DSL — Une syntaxe déclarative avec result builders. 18 modifiers pour le channel, 14 pour les items, des factories pour les enclosures
Templates — 4 niveaux selon vos besoins : basic pour démarrer vite, standard pour la prod, advanced pour les transcripts et chapitres, expert pour tout activer
Chapitres — JSON Chapters (le format Podcast NS 2.0) et Podlove Simple Chapters, tous deux Codable
Diff de feeds — Comparer deux versions d'un feed et voir ce qui a changé : épisodes ajoutés, supprimés, modifiés
CLI — 13 commandes pour tout faire depuis le terminal
Premier feed en 30 secondes
Voici le workflow complet : construire un flux, générer le XML, le re-parser, et le valider.
Les 7 namespaces
Le monde du podcast RSS, c'est un empilement de namespaces XML qui se sont ajoutés au fil des années. PodcastFeedMaker les gère tous — chaque tag, chaque attribut est modélisé, généré, parsé et validé.
| Namespace | Préfixe | Tags |
|---|---|---|
RSS 2.0 Core | — | 14 (channel + item) |
iTunes |
| 10 |
Podcast NS 2.0 |
| 32 |
Atom |
| 1 |
Dublin Core |
| 1 |
Content Module |
| 1 |
Podlove Simple Chapters |
| 1 |
Le Podcast Namespace 2.0 en détail
Le Podcast Namespace porté par Podcast Index apporte 32 nouveaux tags organisés en phases. PodcastFeedMaker les implémente tous :
| Phase | Tags |
|---|---|
Phase 1 |
|
Phase 2 |
|
Phase 3 |
|
Phase 4+ |
|
Validation multi-plateforme
Chaque plateforme a ses exigences. Apple veut du HTTPS partout et un artwork entre 1400 et 3000px. Spotify préfère le MP3 et limite les fichiers à 200 Mo. PSP-1 exige un GUID sur chaque épisode.
Plutôt que de découvrir ces problèmes au moment de la soumission, FeedValidator vérifie tout en amont :
Ce que vérifie chaque validateur
| Plateforme | Points clés |
|---|---|
Apple Podcasts | HTTPS obligatoire, artwork 1400-3000px JPEG/PNG, |
Spotify | MP3 préféré, max 200 Mo par fichier, artwork carré 1400-2048px, description max 4000 caractères |
Amazon Music | Formats audio variés acceptés (MP3/M4A/FLAC/OGG/ALAC), artwork 1400-3000px |
Podcast Index | Tags Podcast NS 2.0 attendus ( |
PSP-1 |
|
Le Builder DSL
Construire un feed avec PodcastFeedMaker, c'est chaîner des modifiers de façon fluide. Pas de XML à écrire, pas de strings magiques — tout est typé.
18 modifiers sont disponibles pour le channel (auteur, catégories, image, owner, funding, etc.) et 14 pour les items (description, durée, saison, épisode, personnes, transcripts, soundbites, etc.).
Factories pour les enclosures
Trois factories définissent le type MIME automatiquement — plus besoin de se souvenir si c'est audio/mpeg ou audio/mp3 :
Génération XML
FeedGenerator produit du XML complet en mode synchrone. Pour les catalogues massifs (10 000+ épisodes), StreamingFeedGenerator génère par chunks asynchrones :
Modes de namespace
Quatre modes pour gérer les déclarations de namespaces dans le XML généré :
| Mode | Comportement |
|---|---|
| Scanne le feed et ne déclare que les namespaces réellement utilisés |
| Déclare exactement ce qui est listé dans |
| Vous spécifiez manuellement l'ensemble à déclarer |
| Conserve les préfixes et URIs du feed original (parfait pour le round-trip) |
Parsing de feeds
Le parser gère les 7 namespaces avec récupération d'erreur best-effort. Un feed mal formé ne fait pas tout planter — vous récupérez ce qui est lisible avec des diagnostics sur ce qui a posé problème.
Les 12 formats de dates supportés
Dans la vraie vie, les feeds podcast utilisent des formats de dates... créatifs. Le parser en gère 12 :
| Catégorie | Exemples |
|---|---|
RFC 2822 |
|
ISO 8601 |
|
Fuzzy |
|
Templates
Quatre templates pré-configurés selon vos besoins. Chacun active un ensemble de tags et de validations adaptés :
| Niveau | Ce qu'il inclut | Pour qui |
|---|---|---|
Basic | RSS 2.0 + iTunes minimal | Prototypage, tests rapides |
Standard |
| Production, compatibilité large |
Advanced |
| Transcripts, chapitres, V4V |
Expert | Les 7 namespaces complets | Couverture maximale |
Les templates sont composables avec l'opérateur + et configurables via .requiring(), .recommending(), .targeting().
Round-Trip sans perte
Parser un feed existant, le modifier et le régénérer — sans perdre les éléments qu'on ne connaît pas. C'est crucial quand on travaille avec des feeds tiers qui utilisent des extensions custom.
| Ce qui est préservé | Comment |
|---|---|
Éléments inconnus | Capturés comme |
Sections CDATA | Le parser note quels champs utilisaient CDATA |
Commentaires XML | Préservés au niveau channel et item |
Préfixes de namespace | Les mappings originaux sont conservés |
Comparer deux feeds
FeedDiff détecte les différences entre deux versions d'un feed :
Chapitres
Deux systèmes de chapitres coexistent dans l'écosystème podcast. PodcastFeedMaker supporte les deux :
JSON Chapters — Le format du Podcast Namespace, lié via
<podcast:chapters>Podlove Simple Chapters — Le format inline via
<psc:chapters>
CLI : 13 commandes
podcastfeed expose toutes les fonctionnalités de la lib en ligne de commande. Parfait pour l'automatisation et les pipelines CI/CD.
Installation
En action
Toutes les commandes
| Commande | Ce qu'elle fait |
|---|---|
| Crée un feed depuis un template (basic, standard, advanced, expert) |
| Génère du XML depuis une définition JSON |
| Affiche un feed (résumé, JSON ou XML) |
| Vérifie contre une plateforme |
| Validation rapide, mode strict optionnel |
| Liste les épisodes avec tri et limite |
| Extrait les chapitres |
| Compare deux feeds |
| Convertit entre formats |
| Ajoute un épisode |
Codes de sortie
Pour l'intégration CI/CD : 0 = succès, 1 = erreur, 2 = warnings sans erreur. En mode --strict, les warnings deviennent des erreurs.
Architecture
Tests
2655 tests répartis dans 283 suites. Couverture complète des 7 namespaces, des 12 formats de dates, des 5 validateurs. Tous les tests tournent sur macOS et Linux en CI — pas de mocks, que du vrai XMLParser et de vraies Data.
Installation
Prérequis
Swift 6.2+ avec strict concurrency
Lib : macOS 13+, iOS 16+, tvOS 16+, watchOS 9+, visionOS 1+
CLI : macOS 13+, Linux (Ubuntu 22.04+, Amazon Linux 2023+)
Zéro dépendance dans le core (
swift-argument-parserpour CLI uniquement)
Références
Les specs sur lesquelles s'appuie PodcastFeedMaker :
Roadmap
✅ OPML import/export — Listes d'abonnements, validation et conversion entre apps (0.2.0)
✅ Feed Audit — Scoring 0-100 sur 29 critères, recommandations actionnables, matrice de compatibilité (0.2.0)
✅ Vapor Middleware — Feeds dynamiques côté serveur, caching HTTP, Podping (PodcastFeedVapor)
Plus de validateurs — Règles additionnelles par plateforme
Sous le capot
Swift 6.2 — Strict concurrency, types
SendableZero dependencies — Swift pur + Foundation
Multi-platform — macOS, iOS, tvOS, watchOS, visionOS, Linux
2655 tests — 283 suites, CI macOS + Linux
12 guides DocC — Documentation complète
Liens
GitHub - atelier-socle/podcast-feed-maker: Reference-quality Swift library for generating, parsing, and validating podcast RSS feeds. 7 namespaces, 5 platform validators, builder DSL, CLI tool.
Reference-quality Swift library for generating, parsing, and validating podcast RSS feeds. 7 namespaces, 5 platform validators, builder DSL, CLI tool.…