fix: backfill ruyi list covers

This commit is contained in:
Harold
2026-04-24 18:23:30 +08:00
parent e7ef9b7f25
commit 92ac6fac8c
2 changed files with 78 additions and 15 deletions
+50 -13
View File
@@ -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")
+28 -2
View File
@@ -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):