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.

343 lines (342 loc) 15.2 kB
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;