diff --git a/mediaflow_proxy/extractors/maxstream.py b/mediaflow_proxy/extractors/maxstream.py new file mode 100644 index 0000000..bafb293 --- /dev/null +++ b/mediaflow_proxy/extractors/maxstream.py @@ -0,0 +1,71 @@ +import re +import string +from typing import Dict, Any +from bs4 import BeautifulSoup + +from mediaflow_proxy.extractors.base import BaseExtractor, ExtractorError + + +class MaxstreamExtractor(BaseExtractor): + """Maxstream URL extractor.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.mediaflow_endpoint = "hls_manifest_proxy" + + async def get_uprot(self, link: str): + """Extract MaxStream URL.""" + if "msf" in link: + link = link.replace("msf", "mse") + response = await self._make_request(link) + soup = BeautifulSoup(response.text, "lxml") + maxstream_url = soup.find("a") + maxstream_url = maxstream_url.get("href") + return maxstream_url + + async def extract(self, url: str, **kwargs) -> Dict[str, Any]: + """Extract Maxstream URL.""" + maxstream_url = await self.get_uprot(url) + response = await self._make_request(maxstream_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") + + s1 = match.group(2) + # Extract Terms + terms = s1.split("|") + urlset_index = terms.index("urlset") + hls_index = terms.index("hls") + sources_index = terms.index("sources") + result = terms[urlset_index + 1 : hls_index] + reversed_elements = result[::-1] + first_part = terms[hls_index + 1 : sources_index] + reversed_first_part = first_part[::-1] + first_url_part = "" + for first_part in reversed_first_part: + if "0" in first_part: + first_url_part += first_part + else: + first_url_part += first_part + "-" + + base_url = f"https://{first_url_part}.host-cdn.net/hls/" + if len(reversed_elements) == 1: + final_url = base_url + "," + reversed_elements[0] + ".urlset/master.m3u8" + lenght = len(reversed_elements) + i = 1 + for element in reversed_elements: + base_url += element + "," + if lenght == i: + base_url += ".urlset/master.m3u8" + else: + i += 1 + final_url = base_url + + 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/mixdrop.py b/mediaflow_proxy/extractors/mixdrop.py index 26d91a7..4604463 100644 --- a/mediaflow_proxy/extractors/mixdrop.py +++ b/mediaflow_proxy/extractors/mixdrop.py @@ -10,6 +10,8 @@ class MixdropExtractor(BaseExtractor): async def extract(self, url: str, **kwargs) -> Dict[str, Any]: """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 diff --git a/mediaflow_proxy/extractors/okru.py b/mediaflow_proxy/extractors/okru.py new file mode 100644 index 0000000..2327866 --- /dev/null +++ b/mediaflow_proxy/extractors/okru.py @@ -0,0 +1,33 @@ +import re +from bs4 import BeautifulSoup, SoupStrainer +import json + +from typing import Dict, Any + +from mediaflow_proxy.extractors.base import BaseExtractor, ExtractorError + + +class OkruExtractor(BaseExtractor): + """Okru URL extractor.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.mediaflow_endpoint = "hls_manifest_proxy" + + async def extract(self, url: str, **kwargs) -> Dict[str, Any]: + """Extract Okru URL.""" + response = await self._make_request(url) + soup = BeautifulSoup(response.text, "lxml", parse_only=SoupStrainer("div")) + if soup: + div = soup.find("div", {"data-module": "OKVideo"}) + data_options = div.get("data-options") + data = json.loads(data_options) + metadata = json.loads(data["flashvars"]["metadata"]) + final_url = metadata["hlsMasterPlaylistUrl"] + + 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/vixcloud.py b/mediaflow_proxy/extractors/vixcloud.py index eb4c5d7..bdf7f65 100644 --- a/mediaflow_proxy/extractors/vixcloud.py +++ b/mediaflow_proxy/extractors/vixcloud.py @@ -4,6 +4,7 @@ from bs4 import BeautifulSoup, SoupStrainer from mediaflow_proxy.extractors.base import BaseExtractor, ExtractorError import json from urllib.parse import urlparse, parse_qs +from urllib.parse import urlparse, parse_qs class VixCloudExtractor(BaseExtractor):