mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-30 23:00:21 -04:00
SONY driver: Add option to not preserve aspect ratio of cover thumbnails. Fix #8714 (Problem sending thumbnails to Sony PRSx50 SD card)
This commit is contained in:
commit
183be90e0d
@ -35,6 +35,16 @@ class DevicePlugin(Plugin):
|
|||||||
|
|
||||||
#: Height for thumbnails on the device
|
#: Height for thumbnails on the device
|
||||||
THUMBNAIL_HEIGHT = 68
|
THUMBNAIL_HEIGHT = 68
|
||||||
|
#: Width for thumbnails on the device. Setting this will force thumbnails
|
||||||
|
#: to this size, not preserving aspect ratio. If it is not set, then
|
||||||
|
#: the aspect ratio will be preserved and the thumbnail will be no higher
|
||||||
|
#: than THUMBNAIL_HEIGHT
|
||||||
|
# THUMBNAIL_WIDTH = 68
|
||||||
|
|
||||||
|
#: Set this to True if the device supports updating cover thumbnails during
|
||||||
|
#: sync_booklists. Setting it to true will ask device.py to refresh the
|
||||||
|
#: cover thumbnails during book matching
|
||||||
|
WANTS_UPDATED_THUMBNAILS = False
|
||||||
|
|
||||||
#: Whether the metadata on books can be set via the GUI.
|
#: Whether the metadata on books can be set via the GUI.
|
||||||
CAN_SET_METADATA = ['title', 'authors', 'collections']
|
CAN_SET_METADATA = ['title', 'authors', 'collections']
|
||||||
|
@ -8,5 +8,5 @@ CACHE_XML = 'Sony Reader/database/cache.xml'
|
|||||||
CACHE_EXT = 'Sony Reader/database/cacheExt.xml'
|
CACHE_EXT = 'Sony Reader/database/cacheExt.xml'
|
||||||
|
|
||||||
MEDIA_THUMBNAIL = 'database/thumbnail'
|
MEDIA_THUMBNAIL = 'database/thumbnail'
|
||||||
CACHE_THUMBNAIL = 'Sony Reader/database/thumbnail'
|
CACHE_THUMBNAIL = 'Sony Reader/thumbnail'
|
||||||
|
|
||||||
|
@ -81,12 +81,19 @@ class PRS505(USBMS):
|
|||||||
_('Set this option to have separate book covers uploaded '
|
_('Set this option to have separate book covers uploaded '
|
||||||
'every time you connect your device. Unset this option if '
|
'every time you connect your device. Unset this option if '
|
||||||
'you have so many books on the reader that performance is '
|
'you have so many books on the reader that performance is '
|
||||||
'unacceptable.')
|
'unacceptable.'),
|
||||||
|
_('Preserve cover aspect ratio when building thumbnails') +
|
||||||
|
':::' +
|
||||||
|
_('Set this option if you want the cover thumbnails to have '
|
||||||
|
'the same aspect ratio (width to height) as the cover. '
|
||||||
|
'Unset it if you want the thumbnail to be the maximum size, '
|
||||||
|
'ignoring aspect ratio.')
|
||||||
]
|
]
|
||||||
EXTRA_CUSTOMIZATION_DEFAULT = [
|
EXTRA_CUSTOMIZATION_DEFAULT = [
|
||||||
', '.join(['series', 'tags']),
|
', '.join(['series', 'tags']),
|
||||||
False,
|
False,
|
||||||
False
|
False,
|
||||||
|
True
|
||||||
]
|
]
|
||||||
|
|
||||||
OPT_COLLECTIONS = 0
|
OPT_COLLECTIONS = 0
|
||||||
@ -96,7 +103,7 @@ class PRS505(USBMS):
|
|||||||
plugboard = None
|
plugboard = None
|
||||||
plugboard_func = None
|
plugboard_func = None
|
||||||
|
|
||||||
THUMBNAIL_HEIGHT = 200
|
THUMBNAIL_HEIGHT = 217
|
||||||
|
|
||||||
MAX_PATH_LEN = 201 # 250 - (max(len(CACHE_THUMBNAIL), len(MEDIA_THUMBNAIL)) +
|
MAX_PATH_LEN = 201 # 250 - (max(len(CACHE_THUMBNAIL), len(MEDIA_THUMBNAIL)) +
|
||||||
# len('main_thumbnail.jpg') + 1)
|
# len('main_thumbnail.jpg') + 1)
|
||||||
@ -138,6 +145,13 @@ class PRS505(USBMS):
|
|||||||
if not write_cache(self._card_b_prefix):
|
if not write_cache(self._card_b_prefix):
|
||||||
self._card_b_prefix = None
|
self._card_b_prefix = None
|
||||||
self.booklist_class.rebuild_collections = self.rebuild_collections
|
self.booklist_class.rebuild_collections = self.rebuild_collections
|
||||||
|
# Set the thumbnail width to the theoretical max if the user has asked
|
||||||
|
# that we do not preserve aspect ratio
|
||||||
|
if not self.settings().extra_customization[3]:
|
||||||
|
self.THUMBNAIL_WIDTH = 168
|
||||||
|
# Set WANTS_UPDATED_THUMBNAILS if the user has asked that thumbnails be
|
||||||
|
# updated on every connect
|
||||||
|
self.WANTS_UPDATED_THUMBNAILS = self.settings().extra_customization[2]
|
||||||
|
|
||||||
def get_device_information(self, end_session=True):
|
def get_device_information(self, end_session=True):
|
||||||
return (self.gui_name, '', '', '')
|
return (self.gui_name, '', '', '')
|
||||||
|
@ -871,6 +871,16 @@ class DeviceMixin(object): # {{{
|
|||||||
self.send_by_mail(to, fmts, delete)
|
self.send_by_mail(to, fmts, delete)
|
||||||
|
|
||||||
def cover_to_thumbnail(self, data):
|
def cover_to_thumbnail(self, data):
|
||||||
|
if self.device_manager.device and \
|
||||||
|
hasattr(self.device_manager.device, 'THUMBNAIL_WIDTH'):
|
||||||
|
try:
|
||||||
|
return thumbnail(data,
|
||||||
|
self.device_manager.device.THUMBNAIL_WIDTH,
|
||||||
|
self.device_manager.device.THUMBNAIL_HEIGHT,
|
||||||
|
preserve_aspect_ratio=False)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return
|
||||||
ht = self.device_manager.device.THUMBNAIL_HEIGHT \
|
ht = self.device_manager.device.THUMBNAIL_HEIGHT \
|
||||||
if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT
|
if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT
|
||||||
try:
|
try:
|
||||||
@ -1272,6 +1282,8 @@ class DeviceMixin(object): # {{{
|
|||||||
x = x.lower() if x else ''
|
x = x.lower() if x else ''
|
||||||
return string_pat.sub('', x)
|
return string_pat.sub('', x)
|
||||||
|
|
||||||
|
update_metadata = prefs['manage_device_metadata'] == 'on_connect'
|
||||||
|
|
||||||
# Force a reset if the caches are not initialized
|
# Force a reset if the caches are not initialized
|
||||||
if reset or not hasattr(self, 'db_book_title_cache'):
|
if reset or not hasattr(self, 'db_book_title_cache'):
|
||||||
# Build a cache (map) of the library, so the search isn't On**2
|
# Build a cache (map) of the library, so the search isn't On**2
|
||||||
@ -1284,8 +1296,13 @@ class DeviceMixin(object): # {{{
|
|||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
get_covers = False
|
||||||
|
if update_metadata and self.device_manager.is_device_connected:
|
||||||
|
if self.device_manager.device.WANTS_UPDATED_THUMBNAILS:
|
||||||
|
get_covers = True
|
||||||
|
|
||||||
for id in db.data.iterallids():
|
for id in db.data.iterallids():
|
||||||
mi = db.get_metadata(id, index_is_id=True)
|
mi = db.get_metadata(id, index_is_id=True, get_cover=get_covers)
|
||||||
title = clean_string(mi.title)
|
title = clean_string(mi.title)
|
||||||
if title not in db_book_title_cache:
|
if title not in db_book_title_cache:
|
||||||
db_book_title_cache[title] = \
|
db_book_title_cache[title] = \
|
||||||
@ -1311,7 +1328,6 @@ class DeviceMixin(object): # {{{
|
|||||||
# the application_id to the db_id of the matching book. This value
|
# the application_id to the db_id of the matching book. This value
|
||||||
# will be used by books_on_device to indicate matches.
|
# will be used by books_on_device to indicate matches.
|
||||||
|
|
||||||
update_metadata = prefs['manage_device_metadata'] == 'on_connect'
|
|
||||||
for booklist in booklists:
|
for booklist in booklists:
|
||||||
for book in booklist:
|
for book in booklist:
|
||||||
book.in_library = None
|
book.in_library = None
|
||||||
@ -1382,6 +1398,12 @@ class DeviceMixin(object): # {{{
|
|||||||
|
|
||||||
if update_metadata:
|
if update_metadata:
|
||||||
if self.device_manager.is_device_connected:
|
if self.device_manager.is_device_connected:
|
||||||
|
if self.device_manager.device.WANTS_UPDATED_THUMBNAILS:
|
||||||
|
for blist in booklists:
|
||||||
|
for book in blist:
|
||||||
|
if book.cover and os.access(book.cover, os.R_OK):
|
||||||
|
book.thumbnail = \
|
||||||
|
self.cover_to_thumbnail(open(book.cover, 'rb').read())
|
||||||
plugboards = self.library_view.model().db.prefs.get('plugboards', {})
|
plugboards = self.library_view.model().db.prefs.get('plugboards', {})
|
||||||
self.device_manager.sync_booklists(
|
self.device_manager.sync_booklists(
|
||||||
Dispatcher(self.metadata_synced), booklists,
|
Dispatcher(self.metadata_synced), booklists,
|
||||||
|
@ -72,11 +72,17 @@ def save_cover_data_to(data, path, bgcolor='#ffffff', resize_to=None,
|
|||||||
f.write(data)
|
f.write(data)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def thumbnail(data, width=120, height=120, bgcolor='#ffffff', fmt='jpg'):
|
def thumbnail(data, width=120, height=120, bgcolor='#ffffff', fmt='jpg',
|
||||||
|
preserve_aspect_ratio=True):
|
||||||
img = Image()
|
img = Image()
|
||||||
img.load(data)
|
img.load(data)
|
||||||
owidth, oheight = img.size
|
owidth, oheight = img.size
|
||||||
scaled, nwidth, nheight = fit_image(owidth, oheight, width, height)
|
if not preserve_aspect_ratio:
|
||||||
|
scaled = owidth > width or oheight > height
|
||||||
|
nwidth = width
|
||||||
|
nheight = height
|
||||||
|
else:
|
||||||
|
scaled, nwidth, nheight = fit_image(owidth, oheight, width, height)
|
||||||
if scaled:
|
if scaled:
|
||||||
img.size = (nwidth, nheight)
|
img.size = (nwidth, nheight)
|
||||||
canvas = create_canvas(img.size[0], img.size[1], bgcolor)
|
canvas = create_canvas(img.size[0], img.size[1], bgcolor)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user