Owning my podcast again

About 3 min reading time

A few weeks ago, I decided to reactivate my podcast, "Herr Zenzes wills wissen". For the last few years, I hosted it with Podigee, but it became too expensive for my use case. I don't produce enough content to take full advantage of the smallest package, so I can save some money by hosting the podcast myself again.

To host the podcast myself, I needed to migrate it from Podigee without breaking my RSS feed. I followed these steps to achieve this:

  1. Create a script to import the podcast from Podigee. I want to manage the content with Markdown because I use 11ty, which works well with Markdown.
  2. Customize my page: I needed an RSS feed that has no changes to the current feed, and I had to include my podcast on my page as well.
  3. Create a script to add new episodes to the podcast.

My Podcast Importer

I needed a script to import a podcast and asked ChatGPT to generate one that fit my requirements. The generated script worked well, but I had to make a few adjustments.

Here are the steps the script follows:

  1. Parse the RSS feed of the podcast.
  2. Download the MP3 file for each episode.
  3. For each episode, extract metadata from the MP3 file and the RSS feed and save it in a markdown file.

I utilized the rss-parser library to convert the RSS feed into JSON. This library only requires the feed's URL to function. I then extracted the MP3 download URL from this JSON and saved the file to my local disk. Using music-metadata, I determined the duration and file size of the MP3 file, and combined this information with the data from the RSS feed. Finally, I used js-yaml and turndown to save this metadata as Front Matter in the Markdown file. The MP3 files are stored in an S3 bucket which I created manually.

The tool is available on GitHub.

Website and RSS Feed

To create the RSS feed, I followed this tutorial from Marc Littlemore. To avoid problems, I ensured that the new feed is identical to the old one.

My final template looks like this:

---
permalink: podcast/feed.xml
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" version="2.0">
    <channel>
        <atom:link href="https://pubsubhubbub.appspot.com/" rel="hub"/>
        <atom:link href="{{metadata.url}}{{podcast.feedPath}}" rel="self"/>
        <atom:link href="{{metadata.url}}{{podcast.feedPath}}" rel="first"/>
        <atom:link href="{{metadata.url}}{{podcast.feedPath}}?page=1" rel="last"/>
        <title>{{podcast.title}}</title>
        <language>de</language>
        <pubDate>{{now}}</pubDate>
        <lastBuildDate>{{collections.podcast | collectionLastUpdatedDate}}</lastBuildDate>
        <generator>Eleventy</generator>
        <description>{{podcast.description | xmlEscape}}</description>
        <link>{{metadata.url}}</link>
        <itunes:type>episodic</itunes:type>
        <itunes:new-feed-url>{{metadata.url}}{{podcast.feedPath}}</itunes:new-feed-url>
        <image>
            <url>{{podcast.cover}}</url>
            <title>{{podcast.title}}</title>
            <link>{{metadata.url}}</link>
        </image>
        <itunes:image href="{{podcast.cover}}"/>
        <itunes:subtitle></itunes:subtitle>
        <itunes:author>{{metadata.author.name}}</itunes:author>
        <itunes:explicit>no</itunes:explicit>
        <itunes:keywords></itunes:keywords>
        <itunes:category text="Technology"/>
        <itunes:category text="Education">
            <itunes:category text="How To"/>
        </itunes:category>
        <itunes:summary>{{podcast.description}}</itunes:summary>
        <itunes:owner>
            <itunes:name>{{metadata.author.name}}</itunes:name>
            <itunes:email>{{metadata.author.email}}</itunes:email>
        </itunes:owner>
        {%- for post in collections.podcast | reverse %}
            {%- set absolutePostUrl = post.url | absoluteUrl(metadata.url) %}
            <item>
                <title>{{ post.data.title }}</title>
                <itunes:title>{{ post.data.title }}</itunes:title>
                <description>{{post.data.summary}}</description>
                <pubDate>{{ post.data.date | toRfc822Date }}</pubDate>
                <link>{{ absolutePostUrl }}</link>
                <guid isPermaLink="false">{{post.data.guid}}</guid>
                <content:encoded>
                    <![CDATA[{{post.content | htmlToAbsoluteUrls(absolutePostUrl)| safe}}]]>
                </content:encoded>
                <itunes:episode>{{post.data.episode}}</itunes:episode>
                <itunes:episodeType>full</itunes:episodeType>
                <itunes:subtitle>{{post.data.subtitle}}</itunes:subtitle>
                <itunes:summary>{{post.data.summary}}</itunes:summary>
                <itunes:season>{{post.data.season}}</itunes:season>
                <itunes:explicit>no</itunes:explicit>
                <itunes:keywords>{{post.data.tags}}</itunes:keywords>
                <itunes:author>{{metadata.author.name}}</itunes:author>
                <enclosure url="{{podcast.cdn}}/{{post.data.mp3}}" type="audio/mpeg" length="{{post.data.fileSize}}"/>
                <itunes:duration>{{post.data.duration}}</itunes:duration>
            </item>
        {%- endfor %}
    </channel>
</rss>

Since there is a Markdown file for each episode, I can also generate HTML from them using 11ty.

Creating New Episodes

My editing process hasn't changed much: I prepare the MP3 files using Reaper/Ultrasound. I use a second script (similar to the one mentioned above) to generate the metadata and save it in a Markdown file. The episode is then uploaded to S3. Finally, I write the show notes, and everything is ready to be released.

What Went Wrong

Most things worked right away, and exporting from Podigee was straightforward. I updated the settings on iTunes and Spotify myself to be on the safe side, and everything was working. The only time I had problems was when I deleted my Podigee podcast after a week. For some reason, Podigee then deleted my old podcast from Spotify as well. I was able to undo this by adding my podcast to Spotify again. All the stats and URLs seem to be the same as before.

Conclusion

The export process was easier than anticipated and went smoothly. The new release process is actually better than the previous one. In the past, I had to share the MP3 file with my guests via file sharing and send them my show notes via email. Now, I can create a merge request on GitHub, and Netlify generates a preview that I can share with my guests for review.

The next step is to create my own statistics to track how the podcast is developing. The current costs are reasonable, and the additional effort is manageable.

Overall, I still believe that Podigee is a good tool to host your own podcast. However, it was an interesting experience to host the podcast myself again and adjust my process. I'm happy with the current state of the podcast and the simplified release process.


This post is based on my opinion and experience. It is based on what worked for me in my context. I recognize, that your context is different.
The "Just Sharing" Principle