diff --git a/lib/streaming_providers/providers/joyn/auth.py b/lib/streaming_providers/providers/joyn/auth.py
index 65636b8..012e5e2 100644
--- a/lib/streaming_providers/providers/joyn/auth.py
+++ b/lib/streaming_providers/providers/joyn/auth.py
@@ -400,6 +400,24 @@ class JoynAuthenticator(BaseOAuth2Authenticator):
}
clean_headers.setdefault("User-Agent", JOYN_USER_AGENT)
clean_headers.setdefault("Accept", "*/*")
+ # Browser-realistic headers to prevent Cloudflare managed challenges.
+ # CF uses sec-fetch-* and ch-ua hints to distinguish real browsers from bots.
+ clean_headers.setdefault("Accept-Language", "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7")
+ clean_headers.setdefault("Accept-Encoding", "gzip, deflate, br")
+ clean_headers.setdefault("Cache-Control", "no-cache")
+ clean_headers.setdefault("Pragma", "no-cache")
+ clean_headers.setdefault("sec-ch-ua", '"Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"')
+ clean_headers.setdefault("sec-ch-ua-mobile", "?0")
+ clean_headers.setdefault("sec-ch-ua-platform", '"Windows"')
+ if method.upper() == "POST":
+ clean_headers.setdefault("Sec-Fetch-Site", "same-site")
+ clean_headers.setdefault("Sec-Fetch-Mode", "cors")
+ clean_headers.setdefault("Sec-Fetch-Dest", "empty")
+ else:
+ clean_headers.setdefault("Sec-Fetch-Site", "none")
+ clean_headers.setdefault("Sec-Fetch-Mode", "navigate")
+ clean_headers.setdefault("Sec-Fetch-Dest", "document")
+ clean_headers.setdefault("Sec-Fetch-User", "?1")
content_type = kwargs.pop("content_type", None)
if content_type:
diff --git a/resources/settings.xml b/resources/settings.xml
index ee2b35c..ee4b386 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -1,167 +1,236 @@
+
+
+
-
-
- 1
- URL to download XMLTV EPG data. Can be .xml or .xml.gz format. Leave empty to use default.
+
+ 0
+ Port number for the Ultimate Backend service
+
+
+
+ 0
+ URL to download XMLTV EPG data. Can be .xml or .xml.gz format.
+
+
+
+ 0
+ Default country code for providers that support multiple countries
+
+
+
+ 1
+ Default enabled state for providers not explicitly configured. Disabled is recommended to avoid unexpected channels.
-
2
Force clear EPG cache and re-download on next request
- RunScript(special://home/addons/YOUR_ADDON_ID/clear_epg_cache.py)
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
- 0
-
- false
-
-
-
-
- 0
-
- false
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
-
+
+
-
-
-
-
-
+
+
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Master enable/disable for ALL M3U playlist groups. Individual groups cannot be controlled separately.
+
+
+
+
+
+
+
+
+
+
+ Enable/disable custom script-based provider
+
+
\ No newline at end of file