🎙️ 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.
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
|