Convert podcast metadata from YAML to RSS 2.0 feeds compatible with Apple Podcasts, Spotify, and major podcast platforms.
Project description
๐๏ธ YAML to RSS Automation ย |ย ๐ก iTunes Compatible ย |ย โจ Multi-Episode Support
๐๏ธ Podcast RSS Generator
A lightweight Python tool that transforms podcast metadata from YAML into production-ready RSS feeds compatible with all major podcast platforms: Apple Podcasts, Spotify, Google Podcasts, and more.
Write your podcast config once in human-readable YAML. Generate standards-compliant RSS feeds instantly. Deploy to any podcast directory.
๐ง What This System Does
feed.yaml (Your Podcast Config)
โ
podcast-rss-generator (CLI Tool)
โ
podcast.xml (RSS Feed)
โ
โ Apple Podcasts
โ Spotify
โ Google Podcasts
โ Any RSS Reader
โ Your Website
No more manual XML editing. No more broken podcast feeds. Just YAML + Python + RSS.
โ๏ธ Key Features
โ Simple YAML Configuration - Human-readable podcast & episode metadata
โ RSS 2.0 Standard - Full compliance with podcast specifications
โ iTunes Integration - Category, artwork, duration, and author metadata
โ Multi-Episode Support - Unlimited episodes with audio file management
โ Dynamic URLs - Configurable base URL for all asset links
โ UTF-8 Encoding - Proper character encoding for international characters
โ Version Control Friendly - Keep your feed in git, track every change
๐๏ธ Project Structure
podcast-test/
โโโ podcast_rss_generator/ # ๐ฆ Main package
โ โโโ __init__.py # Package exports & version
โ โโโ generator.py # Core RSS generation engine
โ โโโ cli.py # Command-line interface
โ
โโโ tests/ # ๐งช Test suite
โ โโโ __init__.py
โ โโโ conftest.py
โ
โโโ feed.yaml # ๐ Example config (you edit this)
โโโ podcast.xml # ๐ก Generated RSS feed (output)
โ
โโโ pyproject.toml # ๐ง Modern package config (PEP 517/518)
โโโ setup.py # ๐ง Traditional setup config
โโโ MANIFEST.in # ๐ฆ File inclusion rules
โโโ requirements.txt # ๐ฆ Production dependencies
โโโ requirements-dev.txt # ๐ ๏ธ Development dependencies
โ
โโโ README.md # ๐ This file
โโโ INSTALLATION.md # ๐พ Installation guide
โโโ PACKAGE_DESCRIPTION.md # ๐ Full package overview
โโโ PYPI_PUBLISHING_GUIDE.md # ๐ How to publish to PyPI
โโโ PROJECT_SUMMARY.md # ๐ฏ Enhancement summary
โโโ LICENSE # ๐ MIT License
๐ฅ Installation
Option 1: Install from PyPI (Recommended)
pip install podcast-rss-generator
Then use the CLI:
podcast-rss-generator --input feed.yaml --output podcast.xml
Option 2: Install from Source
git clone https://github.com/saitejabandaru-in/podcast-test.git
cd podcast-test
pip install -e .
Option 3: Run Locally
pip install pyyaml
python feed.py
๐ป Usage
Command Line Interface
# Using default filenames (feed.yaml โ podcast.xml)
podcast-rss-generator
# Custom input/output
podcast-rss-generator --input my-podcast.yaml --output my-feed.xml
# Show help
podcast-rss-generator --help
# Show version
podcast-rss-generator --version
Python API
from podcast_rss_generator import generate_rss_feed
# Generate RSS feed from YAML
output_path = generate_rss_feed("feed.yaml", "podcast.xml")
print(f"โ
Feed generated: {output_path}")
๐ Configuration Guide
Podcast Metadata (Top Level)
title: Your Podcast Title # Display name
subtitle: Your Tagline # Short description (1-2 lines)
author: Your Name # Podcast host/creator
description: Full description # Complete podcast description
link: https://example.com # Base URL (prepended to all paths)
image: /images/artwork.jpg # Podcast artwork path
language: en-us # Language code (en-us, es-es, etc.)
category: Technology # iTunes category
format: audio/mpeg # Audio format (usually audio/mpeg)
Episodes Section
Add episodes to the item array. Each episode needs:
item:
- title: "Episode Title" # Display name
description: "What this episode is about" # Episode description
published: "Thu, 12 Jan 2023 18:00:00 GMT" # RFC 2822 format
file: /audio/episode.mp3 # Audio file path (relative to link)
duration: "00:45:30" # Length in HH:MM:SS
length: 54567123 # File size in bytes
Publication Date Format: Must follow RFC 2822 (e.g., Thu, 12 Jan 2023 18:00:00 GMT)
๐ Workflow
Step 1: Edit Configuration
Edit feed.yaml with your podcast details and episodes:
nano feed.yaml
# or use VSCode, Sublime, or your favorite editor
Step 2: Generate Feed
Use the CLI command:
podcast-rss-generator --input feed.yaml --output podcast.xml
Or use the Python API:
from podcast_rss_generator import generate_rss_feed
generate_rss_feed("feed.yaml", "podcast.xml")
Step 3: Deploy
Upload podcast.xml to your web server and submit the feed URL to podcast platforms:
- Apple Podcasts
- Spotify
- Google Podcasts
- All RSS directory services
๐ก Usage Examples
Example 1: Adding a New Episode
- title: "EP06-New Topic"
description: "Deep dive into the latest trends"
published: "Thu, 16 Feb 2023 18:00:00 GMT"
file: /audio/TFIT06.mp3
duration: "00:35:00"
length: 42000000
Then run:
podcast-rss-generator
Example 2: Updating Podcast Title
title: "The Future in Tech - Season 2"
subtitle: "Advanced Topics & Expert Interviews"
Re-run the generator โ all episodes inherit new metadata.
Example 3: Changing the Base URL
link: https://mynewsite.com
All episode audio paths automatically prepend the new URL:
/audio/ep1.mp3โhttps://mynewsite.com/audio/ep1.mp3
๐ What This Project Demonstrates
โ Professional Python package structure (PEP 517/518)
โ CLI development with argparse
โ YAML configuration management
โ XML generation from structured data
โ RSS/podcast standards knowledge
โ iTunes integration and compatibility
โ Clean, modular Python scripting
โ Version-controlled podcast distribution
โ PyPI package publishing
๐งช Tech Stack
- Python: 3.6+
- Runtime: PyYAML, xml.etree.ElementTree (stdlib)
- Development: setuptools, pytest, black, flake8, twine
๐ Requirements
- Python: 3.6 or higher
- Dependencies: pyyaml (auto-installed with package)
- Workflow: YAML config file + valid podcast metadata
- Hosting: Audio files accessible from your base URL
๐ Documentation
| Document | Purpose |
|---|---|
| README.md | Main guide & examples (this file) |
| INSTALLATION.md | Setup instructions |
| PACKAGE_DESCRIPTION.md | Full package overview |
| PYPI_PUBLISHING_GUIDE.md | How to publish to PyPI |
| PROJECT_SUMMARY.md | What was improved |
๏ฟฝ Workflow Tips
- Version Control - Keep
feed.yamlin git, track all episode changes - Validate Feed - Use podtrac.com or podbase.io to validate
- Host the XML - Upload
podcast.xmlto your web server - Submit URLs - Most platforms accept your feed URL (e.g.,
https://yourdomain.com/podcast.xml) - Update Regularly - Edit
feed.yaml, runpodcast-rss-generator, redeploy - Test Locally - Keep multiple copies for testing different configurations
๐จโ๐ป Author
Sai Teja Bandaru
Data Scientist & Open Source Developer
๐ https://www.saitejabandaru.com/
๐ License
MIT License โ see LICENSE for details.
โญ Support
If you find this useful:
โญ Star the repo โ helps others discover it
๐ด Fork it โ build on it for your use case
๐ Report issues โ help improve the tool
Building automation-driven workflows for content creators.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file podcast_rss_generator-1.0.0.tar.gz.
File metadata
- Download URL: podcast_rss_generator-1.0.0.tar.gz
- Upload date:
- Size: 9.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
747b98dbb46117658b219893c6fe04a58e40d823f37838c30bf98a8dc6f9c6a2
|
|
| MD5 |
00a3aecb24fc643b54291a87c96323a4
|
|
| BLAKE2b-256 |
9bd6e1280260f2f16f1939a59c708cddf3057471108d3c2f2e3d77eaeab98c5c
|
File details
Details for the file podcast_rss_generator-1.0.0-py3-none-any.whl.
File metadata
- Download URL: podcast_rss_generator-1.0.0-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7226d38abdef177df855a0a67233eefbfb6b4e24ff5a5cca808fe0a57b8def75
|
|
| MD5 |
873908227b80368810d744f928f514e0
|
|
| BLAKE2b-256 |
0e21109422a49acaf2b25ad0d2d141267ad00575c0228b9281f48e11bd977eb2
|