Try alternate provider episode sources

This commit is contained in:
Dymas
2026-09-05 09:27:21 +02:00
parent 5718e5fe91
commit a29affd9be
6 changed files with 182 additions and 52 deletions
+72
View File
@@ -4561,6 +4561,78 @@ seg-3.ts
self.assertEqual(fetch_bytes.call_count, 2)
sleep.assert_called_once()
def test_provider_stream_candidates_returns_resolved_sources(self):
with mock.patch.object(
provider_downloader,
"bridge",
return_value={
"sources": [
{"url": "https://cdn.example/one.m3u8", "server": "HD-1"},
{"server": "broken"},
{"url": "https://cdn.example/two.m3u8", "server": "HD-2"},
]
},
):
sources = provider_downloader.provider_stream_candidates("anikoto", "ep1", "dub", "best")
self.assertEqual([source["server"] for source in sources], ["HD-1", "HD-2"])
def test_provider_downloader_tries_next_same_provider_source_after_failure(self):
calls = []
def fake_bridge(command, provider, *args):
if command == "info":
return {"title": "Retry Source Show"}
if command == "episodes":
return {"episodes": [{"number": 1, "id": "ep1"}]}
if command == "resolve-all":
self.assertEqual(args[1], "dub")
return {
"sources": [
{"url": "https://cdn.example/first.m3u8", "server": "HD-1", "type": "dub"},
{"url": "https://cdn.example/second.m3u8", "server": "HD-2", "type": "dub"},
]
}
raise AssertionError(f"unexpected bridge command {command}")
def fake_download(stream, target, episode_number=None, episode_index=None, episode_total=None):
calls.append(stream["server"])
return 1 if stream["server"] == "HD-1" else 0
argv = [
"provider_downloader.py",
"--provider",
"anikoto",
"--show-id",
"anikoto:show-1",
"--title",
"Retry Source Show",
"--episodes",
"1",
"--mode",
"dub",
"--quality",
"best",
"--output-dir",
"/tmp/kaizoku-provider-test",
]
with mock.patch.object(provider_downloader, "bridge", side_effect=fake_bridge), mock.patch.object(
provider_downloader, "download_episode", side_effect=fake_download
), mock.patch.object(provider_downloader, "download_subtitles", return_value=[]), mock.patch.object(
provider_downloader.sys, "argv", argv
):
with self.assertRaises(SystemExit) as raised:
provider_downloader.main()
self.assertEqual(raised.exception.code, 0)
self.assertEqual(calls, ["HD-1", "HD-2"])
def test_provider_bridge_resolve_does_not_fallback_from_dub_to_sub(self):
bridge_js = (ROOT / "providers" / "bridge.js").read_text(encoding="utf-8")
self.assertNotIn('mode === "dub"', bridge_js)
self.assertNotIn('fetchEpisodeSources(episodeId, "sub")', bridge_js)
class DockerfilePackagingTests(unittest.TestCase):
def test_provider_updates_module_is_copied_into_image(self):