diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 72f7c83fd1..9be82a865a 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -940,6 +940,13 @@ class Cache: rmap = {icu_lower(v) if isinstance(v, str) else v:k for k, v in iteritems(self.fields[field].table.id_map)} return {name:rmap.get(icu_lower(name) if isinstance(name, str) else name, None) for name in item_names} + @read_api + def get_item_name_map(self, field, normalize_func=None): + ' Return mapping of item values to ids ' + if normalize_func is None: + return {v:k for k, v in self.fields[field].table.id_map.items()} + return {normalize_func(v):k for k, v in self.fields[field].table.id_map.items()} + @read_api def author_data(self, author_ids=None): ''' diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 0945754d01..ff28b9dbb5 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -322,10 +322,14 @@ def render_data(mi, use_roman_numbers=True, all_fields=False, pref_name='book_di field_list = [(x, all_fields or display) for x, display in field_list] db, _ = db_for_mi(mi) db = db.new_api + field_maps = {} def item_id_if_has_note(field, item_val): if db.field_supports_notes(field): - item_id = db.get_item_id(field, item_val) + nmap = field_maps.get(field) + if nmap is None: + nmap = field_maps[field] = db.get_item_name_map(field) + item_id = nmap.get(item_val) if item_id is not None: if db.notes_for(field, item_id): return item_id