From abf282c770242cd425429dbb55b583e41c114108 Mon Sep 17 00:00:00 2001 From: UrloMythus Date: Fri, 18 Jul 2025 09:51:51 +0200 Subject: [PATCH] HF fixed --- Dockerfile | 19 +-- mediaflow_proxy/extractors/base.py | 1 - mediaflow_proxy/extractors/fastream.py | 9 +- mediaflow_proxy/extractors/mixdrop.py | 20 +-- mediaflow_proxy/extractors/supervideo.py | 2 +- .../__pycache__/all_debrid.cpython-313.pyc | Bin 3379 -> 0 bytes .../__pycache__/base.cpython-313.pyc | Bin 1619 -> 0 bytes .../__pycache__/real_debrid.cpython-313.pyc | Bin 2543 -> 0 bytes mediaflow_proxy/static/index.html | 126 +----------------- mediaflow_proxy/utils/packed.py | 6 +- 10 files changed, 16 insertions(+), 167 deletions(-) delete mode 100644 mediaflow_proxy/speedtest/providers/__pycache__/all_debrid.cpython-313.pyc delete mode 100644 mediaflow_proxy/speedtest/providers/__pycache__/base.cpython-313.pyc delete mode 100644 mediaflow_proxy/speedtest/providers/__pycache__/real_debrid.cpython-313.pyc 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 65b4ba2d7857b9c47d4fb0dca39e9ed72b255292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3379 zcmZ`*O>7&-6`uVex%?Al{aCd8NB`6{ZHts+S+-I`jvT77q*!&eq+mw`)+=%;twZiI zGfO)X5V%N-Kt@y47q?C?QGp(8pa=El-qaw6 zU}tCEym|B9oAxG*5l7`3o34Br=h?F+%ark8z_s^W8u*j+7csCa+JuvZX!$B z$a%p%kG48gKTreNV3WFMhKmQ+k!3tC*kVf0S+*x#DHk1Ojzzz6lSTGo>NrIqWW~j(wL&q z2uR&TZS1M!tXa~M68NJxIfiS${Twe|H9aUWYFTd?A=Y^uVsLEYX%3e>`Bf4Hb(iN6)6e*IQuw zd{1*B=GYfQ17i&XV|ocfsiYa`Q`1P;KDDeX?`v~89yT``jxkI(4?*{k+-NN}R!A?& zkYXba$P9^d<4<_n4ePcKLJ#5)LsDc~vEWb{%8JG4UgUrX&<)*!Yu(?}vZ;QevA73V z8QStQvetFz)6iO?cR~DB$Z@*ug{Z7hBiB>``26tw9KOv09CnPvK;^0Cy3EPEEKD`c zn-GC>N9*NeQTAlWgm=dROl5CEkbMK<2xR{(IOPuaP#E`wh{0vJ3F&+Ir8n;qq6P_> zg3oQT|9o8^4R>Kw?P%xgbA!+DvJ(e#@O$Khw&hG=3OEgRgfVjD7VMj|$ZNA!hhxux zU1`fxI_DCid-MfvMajM;kl_-bUMQo{9atX${|jC0?*asM`X1 zRN%yN{ziV{!0ufwMBbP2w2*TGSQT}xGJJ;D5O1(P{y34y_$K3BOABBxj08h8yajSW zC~)!p-6GqQz z^P#he-kx*)=PvdSs22eCJ*vBo*#uc?dqE83C?u9|R#O4Qne8pBR4uXfufVeTBR^L4 zqLzyC6I;B^OoL*gQK;PY1HDu=@@C2QRSdmgQW#LJTvT(K z?a?i*#B2fTL0qDUU$#UwRyGavJ5K%1nL1WWuj?H%WWU#kgy$xiqabT%n*TFaIfM?J5on8y=SqoiS>pb#@i>t@_YsdPl9T(OP zo>&_ED*e~&*V$V8doTT-?!b4%(-ByZHd;uiV>NiV7CgLoZY6l)d0VV{B(>5uTn!C> z8|nJ>NB2Ma<-G-QEf{$q-5-2(v%zwCrR}Y1=&da;={&e7E>8YF^f+CMz426hI{D|& za;A21teUx5eeYH+qgJQiuVsq0j?#jE!%N=fu5;DvlV4w|-cX;7O|Nw2pkLnm=+0*? ze+<-4URs)j?pgFwZEU*Mm0J)$4Z#@)j($G)yTQjt9{+S@e{xBzcAsC34%VWBPucR7 zmFPPQ;kERQ)%2}e`qpZ?P)irSNzZ;0(VwMf|MKo~>Vf!q_h;RYLW^Td;m7x?doMq0 zy zhN2<*+{g=HT;-g%ntiaDy|0IzyNsF1PCkDOSV zSnjJuu2!Y1F9p)x^NNLl{o{@}_Z#kq;&1oFIf|G$4%ylYe~QI`A|6vH08r``C2!`S zjtk79^f1z~tWwmMqF>#FZQ4agkcKtF!2tLDgoT0v^12iSCmy;rfrc=oH(z>O83M;u7$D)r!nTB*X~&GA_AdDqOD{5~qA1SLK}y>{{9#UWp8oE8)NvVB|7|zg(k1snJxFC( zz!+v2wHpG*aepV_7vyA(ocuRA^MVY$Ah~~#%UfQK^FO$`Mc}t39p}J%`x5^pIB>-N E4* z!f-wME#Ci5X6$!5jF&drz48gYVDG3*v5uTg+Q4~GE0MUSFe@$C959<{@ozWK7{1c z&<|ici92C;XrR@Qs>-VwY8`(7E+xpz;y8dPJ!Y+1g&U3&yS>11c*Svgi9d*FKkGQ3 z4BTj>nRlE{2x%6DaS$ht19Rk93FC~T%8lbB6V6jqQJP%AQt?H{NlETGZk9pV9$;iN zxPS&ZK8)`*_LE-Fz+95Xt>j)DC9a<~dVwFhohZ4t-iPF~gY}*p#?OR~5H?bxO-vei z7QE9&8>?RLAHWRy7C<#fmk_>YPp({juzUFWkLuMY^9zUDM+=9yzxn(p^<}s+HlDg3 z9i_DLHp2Av6qjQuwmx++WxGPmi)-4DEp>@~tZtGITrgv6_{A*BvHhNtS1ldpx}}=I z7pZ6dahby^etmzHbfy=%X=-*7Fa>#&*qamfb*@8@4IuU;5wZXrCiW#h`7FW;Gm%SI zdPC_*HTnM5yFq3~Av#Gqg|odo?-v2G{b1tRbYtI4M$K&wu$j#eySd&H7kMmkH4UOp zN>NRqV)JS@$ec-+@s)pNR-ZBwJwe?%WDnSx&dSxlauttX$g1?e39S;LaY5FxNM6_p zJ<}5dF>3!&+F+vd=X0)5I)x=S|2yHrVi7-vRf07FO1@Q_hZpGZBEbT|MFd`Q96#}} z>xm6eTZsXIOSCHylnIszMBmbM!({?;TeK%t6Z?X zK>sO`JJ+*=ei(O)^aT-0pBw!H-;Hs|fu@a{lj$u6wLTftI{sUNC@uI3s)ErpOK!Yf z{DQWij_#Dp0v&hT|!nUShT+kY~A2^N0? DCNGz# 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 e250cad1028e06caeefeba3b435ec7500cc6b086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2543 zcmbVO&2JM&6rcUDy>V=uU{HgFs7YGLQero%Qvy^-36Tg6c4#JvKsa4(?6tFDKit`M zNOC}kN>zH}Lfa#%TD9DA%#r>FF(8pnD^a!TA-AAVRowb!*B{V|s$}GS^XARGH}Acf z_Z#mHE;+S4^X<)imH8d(sR$bk; zR3k5QRGM)#a?vW=GEWbVs*Z-MnpT?D9QQJ@m-LcG=v)61owu#BUMc!J`Lq>E9>#Z3 z0TB)(!efpImVgbJYy&z2UXLI>;pQHIB20xgOp4C^{!1i`>4f`cSl3CR+T zPid+#rp*(*)N*E90{zugdnV~H*OM;zo~$;UPwFOwY-*OPvY1meNHn)btRe@>%@zgb zGx&Blfb^jxI|>f-Sim9<;2;iR33uQy?!*xsO+_qjhMRg>zhP&n(Z|s&KPx!G`^e$r zX#6NbH6EdA-<7_7=o)Z-n-ZH`yN6@khhsyHHMlE=KHwET*N0Ficx7=GZwWJy*9`v- z*iIrxump=QqfYPcZGefD8eZw+rwUi=|x`C3HyHwFO(_WTXlG2Qf zX=Sx$xGAEN^y+X^pUf}+Ujx48>87S(TZ4O4UASJ^tEy9}zM<-wro*6WzoBj`Sa)U5 zs)o9}=Ut7Zy{eiubFZq4*WEW%J>N|6Yj2}r*Gm7mkLQ`JY^X%@E|wgj!blENVQTaW z6)#QZ2dOwdaRDg4aCwjhfKI|-`YNNBMy@da(k#&2Ob%#vVtSB<+cpU+t!-Ajt72;K z!!kf)KzB9M0bEe6l5NsZ&C<&@F=dg8j%JjpSR;l*CBrUy2tuWK07-=jSpg@Z(L#E` zHnlX!?DSZp?3}czm2|ai*f$0MjFwjhOjWnqLd6rl6nqo0oHQ#~rBSfe6&kH*uEI*y z+ms${16~UXQ?D%P1izeHK(^5>^lKb%#dBK+CL6zlAGdj5m{6V_igtz9#GNDP6KjxjRN}$^0FtuL*7|neB_-$ z|Anm=;Xzyw5L)8y3i&|9N7nt|)`fMvF5N%3G5lb>em1xHUatOb{yBo#onw69BDdLl`Y*&7l4)9!J895esp?k6 zbJKU&bMr7Pp~+Sq`6ZKTyz$Y-8rW9}El7cg8zm=_5bG s=g2TjFr;wU)z}d@j(dvw>!|-{6#WAYJw?Um!5$7GN~HfpjPZ>84dapPLI3~& 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