PodcastFeedMaker

Publié le · Mis à jour le · 13 min

Wlad
Wlad
Fondateur & Tech Lead Swift

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é.

NamespacePréfixeTags

RSS 2.0 Core

14 (channel + item)

iTunes

itunes

10

Podcast NS 2.0

podcast

32

Atom

atom

1

Dublin Core

dc

1

Content Module

content

1

Podlove Simple Chapters

psc

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 :

PhaseTags

Phase 1

locked, transcript, funding, chapters, soundbite

Phase 2

person, location, season, episode

Phase 3

trailer, license, alternateEnclosure, source, integrity

Phase 4+

guid, value, medium, liveItem, contentLink, socialInteract, block, txt, remoteItem, podroll, updateFrequency, podping, valueTimeSplit, chat, publisher, image, images, valueRecipient

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

PlateformePoints clés

Apple Podcasts

HTTPS obligatoire, artwork 1400-3000px JPEG/PNG, itunes:image + itunes:category + itunes:explicit requis

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 (podcast:locked, podcast:guid, podcast:funding), config Value4Value

PSP-1

language requis, atom:link self requis, podcast:locked + podcast:guid requis, GUID sur chaque item

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é :

ModeComportement

.auto

Scanne le feed et ne déclare que les namespaces réellement utilisés

.feedDefined

Déclare exactement ce qui est listé dans PodcastFeed.namespaces

.explicit(Set)

Vous spécifiez manuellement l'ensemble à déclarer

.parsed

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égorieExemples

RFC 2822

Tue, 14 Feb 2026 10:30:00 +0100, 14 Feb 2026 10:30:00 GMT

ISO 8601

2026-02-14T10:30:00Z, 2026-02-14T10:30:00.000+01:00, 2026-02-14

Fuzzy

Feb 14, 2026, 2026/02/14, 02/14/2026, 14-02-2026

Templates

Quatre templates pré-configurés selon vos besoins. Chacun active un ensemble de tags et de validations adaptés :

NiveauCe qu'il inclutPour qui

Basic

RSS 2.0 + iTunes minimal

Prototypage, tests rapides

Standard

  • conformité PSP-1

Production, compatibilité large

Advanced

  • Podcast NS phases 1-3

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 UnknownElement et réinjectés à la génération

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

CommandeCe qu'elle fait

init

Crée un feed depuis un template (basic, standard, advanced, expert)

generate

Génère du XML depuis une définition JSON

read

Affiche un feed (résumé, JSON ou XML)

validate

Vérifie contre une plateforme

lint

Validation rapide, mode strict optionnel

episodes

Liste les épisodes avec tri et limite

chapters

Extrait les chapitres

diff

Compare deux feeds

convert

Convertit entre formats

add-episode

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-parser pour 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 Sendable

  • Zero 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.

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.…

GitHub