123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- # coding=utf-8
- # !/usr/bin/python
- import sys
- import json
- import time
- from os.path import splitext
- sys.path.append('..')
- from base.spider import Spider
- class Spider(Spider): # 元类 默认的元类 type
- alisttoken = ''
- def getName(self):
- return "Alist"
- def init(self, extend):
- try:
- self.ext = extend
- except:
- self.ext = ''
- def isVideoFormat(self, url):
- pass
- def manualVideoCheck(self):
- pass
- def homeContent(self, filter):
- result = {}
- if self.ext.startswith('http'):
- url = self.ext
- drivers = self.fetch(url, headers=self.header, timeout=5).json()['drives']
- else:
- drivers = json.loads(self.ext)['drives']
- classes = []
- for driver in drivers:
- if 'hidden' in driver and driver['hidden']:
- continue
- tid = driver['server']
- if 'login' in driver:
- tid = tid + '&&&login' + json.dumps(driver['login'], ensure_ascii=False)
- if 'params' in driver:
- tid = tid + '&&¶ms' + json.dumps(driver['params'], ensure_ascii=False)
- classes.append({
- 'type_name': driver['name'],
- 'type_id': tid
- })
- result['class'] = classes
- return result
- def homeVideoContent(self):
- result = {}
- return result
- def categoryContent(self, cid, page, filter, ext):
- result = {}
- login = {}
- params = []
- password = ''
- if '&&&' in cid:
- cidList = cid.split('&&&')
- url = cidList[0]
- for cL in cidList:
- if cL.startswith('login'):
- login = json.loads(cL.replace('login', ''))
- elif cL.startswith('params'):
- params = json.loads(cL.replace('params', ''))
- else:
- url = cid
- if url.count('/') == 2:
- url = url + '/'
- header = self.header.copy()
- baseUrl = self.getCache('baseUrl')
- if not baseUrl:
- baseUrl = self.regStr(reg="(http.*://.*?/)", src=url)
- header['Referer'] = baseUrl
- token = self.getCache('token')
- if token:
- token = token['token']
- else:
- data = self.postJson(baseUrl + 'api/auth/login', json=login, headers=header).json()
- if data['code'] == 200:
- token = data['data']['token']
- self.setCache('token', {'token': token, 'expiresAt': int(time.time()) + 86400})
- header['Authorization'] = token
- path = '/' + url.replace(baseUrl, "")
- for param in params:
- if param['path'].startswith(path) and 'pass' in param:
- password = param['pass']
- break
- param = {
- "path": path,
- 'password': password
- }
- data = self.postJson(baseUrl + 'api/fs/list', json=param, headers=header).json()
- vodList = data['data']['content']
- videos = []
- subtList = []
- playList = []
- for vod in vodList:
- if len(vod['thumb']) == 0:
- img = "https://api-lmteam.koyeb.app/files/alist.png"
- elif vod['thumb'].startswith('http'):
- img = vod['thumb']
- else:
- img = baseUrl.strip('/') + vod['thumb']
- if path != '/':
- aid = path.strip('/') + '/'
- else:
- aid = path.strip('/')
- if vod['type'] == 1:
- tag = "folder"
- remark = "文件夹"
- cid = baseUrl + aid + vod['name']
- else:
- if splitext(vod['name'])[1] in ['.mp4', '.mpg', '.mkv', '.ts', '.TS', '.avi', '.flv', '.rmvb', '.mp3', '.flac', '.wav', '.wma', '.dff']:
- size = self.getSize(vod['size'])
- tag = "file"
- remark = size
- cid = baseUrl + aid + vod['name']
- playList.append(vod['name'])
- elif splitext(vod['name'])[1] in ['.ass', '.ssa', '.srt']:
- cid = baseUrl + aid + vod['name']
- subtList.append(vod['name'])
- continue
- else:
- continue
- if login != {}:
- cid = cid + '&&&login' + json.dumps(login, ensure_ascii=False)
- elif params != []:
- cid = cid + '&&¶ms' + json.dumps(params, ensure_ascii=False)
- videos.append({
- "vod_id": cid,
- "vod_name": vod['name'],
- "vod_pic": img,
- "vod_tag": tag,
- "vod_remarks": remark
- })
- if playList != []:
- cid = baseUrl + aid
- for pL in playList:
- cid = cid + '!!!' + pL
- if login != {}:
- cid = cid + '&&&login' + json.dumps(login, ensure_ascii=False)
- elif params != []:
- cid = cid + '&&¶ms' + json.dumps(params, ensure_ascii=False)
- videos.insert(0, {
- "vod_id": cid,
- "vod_name": '播放列表',
- "vod_pic": "https://avatars.githubusercontent.com/u/97389433?s=200&v=4",
- "vod_tag": 'file',
- "vod_remarks": path
- })
- if subtList != []:
- self.setCache(f"subtList_{cid[:cid.rfind('/')]}", {'subtList': subtList, 'expiresAt': int(time.time()) + 86400})
- result['list'] = videos
- result['page'] = 1
- result['pagecount'] = 1
- result['limit'] = len(videos)
- result['total'] = len(videos)
- return result
- def detailContent(self, did):
- did = did[0]
- if '&&&' in did:
- pos = did.index('&&&')
- url = did[:pos]
- append = did[pos:]
- else:
- url = did
- append = ''
- name = url[url.strip('/').rfind('/') + 1:].strip('/')
- if '!!!' in url:
- urls = url.split('!!!')
- fileList = urls[1:]
- url = urls[0]
- playUrl = ''
- for file in fileList:
- playUrl += file + '$' + url + file + append + '#'
- else:
- playUrl = name + '$' + did
- name = did[did.rfind('/') + 1:]
- if '&&&' in name:
- name = name.split('&&&')[0]
- vod = {
- "vod_id": did,
- "vod_name": name,
- "vod_play_from": "Alist网盘",
- "vod_play_url": playUrl.strip('#')
- }
- result = {
- 'list': [
- vod
- ]
- }
- return result
- def searchContent(self, key, quick):
- return self.searchContentPage(key, quick, '1')
- def searchContentPage(self, key, quick, page):
- result = {'list': []}
- return result
- def playerContent(self, flag, pid, vipFlags):
- result = {}
- purl = self.getDownloadUrl(pid)
- if '&&&' in pid:
- append = pid[pid.index('&&&'):]
- else:
- append = ''
- url = pid[:pid.rfind('/')]
- data = self.getCache(f'subtList_{url}')
- subs = []
- if data:
- subList = data['subtList']
- for sub in subList:
- subformat = os.path.splitext(sub)[1]
- if subformat == '.srt':
- sformat = 'application/x-subrip'
- elif subformat == '.ass':
- sformat = 'application/x-subtitle-ass'
- elif subformat == '.ssa':
- sformat = 'text/x-ssa'
- else:
- sformat = 'text/plain'
- surl = url + '/' + sub
- subs.append(f'http://127.0.0.1:UndCover/proxy?do=py&type=sub&url={surl}&sformat={sformat}')
- result["parse"] = 0
- result["playUrl"] = ''
- result["url"] = purl
- result["header"] = ''
- result["subs"] = subs
- return result
- def getSize(self, size):
- if size > 1024 * 1024 * 1024 * 1024.0:
- fs = "TB"
- sz = round(size / (1024 * 1024 * 1024 * 1024.0), 2)
- elif size > 1024 * 1024 * 1024.0:
- fs = "GB"
- sz = round(size / (1024 * 1024 * 1024.0), 2)
- elif size > 1024 * 1024.0:
- fs = "MB"
- sz = round(size / (1024 * 1024.0), 2)
- elif size > 1024.0:
- fs = "KB"
- sz = round(size / (1024.0), 2)
- else:
- fs = "KB"
- sz = round(size / (1024.0), 2)
- return str(sz) + fs
- def localProxy(self, params):
- url = self.getDownloadUrl(params['url'])
- baseUrl = self.getCache('baseUrl')
- if not baseUrl:
- baseUrl = self.regStr(reg="(http.*://.*?/)", src=params['url'])
- header = self.header.copy()
- header['Referer'] = baseUrl
- content = self.fetch(url, headers=header).content.decode()
- contentTyep = params['sformat']
- action = {'url': '', 'header': header, 'param': '', 'type': 'string'}
- return [200, contentTyep, action, content]
- def getDownloadUrl(self, url):
- params = []
- password = ''
- if '&&&' in url:
- urlList = url.split('&&&')
- url = urlList[0]
- for uL in urlList:
- if uL.startswith('login'):
- login = json.loads(uL.replace('login', ''))
- elif uL.startswith('params'):
- params = json.loads(uL.replace('params', ''))
- if url.count('/') == 2:
- url = url + '/'
- header = self.header.copy()
- baseUrl = self.getCache('baseUrl')
- if not baseUrl:
- baseUrl = self.regStr(reg="(http.*://.*?/)", src=url)
- header['Referer'] = baseUrl
- token = self.getCache('token')
- if token:
- token = token['token']
- else:
- data = self.postJson(baseUrl + 'api/auth/
|