py_alist.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. # coding=utf-8
  2. # !/usr/bin/python
  3. import sys
  4. sys.path.append('..')
  5. from base.spider import Spider
  6. import json
  7. import re
  8. import difflib
  9. import urllib
  10. class Spider(Spider): # 元类 默认的元类 type
  11. def getName(self):
  12. return "Alist"
  13. def init(self, extend=""):
  14. print("============{0}============".format(extend))
  15. pass
  16. def isVideoFormat(self, url):
  17. pass
  18. def manualVideoCheck(self):
  19. pass
  20. def homeContent(self, filter):
  21. result = {}
  22. cateManual = {
  23. "🔮嗨翻":"https://pan.hikerfans.com",
  24. "🦀9T(Adult)":"https://drive.9t.ee",
  25. "🐱梓澪の妙妙屋":"https://xn--i0v44m.xyz",
  26. "🚆资源小站":"https://pan.142856.xyz",
  27. "🌤晴园的宝藏库":"https://alist.52qy.repl.co",
  28. "🐭米奇妙妙屋":"https://anime.mqmmw.ga",
  29. "💂小兵组网盘影视":"https://6vv.app",
  30. "📀小光盘":"https://alist.xiaoguanxiaocheng.life",
  31. "🐋一只鱼":"https://alist.youte.ml",
  32. "🌊七米蓝":"https://al.chirmyram.com",
  33. "🌴非盘":"http://www.feifwp.top",
  34. "🥼帅盘":"https://hi.shuaipeng.wang",
  35. "🐉神族九帝":"https://alist.shenzjd.com",
  36. "☃姬路白雪":"https://pan.jlbx.xyz",
  37. "🎧听闻网盘":"https://wangpan.sangxuesheng.com",
  38. "💾DISK":"http://124.222.140.243:8080",
  39. "🌨云播放":"https://quanzi.laoxianghuijia.cn",
  40. "✨星梦":"https://pan.bashroot.top",
  41. "🌊小江":"https://dyj.me",
  42. "💫触光":"https://pan.ichuguang.com",
  43. "🕵好汉吧":"https://8023.haohanba.cn",
  44. "🥗AUNEY":"http://121.227.25.116:8008",
  45. "🎡资源小站":"https://960303.xyz/",
  46. "🐝神器云": "https://quanzi.laoxianghuijia.cn",
  47. "🏝fenwe":"http://www.fenwe.tk:5244",
  48. "🎢轻弹浅唱":"https://g.xiang.lol"
  49. }
  50. classes = []
  51. for k in cateManual:
  52. classes.append({
  53. 'type_name': k,
  54. "type_flag": "1",
  55. 'type_id': cateManual[k]
  56. })
  57. result['class'] = classes
  58. if (filter):
  59. result['filters'] = self.config['filter']
  60. return result
  61. def homeVideoContent(self):
  62. result = {
  63. 'list': []
  64. }
  65. return result
  66. ver = ''
  67. baseurl = ''
  68. def getVersion(self, gtid):
  69. param = {
  70. "path": '/'
  71. }
  72. if gtid.count('/') == 2:
  73. gtid = gtid + '/'
  74. baseurl = re.findall(r"http.*://.*?/", gtid)[0]
  75. ver = self.fetch(baseurl + 'api/public/settings', param)
  76. vjo = json.loads(ver.text)['data']
  77. if type(vjo) is dict:
  78. ver = 3
  79. else:
  80. ver = 2
  81. self.ver = ver
  82. self.baseurl = baseurl
  83. def categoryContent(self, tid, pg, filter, extend):
  84. result = {}
  85. if tid.count('/') == 2:
  86. tid = tid + '/'
  87. nurl = re.findall(r"http.*://.*?/", tid)[0]
  88. if self.ver == '' or self.baseurl != nurl:
  89. self.getVersion(tid)
  90. ver = self.ver
  91. baseurl = self.baseurl
  92. if tid.count('/') == 2:
  93. tid = tid + '/'
  94. pat = tid.replace(baseurl,"")
  95. param = {
  96. "path": '/' + pat
  97. }
  98. if ver == 2:
  99. rsp = self.postJson(baseurl + 'api/public/path', param)
  100. jo = json.loads(rsp.text)
  101. vodList = jo['data']['files']
  102. elif ver == 3:
  103. rsp = self.postJson(baseurl + 'api/fs/list', param)
  104. jo = json.loads(rsp.text)
  105. vodList = jo['data']['content']
  106. videos = []
  107. for vod in vodList:
  108. if ver == 2:
  109. img = vod['thumbnail']
  110. elif ver == 3:
  111. img = vod['thumb']
  112. if len(img) == 0:
  113. if vod['type'] == 1:
  114. img = "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png"
  115. if pat != '':
  116. aid = pat + '/'
  117. else:
  118. aid = pat
  119. if vod['type'] == 1:
  120. tag = "folder"
  121. remark = "文件夹"
  122. else:
  123. size = vod['size']
  124. if size > 1024 * 1024 * 1024 * 1024.0:
  125. fs = "TB"
  126. sz = round(size / (1024 * 1024 * 1024 * 1024.0), 2)
  127. elif size > 1024 * 1024 * 1024.0:
  128. fs = "GB"
  129. sz = round(size / (1024 * 1024 * 1024.0), 2)
  130. elif size > 1024 * 1024.0:
  131. fs = "MB"
  132. sz = round(size / (1024 * 1024.0), 2)
  133. elif size > 1024.0:
  134. fs = "KB"
  135. sz = round(size / (1024.0), 2)
  136. else:
  137. fs = "KB"
  138. sz = round(size / (1024.0), 2)
  139. tag = "file"
  140. remark = str(sz) + fs
  141. aid = baseurl + aid + vod['name']
  142. videos.append({
  143. "vod_id": aid,
  144. "vod_name": vod['name'],
  145. "vod_pic": img,
  146. "vod_tag": tag,
  147. "vod_remarks": remark
  148. })
  149. result['list'] = videos
  150. result['page'] = 1
  151. result['pagecount'] = 1
  152. result['limit'] = 999
  153. result['total'] = 999999
  154. return result
  155. def detailContent(self, array):
  156. id = array[0]
  157. if self.ver == '' or self.baseurl == '':
  158. self.getVersion(id)
  159. ver = self.ver
  160. baseurl = self.baseurl
  161. fileName = id.replace(baseurl, "")
  162. dir = re.findall(r"(.*)/", fileName)[0].replace(baseurl, "")
  163. dirparam = {
  164. "path": '/' + dir,
  165. "password": "",
  166. "page_num": 1,
  167. "page_size": 100
  168. }
  169. vod = {
  170. "vod_id": fileName,
  171. "vod_name": dir,
  172. "vod_pic": '',
  173. "vod_tag": '',
  174. "vod_play_from": "播放",
  175. }
  176. if ver == 2:
  177. drsp = self.postJson(baseurl + 'api/public/path', dirparam)
  178. djo = json.loads(drsp.text)
  179. dList = djo['data']['files']
  180. elif ver == 3:
  181. drsp = self.postJson(baseurl + 'api/fs/list', dirparam)
  182. djo = json.loads(drsp.text)
  183. dList = djo['data']['content']
  184. playUrl = ''
  185. for tempd in dList:
  186. if 'mp4' in tempd['name'] or 'mkv' in tempd['name'] or 'TS' in tempd['name'] or 'flv' in tempd['name'] or 'rmvb' in tempd['name'] or 'mp3' in tempd['name'] or 'flac' in tempd['name'] or 'wav' in tempd['name']:
  187. # 开始匹配视频
  188. # 视频名称 name
  189. name = tempd['name']
  190. # 视频链接 url
  191. fname = re.findall(r"(.*)/", fileName)[0] + '/' + name
  192. url = baseurl + fname
  193. # 开始找字幕 subt
  194. vname = re.findall(r"(.*)\.", tempd['name'])[0]
  195. vstr = re.findall(r"\'name\': \'(.*?)\'", str(dList))
  196. if len(vstr) == 2:
  197. suball = vstr
  198. else:
  199. suball = difflib.get_close_matches(vname, vstr, len(dList), cutoff=0.8)
  200. for sub in suball:
  201. if sub.endswith(".ass") or sub.endswith(".srt"):
  202. subt = '@@@' + baseurl + dir + '/' +sub
  203. ifsubt = 'subt' in locals().keys()
  204. if ifsubt is False:
  205. playUrl = playUrl + '{0}${1}#'.format(name, url)
  206. else:
  207. playUrl = playUrl + '{0}${1}{2}#'.format(name, url, subt)
  208. vod['vod_play_url'] = playUrl
  209. result = {
  210. 'list': [
  211. vod
  212. ]
  213. }
  214. return result
  215. def searchContent(self, key, quick):
  216. result = {
  217. 'list': []
  218. }
  219. return result
  220. def playerContent(self, flag, id, vipFlags):
  221. result = {}
  222. ifsub = '@@@' in id
  223. if ifsub is True:
  224. ids = id.split('@@@')
  225. if self.ver == '' or self.baseurl == '':
  226. self.getVersion(ids[1])
  227. ver = self.ver
  228. baseurl = self.baseurl
  229. fileName = ids[1].replace(baseurl, "")
  230. vfileName = ids[0].replace(baseurl, "")
  231. param = {
  232. "path": '/' + fileName,
  233. "password": "",
  234. "page_num": 1,
  235. "page_size": 100
  236. }
  237. vparam = {
  238. "path": '/' + vfileName,
  239. "password": "",
  240. "page_num": 1,
  241. "page_size": 100
  242. }
  243. if ver == 2:
  244. rsp = self.postJson(baseurl + 'api/public/path', param)
  245. jo = json.loads(rsp.text)
  246. vodList = jo['data']['files'][0]
  247. subturl = vodList['url']
  248. vrsp = self.postJson(baseurl + 'api/public/path', vparam)
  249. vjo = json.loads(vrsp.text)
  250. vList = vjo['data']['files'][0]
  251. url = vList['url']
  252. elif ver == 3:
  253. rsp = self.postJson(baseurl + 'api/fs/get', param)
  254. jo = json.loads(rsp.text)
  255. vodList = jo['data']
  256. subturl = vodList['raw_url']
  257. vrsp = self.postJson(baseurl + 'api/fs/get', vparam)
  258. vjo = json.loads(vrsp.text)
  259. vList = vjo['data']
  260. url = vList['raw_url']
  261. if subturl.startswith('http') is False:
  262. head = re.findall(r"h.*?:", baseurl)[0]
  263. subturl = head + subturl
  264. if url.startswith('http') is False:
  265. head = re.findall(r"h.*?:", baseurl)[0]
  266. url = head + url
  267. urlfileName = urllib.parse.quote(fileName)
  268. subturl = subturl.replace(fileName, urlfileName)
  269. urlvfileName = urllib.parse.quote(vfileName)
  270. url = url.replace(vfileName, urlvfileName)
  271. result['subt'] = subturl
  272. else:
  273. if self.ver == '' or self.baseurl == '':
  274. self.getVersion(id)
  275. ver = self.ver
  276. baseurl = self.baseurl
  277. vfileName = id.replace(baseurl, "")
  278. vparam = {
  279. "path": '/' + vfileName,
  280. "password": "",
  281. "page_num": 1,
  282. "page_size": 100
  283. }
  284. if ver == 2:
  285. vrsp = self.postJson(baseurl + 'api/public/path', vparam)
  286. vjo = json.loads(vrsp.text)
  287. vList = vjo['data']['files'][0]
  288. url = vList['url']
  289. elif ver == 3:
  290. vrsp = self.postJson(baseurl + 'api/fs/get', vparam)
  291. vjo = json.loads(vrsp.text)
  292. vList = vjo['data']
  293. url = vList['raw_url']
  294. if url.startswith('http') is False:
  295. head = re.findall(r"h.*?:", baseurl)[0]
  296. url = head + url
  297. urlvfileName = urllib.parse.quote(vfileName)
  298. url = url.replace(vfileName, urlvfileName)
  299. result["parse"] = 0
  300. result["playUrl"] = ''
  301. result["url"] = url
  302. result["header"] = {
  303. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
  304. }
  305. return result
  306. config = {
  307. "player": {},
  308. "filter": {}
  309. }
  310. header = {}
  311. def localProxy(self, param):
  312. return [200, "video/MP2T", action, ""]