Fix handling of null series index on Kobo devices

Wasn't checking for nulls properly, so could get an error in unusual circumstances, and also not do the update in others.

Plus a firmware version bump for an upcoming release.
This commit is contained in:
David 2020-10-29 22:50:47 +11:00
parent 2cf8312e6a
commit 5a134e40fb

View File

@ -950,7 +950,7 @@ class KOBO(USBMS):
def sync_booklists(self, booklists, end_session=True): def sync_booklists(self, booklists, end_session=True):
debug_print('KOBO:sync_booklists - start') debug_print('KOBO:sync_booklists - start')
paths = self.get_device_paths() paths = self.get_device_paths()
debug_print('KOBO:sync_booklists - booklists:', booklists) # debug_print('KOBO:sync_booklists - booklists:', booklists)
blists = {} blists = {}
for i in paths: for i in paths:
@ -1363,7 +1363,7 @@ class KOBOTOUCH(KOBO):
# Starting with firmware version 3.19.x, the last number appears to be is a # Starting with firmware version 3.19.x, the last number appears to be is a
# build number. A number will be recorded here but it can be safely ignored # build number. A number will be recorded here but it can be safely ignored
# when testing the firmware version. # when testing the firmware version.
max_supported_fwversion = (4, 24, 15672) max_supported_fwversion = (4, 25, 15821)
# The following document firwmare versions where new function or devices were added. # The following document firwmare versions where new function or devices were added.
# Not all are used, but this feels a good place to record it. # Not all are used, but this feels a good place to record it.
min_fwversion_shelves = (2, 0, 0) min_fwversion_shelves = (2, 0, 0)
@ -1758,6 +1758,7 @@ class KOBOTOUCH(KOBO):
bl[idx].kobo_series = series bl[idx].kobo_series = series
bl[idx].kobo_series_number = seriesnumber bl[idx].kobo_series_number = seriesnumber
bl[idx].kobo_series_id = SeriesID bl[idx].kobo_series_id = SeriesID
bl[idx].kobo_series_number_float = SeriesNumberFloat
bl[idx].kobo_subtitle = Subtitle bl[idx].kobo_subtitle = Subtitle
bl[idx].can_put_on_shelves = allow_shelves bl[idx].can_put_on_shelves = allow_shelves
bl[idx].mime = MimeType bl[idx].mime = MimeType
@ -1817,6 +1818,7 @@ class KOBOTOUCH(KOBO):
book.kobo_series = series book.kobo_series = series
book.kobo_series_number = seriesnumber book.kobo_series_number = seriesnumber
book.kobo_series_id = SeriesID book.kobo_series_id = SeriesID
book.kobo_series_number_float = SeriesNumberFloat
book.kobo_subtitle = Subtitle book.kobo_subtitle = Subtitle
book.can_put_on_shelves = allow_shelves book.can_put_on_shelves = allow_shelves
# debug_print('KoboTouch:update_booklist - title=', title, 'book.device_collections', book.device_collections) # debug_print('KoboTouch:update_booklist - title=', title, 'book.device_collections', book.device_collections)
@ -3153,14 +3155,12 @@ class KOBOTOUCH(KOBO):
changes_found = False changes_found = False
kobo_metadata = book.kobo_metadata kobo_metadata = book.kobo_metadata
series_changed = not (newmi.series == kobo_metadata.series) if show_debug:
series_number_changed = False debug_print('KoboTouch:set_core_metadata newmi.series="%s"' % (newmi.series, ))
if kobo_metadata.series_index is not None: debug_print('KoboTouch:set_core_metadata kobo_metadata.series="%s"' % (kobo_metadata.series, ))
try: debug_print('KoboTouch:set_core_metadata newmi.series_index="%s"' % (newmi.series_index, ))
kobo_series_number = float(book.kobo_series_number) debug_print('KoboTouch:set_core_metadata kobo_metadata.series_index="%s"' % (kobo_metadata.series_index, ))
except: debug_print('KoboTouch:set_core_metadata book.kobo_series_number="%s"' % (book.kobo_series_number, ))
kobo_series_number = None
series_number_changed = not (kobo_series_number == newmi.series_index)
if newmi.series is not None: if newmi.series is not None:
new_series = newmi.series new_series = newmi.series
@ -3172,6 +3172,14 @@ class KOBOTOUCH(KOBO):
new_series = None new_series = None
new_series_number = None new_series_number = None
series_changed = not (new_series == kobo_metadata.series)
series_number_changed = not (new_series_number == book.kobo_series_number)
if show_debug:
debug_print('KoboTouch:set_core_metadata new_series="%s"' % (new_series, ))
debug_print('KoboTouch:set_core_metadata new_series_number="%s"' % (new_series_number, ))
debug_print('KoboTouch:set_core_metadata series_number_changed="%s"' % (series_number_changed, ))
debug_print('KoboTouch:set_core_metadata series_changed="%s"' % (series_changed, ))
if series_changed or series_number_changed: if series_changed or series_number_changed:
update_values.append(new_series) update_values.append(new_series)
set_clause += ', Series = ? ' set_clause += ', Series = ? '
@ -3179,12 +3187,22 @@ class KOBOTOUCH(KOBO):
set_clause += ', SeriesNumber = ? ' set_clause += ', SeriesNumber = ? '
if self.supports_series_list and book.is_sideloaded: if self.supports_series_list and book.is_sideloaded:
series_id = self.kobo_series_dict.get(new_series, new_series) series_id = self.kobo_series_dict.get(new_series, new_series)
if not book.kobo_series_id == series_id or series_changed or series_number_changed: try:
kobo_series_id = book.kobo_series_id
kobo_series_number_float = book.kobo_series_number_float
except: # This should mean the book was sent to the device during the current session.
kobo_series_id = None
kobo_series_number_float = None
if series_changed or series_number_changed \
or not kobo_series_id == series_id \
or not kobo_series_number_float == newmi.series_index:
update_values.append(series_id) update_values.append(series_id)
set_clause += ', SeriesID = ? ' set_clause += ', SeriesID = ? '
update_values.append(new_series_number) update_values.append(newmi.series_index)
set_clause += ', SeriesNumberFloat = ? ' set_clause += ', SeriesNumberFloat = ? '
debug_print("KoboTouch:set_core_metadata Setting SeriesID - new_series='%s', series_id='%s'" % (new_series, series_id)) if show_debug:
debug_print("KoboTouch:set_core_metadata Setting SeriesID - new_series='%s', series_id='%s'" % (new_series, series_id))
if not series_only: if not series_only:
if not (newmi.title == kobo_metadata.title): if not (newmi.title == kobo_metadata.title):