From f73a5f0d5a155c6eda21c1f4c23b0f5c33667155 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 29 Apr 2017 16:50:38 +0530 Subject: [PATCH] Refactor adding API to accept add_duplicates and use new_api --- src/calibre/db/adding.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/calibre/db/adding.py b/src/calibre/db/adding.py index 2314eb0e2e..6cc485c586 100644 --- a/src/calibre/db/adding.py +++ b/src/calibre/db/adding.py @@ -127,8 +127,18 @@ def find_books_in_directory(dirpath, single_book_per_directory, compiled_rules=( yield list(formats.itervalues()) +def create_format_map(formats): + format_map = {} + for path in formats: + ext = os.path.splitext(path)[1][1:].upper() + if ext == 'OPF': + continue + format_map[ext] = path + return format_map + + def import_book_directory_multiple(db, dirpath, callback=None, - added_ids=None, compiled_rules=()): + added_ids=None, compiled_rules=(), add_duplicates=False): from calibre.ebooks.metadata.meta import metadata_from_formats duplicates = [] @@ -136,10 +146,11 @@ def import_book_directory_multiple(db, dirpath, callback=None, mi = metadata_from_formats(formats) if mi.title is None: continue - if db.has_book(mi): + ids, dups = db.new_api.add_books([(mi, create_format_map(formats))], add_duplicates=add_duplicates) + if dups: duplicates.append((mi, formats)) continue - book_id = db.import_book(mi, formats) + book_id = next(ids) if added_ids is not None: added_ids.add(book_id) if callable(callback): @@ -148,7 +159,7 @@ def import_book_directory_multiple(db, dirpath, callback=None, return duplicates -def import_book_directory(db, dirpath, callback=None, added_ids=None, compiled_rules=()): +def import_book_directory(db, dirpath, callback=None, added_ids=None, compiled_rules=(), add_duplicates=False): from calibre.ebooks.metadata.meta import metadata_from_formats dirpath = os.path.abspath(dirpath) formats = None @@ -159,9 +170,10 @@ def import_book_directory(db, dirpath, callback=None, added_ids=None, compiled_r mi = metadata_from_formats(formats) if mi.title is None: return - if db.has_book(mi): + ids, dups = db.new_api.add_books([(mi, create_format_map(formats))], add_duplicates=add_duplicates) + if dups: return [(mi, formats)] - book_id = db.import_book(mi, formats) + book_id = next(ids) if added_ids is not None: added_ids.add(book_id) if callable(callback): @@ -169,14 +181,13 @@ def import_book_directory(db, dirpath, callback=None, added_ids=None, compiled_r def recursive_import(db, root, single_book_per_directory=True, - callback=None, added_ids=None, compiled_rules=()): + callback=None, added_ids=None, compiled_rules=(), add_duplicates=False): root = os.path.abspath(root) duplicates = [] for dirpath in os.walk(root): - res = (import_book_directory(db, dirpath[0], callback=callback, - added_ids=added_ids, compiled_rules=compiled_rules) if single_book_per_directory else - import_book_directory_multiple(db, dirpath[0], - callback=callback, added_ids=added_ids, compiled_rules=compiled_rules)) + func = import_book_directory if single_book_per_directory else import_book_directory_multiple + res = func(db, dirpath[0], callback=callback, + added_ids=added_ids, compiled_rules=compiled_rules, add_duplicates=add_duplicates) if res is not None: duplicates.extend(res) if callable(callback):