From 488cc540cd112d804a6145952ab6b07e5e12c4f1 Mon Sep 17 00:00:00 2001 From: snah Date: Sat, 6 Jul 2019 11:01:28 +0800 Subject: [PATCH] Allow users to specify Kobo directory and add 'ip' command for linux --- obok_src/action.py | 2 +- obok_src/config.py | 25 ++++++++++++++++++++---- obok_src/obok/obok.py | 44 +++++++++++++++++++++++++++---------------- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/obok_src/action.py b/obok_src/action.py index af843b9..a0b63a6 100644 --- a/obok_src/action.py +++ b/obok_src/action.py @@ -93,7 +93,7 @@ class InterfacePluginAction(InterfaceAction): debug_print("Exception getting device path. Probably not an E-Ink Kobo device") # Get the Kobo Library object (obok v3.01) - self.library = KoboLibrary(tmpserials, device_path) + self.library = KoboLibrary(tmpserials, device_path, cfg['kobo_directory']) debug_print ("got kobodir %s" % self.library.kobodir) if (self.library.kobodir == ''): # linux and no device connected, but could be extended diff --git a/obok_src/config.py b/obok_src/config.py index ae4edc0..0b2fcab 100644 --- a/obok_src/config.py +++ b/obok_src/config.py @@ -3,9 +3,9 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) try: - from PyQt5.Qt import (Qt, QGroupBox, QListWidget, QLineEdit, QDialogButtonBox, QWidget, QLabel, QDialog, QVBoxLayout, QAbstractItemView, QIcon, QHBoxLayout, QComboBox, QListWidgetItem) + from PyQt5.Qt import (Qt, QGroupBox, QListWidget, QLineEdit, QDialogButtonBox, QWidget, QLabel, QDialog, QVBoxLayout, QAbstractItemView, QIcon, QHBoxLayout, QComboBox, QListWidgetItem, QFileDialog) except ImportError: - from PyQt4.Qt import (Qt, QGroupBox, QListWidget, QLineEdit, QDialogButtonBox, QWidget, QLabel, QDialog, QVBoxLayout, QAbstractItemView, QIcon, QHBoxLayout, QComboBox, QListWidgetItem) + from PyQt4.Qt import (Qt, QGroupBox, QListWidget, QLineEdit, QDialogButtonBox, QWidget, QLabel, QDialog, QVBoxLayout, QAbstractItemView, QIcon, QHBoxLayout, QComboBox, QListWidgetItem, QFileDialog) try: from PyQt5 import Qt as QtGui @@ -18,6 +18,7 @@ from calibre.utils.config import JSONConfig, config_dir plugin_prefs = JSONConfig('plugins/obok_dedrm_prefs') plugin_prefs.defaults['finding_homes_for_formats'] = 'Ask' plugin_prefs.defaults['kobo_serials'] = [] +plugin_prefs.defaults['kobo_directory'] = u'' from calibre_plugins.obok_dedrm.__init__ import PLUGIN_NAME, PLUGIN_VERSION from calibre_plugins.obok_dedrm.utilities import (debug_print) @@ -37,6 +38,7 @@ class ConfigWidget(QWidget): # copy of preferences self.tmpserials = plugin_prefs['kobo_serials'] + self.kobodirectory = plugin_prefs['kobo_directory'] combo_label = QLabel(_('When should Obok try to insert EPUBs into existing calibre entries?'), self) layout.addWidget(combo_label) @@ -53,15 +55,30 @@ class ConfigWidget(QWidget): self.serials_button.clicked.connect(self.edit_serials) layout.addWidget(self.serials_button) + self.kobo_directory_button = QtGui.QPushButton(self) + self.kobo_directory_button.setToolTip(_(u"Click to specify the Kobo directory")) + self.kobo_directory_button.setText(u"Kobo directory") + self.kobo_directory_button.clicked.connect(self.edit_kobo_directory) + layout.addWidget(self.kobo_directory_button) + def edit_serials(self): - d = ManageKeysDialog(self,u"Kobo device serial numbers",self.tmpserials, AddSerialDialog) + d = ManageKeysDialog(self,u"Kobo device serial number",self.tmpserials, AddSerialDialog) d.exec_() - + + def edit_kobo_directory(self): + tmpkobodirectory = QFileDialog.getExistingDirectory(self, u"Select Kobo directory", self.kobodirectory or "/home", QFileDialog.ShowDirsOnly) + + if tmpkobodirectory != u"" and tmpkobodirectory is not None: + self.kobodirectory = tmpkobodirectory + + def save_settings(self): plugin_prefs['finding_homes_for_formats'] = unicode(self.find_homes.currentText()) plugin_prefs['kobo_serials'] = self.tmpserials + plugin_prefs['kobo_directory'] = self.kobodirectory + diff --git a/obok_src/obok/obok.py b/obok_src/obok/obok.py index 033c67a..2fdf9bf 100644 --- a/obok_src/obok/obok.py +++ b/obok_src/obok/obok.py @@ -290,7 +290,7 @@ class KoboLibrary(object): written by the Kobo Desktop Edition application, including the list 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, desktopkobodir = u""): print __about__ self.kobodir = u"" kobodb = u"" @@ -344,19 +344,23 @@ class KoboLibrary(object): if (self.kobodir == u""): # step 4. we haven't found a device with serials, so try desktop apps - if sys.platform.startswith('win'): - import _winreg as winreg - if sys.getwindowsversion().major > 5: - if 'LOCALAPPDATA' in os.environ.keys(): - # Python 2.x does not return unicode env. Use Python 3.x - self.kobodir = winreg.ExpandEnvironmentStrings(u"%LOCALAPPDATA%") - if (self.kobodir == u""): - if 'USERPROFILE' in os.environ.keys(): - # Python 2.x does not return unicode env. Use Python 3.x - self.kobodir = os.path.join(winreg.ExpandEnvironmentStrings(u"%USERPROFILE%"), u"Local Settings", u"Application Data") - self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition") - elif sys.platform.startswith('darwin'): - self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition") + if desktopkobodir != u'': + self.kobodir = desktopkobodir + + if (self.kobodir == u""): + if sys.platform.startswith('win'): + import _winreg as winreg + if sys.getwindowsversion().major > 5: + if 'LOCALAPPDATA' in os.environ.keys(): + # Python 2.x does not return unicode env. Use Python 3.x + self.kobodir = winreg.ExpandEnvironmentStrings(u"%LOCALAPPDATA%") + if (self.kobodir == u""): + if 'USERPROFILE' in os.environ.keys(): + # Python 2.x does not return unicode env. Use Python 3.x + self.kobodir = os.path.join(winreg.ExpandEnvironmentStrings(u"%USERPROFILE%"), u"Local Settings", u"Application Data") + self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition") + elif sys.platform.startswith('darwin'): + self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition") #elif linux_path != None: # Probably Linux, let's get the wine prefix and path to Kobo. # self.kobodir = os.path.join(linux_path, u"Local Settings", u"Application Data", u"Kobo", u"Kobo Desktop Edition") @@ -368,7 +372,6 @@ class KoboLibrary(object): self.kobodir = u"" kobodb = u"" - if (self.kobodir != u""): self.bookdir = os.path.join(self.kobodir, u"kepub") # make a copy of the database in a temporary file @@ -450,7 +453,16 @@ class KoboLibrary(object): # print u"m:{0}".format(m[0]) macaddrs.append(m[0].upper()) else: - # probably linux, let's try ipconfig under wine + # probably linux + + # let's try ip + c = re.compile('\s(' + '[0-9a-f]{2}:' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE) + for line in os.popen('ip -br link'): + m = c.search(line) + if m: + macaddrs.append(m.group(1).upper()) + + # let's try ipconfig under wine c = re.compile('\s(' + '[0-9a-f]{2}-' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE) for line in os.popen('ipconfig /all'): m = c.search(line)