feat: add detailContent with line management
Co-Authored-By: Claude Opus 4.7 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
91ef4cecb3
commit
9d6929eb3a
@@ -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
@@ -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),
|
||||
}]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user