feat: add category management, area merge, and homeContent
Co-Authored-By: Claude Opus 4.7 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
d76fe86f3a
commit
4df593955a
@@ -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
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user