feat: add category management, area merge, and homeContent

Co-Authored-By: Claude Opus 4.7 <[email protected]>
This commit is contained in:
Harold
2026-04-20 13:02:45 +08:00
co-authored by Claude Opus 4.7
parent d76fe86f3a
commit 4df593955a
2 changed files with 116 additions and 0 deletions
+38
View File
@@ -53,3 +53,41 @@ class TestJingyuSpider(unittest.TestCase):
self.spider.post = lambda url, **kwargs: FakeInitResponse()
self.spider.init()
self.assertEqual(self.spider.host, "http://example.com")
def test_process_classes_blocks_and_sorts(self):
type_list = [
{"type_id": "0", "type_name": "全部"},
{"type_id": "1", "type_name": "电影"},
{"type_id": "3", "type_name": "综艺"},
{"type_id": "2", "type_name": "电视剧"},
{"type_id": "4", "type_name": "动漫"},
]
classes = self.spider._process_classes(type_list)
names = [c["type_name"] for c in classes]
self.assertNotIn("全部", names)
self.assertEqual(names, ["电影", "电视剧", "综艺", "动漫"])
def test_process_area_filter_merges_mainland_areas(self):
areas = ["全部", "中国大陆", "大陆", "内地", "美国", "日本"]
result = self.spider._process_area_filter(areas)
self.assertIn("大陆", result)
self.assertNotIn("中国大陆", result)
self.assertNotIn("内地", result)
self.assertIn("美国", result)
def test_convert_filters_adds_current_year(self):
import datetime
type_list = [{
"type_id": "1",
"filter_type_list": [
{"name": "year", "list": ["全部", "2024"]},
{"name": "area", "list": ["全部", "中国大陆"]},
]
}]
current = str(datetime.datetime.now().year)
filters = self.spider._convert_filters(type_list)
year_values = [v["v"] for v in filters["1"][0]["value"]]
self.assertIn(current, year_values)
area_values = [v["v"] for v in filters["1"][1]["value"]]
self.assertIn("大陆", area_values)
self.assertNotIn("中国大陆", area_values)
+78
View File
@@ -86,3 +86,81 @@ class Spider(BaseSpider):
except Exception as e:
self.log(f"JSON解析失败: {e}")
return None
CATEGORY_BLOCKED = ["全部"]
CATEGORY_FORCE_ORDER = ["电影", "电视剧", "综艺", "动漫", "短剧"]
AREA_MERGE_DISPLAY = "大陆"
AREA_MERGE_LIST = ["中国大陆", "大陆", "内地"]
def _process_classes(self, type_list):
order_map = {n: i for i, n in enumerate(self.CATEGORY_FORCE_ORDER)}
classes = [
{"type_id": t["type_id"], "type_name": t["type_name"]}
for t in type_list
if t["type_name"] not in self.CATEGORY_BLOCKED
]
classes.sort(key=lambda c: order_map.get(c["type_name"], 999))
return classes
def _process_area_filter(self, area_list):
if not area_list:
return area_list
merge_set = set(self.AREA_MERGE_LIST)
filtered = [a for a in area_list if a not in merge_set]
has_merge = any(a in merge_set for a in area_list)
if has_merge:
try:
idx = filtered.index("全部")
filtered.insert(idx + 1, self.AREA_MERGE_DISPLAY)
except ValueError:
filtered.insert(0, self.AREA_MERGE_DISPLAY)
return filtered
def _convert_filters(self, type_list):
name_map = {"class": "类型", "area": "地区", "lang": "语言", "year": "年份", "sort": "排序"}
current_year = str(time.localtime().tm_year)
filters = {}
for t in type_list:
arr = []
for f in t.get("filter_type_list", []):
key = "by" if f["name"] == "sort" else f["name"]
values = list(f.get("list", []))
if f["name"] == "area":
values = self._process_area_filter(values)
if f["name"] == "year" and current_year not in values:
try:
idx = values.index("全部")
values.insert(idx + 1, current_year)
except ValueError:
values.insert(0, current_year)
arr.append({
"key": key,
"name": name_map.get(f["name"], f["name"]),
"value": [{"n": v, "v": v} for v in values],
})
filters[t["type_id"]] = arr
return filters
def homeContent(self, filter):
self.init()
data = self.init_data
if not data:
return {"class": [], "filters": {}}
classes = self._process_classes(data.get("type_list", []))
filters = self._convert_filters(data.get("type_list", []))
return {"class": classes, "filters": filters}
def homeVideoContent(self):
self.init()
if not self.init_data:
return {"list": []}
videos = []
for t in self.init_data.get("type_list", []):
for item in t.get("recommend_list", []):
videos.append({
"vod_id": str(item.get("vod_id", "")),
"vod_name": item.get("vod_name", ""),
"vod_pic": item.get("vod_pic", ""),
"vod_remarks": item.get("vod_remarks", ""),
})
return {"list": videos}