Skip to content

Commit

Permalink
YieldOne Bid Adapter: add Flux Wrapper support. (prebid#7555)
Browse files Browse the repository at this point in the history
* YieldOne Bid Adapter: add Flux Wrapper support.

* YieldOne Bid Adapter: fix "import utils functions as needed and not the whole module (prebid#7502)"

* YieldOne Bid Adapter: fix minor feedback.

Co-authored-by: kenichi-ichijo <kenichi-ichijo@dac.co.jp>
  • Loading branch information
2 people authored and Chris Pabst committed Jan 10, 2022
1 parent 070e6fe commit 42e0285
Show file tree
Hide file tree
Showing 2 changed files with 414 additions and 64 deletions.
126 changes: 115 additions & 11 deletions modules/yieldoneBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { deepAccess, isEmpty, parseSizesInput, isStr, logWarn } from '../src/utils.js';
import {deepAccess, isEmpty, isStr, logWarn, parseSizesInput} from '../src/utils.js';
import {config} from '../src/config.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import { Renderer } from '../src/Renderer.js';
Expand All @@ -11,6 +11,8 @@ const VIDEO_PLAYER_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/d
const CMER_PLAYER_URL = 'https://an.cmertv.com/hb/renderer/cmertv-video-yone-prebid.min.js';
const VIEWABLE_PERCENTAGE_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/prebid-adformat-config.js';

const DEFAULT_VIDEO_SIZE = {w: 640, h: 360};

export const spec = {
code: BIDDER_CODE,
aliases: ['y1'],
Expand Down Expand Up @@ -40,16 +42,18 @@ export const spec = {
t: 'i'
};

const videoMediaType = deepAccess(bidRequest, 'mediaTypes.video');
if ((isEmpty(bidRequest.mediaType) && isEmpty(bidRequest.mediaTypes)) ||
(bidRequest.mediaType === BANNER || (bidRequest.mediaTypes && bidRequest.mediaTypes[BANNER]))) {
const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes;
payload.sz = parseSizesInput(sizes).join(',');
} else if (bidRequest.mediaType === VIDEO || videoMediaType) {
const sizes = deepAccess(bidRequest, 'mediaTypes.video.playerSize') || bidRequest.sizes;
const size = parseSizesInput(sizes)[0];
payload.w = size.split('x')[0];
payload.h = size.split('x')[1];
const mediaType = getMediaType(bidRequest);
switch (mediaType) {
case BANNER:
payload.sz = getBannerSizes(bidRequest);
break;
case VIDEO:
const videoSize = getVideoSize(bidRequest);
payload.w = videoSize.w;
payload.h = videoSize.h;
break;
default:
break;
}

// LiveRampID
Expand Down Expand Up @@ -167,6 +171,106 @@ export const spec = {
},
}

/**
* NOTE: server side does not yet support multiple formats.
* @param {Object} bidRequest -
* @param {boolean} [enabledOldFormat = true] - default: `true`.
* @return {string|null} - `"banner"` or `"video"` or `null`.
*/
function getMediaType(bidRequest, enabledOldFormat = true) {
let hasBannerType = Boolean(deepAccess(bidRequest, 'mediaTypes.banner'));
let hasVideoType = Boolean(deepAccess(bidRequest, 'mediaTypes.video'));

if (enabledOldFormat) {
hasBannerType = hasBannerType || bidRequest.mediaType === BANNER ||
(isEmpty(bidRequest.mediaTypes) && isEmpty(bidRequest.mediaType));
hasVideoType = hasVideoType || bidRequest.mediaType === VIDEO;
}

if (hasBannerType && hasVideoType) {
const playerParams = deepAccess(bidRequest, 'params.playerParams')
if (playerParams) {
return VIDEO;
} else {
return BANNER;
}
} else if (hasBannerType) {
return BANNER;
} else if (hasVideoType) {
return VIDEO;
}

return null;
}

/**
* NOTE:
* If `mediaTypes.banner` exists, then `mediaTypes.banner.sizes` must also exist.
* The reason for this is that Prebid.js will perform the verification and
* if `mediaTypes.banner.sizes` is inappropriate, it will delete the entire `mediaTypes.banner`.
* @param {Object} bidRequest -
* @param {Object} bidRequest.banner -
* @param {Array<string>} bidRequest.banner.sizes -
* @param {boolean} [enabledOldFormat = true] - default: `true`.
* @return {string} - strings like `"300x250"` or `"300x250,728x90"`.
*/
function getBannerSizes(bidRequest, enabledOldFormat = true) {
let sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes');

if (enabledOldFormat) {
sizes = sizes || bidRequest.sizes;
}

return parseSizesInput(sizes).join(',');
}

/**
* @param {Object} bidRequest -
* @param {boolean} [enabledOldFormat = true] - default: `true`.
* @param {boolean} [enabledFlux = true] - default: `true`.
* @return {{w: number, h: number}} -
*/
function getVideoSize(bidRequest, enabledOldFormat = true, enabledFlux = true) {
/**
* @param {Array<number, number> | Array<Array<number, number>>} sizes -
* @return {{w: number, h: number} | null} -
*/
const _getPlayerSize = (sizes) => {
let result = null;

const size = parseSizesInput(sizes)[0];
if (isEmpty(size)) {
return result;
}

const splited = size.split('x');
const sizeObj = {w: parseInt(splited[0], 10), h: parseInt(splited[1], 10)};
const _isValidPlayerSize = !(isEmpty(sizeObj)) && (isFinite(sizeObj.w) && isFinite(sizeObj.h));
if (!_isValidPlayerSize) {
return result;
}

result = sizeObj;
return result;
}

let playerSize = _getPlayerSize(deepAccess(bidRequest, 'mediaTypes.video.playerSize'));

if (enabledOldFormat) {
playerSize = playerSize || _getPlayerSize(bidRequest.sizes);
}

if (enabledFlux) {
// NOTE: `video.playerSize` in Flux is always [1,1].
if (playerSize && (playerSize.w === 1 && playerSize.h === 1)) {
// NOTE: `params.playerSize` is a specific object to support `FLUX`.
playerSize = _getPlayerSize(deepAccess(bidRequest, 'params.playerSize'));
}
}

return playerSize || DEFAULT_VIDEO_SIZE;
}

function newRenderer(response) {
const renderer = Renderer.install({
id: response.uid,
Expand Down

0 comments on commit 42e0285

Please sign in to comment.