mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-06 15:47:39 +03:00
list books by file name as metadata is slow
This commit is contained in:
parent
e2124ca7a0
commit
4fecafc890
Binary file not shown.
@ -33,6 +33,10 @@ class CrossPointDevice(DeviceConfig, DevicePlugin):
|
|||||||
MUST_READ_METADATA = False
|
MUST_READ_METADATA = False
|
||||||
MANAGES_DEVICE_PRESENCE = True
|
MANAGES_DEVICE_PRESENCE = True
|
||||||
DEVICE_PLUGBOARD_NAME = 'CROSSPOINT_READER'
|
DEVICE_PLUGBOARD_NAME = 'CROSSPOINT_READER'
|
||||||
|
MUST_READ_METADATA = False
|
||||||
|
SUPPORTS_DEVICE_DB = False
|
||||||
|
# Disable Calibre's device cache so we always refresh from device.
|
||||||
|
device_is_usb_mass_storage = False
|
||||||
|
|
||||||
def __init__(self, path):
|
def __init__(self, path):
|
||||||
super().__init__(path)
|
super().__init__(path)
|
||||||
@ -210,6 +214,15 @@ class CrossPointDevice(DeviceConfig, DevicePlugin):
|
|||||||
else:
|
else:
|
||||||
filepath = infile
|
filepath = infile
|
||||||
filename = os.path.basename(name)
|
filename = os.path.basename(name)
|
||||||
|
lpath = upload_path
|
||||||
|
if not lpath.startswith('/'):
|
||||||
|
lpath = '/' + lpath
|
||||||
|
if lpath != '/' and lpath.endswith('/'):
|
||||||
|
lpath = lpath[:-1]
|
||||||
|
if lpath == '/':
|
||||||
|
lpath = '/' + filename
|
||||||
|
else:
|
||||||
|
lpath = lpath + '/' + filename
|
||||||
|
|
||||||
def _progress(sent, size):
|
def _progress(sent, size):
|
||||||
if size > 0:
|
if size > 0:
|
||||||
@ -227,11 +240,21 @@ class CrossPointDevice(DeviceConfig, DevicePlugin):
|
|||||||
progress_cb=_progress,
|
progress_cb=_progress,
|
||||||
logger=self._log,
|
logger=self._log,
|
||||||
)
|
)
|
||||||
paths.append((filename, os.path.getsize(filepath)))
|
paths.append((lpath, os.path.getsize(filepath)))
|
||||||
|
|
||||||
self.report_progress(1.0, 'Transferring books to device...')
|
self.report_progress(1.0, 'Transferring books to device...')
|
||||||
return paths
|
return paths
|
||||||
|
|
||||||
|
def add_books_to_metadata(self, locations, metadata, booklists):
|
||||||
|
metadata = iter(metadata)
|
||||||
|
for location in locations:
|
||||||
|
info = next(metadata)
|
||||||
|
lpath = location[0]
|
||||||
|
length = location[1]
|
||||||
|
book = Book('', lpath, size=length, other=info)
|
||||||
|
if booklists:
|
||||||
|
booklists[0].add_book(book, replace_metadata=True)
|
||||||
|
|
||||||
def add_books_to_metadata(self, locations, metadata, booklists):
|
def add_books_to_metadata(self, locations, metadata, booklists):
|
||||||
# No on-device catalog to update yet.
|
# No on-device catalog to update yet.
|
||||||
return
|
return
|
||||||
@ -241,13 +264,73 @@ class CrossPointDevice(DeviceConfig, DevicePlugin):
|
|||||||
status, body = self._http_post_form('/delete', {'path': path, 'type': 'file'})
|
status, body = self._http_post_form('/delete', {'path': path, 'type': 'file'})
|
||||||
if status != 200:
|
if status != 200:
|
||||||
raise ControlError(desc=f'Delete failed for {path}: {body}')
|
raise ControlError(desc=f'Delete failed for {path}: {body}')
|
||||||
|
self._log(f'[CrossPoint] deleted {path}')
|
||||||
|
|
||||||
def remove_books_from_metadata(self, paths, booklists):
|
def remove_books_from_metadata(self, paths, booklists):
|
||||||
for path in paths:
|
def norm(p):
|
||||||
|
if not p:
|
||||||
|
return ''
|
||||||
|
p = p.replace('\\', '/')
|
||||||
|
if not p.startswith('/'):
|
||||||
|
p = '/' + p
|
||||||
|
return p
|
||||||
|
|
||||||
|
def norm_name(p):
|
||||||
|
if not p:
|
||||||
|
return ''
|
||||||
|
name = os.path.basename(p)
|
||||||
|
try:
|
||||||
|
import unicodedata
|
||||||
|
name = unicodedata.normalize('NFKC', name)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
name = name.replace('\u2019', "'").replace('\u2018', "'")
|
||||||
|
return name.casefold()
|
||||||
|
|
||||||
|
device_names = set()
|
||||||
|
try:
|
||||||
|
entries = self._http_get_json('/api/files', params={'path': '/'})
|
||||||
|
on_device = set()
|
||||||
|
for entry in entries:
|
||||||
|
if entry.get('isDirectory'):
|
||||||
|
continue
|
||||||
|
name = entry.get('name', '')
|
||||||
|
if not name:
|
||||||
|
continue
|
||||||
|
on_device.add(norm(name))
|
||||||
|
on_device.add(norm('/' + name))
|
||||||
|
device_names.add(norm_name(name))
|
||||||
|
self._log(f'[CrossPoint] on-device list: {sorted(on_device)}')
|
||||||
|
except Exception as exc:
|
||||||
|
self._log(f'[CrossPoint] refresh list failed: {exc}')
|
||||||
|
on_device = None
|
||||||
|
|
||||||
|
removed = 0
|
||||||
for bl in booklists:
|
for bl in booklists:
|
||||||
for book in tuple(bl):
|
for book in tuple(bl):
|
||||||
if path == book.path or path == book.lpath:
|
bpath = norm(getattr(book, 'path', ''))
|
||||||
|
blpath = norm(getattr(book, 'lpath', ''))
|
||||||
|
self._log(f'[CrossPoint] book paths: {bpath} | {blpath}')
|
||||||
|
should_remove = False
|
||||||
|
if on_device is not None:
|
||||||
|
if device_names:
|
||||||
|
if norm_name(bpath) not in device_names and norm_name(blpath) not in device_names:
|
||||||
|
should_remove = True
|
||||||
|
elif bpath and bpath not in on_device and blpath and blpath not in on_device:
|
||||||
|
should_remove = True
|
||||||
|
else:
|
||||||
|
for path in paths:
|
||||||
|
target = norm(path)
|
||||||
|
target_name = os.path.basename(target)
|
||||||
|
if target == bpath or target == blpath:
|
||||||
|
should_remove = True
|
||||||
|
elif target_name and (os.path.basename(bpath) == target_name or os.path.basename(blpath) == target_name):
|
||||||
|
should_remove = True
|
||||||
|
if should_remove:
|
||||||
bl.remove_book(book)
|
bl.remove_book(book)
|
||||||
|
removed += 1
|
||||||
|
if removed:
|
||||||
|
self._log(f'[CrossPoint] removed {removed} items from device list')
|
||||||
|
|
||||||
def get_file(self, path, outfile, end_session=True, this_book=None, total_books=None):
|
def get_file(self, path, outfile, end_session=True, this_book=None, total_books=None):
|
||||||
url = self._http_base() + '/download'
|
url = self._http_base() + '/download'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user