UNPKG

feedsmith

Version:

Fast, all‑in‑one feed parser and generator for RSS, Atom, RDF, and JSON Feed, with support for Podcast, iTunes, Dublin Core, and OPML files.

77 lines (76 loc) 4.35 kB
import { isNonEmptyStringOrNumber, isObject, parseArrayOf, parseBoolean, parseCsvOf, parseNumber, parseSingularOf, parseString, parseYesNoBoolean, retrieveText, trimObject } from "../../../common/utils.js"; //#region src/namespaces/itunes/parse/utils.ts const explicitOrYesRegex = /^\p{White_Space}*(explicit|yes)\p{White_Space}*$/iu; const durationRegex = /^(?:(\d+):)?(\d+):(\d+)$/; const parseCategory = (value) => { if (!isObject(value)) return; return trimObject({ text: parseString(value["@text"]), categories: parseArrayOf(value["itunes:category"], parseCategory) }); }; const parseOwner = (value) => { if (!isObject(value)) return; return trimObject({ name: parseSingularOf(value["itunes:name"], (value) => parseString(retrieveText(value))), email: parseSingularOf(value["itunes:email"], (value) => parseString(retrieveText(value))) }); }; const parseExplicit = (value) => { const boolean = parseBoolean(value); if (boolean !== void 0) return boolean; if (typeof value === "string") return explicitOrYesRegex.test(value); }; const parseDuration = (value) => { const duration = parseNumber(value); if (duration !== void 0) return duration; if (typeof value !== "string") return; const match = value.match(durationRegex); if (match) { const [, hours, minutes, seconds] = match; return Number(hours || 0) * 3600 + Number(minutes) * 60 + Number(seconds); } }; const parseImage = (value) => { if (isNonEmptyStringOrNumber(value)) return parseString(value); if (!isObject(value)) return; return parseString(value["@href"]); }; const retrieveItem = (value) => { if (!isObject(value)) return; return 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))), author: parseSingularOf(value["itunes:author"], (value) => parseString(retrieveText(value))), title: parseSingularOf(value["itunes:title"], (value) => parseString(retrieveText(value))), episode: parseSingularOf(value["itunes:episode"], (value) => parseNumber(retrieveText(value))), season: parseSingularOf(value["itunes:season"], (value) => parseNumber(retrieveText(value))), episodeType: parseSingularOf(value["itunes:episodetype"], (value) => parseString(retrieveText(value))), block: parseSingularOf(value["itunes:block"], (value) => parseYesNoBoolean(retrieveText(value))), summary: parseSingularOf(value["itunes:summary"], (value) => parseString(retrieveText(value))), subtitle: parseSingularOf(value["itunes:subtitle"], (value) => parseString(retrieveText(value))), keywords: parseSingularOf(value["itunes:keywords"], (value) => parseCsvOf(retrieveText(value), parseString)) }); }; const retrieveFeed = (value) => { if (!isObject(value)) return; return trimObject({ image: parseSingularOf(value["itunes:image"], parseImage), explicit: parseSingularOf(value["itunes:explicit"], (value) => parseExplicit(retrieveText(value))), author: parseSingularOf(value["itunes:author"], (value) => parseString(retrieveText(value))), title: parseSingularOf(value["itunes:title"], (value) => parseString(retrieveText(value))), type: parseSingularOf(value["itunes:type"], (value) => parseString(retrieveText(value))), newFeedUrl: parseSingularOf(value["itunes:new-feed-url"], (value) => parseString(retrieveText(value))), block: parseSingularOf(value["itunes:block"], (value) => parseYesNoBoolean(retrieveText(value))), complete: parseSingularOf(value["itunes:complete"], (value) => parseYesNoBoolean(retrieveText(value))), applePodcastsVerify: parseSingularOf(value["itunes:applepodcastsverify"], (value) => parseString(retrieveText(value))), categories: parseArrayOf(value["itunes:category"], parseCategory), owner: parseSingularOf(value["itunes:owner"], parseOwner), summary: parseSingularOf(value["itunes:summary"], (value) => parseString(retrieveText(value))), subtitle: parseSingularOf(value["itunes:subtitle"], (value) => parseString(retrieveText(value))), keywords: parseSingularOf(value["itunes:keywords"], (value) => parseCsvOf(retrieveText(value), parseString)) }); }; //#endregion export { parseCategory, parseDuration, parseExplicit, parseImage, parseOwner, retrieveFeed, retrieveItem };