diff --git a/py/tests/test_低端影视.py b/py/tests/test_低端影视.py index 7ceddca..dbd4629 100644 --- a/py/tests/test_低端影视.py +++ b/py/tests/test_低端影视.py @@ -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): """ - 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):

详情标题

""" - 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") diff --git a/py/低端影视.py b/py/低端影视.py index 74a2796..81743b9 100644 --- a/py/低端影视.py +++ b/py/低端影视.py @@ -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