Skip to content

Commit 3fa81fc

Browse files
itaynaveidettman
authored andcommitted
New bid adapter for aniview (#3522)
* Support new aniview bid adapter * Support new aniview bid adapter * Support new aniview bid adapter * Support new aniview bid adapter * Fix Consent parameters
1 parent 080beb2 commit 3fa81fc

File tree

3 files changed

+410
-0
lines changed

3 files changed

+410
-0
lines changed

modules/aniviewBidAdapter.js

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
import { VIDEO } from '../src/mediaTypes';
2+
import * as utils from '../src/utils';
3+
import { registerBidder } from '../src/adapters/bidderFactory';
4+
import { Renderer } from '../src/Renderer';
5+
6+
const BIDDER_CODE = 'aniview';
7+
const TTL = 600;
8+
9+
function avRenderer(bid) {
10+
bid.renderer.push(function() {
11+
let eventCallback = bid && bid.renderer && bid.renderer.handleVideoEvent ? bid.renderer.handleVideoEvent : null;
12+
window.aniviewRenderer.renderAd({
13+
id: bid.adUnitCode + '_' + bid.adId,
14+
debug: window.location.href.indexOf('pbjsDebug') >= 0,
15+
placement: bid.adUnitCode,
16+
width: bid.width,
17+
height: bid.height,
18+
vastUrl: bid.vastUrl,
19+
vastXml: bid.vastXml,
20+
config: bid.params[0].rendererConfig,
21+
eventsCallback: eventCallback,
22+
bid: bid
23+
});
24+
});
25+
}
26+
27+
function newRenderer(bidRequest) {
28+
const renderer = Renderer.install({
29+
url: 'https://player.aniview.com/script/6.1/prebidRenderer.js',
30+
config: {},
31+
loaded: false,
32+
});
33+
34+
try {
35+
renderer.setRender(avRenderer);
36+
} catch (err) {
37+
}
38+
39+
return renderer;
40+
}
41+
42+
function isBidRequestValid(bid) {
43+
if (!bid.params || !bid.params.AV_PUBLISHERID || !bid.params.AV_CHANNELID) { return false; }
44+
45+
return true;
46+
}
47+
48+
function buildRequests(validBidRequests, bidderRequest) {
49+
let bidRequests = [];
50+
51+
for (let i = 0; i < validBidRequests.length; i++) {
52+
let bidRequest = validBidRequests[i];
53+
54+
if (!bidRequest.sizes || !bidRequest.sizes.length) {
55+
bidRequest.sizes = [[640, 480]];
56+
}
57+
58+
if (bidRequest.sizes.length === 2 && typeof bidRequest.sizes[0] === 'number' && typeof bidRequest.sizes[1] === 'number') {
59+
let adWidth = bidRequest.sizes[0];
60+
let adHeight = bidRequest.sizes[1];
61+
bidRequest.sizes = [[adWidth, adHeight]];
62+
}
63+
64+
for (let j = 0; j < bidRequest.sizes.length; j++) {
65+
let size = bidRequest.sizes[j];
66+
let playerWidth;
67+
let playerHeight;
68+
if (size && size.length == 2) {
69+
playerWidth = size[0];
70+
playerHeight = size[1];
71+
} else {
72+
playerWidth = 640;
73+
playerHeight = 480;
74+
}
75+
76+
let s2sParams = {};
77+
78+
for (var attrname in bidRequest.params) {
79+
if (bidRequest.params.hasOwnProperty(attrname) && attrname.indexOf('AV_') == 0) {
80+
s2sParams[attrname] = bidRequest.params[attrname];
81+
}
82+
};
83+
84+
if (s2sParams.AV_APPPKGNAME && !s2sParams.AV_URL) { s2sParams.AV_URL = s2sParams.AV_APPPKGNAME; }
85+
if (!s2sParams.AV_IDFA && !s2sParams.AV_URL) { s2sParams.AV_URL = utils.getTopWindowUrl(); }
86+
if (s2sParams.AV_IDFA && !s2sParams.AV_AID) { s2sParams.AV_AID = s2sParams.AV_IDFA; }
87+
if (s2sParams.AV_AID && !s2sParams.AV_IDFA) { s2sParams.AV_IDFA = s2sParams.AV_AID; }
88+
89+
s2sParams.pbjs = 1;
90+
s2sParams.cb = Math.floor(Math.random() * 999999999);
91+
s2sParams.AV_WIDTH = playerWidth;
92+
s2sParams.AV_HEIGHT = playerHeight;
93+
s2sParams.s2s = '1';
94+
s2sParams.bidId = bidRequest.bidId;
95+
s2sParams.bidWidth = playerWidth;
96+
s2sParams.bidHeight = playerHeight;
97+
98+
if (bidderRequest && bidderRequest.gdprConsent) {
99+
if (bidderRequest.gdprConsent.gdprApplies) {
100+
s2sParams.AV_GDPR = 1;
101+
s2sParams.AV_CONSENT = bidderRequest.gdprConsent.consentString
102+
}
103+
}
104+
105+
let serverDomain = bidRequest.params && bidRequest.params.serverDomain ? bidRequest.params.serverDomain : 'gov.aniview.com';
106+
let serverUrl = 'https://' + serverDomain + '/api/adserver/vast3/';
107+
108+
bidRequests.push({
109+
method: 'GET',
110+
url: serverUrl,
111+
data: s2sParams,
112+
bidRequest
113+
});
114+
}
115+
}
116+
117+
return bidRequests;
118+
}
119+
function getCpmData(xml) {
120+
let ret = {cpm: 0, currency: 'USD'};
121+
if (xml) {
122+
let ext = xml.getElementsByTagName('Extensions');
123+
if (ext && ext.length > 0) {
124+
ext = ext[0].getElementsByTagName('Extension');
125+
if (ext && ext.length > 0) {
126+
for (var i = 0; i < ext.length; i++) {
127+
if (ext[i].getAttribute('type') == 'ANIVIEW') {
128+
let price = ext[i].getElementsByTagName('Cpm');
129+
if (price && price.length == 1) {
130+
ret.cpm = price[0].textContent;
131+
}
132+
break;
133+
}
134+
}
135+
}
136+
}
137+
}
138+
return ret;
139+
}
140+
function interpretResponse(serverResponse, bidRequest) {
141+
let bidResponses = [];
142+
if (serverResponse && serverResponse.body) {
143+
if (serverResponse.error) {
144+
return bidResponses;
145+
} else {
146+
try {
147+
let bidResponse = {};
148+
if (bidRequest && bidRequest.data && bidRequest.data.bidId && bidRequest.data.bidId !== '') {
149+
let xmlStr = serverResponse.body;
150+
let xml = new window.DOMParser().parseFromString(xmlStr, 'text/xml');
151+
if (xml && xml.getElementsByTagName('parsererror').length == 0) {
152+
let cpmData = getCpmData(xml);
153+
if (cpmData && cpmData.cpm > 0) {
154+
bidResponse.requestId = bidRequest.data.bidId;
155+
bidResponse.bidderCode = BIDDER_CODE;
156+
bidResponse.ad = '';
157+
bidResponse.cpm = cpmData.cpm;
158+
bidResponse.width = bidRequest.data.AV_WIDTH;
159+
bidResponse.height = bidRequest.data.AV_HEIGHT;
160+
bidResponse.ttl = TTL;
161+
bidResponse.creativeId = xml.getElementsByTagName('Ad') && xml.getElementsByTagName('Ad')[0] && xml.getElementsByTagName('Ad')[0].getAttribute('id') ? xml.getElementsByTagName('Ad')[0].getAttribute('id') : 'creativeId';
162+
bidResponse.currency = cpmData.currency;
163+
bidResponse.netRevenue = true;
164+
var blob = new Blob([xmlStr], {
165+
type: 'application/xml'
166+
});
167+
bidResponse.vastUrl = window.URL.createObjectURL(blob);
168+
bidResponse.vastXml = xmlStr;
169+
bidResponse.mediaType = VIDEO;
170+
if (bidRequest.bidRequest && bidRequest.bidRequest.mediaTypes && bidRequest.bidRequest.mediaTypes.video && bidRequest.bidRequest.mediaTypes.video.context === 'outstream') { bidResponse.renderer = newRenderer(bidRequest); }
171+
172+
bidResponses.push(bidResponse);
173+
}
174+
} else {}
175+
} else {}
176+
} catch (e) {}
177+
}
178+
} else {}
179+
180+
return bidResponses;
181+
}
182+
183+
export const spec = {
184+
code: BIDDER_CODE,
185+
supportedMediaTypes: [VIDEO],
186+
isBidRequestValid,
187+
buildRequests,
188+
interpretResponse
189+
}
190+
191+
registerBidder(spec);

modules/aniviewBidAdapter.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Overview
2+
3+
```
4+
Module Name: ANIVIEW Bidder Adapter
5+
Module Type: Bidder Adapter
6+
Maintainer: [email protected]
7+
```
8+
9+
# Description
10+
11+
Connects to ANIVIEW Ad server for bids.
12+
13+
ANIVIEW bid adapter supports Video ads currently.
14+
15+
For more information about [Aniview](http://www.aniview.com), please contact [[email protected]]([email protected]).
16+
17+
# Sample Ad Unit: For Publishers
18+
```javascript
19+
var videoAdUnit = [
20+
{
21+
code: 'video1',
22+
sizes: [
23+
[300, 250],
24+
[640, 480]
25+
],
26+
bids: [{
27+
bidder: 'aniview',
28+
params: {
29+
AV_PUBLISHERID: '55b78633181f4603178b4568',
30+
AV_CHANNELID: '55b7904d181f46410f8b4568'
31+
}
32+
}]
33+
}];
34+
```
35+
36+
```

0 commit comments

Comments
 (0)