TV-BOX/tvbox/江湖/py/新荐片.py
yuanwangokk-1 7fb1457e88 main
2025-10-14 22:54:33 +08:00

147 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
# by @嗷呜
import concurrent.futures
import json
import sys
sys.path.append('..')
from base.spider import Spider
class Spider(Spider):
def init(self, extend=""):
self.ihost=self.imgsite()
pass
def getName(self):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def destroy(self):
pass
host='https://api.ubj83.com'
headers={
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; M2012K10C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;webank/h5face;webank/1.0;netType:NETWORK_WIFI;appVersion:416;packageName:com.jp3.xg3',
'Accept': 'application/json, text/plain, */*',
'x-requested-with': 'com.jp3.xg3',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
}
def imgsite(self):
data=self.fetch(f"{self.host}/api/appAuthConfig",headers=self.headers).json()
host=data['data']['imgDomain']
return host if host.startswith('http') else f"https://{host}"
def getfts(self,id):
data=self.fetch(f"{self.host}/api/crumb/filterOptions",params={'fcate_pid':id},headers=self.headers).json()
fts=[{
'key': i['key'],
'name':i['key'],
'value': [{
'n': j['name'],
'v': j['id']
} for j in i['data']]
} for i in data['data']]
return id,fts
def build_cl(self,data,tid=''):
videos=[]
for i in data:
text=json.dumps(i.get('res_categories',[]))
videos.append({
'vod_id': f"{i.get('id')}@{'67' if json.dumps('短剧') in text and '67' in text else tid}",
'vod_name': i.get('title'),
'vod_pic': f"{self.ihost}{i.get('path') or i.get('cover_image') or i.get('thumbnail')}",
'vod_remarks': i.get('mask'),
'vod_year': i.get('score'),
})
return videos
def homeContent(self, filter):
result = {}
cdata=self.fetch(f"{self.host}/api/term/home_fenlei",headers=self.headers).json()
hdata=self.fetch(f"{self.host}/api/dyTag/hand_data",params={'category_id':cdata['data'][0]['id']},headers=self.headers).json()
classes = []
filters = {}
for k in cdata['data']:
if 'abbr' in k:
classes.append({
'type_name': k['name'],
'type_id': k['id']
})
with concurrent.futures.ThreadPoolExecutor(max_workers=len(classes)) as executor:
future_to_aid = {
executor.submit(self.getfts, aid['type_id']): aid['type_id']
for aid in classes
}
for future in concurrent.futures.as_completed(future_to_aid):
aid = future_to_aid[future]
try:
aid_id, fts = future.result()
filters[aid_id] = fts
except Exception as e:
print(f"Error processing aid {aid}: {e}")
result['class'] = classes
result['filters'] = filters
result['list'] = [item for i in hdata['data'].values() for item in self.build_cl(i)]
return result
def homeVideoContent(self):
pass
def categoryContent(self, tid, pg, filter, extend):
params={**{'fcate_pid': tid, 'page': pg}, **extend}
path= '/api/crumb/shortList' if tid=='67' else '/api/crumb/list'
data=self.fetch(f"{self.host}{path}",params=params,headers=self.headers).json()
result = {}
result['list'] = self.build_cl(data['data'],tid)
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def detailContent(self, ids):
ids=ids[0].split('@')
path, ikey = ('/api/detail', 'vid') if ids[-1] == '67' else ('/api/video/detailv2', 'id')
data=self.fetch(f"{self.host}{path}",params={ikey:ids[0]},headers=self.headers).json()
v=data['data']
if ids[-1]=='67':
pdata=v.get('playlist',[])
n,p=[pdata[0].get('source_config_name')],['#'.join([f"{i.get('title')}${i['url']}" for i in pdata])]
else:
n,p=[],[]
for i in v.get('source_list_source',[]):
n.append(i.get('name'))
p.append('#'.join([f"{j.get('source_name') or j.get('weight')}${j['url']}" for j in i.get('source_list',[])]))
vod = {
'type_name': '/'.join([i.get('name') for i in v.get('types',[])]),
'vod_year': v.get('year'),
'vod_area': v.get('area'),
'vod_remarks': v.get('update_cycle'),
'vod_actor': '/'.join([i.get('name') for i in v.get('actors',[])]),
'vod_content': v.get('description'),
'vod_play_from': '$$$'.join(n),
'vod_play_url': '$$$'.join(p)
}
return {'list':[vod]}
def searchContent(self, key, quick, pg="1"):
data=self.fetch(f"{self.host}/api/v2/search/videoV2",params={'key':key,'page':pg,'pageSize':20},headers=self.headers).json()
return {'list':self.build_cl(data['data']),'page':pg}
def playerContent(self, flag, id, vipFlags):
return {'parse': 0, 'url': id, 'header': {'User-Agent':self.headers['User-Agent']}}
def localProxy(self, param):
pass
def liveContent(self, url):
pass