mirror of
https://github.com/yuanwangokk-1/TV-BOX.git
synced 2025-10-24 23:11:21 +00:00
147 lines
5.4 KiB
Python
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
|