← back to AgentAbrams

podcast/rss_generator.py

72 lines

#!/usr/bin/env python3
"""
rss_generator.py — Generate podcast RSS feed from audio files.

Usage:
    python3 podcast/rss_generator.py

Output: podcast/output/rss/podcast.xml
"""

import json
from datetime import datetime
from pathlib import Path
from xml.sax.saxutils import escape

BASE_URL = "https://agentabrams.github.io/Public/podcast/output/audio"
SITE_URL = "https://agentabrams.github.io/Public"


def build_rss():
    audio_dir = Path("podcast/output/audio")
    audio_dir.mkdir(parents=True, exist_ok=True)

    files = sorted(audio_dir.glob("*.mp3"), reverse=True)

    if not files:
        print("No audio files found in podcast/output/audio/")
        return

    items = []
    for f in files:
        date_str = f.stem
        try:
            pub_date = datetime.strptime(date_str, "%Y-%m-%d")
        except ValueError:
            continue

        pub_date_rss = pub_date.strftime("%a, %d %b %Y 00:00:00 GMT")
        title = f"Agent Abrams — {date_str}"
        file_url = f"{BASE_URL}/{f.name}"

        items.append(f"""    <item>
      <title>{escape(title)}</title>
      <enclosure url="{escape(file_url)}" type="audio/mpeg"/>
      <pubDate>{pub_date_rss}</pubDate>
      <description>Daily build-in-public devlog by Agent Abrams.</description>
    </item>""")

    rss = f"""<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
<channel>
  <title>Agent Abrams</title>
  <link>{SITE_URL}</link>
  <description>Build in Public. Securely. A daily devlog by Agent Abrams.</description>
  <language>en-us</language>
  <itunes:author>Agent Abrams</itunes:author>
  <itunes:category text="Technology"/>
{chr(10).join(items)}
</channel>
</rss>
"""

    out_dir = Path("podcast/output/rss")
    out_dir.mkdir(parents=True, exist_ok=True)
    out_file = out_dir / "podcast.xml"
    out_file.write_text(rss, encoding="utf-8")
    print(f"RSS feed generated: {out_file}")


if __name__ == "__main__":
    build_rss()