diff --git a/audiobook_metadata/metadata_audiobooks_library.py b/audiobook_metadata/metadata_audiobooks_library.py index 666a67d..1d14050 100755 --- a/audiobook_metadata/metadata_audiobooks_library.py +++ b/audiobook_metadata/metadata_audiobooks_library.py @@ -9,6 +9,7 @@ import json from pathlib import Path from typing import Any from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed RED = "\033[91m" GREEN = "\033[92m" @@ -542,13 +543,33 @@ class AudiobookLibrary: audiobooks.extend(self.find_name_contains(name)) if not name and not path: audiobooks = self.audiobooks - for audiobook in audiobooks: - if audiobook.singleFile: - continue - logger.debug(f"Crate m4b file for {audiobook.name}") - if self.dry_run: - continue - audiobook.create_m4b_from_book( self.libraryPath,create_m4b_no_delete) + + jobs = [ + audiobook + for audiobook in audiobooks + if not audiobook.singleFile + ] + + for audiobook in jobs: + logger.debug(f"Create m4b file for {audiobook.name}") + + if not self.dry_run: + with ThreadPoolExecutor(max_workers=8) as executor: + futures = { + executor.submit( + audiobook.create_m4b_from_book, + self.libraryPath, + create_m4b_no_delete, + ): audiobook + for audiobook in jobs + } + + for future in as_completed(futures): + audiobook = futures[future] + try: + future.result() + except Exception: + logger.exception(f"Failed to create m4b for {audiobook.name}") def ffmpeg_escape(path: Path) -> str: return str(path.resolve()).replace("'", r"'\''")