video-ad-sdk
Version:
VAST/VPAID SDK that allows video ads to be played on top of any player
168 lines (167 loc) • 6.84 kB
JavaScript
import { get, getFirstChild, getText, getAttribute } from '../xml';
import { getLinearCreative } from '../vastSelectors/helpers/getLinearCreative';
import { isInline, getClickThrough, getCreativeData, isWrapper, getMediaFiles, getInteractiveFiles } from '../vastSelectors';
import { parseTime } from '../vastSelectors/helpers/parseTime';
const getAdSystem = (ad) => {
const adTypeElement = getFirstChild(ad);
const element = adTypeElement && get(adTypeElement, 'AdSystem');
return element && getText(element);
};
const getSubElementValue = (parentElement, tagName) => {
const element = parentElement && get(parentElement, tagName);
return element && getText(element);
};
const getPricingElement = (ad) => {
const adTypeElement = getFirstChild(ad);
return adTypeElement && get(adTypeElement, 'Pricing');
};
const getPricing = (vastChain) => {
const [{ ad }] = vastChain;
const pricingElement = ad && getPricingElement(ad);
if (pricingElement) {
return {
pricing: getText(pricingElement),
pricingCurrency: getAttribute(pricingElement, 'currency'),
pricingModel: getAttribute(pricingElement, 'model')
};
}
if (vastChain.length > 1) {
return getPricing(vastChain.slice(1));
}
return {};
};
const getCategory = (ad) => {
const inLineElement = ad && get(ad, 'InLine');
const categoryElement = inLineElement && get(inLineElement, 'Category');
if (categoryElement) {
return {
category: getText(categoryElement),
categoryAuthority: getAttribute(categoryElement, 'authority')
};
}
return {};
};
const getVastVersion = (parsedVast) => {
const vastElement = parsedVast && get(parsedVast, 'VAST');
if (vastElement) {
return getAttribute(vastElement, 'version');
}
return 'unknown';
};
const getAdIds = (vastChain) => vastChain.map(({ ad }) => ad && getAttribute(ad, 'id')).filter(Boolean);
const getAdSystems = (vastChain) => vastChain.map(({ ad }) => ad && getAdSystem(ad)).filter(Boolean);
const getCreatives = (vastChain) => vastChain.map(({ ad }) => ad && getLinearCreative(ad)).filter(Boolean);
const getCreativeIds = (creatives) => creatives
.map((creative) => creative && getAttribute(creative, 'id'))
.filter(Boolean);
const getCreativeAdIds = (creatives) => creatives
.map((creative) => creative && getAttribute(creative, 'adId'))
.filter(Boolean);
const getAdTypeElement = (ad) => ad && getFirstChild(ad);
const getCreativeElement = (ad) => ad && getLinearCreative(ad);
const getLinearElement = (creativeElement) => creativeElement && get(creativeElement, 'Linear');
const getAdServingId = (adTypeElement) => adTypeElement && getSubElementValue(adTypeElement, 'AdServingId');
const getAdvertiser = (adTypeElement) => adTypeElement && getSubElementValue(adTypeElement, 'Advertiser');
const getAdTitle = (adTypeElement) => adTypeElement && getSubElementValue(adTypeElement, 'AdTitle');
const getDescription = (adTypeElement) => adTypeElement && getSubElementValue(adTypeElement, 'Description');
const getDuration = (linearElement) => linearElement && getSubElementValue(linearElement, 'Duration');
const getDurationInMs = (duration) => duration ? parseTime(duration) : undefined;
const getUniversalIdElement = (creativeElement) => creativeElement && get(creativeElement, 'UniversalAdId');
/**
* Returns a summary of the passed {@link VastChain}.
*
* @param vastChain the {@link VastChain} from which we want the details.
* @returns Returns a {@link VastChainDetails} object from the passed {@link VastChain}.
*/
export const getDetails = (vastChain) => {
const adIds = getAdIds(vastChain);
const adSystems = getAdSystems(vastChain);
const creatives = getCreatives(vastChain);
const creativeIds = getCreativeIds(creatives);
const creativeAdIds = getCreativeAdIds(creatives);
const [{ ad, parsedXML, XML }] = vastChain;
const { pricing, pricingCurrency, pricingModel } = getPricing(vastChain);
const { category, categoryAuthority } = getCategory(ad);
const adTypeElement = getAdTypeElement(ad);
const creativeElement = getCreativeElement(ad);
const linearElement = getLinearElement(creativeElement);
const adServingId = getAdServingId(adTypeElement);
const vastVersion = getVastVersion(parsedXML);
const advertiser = getAdvertiser(adTypeElement);
const adTitle = getAdTitle(adTypeElement);
const description = getDescription(adTypeElement);
const duration = getDuration(linearElement);
const durationInMs = getDurationInMs(duration);
let adId;
let adWrapperIds = [];
let adSystem;
let adWrapperSystems = [];
let creativeId;
let adWrapperCreativeIds = [];
let creativeAdId;
let adWrapperCreativeAdIds = [];
let clickThroughUrl;
let creativeData;
let universalAdId;
let universalAdIdRegistry;
let mediaFiles = [];
let vpaid;
let skippable;
let skipOffset;
let skipOffsetInMs;
if (isInline(ad)) {
;
[adId, ...adWrapperIds] = adIds;
[adSystem, ...adWrapperSystems] = adSystems;
[creativeId, ...adWrapperCreativeIds] = creativeIds;
[creativeAdId, ...adWrapperCreativeAdIds] = creativeAdIds;
clickThroughUrl = ad && getClickThrough(ad);
creativeData = XML ? getCreativeData(XML) : undefined;
const universalIdElement = getUniversalIdElement(creativeElement);
universalAdId = universalIdElement && getText(universalIdElement);
universalAdIdRegistry =
universalIdElement && getAttribute(universalIdElement, 'idRegistry');
mediaFiles = (ad && getMediaFiles(ad)) || [];
vpaid = Boolean(ad && getInteractiveFiles(ad));
skipOffset = linearElement && getAttribute(linearElement, 'skipoffset');
skipOffsetInMs = skipOffset ? parseTime(skipOffset) : undefined;
skippable = Boolean(skipOffset);
}
else if (isWrapper(vastChain[0].ad)) {
adWrapperIds = adIds;
adWrapperSystems = adSystems;
adWrapperCreativeIds = creativeIds;
adWrapperCreativeAdIds = creativeAdIds;
}
return {
adId,
adServingId,
adSystem,
adTitle,
advertiser,
adWrapperCreativeAdIds,
adWrapperCreativeIds,
adWrapperIds,
adWrapperSystems,
category,
categoryAuthority,
clickThroughUrl,
creativeAdId,
creativeData,
creativeId,
description,
duration,
durationInMs,
mediaFiles,
pricing,
pricingCurrency,
pricingModel,
skipOffset,
skipOffsetInMs,
skippable,
universalAdId,
universalAdIdRegistry,
vastVersion,
vpaid
};
};