From 92ac6fac8c36401c3ff852464ade0ba1be655e14 Mon Sep 17 00:00:00 2001 From: Harold <8866033@gmail.com> Date: Fri, 24 Apr 2026 18:23:30 +0800 Subject: [PATCH] fix: backfill ruyi list covers --- py/tests/test_如意资源.py | 63 +++++++++++++++++++++++++++++++-------- py/如意资源.py | 30 +++++++++++++++++-- 2 files changed, 78 insertions(+), 15 deletions(-) diff --git a/py/tests/test_如意资源.py b/py/tests/test_如意资源.py index 7838187..bd9a9e0 100644 --- a/py/tests/test_如意资源.py +++ b/py/tests/test_如意资源.py @@ -95,22 +95,59 @@ class TestRuYiSpider(unittest.TestCase): ) self.assertEqual(mock_request_json.call_args.args[0], {"ac": "list", "pg": "1", "pagesize": "20"}) + @patch.object(Spider, "_request_json") + def test_home_video_content_enriches_missing_cover_from_videolist(self, mock_request_json): + mock_request_json.side_effect = [ + { + "list": [ + { + "vod_id": "101", + "vod_name": "推荐影片", + "vod_pic": "", + "vod_remarks": "更新至1集", + "vod_year": "2025", + "type_id": "7", + } + ] + }, + { + "list": [ + { + "vod_id": "101", + "vod_pic": "/detail-cover.jpg", + } + ] + }, + ] + result = self.spider.homeVideoContent() + self.assertEqual(result["list"][0]["vod_pic"], "https://ps.ryzypics.com/detail-cover.jpg") + self.assertEqual( + mock_request_json.call_args_list[1].args[0], + {"ac": "videolist", "ids": "101"}, + ) + @patch.object(Spider, "_request_json") def test_category_content_uses_default_sub_type_for_main_class(self, mock_request_json): - mock_request_json.return_value = { - "list": [ - { - "vod_id": "202", - "vod_name": "动作电影", - "vod_pic": "", - "vod_remarks": "HD", - "vod_year": "2024", - "type_id": "7", - } - ] - } + mock_request_json.side_effect = [ + { + "list": [ + { + "vod_id": "202", + "vod_name": "动作电影", + "vod_pic": "", + "vod_remarks": "HD", + "vod_year": "2024", + "type_id": "7", + } + ] + }, + {"list": []}, + ] result = self.spider.categoryContent("1", "2", False, {}) - self.assertEqual(mock_request_json.call_args.args[0], {"ac": "list", "t": "7", "pg": "2", "pagesize": "20"}) + self.assertEqual( + mock_request_json.call_args_list[0].args[0], + {"ac": "list", "t": "7", "pg": "2", "pagesize": "20"}, + ) self.assertEqual(result["page"], 2) self.assertEqual(result["limit"], 20) self.assertEqual(result["list"][0]["vod_id"], "202") diff --git a/py/如意资源.py b/py/如意资源.py index 8fe6421..ca9b5cc 100644 --- a/py/如意资源.py +++ b/py/如意资源.py @@ -152,6 +152,29 @@ class Spider(BaseSpider): ) return result + def _enrich_missing_covers(self, items): + missing_ids = [item["vod_id"] for item in items if not item.get("vod_pic")] + if not missing_ids: + return items + data = self._request_json({"ac": "videolist", "ids": ",".join(missing_ids)}) + cover_map = {} + for item in data.get("list", []) or []: + current = item or {} + vod_id = str(current.get("vod_id", "")).strip() + if not vod_id: + continue + cover = ( + self._get_pic_url(current.get("vod_pic", "")) + or self._get_pic_url(current.get("vod_img", "")) + or self._get_pic_url(current.get("pic", "")) + ) + if cover: + cover_map[vod_id] = cover + for item in items: + if not item.get("vod_pic") and item["vod_id"] in cover_map: + item["vod_pic"] = cover_map[item["vod_id"]] + return items + def _build_filters(self): filters = {} for cls in self.classes: @@ -180,12 +203,14 @@ class Spider(BaseSpider): def homeVideoContent(self): data = self._request_json({"ac": "list", "pg": "1", "pagesize": "20"}) - return {"list": self._format_vod_list(data.get("list", []))} + items = self._format_vod_list(data.get("list", [])) + return {"list": self._enrich_missing_covers(items)} def categoryContent(self, tid, pg, filter, extend): params = {"ac": "list", "t": self._resolve_type_id(tid, extend), "pg": str(pg), "pagesize": "20"} data = self._request_json(params) - return self._page_result(self._format_vod_list(data.get("list", [])), pg, 20) + items = self._enrich_missing_covers(self._format_vod_list(data.get("list", []))) + return self._page_result(items, pg, 20) def searchContent(self, key, quick, pg="1"): keyword = str(key or "").strip() @@ -198,6 +223,7 @@ class Spider(BaseSpider): for item in self._format_vod_list(data.get("list", [])) if keyword.lower() in item["vod_name"].lower() ] + items = self._enrich_missing_covers(items) return self._page_result(items, page, 30) def _parse_play_groups(self, play_from, play_url):