Skip to content

Commit 3a237c7

Browse files
committed
zdf: fix null pointer #1117
arte: add retry 429 #1121
2 parents 67f18b9 + 6854b42 commit 3a237c7

File tree

5 files changed

+58
-14
lines changed

5 files changed

+58
-14
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ sourceCompatibility = JavaVersion.VERSION_17
2727
targetCompatibility = JavaVersion.VERSION_17
2828
group = 'de.mediathekview'
2929
archivesBaseName = "MServer"
30-
version = '3.1.277'
30+
version = '3.1.278'
3131

3232
def jarName = 'MServer.jar'
3333
def mainClass = 'mServer.Main'

src/main/java/mServer/crawler/sender/arte/ArteConstants.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package mServer.crawler.sender.arte;
22

33
public class ArteConstants {
4-
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";
5-
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";
4+
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";
65
public static final String VIDEO_URL ="https://www.arte.tv/hbbtvv2/services/web/index.php/OPA/v3/streams/%s/%s/%s"; //PROGRAMID/KIND/LANG
76
public static final String API_TOKEN = "Bearer Nzc1Yjc1ZjJkYjk1NWFhN2I2MWEwMmRlMzAzNjI5NmU3NWU3ODg4ODJjOWMxNTMxYzEzZGRjYjg2ZGE4MmIwOA";
87
public static final int MAX_POSSIBLE_SUBPAGES = 100;

src/main/java/mServer/crawler/sender/arte/ArteCrawler.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,16 @@ private ConcurrentLinkedQueue<TopicUrlDTO> createVideosQueue(String language) {
7474
final ConcurrentLinkedQueue<TopicUrlDTO> root = new ConcurrentLinkedQueue<>();
7575
String rootUrl = String.format(ArteConstants.VIDEOS_URL, 1, language);
7676
root.add(new TopicUrlDTO("all videos sorted up", rootUrl));
77-
String rootUrl2 = String.format(ArteConstants.VIDEOS_URL_ALT, 1, language);
78-
root.add(new TopicUrlDTO("all videos sorted down", rootUrl2));
7977
return root;
8078
}
8179

8280
private int getMaxPagesForOverview(String lang) {
8381
final int maxAvailablePages = getNumberOfAvailablePages(lang);
8482
final int configuredMaxPages = getMaximumSubpages();
8583
if (configuredMaxPages > maxAvailablePages) {
86-
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, maxAvailablePages / 2);
84+
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, maxAvailablePages);
8785
} else {
88-
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, configuredMaxPages / 2);
86+
return Math.min(ArteConstants.MAX_POSSIBLE_SUBPAGES, configuredMaxPages);
8987
}
9088
}
9189

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,78 @@
11
package mServer.crawler.sender.arte.tasks;
22

33
import com.google.common.util.concurrent.RateLimiter;
4+
import com.google.gson.Gson;
5+
import de.mediathekview.mlib.Config;
6+
import de.mediathekview.mlib.tool.Log;
7+
import jakarta.ws.rs.client.Invocation.Builder;
48
import jakarta.ws.rs.client.WebTarget;
9+
import jakarta.ws.rs.core.Response;
10+
import mServer.crawler.FilmeSuchen;
11+
import mServer.crawler.RunSender;
512
import mServer.crawler.sender.MediathekReader;
613
import mServer.crawler.sender.base.AbstractJsonRestTask;
714
import mServer.crawler.sender.base.CrawlerUrlDTO;
815
import mServer.tool.MserverDaten;
916

1017
import java.util.Optional;
1118
import java.util.concurrent.ConcurrentLinkedQueue;
19+
import java.util.concurrent.TimeUnit;
1220

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

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

2230
@Override
2331
protected void processRestTarget(final D aDTO, final WebTarget aTarget) {
24-
if (aTarget.getUri().toString().contains("api.arte.tv/api/opa/")) {
25-
opaApirateLimiter.acquire();
26-
} else {
27-
rateLimiter.acquire();
32+
int retryCount = 0;
33+
int maxRetries = 3;
34+
boolean stop = false;
35+
36+
while (!stop && !Config.getStop()) {
37+
// Apply rate limiting before each request (including retries)
38+
if (aTarget.getUri().toString().contains("api.arte.tv/api/opa/")) {
39+
opaApirateLimiter.acquire();
40+
} else {
41+
rateLimiter.acquire();
42+
}
43+
44+
Builder request = aTarget.request();
45+
final Optional<String> authKey = getAuthKey();
46+
if (authKey.isPresent()) {
47+
request = request.header(HEADER_AUTHORIZATION, authKey.get());
48+
}
49+
50+
try (Response response = createResponse(request, aDTO)) {
51+
traceRequest(response.getLength());
52+
53+
if (response.getStatus() == 200) {
54+
gsonBuilder.registerTypeAdapter(getType(), getParser(aDTO));
55+
final Gson gson = gsonBuilder.create();
56+
final String jsonOutput = response.readEntity(String.class);
57+
final R responseObj = gson.fromJson(jsonOutput, getType());
58+
postProcessing(responseObj, aDTO);
59+
stop = true;
60+
// Check if we got a 429 and have retries left
61+
} else if (response.getStatus() == 429 && retryCount < maxRetries) {
62+
String retryAfter = response.getHeaderString("Retry-After");
63+
Log.sysLog("429: " + aDTO.getUrl() + " - retry after: " + retryAfter);
64+
retryCount++;
65+
try {
66+
TimeUnit.MILLISECONDS.sleep(60000);
67+
} catch (InterruptedException ignored) {
68+
}
69+
} else {
70+
FilmeSuchen.listeSenderLaufen.inc(crawler.getRunIdentifier(), RunSender.Count.FEHLER);
71+
FilmeSuchen.listeSenderLaufen.inc(crawler.getRunIdentifier(), RunSender.Count.FEHLVERSUCHE);
72+
handleHttpError(aDTO, aTarget.getUri(), response);
73+
stop = true;
74+
}
75+
}
2876
}
29-
super.processRestTarget(aDTO, aTarget);
3077
}
3178
}

src/main/java/mServer/crawler/sender/zdf/tasks/ZdfFilmTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ private static DatenFilm createFilm(final ZdfFilmDto zdfFilmDto, final DownloadD
6464

6565
@Override
6666
protected void processRestTarget(ZdfFilmDto aDTO, WebTarget aTarget) {
67-
final Optional<DownloadDto> downloadDto = deserialize(aTarget, OPTIONAL_DOWNLOAD_DTO_TYPE_TOKEN);
67+
final Optional<DownloadDto> downloadDto = deserializeOptional(aTarget, OPTIONAL_DOWNLOAD_DTO_TYPE_TOKEN);
6868
if (downloadDto.isPresent()) {
6969
addFilm(aDTO, downloadDto.get());
7070
} else {

0 commit comments

Comments
 (0)