Want to make a site for your podast? I went about that for the Design System Office Hours podcast side. The site is entirely populated from its RSS feed and the function below is what I use to extract all data from the feed into something digestible for site creation.
Instructions
Copy the code below into a file on your machine. Let’s name it ex.js
Fire up a Terminal window and cd to the directory where you saved the extractPodcastData.js file
This script requires @xmldom/xmldom. To install, cd into your project’s directory and run npm i @xmldom/xmldom --save-dev in your terminal. I try to avoid using third-party libraries, but I ended up taking a shortcut for this project.
This function is intended to act as a utility, so import the js file into your main JavaScript file. See example below:
import extractPodcastData from "./extractPodcastData.js";
const REMOTE_XML_PATH = "https://path-to-podcast-rss-feed"
var podcastData = await extractPodcastData(REMOTE_XML_PATH);
console.log(podcastData)
import { DOMParser } from "@xmldom/xmldom";
export default async function extractPodcastData(url, dateLocale = "en") {
let episodes = [];
let data = await fetch(url);
let xml = await data.text();
let parser = new DOMParser();
let xmlDoc = parser.parseFromString(xml, "text/xml");
let items = xmlDoc.getElementsByTagName("item");
let dateObj;
for (let i = 0; i < items.length; i++) {
let episodeObj = {};
episodeObj.title =
items[i].getElementsByTagName("title")[0].firstChild.data;
episodeObj.description =
items[i].getElementsByTagName("description")[0].firstChild.data;
episodeObj.link = items[i].getElementsByTagName("link")[0].firstChild.data;
dateObj = new Date(
items[i].getElementsByTagName("pubDate")[0].firstChild.data,
);
let year = new Intl.DateTimeFormat(dateLocale, { year: "numeric" }).format(
dateObj,
);
let month = new Intl.DateTimeFormat(dateLocale, { month: "long" }).format(
dateObj,
);
let day = new Intl.DateTimeFormat(dateLocale, { day: "numeric" }).format(
dateObj,
);
episodeObj.date = `${month} ${day}, ${year}`;
episodeObj.audioFile = items[i]
.getElementsByTagName("enclosure")[0]
.getAttribute("url");
episodes.push(episodeObj);
}
return episodes;
}