Add curl fallback for protected HLS segments

This commit is contained in:
Dymas
2026-09-07 21:10:46 +02:00
parent ebe749398c
commit 5f75fef4de
6 changed files with 111 additions and 5 deletions
+32
View File
@@ -4529,6 +4529,38 @@ seg-3.ts
self.assertNotIn("Origin", headers)
self.assertEqual(headers["Sec-Fetch-Dest"], "video")
def test_curl_fetch_bytes_returns_body_before_status_marker(self):
proc = mock.Mock(returncode=0, stdout=b"video-bytes\nKAIZOKU_HTTP_STATUS:200", stderr=b"")
with mock.patch.object(provider_downloader, "curl_candidates", return_value=["/usr/bin/curl"]), mock.patch.object(
provider_downloader.subprocess, "run", return_value=proc
) as run:
data = provider_downloader.curl_fetch_bytes("https://cdn.example/segment.ts", headers={"Referer": "https://player.example/"})
self.assertEqual(data, b"video-bytes")
self.assertIn("--header", run.call_args.args[0])
self.assertIn("Referer: https://player.example/", run.call_args.args[0])
def test_fetch_bytes_retries_forbidden_media_with_curl_fallback(self):
error = urllib.error.HTTPError(
"https://cdn.example/segment.ts",
403,
"Forbidden",
hdrs={},
fp=None,
)
try:
with mock.patch.object(provider_downloader.urllib.request, "urlopen", side_effect=error), mock.patch.object(
provider_downloader, "curl_candidates", return_value=["/usr/bin/curl"]
), mock.patch.object(provider_downloader, "curl_fetch_bytes", return_value=b"video") as curl_fetch:
data = provider_downloader.fetch_bytes("https://cdn.example/segment.ts")
finally:
error.close()
self.assertEqual(data, b"video")
curl_fetch.assert_called_once()
def test_hls_segments_need_native_download_for_extensionless_provider_urls(self):
self.assertTrue(
provider_downloader.hls_segments_need_native_download(