From 4009b39247702296493e5540882c79f9ae64c8e7 Mon Sep 17 00:00:00 2001 From: Urlo30 <91965455+UrloMythus@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:35:33 +0100 Subject: [PATCH 1/2] Added New Extractors: Supervideo,Streamtape Added New Extractors: - Stremtape: IP-Locked - Supervideo: No limitations --- mediaflow_proxy/extractors/factory.py | 6 +++++ mediaflow_proxy/extractors/streamtape.py | 32 ++++++++++++++++++++++++ mediaflow_proxy/extractors/supervideo.py | 27 ++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 mediaflow_proxy/extractors/streamtape.py create mode 100644 mediaflow_proxy/extractors/supervideo.py diff --git a/mediaflow_proxy/extractors/factory.py b/mediaflow_proxy/extractors/factory.py index 80bcbfd..c61d408 100644 --- a/mediaflow_proxy/extractors/factory.py +++ b/mediaflow_proxy/extractors/factory.py @@ -5,6 +5,10 @@ from mediaflow_proxy.extractors.doodstream import DoodStreamExtractor from mediaflow_proxy.extractors.livetv import LiveTVExtractor from mediaflow_proxy.extractors.mixdrop import MixdropExtractor from mediaflow_proxy.extractors.uqload import UqloadExtractor +from mediaflow_proxy.extractors.streamtape import StreamtapeExtractor +from mediaflow_proxy.extractors.supervideo import SupervideoExtractor + + class ExtractorFactory: @@ -14,6 +18,8 @@ class ExtractorFactory: "Doodstream": DoodStreamExtractor, "Uqload": UqloadExtractor, "Mixdrop": MixdropExtractor, + "Streamtape": StreamtapeExtractor, + "Supervideo": SupervideoExtractor, "LiveTV": LiveTVExtractor, } diff --git a/mediaflow_proxy/extractors/streamtape.py b/mediaflow_proxy/extractors/streamtape.py new file mode 100644 index 0000000..6358a7d --- /dev/null +++ b/mediaflow_proxy/extractors/streamtape.py @@ -0,0 +1,32 @@ +import re +from typing import Dict, Any + +from mediaflow_proxy.extractors.base import BaseExtractor, ExtractorError + + +class StreamtapeExtractor(BaseExtractor): + """Streamtape URL extractor.""" + + async def extract(self, url: str, **kwargs) -> Dict[str, Any]: + """Extract Streamtape URL.""" + response = await self._make_request(url) + + # Extract and decode URL + matches = re.findall(r"id=.*?(?=')", response.text) + if not matches: + raise ExtractorError("Failed to extract URL components") + final_url = next( + ( + f"https://streamtape.com/get_video?{matches[i + 1]}" + for i in range(len(matches) - 1) + if matches[i] == matches[i + 1] + ), + None, + ) + + self.base_headers["referer"] = url + return { + "destination_url": final_url, + "request_headers": self.base_headers, + "mediaflow_endpoint": self.mediaflow_endpoint, + } diff --git a/mediaflow_proxy/extractors/supervideo.py b/mediaflow_proxy/extractors/supervideo.py new file mode 100644 index 0000000..ba0fc6b --- /dev/null +++ b/mediaflow_proxy/extractors/supervideo.py @@ -0,0 +1,27 @@ +import re +from typing import Dict, Any + +from mediaflow_proxy.extractors.base import BaseExtractor, ExtractorError + + +class SupervideoExtractor(BaseExtractor): + """Supervideo URL extractor.""" + + async def extract(self, url: str, **kwargs) -> Dict[str, Any]: + """Extract Supervideo URL.""" + response = await self._make_request(url) + # Extract and decode URL + s2 = re.search(r"\}\('(.+)',.+,'(.+)'\.split", response.text).group(2) + terms = s2.split("|") + hfs = next(terms[i] for i in range(terms.index("file"), len(terms)) if "hfs" in terms[i]) + result = terms[terms.index("urlset") + 1 : terms.index("hls")] + + base_url = f"https://{hfs}.serversicuro.cc/hls/" + final_url = base_url + ",".join(reversed(result)) + (".urlset/master.m3u8" if result else "") + + self.base_headers["referer"] = url + return { + "destination_url": final_url, + "request_headers": self.base_headers, + "mediaflow_endpoint": self.mediaflow_endpoint, + } From 67beef6c44dadfb5076716880e5c0a4e283719d3 Mon Sep 17 00:00:00 2001 From: Urlo30 <91965455+UrloMythus@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:36:07 +0100 Subject: [PATCH 2/2] Modified Schema to include new extractors --- mediaflow_proxy/schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediaflow_proxy/schemas.py b/mediaflow_proxy/schemas.py index db8d9f6..9a8fa2b 100644 --- a/mediaflow_proxy/schemas.py +++ b/mediaflow_proxy/schemas.py @@ -63,7 +63,7 @@ class MPDSegmentParams(GenericParams): class ExtractorURLParams(GenericParams): - host: Literal["Doodstream", "Mixdrop", "Uqload", "LiveTV"] = Field( + host: Literal["Doodstream", "Mixdrop", "Uqload", "Streamtape", "Supervideo", "LiveTV"] = Field( ..., description="The host to extract the URL from." ) destination: str = Field(..., description="The URL of the stream.", alias="d")