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.
343 lines (342 loc) • 15.2 kB
JavaScript
const require_utils = require("../../../common/utils.cjs");
//#region src/namespaces/podcast/parse/utils.ts
const whitespaceRegex = /\s+/;
const trailingWRegex = /w$/;
const parseTranscript = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
url: require_utils.parseString(value["@url"]),
type: require_utils.parseString(value["@type"]),
language: require_utils.parseString(value["@language"]),
rel: require_utils.parseString(value["@rel"])
});
};
const parseLocked = (value) => {
return require_utils.trimObject({
value: require_utils.parseYesNoBoolean(require_utils.retrieveText(value)),
owner: require_utils.parseString(value?.["@owner"])
});
};
const parseFunding = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
url: require_utils.parseString(value["@url"]),
display: require_utils.parseString(value["#text"])
});
};
const parseChapters = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
url: require_utils.parseString(value["@url"]),
type: require_utils.parseString(value["@type"])
});
};
const parseSoundbite = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
startTime: require_utils.parseNumber(value["@starttime"]),
duration: require_utils.parseNumber(value["@duration"]),
display: require_utils.parseString(require_utils.retrieveText(value))
});
};
const parsePerson = (value) => {
return require_utils.trimObject({
display: require_utils.parseString(require_utils.retrieveText(value)),
role: require_utils.parseString(value?.["@role"]),
group: require_utils.parseString(value?.["@group"]),
img: require_utils.parseString(value?.["@img"]),
href: require_utils.parseString(value?.["@href"])
});
};
const parseLocation = (value) => {
return require_utils.trimObject({
display: require_utils.parseString(require_utils.retrieveText(value)),
rel: require_utils.parseString(value?.["@rel"]),
geo: require_utils.parseString(value?.["@geo"]),
osm: require_utils.parseString(value?.["@osm"]),
country: require_utils.parseString(value?.["@country"])
});
};
const parseSeason = (value) => {
return require_utils.trimObject({
number: require_utils.parseNumber(require_utils.retrieveText(value)),
name: require_utils.parseString(value?.["@name"])
});
};
const parseEpisode = (value) => {
return require_utils.trimObject({
number: require_utils.parseNumber(require_utils.retrieveText(value)),
display: require_utils.parseString(value?.["@display"])
});
};
const parseTrailer = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
display: require_utils.parseString(require_utils.retrieveText(value)),
url: require_utils.parseString(value["@url"]),
pubDate: require_utils.parseDate(value["@pubdate"]),
length: require_utils.parseNumber(value["@length"]),
type: require_utils.parseString(value["@type"]),
season: require_utils.parseNumber(value["@season"])
});
};
const parseLicense = (value) => {
return require_utils.trimObject({
display: require_utils.parseString(require_utils.retrieveText(value)),
url: require_utils.parseString(value?.["@url"])
});
};
const parseAlternateEnclosure = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
type: require_utils.parseString(value["@type"]),
length: require_utils.parseNumber(value["@length"]),
bitrate: require_utils.parseNumber(value["@bitrate"]),
height: require_utils.parseNumber(value["@height"]),
lang: require_utils.parseString(value["@lang"]),
title: require_utils.parseString(value["@title"]),
rel: require_utils.parseString(value["@rel"]),
codecs: require_utils.parseString(value["@codecs"]),
default: require_utils.parseBoolean(value["@default"]),
sources: require_utils.parseArrayOf(value["podcast:source"], parseSource),
integrity: require_utils.parseSingularOf(value["podcast:integrity"], parseIntegrity)
});
};
const parseSource = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
uri: require_utils.parseString(value["@uri"]),
contentType: require_utils.parseString(value["@contenttype"])
});
};
const parseIntegrity = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
type: require_utils.parseString(value["@type"]),
value: require_utils.parseString(value["@value"])
});
};
const parseValue = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
type: require_utils.parseString(value["@type"]),
method: require_utils.parseString(value["@method"]),
suggested: require_utils.parseNumber(value["@suggested"]),
valueRecipients: require_utils.parseArrayOf(value["podcast:valuerecipient"], parseValueRecipient),
valueTimeSplits: require_utils.parseArrayOf(value["podcast:valuetimesplit"], parseValueTimeSplit)
});
};
const parseValueRecipient = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
name: require_utils.parseString(value["@name"]),
customKey: require_utils.parseString(value["@customkey"]),
customValue: require_utils.parseString(value["@customvalue"]),
type: require_utils.parseString(value["@type"]),
address: require_utils.parseString(value["@address"]),
split: require_utils.parseNumber(value["@split"]),
fee: require_utils.parseBoolean(value["@fee"])
});
};
const parseImage = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
href: require_utils.parseString(value["@href"]),
alt: require_utils.parseString(value["@alt"]),
aspectRatio: require_utils.parseString(value["@aspect-ratio"]),
width: require_utils.parseNumber(value["@width"]),
height: require_utils.parseNumber(value["@height"]),
type: require_utils.parseString(value["@type"]),
purpose: require_utils.parseString(value["@purpose"])
});
};
const parseImages = (value) => {
const srcset = require_utils.parseString(value?.["@srcset"]);
if (!srcset) return;
const images = [];
const segments = srcset.split(",");
for (const segment of segments) {
const [href, width] = segment.trim().split(whitespaceRegex);
const image = {
href: require_utils.parseString(href),
width: require_utils.parseNumber(width?.replace(trailingWRegex, ""))
};
images.push(image);
}
return require_utils.trimArray(images, require_utils.trimObject);
};
const retrieveImages = (value) => {
return require_utils.parseArrayOf(value["podcast:image"], parseImage) ?? require_utils.parseSingularOf(value["podcast:images"], parseImages);
};
const parseLiveItem = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
...retrieveItem(value),
status: require_utils.parseString(value["@status"]),
start: require_utils.parseDate(value["@start"]),
end: require_utils.parseDate(value["@end"]),
contentLinks: require_utils.parseArrayOf(value["podcast:contentlink"], parseContentLink)
});
};
const parseContentLink = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
href: require_utils.parseString(value["@href"]),
display: require_utils.parseString(require_utils.retrieveText(value))
});
};
const parseSocialInteract = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
uri: require_utils.parseString(value["@uri"]),
protocol: require_utils.parseString(value["@protocol"]),
accountId: require_utils.parseString(value["@accountid"]),
accountUrl: require_utils.parseString(value["@accounturl"]),
priority: require_utils.parseNumber(value["@priority"])
});
};
const parseChat = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
server: require_utils.parseString(value["@server"]),
protocol: require_utils.parseString(value["@protocol"]),
accountId: require_utils.parseString(value["@accountid"]),
space: require_utils.parseString(value["@space"])
});
};
const parseBlock = (value) => {
return require_utils.trimObject({
value: require_utils.parseYesNoBoolean(require_utils.retrieveText(value)),
id: require_utils.parseString(value?.["@id"])
});
};
const parseTxt = (value) => {
return require_utils.trimObject({
display: require_utils.parseString(require_utils.retrieveText(value)),
purpose: require_utils.parseString(value?.["@purpose"])
});
};
const parseRemoteItem = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
feedGuid: require_utils.parseString(value["@feedguid"]),
feedUrl: require_utils.parseString(value["@feedurl"]),
itemGuid: require_utils.parseString(value["@itemguid"]),
medium: require_utils.parseString(value["@medium"]),
title: require_utils.parseString(value["@title"])
});
};
const parsePodroll = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({ remoteItems: require_utils.parseArrayOf(value["podcast:remoteitem"], parseRemoteItem) });
};
const parseUpdateFrequency = (value) => {
return require_utils.trimObject({
display: require_utils.parseString(require_utils.retrieveText(value)),
complete: require_utils.parseBoolean(value?.["@complete"]),
dtstart: require_utils.parseDate(value?.["@dtstart"]),
rrule: require_utils.parseString(value?.["@rrule"])
});
};
const parsePodping = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({ usesPodping: require_utils.parseBoolean(value["@usespodping"]) });
};
const parsePublisher = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({ remoteItem: require_utils.parseSingularOf(value["podcast:remoteitem"], parseRemoteItem) });
};
const parseValueTimeSplit = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
startTime: require_utils.parseNumber(value["@starttime"]),
duration: require_utils.parseNumber(value["@duration"]),
remoteStartTime: require_utils.parseNumber(value["@remotestarttime"]),
remotePercentage: require_utils.parseNumber(value["@remotepercentage"]),
remoteItem: require_utils.parseSingularOf(value["podcast:remoteitem"], parseRemoteItem),
valueRecipients: require_utils.parseArrayOf(value["podcast:valuerecipient"], parseValueRecipient)
});
};
const retrieveItem = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
transcripts: require_utils.parseArrayOf(value["podcast:transcript"], parseTranscript),
chapters: require_utils.parseSingularOf(value["podcast:chapters"], parseChapters),
soundbites: require_utils.parseArrayOf(value["podcast:soundbite"], parseSoundbite),
persons: require_utils.parseArrayOf(value["podcast:person"], parsePerson),
locations: require_utils.parseArrayOf(value["podcast:location"], parseLocation),
season: require_utils.parseSingularOf(value["podcast:season"], parseSeason),
episode: require_utils.parseSingularOf(value["podcast:episode"], parseEpisode),
license: require_utils.parseSingularOf(value["podcast:license"], parseLicense),
alternateEnclosures: require_utils.parseArrayOf(value["podcast:alternateenclosure"], parseAlternateEnclosure),
values: require_utils.parseArrayOf(value["podcast:value"], parseValue),
images: retrieveImages(value),
socialInteracts: require_utils.parseArrayOf(value["podcast:socialinteract"], parseSocialInteract),
txts: require_utils.parseArrayOf(value["podcast:txt"], parseTxt),
chat: require_utils.parseSingularOf(value["podcast:chat"], parseChat),
location: require_utils.parseSingularOf(value["podcast:location"], parseLocation),
value: require_utils.parseSingularOf(value["podcast:value"], parseValue),
chats: require_utils.parseArrayOf(value["podcast:chat"], parseChat)
});
};
const retrieveFeed = (value) => {
if (!require_utils.isObject(value)) return;
return require_utils.trimObject({
locked: require_utils.parseSingularOf(value["podcast:locked"], parseLocked),
fundings: require_utils.parseArrayOf(value["podcast:funding"], parseFunding),
persons: require_utils.parseArrayOf(value["podcast:person"], parsePerson),
locations: require_utils.parseArrayOf(value["podcast:location"], parseLocation),
trailers: require_utils.parseArrayOf(value["podcast:trailer"], parseTrailer),
license: require_utils.parseSingularOf(value["podcast:license"], parseLicense),
guid: require_utils.parseSingularOf(value["podcast:guid"], (value) => require_utils.parseString(require_utils.retrieveText(value))),
values: require_utils.parseArrayOf(value["podcast:value"], parseValue),
medium: require_utils.parseSingularOf(value["podcast:medium"], (value) => require_utils.parseString(require_utils.retrieveText(value))),
images: retrieveImages(value),
liveItems: require_utils.parseArrayOf(value["podcast:liveitem"], parseLiveItem),
blocks: require_utils.parseArrayOf(value["podcast:block"], parseBlock),
txts: require_utils.parseArrayOf(value["podcast:txt"], parseTxt),
remoteItems: require_utils.parseArrayOf(value["podcast:remoteitem"], parseRemoteItem),
podroll: require_utils.parseSingularOf(value["podcast:podroll"], parsePodroll),
updateFrequency: require_utils.parseSingularOf(value["podcast:updatefrequency"], parseUpdateFrequency),
podping: require_utils.parseSingularOf(value["podcast:podping"], parsePodping),
chat: require_utils.parseSingularOf(value["podcast:chat"], parseChat),
publisher: require_utils.parseSingularOf(value["podcast:publisher"], parsePublisher),
location: require_utils.parseSingularOf(value["podcast:location"], parseLocation),
value: require_utils.parseSingularOf(value["podcast:value"], parseValue),
chats: require_utils.parseArrayOf(value["podcast:chat"], parseChat)
});
};
//#endregion
exports.parseAlternateEnclosure = parseAlternateEnclosure;
exports.parseBlock = parseBlock;
exports.parseChapters = parseChapters;
exports.parseChat = parseChat;
exports.parseContentLink = parseContentLink;
exports.parseEpisode = parseEpisode;
exports.parseFunding = parseFunding;
exports.parseImage = parseImage;
exports.parseImages = parseImages;
exports.parseIntegrity = parseIntegrity;
exports.parseLicense = parseLicense;
exports.parseLiveItem = parseLiveItem;
exports.parseLocation = parseLocation;
exports.parseLocked = parseLocked;
exports.parsePerson = parsePerson;
exports.parsePodping = parsePodping;
exports.parsePodroll = parsePodroll;
exports.parsePublisher = parsePublisher;
exports.parseRemoteItem = parseRemoteItem;
exports.parseSeason = parseSeason;
exports.parseSocialInteract = parseSocialInteract;
exports.parseSoundbite = parseSoundbite;
exports.parseSource = parseSource;
exports.parseTrailer = parseTrailer;
exports.parseTranscript = parseTranscript;
exports.parseTxt = parseTxt;
exports.parseUpdateFrequency = parseUpdateFrequency;
exports.parseValue = parseValue;
exports.parseValueRecipient = parseValueRecipient;
exports.parseValueTimeSplit = parseValueTimeSplit;
exports.retrieveFeed = retrieveFeed;
exports.retrieveImages = retrieveImages;
exports.retrieveItem = retrieveItem;