This commit is contained in:
Radek Davidek 2026-03-04 14:32:42 +01:00
parent 4ea3d96496
commit de7d38c596

View File

@ -248,37 +248,47 @@ public final class XtreamPlayerApplication {
List<URI> attempts = candidateUris(target); List<URI> attempts = candidateUris(target);
HttpResponse<byte[]> response = null; HttpResponse<byte[]> response = null;
URI usedTarget = target; URI usedTarget = target;
List<String> attemptErrors = new ArrayList<>();
for (URI candidate : attempts) { for (URI candidate : attempts) {
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(candidate) try {
.GET() HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(candidate)
.timeout(Duration.ofSeconds(60)) .GET()
.header("User-Agent", firstNonBlank( .timeout(Duration.ofSeconds(60))
exchange.getRequestHeaders().getFirst("User-Agent"), .header("User-Agent", firstNonBlank(
DEFAULT_BROWSER_UA exchange.getRequestHeaders().getFirst("User-Agent"),
)) DEFAULT_BROWSER_UA
.header("Accept", firstNonBlank( ))
exchange.getRequestHeaders().getFirst("Accept"), .header("Accept", firstNonBlank(
"*/*" exchange.getRequestHeaders().getFirst("Accept"),
)); "*/*"
copyRequestHeaderIfPresent(exchange, requestBuilder, "Range"); ));
copyRequestHeaderIfPresent(exchange, requestBuilder, "If-Range"); copyRequestHeaderIfPresent(exchange, requestBuilder, "Range");
if (!sourceUrl.isBlank()) { copyRequestHeaderIfPresent(exchange, requestBuilder, "If-Range");
requestBuilder.header("Referer", sourceUrl); if (!sourceUrl.isBlank()) {
String origin = originFromUrl(sourceUrl); requestBuilder.header("Referer", sourceUrl);
if (!origin.isBlank()) { String origin = originFromUrl(sourceUrl);
requestBuilder.header("Origin", origin); if (!origin.isBlank()) {
requestBuilder.header("Origin", origin);
}
} }
} HttpRequest request = requestBuilder.build();
HttpRequest request = requestBuilder.build(); HttpResponse<byte[]> candidateResponse = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray());
HttpResponse<byte[]> candidateResponse = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray()); if (response == null || response.statusCode() >= 400) {
response = candidateResponse; response = candidateResponse;
usedTarget = candidate; usedTarget = candidate;
if (candidateResponse.statusCode() < 400) { }
break; if (candidateResponse.statusCode() < 400) {
response = candidateResponse;
usedTarget = candidate;
break;
}
} catch (Exception candidateException) {
attemptErrors.add(maskUri(candidate) + " -> " + compactError(candidateException));
LOGGER.warn("Stream proxy candidate failed uri={}", maskUri(candidate), candidateException);
} }
} }
if (response == null) { if (response == null) {
writeJson(exchange, 502, errorJson("Unable to proxy stream: empty upstream response.")); writeJson(exchange, 502, errorJson("Unable to proxy stream. Attempts: " + String.join(" | ", attemptErrors)));
return; return;
} }
String contentType = response.headers().firstValue("Content-Type").orElse("application/octet-stream"); String contentType = response.headers().firstValue("Content-Type").orElse("application/octet-stream");