move serial detection into obok.py, cater for cmd usage

This commit is contained in:
Norbert Preining 2015-12-28 09:35:29 +09:00
parent a863a4856a
commit b6046d3f4b
2 changed files with 65 additions and 31 deletions

View file

@ -34,15 +34,6 @@ from calibre_plugins.obok_dedrm.utilities import (
from calibre_plugins.obok_dedrm.obok.obok import KoboLibrary from calibre_plugins.obok_dedrm.obok.obok import KoboLibrary
from calibre_plugins.obok_dedrm.obok.legacy_obok import legacy_obok from calibre_plugins.obok_dedrm.obok.legacy_obok import legacy_obok
can_parse_xml = True
try:
from xml.etree import ElementTree as ET
debug_print("using xml.etree for xml parsing")
except ImportError:
can_parse_xml = False
debug_print("Cannot find xml.etree, disabling extraction of serial numbers")
PLUGIN_ICONS = ['images/obok.png'] PLUGIN_ICONS = ['images/obok.png']
try: try:
@ -96,19 +87,6 @@ class InterfacePluginAction(InterfaceAction):
if (device): if (device):
device_path = device._main_prefix device_path = device._main_prefix
debug_print("get_device_settings - device_path=", device_path) debug_print("get_device_settings - device_path=", device_path)
# get serial from device_path/.adobe-digital-editions/device.xml
if can_parse_xml:
devicexml = os.path.join(device_path, '.adobe-digital-editions', 'device.xml')
debug_print("trying to load %s" % devicexml)
if (os.path.exists(devicexml)):
debug_print("trying to parse %s" % devicexml)
xmltree = ET.parse(devicexml)
for node in xmltree.iter():
if "deviceSerial" in node.tag:
serial = node.text
debug_print ("found serial %s" % serial)
tmpserials.append(serial)
break
else: else:
debug_print("didn't find device") debug_print("didn't find device")
except: except:

View file

@ -3,6 +3,7 @@
# Version 3.1.9 December 2015 # Version 3.1.9 December 2015
# Update for latest version of Windows Desktop app. # Update for latest version of Windows Desktop app.
# Support Kobo devices in the command line version.
# #
# Version 3.1.8 November 2015 # Version 3.1.8 November 2015
# Handle the case of Kobo Arc or Vox device (i.e. don't crash). # Handle the case of Kobo Arc or Vox device (i.e. don't crash).
@ -132,7 +133,8 @@
# #
"""Manage all Kobo books, either encrypted or DRM-free.""" """Manage all Kobo books, either encrypted or DRM-free."""
__version__ = '3.1.7' __version__ = '3.1.9'
__about__ = u"Obok v{0}\nCopyright © 2012-2015 Physisticated et al.".format(__version__)
import sys import sys
import os import os
@ -146,6 +148,15 @@ import hashlib
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import string import string
import shutil import shutil
import argparse
can_parse_xml = True
try:
from xml.etree import ElementTree as ET
# print u"using xml.etree for xml parsing"
except ImportError:
can_parse_xml = False
# print u"Cannot find xml.etree, disabling extraction of serial numbers"
# List of all known hash keys # List of all known hash keys
KOBO_HASH_KEYS = ['88b3a2e13', 'XzUhGYdFp', 'NoCanLook'] KOBO_HASH_KEYS = ['88b3a2e13', 'XzUhGYdFp', 'NoCanLook']
@ -261,24 +272,59 @@ class KoboLibrary(object):
of books, their titles, and the user's encryption key(s).""" of books, their titles, and the user's encryption key(s)."""
def __init__ (self, serials = [], device_path = None): def __init__ (self, serials = [], device_path = None):
print u"Obok v{0}\nCopyright © 2012-2015 Physisticated et al.".format(__version__) print __about__
self.kobodir = u"" self.kobodir = u""
kobodb = u"" kobodb = u""
# - first check whether serials have been found or are provided # Order of checks
# and a device is connected. In this case, use the device # 1. first check if a device_path has been passed in, and whether
# - otherwise fall back to Kobo Desktop Application for Windows and Mac # we can find the sqlite db in the respective place
if (device_path and (len(serials) > 0)): # 2. if 1., and we got some serials passed in (from saved
# settings in calibre), just use it
# 3. if 1. worked, but we didn't get serials, try to parse them
# from the device, if this didn't work, unset everything
# 4. if by now we don't have kobodir set, give up on device and
# try to use the Desktop app.
# step 1. check whether this looks like a real device
if (device_path):
# we got a device path
self.kobodir = os.path.join(device_path, u".kobo") self.kobodir = os.path.join(device_path, u".kobo")
# devices use KoboReader.sqlite # devices use KoboReader.sqlite
kobodb = os.path.join(self.kobodir, u"KoboReader.sqlite") kobodb = os.path.join(self.kobodir, u"KoboReader.sqlite")
if (not(os.path.isfile(kobodb))): if (not(os.path.isfile(kobodb))):
# give up here, we haven't found anything useful # device path seems to be wrong, unset it
device_path = u""
self.kobodir = u""
kobodb = u""
if (self.kobodir):
# step 3. we found a device but didn't get serials, try to get them
if (len(serials) == 0):
# we got a device path but no saved serial
# try to get the serial from the device
# print u"get_device_settings - device_path = {0}".format(device_path)
# get serial from device_path/.adobe-digital-editions/device.xml
if can_parse_xml:
devicexml = os.path.join(device_path, '.adobe-digital-editions', 'device.xml')
# print u"trying to load {0}".format(devicexml)
if (os.path.exists(devicexml)):
# print u"trying to parse {0}".format(devicexml)
xmltree = ET.parse(devicexml)
for node in xmltree.iter():
if "deviceSerial" in node.tag:
serial = node.text
# print u"found serial {0}".format(serial)
serials.append(serial)
break
else:
# print u"cannot get serials from device."
device_path = u""
self.kobodir = u"" self.kobodir = u""
kobodb = u"" kobodb = u""
if (self.kobodir == u""): if (self.kobodir == u""):
# we haven't found a device with serials, so try desktop apps # step 4. we haven't found a device with serials, so try desktop apps
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
import _winreg as winreg import _winreg as winreg
if sys.getwindowsversion().major > 5: if sys.getwindowsversion().major > 5:
@ -531,7 +577,17 @@ class KoboFile(object):
return contents return contents
def cli_main(): def cli_main():
lib = KoboLibrary() description = __about__
epilog = u"Parsing of arguments failed."
parser = argparse.ArgumentParser(prog=sys.argv[0], description=description, epilog=epilog)
parser.add_argument('--devicedir', default='/media/KOBOeReader', help="directory of connected Kobo device")
args = vars(parser.parse_args())
serials = []
devicedir = u""
if args['devicedir']:
devicedir = args['devicedir']
lib = KoboLibrary(serials, devicedir)
for i, book in enumerate(lib.books): for i, book in enumerate(lib.books):
print u"{0}: {1}".format(i + 1, book.title) print u"{0}: {1}".format(i + 1, book.title)