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