py_alistcr.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  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 urllib
  9. class Spider(Spider): # 元类 默认的元类 type
  10. def getName(self):
  11. return "Alist"
  12. def init(self, extend=""):
  13. print("============{0}============".format(extend))
  14. pass
  15. def isVideoFormat(self, url):
  16. pass
  17. def manualVideoCheck(self):
  18. pass
  19. def homeContent(self, filter):
  20. result = {}
  21. cateManual = {
  22. "木偶":"https://www.kugutsu.ml",
  23. "大人":"https://drive.9t.ee",
  24. "大人番":"https://www.kugutsu.ml"
  25. }
  26. classes = []
  27. for k in cateManual:
  28. classes.append({
  29. 'type_name': k,
  30. "type_flag": "1",
  31. 'type_id': cateManual[k]
  32. })
  33. result['class'] = classes
  34. if (filter):
  35. filters = {}
  36. for lk in cateManual:
  37. link = cateManual[lk]
  38. filters.update({
  39. link: [{"key": "nm", "name": "名 称", "value": [{"n": "正序", "v": "False"},{"n": "反序", "v": "True"}]},{"key": "sz", "name": "大 小", "value": [{"n": "升序", "v": "False"},{"n": "降序", "v": "True"}]},{"key": "tp", "name": "类 型", "value": [{"n": "升序", "v": "False"},{"n": "降序", "v": "True"}]},{"key": "tm", "name": "修改时间", "value": [{"n": "升序", "v": "False"},{"n": "降序", "v": "True"}]}]
  40. })
  41. result['filters'] = filters
  42. return result
  43. def homeVideoContent(self):
  44. result = {
  45. 'list': []
  46. }
  47. return result
  48. ver = ''
  49. baseurl = ''
  50. def getVersion(self, gtid):
  51. param = {
  52. "path": '/'
  53. }
  54. if gtid.count('/') == 2:
  55. gtid = gtid + '/'
  56. baseurl = re.findall(r"http.*://.*?/", gtid)[0]
  57. ver = self.fetch(baseurl + 'api/public/settings', param)
  58. vjo = json.loads(ver.text)['data']
  59. if type(vjo) is dict:
  60. ver = 3
  61. else:
  62. ver = 2
  63. self.ver = ver
  64. self.baseurl = baseurl
  65. def categoryContent(self, tid, pg, filter, extend):
  66. result = {}
  67. if tid.count('/') == 2:
  68. tid = tid + '/'
  69. nurl = re.findall(r"http.*://.*?/", tid)[0]
  70. if self.ver == '' or self.baseurl != nurl:
  71. self.getVersion(tid)
  72. ver = self.ver
  73. baseurl = self.baseurl
  74. if tid.count('/') == 2:
  75. tid = tid + '/'
  76. pat = tid.replace(baseurl,"")
  77. param = {
  78. "path": '/' + pat
  79. }
  80. if ver == 2:
  81. rsp = self.postJson(baseurl + 'api/public/path', param)
  82. jo = json.loads(rsp.text)
  83. vodList = jo['data']['files']
  84. elif ver == 3:
  85. rsp = self.postJson(baseurl + 'api/fs/list', param)
  86. jo = json.loads(rsp.text)
  87. vodList = jo['data']['content']
  88. ovodList = vodList
  89. if len(extend) != 0:
  90. if 'tp' in extend:
  91. fl = 'type'
  92. if extend['tp'] == "True":
  93. key = True
  94. if extend['tp'] == "False":
  95. key = False
  96. vodList.sort(key=lambda x: (x['{0}'.format(fl)]), reverse=key)
  97. elif 'sz' in extend:
  98. fl = 'size'
  99. if extend['sz'] == "True":
  100. key = True
  101. if extend['sz'] == "False":
  102. key = False
  103. vodList.sort(key=lambda x: (x['{0}'.format(fl)]), reverse=key)
  104. elif 'nm' in extend:
  105. fl = 'name'
  106. if extend['nm'] == "True":
  107. key = True
  108. if extend['nm'] == "False":
  109. key = False
  110. vodList.sort(key=lambda x: (x['{0}'.format(fl)]), reverse=key)
  111. elif 'tm' in extend:
  112. if ver == 2:
  113. fl = 'updated_at'
  114. elif ver == 3:
  115. fl = 'modified'
  116. if extend['tm'] == "True":
  117. key = True
  118. if extend['tm'] == "False":
  119. key = False
  120. vodList.sort(key=lambda x: (x['{0}'.format(fl)]), reverse=key)
  121. else:
  122. vodList = ovodList
  123. else:
  124. vodList = ovodList
  125. videos = []
  126. cid = ''
  127. purl = ''
  128. svodList = str(vodList)
  129. lenvodList = len(vodList)
  130. substr = str(re.findall(r"\'name\': \'(.*?)\'", svodList))
  131. foldernum = svodList.count('\'type\': 1')
  132. filenum = lenvodList - foldernum
  133. for vod in vodList:
  134. if ver == 2:
  135. img = vod['thumbnail']
  136. elif ver == 3:
  137. img = vod['thumb']
  138. if len(img) == 0:
  139. if vod['type'] == 1:
  140. img = "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png"
  141. if pat != '':
  142. aid = pat + '/'
  143. else:
  144. aid = pat
  145. if vod['type'] == 1:
  146. tag = "folder"
  147. remark = "文件夹"
  148. cid = baseurl + aid + vod['name']
  149. #计算文件大小
  150. else:
  151. size = vod['size']
  152. if size > 1024 * 1024 * 1024 * 1024.0:
  153. fs = "TB"
  154. sz = round(size / (1024 * 1024 * 1024 * 1024.0), 2)
  155. elif size > 1024 * 1024 * 1024.0:
  156. fs = "GB"
  157. sz = round(size / (1024 * 1024 * 1024.0), 2)
  158. elif size > 1024 * 1024.0:
  159. fs = "MB"
  160. sz = round(size / (1024 * 1024.0), 2)
  161. elif size > 1024.0:
  162. fs = "KB"
  163. sz = round(size / (1024.0), 2)
  164. else:
  165. fs = "KB"
  166. sz = round(size / (1024.0), 2)
  167. tag = "file"
  168. remark = str(sz) + fs
  169. cid = baseurl + aid + vod['name']
  170. # 开始爬视频与字幕
  171. if filenum < 150:
  172. if 'mp4' in vod['name'] or 'mkv' in vod['name'] or 'TS' in vod['name'] or 'flv' in vod['name'] or 'rmvb' in vod['name'] or 'mp3' in vod['name'] or 'flac' in vod['name'] or 'wav' in vod['name'] or 'wma' in vod['name'] or 'dff' in vod['name']:
  173. vodurl = vod['name']
  174. # 开始爬字幕
  175. cid = '###'
  176. subname = re.findall(r"(.*)\.", vod['name'])[0]
  177. if filenum == 2:
  178. if '.ass' in substr:
  179. sub = re.findall(r"'(.*)\.ass", substr)[0]
  180. subt = '@@@' + sub + '.ass'
  181. if ',' in sub:
  182. sub = re.findall(r"', '(.*)\.ass", substr)[0]
  183. subt = '@@@' + sub + '.ass'
  184. if '.srt' in substr:
  185. sub = re.findall(r"'(.*)\.srt", substr)[0]
  186. subt = '@@@' + sub + '.srt'
  187. if ',' in sub:
  188. sub = re.findall(r"', '(.*)\.srt", substr)[0]
  189. subt = '@@@' + sub + '.srt'
  190. else:
  191. if '.ass' in substr:
  192. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  193. subname = subname.replace("(","\(").replace(")","\)").replace("[","\[").replace("]","\]")
  194. sub = re.findall(r"{0}.*?\.ass".format(subname), substr)
  195. if len(sub) != 0:
  196. sub = sub[0]
  197. else:
  198. sub = ''
  199. if ',' in sub:
  200. lsub = sub.replace('\'',"").split(', ')
  201. sub = lsub[len(lsub)-1]
  202. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  203. ssubname = subname.replace("\(","(").replace("\)",")").replace("\[","[").replace("\]","]")
  204. if subname in sub:
  205. subt = '@@@' + sub
  206. elif '.srt' in substr:
  207. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  208. subname = subname.replace("(","\(").replace(")","\)").replace("[","\[").replace("]","\]")
  209. sub = re.findall(r'{0}.*?\.srt'.format(subname), substr)
  210. if len(sub) != 0:
  211. sub = sub[0]
  212. else:
  213. sub = ''
  214. if ',' in sub:
  215. lsub = sub.replace('\'',"").split(', ')
  216. sub = lsub[len(lsub)-1]
  217. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  218. subname = subname.replace("\(","(").replace("\)",")").replace("\[","[").replace("\]","]")
  219. if subname in sub:
  220. subt = '@@@' + sub
  221. # 合并链接
  222. if 'subt' in locals().keys():
  223. purl = purl + '{0}{1}#'.format(vodurl, subt)
  224. else:
  225. purl = purl + '{0}#'.format(vodurl)
  226. else:
  227. subname = re.findall(r"(.*)\.", vod['name'])[0]
  228. if '.ass' in substr:
  229. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  230. subname = subname.replace("(","\(").replace(")","\)").replace("[","\[").replace("]","\]")
  231. sub = re.findall(r"{0}.*?\.ass".format(subname), substr)
  232. if len(sub) != 0:
  233. sub = sub[0]
  234. else:
  235. sub = ''
  236. if ',' in sub:
  237. lsub = sub.replace('\'', "").split(', ')
  238. sub = lsub[len(lsub) - 1]
  239. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  240. subname = subname.replace("\(","(").replace("\)",")").replace("\[","[").replace("\]","]")
  241. if subname in sub:
  242. subt = '@@@' + sub
  243. cid = cid + subt
  244. elif '.srt' in substr:
  245. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  246. subname = subname.replace("(","\(").replace(")","\)").replace("[","\[").replace("]","\]")
  247. sub = re.findall(r"{0}.*?\.srt".format(subname), substr)
  248. if len(sub) != 0:
  249. sub = sub[0]
  250. else:
  251. sub = ''
  252. if ',' in sub:
  253. lsub = sub.replace('\'', "").split(', ')
  254. sub = lsub[len(lsub) - 1]
  255. if '(' in subname or ')' in subname or '[' in subname or ']' in subname:
  256. subname = subname.replace("\(","(").replace("\)",")").replace("\[","[").replace("\]","]")
  257. if subname in sub:
  258. subt = '@@@' + sub
  259. cid = cid + subt
  260. videos.append({
  261. "vod_id": cid,
  262. "vod_name": vod['name'],
  263. "vod_pic": img,
  264. "vod_tag": tag,
  265. "vod_remarks": remark
  266. })
  267. if 'purl' in locals().keys():
  268. purl = baseurl + aid + '+++' + purl
  269. for i in range(foldernum, lenvodList):
  270. if videos[i]['vod_id'] == '###':
  271. videos[i]['vod_id'] = purl
  272. result['list'] = videos
  273. result['page'] = 1
  274. result['pagecount'] = 1
  275. result['limit'] = 999
  276. result['total'] = 999999
  277. return result
  278. def detailContent(self, array):
  279. id = array[0]
  280. if '+++' in id:
  281. ids = id.split('+++')
  282. durl = ids[0]
  283. vsList = ids[1].strip('#').split('#')
  284. vsurl = ''
  285. for vs in vsList:
  286. if '@@@' in vs:
  287. dvs = vs.split('@@@')
  288. vname = dvs[0]
  289. vurl = durl + dvs[0]
  290. surl = durl + dvs[1]
  291. vsurl = vsurl + '{0}${1}@@@{2}#'.format(vname, vurl, surl)
  292. else:
  293. vurl = durl + vs
  294. vsurl = vsurl + '{0}${1}#'.format(vs, vurl)
  295. url = vsurl
  296. else:
  297. durl = id
  298. if self.ver == '' or self.baseurl == '':
  299. self.getVersion(durl)
  300. baseurl = self.baseurl
  301. if '+++' in id:
  302. vid = durl.replace(baseurl, "").strip('/')
  303. else:
  304. vid = durl.replace(re.findall(r".*/", durl)[0], "")
  305. url = vid + '$' + id
  306. vod = {
  307. "vod_id": vid,
  308. "vod_name": vid,
  309. "vod_pic": '',
  310. "vod_tag": '',
  311. "vod_play_from": "播放",
  312. "vod_play_url": url
  313. }
  314. result = {
  315. 'list': [
  316. vod
  317. ]
  318. }
  319. return result
  320. def searchContent(self, key, quick):
  321. result = {
  322. 'list': []
  323. }
  324. return result
  325. def playerContent(self, flag, id, vipFlags):
  326. result = {}
  327. url = ''
  328. subturl = ''
  329. ifsub = '@@@' in id
  330. if ifsub is True:
  331. ids = id.split('@@@')
  332. if self.ver == '' or self.baseurl == '':
  333. self.getVersion(ids[1])
  334. ver = self.ver
  335. baseurl = self.baseurl
  336. fileName = ids[1].replace(baseurl, "")
  337. vfileName = ids[0].replace(baseurl, "")
  338. param = {
  339. "path": '/' + fileName,
  340. "password": "",
  341. "page_num": 1,
  342. "page_size": 100
  343. }
  344. vparam = {
  345. "path": '/' + vfileName,
  346. "password": "",
  347. "page_num": 1,
  348. "page_size": 100
  349. }
  350. if ver == 2:
  351. rsp = self.postJson(baseurl + 'api/public/path', param)
  352. jo = json.loads(rsp.text)
  353. vodList = jo['data']['files'][0]
  354. subturl = vodList['url']
  355. vrsp = self.postJson(baseurl + 'api/public/path', vparam)
  356. vjo = json.loads(vrsp.text)
  357. vList = vjo['data']['files'][0]
  358. url = vList['url']
  359. elif ver == 3:
  360. rsp = self.postJson(baseurl + 'api/fs/get', param)
  361. jo = json.loads(rsp.text)
  362. vodList = jo['data']
  363. subturl = vodList['raw_url']
  364. vrsp = self.postJson(baseurl + 'api/fs/get', vparam)
  365. vjo = json.loads(vrsp.text)
  366. vList = vjo['data']
  367. url = vList['raw_url']
  368. if subturl.startswith('http') is False:
  369. head = re.findall(r"h.*?:", baseurl)[0]
  370. subturl = head + subturl
  371. if url.startswith('http') is False:
  372. head = re.findall(r"h.*?:", baseurl)[0]
  373. url = head + url
  374. urlfileName = urllib.parse.quote(fileName)
  375. subturl = subturl.replace(fileName, urlfileName)
  376. urlvfileName = urllib.parse.quote(vfileName)
  377. url = url.replace(vfileName, urlvfileName)
  378. result['subt'] = subturl
  379. else:
  380. if self.ver == '' or self.baseurl == '':
  381. self.getVersion(id)
  382. ver = self.ver
  383. baseurl = self.baseurl
  384. vfileName = id.replace(baseurl, "")
  385. vparam = {
  386. "path": '/' + vfileName,
  387. "password": "",
  388. "page_num": 1,
  389. "page_size": 100
  390. }
  391. if ver == 2:
  392. vrsp = self.postJson(baseurl + 'api/public/path', vparam)
  393. vjo = json.loads(vrsp.text)
  394. vList = vjo['data']['files'][0]
  395. driver = vList['driver']
  396. url = vList['url']
  397. elif ver == 3:
  398. vrsp = self.postJson(baseurl + 'api/fs/get', vparam)
  399. vjo = json.loads(vrsp.text)
  400. vList = vjo['data']
  401. url = vList['raw_url']
  402. driver = vList['provider']
  403. if url.startswith('http') is False:
  404. head = re.findall(r"h.*?:", baseurl)[0]
  405. url = head + url
  406. urlvfileName = urllib.parse.quote(vfileName)
  407. url = url.replace(vfileName, urlvfileName)
  408. if driver == 'Baidu.Disk':
  409. result["header"] = {"User-Agent": "pan.baidu.com"}
  410. result["parse"] = 0
  411. result["playUrl"] = ''
  412. result["url"] = url
  413. return result
  414. flurl = ''
  415. config = {
  416. "player": {},
  417. "filter": {}
  418. }
  419. header = {}
  420. def localProxy(self, param):
  421. return [200, "video/MP2T", action, ""]