fixed epg and stream

This commit is contained in:
Radek Davidek 2026-03-04 14:22:19 +01:00
parent 2b3f3810d4
commit 0253459417
2 changed files with 47 additions and 6 deletions

View File

@ -23,6 +23,9 @@ import java.util.Set;
final class XtreamLibraryService {
private static final Logger LOGGER = LogManager.getLogger(XtreamLibraryService.class);
private static final Set<String> SENSITIVE_KEYS = Set.of("password", "pass", "pwd", "token", "authorization");
private static final String DEFAULT_BROWSER_UA =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
+ "(KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36";
static final List<String> LOAD_STEPS = List.of(
"live_categories",
"live_streams",
@ -417,7 +420,7 @@ final class XtreamLibraryService {
HttpRequest request = HttpRequest.newBuilder(candidate)
.GET()
.timeout(Duration.ofSeconds(30))
.header("User-Agent", "XtreamPlayer/1.0")
.header("User-Agent", DEFAULT_BROWSER_UA)
.header("Accept", "application/json,text/plain,*/*")
.build();
HttpResponse<byte[]> response = httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray());

View File

@ -38,6 +38,9 @@ public final class XtreamPlayerApplication {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final Logger LOGGER = LogManager.getLogger(XtreamPlayerApplication.class);
private static final Pattern URI_ATTR_PATTERN = Pattern.compile("URI=\"([^\"]+)\"");
private static final String DEFAULT_BROWSER_UA =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
+ "(KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36";
private static final HttpClient HTTP_CLIENT = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(20))
.followRedirects(HttpClient.Redirect.NORMAL)
@ -237,12 +240,22 @@ public final class XtreamPlayerApplication {
}
try {
HttpRequest request = HttpRequest.newBuilder(target)
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(target)
.GET()
.timeout(Duration.ofSeconds(60))
.header("User-Agent", "XtreamPlayer/1.0")
.header("Accept", "*/*")
.build();
.header("User-Agent", firstNonBlank(
exchange.getRequestHeaders().getFirst("User-Agent"),
DEFAULT_BROWSER_UA
))
.header("Accept", firstNonBlank(
exchange.getRequestHeaders().getFirst("Accept"),
"*/*"
));
copyRequestHeaderIfPresent(exchange, requestBuilder, "Range");
copyRequestHeaderIfPresent(exchange, requestBuilder, "If-Range");
copyRequestHeaderIfPresent(exchange, requestBuilder, "Referer");
copyRequestHeaderIfPresent(exchange, requestBuilder, "Origin");
HttpRequest request = requestBuilder.build();
HttpResponse<byte[]> response = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray());
String contentType = response.headers().firstValue("Content-Type").orElse("application/octet-stream");
byte[] body = response.body() == null ? new byte[0] : response.body();
@ -255,6 +268,10 @@ public final class XtreamPlayerApplication {
return;
}
copyResponseHeaderIfPresent(response, exchange, "Accept-Ranges");
copyResponseHeaderIfPresent(response, exchange, "Content-Range");
copyResponseHeaderIfPresent(response, exchange, "Cache-Control");
copyResponseHeaderIfPresent(response, exchange, "Expires");
exchange.getResponseHeaders().set("Content-Type", contentType);
writeBytes(exchange, response.statusCode(), body, contentType);
} catch (InterruptedException interruptedException) {
@ -618,7 +635,7 @@ public final class XtreamPlayerApplication {
HttpRequest request = HttpRequest.newBuilder(uri)
.GET()
.timeout(Duration.ofSeconds(25))
.header("User-Agent", "XtreamPlayer/1.0")
.header("User-Agent", DEFAULT_BROWSER_UA)
.header("Accept", "application/json,text/plain,*/*")
.build();
return HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray());
@ -749,6 +766,27 @@ public final class XtreamPlayerApplication {
return "/api/stream-proxy?url=" + urlEncode(absoluteUrl);
}
private static void copyRequestHeaderIfPresent(HttpExchange exchange, HttpRequest.Builder requestBuilder, String headerName) {
String value = exchange.getRequestHeaders().getFirst(headerName);
if (value != null && !value.isBlank()) {
requestBuilder.header(headerName, value);
}
}
private static void copyResponseHeaderIfPresent(HttpResponse<?> response, HttpExchange exchange, String headerName) {
String value = response.headers().firstValue(headerName).orElse("");
if (!value.isBlank()) {
exchange.getResponseHeaders().set(headerName, value);
}
}
private static String firstNonBlank(String primary, String fallback) {
if (primary != null && !primary.isBlank()) {
return primary;
}
return fallback;
}
private static Map<String, String> parseKeyValue(String raw) {
Map<String, String> result = new LinkedHashMap<>();
if (raw == null || raw.isBlank()) {