芒.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. # -*- coding: utf-8 -*-
  2. # by @嗷呜
  3. import sys
  4. import time
  5. from concurrent.futures import ThreadPoolExecutor, as_completed
  6. sys.path.append('..')
  7. from base.spider import Spider
  8. class Spider(Spider):
  9. def init(self, extend=""):
  10. pass
  11. def getName(self):
  12. pass
  13. def isVideoFormat(self, url):
  14. pass
  15. def manualVideoCheck(self):
  16. pass
  17. def destroy(self):
  18. pass
  19. rhost='https://www.mgtv.com'
  20. host='https://pianku.api.mgtv.com'
  21. vhost='https://pcweb.api.mgtv.com'
  22. mhost='https://dc.bz.mgtv.com'
  23. shost='https://mobileso.bz.mgtv.com'
  24. headers = {
  25. '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',
  26. 'origin': rhost,
  27. 'referer': f'{rhost}/'
  28. }
  29. def homeContent(self, filter):
  30. result = {}
  31. cateManual = {
  32. "电影": "3",
  33. "电视剧": "2",
  34. "综艺": "1",
  35. "动画": "50",
  36. "少儿": "10",
  37. "纪录片": "51",
  38. "教育": "115"
  39. }
  40. classes = []
  41. filters = {}
  42. for k in cateManual:
  43. classes.append({
  44. 'type_name': k,
  45. 'type_id': cateManual[k]
  46. })
  47. with ThreadPoolExecutor(max_workers=len(classes)) as executor:
  48. results = executor.map(self.getf, classes)
  49. for id, ft in results:
  50. if len(ft):filters[id] = ft
  51. result['class'] = classes
  52. result['filters'] = filters
  53. return result
  54. def homeVideoContent(self):
  55. 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()
  56. videoList = []
  57. for i in data['data']:
  58. if i.get('DSLList') and len(i['DSLList']):
  59. for j in i['DSLList']:
  60. if j.get('data') and j['data'].get('items') and len(j['data']['items']):
  61. for k in j['data']['items']:
  62. videoList.append({
  63. 'vod_id': k["videoId"],
  64. 'vod_name': k['videoName'],
  65. 'vod_pic': k['img'],
  66. 'vod_year': k.get('cornerTitle'),
  67. 'vod_remarks': k.get('time') or k.get('desc'),
  68. })
  69. return {'list':videoList}
  70. def categoryContent(self, tid, pg, filter, extend):
  71. body={
  72. 'allowedRC': '1',
  73. 'platform': 'pcweb',
  74. 'channelId': tid,
  75. 'pn': pg,
  76. 'pc': '80',
  77. 'hudong': '1',
  78. '_support': '10000000'
  79. }
  80. body.update(extend)
  81. data=self.fetch(f'{self.host}/rider/list/pcweb/v3', params=body, headers=self.headers).json()
  82. videoList = []
  83. for i in data['data']['hitDocs']:
  84. videoList.append({
  85. 'vod_id': i["playPartId"],
  86. 'vod_name': i['title'],
  87. 'vod_pic': i['img'],
  88. 'vod_year': (i.get('rightCorner',{}) or {}).get('text') or i.get('year'),
  89. 'vod_remarks': i['updateInfo']
  90. })
  91. result = {}
  92. result['list'] = videoList
  93. result['page'] = pg
  94. result['pagecount'] = 9999
  95. result['limit'] = 90
  96. result['total'] = 999999
  97. return result
  98. def detailContent(self, ids):
  99. vbody={'allowedRC': '1', 'vid': ids[0], 'type': 'b', '_support': '10000000'}
  100. vdata=self.fetch(f'{self.vhost}/video/info', params=vbody, headers=self.headers).json()
  101. d=vdata['data']['info']['detail']
  102. vod = {
  103. 'vod_name': vdata['data']['info']['title'],
  104. 'type_name': d.get('kind'),
  105. 'vod_year': d.get('releaseTime'),
  106. 'vod_area': d.get('area'),
  107. 'vod_lang': d.get('language'),
  108. 'vod_remarks': d.get('updateInfo'),
  109. 'vod_actor': d.get('leader'),
  110. 'vod_director': d.get('director'),
  111. 'vod_content': d.get('story'),
  112. 'vod_play_from': '芒果TV',
  113. 'vod_play_url': ''
  114. }
  115. data,pdata=self.fetch_page_data('1', ids[0],True)
  116. pagecount=data['data'].get('total_page') or 1
  117. if int(pagecount)>1:
  118. pages = list(range(2, pagecount+1))
  119. page_results = {}
  120. with ThreadPoolExecutor(max_workers=10) as executor:
  121. future_to_page = {
  122. executor.submit(self.fetch_page_data, page, ids[0]): page
  123. for page in pages
  124. }
  125. for future in as_completed(future_to_page):
  126. page = future_to_page[future]
  127. try:
  128. result = future.result()
  129. page_results[page] = result
  130. except Exception as e:
  131. print(f"Error fetching page {page}: {e}")
  132. for page in sorted(page_results.keys()):
  133. pdata.extend(page_results[page])
  134. vod['vod_play_url'] = '#'.join(pdata)
  135. return {'list':[vod]}
  136. def searchContent(self, key, quick, pg="1"):
  137. data=self.fetch(f'{self.shost}/applet/search/v1?channelCode=mobile-wxap&q={key}&pn={pg}&pc=10&_support=10000000', headers=self.headers).json()
  138. videoList = []
  139. for i in data['data']['contents']:
  140. if i.get('data') and len(i['data']):
  141. k = i['data'][0]
  142. if k.get('vid') and k.get('img'):
  143. try:
  144. videoList.append({
  145. 'vod_id': k['vid'],
  146. 'vod_name': k['title'],
  147. 'vod_pic': k['img'],
  148. 'vod_year': (i.get('rightTopCorner',{}) or {}).get('text') or i.get('year'),
  149. 'vod_remarks': '/'.join(i.get('desc',[])),
  150. })
  151. except:
  152. print(k)
  153. return {'list':videoList,'page':pg}
  154. def playerContent(self, flag, id, vipFlags):
  155. id=f'{self.rhost}{id}'
  156. return {'jx':1,'parse': 1, 'url': id, 'header': ''}
  157. def localProxy(self, param):
  158. pass
  159. def getf(self, body):
  160. params = {
  161. 'allowedRC': '1',
  162. 'channelId': body['type_id'],
  163. 'platform': 'pcweb',
  164. '_support': '10000000',
  165. }
  166. data = self.fetch(f'{self.host}/rider/config/channel/v1', params=params, headers=self.headers).json()
  167. ft = []
  168. for i in data['data']['listItems']:
  169. try:
  170. value_array = [{"n": value['tagName'], "v": value['tagId']} for value in i['items'] if
  171. value.get('tagName')]
  172. ft.append({"key": i['eName'], "name": i['typeName'], "value": value_array})
  173. except:
  174. print(i)
  175. return body['type_id'], ft
  176. def fetch_page_data(self, page, id, b=False):
  177. body = {'version': '5.5.35', 'video_id': id, 'page': page, 'size': '30',
  178. 'platform': '4', 'src': 'mgtv', 'allowedRC': '1', '_support': '10000000'}
  179. data = self.fetch(f'{self.vhost}/episode/list', params=body, headers=self.headers).json()
  180. ldata = [f'{i["t3"]}${i["url"]}' for i in data['data']['list']]
  181. if b:
  182. return data, ldata
  183. else:
  184. return ldata