mhdzumair commited on
Commit
b053b86
1 Parent(s): 3f55adb

Fix non-stop Media playback on invalid range headers, bump version & dependencies, update doc

Browse files
README.md CHANGED
@@ -72,6 +72,12 @@ Set the following environment variables:
72
  ```
73
  mediaflow-proxy
74
  ```
 
 
 
 
 
 
75
 
76
 
77
  #### Using git & poetry
@@ -98,7 +104,7 @@ Set the following environment variables:
98
 
99
  4. Run the FastAPI server:
100
  ```
101
- poetry run uvicorn mediaflow_proxy.main:app --host 0.0.0.0 --port 8888
102
  ```
103
 
104
 
 
72
  ```
73
  mediaflow-proxy
74
  ```
75
+ You can access the server at `http://localhost:8888`.
76
+
77
+ 4. To run the server with uvicorn options: (Optional)
78
+ ```
79
+ uvicorn mediaflow_proxy.main:app --host 0.0.0.0 --port 8888 --workers 4
80
+ ```
81
 
82
 
83
  #### Using git & poetry
 
104
 
105
  4. Run the FastAPI server:
106
  ```
107
+ poetry run uvicorn mediaflow_proxy.main:app --host 0.0.0.0 --port 8888 --workers 4
108
  ```
109
 
110
 
mediaflow_proxy/handlers.py CHANGED
@@ -97,7 +97,11 @@ async def handle_hls_stream_proxy(
97
  streamer, hls_params.destination, proxy_headers, request, hls_params.key_url
98
  )
99
 
100
- proxy_headers.request.update({"range": proxy_headers.request.get("range", "bytes=0-")})
 
 
 
 
101
  response_headers = prepare_response_headers(response.headers, proxy_headers.response)
102
 
103
  return EnhancedStreamingResponse(
 
97
  streamer, hls_params.destination, proxy_headers, request, hls_params.key_url
98
  )
99
 
100
+ content_range = proxy_headers.request.get("range", "bytes=0-")
101
+ if "NaN" in content_range:
102
+ # Handle invalid range requests "bytes=NaN-NaN"
103
+ raise HTTPException(status_code=416, detail="Invalid Range Header")
104
+ proxy_headers.request.update({"range": content_range})
105
  response_headers = prepare_response_headers(response.headers, proxy_headers.response)
106
 
107
  return EnhancedStreamingResponse(
mediaflow_proxy/main.py CHANGED
@@ -82,7 +82,7 @@ app.mount("/", StaticFiles(directory=str(static_path), html=True), name="static"
82
  def run():
83
  import uvicorn
84
 
85
- uvicorn.run(app, host="127.0.0.1", port=8888)
86
 
87
 
88
  if __name__ == "__main__":
 
82
  def run():
83
  import uvicorn
84
 
85
+ uvicorn.run(app, host="0.0.0.0", port=8888, log_level="info", workers=3)
86
 
87
 
88
  if __name__ == "__main__":
mediaflow_proxy/routes.py CHANGED
@@ -1,6 +1,6 @@
1
  from typing import Annotated
2
 
3
- from fastapi import Request, Depends, APIRouter, Query
4
 
5
  from .handlers import handle_hls_stream_proxy, proxy_stream, get_manifest, get_playlist, get_segment, get_public_ip
6
  from .schemas import MPDSegmentParams, MPDPlaylistParams, HLSManifestParams, ProxyStreamParams, MPDManifestParams
@@ -48,7 +48,11 @@ async def proxy_stream_endpoint(
48
  Returns:
49
  Response: The HTTP response with the streamed content.
50
  """
51
- proxy_headers.request.update({"range": proxy_headers.request.get("range", "bytes=0-")})
 
 
 
 
52
  return await proxy_stream(request.method, stream_params, proxy_headers)
53
 
54
 
 
1
  from typing import Annotated
2
 
3
+ from fastapi import Request, Depends, APIRouter, Query, HTTPException
4
 
5
  from .handlers import handle_hls_stream_proxy, proxy_stream, get_manifest, get_playlist, get_segment, get_public_ip
6
  from .schemas import MPDSegmentParams, MPDPlaylistParams, HLSManifestParams, ProxyStreamParams, MPDManifestParams
 
48
  Returns:
49
  Response: The HTTP response with the streamed content.
50
  """
51
+ content_range = proxy_headers.request.get("range", "bytes=0-")
52
+ if "nan" in content_range.casefold():
53
+ # Handle invalid range requests "bytes=NaN-NaN"
54
+ raise HTTPException(status_code=416, detail="Invalid Range Header")
55
+ proxy_headers.request.update({"range": content_range})
56
  return await proxy_stream(request.method, stream_params, proxy_headers)
57
 
58
 
poetry.lock CHANGED
@@ -194,13 +194,13 @@ files = [
194
 
195
  [[package]]
196
  name = "httpcore"
197
- version = "1.0.5"
198
  description = "A minimal low-level HTTP client."
199
  optional = false
200
  python-versions = ">=3.8"
201
  files = [
202
- {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"},
203
- {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"},
204
  ]
205
 
206
  [package.dependencies]
@@ -211,7 +211,7 @@ h11 = ">=0.13,<0.15"
211
  asyncio = ["anyio (>=4.0,<5.0)"]
212
  http2 = ["h2 (>=3,<5)"]
213
  socks = ["socksio (==1.*)"]
214
- trio = ["trio (>=0.22.0,<0.26.0)"]
215
 
216
  [[package]]
217
  name = "httpx"
@@ -304,43 +304,43 @@ type = ["mypy (>=1.11.2)"]
304
 
305
  [[package]]
306
  name = "pycryptodome"
307
- version = "3.20.0"
308
  description = "Cryptographic library for Python"
309
  optional = false
310
- python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
311
  files = [
312
- {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"},
313
- {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"},
314
- {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"},
315
- {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"},
316
- {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"},
317
- {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"},
318
- {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"},
319
- {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"},
320
- {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"},
321
- {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"},
322
- {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"},
323
- {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"},
324
- {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"},
325
- {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"},
326
- {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"},
327
- {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"},
328
- {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"},
329
- {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"},
330
- {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"},
331
- {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"},
332
- {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"},
333
- {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"},
334
- {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"},
335
- {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"},
336
- {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"},
337
- {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"},
338
- {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"},
339
- {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"},
340
- {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"},
341
- {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"},
342
- {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"},
343
- {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"},
344
  ]
345
 
346
  [[package]]
@@ -557,13 +557,13 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"]
557
 
558
  [[package]]
559
  name = "tomli"
560
- version = "2.0.1"
561
  description = "A lil' TOML parser"
562
  optional = false
563
- python-versions = ">=3.7"
564
  files = [
565
- {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
566
- {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
567
  ]
568
 
569
  [[package]]
@@ -579,13 +579,13 @@ files = [
579
 
580
  [[package]]
581
  name = "uvicorn"
582
- version = "0.30.6"
583
  description = "The lightning-fast ASGI server."
584
  optional = false
585
  python-versions = ">=3.8"
586
  files = [
587
- {file = "uvicorn-0.30.6-py3-none-any.whl", hash = "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5"},
588
- {file = "uvicorn-0.30.6.tar.gz", hash = "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788"},
589
  ]
590
 
591
  [package.dependencies]
@@ -610,4 +610,4 @@ files = [
610
  [metadata]
611
  lock-version = "2.0"
612
  python-versions = ">=3.10"
613
- content-hash = "c67753f8b384f670fef8ce78954d6fc38136b5fb47b9f59a0882953edd5a30ca"
 
194
 
195
  [[package]]
196
  name = "httpcore"
197
+ version = "1.0.6"
198
  description = "A minimal low-level HTTP client."
199
  optional = false
200
  python-versions = ">=3.8"
201
  files = [
202
+ {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"},
203
+ {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"},
204
  ]
205
 
206
  [package.dependencies]
 
211
  asyncio = ["anyio (>=4.0,<5.0)"]
212
  http2 = ["h2 (>=3,<5)"]
213
  socks = ["socksio (==1.*)"]
214
+ trio = ["trio (>=0.22.0,<1.0)"]
215
 
216
  [[package]]
217
  name = "httpx"
 
304
 
305
  [[package]]
306
  name = "pycryptodome"
307
+ version = "3.21.0"
308
  description = "Cryptographic library for Python"
309
  optional = false
310
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
311
  files = [
312
+ {file = "pycryptodome-3.21.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:dad9bf36eda068e89059d1f07408e397856be9511d7113ea4b586642a429a4fd"},
313
+ {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a1752eca64c60852f38bb29e2c86fca30d7672c024128ef5d70cc15868fa10f4"},
314
+ {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ba4cc304eac4d4d458f508d4955a88ba25026890e8abff9b60404f76a62c55e"},
315
+ {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cb087b8612c8a1a14cf37dd754685be9a8d9869bed2ffaaceb04850a8aeef7e"},
316
+ {file = "pycryptodome-3.21.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:26412b21df30b2861424a6c6d5b1d8ca8107612a4cfa4d0183e71c5d200fb34a"},
317
+ {file = "pycryptodome-3.21.0-cp27-cp27m-win32.whl", hash = "sha256:cc2269ab4bce40b027b49663d61d816903a4bd90ad88cb99ed561aadb3888dd3"},
318
+ {file = "pycryptodome-3.21.0-cp27-cp27m-win_amd64.whl", hash = "sha256:0fa0a05a6a697ccbf2a12cec3d6d2650b50881899b845fac6e87416f8cb7e87d"},
319
+ {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6cce52e196a5f1d6797ff7946cdff2038d3b5f0aba4a43cb6bf46b575fd1b5bb"},
320
+ {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:a915597ffccabe902e7090e199a7bf7a381c5506a747d5e9d27ba55197a2c568"},
321
+ {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e74c522d630766b03a836c15bff77cb657c5fdf098abf8b1ada2aebc7d0819"},
322
+ {file = "pycryptodome-3.21.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:a3804675283f4764a02db05f5191eb8fec2bb6ca34d466167fc78a5f05bbe6b3"},
323
+ {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4"},
324
+ {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b"},
325
+ {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e"},
326
+ {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8"},
327
+ {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1"},
328
+ {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a"},
329
+ {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2"},
330
+ {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93"},
331
+ {file = "pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764"},
332
+ {file = "pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53"},
333
+ {file = "pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca"},
334
+ {file = "pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd"},
335
+ {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d5ebe0763c982f069d3877832254f64974139f4f9655058452603ff559c482e8"},
336
+ {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee86cbde706be13f2dec5a42b52b1c1d1cbb90c8e405c68d0755134735c8dc6"},
337
+ {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fd54003ec3ce4e0f16c484a10bc5d8b9bd77fa662a12b85779a2d2d85d67ee0"},
338
+ {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5dfafca172933506773482b0e18f0cd766fd3920bd03ec85a283df90d8a17bc6"},
339
+ {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:590ef0898a4b0a15485b05210b4a1c9de8806d3ad3d47f74ab1dc07c67a6827f"},
340
+ {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35e442630bc4bc2e1878482d6f59ea22e280d7121d7adeaedba58c23ab6386b"},
341
+ {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff99f952db3db2fbe98a0b355175f93ec334ba3d01bbde25ad3a5a33abc02b58"},
342
+ {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8acd7d34af70ee63f9a849f957558e49a98f8f1634f86a59d2be62bb8e93f71c"},
343
+ {file = "pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297"},
344
  ]
345
 
346
  [[package]]
 
557
 
558
  [[package]]
559
  name = "tomli"
560
+ version = "2.0.2"
561
  description = "A lil' TOML parser"
562
  optional = false
563
+ python-versions = ">=3.8"
564
  files = [
565
+ {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"},
566
+ {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"},
567
  ]
568
 
569
  [[package]]
 
579
 
580
  [[package]]
581
  name = "uvicorn"
582
+ version = "0.31.0"
583
  description = "The lightning-fast ASGI server."
584
  optional = false
585
  python-versions = ">=3.8"
586
  files = [
587
+ {file = "uvicorn-0.31.0-py3-none-any.whl", hash = "sha256:cac7be4dd4d891c363cd942160a7b02e69150dcbc7a36be04d5f4af4b17c8ced"},
588
+ {file = "uvicorn-0.31.0.tar.gz", hash = "sha256:13bc21373d103859f68fe739608e2eb054a816dea79189bc3ca08ea89a275906"},
589
  ]
590
 
591
  [package.dependencies]
 
610
  [metadata]
611
  lock-version = "2.0"
612
  python-versions = ">=3.10"
613
+ content-hash = "cfa51491c2cccf2ff0bd593a2ede5734b580e2c20f6380e6a50ea3d900c9e809"
pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
  [tool.poetry]
2
  name = "mediaflow-proxy"
3
- version = "1.7.1"
4
  description = "A high-performance proxy server for streaming media, supporting HTTP(S), HLS, and MPEG-DASH with real-time DRM decryption."
5
  authors = ["mhdzumair <[email protected]>"]
6
  readme = "README.md"
@@ -31,7 +31,7 @@ cachetools = "^5.4.0"
31
  pydantic-settings = "^2.5.2"
32
  gunicorn = "^23.0.0"
33
  pycryptodome = "^3.20.0"
34
- uvicorn = "^0.30.6"
35
 
36
 
37
  [tool.poetry.group.dev.dependencies]
 
1
  [tool.poetry]
2
  name = "mediaflow-proxy"
3
+ version = "1.7.2"
4
  description = "A high-performance proxy server for streaming media, supporting HTTP(S), HLS, and MPEG-DASH with real-time DRM decryption."
5
  authors = ["mhdzumair <[email protected]>"]
6
  readme = "README.md"
 
31
  pydantic-settings = "^2.5.2"
32
  gunicorn = "^23.0.0"
33
  pycryptodome = "^3.20.0"
34
+ uvicorn = "^0.31.0"
35
 
36
 
37
  [tool.poetry.group.dev.dependencies]