diff --git a/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java b/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java index 2cfa127..b2073d0 100644 --- a/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java +++ b/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java @@ -859,7 +859,7 @@ public final class XtreamPlayerApplication { )); copyRequestHeaderIfPresent(exchange, requestBuilder, "Range"); copyRequestHeaderIfPresent(exchange, requestBuilder, "If-Range"); - String referer = resolveRefererForCandidate(candidate, sourceUrl); + String referer = resolveRefererForCandidate(exchange, candidate, sourceUrl); if (!referer.isBlank()) { requestBuilder.header("Referer", referer); String origin = originFromUrl(referer); @@ -871,8 +871,14 @@ public final class XtreamPlayerApplication { return HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray()); } - private static String resolveRefererForCandidate(URI candidate, String sourceUrl) { + private static String resolveRefererForCandidate(HttpExchange exchange, URI candidate, String sourceUrl) { URI candidateDir = directoryUri(candidate); + if (sourceUrl == null || sourceUrl.isBlank()) { + String appReferer = appRefererFromExchange(exchange); + if (!appReferer.isBlank()) { + return appReferer; + } + } if (candidateDir != null) { String path = candidateDir.getPath() == null ? "" : candidateDir.getPath().toLowerCase(Locale.ROOT); if (path.contains("/hls/")) { @@ -885,6 +891,18 @@ public final class XtreamPlayerApplication { return candidateDir == null ? "" : candidateDir.toString(); } + private static String appRefererFromExchange(HttpExchange exchange) { + String proto = exchange.getRequestHeaders().getFirst("X-Forwarded-Proto"); + if (proto == null || proto.isBlank()) { + proto = "http"; + } + String host = exchange.getRequestHeaders().getFirst("Host"); + if (host == null || host.isBlank()) { + return ""; + } + return proto + "://" + host + "/"; + } + private static URI directoryUri(URI uri) { if (uri == null || uri.getScheme() == null || uri.getRawAuthority() == null) { return null;