diff --git a/Dockerfile b/Dockerfile index 195cd9a..0f135ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,8 @@ -FROM python:3.10-slim-buster - -# Set the working directory in the container to /app +FROM python:3.11-slim-bullseye WORKDIR /app - -# Install git RUN apt-get update && apt-get install -y git - -# Clone the repository RUN git clone https://github.com/YourUsername/YourRepoName.git . - -# Copy the local config.json file to the container - -# Install any needed packages specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt +EXPOSE 7860 +CMD ["uvicorn", "run:main_app", "--host", "0.0.0.0", "--port", "7860", "--workers", "4"] - -EXPOSE 8888 - -# Run run.py when the container launches -CMD ["uvicorn", "run:main_app", "--host", "0.0.0.0", "--port", "8888", "--workers", "4"] diff --git a/mediaflow_proxy/extractors/base.py b/mediaflow_proxy/extractors/base.py index 2b16f8a..bf8a15b 100644 --- a/mediaflow_proxy/extractors/base.py +++ b/mediaflow_proxy/extractors/base.py @@ -30,7 +30,6 @@ class BaseExtractor(ABC): try: async with create_httpx_client() as client: request_headers = self.base_headers - print(request_headers) request_headers.update(headers or {}) response = await client.request( method, diff --git a/mediaflow_proxy/extractors/fastream.py b/mediaflow_proxy/extractors/fastream.py index 55a1ae8..2f8d664 100644 --- a/mediaflow_proxy/extractors/fastream.py +++ b/mediaflow_proxy/extractors/fastream.py @@ -1,4 +1,3 @@ -import re from typing import Dict, Any from mediaflow_proxy.extractors.base import BaseExtractor @@ -17,10 +16,10 @@ class FastreamExtractor(BaseExtractor): #Init headers needed for the request. headers = {'Accept': '*/*', 'Connection': 'keep-alive','Accept-Language': 'en-US,en;q=0.5','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0'} """Extract Fastream URL.""" - final_url = await eval_solver(self,url,headers) + final_url = await eval_solver(self,url,headers, r'file:"(.*?)"') - self.base_headers["referer"] = f'https://{url.replace('https://','').split('/')[0]}/' - self.base_headers["origin"] = f'https://{url.replace('https://','').split('/')[0]}' + self.base_headers["referer"] = f'https://{url.replace("https://","").split("/")[0]}/' + self.base_headers["origin"] = f'https://{url.replace("https://","").split("/")[0]}' self.base_headers['Accept-Language'] = 'en-US,en;q=0.5' self.base_headers['Accept'] = '*/*' self.base_headers['user-agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0' @@ -29,4 +28,4 @@ class FastreamExtractor(BaseExtractor): "destination_url": final_url, "request_headers": self.base_headers, "mediaflow_endpoint": self.mediaflow_endpoint, - } \ No newline at end of file + } diff --git a/mediaflow_proxy/extractors/mixdrop.py b/mediaflow_proxy/extractors/mixdrop.py index 4604463..21a1790 100644 --- a/mediaflow_proxy/extractors/mixdrop.py +++ b/mediaflow_proxy/extractors/mixdrop.py @@ -1,8 +1,7 @@ -import re -import string from typing import Dict, Any from mediaflow_proxy.extractors.base import BaseExtractor, ExtractorError +from mediaflow_proxy.utils.packed import eval_solver class MixdropExtractor(BaseExtractor): @@ -12,23 +11,10 @@ class MixdropExtractor(BaseExtractor): """Extract Mixdrop URL.""" if "club" in url: url = url.replace("club", "ps").split("/2")[0] - response = await self._make_request(url, headers={"accept-language": "en-US,en;q=0.5"}) - # Extract and decode URL - match = re.search(r"}\('(.+)',.+,'(.+)'\.split", response.text) - if not match: - raise ExtractorError("Failed to extract URL components") + headers = {"accept-language": "en-US,en;q=0.5"} - s1, s2 = match.group(1, 2) - schema = s1.split(";")[2][5:-1] - terms = s2.split("|") - - # Build character mapping - charset = string.digits + string.ascii_letters - char_map = {charset[i]: terms[i] or charset[i] for i in range(len(terms))} - - # Construct final URL - final_url = "https:" + "".join(char_map.get(c, c) for c in schema) + final_url = f"https:{await eval_solver(self, url, headers, r'MDCore.wurl ?= ?"(.*?)"')}" self.base_headers["referer"] = url return { diff --git a/mediaflow_proxy/extractors/supervideo.py b/mediaflow_proxy/extractors/supervideo.py index 31da858..adb3c42 100644 --- a/mediaflow_proxy/extractors/supervideo.py +++ b/mediaflow_proxy/extractors/supervideo.py @@ -19,7 +19,7 @@ class SupervideoExtractor(BaseExtractor): """Extract Supervideo URL.""" - final_url = await eval_solver(self,url,headers) + final_url = await eval_solver(self,url,headers, r'file:"(.*?)"') self.base_headers["referer"] = url return { diff --git a/mediaflow_proxy/speedtest/providers/__pycache__/all_debrid.cpython-313.pyc b/mediaflow_proxy/speedtest/providers/__pycache__/all_debrid.cpython-313.pyc deleted file mode 100644 index 65b4ba2..0000000 Binary files a/mediaflow_proxy/speedtest/providers/__pycache__/all_debrid.cpython-313.pyc and /dev/null differ diff --git a/mediaflow_proxy/speedtest/providers/__pycache__/base.cpython-313.pyc b/mediaflow_proxy/speedtest/providers/__pycache__/base.cpython-313.pyc deleted file mode 100644 index 039a4fc..0000000 Binary files a/mediaflow_proxy/speedtest/providers/__pycache__/base.cpython-313.pyc and /dev/null differ diff --git a/mediaflow_proxy/speedtest/providers/__pycache__/real_debrid.cpython-313.pyc b/mediaflow_proxy/speedtest/providers/__pycache__/real_debrid.cpython-313.pyc deleted file mode 100644 index e250cad..0000000 Binary files a/mediaflow_proxy/speedtest/providers/__pycache__/real_debrid.cpython-313.pyc and /dev/null differ diff --git a/mediaflow_proxy/static/index.html b/mediaflow_proxy/static/index.html index 9885320..87860dd 100644 --- a/mediaflow_proxy/static/index.html +++ b/mediaflow_proxy/static/index.html @@ -1,125 +1,3 @@ - - - - - MediaFlow Proxy - - - - -
- MediaFlow Proxy Logo -

MediaFlow Proxy

-
-

A high-performance proxy server for streaming media, supporting HTTP(S), HLS, and MPEG-DASH with real-time DRM decryption.

- -

Key Features

-
Convert MPEG-DASH streams (DRM-protected and non-protected) to HLS
-
Support for Clear Key DRM-protected MPD DASH streams
-
Handle both live and video-on-demand (VOD) DASH streams
-
Proxy HTTP/HTTPS links with custom headers
-
Proxy and modify HLS (M3U8) streams in real-time with custom headers and key URL modifications for bypassing some sneaky restrictions.
-
Protect against unauthorized access and network bandwidth abuses
- -
-

🚀 Speed Test Tool

-

Test your connection speed with debrid services to optimize your streaming experience:

- -

- Browser Speed Test: Tests your actual connection speed through MediaFlow proxy vs direct connection with support for multiple servers, interactive charts, and comprehensive analytics. -

-
- -

Getting Started

-

Visit the GitHub repository for installation instructions and documentation.

- -

Premium Hosted Service

-

For a hassle-free experience, check out premium hosted service on ElfHosted.

- -

API Documentation

-

Explore the Swagger UI for comprehensive details about the API endpoints and their usage.

- - - \ No newline at end of file +

"The App is running"

+ diff --git a/mediaflow_proxy/utils/packed.py b/mediaflow_proxy/utils/packed.py index 094d6bb..b1f03e8 100644 --- a/mediaflow_proxy/utils/packed.py +++ b/mediaflow_proxy/utils/packed.py @@ -142,15 +142,15 @@ class UnpackingError(Exception): -async def eval_solver(self, url: str, headers): +async def eval_solver(self, url: str, headers, pattern: str) -> str: try: - response = await self._make_request(url, headers = headers) + response = await self._make_request(url, headers=headers) soup = BeautifulSoup(response.text, "lxml",parse_only=SoupStrainer("script")) script_all = soup.find_all("script") for i in script_all: if detect(i.text): unpacked_code = unpack(i.text) - match = re.search( r'file:"(.*?)"', unpacked_code) + match = re.search(pattern, unpacked_code) if match: m3u8_url = match.group(1) return m3u8_url