208 lines
7.6 KiB
Python
208 lines
7.6 KiB
Python
# coding=utf-8
|
|
# !/usr/bin/python
|
|
# by嗷呜
|
|
import sys
|
|
import time
|
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
sys.path.append('..')
|
|
from base.spider import Spider
|
|
|
|
|
|
class Spider(Spider):
|
|
|
|
def init(self, extend=""):
|
|
pass
|
|
|
|
def getName(self):
|
|
pass
|
|
|
|
def isVideoFormat(self, url):
|
|
pass
|
|
|
|
def manualVideoCheck(self):
|
|
pass
|
|
|
|
def destroy(self):
|
|
pass
|
|
|
|
rhost='https://www.mgtv.com'
|
|
|
|
host='https://pianku.api.mgtv.com'
|
|
|
|
vhost='https://pcweb.api.mgtv.com'
|
|
|
|
mhost='https://dc.bz.mgtv.com'
|
|
|
|
shost='https://mobileso.bz.mgtv.com'
|
|
|
|
headers = {
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.61 Chrome/126.0.6478.61 Not/A)Brand/8 Safari/537.36',
|
|
'origin': rhost,
|
|
'referer': f'{rhost}/'
|
|
}
|
|
|
|
def homeContent(self, filter):
|
|
result = {}
|
|
cateManual = {
|
|
"电影": "3",
|
|
"电视剧": "2",
|
|
"综艺": "1",
|
|
"动画": "50",
|
|
"少儿": "10",
|
|
"纪录片": "51",
|
|
"教育": "115"
|
|
}
|
|
classes = []
|
|
filters = {}
|
|
for k in cateManual:
|
|
classes.append({
|
|
'type_name': k,
|
|
'type_id': cateManual[k]
|
|
})
|
|
with ThreadPoolExecutor(max_workers=len(classes)) as executor:
|
|
results = executor.map(self.getf, classes)
|
|
for id, ft in results:
|
|
if len(ft):filters[id] = ft
|
|
result['class'] = classes
|
|
result['filters'] = filters
|
|
return result
|
|
|
|
def homeVideoContent(self):
|
|
data=self.fetch(f'{self.mhost}/dynamic/v1/channel/index/0/0/0/1000000/0/0/17/1354?type=17&version=5.0&t={str(int(time.time()*1000))}&_support=10000000', headers=self.headers).json()
|
|
videoList = []
|
|
for i in data['data']:
|
|
if i.get('DSLList') and len(i['DSLList']):
|
|
for j in i['DSLList']:
|
|
if j.get('data') and j['data'].get('items') and len(j['data']['items']):
|
|
for k in j['data']['items']:
|
|
videoList.append({
|
|
'vod_id': k["videoId"],
|
|
'vod_name': k['videoName'],
|
|
'vod_pic': k['img'],
|
|
'vod_year': k.get('cornerTitle'),
|
|
'vod_remarks': k.get('time') or k.get('desc'),
|
|
})
|
|
return {'list':videoList}
|
|
|
|
def categoryContent(self, tid, pg, filter, extend):
|
|
body={
|
|
'allowedRC': '1',
|
|
'platform': 'pcweb',
|
|
'channelId': tid,
|
|
'pn': pg,
|
|
'pc': '80',
|
|
'hudong': '1',
|
|
'_support': '10000000'
|
|
}
|
|
body.update(extend)
|
|
data=self.fetch(f'{self.host}/rider/list/pcweb/v3', params=body, headers=self.headers).json()
|
|
videoList = []
|
|
for i in data['data']['hitDocs']:
|
|
videoList.append({
|
|
'vod_id': i["playPartId"],
|
|
'vod_name': i['title'],
|
|
'vod_pic': i['img'],
|
|
'vod_year': (i.get('rightCorner',{}) or {}).get('text') or i.get('year'),
|
|
'vod_remarks': i['updateInfo']
|
|
})
|
|
result = {}
|
|
result['list'] = videoList
|
|
result['page'] = pg
|
|
result['pagecount'] = 9999
|
|
result['limit'] = 90
|
|
result['total'] = 999999
|
|
return result
|
|
|
|
def detailContent(self, ids):
|
|
vbody={'allowedRC': '1', 'vid': ids[0], 'type': 'b', '_support': '10000000'}
|
|
vdata=self.fetch(f'{self.vhost}/video/info', params=vbody, headers=self.headers).json()
|
|
d=vdata['data']['info']['detail']
|
|
vod = {
|
|
'vod_name': vdata['data']['info']['title'],
|
|
'type_name': d.get('kind'),
|
|
'vod_year': d.get('releaseTime'),
|
|
'vod_area': d.get('area'),
|
|
'vod_lang': d.get('language'),
|
|
'vod_remarks': d.get('updateInfo'),
|
|
'vod_actor': d.get('leader'),
|
|
'vod_director': d.get('director'),
|
|
'vod_content': d.get('story'),
|
|
'vod_play_from': '芒果TV',
|
|
'vod_play_url': ''
|
|
}
|
|
data,pdata=self.fetch_page_data('1', ids[0],True)
|
|
pagecount=data['data'].get('total_page') or 1
|
|
if int(pagecount)>1:
|
|
pages = list(range(2, pagecount+1))
|
|
page_results = {}
|
|
with ThreadPoolExecutor(max_workers=10) as executor:
|
|
future_to_page = {
|
|
executor.submit(self.fetch_page_data, page, ids[0]): page
|
|
for page in pages
|
|
}
|
|
for future in as_completed(future_to_page):
|
|
page = future_to_page[future]
|
|
try:
|
|
result = future.result()
|
|
page_results[page] = result
|
|
except Exception as e:
|
|
print(f"Error fetching page {page}: {e}")
|
|
for page in sorted(page_results.keys()):
|
|
pdata.extend(page_results[page])
|
|
vod['vod_play_url'] = '#'.join(pdata)
|
|
return {'list':[vod]}
|
|
|
|
def searchContent(self, key, quick, pg="1"):
|
|
data=self.fetch(f'{self.shost}/applet/search/v1?channelCode=mobile-wxap&q={key}&pn={pg}&pc=10&_support=10000000', headers=self.headers).json()
|
|
videoList = []
|
|
for i in data['data']['contents']:
|
|
if i.get('data') and len(i['data']):
|
|
k = i['data'][0]
|
|
if k.get('vid') and k.get('img'):
|
|
try:
|
|
videoList.append({
|
|
'vod_id': k['vid'],
|
|
'vod_name': k['title'],
|
|
'vod_pic': k['img'],
|
|
'vod_year': (i.get('rightTopCorner',{}) or {}).get('text') or i.get('year'),
|
|
'vod_remarks': '/'.join(i.get('desc',[])),
|
|
})
|
|
except:
|
|
print(k)
|
|
return {'list':videoList,'page':pg}
|
|
|
|
def playerContent(self, flag, id, vipFlags):
|
|
id=f'{self.rhost}{id}'
|
|
return {'parse': 1, 'url': id, 'header': ''}
|
|
|
|
def localProxy(self, param):
|
|
pass
|
|
|
|
def getf(self, body):
|
|
params = {
|
|
'allowedRC': '1',
|
|
'channelId': body['type_id'],
|
|
'platform': 'pcweb',
|
|
'_support': '10000000',
|
|
}
|
|
data = self.fetch(f'{self.host}/rider/config/channel/v1', params=params, headers=self.headers).json()
|
|
ft = []
|
|
for i in data['data']['listItems']:
|
|
try:
|
|
value_array = [{"n": value['tagName'], "v": value['tagId']} for value in i['items'] if
|
|
value.get('tagName')]
|
|
ft.append({"key": i['eName'], "name": i['typeName'], "value": value_array})
|
|
except:
|
|
print(i)
|
|
return body['type_id'], ft
|
|
|
|
def fetch_page_data(self, page, id, b=False):
|
|
body = {'version': '5.5.35', 'video_id': id, 'page': page, 'size': '30',
|
|
'platform': '4', 'src': 'mgtv', 'allowedRC': '1', '_support': '10000000'}
|
|
data = self.fetch(f'{self.vhost}/episode/list', params=body, headers=self.headers).json()
|
|
ldata = [f'{i["t3"]}${i["url"]}' for i in data['data']['list']]
|
|
if b:
|
|
return data, ldata
|
|
else:
|
|
return ldata
|