UNPKG

podcastsuite

Version:

A set of utilities to work with Podcasts

153 lines (140 loc) 3.76 kB
import { IRSS, IPodcast } from "./PodcastSuite"; export interface IEpisode { title: string; description: string; url: string; link: string; guid: string; podcast: string; media?: { length: string; type: string; url: string; } | string, extra?: { content?: string; thumbnail?: string; } image?: string; created?: number; subtitle?: string; summary?: string; author?: string; explicit?: string; season?: string; duration?: number; episode?: string; episodeType?: string; enclosures?: string[]; } export default function format( json: IRSS, init: { length?: number; url?: string; etag?: number } = { length: Date.now(), } ): IPodcast { const link = init.url; const channel = Array.isArray(json.rss.channel) ? json.rss.channel[0] : json.rss.channel; const rss: any = Object.assign(init, { items: [], created: Date.now() }); if (channel.image) { rss.image = channel.image[0].url; } if (!rss.image && channel["itunes:image"]) { rss.image = channel["itunes:image"][0].href; } [ "title", "description", "link", "itunes:author", "itunes:category", "itunes:explicit", "itunes:type", "itunes:summary", "copyright", "language", ].forEach((key) => { if (channel[key] !== undefined) { const [prefix, keyname] = key.split(":"); if (keyname) { rss[keyname] = channel[key] && channel[key][0]; } else { rss[prefix] = channel[key] && channel[key][0]; } } }); rss.image = (Array.isArray(rss.image) && rss.image[0]) || rss.image; if (channel.item) { if (!Array.isArray(channel.item)) { channel.item = [channel.item]; } channel.item.forEach(function (val) { const title = val.title ? val.title[0] : ""; const description = val.description ? val.description[0] : ""; const url = val.link ? val.link[0] : ""; const guid = val.guid && val.guid[0] && (val.guid[0]["_"] || val.guid[0]); const obj: IEpisode = { title, description, url, guid, podcast: init.url, link, media: '' }; [ "itunes:subtitle", "itunes:summary", "itunes:author", "itunes:explicit", "itunes:duration", "itunes:season", "itunes:episode", "itunes:episodeType", ].forEach((key) => { if (val[key] !== undefined) { const [prefix, keyname] = key.split(":"); if (keyname) { obj[keyname] = val[key] && val[key][0]; } else { obj[prefix] = val[key] && val[key][0]; } } }); if (val["itunes:image"]) { const hasImageHref = val["itunes:image"][0] && val["itunes:image"][0].href; const image = hasImageHref ? val["itunes:image"][0].href[0] : null; obj.image = image; } if (val.pubDate) { obj.created = Date.parse(val.pubDate[0]); } obj.extra = {}; if (val["media:content"]) { obj.extra.content = val["media:content"]; } if (val["media:thumbnail"]) { obj.extra.thumbnail = val["media:thumbnail"]; } if (val.enclosure) { const enclosures = []; if (!Array.isArray(val.enclosure)) val.enclosure = [val.enclosure]; val.enclosure.forEach(function (enclosure) { var enc = {}; for (const x in enclosure) { enc[x] = enclosure[x][0]; } enclosures.push(enc); }); obj.enclosures = enclosures; obj.media = enclosures.length > 0 ? enclosures[0] : null; } rss.items.push(obj); }); } return { ...rss, ...init }; }