From b72587d86b2cabde011365d3078b784fb925eb08 Mon Sep 17 00:00:00 2001 From: Harold <8866033@gmail.com> Date: Sat, 18 Apr 2026 12:04:40 +0800 Subject: [PATCH] feat: finish dbku spider implementation --- py/tests/test_dbku.py | 22 ++++++++++++++++++++++ py/独播库.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/py/tests/test_dbku.py b/py/tests/test_dbku.py index 0e01dfc..3dbb220 100644 --- a/py/tests/test_dbku.py +++ b/py/tests/test_dbku.py @@ -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 = """ + + """ + 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 = [ + '', + '', + ] + 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() diff --git a/py/独播库.py b/py/独播库.py index 6e74d97..d48eb4d 100644 --- a/py/独播库.py +++ b/py/独播库.py @@ -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": ""}