From 4df593955ac03da10f499eb7224c68003f129165 Mon Sep 17 00:00:00 2001 From: Harold <8866033@gmail.com> Date: Mon, 20 Apr 2026 13:02:45 +0800 Subject: [PATCH] feat: add category management, area merge, and homeContent Co-Authored-By: Claude Opus 4.7 --- py/tests/test_鲸鱼APP.py | 38 ++++++++++++++++++++ py/鲸鱼APP.py | 78 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) diff --git a/py/tests/test_鲸鱼APP.py b/py/tests/test_鲸鱼APP.py index ec24065..d7c5eed 100644 --- a/py/tests/test_鲸鱼APP.py +++ b/py/tests/test_鲸鱼APP.py @@ -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) diff --git a/py/鲸鱼APP.py b/py/鲸鱼APP.py index 73b1239..b0868ef 100644 --- a/py/鲸鱼APP.py +++ b/py/鲸鱼APP.py @@ -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}