From 2de3c4844dbf08581908ba030b204ef5bd1ea38a Mon Sep 17 00:00:00 2001 From: TripleCamera Date: Thu, 16 Jul 2026 22:58:17 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E5=A4=B1=E8=B4=A5=E7=9A=84=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E4=BB=BB=E5=8A=A1=E4=B8=8D=E5=86=8D=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E6=8F=90=E5=89=8D=E4=B8=AD=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit biliarchiver 最初的行为是:一旦有下载任务失败,程序会立即退出。`93d3635` 修改了这一行为,使得单个任务失败时,其他任务能够继续执行,并等待所有任务完成后再报错。但由于实现逻辑有误,程序还是会在有下载任务失败时立即退出。 这个 commit 修复了错误的逻辑。 Closes #34. --- biliarchiver/cli_tools/bili_archive_bvids.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/biliarchiver/cli_tools/bili_archive_bvids.py b/biliarchiver/cli_tools/bili_archive_bvids.py index b7b105d..3e946af 100644 --- a/biliarchiver/cli_tools/bili_archive_bvids.py +++ b/biliarchiver/cli_tools/bili_archive_bvids.py @@ -110,9 +110,9 @@ def check_free_space(): d.progress.start() sem = asyncio.Semaphore(config.video_concurrency) tasks: List[asyncio.Task] = [] + failed_tasks: list[tuple[asyncio.Task, BaseException]] = [] def tasks_check(): - failed_tasks = [] for task in tasks: if task.done(): _task_exception = task.exception() @@ -131,9 +131,6 @@ def tasks_check(): task.cancel() raise RuntimeError(s) - if failed_tasks: - print(f"完成所有任务,但有 {len(failed_tasks)} 个任务失败") - raise failed_tasks[0][1] for index, bvid in enumerate(bvids_list): if index < skip_to: @@ -171,6 +168,10 @@ def tasks_check(): await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) tasks_check() + if failed_tasks: + print(f"完成所有任务,但有 {len(failed_tasks)} 个任务失败") + raise failed_tasks[0][1] + print("DONE") From d18f127334f264eb78815d0c9552cf0e46f836ed Mon Sep 17 00:00:00 2001 From: TripleCamera Date: Sat, 18 Jul 2026 18:29:30 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E7=A8=8B=E5=BA=8F=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E6=97=B6=E8=BF=9B=E5=BA=A6=E6=9D=A1=E6=AE=8B?= =?UTF-8?q?=E7=95=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bilix CLI 在启动时会开启进度条显示: ```python try: CLIProgress.start() # start progress ``` 在结束时会关闭进度条显示: ```python finally: CLIProgress.stop() # stop rich progress to ensure cursor is repositioned ``` 而且使用了 `try ... finally ...`,可以确保程序结束时进度条不会残留在控制台输出中。 biliarchiver 虽然在启动时开启了进度条显示,但没有在结束时关闭进度条显示,导致程序结束时进度条残留。 --- biliarchiver/cli_tools/bili_archive_bvids.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/biliarchiver/cli_tools/bili_archive_bvids.py b/biliarchiver/cli_tools/bili_archive_bvids.py index 3e946af..929ccf6 100644 --- a/biliarchiver/cli_tools/bili_archive_bvids.py +++ b/biliarchiver/cli_tools/bili_archive_bvids.py @@ -168,12 +168,12 @@ def tasks_check(): await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) tasks_check() + d.progress.stop() + print("DONE") if failed_tasks: print(f"完成所有任务,但有 {len(failed_tasks)} 个任务失败") raise failed_tasks[0][1] - print("DONE") - def update_cookies_from_browser(client: AsyncClient, browser: str): try: From eec0bbfa81684a318880b7e8e184fa2813805397 Mon Sep 17 00:00:00 2001 From: TripleCamera Date: Sun, 19 Jul 2026 22:35:36 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E7=A8=8B=E5=BA=8F=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E5=86=8D=E9=87=8D=E5=A4=8D=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit biliarchiver 会在任何一个下载任务出错时立即输出错误,同时在程序结束时再输出一遍第一个错误。后者是不必要的,删掉。 同时优化输出内容并标记为可翻译。 --- biliarchiver/cli_tools/bili_archive_bvids.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/biliarchiver/cli_tools/bili_archive_bvids.py b/biliarchiver/cli_tools/bili_archive_bvids.py index 929ccf6..0e129e4 100644 --- a/biliarchiver/cli_tools/bili_archive_bvids.py +++ b/biliarchiver/cli_tools/bili_archive_bvids.py @@ -169,10 +169,10 @@ def tasks_check(): tasks_check() d.progress.stop() - print("DONE") if failed_tasks: - print(f"完成所有任务,但有 {len(failed_tasks)} 个任务失败") - raise failed_tasks[0][1] + print(_("完成所有任务,但有 {} 个任务失败").format(len(failed_tasks))) + else: + print(_("完成所有任务")) def update_cookies_from_browser(client: AsyncClient, browser: str):