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.

198 lines (197 loc) 12.2 kB
import { detectNamespaces, isObject, parseArrayOf, parseBoolean, parseDate, parseNumber, parseSingular, parseSingularOf, parseString, retrieveText, trimArray, trimObject } from "../../../common/utils.js"; import { retrieveFeed as retrieveFeed$1 } from "../../../namespaces/admin/parse/utils.js"; import { retrieveItemOrFeed } from "../../../namespaces/cc/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$1 } from "../../../namespaces/creativecommons/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$2 } from "../../../namespaces/dc/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$3 } from "../../../namespaces/dcterms/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$4 } from "../../../namespaces/geo/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$5 } from "../../../namespaces/georss/parse/utils.js"; import { retrieveFeed as retrieveFeed$2, retrieveItem } from "../../../namespaces/googleplay/parse/utils.js"; import { retrieveFeed as retrieveFeed$3, retrieveItem as retrieveItem$1 } from "../../../namespaces/itunes/parse/utils.js"; import { retrieveItemOrFeed as retrieveItemOrFeed$6 } from "../../../namespaces/media/parse/utils.js"; import { retrieveFeed as retrieveFeed$4 } from "../../../namespaces/opensearch/parse/utils.js"; import { retrieveFeed as retrieveFeed$5, retrieveItem as retrieveItem$2 } from "../../../namespaces/pingback/parse/utils.js"; import { retrieveItem as retrieveItem$3 } from "../../../namespaces/psc/parse/utils.js"; import { retrieveItem as retrieveItem$4 } from "../../../namespaces/slash/parse/utils.js"; import { retrieveFeed as retrieveFeed$6 } from "../../../namespaces/sy/parse/utils.js"; import { retrieveItem as retrieveItem$5 } from "../../../namespaces/thr/parse/utils.js"; import { retrieveItem as retrieveItem$6 } from "../../../namespaces/trackback/parse/utils.js"; import { retrieveItem as retrieveItem$7 } from "../../../namespaces/wfw/parse/utils.js"; import { retrieveEntry, retrieveFeed as retrieveFeed$7 } from "../../../namespaces/atom/parse/utils.js"; import { retrieveItem as retrieveItem$8 } from "../../../namespaces/content/parse/utils.js"; import { retrieveFeed as retrieveFeed$8, retrieveItem as retrieveItem$9 } from "../../../namespaces/acast/parse/utils.js"; import { retrieveFeed as retrieveFeed$9 } from "../../../namespaces/blogchannel/parse/utils.js"; import { retrieveFeed as retrieveFeed$10 } from "../../../namespaces/feedpress/parse/utils.js"; import { retrieveFeed as retrieveFeed$11, retrieveItem as retrieveItem$10 } from "../../../namespaces/podcast/parse/utils.js"; import { retrieveFeed as retrieveFeed$12, retrieveItem as retrieveItem$11 } from "../../../namespaces/prism/parse/utils.js"; import { retrieveFeed as retrieveFeed$13, retrieveItem as retrieveItem$12 } from "../../../namespaces/rawvoice/parse/utils.js"; import { retrieveFeed as retrieveFeed$14, retrieveItem as retrieveItem$13 } from "../../../namespaces/source/parse/utils.js"; import { retrieveFeed as retrieveFeed$15, retrieveItem as retrieveItem$14 } from "../../../namespaces/spotify/parse/utils.js"; //#region src/feeds/rss/parse/utils.ts const parsePerson = (value) => { return parseSingularOf(value?.name ?? value, (value) => parseString(retrieveText(value))); }; const parseCategory = (value) => { return trimObject({ name: parseString(retrieveText(value)), domain: parseString(value?.["@domain"]) }); }; const parseCloud = (value) => { if (!isObject(value)) return; return trimObject({ domain: parseString(value["@domain"]), port: parseNumber(value["@port"]), path: parseString(value["@path"]), registerProcedure: parseString(value["@registerprocedure"]), protocol: parseString(value["@protocol"]) }); }; const parseImage = (value) => { if (!isObject(value)) return; return trimObject({ url: parseSingularOf(value.url, (value) => parseString(retrieveText(value))), title: parseSingularOf(value.title, (value) => parseString(retrieveText(value))), link: parseSingularOf(value.link, (value) => parseString(retrieveText(value))), description: parseSingularOf(value.description, (value) => parseString(retrieveText(value))), height: parseSingularOf(value.height, (value) => parseNumber(retrieveText(value))), width: parseSingularOf(value.width, (value) => parseNumber(retrieveText(value))) }); }; const parseTextInput = (value) => { if (!isObject(value)) return; return trimObject({ title: parseSingularOf(value.title, (value) => parseString(retrieveText(value))), description: parseSingularOf(value.description, (value) => parseString(retrieveText(value))), name: parseSingularOf(value.name, (value) => parseString(retrieveText(value))), link: parseSingularOf(value.link, (value) => parseString(retrieveText(value))) }); }; const retrieveImage = (value) => { return parseSingularOf(parseSingular(value?.channel)?.image, parseImage) ?? parseSingularOf(value?.image, parseImage); }; const retrieveTextInput = (value) => { return parseSingularOf(parseSingular(value?.channel)?.textinput, parseTextInput) ?? parseSingularOf(value?.textinput, parseTextInput); }; const retrieveItems = (value, options) => { return parseArrayOf(parseSingular(value?.channel)?.item, parseItem, options?.maxItems) ?? parseArrayOf(value?.item, parseItem, options?.maxItems); }; const parseSkipHours = (value) => { return trimArray(value?.hour, (value) => parseNumber(retrieveText(value))); }; const parseSkipDays = (value) => { return trimArray(value?.day, (value) => parseString(retrieveText(value))); }; const parseEnclosure = (value) => { if (!isObject(value)) return; return trimObject({ url: parseString(value["@url"]), length: parseNumber(value["@length"]), type: parseString(value["@type"]) }); }; const parseGuid = (value) => { return trimObject({ value: parseString(retrieveText(value)), isPermaLink: parseBoolean(value?.["@ispermalink"]) }); }; const parseSource = (value) => { return trimObject({ title: parseString(retrieveText(value)), url: parseString(value?.["@url"]) }); }; const parseItem = (value) => { if (!isObject(value)) return; const namespaces = detectNamespaces(value); return trimObject({ title: parseSingularOf(value.title, (value) => parseString(retrieveText(value))), link: parseSingularOf(value.link, (value) => parseString(retrieveText(value))), description: parseSingularOf(value.description, (value) => parseString(retrieveText(value))), authors: parseArrayOf(value.author, parsePerson), categories: parseArrayOf(value.category, parseCategory), comments: parseSingularOf(value.comments, (value) => parseString(retrieveText(value))), enclosures: parseArrayOf(value.enclosure, parseEnclosure), guid: parseSingularOf(value.guid, parseGuid), pubDate: parseSingularOf(value.pubdate, (value) => parseDate(retrieveText(value))), source: parseSingularOf(value.source, parseSource), atom: namespaces.has("atom") ? retrieveEntry(value) : void 0, cc: namespaces.has("cc") ? retrieveItemOrFeed(value) : void 0, dc: namespaces.has("dc") ? retrieveItemOrFeed$2(value) : void 0, content: namespaces.has("content") ? retrieveItem$8(value) : void 0, creativeCommons: namespaces.has("creativecommons") ? retrieveItemOrFeed$1(value) : void 0, slash: namespaces.has("slash") ? retrieveItem$4(value) : void 0, itunes: namespaces.has("itunes") ? retrieveItem$1(value) : void 0, podcast: namespaces.has("podcast") ? retrieveItem$10(value) : void 0, psc: namespaces.has("psc") ? retrieveItem$3(value) : void 0, googleplay: namespaces.has("googleplay") ? retrieveItem(value) : void 0, media: namespaces.has("media") ? retrieveItemOrFeed$6(value) : void 0, georss: namespaces.has("georss") ? retrieveItemOrFeed$5(value) : void 0, geo: namespaces.has("geo") ? retrieveItemOrFeed$4(value) : void 0, thr: namespaces.has("thr") ? retrieveItem$5(value) : void 0, dcterms: namespaces.has("dcterms") ? retrieveItemOrFeed$3(value) : void 0, prism: namespaces.has("prism") ? retrieveItem$11(value) : void 0, wfw: namespaces.has("wfw") ? retrieveItem$7(value) : void 0, sourceNs: namespaces.has("source") ? retrieveItem$13(value) : void 0, rawvoice: namespaces.has("rawvoice") ? retrieveItem$12(value) : void 0, spotify: namespaces.has("spotify") ? retrieveItem$14(value) : void 0, pingback: namespaces.has("pingback") ? retrieveItem$2(value) : void 0, trackback: namespaces.has("trackback") ? retrieveItem$6(value) : void 0, acast: namespaces.has("acast") ? retrieveItem$9(value) : void 0 }); }; const parseFeed = (value, options) => { const channel = parseSingular(value?.channel); if (!isObject(channel)) return; const namespaces = detectNamespaces(channel); return trimObject({ title: parseSingularOf(channel.title, (value) => parseString(retrieveText(value))), link: parseSingularOf(channel.link, (value) => parseString(retrieveText(value))), description: parseSingularOf(channel.description, (value) => parseString(retrieveText(value))), language: parseSingularOf(channel.language, (value) => parseString(retrieveText(value))), copyright: parseSingularOf(channel.copyright, (value) => parseString(retrieveText(value))), managingEditor: parseSingularOf(channel.managingeditor, parsePerson), webMaster: parseSingularOf(channel.webmaster, parsePerson), pubDate: parseSingularOf(channel.pubdate, (value) => parseDate(retrieveText(value))), lastBuildDate: parseSingularOf(channel.lastbuilddate, (value) => parseDate(retrieveText(value))), categories: parseArrayOf(channel.category, parseCategory), generator: parseSingularOf(channel.generator, (value) => parseString(retrieveText(value))), docs: parseSingularOf(channel.docs, (value) => parseString(retrieveText(value))), cloud: parseSingularOf(channel.cloud, parseCloud), ttl: parseSingularOf(channel.ttl, (value) => parseNumber(retrieveText(value))), image: retrieveImage(value), rating: parseSingularOf(channel.rating, (value) => parseString(retrieveText(value))), textInput: retrieveTextInput(value), skipHours: parseSingularOf(channel.skiphours, parseSkipHours), skipDays: parseSingularOf(channel.skipdays, parseSkipDays), items: retrieveItems(value, options), atom: namespaces.has("atom") ? retrieveFeed$7(channel) : void 0, cc: namespaces.has("cc") ? retrieveItemOrFeed(channel) : void 0, dc: namespaces.has("dc") ? retrieveItemOrFeed$2(channel) : void 0, sy: namespaces.has("sy") ? retrieveFeed$6(channel) : void 0, itunes: namespaces.has("itunes") ? retrieveFeed$3(channel) : void 0, podcast: namespaces.has("podcast") ? retrieveFeed$11(channel) : void 0, googleplay: namespaces.has("googleplay") ? retrieveFeed$2(channel) : void 0, media: namespaces.has("media") ? retrieveItemOrFeed$6(channel) : void 0, georss: namespaces.has("georss") ? retrieveItemOrFeed$5(channel) : void 0, geo: namespaces.has("geo") ? retrieveItemOrFeed$4(channel) : void 0, dcterms: namespaces.has("dcterms") ? retrieveItemOrFeed$3(channel) : void 0, prism: namespaces.has("prism") ? retrieveFeed$12(channel) : void 0, creativeCommons: namespaces.has("creativecommons") ? retrieveItemOrFeed$1(channel) : void 0, feedpress: namespaces.has("feedpress") ? retrieveFeed$10(channel) : void 0, opensearch: namespaces.has("opensearch") ? retrieveFeed$4(channel) : void 0, admin: namespaces.has("admin") ? retrieveFeed$1(channel) : void 0, sourceNs: namespaces.has("source") ? retrieveFeed$14(channel) : void 0, blogChannel: namespaces.has("blogchannel") ? retrieveFeed$9(channel) : void 0, rawvoice: namespaces.has("rawvoice") ? retrieveFeed$13(channel) : void 0, spotify: namespaces.has("spotify") ? retrieveFeed$15(channel) : void 0, pingback: namespaces.has("pingback") ? retrieveFeed$5(channel) : void 0, acast: namespaces.has("acast") ? retrieveFeed$8(channel) : void 0 }); }; const retrieveFeed = (value, options) => { return parseSingularOf(value?.rss, (value) => parseFeed(value, options)); }; //#endregion export { parseCategory, parseCloud, parseEnclosure, parseFeed, parseGuid, parseImage, parseItem, parsePerson, parseSkipDays, parseSkipHours, parseSource, parseTextInput, retrieveFeed, retrieveImage, retrieveItems, retrieveTextInput };