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": ""}