Route disguised HLS segments natively

This commit is contained in:
Dymas
2026-09-05 21:13:41 +02:00
parent a29affd9be
commit a9549cf882
5 changed files with 36 additions and 5 deletions
+16 -2
View File
@@ -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",