Another attempt at fixing sony dates: combine previous voting method with use of the tz variable.

This commit is contained in:
Charles Haley 2010-08-24 12:39:25 +01:00
parent 95429a33c6
commit 359abd5d8b

View File

@ -354,19 +354,22 @@ class XMLCache(object):
root = self.record_roots[i] root = self.record_roots[i]
lpath_map = self.build_lpath_map(root) lpath_map = self.build_lpath_map(root)
gtz_count = ltz_count = 0 gtz_count = ltz_count = 0
use_tz_var = False
for book in booklist: for book in booklist:
path = os.path.join(self.prefixes[i], *(book.lpath.split('/'))) path = os.path.join(self.prefixes[i], *(book.lpath.split('/')))
record = lpath_map.get(book.lpath, None) record = lpath_map.get(book.lpath, None)
if record is None: if record is None:
record = self.create_text_record(root, i, book.lpath) record = self.create_text_record(root, i, book.lpath)
(gtz_count, ltz_count) = self.update_text_record(record, book, (gtz_count, ltz_count, use_tz_var) = \
path, i, gtz_count, ltz_count) self.update_text_record(record, book, path, i,
gtz_count, ltz_count, use_tz_var)
# Ensure the collections in the XML database are recorded for # Ensure the collections in the XML database are recorded for
# this book # this book
if book.device_collections is None: if book.device_collections is None:
book.device_collections = [] book.device_collections = []
book.device_collections = playlist_map.get(book.lpath, []) book.device_collections = playlist_map.get(book.lpath, [])
debug_print('Timezone votes: %d GMT, %d LTZ'%(gtz_count, ltz_count)) debug_print('Timezone votes: %d GMT, %d LTZ, use_tz_var='%
(gtz_count, ltz_count, use_tz_var))
self.update_playlists(i, root, booklist, collections_attributes) self.update_playlists(i, root, booklist, collections_attributes)
# Update the device collections because update playlist could have added # Update the device collections because update playlist could have added
# some new ones. # some new ones.
@ -464,21 +467,27 @@ class XMLCache(object):
root.append(ans) root.append(ans)
return ans return ans
def update_text_record(self, record, book, path, bl_index, gtz_count, ltz_count): def update_text_record(self, record, book, path, bl_index,
gtz_count, ltz_count, use_tz_var):
''' '''
Update the Sony database from the book. This is done if the timestamp in Update the Sony database from the book. This is done if the timestamp in
the db differs from the timestamp on the file. the db differs from the timestamp on the file.
''' '''
# It seems that a Sony device can sometimes know what timezone it is in, # It seems that a Sony device can sometimes know what timezone it is in,
# and apparently converts the dates to GMT when it writes them to the # and apparently converts the dates to GMT when it writes them to its
# db. Unfortunately, we can't tell when it does this, so we use a # DB. We can detect that a device is timezone-aware because there is a
# horrible heuristic. First, set dates only for new books, trying to # 'tz' variable in the Sony DB, which we can set to "0" to tell the
# avoid upsetting the sony. Use the timezone determined through the # device to ignore its own timezone when comparing mtime to the date in
# voting described next. Second, voting: if a book is not new, compare # the DB.
# its Sony DB date against localtime and gmtime. Count the matches. When
# we must set a date, use the one with the most matches. Use localtime # Unfortunately, if there is no tz variable in the DB, then we can't
# if the case of a tie, and hope it is right. # tell when the device applies a timezone conversion. We use a horrible
# heuristic to work around this problem. First, set dates only for new
# books, trying to avoid upsetting the sony. Second, voting: if a book
# is not new, compare its Sony DB date against localtime and gmtime.
# Count the matches. When we must set a date, use the one with the most
# matches. Use localtime if the case of a tie, and hope it is right.
timestamp = os.path.getmtime(path) timestamp = os.path.getmtime(path)
rec_date = record.get('date', None) rec_date = record.get('date', None)
@ -489,20 +498,25 @@ class XMLCache(object):
return x return x
if not getattr(book, '_new_book', False): # book is not new if not getattr(book, '_new_book', False): # book is not new
if strftime(timestamp, zone=time.gmtime) == rec_date: if record.get('tz', None) is not None:
gtz_count += 1 use_tz_var = True
elif strftime(timestamp, zone=time.localtime) == rec_date: if strftime(timestamp, zone=time.gmtime) == rec_date:
ltz_count += 1 gtz_count += 1
elif strftime(timestamp, zone=time.localtime) == rec_date:
ltz_count += 1
else: # book is new. Set the time using the current votes else: # book is new. Set the time using the current votes
if ltz_count >= gtz_count: if use_tz_var:
tz = time.localtime tz = time.localtime
debug_print("Using localtime TZ for new book", book.lpath) record.set('tz', '0')
debug_print("Use localtime TZ and tz='0' for new book", book.lpath)
elif ltz_count >= gtz_count:
tz = time.localtime
debug_print("Use localtime TZ for new book", book.lpath)
else: else:
tz = time.gmtime tz = time.gmtime
debug_print("Using GMT TZ for new book", book.lpath) debug_print("Use GMT TZ for new book", book.lpath)
date = strftime(timestamp, zone=tz) date = strftime(timestamp, zone=tz)
record.set('date', clean(date)) record.set('date', clean(date))
record.set('size', clean(str(os.stat(path).st_size))) record.set('size', clean(str(os.stat(path).st_size)))
title = book.title if book.title else _('Unknown') title = book.title if book.title else _('Unknown')
record.set('title', clean(title)) record.set('title', clean(title))
@ -532,7 +546,7 @@ class XMLCache(object):
if 'id' not in record.attrib: if 'id' not in record.attrib:
num = self.max_id(record.getroottree().getroot()) num = self.max_id(record.getroottree().getroot())
record.set('id', str(num+1)) record.set('id', str(num+1))
return (gtz_count, ltz_count) return (gtz_count, ltz_count, use_tz_var)
# }}} # }}}
# Writing the XML files {{{ # Writing the XML files {{{