Spaces:
Running
Running
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),
|