From 8b554ee0cda99dd11c50ba6def1634ca2416396b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:04:10 +0100 Subject: [PATCH 1/4] Fixes for thumbnails. --- src/calibre/ebooks/metadata/book/__init__.py | 2 +- src/calibre/ebooks/metadata/book/base.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) 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 f2031afd0e..7812f81180 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -223,7 +223,7 @@ class Metadata(object): self.author_sort = other.author_sort if replace_metadata: - SPECIAL_FIELDS = frozenset(['lpath', 'size', 'comments']) + SPECIAL_FIELDS = frozenset(['lpath', 'size', 'comments', 'thumbnail']) for attr in COPYABLE_METADATA_FIELDS: setattr(self, attr, getattr(other, attr, 1.0 if \ attr == 'series_index' else None)) @@ -238,6 +238,7 @@ class Metadata(object): for attr in COPYABLE_METADATA_FIELDS: if hasattr(other, attr): copy_not_none(self, other, attr) + copy_not_none(self, other, 'thumbnail') if other.tags: # Case-insensitive but case preserving merging lotags = [t.lower() for t in other.tags] From 171ac9488aeadfe1b6fd0605c17bbc71662726ed Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:32:20 +0100 Subject: [PATCH 2/4] An attempt to make covers work. --- src/calibre/gui2/library/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index b81628cd27..4e8e9a10bd 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -1056,7 +1056,10 @@ class DeviceBooksModel(BooksModel): # {{{ if hasattr(cdata, 'image_path'): img.load(cdata.image_path) elif cdata: - img.loadFromData(cdata) + if isinstance(cdata, tuple): + img.loadFromData(cdata[2]) + else: + img.loadFromData(cdata) if img.isNull(): img = self.default_image data['cover'] = img From e73b688ca8ee61b39a65dbfb40d36863b74800f2 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:44:36 +0100 Subject: [PATCH 3/4] Deal with the two thumbnail formats --- src/calibre/ebooks/metadata/book/json_codec.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index ea0de07342..a6235e64d5 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -12,6 +12,7 @@ from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS from calibre.constants import filesystem_encoding, preferred_encoding from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE +from calibre.utils.magick.draw import identify_data from calibre import isbytestring # Translate datetimes to and from strings. The string form is the datetime in @@ -32,7 +33,12 @@ def encode_thumbnail(thumbnail): ''' if thumbnail is None: return None - return (thumbnail[0], thumbnail[1], b64encode(str(thumbnail[2]))) + if isinstance(thumbnail, tuple): + try: + thumbnail = identify_data(thumbnail) + except: + return None + return (0, 0, b64encode(str(thumbnail))) def decode_thumbnail(tup): ''' From e0261c2ba1e53300275849818df0b78729f99b98 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:50:34 +0100 Subject: [PATCH 4/4] This time, do json thumbnails right. --- src/calibre/ebooks/metadata/book/json_codec.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index a6235e64d5..51b9722803 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -12,7 +12,7 @@ from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS from calibre.constants import filesystem_encoding, preferred_encoding from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE -from calibre.utils.magick.draw import identify_data +from calibre.utils.magick import Image from calibre import isbytestring # Translate datetimes to and from strings. The string form is the datetime in @@ -33,12 +33,15 @@ def encode_thumbnail(thumbnail): ''' if thumbnail is None: return None - if isinstance(thumbnail, tuple): + if not isinstance(thumbnail, tuple): try: - thumbnail = identify_data(thumbnail) + img = Image() + img.load(thumbnail) + width, height = img.size + thumbnail = (width, height, thumbnail) except: return None - return (0, 0, b64encode(str(thumbnail))) + return (thumbnail[0], thumbnail[1], b64encode(str(thumbnail[2]))) def decode_thumbnail(tup): '''