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.

266 lines (265 loc) 9.81 kB
import { isNonEmptyStringOrNumber, isObject, parseArrayOf, parseBoolean, parseCsvOf, parseNumber, parseSingularOf, parseString, retrieveText, trimObject } from "../../../common/utils.js"; //#region src/namespaces/media/parse/utils.ts const parseRating = (value) => { return trimObject({ value: ((value) => parseString(retrieveText(value)))(value), scheme: parseString(value?.["@scheme"]) }); }; const retrieveRatings = (value) => { if (!isObject(value)) return; if (value["media:rating"]) return parseArrayOf(value["media:rating"], parseRating); if (value["media:adult"]) return [{ value: parseBoolean(retrieveText(value["media:adult"])) ? "adult" : "nonadult", scheme: "urn:simple" }]; }; const parseTitleOrDescription = (value) => { return trimObject({ value: ((value) => parseString(retrieveText(value)))(value), type: parseString(value?.["@type"]) }); }; const parseThumbnail = (value) => { if (!isObject(value)) return; return trimObject({ url: parseString(value["@url"]), height: parseNumber(value["@height"]), width: parseNumber(value["@width"]), time: parseString(value["@time"]) }); }; const parseCategory = (value) => { return trimObject({ name: ((value) => parseString(retrieveText(value)))(value), scheme: parseString(value?.["@scheme"]), label: parseString(value?.["@label"]) }); }; const parseHash = (value) => { return trimObject({ value: ((value) => parseString(retrieveText(value)))(value), algo: parseString(value?.["@algo"]) }); }; const parsePlayer = (value) => { if (!isObject(value)) return; return trimObject({ url: parseString(value["@url"]), height: parseNumber(value["@height"]), width: parseNumber(value["@width"]) }); }; const parseCredit = (value) => { return trimObject({ value: ((value) => parseString(retrieveText(value)))(value), role: parseString(value?.["@role"]), scheme: parseString(value?.["@scheme"]) }); }; const parseCopyright = (value) => { return trimObject({ value: ((value) => parseString(retrieveText(value)))(value), url: parseString(value?.["@url"]) }); }; const parseText = (value) => { return trimObject({ value: ((value) => parseString(retrieveText(value)))(value), type: parseString(value?.["@type"]), lang: parseString(value?.["@lang"]), start: parseString(value?.["@start"]), end: parseString(value?.["@end"]) }); }; const parseRestriction = (value) => { if (!isObject(value)) return; return trimObject({ value: ((value) => parseString(retrieveText(value)))(value), relationship: parseString(value["@relationship"]), type: parseString(value["@type"]) }); }; const parseCommunity = (value) => { if (!isObject(value)) return; return trimObject({ starRating: parseSingularOf(value["media:starrating"], parseStarRating), statistics: parseSingularOf(value["media:statistics"], parseStatistics), tags: parseSingularOf(value["media:tags"], parseTags) }); }; const parseStarRating = (value) => { if (!isObject(value)) return; return trimObject({ average: parseNumber(value["@average"]), count: parseNumber(value["@count"]), min: parseNumber(value["@min"]), max: parseNumber(value["@max"]) }); }; const parseStatistics = (value) => { if (!isObject(value)) return; return trimObject({ views: parseNumber(value["@views"]), favorites: parseNumber(value["@favorites"]) }); }; const parseTags = (value) => { return parseCsvOf(value, (segment) => { const split = segment.split(":"); return { name: parseString(split[0]) ?? "", weight: parseNumber(split[1]) ?? 1 }; }); }; const parseComments = (value) => { return parseArrayOf(value?.["media:comment"], (value) => parseString(retrieveText(value))); }; const parseEmbed = (value) => { if (!isObject(value)) return; return trimObject({ url: parseString(value["@url"]), width: parseNumber(value["@width"]), height: parseNumber(value["@height"]), params: parseArrayOf(value["media:param"], parseParam) }); }; const parseParam = (value) => { if (!isObject(value)) return; return trimObject({ name: parseString(value["@name"]), value: ((value) => parseString(retrieveText(value)))(value) }); }; const parseResponses = (value) => { return parseArrayOf(value?.["media:response"], (value) => parseString(retrieveText(value))); }; const parseBackLinks = (value) => { return parseArrayOf(value?.["media:backlink"], (value) => parseString(retrieveText(value))); }; const parseStatus = (value) => { if (!isObject(value)) return; return trimObject({ state: parseString(value["@state"]), reason: parseString(value["@reason"]) }); }; const parsePrice = (value) => { if (!isObject(value)) return; return trimObject({ type: parseString(value["@type"]), info: parseString(value["@info"]), price: parseNumber(value["@price"]), currency: parseString(value["@currency"]) }); }; const parseLicense = (value) => { return trimObject({ name: ((value) => parseString(retrieveText(value)))(value), type: parseString(value?.["@type"]), href: parseString(value?.["@href"]) }); }; const parseSubTitle = (value) => { if (!isObject(value)) return; return trimObject({ type: parseString(value["@type"]), lang: parseString(value["@lang"]), href: parseString(value["@href"]) }); }; const parsePeerLink = (value) => { if (!isObject(value)) return; return trimObject({ type: parseString(value["@type"]), href: parseString(value["@href"]) }); }; const parseRights = (value) => { if (!isObject(value)) return; return trimObject({ status: parseString(value["@status"]) }); }; const parseScene = (value) => { if (!isObject(value)) return; return trimObject({ title: parseSingularOf(value.scenetitle, (value) => parseString(retrieveText(value))), description: parseSingularOf(value.scenedescription, (value) => parseString(retrieveText(value))), startTime: parseSingularOf(value.scenestarttime, (value) => parseString(retrieveText(value))), endTime: parseSingularOf(value.sceneendtime, (value) => parseString(retrieveText(value))) }); }; const parseScenes = (value) => { return parseArrayOf(value?.["media:scene"], parseScene); }; const parseLocation = (value) => { if (isNonEmptyStringOrNumber(value) || isObject(value)) return trimObject({ description: ((value) => parseString(retrieveText(value)))(value) }); }; const retrieveCommonElements = (value) => { if (!isObject(value)) return; return trimObject({ ratings: retrieveRatings(value), title: parseSingularOf(value["media:title"], parseTitleOrDescription), description: parseSingularOf(value["media:description"], parseTitleOrDescription), keywords: parseSingularOf(value["media:keywords"], (value) => parseCsvOf(retrieveText(value), parseString)), thumbnails: parseArrayOf(value["media:thumbnail"], parseThumbnail), categories: parseArrayOf(value["media:category"], parseCategory), hashes: parseArrayOf(value["media:hash"], parseHash), player: parseSingularOf(value["media:player"], parsePlayer), credits: parseArrayOf(value["media:credit"], parseCredit), copyright: parseSingularOf(value["media:copyright"], parseCopyright), texts: parseArrayOf(value["media:text"], parseText), restrictions: parseArrayOf(value["media:restriction"], parseRestriction), community: parseSingularOf(value["media:community"], parseCommunity), comments: parseSingularOf(value["media:comments"], parseComments), embed: parseSingularOf(value["media:embed"], parseEmbed), responses: parseSingularOf(value["media:responses"], parseResponses), backLinks: parseSingularOf(value["media:backlinks"], parseBackLinks), status: parseSingularOf(value["media:status"], parseStatus), prices: parseArrayOf(value["media:price"], parsePrice), licenses: parseArrayOf(value["media:license"], parseLicense), subTitles: parseArrayOf(value["media:subtitle"], parseSubTitle), peerLinks: parseArrayOf(value["media:peerlink"], parsePeerLink), locations: parseArrayOf(value["media:location"], parseLocation), rights: parseSingularOf(value["media:rights"], parseRights), scenes: parseSingularOf(value["media:scenes"], parseScenes) }); }; const parseContent = (value) => { if (!isObject(value)) return; return trimObject({ url: parseString(value["@url"]), fileSize: parseNumber(value["@filesize"]), type: parseString(value["@type"]), medium: parseString(value["@medium"]), isDefault: parseBoolean(value["@isdefault"]), expression: parseString(value["@expression"]), bitrate: parseNumber(value["@bitrate"]), framerate: parseNumber(value["@framerate"]), samplingrate: parseNumber(value["@samplingrate"]), channels: parseNumber(value["@channels"]), duration: parseNumber(value["@duration"]), height: parseNumber(value["@height"]), width: parseNumber(value["@width"]), lang: parseString(value["@lang"]), ...retrieveCommonElements(value) }); }; const parseGroup = (value) => { if (!isObject(value)) return; return trimObject({ contents: parseArrayOf(value["media:content"], parseContent), ...retrieveCommonElements(value) }); }; const retrieveItemOrFeed = (value) => { if (!isObject(value)) return; return trimObject({ groups: parseArrayOf(value["media:group"], parseGroup), contents: parseArrayOf(value["media:content"], parseContent), ...retrieveCommonElements(value), group: parseSingularOf(value["media:group"], parseGroup) }); }; //#endregion export { parseBackLinks, parseCategory, parseComments, parseCommunity, parseContent, parseCopyright, parseCredit, parseEmbed, parseGroup, parseHash, parseLicense, parseLocation, parseParam, parsePeerLink, parsePlayer, parsePrice, parseRating, parseResponses, parseRestriction, parseRights, parseScene, parseScenes, parseStarRating, parseStatistics, parseStatus, parseSubTitle, parseTags, parseText, parseThumbnail, parseTitleOrDescription, retrieveCommonElements, retrieveItemOrFeed, retrieveRatings };