feat: finish dbku spider implementation

This commit is contained in:
Harold
2026-04-18 12:04:40 +08:00
parent 6a060f8214
commit b72587d86b
2 changed files with 50 additions and 0 deletions
+22
View File
@@ -155,6 +155,28 @@ class TestDBKUSpider(unittest.TestCase):
"https://video.example/trimmed.m3u8",
)
@patch.object(Spider, "_request_html")
def test_player_content_returns_decoded_direct_url(self, mock_request_html):
mock_request_html.return_value = """
<script>
var player_data = {"url":"https://video.example/final.m3u8","encrypt":"0"};
</script>
"""
result = self.spider.playerContent("独播库", "https://www.dbku.tv/vodplay/100-1-1.html", {})
self.assertEqual(result["parse"], 0)
self.assertEqual(result["url"], "https://video.example/final.m3u8")
self.assertEqual(result["header"]["Referer"], "https://www.dbku.tv/vodplay/100-1-1.html")
@patch.object(Spider, "_request_html")
def test_player_content_follows_internal_jump(self, mock_request_html):
mock_request_html.side_effect = [
'<script>var player_data = {"url":"/vodplay/100-1-2.html","encrypt":"0"};</script>',
'<script>var player_data = {"url":"https://video.example/jump-final.m3u8","encrypt":"0"};</script>',
]
result = self.spider.playerContent("独播库", "https://www.dbku.tv/vodplay/100-1-1.html", {})
self.assertEqual(result["parse"], 0)
self.assertEqual(result["url"], "https://video.example/jump-final.m3u8")
if __name__ == "__main__":
unittest.main()
+28
View File
@@ -246,3 +246,31 @@ class Spider(BaseSpider):
return raw
except Exception:
return raw
def _build_player_headers(self, referer):
return {
"User-Agent": self.headers["User-Agent"],
"Referer": referer,
}
def playerContent(self, flag, id, vipFlags):
current = id
for _ in range(3):
html = self._request_html(current, referer=self.host)
data = self._parse_player_data(html)
if not data:
return {"parse": 0, "playUrl": "", "url": ""}
decoded = self._decode_play_url_by_encrypt(data.get("url", ""), data.get("encrypt", 0))
play_url = self._build_url(decoded)
if not play_url:
return {"parse": 0, "playUrl": "", "url": ""}
if self.host in play_url and "/vodplay/" in play_url and play_url != current:
current = play_url
continue
return {
"parse": 0,
"playUrl": "",
"url": play_url,
"header": self._build_player_headers(current),
}
return {"parse": 0, "playUrl": "", "url": ""}