Fix upload
This commit is contained in:
1 parent
d5229f8dce
commit
a2e42d255f
4 files changed
+106
-66
No files matched your search
+6
-6
@@ -2,7 +2,7 @@ import threading
|
||||
|
||||
|
||||
class Timer(threading.Thread):
|
||||
def __init__(self, func, args=(), kwargs=None, interval=15):
|
||||
def __init__(self, func=None, args=(), kwargs=None, interval=15):
|
||||
threading.Thread.__init__(self, daemon=True)
|
||||
if kwargs is None:
|
||||
kwargs = {}
|
||||
@@ -12,13 +12,13 @@ class Timer(threading.Thread):
|
||||
self._func = func
|
||||
self.interval = interval
|
||||
|
||||
def __timer(self):
|
||||
while not self._flag.is_set():
|
||||
self._func(*self._args, **self._kwargs)
|
||||
self._flag.wait(self.interval)
|
||||
def timer(self):
|
||||
self._func(*self._args, **self._kwargs)
|
||||
|
||||
def run(self):
|
||||
self.__timer()
|
||||
while not self._flag.is_set():
|
||||
self.timer()
|
||||
self._flag.wait(self.interval)
|
||||
|
||||
def stop(self):
|
||||
self._flag.set()
|
||||
+12
-45
@@ -28,44 +28,20 @@ class BatchCheckBase:
|
||||
pass
|
||||
|
||||
|
||||
class Monitoring(Timer):
|
||||
def __init__(self, parent_pid, file_name):
|
||||
super().__init__(func=self.kill_child_processes, interval=20)
|
||||
self.parent = self.children = self.numc = None
|
||||
self.parent_pid = parent_pid
|
||||
class Companion(Timer):
|
||||
def __init__(self, pid, file_name, size=2.5):
|
||||
super().__init__(interval=20)
|
||||
self._pid = pid
|
||||
self.proc = psutil.Process(self._pid)
|
||||
self.file_name = file_name + '.part'
|
||||
self._size = size
|
||||
self.last_file_size = 0.0
|
||||
self.flag = Event()
|
||||
|
||||
def terminate(self):
|
||||
if self.numc == 0:
|
||||
logger.error("ChildrenProcess doesn't exist")
|
||||
else:
|
||||
for process in self.children:
|
||||
process.terminate()
|
||||
# logger.info('下载卡死' + self.file_name)
|
||||
|
||||
def get_process(self, parent_pid):
|
||||
try:
|
||||
parent = psutil.Process(parent_pid)
|
||||
except psutil.NoSuchProcess:
|
||||
self.stop()
|
||||
return logger.error("Process doesn't exist")
|
||||
children = parent.children(recursive=True)
|
||||
numc = len(children)
|
||||
return parent, children, numc
|
||||
|
||||
def kill_child_processes(self):
|
||||
if self.flag.is_set():
|
||||
self.stop()
|
||||
return
|
||||
file_size = os.path.getsize(self.file_name) / 1024 / 1024 / 1024
|
||||
if file_size <= self.last_file_size:
|
||||
logger.error('下载卡死' + self.file_name)
|
||||
if self.numc == 0:
|
||||
self.parent.terminate()
|
||||
else:
|
||||
self.terminate()
|
||||
self.proc.terminate()
|
||||
time.sleep(1)
|
||||
if os.path.isfile(self.file_name):
|
||||
return logger.info('卡死下载进程可能未成功退出')
|
||||
@@ -73,32 +49,23 @@ class Monitoring(Timer):
|
||||
self.stop()
|
||||
return logger.info('卡死下载进程成功退出')
|
||||
self.last_file_size = file_size
|
||||
if file_size >= 2.5:
|
||||
self.flag.set()
|
||||
self.terminate()
|
||||
if file_size >= self._size:
|
||||
self.proc.terminate()
|
||||
logger.info('分段下载' + self.file_name)
|
||||
|
||||
def __timer(self):
|
||||
logger.debug('获取到{0},{1}'.format(self.parent_pid, self.file_name))
|
||||
def run(self):
|
||||
retry = 0
|
||||
while not self._flag.wait(self.interval):
|
||||
self.parent, self.children, self.numc = self.get_process(self.parent_pid)
|
||||
if os.path.isfile(self.file_name):
|
||||
self._func(*self._args, **self._kwargs)
|
||||
self.kill_child_processes()
|
||||
else:
|
||||
logger.info('%s不存在' % self.file_name)
|
||||
if retry >= 2:
|
||||
self.terminate()
|
||||
self.proc.terminate()
|
||||
return logger.info('结束进程,找不到%s' % self.file_name)
|
||||
retry += 1
|
||||
# logger.info('监控<%s>线程退出' % self.file_name)
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
self.__timer()
|
||||
finally:
|
||||
logger.debug('退出监控<%s>线程' % self.file_name)
|
||||
|
||||
|
||||
def match1(text, *patterns):
|
||||
if len(patterns) == 1:
|
||||
|
||||
@@ -6,8 +6,8 @@ import time
|
||||
import streamlink
|
||||
import youtube_dl
|
||||
|
||||
from engine.plugins import logger, Monitoring
|
||||
|
||||
from engine.plugins import logger, Companion
|
||||
from threading import Event
|
||||
fake_headers = {
|
||||
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
@@ -17,13 +17,10 @@ fake_headers = {
|
||||
|
||||
|
||||
class DownloadBase:
|
||||
url_list = None
|
||||
|
||||
def __init__(self, fname, url, suffix=None):
|
||||
self.fname = fname
|
||||
self.url = url
|
||||
self.suffix = suffix
|
||||
self.flag = None
|
||||
|
||||
def check_stream(self):
|
||||
logger.debug(self.fname)
|
||||
@@ -45,15 +42,10 @@ class DownloadBase:
|
||||
file_name = self.file_name
|
||||
if self.check_stream():
|
||||
file_name += "." + self.suffix
|
||||
pid = os.getpid()
|
||||
monitor = Monitoring(pid, file_name)
|
||||
self.flag = monitor.flag
|
||||
monitor.start()
|
||||
retval = self.download(file_name)
|
||||
self.rename(file_name)
|
||||
monitor.stop()
|
||||
if retval != 0:
|
||||
logger.debug('准备递归下载')
|
||||
logger.debug('继续下载')
|
||||
self.start()
|
||||
else:
|
||||
logger.info('下载完成' + self.fname)
|
||||
@@ -122,6 +114,7 @@ class SDownload(DownloadBase):
|
||||
def __init__(self, fname, url, suffix='mp4'):
|
||||
super().__init__(fname, url, suffix)
|
||||
self.stream = None
|
||||
self.flag = Event()
|
||||
|
||||
def check_stream(self):
|
||||
logger.debug(self.fname)
|
||||
@@ -151,6 +144,77 @@ class SDownload(DownloadBase):
|
||||
except OSError:
|
||||
self.rename(filename)
|
||||
raise
|
||||
# class Monitoring(Timer):
|
||||
# def __init__(self, parent_pid, file_name):
|
||||
# super().__init__(func=self.kill_child_processes, interval=20)
|
||||
# self.parent = self.children = self.numc = None
|
||||
# self.parent_pid = parent_pid
|
||||
# self.file_name = file_name + '.part'
|
||||
# self.last_file_size = 0.0
|
||||
# self.flag = Event()
|
||||
#
|
||||
# def terminate(self):
|
||||
# if self.numc == 0:
|
||||
# logger.error("ChildrenProcess doesn't exist")
|
||||
# else:
|
||||
# for process in self.children:
|
||||
# process.terminate()
|
||||
# # logger.info('下载卡死' + self.file_name)
|
||||
#
|
||||
# def get_process(self, parent_pid):
|
||||
# try:
|
||||
# parent = psutil.Process(parent_pid)
|
||||
# except psutil.NoSuchProcess:
|
||||
# self.stop()
|
||||
# return logger.error("Process doesn't exist")
|
||||
# children = parent.children(recursive=True)
|
||||
# numc = len(children)
|
||||
# logger.info(f'{parent}, {children}')
|
||||
# return parent, children, numc
|
||||
#
|
||||
# def kill_child_processes(self):
|
||||
# if self.flag.is_set():
|
||||
# self.stop()
|
||||
# return
|
||||
# file_size = os.path.getsize(self.file_name) / 1024 / 1024 / 1024
|
||||
# if file_size <= self.last_file_size:
|
||||
# logger.error('下载卡死' + self.file_name)
|
||||
# if self.numc == 0:
|
||||
# self.parent.terminate()
|
||||
# else:
|
||||
# self.terminate()
|
||||
# time.sleep(1)
|
||||
# if os.path.isfile(self.file_name):
|
||||
# return logger.info('卡死下载进程可能未成功退出')
|
||||
# else:
|
||||
# self.stop()
|
||||
# return logger.info('卡死下载进程成功退出')
|
||||
# self.last_file_size = file_size
|
||||
# if file_size >= 2.5:
|
||||
# self.flag.set()
|
||||
# self.terminate()
|
||||
# logger.info('分段下载' + self.file_name)
|
||||
#
|
||||
# def __timer(self):
|
||||
# logger.debug('获取到{0},{1}'.format(self.parent_pid, self.file_name))
|
||||
# retry = 0
|
||||
# while not self._flag.wait(self.interval):
|
||||
# self.parent, self.children, self.numc = self.get_process(self.parent_pid)
|
||||
# if os.path.isfile(self.file_name):
|
||||
# self._func(*self._args, **self._kwargs)
|
||||
# else:
|
||||
# logger.info('%s不存在' % self.file_name)
|
||||
# if retry >= 2:
|
||||
# self.terminate()
|
||||
# return logger.info('结束进程,找不到%s' % self.file_name)
|
||||
# retry += 1
|
||||
# # logger.info('监控<%s>线程退出' % self.file_name)
|
||||
#
|
||||
# def run(self):
|
||||
# try:
|
||||
# self.__timer()
|
||||
# finally:
|
||||
# logger.debug('退出监控<%s>线程' % self.file_name)
|
||||
|
||||
|
||||
# ffmpeg.exe -i http://vfile1.grtn.cn/2018/1542/0254/3368/154202543368.ssm/154202543368.m3u8
|
||||
@@ -166,10 +230,14 @@ class FFmpegdl(DownloadBase):
|
||||
'-y', '-i', self.raw_stream_url, '-bsf:a', 'aac_adtstoasc', *self.opt_args,
|
||||
'-c', 'copy', '-f', self.suffix, filename + '.part']
|
||||
proc = subprocess.Popen(args, stdin=subprocess.PIPE)
|
||||
monitor = Companion(proc.pid, filename, size=2.5)
|
||||
monitor.start()
|
||||
try:
|
||||
retval = proc.wait()
|
||||
except KeyboardInterrupt:
|
||||
if sys.platform != 'win32':
|
||||
proc.communicate(b'q')
|
||||
raise
|
||||
finally:
|
||||
monitor.stop()
|
||||
return retval
|
||||
@@ -262,9 +262,13 @@ class BiliBili:
|
||||
cost = time.perf_counter() - start
|
||||
|
||||
logger.info(f'{name} uploaded >> {total / 1000 / 1000 / cost:.2f}MB/s')
|
||||
logger.info(parts)
|
||||
parts.sort(key=lambda x: x['index'])
|
||||
logger.info(parts)
|
||||
self.__session.post(f"{endpoint}/mkfile/{total}/key/{base64.urlsafe_b64encode(key.encode()).decode()}",
|
||||
data=','.join(map(lambda x: x['ctx'], parts)), headers=headers, timeout=10)
|
||||
r = self.__session.post(f"https:{fetch_url}", headers=fetch_headers, timeout=5).json()
|
||||
logger.info(f'{name}: {r}')
|
||||
if r["OK"] != 1:
|
||||
raise Exception(r)
|
||||
return {"title": splitext(name)[0], "filename": bili_filename, "desc": ""}
|
||||
@@ -310,11 +314,12 @@ class BiliBili:
|
||||
p = {
|
||||
'name': name,
|
||||
'uploadId': upload_id,
|
||||
'biz_id': biz_id
|
||||
'biz_id': biz_id,
|
||||
'output': 'json',
|
||||
'profile': 'ugcupos/bup'
|
||||
}
|
||||
r = self.__session.post(
|
||||
f'{url}?output=json&profile=ugcupos%2Fbup', params=p,
|
||||
json={"parts": parts}, headers=headers, timeout=15).json()
|
||||
r = self.__session.post(url, params=p, json={"parts": parts}, headers=headers, timeout=15).json()
|
||||
logger.info(f'{name}: {r}')
|
||||
if r["OK"] != 1:
|
||||
raise Exception(r)
|
||||
return {"title": splitext(name)[0], "filename": splitext(basename(upos_uri))[0], "desc": ""}
|
||||
|
||||
Reference in new issue
Block a user