Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 88 additions & 81 deletions modules/openxBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ export const spec = {
requests.push(buildOXBannerRequest(bannerBids, bidderRequest));
}
// build video requests
if (videoBids.length > 0) {
if (FEATURES.VIDEO && videoBids.length > 0) {
videoBids.forEach(videoBid => {
requests.push(buildOXVideoRequest(videoBid, bidderRequest))
});
Expand All @@ -95,7 +95,7 @@ export const spec = {
interpretResponse: function ({body: oxResponseObj}, serverRequest) {
let mediaType = getMediaTypeFromRequest(serverRequest);

return mediaType === VIDEO ? createVideoBidResponses(oxResponseObj, serverRequest.payload)
return FEATURES.VIDEO && mediaType === VIDEO ? createVideoBidResponses(oxResponseObj, serverRequest.payload)
: createBannerBidResponses(oxResponseObj, serverRequest.payload);
},
getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
Expand Down Expand Up @@ -238,7 +238,7 @@ function formatCustomParms(customKey, customParams) {
function partitionByVideoBids(bidRequests) {
return bidRequests.reduce(function (acc, bid) {
// Fallback to banner ads if nothing specified
if (isVideoRequest(bid)) {
if (FEATURES.VIDEO && isVideoRequest(bid)) {
acc[0].push(bid);
} else {
acc[1].push(bid);
Expand Down Expand Up @@ -448,101 +448,108 @@ function buildOXBannerRequest(bids, bidderRequest) {
}

function buildOXVideoRequest(bid, bidderRequest) {
let oxVideoParams = generateVideoParameters(bid, bidderRequest);
let url = oxVideoParams.ph
? `https://u.openx.net/v/1.0/avjp`
: `https://${bid.params.delDomain}/v/1.0/avjp`;
return {
method: 'GET',
url: url,
data: oxVideoParams,
payload: {'bid': bid, 'startTime': new Date()}
};
}

function generateVideoParameters(bid, bidderRequest) {
const videoMediaType = deepAccess(bid, `mediaTypes.video`);
let queryParams = buildCommonQueryParamsFromBids([bid], bidderRequest);
let oxVideoConfig = deepAccess(bid, 'params.video') || {};
let context = deepAccess(bid, 'mediaTypes.video.context');
let playerSize = deepAccess(bid, 'mediaTypes.video.playerSize');
let width;
let height;

// normalize config for video size
if (isArray(bid.sizes) && bid.sizes.length === 2 && !isArray(bid.sizes[0])) {
width = parseInt(bid.sizes[0], 10);
height = parseInt(bid.sizes[1], 10);
} else if (isArray(bid.sizes) && isArray(bid.sizes[0]) && bid.sizes[0].length === 2) {
width = parseInt(bid.sizes[0][0], 10);
height = parseInt(bid.sizes[0][1], 10);
} else if (isArray(playerSize) && playerSize.length === 2) {
width = parseInt(playerSize[0], 10);
height = parseInt(playerSize[1], 10);
if (FEATURES.VIDEO) {
let oxVideoParams = generateVideoParameters(bid, bidderRequest);
let url = oxVideoParams.ph
? `https://u.openx.net/v/1.0/avjp`
: `https://${bid.params.delDomain}/v/1.0/avjp`;
return {
method: 'GET',
url: url,
data: oxVideoParams,
payload: {'bid': bid, 'startTime': new Date()}
};
}

let openRtbParams = {w: width, h: height};
return {}
}

// legacy openrtb params could be in video, openrtb, or video.openrtb
let legacyParams = bid.params.video || bid.params.openrtb || {};
if (legacyParams.openrtb) {
legacyParams = legacyParams.openrtb;
}
// support for video object or full openrtb object
if (isArray(legacyParams.imp)) {
legacyParams = legacyParams.imp[0].video;
}
Object.keys(legacyParams)
.filter(param => includes(VIDEO_TARGETING, param))
.forEach(param => openRtbParams[param] = legacyParams[param]);

// 5.0 openrtb video params
Object.keys(videoMediaType)
.filter(param => includes(VIDEO_TARGETING, param))
.forEach(param => openRtbParams[param] = videoMediaType[param]);

let openRtbReq = {
imp: [
{
video: openRtbParams
}
]
};
function generateVideoParameters(bid, bidderRequest) {
let queryParams = {}
if (FEATURES.VIDEO) {
const videoMediaType = deepAccess(bid, `mediaTypes.video`);
queryParams = buildCommonQueryParamsFromBids([bid], bidderRequest);
let oxVideoConfig = deepAccess(bid, 'params.video') || {};
let context = deepAccess(bid, 'mediaTypes.video.context');
let playerSize = deepAccess(bid, 'mediaTypes.video.playerSize');
let width;
let height;

// normalize config for video size
if (isArray(bid.sizes) && bid.sizes.length === 2 && !isArray(bid.sizes[0])) {
width = parseInt(bid.sizes[0], 10);
height = parseInt(bid.sizes[1], 10);
} else if (isArray(bid.sizes) && isArray(bid.sizes[0]) && bid.sizes[0].length === 2) {
width = parseInt(bid.sizes[0][0], 10);
height = parseInt(bid.sizes[0][1], 10);
} else if (isArray(playerSize) && playerSize.length === 2) {
width = parseInt(playerSize[0], 10);
height = parseInt(playerSize[1], 10);
}

queryParams['openrtb'] = JSON.stringify(openRtbReq);
let openRtbParams = {w: width, h: height};

queryParams.auid = bid.params.unit;
// override prebid config with openx config if available
queryParams.vwd = width || oxVideoConfig.vwd;
queryParams.vht = height || oxVideoConfig.vht;
// legacy openrtb params could be in video, openrtb, or video.openrtb
let legacyParams = bid.params.video || bid.params.openrtb || {};
if (legacyParams.openrtb) {
legacyParams = legacyParams.openrtb;
}
// support for video object or full openrtb object
if (isArray(legacyParams.imp)) {
legacyParams = legacyParams.imp[0].video;
}
Object.keys(legacyParams)
.filter(param => includes(VIDEO_TARGETING, param))
.forEach(param => openRtbParams[param] = legacyParams[param]);

// 5.0 openrtb video params
Object.keys(videoMediaType)
.filter(param => includes(VIDEO_TARGETING, param))
.forEach(param => openRtbParams[param] = videoMediaType[param]);

let openRtbReq = {
imp: [
{
video: openRtbParams
}
]
};

queryParams['openrtb'] = JSON.stringify(openRtbReq);

queryParams.auid = bid.params.unit;
// override prebid config with openx config if available
queryParams.vwd = width || oxVideoConfig.vwd;
queryParams.vht = height || oxVideoConfig.vht;

if (context === 'outstream') {
queryParams.vos = '101';
}

if (context === 'outstream') {
queryParams.vos = '101';
}
if (oxVideoConfig.mimes) {
queryParams.vmimes = oxVideoConfig.mimes;
}

if (oxVideoConfig.mimes) {
queryParams.vmimes = oxVideoConfig.mimes;
}
if (bid.params.test) {
queryParams.vtest = 1;
}

if (bid.params.test) {
queryParams.vtest = 1;
}
let gpid = deepAccess(bid, 'ortb2Imp.ext.data.pbadslot');
if (gpid) {
queryParams.aucs = encodeURIComponent(gpid);
}

let gpid = deepAccess(bid, 'ortb2Imp.ext.data.pbadslot');
if (gpid) {
queryParams.aucs = encodeURIComponent(gpid);
// each video bid makes a separate request
enrichQueryWithFloors(queryParams, VIDEO, [bid]);
}

// each video bid makes a separate request
enrichQueryWithFloors(queryParams, VIDEO, [bid]);

return queryParams;
}

function createVideoBidResponses(response, {bid, startTime}) {
let bidResponses = [];

if (response !== undefined && response.vastUrl !== '' && response.pub_rev > 0) {
if (FEATURES.VIDEO && response !== undefined && response.vastUrl !== '' && response.pub_rev > 0) {
let vastQueryParams = parseUrl(response.vastUrl).search || {};
let bidResponse = {};
bidResponse.requestId = bid.bidId;
Expand Down
2 changes: 1 addition & 1 deletion test/spec/modules/adlooxAdServerVideo_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ describe('Adloox Ad Server Video', function () {
it('should fetch, retry on withoutCredentials, follow and return a wrapped blob that expires', function (done) {
BID.responseTimestamp = utils.timestamp();
BID.ttl = 30;
this.timeout(5000)
this.timeout(7500)

const clock = sandbox.useFakeTimers(BID.responseTimestamp);

Expand Down
Loading