Skip to content

Commit 10a041a

Browse files
OMS: add video support (#3779)
1 parent 6b73664 commit 10a041a

File tree

9 files changed

+255
-24
lines changed

9 files changed

+255
-24
lines changed

src/main/java/org/prebid/server/bidder/oms/OmsBidder.java

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
package org.prebid.server.bidder.oms;
22

3+
import com.fasterxml.jackson.core.type.TypeReference;
34
import com.iab.openrtb.request.BidRequest;
5+
import com.iab.openrtb.request.Imp;
6+
import com.iab.openrtb.response.Bid;
47
import com.iab.openrtb.response.BidResponse;
58
import com.iab.openrtb.response.SeatBid;
69
import org.apache.commons.collections4.CollectionUtils;
10+
import org.apache.commons.lang3.ObjectUtils;
11+
import org.apache.commons.lang3.StringUtils;
712
import org.prebid.server.bidder.Bidder;
813
import org.prebid.server.bidder.model.BidderBid;
914
import org.prebid.server.bidder.model.BidderCall;
1015
import org.prebid.server.bidder.model.BidderError;
1116
import org.prebid.server.bidder.model.HttpRequest;
1217
import org.prebid.server.bidder.model.Result;
18+
import org.prebid.server.exception.PreBidException;
1319
import org.prebid.server.json.DecodeException;
1420
import org.prebid.server.json.JacksonMapper;
21+
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
22+
import org.prebid.server.proto.openrtb.ext.request.omx.ExtImpOms;
1523
import org.prebid.server.proto.openrtb.ext.response.BidType;
24+
import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidVideo;
1625
import org.prebid.server.util.BidderUtil;
1726
import org.prebid.server.util.HttpUtil;
1827

@@ -23,6 +32,8 @@
2332

2433
public class OmsBidder implements Bidder<BidRequest> {
2534

35+
private static final TypeReference<ExtPrebid<?, ExtImpOms>> EXT_TYPE_REFERENCE = new TypeReference<>() {
36+
};
2637
private final String endpointUrl;
2738
private final JacksonMapper mapper;
2839

@@ -32,8 +43,31 @@ public OmsBidder(String endpointUrl, JacksonMapper mapper) {
3243
}
3344

3445
@Override
35-
public final Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest bidRequest) {
36-
return Result.withValue(BidderUtil.defaultRequest(bidRequest, endpointUrl, mapper));
46+
public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request) {
47+
try {
48+
final ExtImpOms impExt = parseImpExt(request.getImp().getFirst());
49+
final String publisherId = resolverPublisherId(impExt.getPid(), impExt.getPublisherId());
50+
final String encodedPublisherId = HttpUtil.encodeUrl(publisherId);
51+
final String url = "%s?publisherId=%s".formatted(endpointUrl, encodedPublisherId);
52+
return Result.withValue(BidderUtil.defaultRequest(request, url, mapper));
53+
} catch (PreBidException e) {
54+
return Result.withError(BidderError.badInput(e.getMessage()));
55+
}
56+
}
57+
58+
private ExtImpOms parseImpExt(Imp imp) throws PreBidException {
59+
try {
60+
return mapper.mapper().convertValue(imp.getExt(), EXT_TYPE_REFERENCE).getBidder();
61+
} catch (IllegalArgumentException e) {
62+
throw new PreBidException("Invalid ext. Imp.Id: " + imp.getId());
63+
}
64+
}
65+
66+
private String resolverPublisherId(String pid, Integer publisherId) {
67+
if (StringUtils.isEmpty(pid) && publisherId != null && publisherId > 0) {
68+
return String.valueOf(publisherId);
69+
}
70+
return pid;
3771
}
3872

3973
@Override
@@ -59,7 +93,33 @@ private static List<BidderBid> bidsFromResponse(BidResponse bidResponse) {
5993
.map(SeatBid::getBid)
6094
.filter(Objects::nonNull)
6195
.flatMap(Collection::stream)
62-
.map(bid -> BidderBid.of(bid, BidType.banner, bidResponse.getCur()))
96+
.map(bid -> createBidderBid(bid, bidResponse.getCur()))
6397
.toList();
6498
}
99+
100+
private static BidderBid createBidderBid(Bid bid, String currency) {
101+
final BidType bidType = getBidType(bid);
102+
return BidderBid.builder()
103+
.bid(bid)
104+
.type(bidType)
105+
.bidCurrency(currency)
106+
.videoInfo(videoInfo(bidType, bid))
107+
.build();
108+
}
109+
110+
private static BidType getBidType(Bid bid) {
111+
return Objects.equals(bid.getMtype(), 2) ? BidType.video : BidType.banner;
112+
}
113+
114+
private static ExtBidPrebidVideo videoInfo(BidType bidType, Bid bid) {
115+
if (bidType != BidType.video) {
116+
return null;
117+
}
118+
final List<String> cat = bid.getCat();
119+
final Integer duration = bid.getDur();
120+
121+
return ExtBidPrebidVideo.of(
122+
ObjectUtils.defaultIfNull(duration, 0),
123+
CollectionUtils.isNotEmpty(cat) ? cat.getFirst() : StringUtils.EMPTY);
124+
}
65125
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.prebid.server.proto.openrtb.ext.request.omx;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Value;
5+
6+
@Value(staticConstructor = "of")
7+
public class ExtImpOms {
8+
9+
String pid;
10+
11+
@JsonProperty("publisherId")
12+
Integer publisherId;
13+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ adapters:
55
maintainer-email: prebid@onlinemediasolutions.com
66
app-media-types:
77
- banner
8+
- video
89
site-media-types:
910
- banner
11+
- video
1012
supported-vendors:
1113
vendor-id: 0

src/main/resources/static/bidder-params/oms.json

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,25 @@
66
"properties": {
77
"pid": {
88
"type": "string",
9-
"description": "An id used to identify OMS publisher.",
9+
"description": "Deprecated: An id used to identify OMS publisher.",
1010
"minLength": 5
11+
},
12+
"publisherId": {
13+
"type": "integer",
14+
"description": "An ID used to identify OMS publisher.",
15+
"minimum": 10000
1116
}
1217
},
13-
"required": [
14-
"pid"
18+
"oneOf": [
19+
{
20+
"required": [
21+
"pid"
22+
]
23+
},
24+
{
25+
"required": [
26+
"publisherId"
27+
]
28+
}
1529
]
1630
}

0 commit comments

Comments
 (0)