Try alternate provider episode sources
This commit is contained in:
+72
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user