mirror of
https://github.com/UrloMythus/UnHided.git
synced 2026-04-09 02:40:47 +00:00
63 lines
1.8 KiB
Python
63 lines
1.8 KiB
Python
import re
|
|
|
|
from mediaflow_proxy.extractors.base import BaseExtractor, ExtractorError
|
|
|
|
|
|
class TurboVidPlayExtractor(BaseExtractor):
|
|
domains = [
|
|
"turboviplay.com",
|
|
"emturbovid.com",
|
|
"tuborstb.co",
|
|
"javggvideo.xyz",
|
|
"stbturbo.xyz",
|
|
"turbovidhls.com",
|
|
]
|
|
|
|
mediaflow_endpoint = "hls_manifest_proxy"
|
|
|
|
async def extract(self, url: str, **kwargs):
|
|
#
|
|
# 1. Load embed
|
|
#
|
|
response = await self._make_request(url)
|
|
html = response.text
|
|
|
|
#
|
|
# 2. Extract urlPlay or data-hash
|
|
#
|
|
m = re.search(r'(?:urlPlay|data-hash)\s*=\s*[\'"]([^\'"]+)', html)
|
|
if not m:
|
|
raise ExtractorError("TurboViPlay: No media URL found")
|
|
|
|
media_url = m.group(1)
|
|
|
|
# Normalize protocol
|
|
if media_url.startswith("//"):
|
|
media_url = "https:" + media_url
|
|
elif media_url.startswith("/"):
|
|
media_url = response.get_origin() + media_url
|
|
|
|
#
|
|
# 3. Fetch the intermediate playlist
|
|
#
|
|
data_resp = await self._make_request(media_url, headers={"Referer": url})
|
|
playlist = data_resp.text
|
|
|
|
#
|
|
# 4. Extract real m3u8 URL
|
|
#
|
|
m2 = re.search(r'https?://[^\'"\s]+\.m3u8', playlist)
|
|
if not m2:
|
|
raise ExtractorError("TurboViPlay: Unable to extract playlist URL")
|
|
|
|
real_m3u8 = m2.group(0)
|
|
|
|
return {
|
|
"destination_url": real_m3u8,
|
|
"request_headers": {"origin": response.get_origin()},
|
|
"propagate_response_headers": {"content-type": "video/mp2t"},
|
|
"remove_response_headers": ["content-length", "content-range"],
|
|
"mediaflow_endpoint": "hls_manifest_proxy",
|
|
"stream_transformer": "ts_stream", # Use TS transformer for PNG/padding stripping
|
|
}
|