Spaces:
Paused
Paused
Add support for set mediaflow proxy server scheme based on request headers
Browse files
mediaflow_proxy/mpd_processor.py
CHANGED
|
@@ -7,7 +7,7 @@ from fastapi import Request, Response, HTTPException
|
|
| 7 |
|
| 8 |
from mediaflow_proxy.configs import settings
|
| 9 |
from mediaflow_proxy.drm.decrypter import decrypt_segment
|
| 10 |
-
from mediaflow_proxy.utils.http_utils import encode_mediaflow_proxy_url
|
| 11 |
|
| 12 |
logger = logging.getLogger(__name__)
|
| 13 |
|
|
@@ -103,10 +103,14 @@ def build_hls(mpd_dict: dict, request: Request, key_id: str = None, key: str = N
|
|
| 103 |
video_profiles = {}
|
| 104 |
audio_profiles = {}
|
| 105 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
for profile in mpd_dict["profiles"]:
|
| 107 |
query_params.update({"profile_id": profile["id"], "key_id": key_id or "", "key": key or ""})
|
| 108 |
playlist_url = encode_mediaflow_proxy_url(
|
| 109 |
-
|
| 110 |
query_params=query_params,
|
| 111 |
)
|
| 112 |
|
|
@@ -150,6 +154,10 @@ def build_hls_playlist(mpd_dict: dict, profiles: list[dict], request: Request) -
|
|
| 150 |
current_time = datetime.now(timezone.utc)
|
| 151 |
live_stream_delay = timedelta(seconds=settings.mpd_live_stream_delay)
|
| 152 |
target_end_time = current_time - live_stream_delay
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
for index, profile in enumerate(profiles):
|
| 154 |
segments = profile["segments"]
|
| 155 |
if not segments:
|
|
@@ -189,7 +197,7 @@ def build_hls_playlist(mpd_dict: dict, profiles: list[dict], request: Request) -
|
|
| 189 |
)
|
| 190 |
hls.append(
|
| 191 |
encode_mediaflow_proxy_url(
|
| 192 |
-
|
| 193 |
query_params=query_params,
|
| 194 |
)
|
| 195 |
)
|
|
|
|
| 7 |
|
| 8 |
from mediaflow_proxy.configs import settings
|
| 9 |
from mediaflow_proxy.drm.decrypter import decrypt_segment
|
| 10 |
+
from mediaflow_proxy.utils.http_utils import encode_mediaflow_proxy_url, get_original_scheme
|
| 11 |
|
| 12 |
logger = logging.getLogger(__name__)
|
| 13 |
|
|
|
|
| 103 |
video_profiles = {}
|
| 104 |
audio_profiles = {}
|
| 105 |
|
| 106 |
+
# Get the base URL for the playlist_endpoint endpoint
|
| 107 |
+
proxy_url = request.url_for("playlist_endpoint")
|
| 108 |
+
proxy_url = str(proxy_url.replace(scheme=get_original_scheme(request)))
|
| 109 |
+
|
| 110 |
for profile in mpd_dict["profiles"]:
|
| 111 |
query_params.update({"profile_id": profile["id"], "key_id": key_id or "", "key": key or ""})
|
| 112 |
playlist_url = encode_mediaflow_proxy_url(
|
| 113 |
+
proxy_url,
|
| 114 |
query_params=query_params,
|
| 115 |
)
|
| 116 |
|
|
|
|
| 154 |
current_time = datetime.now(timezone.utc)
|
| 155 |
live_stream_delay = timedelta(seconds=settings.mpd_live_stream_delay)
|
| 156 |
target_end_time = current_time - live_stream_delay
|
| 157 |
+
|
| 158 |
+
proxy_url = request.url_for("segment_endpoint")
|
| 159 |
+
proxy_url = str(proxy_url.replace(scheme=get_original_scheme(request)))
|
| 160 |
+
|
| 161 |
for index, profile in enumerate(profiles):
|
| 162 |
segments = profile["segments"]
|
| 163 |
if not segments:
|
|
|
|
| 197 |
)
|
| 198 |
hls.append(
|
| 199 |
encode_mediaflow_proxy_url(
|
| 200 |
+
proxy_url,
|
| 201 |
query_params=query_params,
|
| 202 |
)
|
| 203 |
)
|
mediaflow_proxy/utils/http_utils.py
CHANGED
|
@@ -218,3 +218,34 @@ def encode_mediaflow_proxy_url(
|
|
| 218 |
|
| 219 |
base_url = parse.urljoin(mediaflow_proxy_url, endpoint)
|
| 220 |
return f"{base_url}?{encoded_params}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
|
| 219 |
base_url = parse.urljoin(mediaflow_proxy_url, endpoint)
|
| 220 |
return f"{base_url}?{encoded_params}"
|
| 221 |
+
|
| 222 |
+
|
| 223 |
+
def get_original_scheme(request) -> str:
|
| 224 |
+
"""
|
| 225 |
+
Determines the original scheme (http or https) of the request.
|
| 226 |
+
|
| 227 |
+
Args:
|
| 228 |
+
request (Request): The incoming HTTP request.
|
| 229 |
+
|
| 230 |
+
Returns:
|
| 231 |
+
str: The original scheme ('http' or 'https')
|
| 232 |
+
"""
|
| 233 |
+
# Check the X-Forwarded-Proto header first
|
| 234 |
+
forwarded_proto = request.headers.get("X-Forwarded-Proto")
|
| 235 |
+
if forwarded_proto:
|
| 236 |
+
return forwarded_proto
|
| 237 |
+
|
| 238 |
+
# Check if the request is secure
|
| 239 |
+
if request.url.scheme == "https" or request.headers.get("X-Forwarded-Ssl") == "on":
|
| 240 |
+
return "https"
|
| 241 |
+
|
| 242 |
+
# Check for other common headers that might indicate HTTPS
|
| 243 |
+
if (
|
| 244 |
+
request.headers.get("X-Forwarded-Ssl") == "on"
|
| 245 |
+
or request.headers.get("X-Forwarded-Protocol") == "https"
|
| 246 |
+
or request.headers.get("X-Url-Scheme") == "https"
|
| 247 |
+
):
|
| 248 |
+
return "https"
|
| 249 |
+
|
| 250 |
+
# Default to http if no indicators of https are found
|
| 251 |
+
return "http"
|
mediaflow_proxy/utils/m3u8_processor.py
CHANGED
|
@@ -3,7 +3,7 @@ from urllib import parse
|
|
| 3 |
|
| 4 |
from pydantic import HttpUrl
|
| 5 |
|
| 6 |
-
from mediaflow_proxy.utils.http_utils import encode_mediaflow_proxy_url
|
| 7 |
|
| 8 |
|
| 9 |
class M3U8Processor:
|
|
@@ -17,6 +17,7 @@ class M3U8Processor:
|
|
| 17 |
"""
|
| 18 |
self.request = request
|
| 19 |
self.key_url = key_url
|
|
|
|
| 20 |
|
| 21 |
async def process_m3u8(self, content: str, base_url: str) -> str:
|
| 22 |
"""
|
|
@@ -75,7 +76,7 @@ class M3U8Processor:
|
|
| 75 |
full_url = parse.urljoin(base_url, url)
|
| 76 |
|
| 77 |
return encode_mediaflow_proxy_url(
|
| 78 |
-
|
| 79 |
"",
|
| 80 |
full_url,
|
| 81 |
query_params=dict(self.request.query_params),
|
|
|
|
| 3 |
|
| 4 |
from pydantic import HttpUrl
|
| 5 |
|
| 6 |
+
from mediaflow_proxy.utils.http_utils import encode_mediaflow_proxy_url, get_original_scheme
|
| 7 |
|
| 8 |
|
| 9 |
class M3U8Processor:
|
|
|
|
| 17 |
"""
|
| 18 |
self.request = request
|
| 19 |
self.key_url = key_url
|
| 20 |
+
self.mediaflow_proxy_url = str(request.url_for("hls_stream_proxy").replace(scheme=get_original_scheme(request)))
|
| 21 |
|
| 22 |
async def process_m3u8(self, content: str, base_url: str) -> str:
|
| 23 |
"""
|
|
|
|
| 76 |
full_url = parse.urljoin(base_url, url)
|
| 77 |
|
| 78 |
return encode_mediaflow_proxy_url(
|
| 79 |
+
self.mediaflow_proxy_url,
|
| 80 |
"",
|
| 81 |
full_url,
|
| 82 |
query_params=dict(self.request.query_params),
|