Route disguised HLS segments natively
This commit is contained in:
+16
-2
@@ -275,6 +275,10 @@ def fetch_bytes_with_retries(url, headers=None, timeout=30, retries=None, retry_
|
||||
time.sleep(delay)
|
||||
|
||||
|
||||
def segment_download_delay_seconds():
|
||||
return float_env("KAIZOKU_SEGMENT_DOWNLOAD_DELAY", 0.0, minimum=0.0)
|
||||
|
||||
|
||||
def fetch_text(url, headers=None, timeout=30):
|
||||
return fetch_bytes(url, headers=headers, timeout=timeout).decode("utf-8", errors="replace")
|
||||
|
||||
@@ -391,13 +395,20 @@ def parse_hls_segments(playlist_url, playlist_text):
|
||||
|
||||
|
||||
def hls_segments_need_native_download(segments):
|
||||
disguised_segment_extensions = {".jpg", ".jpeg", ".png", ".webp", ".ico", ".css", ".js", ".html", ".txt"}
|
||||
for segment in segments or []:
|
||||
path = urlparse(segment.get("url") or "").path
|
||||
parsed = urlparse(segment.get("url") or "")
|
||||
path = parsed.path
|
||||
name = path.rsplit("/", 1)[-1]
|
||||
suffix = Path(name).suffix.lower()
|
||||
if "." not in name:
|
||||
return True
|
||||
if "/ad-site-i18n/" in path:
|
||||
return True
|
||||
if parsed.hostname and parsed.hostname.endswith("snapcdn.top"):
|
||||
return True
|
||||
if suffix in disguised_segment_extensions:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@@ -448,8 +459,11 @@ def download_hls_segments(stream, input_url, target, partial, episode_number=Non
|
||||
percent=0,
|
||||
)
|
||||
last_percent = -1
|
||||
segment_delay = segment_download_delay_seconds()
|
||||
with ts_file.open("wb") as joined:
|
||||
for index, segment in enumerate(segments, start=1):
|
||||
if segment_delay and index > 1:
|
||||
time.sleep(segment_delay)
|
||||
data = fetch_bytes_with_retries(
|
||||
segment["url"],
|
||||
headers=stream.get("headers") or {},
|
||||
@@ -566,7 +580,7 @@ def download_episode(stream, target, episode_number=None, episode_index=None, ep
|
||||
media_url, playlist = hls_media_playlist(stream, input_url)
|
||||
segments = parse_hls_segments(media_url, playlist)
|
||||
if hls_segments_need_native_download(segments):
|
||||
message = "HLS playlist uses extensionless provider segments; skipping direct ffmpeg."
|
||||
message = "HLS playlist uses provider segments that need native download; skipping direct ffmpeg."
|
||||
print(message, flush=True)
|
||||
emit_progress(
|
||||
phase="preflight",
|
||||
|
||||
Reference in New Issue
Block a user