diff --git a/py/tests/test_鲸鱼APP.py b/py/tests/test_鲸鱼APP.py index 4b40d61..64a200e 100644 --- a/py/tests/test_鲸鱼APP.py +++ b/py/tests/test_鲸鱼APP.py @@ -130,3 +130,66 @@ class TestJingyuSpider(unittest.TestCase): self.assertEqual(len(ids), 2) self.assertIn("1", ids) self.assertIn("2", ids) + + def test_detail_content_builds_play_lines(self): + detail_data = { + "vod": { + "vod_name": "测试影片", + "vod_pic": "http://pic.jpg", + "vod_remarks": "HD", + "vod_content": "简介", + "vod_actor": "演员张三", + "vod_director": "导演李四", + "vod_year": "2025", + "vod_area": "大陆", + }, + "vod_play_list": [ + { + "player_info": { + "show": "线路一", + "parse": "http://parse.com/", + "player_parse_type": "1", + "parse_type": "1", + }, + "urls": [ + {"name": "第1集", "url": "http://play/1", "token": "tok1"}, + {"name": "第2集", "url": "http://play/2", "token": "tok2"}, + ], + }, + ], + } + + self.spider._api_post = lambda ep, payload=None: detail_data if "vodDetail" in ep else None + self.spider.host = "http://test.com" + self.spider.init_data = {} + result = self.spider.detailContent(["123"]) + vod = result["list"][0] + self.assertEqual(vod["vod_name"], "测试影片") + self.assertEqual(vod["vod_year"], "2025年") + self.assertIn("线路一", vod["vod_play_from"]) + self.assertIn("第1集$", vod["vod_play_url"]) + self.assertIn("第2集$", vod["vod_play_url"]) + + def test_detail_content_filters_junk_lines(self): + detail_data = { + "vod": {"vod_name": "X", "vod_pic": "", "vod_remarks": "", "vod_content": "", + "vod_actor": "", "vod_director": "", "vod_year": "", "vod_area": ""}, + "vod_play_list": [ + { + "player_info": {"show": "防走丢群", "parse": "", "player_parse_type": "0", "parse_type": "0"}, + "urls": [{"name": "链接", "url": "http://x", "token": ""}], + }, + { + "player_info": {"show": "正式线路", "parse": "", "player_parse_type": "0", "parse_type": "0"}, + "urls": [{"name": "第1集", "url": "http://y", "token": ""}], + }, + ], + } + + self.spider._api_post = lambda ep, payload=None: detail_data + self.spider.host = "http://test.com" + self.spider.init_data = {} + result = self.spider.detailContent(["1"]) + vod = result["list"][0] + self.assertIn("1线", vod["vod_play_from"]) + self.assertIn("正式线路", vod["vod_play_from"]) diff --git a/py/鲸鱼APP.py b/py/鲸鱼APP.py index 9b77b66..b3e39bc 100644 --- a/py/鲸鱼APP.py +++ b/py/鲸鱼APP.py @@ -220,3 +220,77 @@ class Spider(BaseSpider): "vod_remarks": item.get("vod_remarks", ""), }) return {"list": items, "page": page, "limit": 90, "total": 999999} + + JUNK_KEYWORDS = ["防走丢", "群", "防失群", "官网"] + + def detailContent(self, ids): + self.init() + vod_id = ids[0] + data = None + for endpoint in ["vodDetail", "vodDetail2"]: + try: + data = self._api_post(endpoint, {"vod_id": vod_id}) + if data: + break + except Exception: + continue + if not data: + return {"list": []} + + vod = data.get("vod", {}) + lines = [] + name_count = {} + line_id = 1 + + for line in data.get("vod_play_list", []): + info = line.get("player_info", {}) + name = info.get("show", "") + + if any(kw in name for kw in self.JUNK_KEYWORDS): + name = f"{line_id}线" + info["show"] = name + + count = name_count.get(name, 0) + 1 + name_count[name] = count + if count > 1: + name = f"{name}{count}" + info["show"] = name + + urls = line.get("urls", []) + if not urls: + line_id += 1 + continue + + play_items = [] + for ep in urls: + payload = ",".join([ + info.get("parse", ""), + ep.get("url", ""), + "token+" + ep.get("token", ""), + str(info.get("player_parse_type", "")), + str(info.get("parse_type", "")), + ]) + play_items.append(f"{ep.get('name', '')}${name}@@direct@@{payload}") + + if play_items: + lines.append({ + "display": name, + "urls": "#".join(play_items), + }) + line_id += 1 + + return { + "list": [{ + "vod_id": vod_id, + "vod_name": vod.get("vod_name", ""), + "vod_pic": vod.get("vod_pic", ""), + "vod_remarks": vod.get("vod_remarks", ""), + "vod_content": vod.get("vod_content", ""), + "vod_actor": (vod.get("vod_actor") or "").replace("演员", ""), + "vod_director": (vod.get("vod_director") or "").replace("导演", ""), + "vod_year": (vod.get("vod_year") or "") + "年" if vod.get("vod_year") else "", + "vod_area": vod.get("vod_area", ""), + "vod_play_from": "$$$".join(l["display"] for l in lines), + "vod_play_url": "$$$".join(l["urls"] for l in lines), + }] + }