From a56cf84eaadeaa68d3505ff04711a8867a93e673 Mon Sep 17 00:00:00 2001 From: IamK Date: Mon, 25 Aug 2025 14:48:03 +0200 Subject: [PATCH 1/5] added log entry inside job --- src/audible_cli/cmds/cmd_download.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/audible_cli/cmds/cmd_download.py b/src/audible_cli/cmds/cmd_download.py index df76b46..d603967 100644 --- a/src/audible_cli/cmds/cmd_download.py +++ b/src/audible_cli/cmds/cmd_download.py @@ -520,6 +520,7 @@ async def create_download_jobs( async def download_covers(job: DownloadJob) -> None: + log_job("cover", job) base_filename = job.create_base_filename() for cover_size in job.options.cover_sizes: @@ -541,6 +542,7 @@ async def download_covers(job: DownloadJob) -> None: async def download_pdf(job: DownloadJob) -> None: + log_job("PDF", job) url = job.item.get_pdf_url() if url is None: logger.info("No PDF found for %s", job.item.full_title) @@ -561,6 +563,7 @@ async def download_pdf(job: DownloadJob) -> None: async def download_chapters(job: DownloadJob) -> None: + log_job("chapters", job) options = job.options if not options.output_dir.is_dir(): raise DirectoryDoesNotExists(options.output_dir) @@ -587,6 +590,7 @@ async def download_chapters(job: DownloadJob) -> None: async def download_annotations(job: DownloadJob) -> None: + log_job("annotations", job) options = job.options if not options.output_dir.is_dir(): raise DirectoryDoesNotExists(options.output_dir) @@ -669,6 +673,7 @@ async def _add_audioparts_to_queue(job: DownloadJob, download_mode: str) -> None async def download_aax(job: DownloadJob, retry: int = 0) -> None: + log_job("aax", job) # url, codec = await item.get_aax_url(quality) options = job.options @@ -763,7 +768,11 @@ async def _reuse_voucher(lr_file, job: DownloadJob) -> tuple[dict, httpx.URL, st return lr, url, codec +def log_job(type_name: str, job: DownloadJob): + logger.info("Downloading %s for: %s", type_name, job.item.full_title) + async def download_aaxc(job: DownloadJob) -> None: + log_job("aaxc", job) lr, url, codec = None, None, None options = job.options base_filename = job.create_base_filename() From cd490f45a2ebd41b4372b3652f9f06ad4c8855ea Mon Sep 17 00:00:00 2001 From: IamK Date: Mon, 25 Aug 2025 15:05:13 +0200 Subject: [PATCH 2/5] fixed bug --- src/audible_cli/cmds/cmd_download.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audible_cli/cmds/cmd_download.py b/src/audible_cli/cmds/cmd_download.py index d603967..4650b9c 100644 --- a/src/audible_cli/cmds/cmd_download.py +++ b/src/audible_cli/cmds/cmd_download.py @@ -509,7 +509,7 @@ async def create_download_jobs( # Add child items to processing queue with custom output directory for child_item in item._children: # Add to the process queue if not already included - if child_item.asin not in [i.asin for i in processed_items]: + if child_item.asin not in [i.item.asin for i in processed_items]: download_job = DownloadJob(child_item, options_for_children, client, queue, counter) processed_items.append(download_job) else: From fa02aefb4ed5110e61a832cb57eaa87c5f00cae1 Mon Sep 17 00:00:00 2001 From: IamK Date: Mon, 25 Aug 2025 15:38:12 +0200 Subject: [PATCH 3/5] added ASIN to log entry --- src/audible_cli/cmds/cmd_download.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/audible_cli/cmds/cmd_download.py b/src/audible_cli/cmds/cmd_download.py index 4650b9c..2a744e8 100644 --- a/src/audible_cli/cmds/cmd_download.py +++ b/src/audible_cli/cmds/cmd_download.py @@ -519,6 +519,10 @@ async def create_download_jobs( return processed_items +def log_job(type_name: str, job: DownloadJob): + logger.info("Checking %s for: [%s] %s", type_name, job.item.asin, job.item.full_title) + + async def download_covers(job: DownloadJob) -> None: log_job("cover", job) base_filename = job.create_base_filename() @@ -768,9 +772,6 @@ async def _reuse_voucher(lr_file, job: DownloadJob) -> tuple[dict, httpx.URL, st return lr, url, codec -def log_job(type_name: str, job: DownloadJob): - logger.info("Downloading %s for: %s", type_name, job.item.full_title) - async def download_aaxc(job: DownloadJob) -> None: log_job("aaxc", job) lr, url, codec = None, None, None From 7a64c4f26b09bf4b29ef0049654ecdd72d96c067 Mon Sep 17 00:00:00 2001 From: IamK Date: Mon, 25 Aug 2025 16:20:07 +0200 Subject: [PATCH 4/5] improved logging (including of cancelling) --- src/audible_cli/cmds/cmd_download.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/audible_cli/cmds/cmd_download.py b/src/audible_cli/cmds/cmd_download.py index 2a744e8..f1324f5 100644 --- a/src/audible_cli/cmds/cmd_download.py +++ b/src/audible_cli/cmds/cmd_download.py @@ -518,9 +518,13 @@ async def create_download_jobs( return processed_items +def item_info(item): + """returns a string made from atim asin and full_title""" + return ("[%s] %s" % (item.asin, item.full_title)) def log_job(type_name: str, job: DownloadJob): - logger.info("Checking %s for: [%s] %s", type_name, job.item.asin, job.item.full_title) + """logs info about the download job""" + logger.info("Checking %s for: %s", type_name, item_info(job.item)) async def download_covers(job: DownloadJob) -> None: @@ -614,6 +618,9 @@ async def download_annotations(job: DownloadJob) -> None: except RequestError: logger.error("Failed to get annotations for %s.", job.item.full_title) return None + #except: + # logger.error("Bug", exc_info=True) + # return None annotation = json.dumps(annotation, indent=4) async with aiofiles.open(file, "w") as f: @@ -890,15 +897,18 @@ async def consume_jobs(queue: SmartQueue, name: str) -> None: try: while not queue.is_shutdown(): cmd, job, *args = await queue.get() - await cmd(job, *args) + try: + await cmd(job, *args) + except asyncio.CancelledError: + logger.debug("job cancelled for: %s", item_info(job.item)) + raise queue.task_done() except asyncio.CancelledError: raise - except Exception as e: + except BaseException as e: + logger.error("error: %s", str(e)) if job and not job.options.ignore_errors: raise - else: - logger.error(e) @click.command("download") @@ -1076,7 +1086,8 @@ async def cli(session: Session, api_client: AsyncClient, **params: Any): for task in pending: task.cancel() await asyncio.gather(task, return_exceptions=True) - + except Exception as ex: + logger.error("Unknown error: ", exc_info=ex) finally: await queue.shutdown() display_counter(counter) From d223c72995faea28ffcce6369ee8349e46d317a8 Mon Sep 17 00:00:00 2001 From: IamK Date: Mon, 25 Aug 2025 16:34:44 +0200 Subject: [PATCH 5/5] fixed bug --- src/audible_cli/cmds/cmd_download.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/audible_cli/cmds/cmd_download.py b/src/audible_cli/cmds/cmd_download.py index f1324f5..1ec19b1 100644 --- a/src/audible_cli/cmds/cmd_download.py +++ b/src/audible_cli/cmds/cmd_download.py @@ -1086,8 +1086,6 @@ async def cli(session: Session, api_client: AsyncClient, **params: Any): for task in pending: task.cancel() await asyncio.gather(task, return_exceptions=True) - except Exception as ex: - logger.error("Unknown error: ", exc_info=ex) finally: await queue.shutdown() display_counter(counter)