mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add in the stuff to age the smart device book cache, to avoid requiring conversion later.
This commit is contained in:
parent
c480169ec5
commit
d99c4fea8c
@ -9,6 +9,7 @@ Created on 29 Jun 2012
|
|||||||
'''
|
'''
|
||||||
import socket, select, json, os, traceback, time, sys, random, cPickle
|
import socket, select, json, os, traceback, time, sys, random, cPickle
|
||||||
import posixpath
|
import posixpath
|
||||||
|
from collections import defaultdict
|
||||||
import hashlib, threading
|
import hashlib, threading
|
||||||
import Queue
|
import Queue
|
||||||
|
|
||||||
@ -35,7 +36,7 @@ from calibre.library.server import server_config as content_server_config
|
|||||||
from calibre.ptempfile import PersistentTemporaryFile
|
from calibre.ptempfile import PersistentTemporaryFile
|
||||||
from calibre.utils.ipc import eintr_retry_call
|
from calibre.utils.ipc import eintr_retry_call
|
||||||
from calibre.utils.config_base import tweaks
|
from calibre.utils.config_base import tweaks
|
||||||
from calibre.utils.date import parse_date
|
from calibre.utils.date import parse_date, now, isoformat
|
||||||
from calibre.utils.filenames import ascii_filename as sanitize, shorten_components_to
|
from calibre.utils.filenames import ascii_filename as sanitize, shorten_components_to
|
||||||
from calibre.utils.mdns import (publish as publish_zeroconf, unpublish as
|
from calibre.utils.mdns import (publish as publish_zeroconf, unpublish as
|
||||||
unpublish_zeroconf, get_all_ips)
|
unpublish_zeroconf, get_all_ips)
|
||||||
@ -370,7 +371,6 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
|
|
||||||
# copied from USBMS. Perhaps this could be a classmethod in usbms?
|
# copied from USBMS. Perhaps this could be a classmethod in usbms?
|
||||||
def _update_driveinfo_record(self, dinfo, prefix, location_code, name=None):
|
def _update_driveinfo_record(self, dinfo, prefix, location_code, name=None):
|
||||||
from calibre.utils.date import isoformat, now
|
|
||||||
import uuid
|
import uuid
|
||||||
if not isinstance(dinfo, dict):
|
if not isinstance(dinfo, dict):
|
||||||
dinfo = {}
|
dinfo = {}
|
||||||
@ -689,8 +689,9 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
# self._debug(key, lastmod, self.known_uuids[key].last_modified)
|
# self._debug(key, lastmod, self.known_uuids[key].last_modified)
|
||||||
# else:
|
# else:
|
||||||
# self._debug(key, 'not in known uuids')
|
# self._debug(key, 'not in known uuids')
|
||||||
if key in self.known_uuids and self.known_uuids[key].last_modified == lastmod:
|
if key in self.known_uuids and self.known_uuids[key]['book'].last_modified == lastmod:
|
||||||
return self.known_uuids[key].deepcopy()
|
self.known_uuids[key]['last_used'] = now()
|
||||||
|
return self.known_uuids[key]['book'].deepcopy()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _metadata_already_on_device(self, book):
|
def _metadata_already_on_device(self, book):
|
||||||
@ -710,7 +711,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
|
|
||||||
def _uuid_already_on_device(self, uuid, ext):
|
def _uuid_already_on_device(self, uuid, ext):
|
||||||
try:
|
try:
|
||||||
return self.known_uuids.get(uuid + ext, None)
|
return self.known_uuids[uuid + ext]['book']
|
||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -722,8 +723,9 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
with open(cache_file_name, mode='rb') as fd:
|
with open(cache_file_name, mode='rb') as fd:
|
||||||
json_metadata = cPickle.load(fd)
|
json_metadata = cPickle.load(fd)
|
||||||
for uuid,json_book in json_metadata.iteritems():
|
for uuid,json_book in json_metadata.iteritems():
|
||||||
book = self.json_codec.raw_to_book(json_book, SDBook, self.PREFIX)
|
book = self.json_codec.raw_to_book(json_book['book'], SDBook, self.PREFIX)
|
||||||
self.known_uuids[uuid] = book
|
self.known_uuids[uuid]['book'] = book
|
||||||
|
self.known_uuids[uuid]['last_used'] = json_book['last_used']
|
||||||
lpath = book.get('lpath')
|
lpath = book.get('lpath')
|
||||||
if lpath in self.known_metadata:
|
if lpath in self.known_metadata:
|
||||||
self.known_uuids.pop(uuid, None)
|
self.known_uuids.pop(uuid, None)
|
||||||
@ -734,9 +736,10 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
cache_file_name = os.path.join(cache_dir(),
|
cache_file_name = os.path.join(cache_dir(),
|
||||||
'device_drivers_' + self.__class__.__name__ +
|
'device_drivers_' + self.__class__.__name__ +
|
||||||
'_metadata_cache.pickle')
|
'_metadata_cache.pickle')
|
||||||
json_metadata = {}
|
json_metadata = defaultdict(dict)
|
||||||
for uuid,book in self.known_uuids.iteritems():
|
for uuid,book in self.known_uuids.iteritems():
|
||||||
json_metadata[uuid] = self.json_codec.encode_book_metadata(book)
|
json_metadata[uuid]['book'] = self.json_codec.encode_book_metadata(book['book'])
|
||||||
|
json_metadata[uuid]['last_used'] = book['last_used']
|
||||||
with open(cache_file_name, mode='wb') as fd:
|
with open(cache_file_name, mode='wb') as fd:
|
||||||
cPickle.dump(json_metadata, fd, -1)
|
cPickle.dump(json_metadata, fd, -1)
|
||||||
|
|
||||||
@ -744,14 +747,18 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
lpath = book.lpath
|
lpath = book.lpath
|
||||||
ext = os.path.splitext(lpath)[1]
|
ext = os.path.splitext(lpath)[1]
|
||||||
uuid = book.get('uuid', None)
|
uuid = book.get('uuid', None)
|
||||||
|
key = None
|
||||||
|
if uuid and ext:
|
||||||
|
key = uuid + ext
|
||||||
if remove:
|
if remove:
|
||||||
self.known_metadata.pop(lpath, None)
|
self.known_metadata.pop(lpath, None)
|
||||||
if uuid and ext:
|
if key:
|
||||||
self.known_uuids.pop(uuid+ext, None)
|
self.known_uuids.pop(key, None)
|
||||||
else:
|
else:
|
||||||
new_book = self.known_metadata[lpath] = book.deepcopy()
|
new_book = self.known_metadata[lpath] = book.deepcopy()
|
||||||
if uuid and ext:
|
if key:
|
||||||
self.known_uuids[uuid+ext] = new_book
|
self.known_uuids[key]['book'] = new_book
|
||||||
|
self.known_uuids[key]['last_used'] = now()
|
||||||
|
|
||||||
def _close_device_socket(self):
|
def _close_device_socket(self):
|
||||||
if self.device_socket is not None:
|
if self.device_socket is not None:
|
||||||
@ -1359,7 +1366,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
self.device_socket = None
|
self.device_socket = None
|
||||||
self.json_codec = JsonCodec()
|
self.json_codec = JsonCodec()
|
||||||
self.known_metadata = {}
|
self.known_metadata = {}
|
||||||
self.known_uuids = {}
|
self.known_uuids = defaultdict(dict)
|
||||||
self.debug_time = time.time()
|
self.debug_time = time.time()
|
||||||
self.debug_start_time = time.time()
|
self.debug_start_time = time.time()
|
||||||
self.max_book_packet_len = 0
|
self.max_book_packet_len = 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user