FeaturesImages & Media

Enable one extension and you have a podcast feed

The show is one record, the episodes are a collection the show names, and the feed is served for you at an address you hand to the directories. Everything Apple requires is a required field, so a show the directories would reject cannot be saved.

Standard Included in Standard and Pro

twig
{# Served for you, no page needed: #}
{# https://example.com/api/ext/totalcms/podcast/feed #}

{# Or on a Site Builder page at /podcast.xml, if you want your own address: #}
{{ podcast_feed() }}

{# Another show, with options: link, language, copyright, self #}
{{ podcast_feed('second-show', {link: '/', language: 'en-US'}) }}
The argument is the show collection and defaults to podcast; the episodes come from the show record. The feed's own address comes from the show's Feed URL field, so whichever route you publish, that field should match it.

Podcasting ships as the bundled Podcast extension, off until you need it — most sites do not have a podcast, and the ones that do should not pay for it in every other install. Enable it under Extensions and two schemas appear: podcast holds the show, podcast-episode holds the episodes. Create the episodes collection first, then the show collection from the podcast schema with Single Object Collection ticked, because a show has exactly one record — opening the collection opens the record. On that record you pick the episodes collection. A show owns exactly one, which is what lets a site host several shows: each is its own singleton collection with its own feed.

Everything Apple requires is a required field, so the form will not save a show the directories would reject. Cover art must be square, between 1400 and 3000 pixels a side, and a JPG or PNG. Categories come from Apple's own list, and the first one is the primary category directories show. The Feed URL is the public address of the feed: apps re-fetch with it and the show's permanent identifier is derived from it, so it is set once. Owner email and the explicit answer are required too. Funding links, the locked flag and a new feed URL are optional.

An episode needs a title, a date and its audio. Upload the audio to the Audio File field and Total CMS hosts it, serves it through the streaming route apps expect, and counts every listen — the number is on the file in the admin and reads in Twig as episode.audio.count. Or fill in the Audio URL when the file lives on your own bucket, with the size in bytes apps use for download progress. If both are set the upload wins; an episode with neither is left out. Transcripts and chapter files work the same way, uploaded or linked.

The feed is already published. The extension serves it as application/rss+xml at /api/ext/totalcms/podcast/feed for the show in the collection named podcast, and at /feed/{show} for any other — the same on a Stacks site as on Site Builder, with no page or template involved. Put that address in the show's Feed URL, open it in a browser, run it through a validator such as podba.se, then submit it to Apple Podcasts Connect, Spotify for Podcasters and the Podcast Index. If you would rather the feed live at an address of your own, a page whose whole content is podcast_feed() renders the same document.

Record on Thursday for a Monday release: upload the audio, date the episode Monday, save. It stays out of the feed until the date arrives, then appears at the top the next time an app fetches.

At a glance

What you get

The show is one record
Built as a Single Object Collection, so opening the collection opens the show. The record names its episodes collection, so a site can host several shows.
Apple's rules in the form
Cover art between 1400 and 3000 pixels square, categories picked from Apple's list, owner email and explicit. All required, all checked before the record saves.
Host it here or link it
Upload the audio and Total CMS serves it through the streaming route and counts every listen. Or point the Audio URL at your own bucket and supply the size in bytes.
Drafts and dated releases
The Draft box and a date in the future both keep an episode out of the feed. Date an episode ahead and it publishes itself when the day arrives.
The feed is served for you
Enable the extension and the feed is live at /api/ext/totalcms/podcast/feed — enclosures, iTunes tags and Podcast Index tags — with podcast_feed() for a page of your own.

Podcasting

Common questions

Do I need Site Builder to publish the feed?

No. The extension serves the feed at /api/ext/totalcms/podcast/feed on any Total CMS install, Stacks sites included, with nothing to create. Site Builder is only for putting the feed at an address of your own with the podcast_feed() Twig function.

Can I host the audio somewhere other than Total CMS?

Yes. Leave the Audio File field empty and fill in the Audio URL with the address on your host or bucket, plus the file size in bytes so apps can show download progress. If both a file and a URL are set, the uploaded file wins.

I am moving from another podcast host. Will subscribers follow?

Copy the existing GUID out of your old feed into the show's Podcast GUID field before you change the Feed URL, and set New Feed URL so apps switch. Change the GUID instead and every listener's app sees a brand-new show. Episode IDs work the same way — the ID is the item's identity in the feed.

What about a show with real download numbers?

The streaming route is fine for a few hundred downloads an episode. Beyond that, serve the audio from your own storage bucket and use the Audio URL field: bandwidth stops being your web host's problem, and the byte-range requests apps rely on for scrubbing are handled by the bucket.

Does Total CMS count downloads?

For uploaded audio, yes. Every fetch through the streaming route adds one to the file's download count, shown on the file in the admin and available in Twig as episode.audio.count. It is a plain fetch count that includes validators and re-downloads, so read it as a trend rather than an audit. Linked audio never passes through Total CMS and is not counted.

Try it on a site of your own.

45 days, every Pro feature, no credit card. Build it, hand it to a client, and see what they can and can’t touch.