WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM openjdk:11-jre-slim
FROM openjdk:17.0.2-oracle

WORKDIR /app/prebid-server

Expand All @@ -7,6 +7,7 @@ VOLUME /app/prebid-server/data

COPY src/main/docker/run.sh ./
COPY src/main/docker/application.yaml ./
COPY src/main/docker/app-settings.yaml ./
COPY target/prebid-server.jar ./

EXPOSE 8080
Expand Down
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,3 +117,26 @@ and verify response status is `200 OK`.
- [Code Style](docs/developers/code-style.md)
- [Code Review](docs/developers/code-reviews.md)
- [Versioning](docs/developers/versioning.md)


## Docker build

- To build run
```bash
docker build -t infytv/infy:hb-latest .
```

- To push on docker hub run
```bash
docker push infytv/infy:hb-latest
```
- To pull from docker hub run
```bash
docker pull infytv/infy:hb-latest
```

- To run
```bash
docker run -d -p 8080:8080 \
infytv/infy:hb-latest
```
13 changes: 10 additions & 3 deletions sample/prebid-config.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
status-response: "ok"
adapters:
rubicon:
infytv:
enabled: true
XAPI.Username: user1
XAPI.Password: password1
modifying-vast-xml-allowed: true
metrics:
prefix: prebid
console:
enabled: false
interval: 300
cache:
scheme: http
host: localhost
Expand All @@ -23,3 +25,8 @@ gdpr:
vendorlist:
v2:
cache-dir: /var/tmp/vendor2
analytics:
log:
enabled: true
auction:
default-timeout-ms: 1600
2 changes: 2 additions & 0 deletions src/main/docker/app-settings.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
accounts:
- id: 1001
28 changes: 28 additions & 0 deletions src/main/docker/application.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,32 @@
status-response: "ok"
adapters:
infytv:
enabled: true
modifying-vast-xml-allowed: true
metrics:
prefix: prebid
console:
enabled: false
interval: 300
cache:
scheme: http
host: localhost
path: /cache
query: uuid=
settings:
filesystem:
settings-filename: app-settings.yaml
stored-requests-dir:
stored-imps-dir:
stored-responses-dir:
categories-dir:
gdpr:
default-value: 1
vendorlist:
v2:
cache-dir: /app/prebid-server/data/vendorlist-v2
analytics:
log:
enabled: true
auction:
default-timeout-ms: 1600
118 changes: 118 additions & 0 deletions src/main/java/org/prebid/server/bidder/infytv/InfytvBidder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package org.prebid.server.bidder.infytv;

import com.fasterxml.jackson.core.type.TypeReference;
import com.iab.openrtb.request.BidRequest;
import com.iab.openrtb.request.Imp;
import com.iab.openrtb.response.BidResponse;
import com.iab.openrtb.response.SeatBid;
import io.vertx.core.http.HttpMethod;
import org.apache.commons.collections4.CollectionUtils;
import org.prebid.server.bidder.Bidder;
import org.prebid.server.bidder.model.BidderBid;
import org.prebid.server.bidder.model.BidderError;
import org.prebid.server.bidder.model.HttpCall;
import org.prebid.server.bidder.model.HttpRequest;
import org.prebid.server.bidder.model.Result;
import org.prebid.server.exception.PreBidException;
import org.prebid.server.json.DecodeException;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
import org.prebid.server.proto.openrtb.ext.request.infytv.ExtImpInfytv;
import org.prebid.server.proto.openrtb.ext.response.BidType;
import org.prebid.server.util.HttpUtil;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class InfytvBidder implements Bidder<BidRequest> {

final String endpointUrl;
private final JacksonMapper mapper;

private static final TypeReference<ExtPrebid<?, ExtImpInfytv>> INFYTV_EXT_TYPE_REFERENCE =
new TypeReference<>() {
};

public InfytvBidder(String endpointUrl, JacksonMapper mapper) {
this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl));
this.mapper = Objects.requireNonNull(mapper);
}

@Override
public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request) {
final List<HttpRequest<BidRequest>> httpRequests = new ArrayList<>();
for (Imp imp : request.getImp()) {
ExtImpInfytv infyVars = resolveImpExt(imp);
final BidRequest outgoingRequest = request.toBuilder().imp(Collections.singletonList(imp)).build();
final String dspUrl = infyVars.getBase() + infyVars.getPath();
httpRequests.add(HttpRequest.<BidRequest>builder()
.method(HttpMethod.POST)
.uri(dspUrl)
.headers(HttpUtil.headers())
.payload(outgoingRequest)
.body(mapper.encodeToBytes(outgoingRequest))
.build());
}

return Result.withValues(httpRequests);
}

@Override
public final Result<List<BidderBid>> makeBids(HttpCall<BidRequest> httpCall, BidRequest bidRequest) {
try {
final BidResponse bidResponse = mapper.decodeValue(httpCall.getResponse().getBody(), BidResponse.class);
return Result.withValues(extractBids(httpCall.getRequest().getPayload(), bidResponse));
} catch (DecodeException | PreBidException e) {
return Result.withError(BidderError.badServerResponse(e.getMessage()));
}
}

private static List<BidderBid> extractBids(BidRequest bidRequest, BidResponse bidResponse) {
if (bidResponse == null || CollectionUtils.isEmpty(bidResponse.getSeatbid())) {
return Collections.emptyList();
}
return bidsFromResponse(bidRequest, bidResponse);
}

private static List<BidderBid> bidsFromResponse(BidRequest bidRequest, BidResponse bidResponse) {
return bidResponse.getSeatbid().stream()
.filter(Objects::nonNull)
.map(SeatBid::getBid)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.map(bid -> BidderBid.of(bid, getBidType(bid.getImpid(), bidRequest.getImp()), bidResponse.getCur()))
.collect(Collectors.toList());
}

private static BidType getBidType(String impId, List<Imp> imps) {
BidType bidType = BidType.banner;
for (Imp imp : imps) {
if (imp.getId().equals(impId)) {
if (imp.getBanner() != null) {
return bidType;
} else if (imp.getVideo() != null) {
bidType = BidType.video;
} else if (imp.getXNative() != null) {
bidType = BidType.xNative;
} else if (imp.getAudio() != null) {
bidType = BidType.audio;
}
}
}
return bidType;
}

private ExtImpInfytv resolveImpExt(Imp imp) {
try {
return mapper.mapper()
.convertValue(imp.getExt(), INFYTV_EXT_TYPE_REFERENCE)
.getBidder();
} catch (IllegalArgumentException e) {
throw new PreBidException(e.getMessage(), e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.prebid.server.proto.openrtb.ext.request.infytv;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Value;

/**
* Defines the contract for bidrequest.imp[i].ext.{bidder}
*/
@AllArgsConstructor(staticName = "of")
@Value
public class ExtImpInfytv {

@JsonProperty("dsp_id")
Integer dspId;

@JsonProperty("customer_id")
Integer customerId;

@JsonProperty("tag_id")
Integer tagId;

@JsonProperty("base")
String base;

@JsonProperty("path")
String path;

@JsonProperty("dsp_type")
String dspType;

@JsonProperty("min_cpm")
Double minCpm;

@JsonProperty("max_cpm")
Double maxCpm;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.prebid.server.spring.config.bidder;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.prebid.server.bidder.BidderDeps;
import org.prebid.server.bidder.infytv.InfytvBidder;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.spring.config.bidder.model.BidderConfigurationProperties;
import org.prebid.server.spring.config.bidder.util.BidderDepsAssembler;
import org.prebid.server.spring.config.bidder.util.UsersyncerCreator;
import org.prebid.server.spring.env.YamlPropertySourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.validation.constraints.NotBlank;
import java.util.Map;

@Configuration
@PropertySource(value = "classpath:/bidder-config/infytv.yaml", factory = YamlPropertySourceFactory.class)
public class InfytvConfiguration {

private static final String BIDDER_NAME = "infytv";

@Bean("infytvConfigurationProperties")
@ConfigurationProperties("adapters.infytv")
BidderConfigurationProperties configurationProperties() {
return new BidderConfigurationProperties();
}

@Bean
BidderDeps infytvBidderDeps(BidderConfigurationProperties infytvConfigurationProperties,
@NotBlank @Value("${external-url}") String externalUrl,
JacksonMapper mapper) {

return BidderDepsAssembler.forBidder(BIDDER_NAME)
.withConfig(infytvConfigurationProperties)
.usersyncerCreator(UsersyncerCreator.create(externalUrl))
.bidderCreator(config -> new InfytvBidder(config.getEndpoint(), mapper))
.assemble();
}

@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
private static class InfytvConfigurationProperties extends BidderConfigurationProperties {

Integer platformId;

Map<Integer, String> iabCategories;
}
}
Loading