From 2fe5c71dec3db70e2371f25ef859b4773f5a4477 Mon Sep 17 00:00:00 2001 From: Urlo30 <91965455+UrloMythus@users.noreply.github.com> Date: Tue, 15 Oct 2024 21:58:50 +0200 Subject: [PATCH] Add files via upload --- .../__pycache__/doodstream.cpython-311.pyc | Bin 0 -> 2037 bytes .../__pycache__/mixdrop.cpython-311.pyc | Bin 0 -> 2234 bytes .../__pycache__/uqload.cpython-311.pyc | Bin 0 -> 1345 bytes mediaflow_proxy/extractors/doodstream.py | 22 +++++++ mediaflow_proxy/extractors/mixdrop.py | 24 +++++++ mediaflow_proxy/extractors/uqload.py | 13 ++++ mediaflow_proxy/extractors_routes.py | 61 ++++++++++++++++++ mediaflow_proxy/main.py | 5 +- 8 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 mediaflow_proxy/extractors/__pycache__/doodstream.cpython-311.pyc create mode 100644 mediaflow_proxy/extractors/__pycache__/mixdrop.cpython-311.pyc create mode 100644 mediaflow_proxy/extractors/__pycache__/uqload.cpython-311.pyc create mode 100644 mediaflow_proxy/extractors/doodstream.py create mode 100644 mediaflow_proxy/extractors/mixdrop.py create mode 100644 mediaflow_proxy/extractors/uqload.py create mode 100644 mediaflow_proxy/extractors_routes.py diff --git a/mediaflow_proxy/extractors/__pycache__/doodstream.cpython-311.pyc b/mediaflow_proxy/extractors/__pycache__/doodstream.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1637648fa3d36895fc312c6e3578b263351dc337 GIT binary patch literal 2037 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 Rq#6S8O7_G*8S8<}KLN07PeuR$ literal 0 HcmV?d00001 diff --git a/mediaflow_proxy/extractors/doodstream.py b/mediaflow_proxy/extractors/doodstream.py new file mode 100644 index 0000000..a9caff4 --- /dev/null +++ b/mediaflow_proxy/extractors/doodstream.py @@ -0,0 +1,22 @@ +import httpx +import time +import re +from mediaflow_proxy.configs import settings +async def doodstream_url(d: str, use_request_proxy: bool): + async with httpx.AsyncClient(proxy=settings.proxy_url if use_request_proxy else None) as client: + headers = { + "Range": "bytes=0-", + "Referer": "https://d000d.com/", + } + + response = await client.get(d, follow_redirects=True) + if response.status_code == 200: + # Get unique timestamp for the request + real_time = str(int(time.time())) + pattern = r"(\/pass_md5\/.*?)'.*(\?token=.*?expiry=)" + match = re.search(pattern, response.text, re.DOTALL) + if match: + url =f'https://d000d.com{match[1]}' + rebobo = await client.get(url, headers=headers, follow_redirects=True) + final_url = f'{rebobo.text}123456789{match[2]}{real_time}' + return final_url \ No newline at end of file diff --git a/mediaflow_proxy/extractors/mixdrop.py b/mediaflow_proxy/extractors/mixdrop.py new file mode 100644 index 0000000..b04be24 --- /dev/null +++ b/mediaflow_proxy/extractors/mixdrop.py @@ -0,0 +1,24 @@ +import httpx +import re +import string +from mediaflow_proxy.configs import settings + + +async def mixdrop_url(d: str, use_request_proxy: bool): + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.10; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', + 'Accept-Language': 'en-US,en;q=0.5' + } + async with httpx.AsyncClient(proxy=settings.proxy_url if use_request_proxy else None) as client: + response = await client.get(d, headers=headers, follow_redirects=True,timeout = 30) + [s1, s2] = re.search(r"\}\('(.+)',.+,'(.+)'\.split", response.text).group(1, 2) + schema = s1.split(";")[2][5:-1] + terms = s2.split("|") + charset = string.digits + string.ascii_letters + d = dict() + for i in range(len(terms)): + d[charset[i]] = terms[i] or charset[i] + final_url = 'https:' + for c in schema: + final_url += d[c] if c in d else c + return final_url \ No newline at end of file diff --git a/mediaflow_proxy/extractors/uqload.py b/mediaflow_proxy/extractors/uqload.py new file mode 100644 index 0000000..e6b5022 --- /dev/null +++ b/mediaflow_proxy/extractors/uqload.py @@ -0,0 +1,13 @@ +import httpx +import re +from mediaflow_proxy.configs import settings + + +async def uqload_url(d: str, use_request_proxy: bool): + async with httpx.AsyncClient(proxy=settings.proxy_url if use_request_proxy else None) as client: + + response = await client.get(d, follow_redirects=True) + video_url_match = re.search(r'sources: \["(.*?)"\]', response.text) + if video_url_match: + final_url = video_url_match.group(1) + return final_url \ No newline at end of file diff --git a/mediaflow_proxy/extractors_routes.py b/mediaflow_proxy/extractors_routes.py new file mode 100644 index 0000000..c612a7c --- /dev/null +++ b/mediaflow_proxy/extractors_routes.py @@ -0,0 +1,61 @@ +from fastapi import APIRouter,Query +from fastapi.responses import JSONResponse +from .extractors.doodstream import doodstream_url +from .extractors.uqload import uqload_url +from .extractors.mixdrop import mixdrop_url +extractor_router = APIRouter() + + +@extractor_router.get("/doodstream") +async def doodstream_extractor(d: str = Query(..., description="DoodStream URL"), use_request_proxy: bool = Query(False, description="Whether to use the MediaFlow proxy configuration.")): + ''' + Extract a clean link from DoodStream URL + + Args: request (Request): The incoming HTTP request + + Returns: The clean link (url) and the headers needed to access the url + + N.B. You can't use a rotating proxy for this endpoint + ''' + final_url = await doodstream_url(d,use_request_proxy) + headers_dict = { + "Referer": "https://d000d.com/" + } #Needed Headers to access the Response + return JSONResponse(content={"url": final_url,"headers": headers_dict}) + + + +@extractor_router.get("/uqload") +async def uqload_extractor(d: str = Query(..., description="Uqload Url"), use_request_proxy: bool = Query(False, description="Whether to use the MediaFlow proxy configuration.")): + ''' + Extract a clean link from Uqload URL + + Args: request (Request): The incoming HTTP request + + Returns: The clean link (url) and the headers needed to access the url + + ''' + final_url = await uqload_url(d,use_request_proxy) + headers_dict = { + "Referer": "https://uqload.to/" + } + return JSONResponse(content={"url": final_url,"headers": headers_dict}) + + +@extractor_router.get("/mixdrop") +async def mixdrop_extractor(d: str = Query(..., description="MixDrop URL",), use_request_proxy: bool = Query(False, description="Whether to use the MediaFlow proxy configuration.")): + ''' + Extract a clean link from MixDrop URL + + Args: request (Request): The incoming HTTP request + + Returns: The clean link (url) and the headers needed to access the url + + ''' + final_url = await mixdrop_url(d,use_request_proxy) + headers_dict = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.10; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" + } + return JSONResponse(content={"url": final_url,"headers": headers_dict}) + + diff --git a/mediaflow_proxy/main.py b/mediaflow_proxy/main.py index 127b767..9e62878 100644 --- a/mediaflow_proxy/main.py +++ b/mediaflow_proxy/main.py @@ -9,6 +9,7 @@ from starlette.staticfiles import StaticFiles from mediaflow_proxy.configs import settings from mediaflow_proxy.routes import proxy_router +from mediaflow_proxy.extractors_routes import extractor_router from mediaflow_proxy.schemas import GenerateUrlRequest from mediaflow_proxy.utils.crypto_utils import EncryptionHandler, EncryptionMiddleware from mediaflow_proxy.utils.http_utils import encode_mediaflow_proxy_url @@ -16,7 +17,7 @@ from mediaflow_proxy.utils.http_utils import encode_mediaflow_proxy_url logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") app = FastAPI() api_password_query = APIKeyQuery(name="api_password", auto_error=False) -api_password_header = APIKeyHeader(name="api_password", auto_error=False) +api_password_header = APIKeyHeader(name="api_password", auto_error=False) app.add_middleware( CORSMiddleware, allow_origins=["*"], @@ -74,6 +75,8 @@ async def generate_encrypted_or_encoded_url(request: GenerateUrlRequest): app.include_router(proxy_router, prefix="/proxy", tags=["proxy"], dependencies=[Depends(verify_api_key)]) +app.include_router(extractor_router, prefix="/extractors", tags=["extractors"], dependencies=[Depends(verify_api_key)]) + static_path = resources.files("mediaflow_proxy").joinpath("static") app.mount("/", StaticFiles(directory=str(static_path), html=True), name="static")