UNPKG

feedsmith

Version:

Robust and fast parser and generator for RSS, Atom, JSON Feed, and RDF feeds, with support for Podcast, iTunes, Dublin Core, and OPML files.

104 lines 4.67 kB
import { isNonEmptyStringOrNumber, isObject, isPresent, parseArrayOf, parseBoolean, parseCsvOf, parseNumber, parseSingularOf, parseString, parseTextNumber, parseTextString, parseYesNoBoolean, retrieveText, trimObject, } from '../../common/utils.js'; export const parseCategory = (value) => { if (!isObject(value)) { return; } const category = { text: parseString(value['@text']), categories: parseArrayOf(value['itunes:category'], parseCategory), }; if (isPresent(category.text)) { return trimObject(category); } }; export const parseOwner = (value) => { if (!isObject(value)) { return; } const owner = { name: parseSingularOf(value['itunes:name'], parseTextString), email: parseSingularOf(value['itunes:email'], parseTextString), }; if (isPresent(owner.name) || isPresent(owner.email)) { return trimObject(owner); } }; export const parseExplicit = (value) => { const boolean = parseBoolean(value); if (boolean !== undefined) { return boolean; } if (typeof value === 'string') { const lowercase = value.toLowerCase(); // There are also cases of "clean" and "f", but those are considered false. return lowercase === 'explicit' || lowercase === 'yes'; } }; export const parseDuration = (value) => { const duration = parseNumber(value); if (duration !== undefined) { return duration; } if (typeof value !== 'string') { return; } // Handle HH:MM:SS and MM:SS format. const match = value.match(/^(?:(\d+):)?(\d+):(\d+)$/); if (match) { const [, hours, minutes, seconds] = match; return Number(hours || 0) * 3600 + Number(minutes) * 60 + Number(seconds); } }; export const parseImage = (value) => { // Support non-standard format of the image tag where href is not provided in the @href // attribute but rather provided as a node value. if (isNonEmptyStringOrNumber(value)) { return parseString(value); } if (!isObject(value)) { return; } return parseString(retrieveText(value['@href'])); }; export const retrieveItem = (value) => { if (!isObject(value)) { return; } const item = trimObject({ duration: parseSingularOf(value['itunes:duration'], (value) => parseDuration(retrieveText(value))), image: parseSingularOf(value['itunes:image'], parseImage), explicit: parseSingularOf(value['itunes:explicit'], (value) => parseExplicit(retrieveText(value))), title: parseSingularOf(value['itunes:title'], parseTextString), episode: parseSingularOf(value['itunes:episode'], parseTextNumber), season: parseSingularOf(value['itunes:season'], parseTextNumber), episodeTitle: parseSingularOf(value['itunes:episodetype'], parseTextString), block: parseSingularOf(value['itunes:block'], (value) => parseYesNoBoolean(retrieveText(value))), summary: parseSingularOf(value['itunes:summary'], parseTextString), subtitle: parseSingularOf(value['itunes:subtitle'], parseTextString), keywords: parseSingularOf(value['itunes:keywords'], (value) => parseCsvOf(retrieveText(value), parseString)), }); return item; }; export const retrieveFeed = (value) => { if (!isObject(value)) { return; } const feed = trimObject({ image: parseSingularOf(value['itunes:image'], parseImage), explicit: parseSingularOf(value['itunes:explicit'], (value) => parseExplicit(retrieveText(value))), author: parseSingularOf(value['itunes:author'], parseTextString), title: parseSingularOf(value['itunes:title'], parseTextString), type: parseSingularOf(value['itunes:type'], parseTextString), newFeedUrl: parseSingularOf(value['itunes:new-feed-url'], parseTextString), block: parseSingularOf(value['itunes:block'], (value) => parseYesNoBoolean(retrieveText(value))), complete: parseSingularOf(value['itunes:complete'], (value) => parseYesNoBoolean(retrieveText(value))), applePodcastsVerify: parseSingularOf(value['itunes:applepodcastsverify'], parseTextString), categories: parseArrayOf(value['itunes:category'], parseCategory), owner: parseSingularOf(value['itunes:owner'], parseOwner), summary: parseSingularOf(value['itunes:summary'], parseTextString), subtitle: parseSingularOf(value['itunes:subtitle'], parseTextString), keywords: parseSingularOf(value['itunes:keywords'], (value) => parseCsvOf(retrieveText(value), parseString)), }); return feed; }; //# sourceMappingURL=utils.js.map