mhdzumair commited on
Commit
fb6e6a7
·
1 Parent(s): d2469ad

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
- str(request.url_for("playlist_endpoint")),
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
- str(request.url_for("segment_endpoint")),
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
- str(self.request.url_for("hls_stream_proxy")),
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),