%PDF- %PDF-
Direktori : /lib/calibre/calibre/db/ |
Current File : //lib/calibre/calibre/db/covers.py |
#!/usr/bin/env python3 # License: GPL v3 Copyright: 2021, Kovid Goyal <kovid at kovidgoyal.net> import os from queue import Queue from threading import Thread from calibre import detect_ncpus from calibre.utils.img import encode_jpeg, optimize_jpeg def compress_worker(input_queue, output_queue, jpeg_quality): while True: task = input_queue.get() if task is None: break book_id, path = task try: if jpeg_quality >= 100: stderr = optimize_jpeg(path) else: stderr = encode_jpeg(path, jpeg_quality) except Exception: import traceback stderr = traceback.format_exc() if stderr: output_queue.put((book_id, stderr)) else: try: sz = os.path.getsize(path) except OSError as err: sz = str(err) output_queue.put((book_id, sz)) def compress_covers(path_map, jpeg_quality, progress_callback): input_queue = Queue() output_queue = Queue() num_workers = detect_ncpus() sz_map = {} for book_id, (path, sz) in path_map.items(): input_queue.put((book_id, path)) sz_map[book_id] = sz workers = [ Thread(target=compress_worker, args=(input_queue, output_queue, jpeg_quality), daemon=True, name=f'CCover-{i}') for i in range(num_workers) ] [w.start() for w in workers] pending = set(path_map) while pending: book_id, new_sz = output_queue.get() pending.remove(book_id) progress_callback(book_id, sz_map[book_id], new_sz) for w in workers: input_queue.put(None) for w in workers: w.join()