From 0a2f80fdbff1b5fb541e567a8735ba5b8ca20ffa Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 21:13:35 +0100 Subject: [PATCH 1/3] Merge from trunk --- src/calibre/devices/usbms/books.py | 2 +- src/calibre/ebooks/metadata/book/__init__.py | 2 +- src/calibre/ebooks/metadata/book/base.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 3e13527bd0..4d5110b049 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -59,7 +59,7 @@ class Book(Metadata): return property(doc=doc, fget=fget) @dynamic_property - def thumbnail(self): + def thumbnail(self):' return None class BookList(_BookList): diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index e7f58ce858..84a88606f2 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -110,7 +110,7 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( frozenset(['title', 'title_sort', 'authors', 'author_sort', 'author_sort_map' 'comments', 'cover_data', 'tags', 'language', 'lpath', - 'size']) + 'size', 'thumbnail']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index f52c41e4c5..647a9f467e 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -243,7 +243,7 @@ class Metadata(object): lotags = [t.lower() for t in other.tags] lstags = [t.lower() for t in self.tags] ot, st = map(frozenset, (lotags, lstags)) - for t in st.interection(ot): + for t in st.intersection(ot): sidx = lstags.index(t) oidx = lotags.index(t) self.tags[sidx] = other.tags[oidx] From db4b8d8216bd2299d471be43b114e3e05edf1f26 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 21:15:31 +0100 Subject: [PATCH 2/3] Fix some inadvertent changes --- src/calibre/devices/usbms/books.py | 2 +- src/calibre/ebooks/metadata/book/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 4d5110b049..3e13527bd0 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -59,7 +59,7 @@ class Book(Metadata): return property(doc=doc, fget=fget) @dynamic_property - def thumbnail(self):' + def thumbnail(self): return None class BookList(_BookList): diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index 84a88606f2..e7f58ce858 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -110,7 +110,7 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( frozenset(['title', 'title_sort', 'authors', 'author_sort', 'author_sort_map' 'comments', 'cover_data', 'tags', 'language', 'lpath', - 'size', 'thumbnail']) + 'size']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( From 6ca5263d005a10218008ba74a1a8942ca5c6f74f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 21:36:23 +0100 Subject: [PATCH 3/3] Fix typo, add merge is_multiple --- src/calibre/ebooks/metadata/book/base.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 647a9f467e..f2031afd0e 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -259,7 +259,20 @@ class Metadata(object): for x in other.user_metadata_keys: meta = other.get_user_metadata(x, make_copy=True) if meta is not None: + self_tags = self.get(x, []) self.set_user_metadata(x, meta) # get... did the deepcopy + other_tags = other.get(x, []) + if meta['is_multiple']: + # Case-insensitive but case preserving merging + lotags = [t.lower() for t in other_tags] + lstags = [t.lower() for t in self_tags] + ot, st = map(frozenset, (lotags, lstags)) + for t in st.intersection(ot): + sidx = lstags.index(t) + oidx = lotags.index(t) + self_tags[sidx] = other.tags[oidx] + self_tags += [t for t in other.tags if t.lower() in ot-st] + setattr(self, x, self_tags) my_comments = getattr(self, 'comments', '') other_comments = getattr(other, 'comments', '') if not my_comments: