mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Sony T1: Driver Updates
- Support switching between Calibre and Sony T1 style metadata in books.db (Defaults to Calibre style) - Attempt to calculate the device's time offset from books.db when scanning.
This commit is contained in:
parent
6db759df3a
commit
55a7e1393b
@ -20,6 +20,7 @@ from calibre.devices.usbms.device import USBDevice
|
||||
from calibre.devices.usbms.books import CollectionsBookList
|
||||
from calibre.devices.usbms.books import BookList
|
||||
from calibre.constants import islinux
|
||||
from calibre.ebooks.metadata import authors_to_string, authors_to_sort_string
|
||||
|
||||
DBPATH = 'Sony_Reader/database/books.db'
|
||||
THUMBPATH = 'Sony_Reader/database/cache/books/%s/thumbnail/main_thumbnail.jpg'
|
||||
@ -82,18 +83,26 @@ class PRST1(USBMS):
|
||||
'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.'),
|
||||
_('Use SONY Author Format (First Author Only)') +
|
||||
':::' +
|
||||
_('Set this option if you want the author on the Sony to '
|
||||
'appear the same way the T1 sets it. This means it will '
|
||||
'only show the first author for books with multiple authors. '
|
||||
'Leave this disabled if you use Metadata Plugboards.')
|
||||
]
|
||||
EXTRA_CUSTOMIZATION_DEFAULT = [
|
||||
', '.join(['series', 'tags']),
|
||||
True,
|
||||
False,
|
||||
True,
|
||||
False,
|
||||
]
|
||||
|
||||
OPT_COLLECTIONS = 0
|
||||
OPT_UPLOAD_COVERS = 1
|
||||
OPT_REFRESH_COVERS = 2
|
||||
OPT_PRESERVE_ASPECT_RATIO = 3
|
||||
OPT_USE_SONY_AUTHORS = 4
|
||||
|
||||
plugboards = None
|
||||
plugboard_func = None
|
||||
@ -103,6 +112,8 @@ class PRST1(USBMS):
|
||||
# that we do not preserve aspect ratio
|
||||
if not self.settings().extra_customization[self.OPT_PRESERVE_ASPECT_RATIO]:
|
||||
self.THUMBNAIL_WIDTH = 108
|
||||
# Make sure the date offset is set to none, we'll calculate it in books.
|
||||
self.device_offset = None
|
||||
|
||||
def windows_filter_pnp_id(self, pnp_id):
|
||||
return '_LAUNCHER' in pnp_id or '_SETTING' in pnp_id
|
||||
@ -168,6 +179,27 @@ class PRST1(USBMS):
|
||||
bl_collections.setdefault(row[0], [])
|
||||
bl_collections[row[0]].append(row[1])
|
||||
|
||||
# collect information on offsets, but assume any
|
||||
# offset we already calculated is correct
|
||||
if self.device_offset is None:
|
||||
query = 'SELECT file_path, modified_date FROM books'
|
||||
cursor.execute(query)
|
||||
|
||||
time_offsets = {}
|
||||
for i, row in enumerate(cursor):
|
||||
comp_date = int(os.path.getmtime(self.normalize_path(prefix + row[0])) * 1000);
|
||||
device_date = int(row[1]);
|
||||
offset = device_date - comp_date
|
||||
time_offsets.setdefault(offset, 0)
|
||||
time_offsets[offset] = time_offsets[offset] + 1
|
||||
|
||||
try:
|
||||
device_offset = max(time_offsets,key = lambda a: time_offsets.get(a))
|
||||
debug_print("Device Offset: %d ms"%device_offset)
|
||||
self.device_offset = device_offset
|
||||
except ValueError:
|
||||
debug_print("No Books To Detect Device Offset.")
|
||||
|
||||
for idx, book in enumerate(bl):
|
||||
query = 'SELECT _id, thumbnail FROM books WHERE file_path = ?'
|
||||
t = (book.lpath,)
|
||||
@ -237,6 +269,7 @@ class PRST1(USBMS):
|
||||
opts = self.settings()
|
||||
upload_covers = opts.extra_customization[self.OPT_UPLOAD_COVERS]
|
||||
refresh_covers = opts.extra_customization[self.OPT_REFRESH_COVERS]
|
||||
use_sony_authors = opts.extra_customization[self.OPT_USE_SONY_AUTHORS]
|
||||
|
||||
cursor = connection.cursor()
|
||||
|
||||
@ -261,20 +294,26 @@ class PRST1(USBMS):
|
||||
lpath = book.lpath
|
||||
try:
|
||||
if opts.use_author_sort:
|
||||
if newmi.author_sort :
|
||||
if newmi.author_sort:
|
||||
author = newmi.author_sort
|
||||
else:
|
||||
author = authors_to_sort_string(newmi.authors)
|
||||
else:
|
||||
if use_sony_authors:
|
||||
author = newmi.authors[0]
|
||||
else:
|
||||
author = authors_to_string(newmi.authors)
|
||||
except:
|
||||
author = _('Unknown')
|
||||
title = newmi.title or _('Unknown')
|
||||
|
||||
# Get modified date
|
||||
modified_date = os.path.getmtime(book.path)
|
||||
time_offset = time.altzone if time.daylight else time.timezone
|
||||
modified_date = (modified_date - time_offset) * 1000
|
||||
modified_date = os.path.getmtime(book.path) * 1000
|
||||
if self.device_offset is not None:
|
||||
modified_date = modified_date + self.device_offset
|
||||
else:
|
||||
time_offset = -time.altzone if time.daylight else -time.timezone
|
||||
modified_date = modified_date + (time_offset * 1000)
|
||||
|
||||
if lpath not in db_books:
|
||||
query = '''
|
||||
|
Loading…
x
Reference in New Issue
Block a user