prebid.js 7.49.0 → 7.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adhashBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/admanBidAdapter.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adrinoBidAdapter.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/cleanioRtdProvider.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/confiantRtdProvider.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dependencies.json +3 -0
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +140 -139
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/permutiveRtdProvider.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/silverpushBidAdapter.js +1 -0
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/video.js +1 -1
- package/dist/videoModule.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/videoModule/eventsUI/eventsUI.css +205 -0
- package/integrationExamples/videoModule/eventsUI/eventsUI.js +181 -0
- package/integrationExamples/videoModule/jwplayer/eventsUI.html +295 -0
- package/integrationExamples/videoModule/videojs/eventsUI.html +319 -0
- package/libraries/video/shared/helpers.js +14 -0
- package/modules/33acrossBidAdapter.js +1 -1
- package/modules/adhashBidAdapter.js +28 -17
- package/modules/adkernelBidAdapter.js +2 -1
- package/modules/admanBidAdapter.js +30 -22
- package/modules/adnuntiusBidAdapter.js +98 -79
- package/modules/adnuntiusBidAdapter.md +2 -1
- package/modules/adqueryBidAdapter.js +7 -1
- package/modules/adrinoBidAdapter.js +1 -0
- package/modules/adtelligentBidAdapter.js +4 -2
- package/modules/appnexusBidAdapter.js +2 -0
- package/modules/beopBidAdapter.js +1 -0
- package/modules/cleanioRtdProvider.js +2 -4
- package/modules/confiantRtdProvider.js +15 -12
- package/modules/conversantAnalyticsAdapter.js +7 -5
- package/modules/conversantBidAdapter.js +1 -1
- package/modules/criteoBidAdapter.js +58 -4
- package/modules/freewheel-sspBidAdapter.js +10 -2
- package/modules/gridBidAdapter.js +3 -0
- package/modules/gumgumBidAdapter.js +5 -0
- package/modules/liveIntentIdSystem.js +8 -4
- package/modules/magniteAnalyticsAdapter.js +26 -3
- package/modules/minutemediaBidAdapter.js +13 -3
- package/modules/permutiveRtdProvider.js +9 -38
- package/modules/prebidServerBidAdapter/index.js +7 -8
- package/modules/pubmaticBidAdapter.js +1 -0
- package/modules/riseBidAdapter.js +13 -3
- package/modules/rtbhouseBidAdapter.md +24 -0
- package/modules/rubiconBidAdapter.js +6 -2
- package/modules/silverpushBidAdapter.js +326 -0
- package/modules/silverpushBidAdapter.md +107 -0
- package/modules/underdogmediaBidAdapter.js +2 -2
- package/modules/videoModule/adQueue.js +2 -2
- package/modules/videoModule/index.js +9 -5
- package/modules/yahoosspBidAdapter.js +6 -0
- package/modules/yahoosspBidAdapter.md +37 -0
- package/package.json +1 -1
- package/src/adloader.js +2 -1
- package/src/native.js +20 -4
- package/test/spec/modules/33acrossBidAdapter_spec.js +4 -3
- package/test/spec/modules/adhashBidAdapter_spec.js +51 -1
- package/test/spec/modules/admanBidAdapter_spec.js +1 -2
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +535 -264
- package/test/spec/modules/adqueryBidAdapter_spec.js +9 -0
- package/test/spec/modules/adrinoBidAdapter_spec.js +4 -0
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/beopBidAdapter_spec.js +4 -0
- package/test/spec/modules/cleanioRtdProvider_spec.js +7 -8
- package/test/spec/modules/confiantRtdProvider_spec.js +4 -1
- package/test/spec/modules/conversantBidAdapter_spec.js +2 -1
- package/test/spec/modules/criteoBidAdapter_spec.js +159 -2
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -2
- package/test/spec/modules/gridBidAdapter_spec.js +3 -0
- package/test/spec/modules/gumgumBidAdapter_spec.js +14 -0
- package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +28 -0
- package/test/spec/modules/liveIntentIdSystem_spec.js +45 -0
- package/test/spec/modules/magniteAnalyticsAdapter_spec.js +16 -36
- package/test/spec/modules/mass_spec.js +2 -0
- package/test/spec/modules/minutemediaBidAdapter_spec.js +69 -1
- package/test/spec/modules/permutiveRtdProvider_spec.js +0 -20
- package/test/spec/modules/prebidServerBidAdapter_spec.js +3 -1
- package/test/spec/modules/pubmaticBidAdapter_spec.js +7 -0
- package/test/spec/modules/riseBidAdapter_spec.js +69 -1
- package/test/spec/modules/rubiconBidAdapter_spec.js +143 -67
- package/test/spec/modules/silverpushBidAdapter_spec.js +394 -0
- package/test/spec/modules/underdogmediaBidAdapter_spec.js +1 -1
- package/test/spec/modules/videoModule/shared/helpers_spec.js +22 -0
- package/test/spec/modules/yahoosspBidAdapter_spec.js +60 -1
- package/test/spec/native_spec.js +12 -12
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { config } from '../src/config.js';
|
|
2
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
3
|
+
import * as utils from '../src/utils.js';
|
|
4
|
+
import { mergeDeep } from '../src/utils.js';
|
|
5
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
6
|
+
import { ortbConverter } from '../libraries/ortbConverter/converter.js';
|
|
7
|
+
import { Renderer } from '../src/Renderer.js';
|
|
8
|
+
import { ajax } from '../src/ajax.js';
|
|
9
|
+
|
|
10
|
+
const BIDDER_CODE = 'silverpush';
|
|
11
|
+
const bidderConfig = 'sp_pb_ortb';
|
|
12
|
+
const bidderVersion = '1.0.0';
|
|
13
|
+
const DEFAULT_CURRENCY = 'USD';
|
|
14
|
+
|
|
15
|
+
export const REQUEST_URL = 'https://apac.chocolateplatform.com/bidder/?identifier=prebidchoc';
|
|
16
|
+
export const SP_OUTSTREAM_PLAYER_URL = 'https://xaido.sgp1.cdn.digitaloceanspaces.com/prebid/spoutstream.min.js';
|
|
17
|
+
|
|
18
|
+
const VIDEO_ORTB_PARAMS = [
|
|
19
|
+
'mimes',
|
|
20
|
+
'minduration',
|
|
21
|
+
'maxduration',
|
|
22
|
+
'placement',
|
|
23
|
+
'protocols',
|
|
24
|
+
'startdelay',
|
|
25
|
+
'skip',
|
|
26
|
+
'skipafter',
|
|
27
|
+
'minbitrate',
|
|
28
|
+
'maxbitrate',
|
|
29
|
+
'delivery',
|
|
30
|
+
'playbackmethod',
|
|
31
|
+
'api',
|
|
32
|
+
'linearity'
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
export const VIDEO_ORTB_REQUIRED = ['api', 'mimes', 'placement', 'protocols', 'minduration', 'maxduration', 'startdelay'];
|
|
36
|
+
|
|
37
|
+
export const spec = {
|
|
38
|
+
code: BIDDER_CODE,
|
|
39
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
40
|
+
isBidRequestValid,
|
|
41
|
+
buildRequests,
|
|
42
|
+
interpretResponse,
|
|
43
|
+
onBidWon,
|
|
44
|
+
getRequest: function(endpoint) {
|
|
45
|
+
ajax(endpoint, null, undefined, {method: 'GET'});
|
|
46
|
+
},
|
|
47
|
+
getOS: function(ua) {
|
|
48
|
+
if (ua.indexOf('Windows') != -1) { return 'Windows'; } else if (ua.match(/(iPhone|iPod|iPad)/)) { return 'iOS'; } else if (ua.indexOf('Mac OS X') != -1) { return 'macOS'; } else if (ua.match(/Android/)) { return 'Android'; } else if (ua.indexOf('Linux') != -1) { return 'Linux'; } else { return 'Unknown'; }
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
registerBidder(spec);
|
|
53
|
+
|
|
54
|
+
export const CONVERTER = ortbConverter({
|
|
55
|
+
context: {
|
|
56
|
+
netRevenue: true,
|
|
57
|
+
ttl: 300
|
|
58
|
+
},
|
|
59
|
+
imp(buildImp, bidRequest, context) {
|
|
60
|
+
let imp = buildImp(bidRequest, context);
|
|
61
|
+
|
|
62
|
+
if (bidRequest.mediaTypes[VIDEO]) {
|
|
63
|
+
imp = buildVideoImp(bidRequest, imp);
|
|
64
|
+
} else if (bidRequest.mediaTypes[BANNER]) {
|
|
65
|
+
imp = buildBannerImp(bidRequest, imp);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const bidFloor = getBidFloor(bidRequest);
|
|
69
|
+
|
|
70
|
+
utils.deepSetValue(imp, 'bidfloor', bidFloor);
|
|
71
|
+
|
|
72
|
+
if (bidRequest.params.deals && bidRequest.params.deals.length > 0) {
|
|
73
|
+
utils.deepSetValue(imp, 'pmp', { deals: bidRequest.params.deals });
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return imp;
|
|
77
|
+
},
|
|
78
|
+
request(buildRequest, imps, bidderRequest, context) {
|
|
79
|
+
const req = buildRequest(imps, bidderRequest, context);
|
|
80
|
+
mergeDeep(req, {
|
|
81
|
+
at: 1,
|
|
82
|
+
ext: {
|
|
83
|
+
bc: `${bidderConfig}_${bidderVersion}`
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
let userAgent = navigator.userAgent;
|
|
88
|
+
utils.deepSetValue(req, 'device.os', spec.getOS(userAgent));
|
|
89
|
+
utils.deepSetValue(req, 'device.devicetype', _isMobile() ? 1 : _isConnectedTV() ? 3 : 2);
|
|
90
|
+
|
|
91
|
+
const bid = context.bidRequests[0];
|
|
92
|
+
if (bid.params.publisherId) {
|
|
93
|
+
utils.deepSetValue(req, 'site.publisher.id', bid.params.publisherId);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return req;
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
bidResponse(buildBidResponse, bid, context) {
|
|
100
|
+
let bidResponse = buildBidResponse(bid, context);
|
|
101
|
+
|
|
102
|
+
if (bid.ext) {
|
|
103
|
+
bidResponse.meta.networkId = bid.ext.dsp_id;
|
|
104
|
+
bidResponse.meta.advertiserId = bid.ext.buyer_id;
|
|
105
|
+
bidResponse.meta.brandId = bid.ext.brand_id;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (context.ortbResponse.ext && context.ortbResponse.ext.paf) {
|
|
109
|
+
bidResponse.meta.paf = Object.assign({}, context.ortbResponse.ext.paf);
|
|
110
|
+
bidResponse.meta.paf.content_id = utils.deepAccess(bid, 'ext.paf.content_id');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
bidResponse = buildVideoVastResponse(bidResponse)
|
|
114
|
+
bidResponse = buildVideoOutstreamResponse(bidResponse, context)
|
|
115
|
+
|
|
116
|
+
return bidResponse;
|
|
117
|
+
},
|
|
118
|
+
response(buildResponse, bidResponses, ortbResponse, context) {
|
|
119
|
+
const response = buildResponse(bidResponses, ortbResponse, context);
|
|
120
|
+
|
|
121
|
+
let fledgeAuctionConfigs = utils.deepAccess(ortbResponse, 'ext.fledge_auction_configs');
|
|
122
|
+
if (fledgeAuctionConfigs) {
|
|
123
|
+
fledgeAuctionConfigs = Object.entries(fledgeAuctionConfigs).map(([bidId, cfg]) => {
|
|
124
|
+
return Object.assign({
|
|
125
|
+
bidId,
|
|
126
|
+
auctionSignals: {}
|
|
127
|
+
}, cfg);
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
bids: response.bids,
|
|
131
|
+
fledgeAuctionConfigs,
|
|
132
|
+
}
|
|
133
|
+
} else {
|
|
134
|
+
return response.bids
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
function isBidRequestValid(bidRequest) {
|
|
140
|
+
return (isPublisherIdValid(bidRequest) && (isValidBannerRequest(bidRequest) || isValidVideoRequest(bidRequest)));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function isPublisherIdValid(bidRequest) {
|
|
144
|
+
let pubId = utils.deepAccess(bidRequest, 'params.publisherId');
|
|
145
|
+
return (pubId != null && utils.isStr(pubId) && pubId != '');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function isValidBannerRequest(bidRequest) {
|
|
149
|
+
const bannerSizes = utils.deepAccess(bidRequest, `mediaTypes.${BANNER}.sizes`);
|
|
150
|
+
|
|
151
|
+
return utils.isArray(bannerSizes) && bannerSizes.length > 0 && bannerSizes.every(size => utils.isNumber(size[0]) && utils.isNumber(size[1]));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function isValidVideoRequest(bidRequest) {
|
|
155
|
+
const videoSizes = utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}.playerSize`);
|
|
156
|
+
const PARAM_EXISTS = VIDEO_ORTB_REQUIRED.every(param => utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}.${param}`) != null);
|
|
157
|
+
|
|
158
|
+
return PARAM_EXISTS && utils.isArray(videoSizes) && videoSizes.length > 0 && videoSizes.every(size => utils.isNumber(size[0]) && utils.isNumber(size[1]));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function buildRequests(validBids, bidderRequest) {
|
|
162
|
+
let videoBids = validBids.filter(bid => isVideoBid(bid));
|
|
163
|
+
let bannerBids = validBids.filter(bid => isBannerBid(bid));
|
|
164
|
+
let requests = [];
|
|
165
|
+
|
|
166
|
+
bannerBids.forEach(bid => {
|
|
167
|
+
requests.push(createRequest([bid], bidderRequest, BANNER));
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
videoBids.forEach(bid => {
|
|
171
|
+
requests.push(createRequest([bid], bidderRequest, VIDEO));
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
return requests;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function buildVideoImp(bidRequest, imp) {
|
|
178
|
+
if (bidRequest.mediaTypes[VIDEO]?.context === 'outstream') {
|
|
179
|
+
imp.video.placement = imp.video.placement || 4;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const videoMediaType = utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}`);
|
|
183
|
+
const videoSizes = (videoMediaType && videoMediaType.playerSize) || [];
|
|
184
|
+
|
|
185
|
+
if (videoSizes && videoSizes.length > 0) {
|
|
186
|
+
utils.deepSetValue(imp, 'video.w', videoSizes[0][0]);
|
|
187
|
+
utils.deepSetValue(imp, 'video.h', videoSizes[0][1]);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const videoAdUnitParams = utils.deepAccess(bidRequest, `mediaTypes.${VIDEO}`, {});
|
|
191
|
+
const videoBidderParams = utils.deepAccess(bidRequest, `params.${VIDEO}`, {});
|
|
192
|
+
|
|
193
|
+
const videoParams = { ...videoAdUnitParams, ...videoBidderParams };
|
|
194
|
+
|
|
195
|
+
VIDEO_ORTB_PARAMS.forEach((param) => {
|
|
196
|
+
if (videoParams.hasOwnProperty(param)) {
|
|
197
|
+
utils.deepSetValue(imp, `video.${param}`, videoParams[param]);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
return { ...imp };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function buildBannerImp(bidRequest, imp) {
|
|
205
|
+
const bannerSizes = utils.deepAccess(bidRequest, `mediaTypes.${BANNER}.sizes`, []);
|
|
206
|
+
|
|
207
|
+
if (bannerSizes && bannerSizes.length > 0) {
|
|
208
|
+
utils.deepSetValue(imp, 'banner.w', bannerSizes[0][0]);
|
|
209
|
+
utils.deepSetValue(imp, 'banner.h', bannerSizes[0][1]);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return {...imp};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function createRequest(bidRequests, bidderRequest, mediaType) {
|
|
216
|
+
return {
|
|
217
|
+
method: 'POST',
|
|
218
|
+
url: REQUEST_URL,
|
|
219
|
+
data: CONVERTER.toORTB({ bidRequests, bidderRequest, context: { mediaType } })
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function buildVideoVastResponse(bidResponse) {
|
|
224
|
+
if (bidResponse.mediaType == VIDEO && bidResponse.vastXml) {
|
|
225
|
+
bidResponse.vastUrl = bidResponse.vastXml;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return { ...bidResponse }
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function buildVideoOutstreamResponse(bidResponse, context) {
|
|
232
|
+
if (context.bidRequest.mediaTypes[VIDEO]?.context === 'outstream') {
|
|
233
|
+
bidResponse.rendererUrl = SP_OUTSTREAM_PLAYER_URL;
|
|
234
|
+
bidResponse.adUnitCode = context.bidRequest.adUnitCode;
|
|
235
|
+
|
|
236
|
+
bidResponse.renderer = Renderer.install({
|
|
237
|
+
id: bidResponse.requestId,
|
|
238
|
+
adUnitCode: context.bidRequest.adUnitCode,
|
|
239
|
+
url: bidResponse.rendererUrl
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
bidResponse.renderer.setRender(_renderer(bidResponse));
|
|
243
|
+
|
|
244
|
+
bidResponse.renderer.render(bidResponse);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return {...bidResponse};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function getBidFloor(bid) {
|
|
251
|
+
const currency = config.getConfig('currency.adServerCurrency') || DEFAULT_CURRENCY;
|
|
252
|
+
|
|
253
|
+
if (typeof bid.getFloor !== 'function') {
|
|
254
|
+
return utils.deepAccess(bid, 'params.bidFloor', 0.05);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const bidFloor = bid.getFloor({
|
|
258
|
+
currency: currency,
|
|
259
|
+
mediaType: '*',
|
|
260
|
+
size: '*',
|
|
261
|
+
});
|
|
262
|
+
return bidFloor.floor;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function _renderer(bid) {
|
|
266
|
+
bid.renderer.push(() => {
|
|
267
|
+
if (typeof window.SPOutStreamPlayer === 'function') {
|
|
268
|
+
const spoplayer = new window.SPOutStreamPlayer(bid);
|
|
269
|
+
|
|
270
|
+
spoplayer.on('ready', () => {
|
|
271
|
+
spoplayer.startAd();
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
try {
|
|
275
|
+
let vastUrlbt = 'data:text/xml;charset=utf-8;base64,' + btoa(bid.vastUrl.replace(/\\"/g, '"'));
|
|
276
|
+
spoplayer.load(vastUrlbt).then(function() {
|
|
277
|
+
window.spoplayer = spoplayer;
|
|
278
|
+
}).catch(function(reason) {
|
|
279
|
+
setTimeout(function() { throw reason; }, 0);
|
|
280
|
+
});
|
|
281
|
+
} catch (err) {
|
|
282
|
+
utils.logMessage(err);
|
|
283
|
+
}
|
|
284
|
+
} else {
|
|
285
|
+
utils.logMessage(`Silverpush outstream player is not defined`);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function isVideoBid(bid) {
|
|
291
|
+
return utils.deepAccess(bid, 'mediaTypes.video');
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function isBannerBid(bid) {
|
|
295
|
+
return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function interpretResponse(resp, req) {
|
|
299
|
+
if (!resp.body) {
|
|
300
|
+
resp.body = { nbr: 0 };
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return CONVERTER.fromORTB({ request: req.data, response: resp.body });
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function onBidWon(bid) {
|
|
307
|
+
if (bid == null) { return; }
|
|
308
|
+
if (bid['burl'] == null) { return; }
|
|
309
|
+
|
|
310
|
+
let burlMac = bid['burl'];
|
|
311
|
+
burlMac = burlMac.replace('$' + '{AUCTION_PRICE}', bid['cpm']);
|
|
312
|
+
burlMac = burlMac.replace('$' + '{AUCTION_ID}', bid['auctionId']);
|
|
313
|
+
burlMac = burlMac.replace('$' + '{AUCTION_IMP_ID}', bid['requestId']);
|
|
314
|
+
burlMac = burlMac.replace('$' + '{AUCTION_AD_ID}', bid['adId']);
|
|
315
|
+
burlMac = burlMac.replace('$' + '{AUCTION_SEAT_ID}', bid['seatBidId']);
|
|
316
|
+
|
|
317
|
+
spec.getRequest(burlMac);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function _isMobile() {
|
|
321
|
+
return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function _isConnectedTV() {
|
|
325
|
+
return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
|
|
326
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: Silverpush OpenRTB Bidder Adapter
|
|
5
|
+
Module Type: Bidder Adapter
|
|
6
|
+
Maintainer: prebid@silverpush.co
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Prebid.JS adapter that connects to the Chocolate Ad Exchange.
|
|
12
|
+
|
|
13
|
+
*NOTE*: The Silverpush Bidder Adapter requires setup and approval before use. Please reach out to prebid@silverpush.co representative for more details.
|
|
14
|
+
|
|
15
|
+
# Bid Parameters
|
|
16
|
+
|
|
17
|
+
## Banner/Video
|
|
18
|
+
|
|
19
|
+
{: .table .table-bordered .table-striped }
|
|
20
|
+
| Name | Scope | Description | Example | Type |
|
|
21
|
+
| -------------- | ----------- | ------------------------------------------ | ------------- | ------------ |
|
|
22
|
+
| `publisherId` | required | Publisher id provided by silverpush | "123456" | String |
|
|
23
|
+
| `bidFloor` | optional | Minimum price in USD. bidFloor applies to a specific unit. For example, use the following value to set a $1.50 floor: 1.50. <br/> | 1.50 | Number |
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# mediaTypes Parameters
|
|
29
|
+
|
|
30
|
+
## mediaTypes.banner
|
|
31
|
+
|
|
32
|
+
The following banner parameters are supported here so publishers may fully declare their banner inventory:
|
|
33
|
+
|
|
34
|
+
{: .table .table-bordered .table-striped }
|
|
35
|
+
| Name | Scope | Description | Example | Type |
|
|
36
|
+
| --------- | ------------| ----------------------------------------------------------------- | --------- | --------- |
|
|
37
|
+
| sizes | required | Avalaible sizes supported for banner ad unit | [ [300, 250], [300, 600] ] | [[Integer, Integer], [Integer, Integer]] |
|
|
38
|
+
|
|
39
|
+
## mediaTypes.video
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
The following video parameters are supported here so publishers may fully declare their video inventory:
|
|
43
|
+
|
|
44
|
+
{: .table .table-bordered .table-striped }
|
|
45
|
+
| Name | Scope | Description | Example | Type |
|
|
46
|
+
| --------- | ------------| ----------------------------------------------------------------- | --------- | --------- |
|
|
47
|
+
| context | required | instream or outstream |"outstream" | string |
|
|
48
|
+
| playerSize | required | Avalaible sizes supported for video ad unit. | [300, 250] | [Integer, Integer] |
|
|
49
|
+
| mimes | required | List of content MIME types supported by the player. | ["video/mp4"]| [String]|
|
|
50
|
+
| protocols | required | Supported video bid response protocol values. | [2,3,5,6] | [integers]|
|
|
51
|
+
| api | required | Supported API framework values. | [2] | [integers] |
|
|
52
|
+
| maxduration | required | Maximum video ad duration in seconds. | 30 | Integer |
|
|
53
|
+
| minduration | required | Minimum video ad duration in seconds. | 6 | Integer |
|
|
54
|
+
| startdelay | required | Indicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements. | 0 | Integer |
|
|
55
|
+
| placement | required | Placement type for the impression. | 1 | Integer |
|
|
56
|
+
| minbitrate | optional | Minimum bit rate in Kbps. | 300 | Integer |
|
|
57
|
+
| maxbitrate | optional | Maximum bit rate in Kbps. | 9600 | Integer |
|
|
58
|
+
| playbackmethod | optional | Playback methods that may be in use. Only one method is typically used in practice. | [2]| [Integers] |
|
|
59
|
+
| linearity | optional | OpenRTB2 linearity. in-strea,overlay... | 1 | Integer |
|
|
60
|
+
| skip | optional | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes . | 1 | Integer |
|
|
61
|
+
| skipafter | optional | Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable. | 5 | Integer |
|
|
62
|
+
| delivery | optional | OpenRTB2 delivery. Supported delivery methods (e.g., streaming, progressive). If none specified, assume all are supported. | 1 | [Integer] |
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# Example
|
|
66
|
+
```javascript
|
|
67
|
+
var adUnits = [{
|
|
68
|
+
code: 'div-1',
|
|
69
|
+
mediaTypes: {
|
|
70
|
+
banner: {
|
|
71
|
+
sizes: [ [300, 250], [300,600] ]
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
bids: [{
|
|
75
|
+
bidder: 'silverpush',
|
|
76
|
+
params: {
|
|
77
|
+
publisherId: "123456",
|
|
78
|
+
bidFloor: 1.2
|
|
79
|
+
}
|
|
80
|
+
}]
|
|
81
|
+
},{
|
|
82
|
+
code: 'video-1',
|
|
83
|
+
mediaTypes: {
|
|
84
|
+
video: {
|
|
85
|
+
api: [1, 2, 4, 6],
|
|
86
|
+
mimes: ['video/mp4'],
|
|
87
|
+
context: 'instream', // or 'outstream'
|
|
88
|
+
playerSize: [ 640, 480 ],
|
|
89
|
+
protocols: [4,5,6,7],
|
|
90
|
+
placement: 1,
|
|
91
|
+
minduration: 0,
|
|
92
|
+
maxduration: 60,
|
|
93
|
+
startdelay: 0
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
bids: [
|
|
97
|
+
{
|
|
98
|
+
bidder: 'silverpush',
|
|
99
|
+
params: {
|
|
100
|
+
publisherId: "123456",
|
|
101
|
+
bidfloor: 2.5
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
];
|
|
107
|
+
```
|
|
@@ -74,7 +74,7 @@ export const spec = {
|
|
|
74
74
|
pbTimeout: config.getConfig('bidderTimeout'),
|
|
75
75
|
pbjsVersion: prebidVersion,
|
|
76
76
|
placements: [],
|
|
77
|
-
ref: deepAccess(bidderRequest, 'refererInfo.
|
|
77
|
+
ref: deepAccess(bidderRequest, 'refererInfo.page') ? bidderRequest.refererInfo.page : undefined,
|
|
78
78
|
usp: {},
|
|
79
79
|
userIds: {
|
|
80
80
|
'33acrossId': deepAccess(validBidRequests[0], 'userId.33acrossId.envelope') ? validBidRequests[0].userId['33acrossId'].envelope : undefined,
|
|
@@ -193,7 +193,7 @@ export const spec = {
|
|
|
193
193
|
creativeId: mid.mid,
|
|
194
194
|
currency: 'USD',
|
|
195
195
|
netRevenue: false,
|
|
196
|
-
ttl: mid.ttl ||
|
|
196
|
+
ttl: mid.ttl || 300,
|
|
197
197
|
meta: {
|
|
198
198
|
advertiserDomains: mid.advertiser_domains || []
|
|
199
199
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AD_BREAK_END, AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, SETUP_COMPLETE } from '../../libraries/video/constants/events.js'
|
|
2
|
-
import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
|
|
2
|
+
import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
|
|
3
3
|
|
|
4
4
|
export function AdQueueCoordinator(videoCore, pbEvents) {
|
|
5
5
|
const storage = {};
|
|
@@ -58,6 +58,6 @@ export function AdQueueCoordinator(videoCore, pbEvents) {
|
|
|
58
58
|
|
|
59
59
|
function triggerEvent(eventName, adTagUrl, options) {
|
|
60
60
|
const payload = Object.assign({ adTagUrl }, options);
|
|
61
|
-
pbEvents.emit(getExternalVideoEventName(eventName), payload);
|
|
61
|
+
pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, payload));
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { config } from '../../src/config.js';
|
|
2
2
|
import { find } from '../../src/polyfill.js';
|
|
3
3
|
import * as events from '../../src/events.js';
|
|
4
|
-
import { mergeDeep } from '../../src/utils.js';
|
|
4
|
+
import { mergeDeep, logWarn } from '../../src/utils.js';
|
|
5
5
|
import { getGlobal } from '../../src/prebidGlobal.js';
|
|
6
6
|
import CONSTANTS from '../../src/constants.json';
|
|
7
7
|
import {
|
|
@@ -20,7 +20,7 @@ import { videoCoreFactory } from './coreVideo.js';
|
|
|
20
20
|
import { gamSubmoduleFactory } from './gamAdServerSubmodule.js';
|
|
21
21
|
import { videoImpressionVerifierFactory } from './videoImpressionVerifier.js';
|
|
22
22
|
import { AdQueueCoordinator } from './adQueue.js';
|
|
23
|
-
import { getExternalVideoEventName } from '../../libraries/video/shared/helpers.js'
|
|
23
|
+
import { getExternalVideoEventName, getExternalVideoEventPayload } from '../../libraries/video/shared/helpers.js'
|
|
24
24
|
|
|
25
25
|
const allVideoEvents = Object.keys(videoEvents).map(eventKey => videoEvents[eventKey]);
|
|
26
26
|
events.addEvents(allVideoEvents.concat([AUCTION_AD_LOAD_ATTEMPT, AUCTION_AD_LOAD_QUEUED, AUCTION_AD_LOAD_ABORT, BID_IMPRESSION, BID_ERROR]).map(getExternalVideoEventName));
|
|
@@ -54,7 +54,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
54
54
|
adQueueCoordinator.registerProvider(divId);
|
|
55
55
|
videoCore.initProvider(divId);
|
|
56
56
|
videoCore.onEvents(videoEvents, (type, payload) => {
|
|
57
|
-
pbEvents.emit(getExternalVideoEventName(type), payload);
|
|
57
|
+
pbEvents.emit(getExternalVideoEventName(type), getExternalVideoEventPayload(type, payload));
|
|
58
58
|
}, divId);
|
|
59
59
|
|
|
60
60
|
const adServerConfig = provider.adServer;
|
|
@@ -145,6 +145,10 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
145
145
|
video.context = ortbVideo.placement === PLACEMENT.INSTREAM ? 'instream' : 'outstream';
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
+
if (!video.plcmt) {
|
|
149
|
+
logWarn('Video.plcmt has not been set. Failure to set a value may result in loss of bids');
|
|
150
|
+
}
|
|
151
|
+
|
|
148
152
|
const width = ortbVideo.w;
|
|
149
153
|
const height = ortbVideo.h;
|
|
150
154
|
if (!video.playerSize && width && height) {
|
|
@@ -199,7 +203,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
199
203
|
|
|
200
204
|
const highestCpmBids = pbGlobal.getHighestCpmBids(adUnitCode);
|
|
201
205
|
if (!highestCpmBids.length) {
|
|
202
|
-
pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), options);
|
|
206
|
+
pbEvents.emit(getExternalVideoEventName(AUCTION_AD_LOAD_ABORT), getExternalVideoEventPayload(AUCTION_AD_LOAD_ABORT, options));
|
|
203
207
|
return;
|
|
204
208
|
}
|
|
205
209
|
|
|
@@ -223,7 +227,7 @@ export function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvent
|
|
|
223
227
|
}
|
|
224
228
|
|
|
225
229
|
pbGlobal.markWinningBidAsUsed(bid);
|
|
226
|
-
pbEvents.emit(getExternalVideoEventName(eventName), { bid, adEvent: adEventPayload });
|
|
230
|
+
pbEvents.emit(getExternalVideoEventName(eventName), getExternalVideoEventPayload(eventName, { bid, adEvent: adEventPayload }));
|
|
227
231
|
}
|
|
228
232
|
|
|
229
233
|
function getBid(adPayload) {
|
|
@@ -380,6 +380,7 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
|
|
|
380
380
|
const ortb2Object = bid.ortb2;
|
|
381
381
|
const siteObject = deepAccess(ortb2Object, 'site') || undefined;
|
|
382
382
|
const siteContentObject = deepAccess(siteObject, 'content') || undefined;
|
|
383
|
+
const sitePublisherObject = deepAccess(siteObject, 'publisher') || undefined;
|
|
383
384
|
const siteContentDataArray = deepAccess(siteObject, 'content.data') || undefined;
|
|
384
385
|
const appContentObject = deepAccess(ortb2Object, 'app.content') || undefined;
|
|
385
386
|
const appContentDataArray = deepAccess(ortb2Object, 'app.content.data') || undefined;
|
|
@@ -394,6 +395,11 @@ function appendFirstPartyData(outBoundBidRequest, bid) {
|
|
|
394
395
|
outBoundBidRequest.site = validateAppendObject('object', allowedSiteObjectKeys, siteObject, outBoundBidRequest.site);
|
|
395
396
|
};
|
|
396
397
|
|
|
398
|
+
if (sitePublisherObject && isPlainObject(sitePublisherObject)) {
|
|
399
|
+
const allowedPublisherObjectKeys = ['ext'];
|
|
400
|
+
outBoundBidRequest.site.publisher = validateAppendObject('object', allowedPublisherObjectKeys, sitePublisherObject, outBoundBidRequest.site.publisher);
|
|
401
|
+
}
|
|
402
|
+
|
|
397
403
|
if (siteContentObject && isPlainObject(siteContentObject)) {
|
|
398
404
|
const allowedContentStringKeys = ['id', 'title', 'series', 'season', 'genre', 'contentrating', 'language'];
|
|
399
405
|
const allowedContentNumberkeys = ['episode', 'prodq', 'context', 'livestream', 'len'];
|
|
@@ -435,6 +435,43 @@ pbjs.setConfig({
|
|
|
435
435
|
}
|
|
436
436
|
});
|
|
437
437
|
```
|
|
438
|
+
|
|
439
|
+
Notes: The first party site info is filtered and only the following specific keys are allowed in the bidRequests:
|
|
440
|
+
|
|
441
|
+
| Field | Type |
|
|
442
|
+
|-----------------------------|--------|
|
|
443
|
+
| site.name | String |
|
|
444
|
+
| site.domain | String |
|
|
445
|
+
| site.page | String |
|
|
446
|
+
| site.ref | String |
|
|
447
|
+
| site.keywords | String |
|
|
448
|
+
| site.search | String |
|
|
449
|
+
| site.cat | Array |
|
|
450
|
+
| site.sectioncat | Array |
|
|
451
|
+
| site.pagecat | Array |
|
|
452
|
+
| site.ext | Object |
|
|
453
|
+
| site.publisher.ext | Object |
|
|
454
|
+
| site.content.id | String |
|
|
455
|
+
| site.content.title | String |
|
|
456
|
+
| site.content.series | String |
|
|
457
|
+
| site.content.season | String |
|
|
458
|
+
| site.content.genre | String |
|
|
459
|
+
| site.content.contentrating | String |
|
|
460
|
+
| site.content.language | String |
|
|
461
|
+
| site.content.episode | Number |
|
|
462
|
+
| site.content.prodq | Number |
|
|
463
|
+
| site.content.context | Number |
|
|
464
|
+
| site.content.livestream | Number |
|
|
465
|
+
| site.content.len | Number |
|
|
466
|
+
| site.content.cat | Array |
|
|
467
|
+
| site.content.ext | Object |
|
|
468
|
+
| site.content.data | Array |
|
|
469
|
+
| site.content.data[].id | String |
|
|
470
|
+
| site.content.data[].name | String |
|
|
471
|
+
| site.content.data[].segment | Array |
|
|
472
|
+
| site.content.data[].ext | Object |
|
|
473
|
+
|
|
474
|
+
|
|
438
475
|
### Passing First Party "user" data:
|
|
439
476
|
```javascript
|
|
440
477
|
pbjs.setConfig({
|
package/package.json
CHANGED
package/src/adloader.js
CHANGED
package/src/native.js
CHANGED
|
@@ -556,6 +556,21 @@ export function toOrtbNativeRequest(legacyNativeAssets) {
|
|
|
556
556
|
return ortb;
|
|
557
557
|
}
|
|
558
558
|
|
|
559
|
+
/**
|
|
560
|
+
* Greatest common divisor between two positive integers
|
|
561
|
+
* https://en.wikipedia.org/wiki/Euclidean_algorithm
|
|
562
|
+
*/
|
|
563
|
+
function gcd(a, b) {
|
|
564
|
+
while (a && b && a !== b) {
|
|
565
|
+
if (a > b) {
|
|
566
|
+
a = a - b;
|
|
567
|
+
} else {
|
|
568
|
+
b = b - a;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
return a || b;
|
|
572
|
+
}
|
|
573
|
+
|
|
559
574
|
/**
|
|
560
575
|
* This function converts an OpenRTB native request object to Prebid proprietary
|
|
561
576
|
* format. The purpose of this function is to help adapters to handle the
|
|
@@ -584,12 +599,13 @@ export function fromOrtbNativeRequest(openRTBRequest) {
|
|
|
584
599
|
if (asset.img.w && asset.img.h) {
|
|
585
600
|
image.sizes = [asset.img.w, asset.img.h];
|
|
586
601
|
} else if (asset.img.wmin && asset.img.hmin) {
|
|
587
|
-
|
|
602
|
+
const scale = gcd(asset.img.wmin, asset.img.hmin)
|
|
603
|
+
image.aspect_ratios = [{
|
|
588
604
|
min_width: asset.img.wmin,
|
|
589
605
|
min_height: asset.img.hmin,
|
|
590
|
-
ratio_width: asset.img.wmin,
|
|
591
|
-
ratio_height: asset.img.hmin
|
|
592
|
-
}
|
|
606
|
+
ratio_width: asset.img.wmin / scale,
|
|
607
|
+
ratio_height: asset.img.hmin / scale
|
|
608
|
+
}]
|
|
593
609
|
}
|
|
594
610
|
|
|
595
611
|
if (asset.img.type === NATIVE_IMAGE_TYPES.MAIN) {
|
|
@@ -53,7 +53,8 @@ describe('33acrossBidAdapter:', function () {
|
|
|
53
53
|
brand: 'macOS',
|
|
54
54
|
version: ['11', '6', '8']
|
|
55
55
|
},
|
|
56
|
-
model: ''
|
|
56
|
+
model: '',
|
|
57
|
+
mobile: 0
|
|
57
58
|
}
|
|
58
59
|
},
|
|
59
60
|
id: 'r1',
|
|
@@ -337,7 +338,7 @@ describe('33acrossBidAdapter:', function () {
|
|
|
337
338
|
version: ['11', '6', '8']
|
|
338
339
|
},
|
|
339
340
|
model: '',
|
|
340
|
-
mobile:
|
|
341
|
+
mobile: 0
|
|
341
342
|
}
|
|
342
343
|
}
|
|
343
344
|
}
|
|
@@ -369,7 +370,7 @@ describe('33acrossBidAdapter:', function () {
|
|
|
369
370
|
version: ['11', '6', '8']
|
|
370
371
|
},
|
|
371
372
|
model: '',
|
|
372
|
-
mobile:
|
|
373
|
+
mobile: 0
|
|
373
374
|
}
|
|
374
375
|
}
|
|
375
376
|
},
|