From 4872007adce335adaeb8a6f6342ce88d065ee325 Mon Sep 17 00:00:00 2001 From: ForgQi <34411314+ForgQi@users.noreply.github.com> Date: Tue, 28 May 2024 23:12:13 +0800 Subject: [PATCH] add upload delay --- app/ui/plugins/global.tsx | 9 ++----- biliup/__init__.py | 6 +++++ biliup/engine/download.py | 54 ++++++--------------------------------- biliup/handler.py | 12 ++++++++- 4 files changed, 27 insertions(+), 54 deletions(-) diff --git a/app/ui/plugins/global.tsx b/app/ui/plugins/global.tsx index f3f346d..4b50be8 100644 --- a/app/ui/plugins/global.tsx +++ b/app/ui/plugins/global.tsx @@ -128,16 +128,11 @@ const Global: React.FC = () => { label="下播延迟检测(delay)" extraText={
- 当检测到主播下播后,延迟一定时间再次检测确认,避免特殊情况提早启动上传导致漏录。 + 当检测到主播下播后,延迟一定时间再次检测确认,避免特殊情况提早启动上传导致分稿件。
单位:秒
- 默认延迟时间为 0 秒,若没有快速上传的需求,推荐设置 - 5 分钟(300),或按需设置。 -
- 若设置的延迟时间超过 60 - 秒,则会启用分段检测机制,每隔 60 - 秒进行一次开播状态的检测。 + 默认延迟时间为 0 秒
} placeholder="0" diff --git a/biliup/__init__.py b/biliup/__init__.py index 2139526..57f5b67 100644 --- a/biliup/__init__.py +++ b/biliup/__init__.py @@ -53,3 +53,9 @@ if (3, 10, 6) > sys.version_info >= (3, 8) and platform.system() == 'Windows': proactor_events._ProactorBasePipeTransport.__del__ = silence_event_loop_closed( proactor_events._ProactorBasePipeTransport.__del__) + + +if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): + import multiprocessing + multiprocessing.freeze_support() + print('running in a PyInstaller bundle') \ No newline at end of file diff --git a/biliup/engine/download.py b/biliup/engine/download.py index 3ae7f71..f1e5539 100644 --- a/biliup/engine/download.py +++ b/biliup/engine/download.py @@ -291,63 +291,25 @@ class DownloadBase(ABC): start_time = time.localtime() # 结束时间 end_time = None - # 下播延迟检测 - delay = int(config.get('delay', 0)) - # 重试次数 - retry_count = 0 - # delay 重试次数 - retry_count_delay = 0 - # delay 总重试次数 向上取整 - delay_all_retry_count = -(-delay // 60) with SessionLocal() as db: self.database_row_id = add_stream_info(db, self.fname, self.url, start_time) # 返回数据库中此行记录的 id - - while True: + ret = True + while ret: # 下载结果 - ret = False try: ret = self.run() - except: + except Exception: logger.warning(f'下载失败: {self.__class__.__name__} - {self.fname}', exc_info=True) finally: self.close() - if ret: - # 下载模式如果下载成功直接跳出 - if self.is_download: - break - # 成功下载重置重试次数 - retry_count = 0 - retry_count_delay = 0 - # 最后一次下载完成时间 - end_time = time.localtime() - else: - if retry_count < 3: - retry_count += 1 - logger.info( - f'获取流失败: {self.__class__.__name__} - {self.fname},重试次数 {retry_count} / 3,等待 10 秒') - time.sleep(10) - continue + # 下载模式跳过下播延迟检测 + if self.is_download: + break - # 下载模式跳过下播延迟检测 - if self.is_download: - break - - if delay and retry_count_delay < delay_all_retry_count: - retry_count_delay += 1 - if delay < 60: - logger.info( - f'下播延迟检测: {self.__class__.__name__} - {self.fname},将在 {delay} 秒后检测开播状态') - time.sleep(delay) - else: - logger.info( - f'下播延迟检测: {self.__class__.__name__} - {self.fname},每隔 60 秒检测开播状态,检测次数 {retry_count_delay} / {delay_all_retry_count}') - time.sleep(60) - continue - else: - # 未设置下播延迟检测 or 下播检测次数已到 - break + # 最后一次下载完成时间 + end_time = time.localtime() self.download_cover( time.strftime(self.gen_download_filename().encode("unicode-escape").decode(), end_time if end_time else time.localtime() diff --git a/biliup/handler.py b/biliup/handler.py index 526517c..cb8400f 100644 --- a/biliup/handler.py +++ b/biliup/handler.py @@ -68,6 +68,7 @@ def process(name, url): @event_manager.register(DOWNLOADED, block='Asynchronous1') def processed(stream_info): name = stream_info['name'] + url = stream_info['url'] # 下载后处理 上传前处理 downloaded_processor = config['streamers'].get(name, {}).get('downloaded_processor') if downloaded_processor: @@ -75,7 +76,7 @@ def processed(stream_info): file_list = UploadBase.file_list(name) processor(downloaded_processor, json.dumps({ "name": name, - "url": stream_info.get('url'), + "url": url, "room_title": stream_info.get('title', name), "start_time": int(time.mktime(stream_info.get('date', default_date))), "end_time": int(time.mktime(stream_info.get('end_time', default_date))), @@ -92,6 +93,15 @@ def process_upload(stream_info): url_upload_count = context['url_upload_count'] # 上传开始 try: + url_status = context['PluginInfo'].url_status + # 上传延迟检测 + delay = int(config.get('delay', 0)) + if delay: + logger.info(f'{name} -> {url} {delay}s 后检测是否上传') + time.sleep(delay) + if url_status[url] == 1: + # 上传延迟检测,启用的话会在一段时间后检测是否存在下载任务,若存在则跳过本次上传 + return logger.info(f'{name} -> {url} 存在下载任务, 跳过本次上传') file_list = UploadBase.file_list(name) if len(file_list) <= 0: logger.debug("无需上传")