fix: compress ddys detail ids

This commit is contained in:
Harold
2026-04-19 19:29:25 +08:00
parent a616e00402
commit 84356c068b
2 changed files with 21 additions and 7 deletions
+5 -5
View File
@@ -53,7 +53,7 @@ class TestDDYSSpider(unittest.TestCase):
cards,
[
{
"vod_id": "https://ddys.io/movie/test-title/",
"vod_id": "movie/test-title",
"vod_name": "测试电影",
"vod_pic": "https://ddys.io/poster.jpg",
"vod_remarks": "HD",
@@ -137,7 +137,7 @@ class TestDDYSSpider(unittest.TestCase):
kwargs = mock_request_html.call_args.kwargs
self.assertEqual(kwargs["method"], "POST")
self.assertEqual(kwargs["data"], "q=%E7%B9%81%E8%8A%B1")
self.assertEqual(result["list"][0]["vod_id"], "https://ddys.io/anime/result/")
self.assertEqual(result["list"][0]["vod_id"], "anime/result")
self.assertEqual(result["pagecount"], 2)
def test_parse_detail_page_merges_direct_and_pan_sources(self):
@@ -158,7 +158,7 @@ class TestDDYSSpider(unittest.TestCase):
</div>
</html>
"""
vod = self.spider._parse_detail_page(html, "https://ddys.io/anime/demo/")
vod = self.spider._parse_detail_page(html, "anime/demo")
self.assertEqual(vod["vod_name"], "低端示例")
self.assertEqual(vod["vod_pic"], "https://ddys.io/poster-detail.jpg")
self.assertEqual(vod["vod_year"], "2025")
@@ -188,9 +188,9 @@ class TestDDYSSpider(unittest.TestCase):
<h1 class="text-xl md:text-3xl">详情标题</h1>
<button onclick="switchSource(1, '/play/detail-demo', 'mp4')">直连</button>
"""
result = self.spider.detailContent(["https://ddys.io/movie/demo/"])
result = self.spider.detailContent(["movie/demo"])
self.assertEqual(mock_request_html.call_args.args[0], "https://ddys.io/movie/demo/")
self.assertEqual(result["list"][0]["vod_id"], "https://ddys.io/movie/demo/")
self.assertEqual(result["list"][0]["vod_id"], "movie/demo")
self.assertEqual(result["list"][0]["vod_name"], "详情标题")
self.assertEqual(result["list"][0]["vod_play_from"], "直连")
self.assertEqual(result["list"][0]["vod_play_url"], "全集$/play/detail-demo")
+16 -2
View File
@@ -157,6 +157,17 @@ class Spider(BaseSpider):
return self.host + raw
return self.host + "/" + raw
def _extract_site_path_id(self, href):
full = self._build_url(href)
matched = re.search(r"https?://[^/]+/(movie|series|variety|anime)/([^/?#]+)/?$", full)
if not matched:
return ""
return f"{matched.group(1)}/{matched.group(2)}"
def _build_detail_request_url(self, vod_id):
value = self._stringify(vod_id).strip().strip("/")
return self._build_url(value + "/") if value else ""
def _build_category_url(self, tid, pg, extend):
values = dict(self.filter_def.get(str(tid), {"cateId": str(tid)}))
values.update(self._normalize_ext(extend))
@@ -201,7 +212,7 @@ class Spider(BaseSpider):
or ((node.xpath(".//img[1]/@data-src") or [""])[0]).strip()
)
remarks = self._clean_text("".join(node.xpath(".//*[contains(@class,'poster-badge')][1]//text()")))
vod_id = self._build_url(href)
vod_id = self._extract_site_path_id(href)
if not vod_id or not title or vod_id in seen:
continue
seen.add(vod_id)
@@ -332,7 +343,10 @@ class Spider(BaseSpider):
vod_id = self._stringify(raw_id).strip()
if not vod_id:
continue
vod = self._parse_detail_page(self._request_html(vod_id), vod_id)
request_url = self._build_detail_request_url(vod_id)
if not request_url:
continue
vod = self._parse_detail_page(self._request_html(request_url), vod_id)
result["list"].append(vod)
return result