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