Skip to content
Merged
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: 1 addition & 2 deletions src/main/java/mServer/crawler/sender/arte/ArteConstants.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package mServer.crawler.sender.arte;

public class ArteConstants {
public static final String VIDEOS_URL ="https://api.arte.tv/api/opa/v3/videos?limit=100&page=%s&sort=-broadcastBegin&language=%s&kind=SHOW,MANUAL_CLIP,BONUS";
public static final String VIDEOS_URL_ALT ="https://api.arte.tv/api/opa/v3/videos?limit=100&page=%s&sort=broadcastBegin&language=%s&kind=SHOW,MANUAL_CLIP,BONUS";
public static final String VIDEOS_URL ="https://api.arte.tv/api/opa/v3/videos?limit=100&page=%s&sort=-videoRightsBegin&language=%s&kind=SHOW,MANUAL_CLIP,BONUS";
public static final String VIDEO_URL ="https://www.arte.tv/hbbtvv2/services/web/index.php/OPA/v3/streams/%s/%s/%s"; //PROGRAMID/KIND/LANG
public static final String API_TOKEN = "Bearer Nzc1Yjc1ZjJkYjk1NWFhN2I2MWEwMmRlMzAzNjI5NmU3NWU3ODg4ODJjOWMxNTMxYzEzZGRjYjg2ZGE4MmIwOA";
public static final int MAX_POSSIBLE_SUBPAGES = 100;
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/mServer/crawler/sender/arte/ArteCrawler.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,16 @@ private ConcurrentLinkedQueue<TopicUrlDTO> createVideosQueue(String language) {
final ConcurrentLinkedQueue<TopicUrlDTO> root = new ConcurrentLinkedQueue<>();
String rootUrl = String.format(ArteConstants.VIDEOS_URL, 1, language);
root.add(new TopicUrlDTO("all videos sorted up", rootUrl));
String rootUrl2 = String.format(ArteConstants.VIDEOS_URL_ALT, 1, language);
root.add(new TopicUrlDTO("all videos sorted down", rootUrl2));
return root;
}

private int getMaxPagesForOverview(String lang) {
final int maxAvailablePages = getNumberOfAvailablePages(lang);
final int configuredMaxPages = getMaximumSubpages();
if (configuredMaxPages > maxAvailablePages) {
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, maxAvailablePages / 2);
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, maxAvailablePages);
} else {
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, configuredMaxPages / 2);
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, configuredMaxPages);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,78 @@
package mServer.crawler.sender.arte.tasks;

import com.google.common.util.concurrent.RateLimiter;
import com.google.gson.Gson;
import de.mediathekview.mlib.Config;
import de.mediathekview.mlib.tool.Log;
import jakarta.ws.rs.client.Invocation.Builder;
import jakarta.ws.rs.client.WebTarget;
import jakarta.ws.rs.core.Response;
import mServer.crawler.FilmeSuchen;
import mServer.crawler.RunSender;
import mServer.crawler.sender.MediathekReader;
import mServer.crawler.sender.base.AbstractJsonRestTask;
import mServer.crawler.sender.base.CrawlerUrlDTO;
import mServer.tool.MserverDaten;

import java.util.Optional;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit;

public abstract class ArteRateLimitedJsonRestTask<T, R, D extends CrawlerUrlDTO> extends AbstractJsonRestTask<T, R, D> {
private static final long serialVersionUID = 1L;
private static final RateLimiter rateLimiter = RateLimiter.create(MserverDaten.getArteRateLimit());
private static final RateLimiter opaApirateLimiter = RateLimiter.create(1.0);
private static final RateLimiter opaApirateLimiter = RateLimiter.create(0.3);

protected ArteRateLimitedJsonRestTask(MediathekReader aCrawler, ConcurrentLinkedQueue<D> urlToCrawlDTOs, Optional<String> authKey) {
super(aCrawler, urlToCrawlDTOs, authKey);
}

@Override
protected void processRestTarget(final D aDTO, final WebTarget aTarget) {
if (aTarget.getUri().toString().contains("api.arte.tv/api/opa/")) {
opaApirateLimiter.acquire();
} else {
rateLimiter.acquire();
int retryCount = 0;
int maxRetries = 3;
boolean stop = false;

while (!stop && !Config.getStop()) {
// Apply rate limiting before each request (including retries)
if (aTarget.getUri().toString().contains("api.arte.tv/api/opa/")) {
opaApirateLimiter.acquire();
} else {
rateLimiter.acquire();
}

Builder request = aTarget.request();
final Optional<String> authKey = getAuthKey();
if (authKey.isPresent()) {
request = request.header(HEADER_AUTHORIZATION, authKey.get());
}

try (Response response = createResponse(request, aDTO)) {
traceRequest(response.getLength());

if (response.getStatus() == 200) {
gsonBuilder.registerTypeAdapter(getType(), getParser(aDTO));
final Gson gson = gsonBuilder.create();
final String jsonOutput = response.readEntity(String.class);
final R responseObj = gson.fromJson(jsonOutput, getType());
postProcessing(responseObj, aDTO);
stop = true;
// Check if we got a 429 and have retries left
} else if (response.getStatus() == 429 && retryCount < maxRetries) {
String retryAfter = response.getHeaderString("Retry-After");
Log.sysLog("429: " + aDTO.getUrl() + " - retry after: " + retryAfter);
retryCount++;
try {
TimeUnit.MILLISECONDS.sleep(60000);
} catch (InterruptedException ignored) {
}
} else {
FilmeSuchen.listeSenderLaufen.inc(crawler.getRunIdentifier(), RunSender.Count.FEHLER);
FilmeSuchen.listeSenderLaufen.inc(crawler.getRunIdentifier(), RunSender.Count.FEHLVERSUCHE);
handleHttpError(aDTO, aTarget.getUri(), response);
stop = true;
}
}
}
super.processRestTarget(aDTO, aTarget);
}
}