```
feat(PyramidStore): 初始化项目并添加基础配置文件 添加 .gitignore 忽略子仓库的 .git 目录 添加 LICENSE 文件,使用 GNU General Public License v3.0 添加 README.md 说明文档,包含调试示例、免责声明和配置说明 添加 base/localProxy.py 基础代理配置文件 添加版本控制图片文件(二进制差异) ```
This commit is contained in:
118
py/adult/cam4.py
Normal file
118
py/adult/cam4.py
Normal file
@@ -0,0 +1,118 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import json
|
||||
import time
|
||||
from base.spider import Spider
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "Cam4直播"
|
||||
|
||||
def init(self, extend=""):
|
||||
self.base = "https://zh.cam4.com"
|
||||
self.headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
|
||||
}
|
||||
return self
|
||||
|
||||
def homeContent(self, filter):
|
||||
classes = [
|
||||
{"type_id": "all", "type_name": "全部"},
|
||||
{"type_id": "female", "type_name": "女性"},
|
||||
{"type_id": "male", "type_name": "男性"},
|
||||
{"type_id": "couples", "type_name": "情侣"},
|
||||
{"type_id": "shemale", "type_name": "变性"},
|
||||
]
|
||||
return {"class": classes}
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
if not pg:
|
||||
pg = 1
|
||||
params = f"?directoryJson=true&online=true&url=true&page={pg}"
|
||||
if tid == "female":
|
||||
params += "&gender=female"
|
||||
elif tid == "male":
|
||||
params += "&gender=male"
|
||||
elif tid == "couples":
|
||||
params += "&broadcastType=male_female_group"
|
||||
elif tid == "shemale":
|
||||
params += "&gender=shemale"
|
||||
|
||||
url = f"{self.base}/directoryCams{params}"
|
||||
rsp = self.fetch(url, headers=self.headers)
|
||||
data = rsp.text
|
||||
try:
|
||||
jRoot = json.loads(data)
|
||||
except:
|
||||
return {"list": []}
|
||||
|
||||
videos = []
|
||||
for u in jRoot.get("users", []):
|
||||
title = f"{u.get('username')} ({u.get('countryCode', '')})"
|
||||
if "age" in u:
|
||||
title += f" - {u['age']}岁"
|
||||
if "resolution" in u:
|
||||
res = u["resolution"].split(":")[-1]
|
||||
title += f" [HD:{res}]"
|
||||
video = {
|
||||
"vod_id": u.get("hlsPreviewUrl"),
|
||||
"vod_name": title,
|
||||
"vod_pic": u.get("snapshotImageLink", ""),
|
||||
"vod_remarks": u.get("statusMessage", ""),
|
||||
}
|
||||
videos.append(video)
|
||||
|
||||
result = {
|
||||
"list": videos,
|
||||
"page": int(pg),
|
||||
"pagecount": 9999,
|
||||
"limit": 90,
|
||||
"total": len(videos)
|
||||
}
|
||||
return result
|
||||
|
||||
def detailContent(self, ids):
|
||||
id = ids[0]
|
||||
vod = {
|
||||
"vod_id": id,
|
||||
"vod_name": "Cam4直播",
|
||||
"vod_pic": "",
|
||||
"vod_play_from": "Cam4",
|
||||
"vod_play_url": f"直播源${id}",
|
||||
}
|
||||
return {"list": [vod]}
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
play_url = id
|
||||
return {
|
||||
"parse": 0,
|
||||
"playUrl": "",
|
||||
"url": play_url,
|
||||
"header": self.headers
|
||||
}
|
||||
|
||||
def searchContent(self, key, quick, pg="1"):
|
||||
url = f"{self.base}/directoryCams?directoryJson=true&online=true&url=true&showTag={key}&page={pg}"
|
||||
rsp = self.fetch(url, headers=self.headers)
|
||||
data = rsp.text
|
||||
try:
|
||||
jRoot = json.loads(data)
|
||||
except:
|
||||
return {"list": []}
|
||||
|
||||
videos = []
|
||||
for u in jRoot.get("users", []):
|
||||
title = f"{u.get('username')} ({u.get('countryCode', '')})"
|
||||
video = {
|
||||
"vod_id": u.get("hlsPreviewUrl"),
|
||||
"vod_name": title,
|
||||
"vod_pic": u.get("snapshotImageLink", ""),
|
||||
"vod_remarks": u.get("statusMessage", ""),
|
||||
}
|
||||
videos.append(video)
|
||||
return {"list": videos}
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
return ".m3u8" in url
|
||||
|
||||
def manualVideoCheck(self):
|
||||
return True
|
Reference in New Issue
Block a user