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
JavaScript
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 };