import RSSParser from 'rss-parser'; export type PodcastFeed = { image: { url: string, title: string; }, paginationLinks: { self: string; }, title: string; description: string; pubDate: string; generator: string; language: string; copyright: string; lastBuildDate: string; itunes: { owner: { name: string; }, image: string; categories: string[] categoriesWithSubs: { name: string; subs: [{name: string}], }[] keywords:string[] author: string; subtitle: string; summary: string; explicit: string; }, siteUrl: string; }; export type PodcastItem = { creator: string; title: string; link: string; pubDate: string; author: string; 'document:encoded': string; 'document:encodedSnippet': string; enclosure: { url: string; length: string; type: string; }; document: string; documentSnippet: string; guid: string; isoDate: string; itunes: { author: string; subtitle: string; summary: string; explicit: string; duration: string; image: string; episode: string; keywords: string; }, }; export type Podcast = PodcastFeed & RSSParser.Output; const rss = new RSSParser(); const parse = async (url: string): Promise => { return await rss.parseURL(url); }; function getPosition(value: string, sub: string, index: number): number { const result = value.split(sub, index).join(sub).length; return result < value.length ? result : -1; } /** * Can handle hh:mm:ss, or mm:ss, or ss */ const convertDurationToSeconds = (duration: string): number => { const firstColon = getPosition(duration, ':', 1); const secondColon = getPosition(duration, ':', 2); if (firstColon === -1) return Number(duration); if (secondColon === -1) { const minutes = Number(duration.substring(0, firstColon)); const seconds = Number(duration.substring(firstColon + 1)); return (minutes * 60) + seconds; } const hours = Number(duration.substring(0, firstColon)); const minutes = Number(duration.substring(firstColon + 1, secondColon)); const seconds = Number(duration.substring(secondColon + 1)); return (hours * 60 * 60) + (minutes * 60) + seconds; }; const durationSeconds = (items: PodcastItem[]): number => { return items .map((item: PodcastItem) => { const seconds = convertDurationToSeconds(item?.itunes?.duration ?? '0'); return seconds; }) .reduce((c, n) => c + n, 0); }; const durationHours = (items: PodcastItem[]): number => { const seconds = durationSeconds(items); return seconds > 0 ? Math.ceil(seconds / 3600) : 0; }; const transcriptionCost = (items: PodcastItem[]): number => { const hours = durationHours(items); return hours * 0.5 * 100; }; const RSSUtil = { parse, durationSeconds, durationHours, transcriptionCost, }; export default RSSUtil;