Skip to content

Commit 49ae4bb

Browse files
committed
IX: Set bidVideo when category and duration is available
1 parent 378d0dc commit 49ae4bb

File tree

2 files changed

+52
-16
lines changed

2 files changed

+52
-16
lines changed

src/main/java/org/prebid/server/bidder/ix/IxBidder.java

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.prebid.server.bidder.ix;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
34
import com.fasterxml.jackson.core.type.TypeReference;
5+
import com.fasterxml.jackson.databind.node.ObjectNode;
46
import com.iab.openrtb.request.Banner;
57
import com.iab.openrtb.request.BidRequest;
68
import com.iab.openrtb.request.Format;
@@ -24,9 +26,12 @@
2426
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
2527
import org.prebid.server.proto.openrtb.ext.request.ix.ExtImpIx;
2628
import org.prebid.server.proto.openrtb.ext.response.BidType;
29+
import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid;
30+
import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidVideo;
2731
import org.prebid.server.util.HttpUtil;
2832

2933
import java.util.ArrayList;
34+
import java.util.Arrays;
3035
import java.util.Collection;
3136
import java.util.Collections;
3237
import java.util.List;
@@ -46,6 +51,8 @@ public class IxBidder implements Bidder<BidRequest> {
4651
// maximum number of bid requests
4752
private static final int REQUEST_LIMIT = 20;
4853

54+
private static final String PREBID = "prebid";
55+
4956
private final String endpointUrl;
5057
private final JacksonMapper mapper;
5158

@@ -194,21 +201,48 @@ public Result<List<BidderBid>> makeBids(HttpCall<BidRequest> httpCall, BidReques
194201
}
195202
}
196203

197-
private static List<BidderBid> extractBids(BidResponse bidResponse, BidRequest bidRequest) {
204+
private List<BidderBid> extractBids(BidResponse bidResponse, BidRequest bidRequest) {
198205
return bidResponse == null || CollectionUtils.isEmpty(bidResponse.getSeatbid())
199206
? Collections.emptyList()
200207
: bidsFromResponse(bidResponse, bidRequest);
201208
}
202209

203-
private static List<BidderBid> bidsFromResponse(BidResponse bidResponse, BidRequest bidRequest) {
210+
private List<BidderBid> bidsFromResponse(BidResponse bidResponse, BidRequest bidRequest) {
204211
return bidResponse.getSeatbid().stream()
205212
.map(SeatBid::getBid)
206213
.flatMap(Collection::stream)
207-
.map(bid -> prepareBid(bid, bidRequest))
208-
.map(bid -> BidderBid.of(bid, getBidType(bid.getImpid(), bidRequest.getImp()), bidResponse.getCur()))
214+
.map(bid -> toBidderBid(bid, bidRequest, bidResponse))
209215
.collect(Collectors.toList());
210216
}
211217

218+
private BidderBid toBidderBid(Bid bid, BidRequest bidRequest, BidResponse bidResponse) {
219+
final BidType bidType = getBidType(bid.getImpid(), bidRequest.getImp());
220+
221+
final boolean bidHasNoSizes = bid.getH() == null || bid.getW() == null;
222+
final Banner banner = bidRequest.getImp().get(0).getBanner();
223+
if (bidHasNoSizes && banner != null) {
224+
bid = bid.toBuilder()
225+
.w(banner.getW())
226+
.h(banner.getH())
227+
.build();
228+
}
229+
230+
final ExtBidPrebid bidExt = parseBidExt(bid.getExt());
231+
if (bidExt != null && bidExt.getVideo() != null) {
232+
final ExtBidPrebidVideo video = bidExt.getVideo();
233+
bid = bid.toBuilder()
234+
.ext(toBidderBidExt(video))
235+
.build();
236+
if (bid.getCat().size() == 0) {
237+
bid = bid.toBuilder()
238+
.cat(Arrays.asList(video.getPrimaryCategory()))
239+
.build();
240+
}
241+
}
242+
243+
return BidderBid.of(bid, bidType, bidResponse.getCur());
244+
}
245+
212246
private static BidType getBidType(String impId, List<Imp> imps) {
213247
for (Imp imp : imps) {
214248
if (imp.getId().equals(impId)) {
@@ -226,16 +260,18 @@ private static BidType getBidType(String impId, List<Imp> imps) {
226260
throw new PreBidException(String.format("Unmatched impression id %s", impId));
227261
}
228262

229-
private static Bid prepareBid(Bid bid, BidRequest bidRequest) {
230-
// Current implementation ensure that we have at least one imp in request
231-
final boolean bidHasNoSizes = bid.getH() == null || bid.getW() == null;
232-
final Banner banner = bidRequest.getImp().get(0).getBanner();
233-
if (bidHasNoSizes && banner != null) {
234-
return bid.toBuilder()
235-
.w(banner.getW())
236-
.h(banner.getH())
237-
.build();
263+
private ExtBidPrebid parseBidExt(ObjectNode bidExt) {
264+
try {
265+
return bidExt == null
266+
? null
267+
: mapper.mapper().treeToValue(bidExt, ExtBidPrebid.class);
268+
} catch (JsonProcessingException e) {
269+
throw new PreBidException(e.getMessage());
238270
}
239-
return bid;
240271
}
272+
273+
private ObjectNode toBidderBidExt(ExtBidPrebidVideo extBidVideo) {
274+
return mapper.mapper().valueToTree(ExtBidPrebidVideo.of(extBidVideo.getDuration(), null));
275+
}
276+
241277
}

src/main/resources/bidder-config/ix.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ adapters:
2222
supported-vendors:
2323
vendor-id: 10
2424
usersync:
25-
url:
26-
redirect-url:
25+
url: https://ssum.casalemedia.com/usermatchredir?gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&r=
26+
redirect-url: /setuid?bidder=improvedigital&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&uid={{uid}}
2727
cookie-family-name: ix
2828
type: redirect
2929
support-cors: false

0 commit comments

Comments
 (0)