feat: add detailContent with line management

Co-Authored-By: Claude Opus 4.7 <[email protected]>
This commit is contained in:
Harold
2026-04-20 13:06:06 +08:00
co-authored by Claude Opus 4.7
parent 91ef4cecb3
commit 9d6929eb3a
2 changed files with 137 additions and 0 deletions
+63
View File
@@ -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"])
+74
View File
@@ -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),
}]
}