Skip to content

Commit 88b6a6d

Browse files
itaynaveFawke
authored andcommitted
aniview V3 & CCPA support (#4583)
* Support new aniview bid adapter * Support new aniview bid adapter * Support new aniview bid adapter * Support new aniview bid adapter * Fix Consent parameters * Update aniviewBidAdapter.js V3 support * Update aniviewBidAdapter.js * Update aniviewBidAdapter.js Update refererInfo * Update aniviewBidAdapter.js Fix tabs and spaces * Update aniviewBidAdapter.js fixes * Update aniviewBidAdapter.js * Update aniviewBidAdapter.js Add ccpa support * Update aniviewBidAdapter.js Typo * Update aniviewBidAdapter.js * Update aniviewBidAdapter.js * Fix size and sample Fixed sizes from playerSize Updated md sample * Fix tabs * Fix sizes * Recheck * Add tgt parameter * Update sample
1 parent 521c0f9 commit 88b6a6d

File tree

3 files changed

+399
-12
lines changed

3 files changed

+399
-12
lines changed

modules/aniviewBidAdapter.js

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

modules/aniviewBidAdapter.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,20 @@ For more information about [Aniview](http://www.aniview.com), please contact [su
1818
```javascript
1919
var videoAdUnit = [
2020
{
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-
}]
21+
code: 'video1',
22+
mediaTypes: {
23+
video: {
24+
playerSize: [[640, 480]],
25+
context: 'instream'
26+
},
27+
},
28+
bids: [{
29+
bidder: 'aniview',
30+
params: {
31+
AV_PUBLISHERID: '55b78633181f4603178b4568',
32+
AV_CHANNELID: '5d19dfca4b6236688c0a2fc4'
33+
}
34+
}]
3335
}];
3436
```
3537

0 commit comments

Comments
 (0)