From 4ea0d81144e7221d1682a0f9db54ce99ff436a8f Mon Sep 17 00:00:00 2001 From: apprenticeharper Date: Wed, 30 Sep 2015 07:39:29 +0100 Subject: [PATCH] Change to unicode strings to fix stand-alone character encoding problems --- Obok_calibre_plugin/obok_plugin.zip | Bin 60732 -> 63644 bytes Obok_calibre_plugin/obok_plugin/__init__.py | 2 +- Obok_calibre_plugin/obok_plugin/obok/obok.py | 74 ++++++++------ Other_Tools/Kobo/obok.py | 102 +++++++++++++------ 4 files changed, 112 insertions(+), 66 deletions(-) diff --git a/Obok_calibre_plugin/obok_plugin.zip b/Obok_calibre_plugin/obok_plugin.zip index 3e1b918528975c691398c6c3339748fe7af4e948..2e091bcefada22d57a687072de2297bd44a89ccf 100644 GIT binary patch delta 18192 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
-T;DHhe(@*F5 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 om}goD=T1=Te 0)): - self.kobodir = os.path.join(device_path, '.kobo') + self.kobodir = os.path.join(device_path, u".kobo") # devices use KoboReader.sqlite - kobodb = os.path.join(self.kobodir, 'KoboReader.sqlite') + kobodb = os.path.join(self.kobodir, u"KoboReader.sqlite") if (not(os.path.exists(kobodb))): # give up here, we haven't found anything useful - self.kobodir = '' - kobodb = '' + self.kobodir = u"" + kobodb = u"" - if (self.kobodir == ''): + if (self.kobodir == u""): # 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: - self.kobodir = os.environ['LOCALAPPDATA'] - else: - self.kobodir = os.path.join(os.environ['USERPROFILE'], 'Local Settings', 'Application Data') - self.kobodir = os.path.join(self.kobodir, 'Kobo', 'Kobo Desktop Edition') + 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'], 'Library', 'Application Support', 'Kobo', 'Kobo Desktop Edition') + self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition") # desktop versions use Kobo.sqlite - kobodb = os.path.join(self.kobodir, 'Kobo.sqlite') + kobodb = os.path.join(self.kobodir, u"Kobo.sqlite") - if (self.kobodir != ''): - self.bookdir = os.path.join(self.kobodir, 'kepub') + if (self.kobodir != u""): + self.bookdir = os.path.join(self.kobodir, u"kepub") self.__sqlite = sqlite3.connect(kobodb) self.__cursor = self.__sqlite.cursor() self._userkeys = [] @@ -322,7 +331,7 @@ class KoboLibrary(object): def __bookfile (self, volumeid): """The filename needed to open a given book.""" - return os.path.join(self.kobodir, 'kepub', volumeid) + return os.path.join(self.kobodir, u"kepub", volumeid) def __getmacaddrs (self): """The list of all MAC addresses on this machine.""" @@ -338,7 +347,7 @@ class KoboLibrary(object): output = subprocess.check_output('/sbin/ifconfig -a', shell=True) matches = c.findall(output) for m in matches: - # print "m:",m[0] + # print u"m:{0}".format(m[0]) macaddrs.append(m[0].upper()) # extend the list of macaddrs in any case with the serials @@ -480,13 +489,13 @@ class KoboFile(object): if contents[:5]==" 5: - self.kobodir = os.environ['LOCALAPPDATA'] - else: - self.kobodir = os.path.join(os.environ['USERPROFILE'], 'Local Settings', 'Application Data') - self.kobodir = os.path.join(self.kobodir, 'Kobo', 'Kobo Desktop Edition') - elif sys.platform.startswith('darwin'): - self.kobodir = os.path.join(os.environ['HOME'], 'Library', 'Application Support', 'Kobo', 'Kobo Desktop Edition') - self.bookdir = os.path.join(self.kobodir, 'kepub') - kobodb = os.path.join(self.kobodir, 'Kobo.sqlite') - self.__sqlite = sqlite3.connect(kobodb) - self.__cursor = self.__sqlite.cursor() - self._userkeys = [] - self._books = [] - self._volumeID = [] + self.kobodir = u"" + kobodb = u"" + + # - first check whether serials have been found or are provided + # and a device is connected. In this case, use the device + # - otherwise fall back to Kobo Desktop Application for Windows and Mac + if (device_path and (len(serials) > 0)): + self.kobodir = os.path.join(device_path, u".kobo") + # devices use KoboReader.sqlite + kobodb = os.path.join(self.kobodir, u"KoboReader.sqlite") + if (not(os.path.exists(kobodb))): + # give up here, we haven't found anything useful + self.kobodir = u"" + kobodb = u"" + + if (self.kobodir == u""): + # 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") + # desktop versions use Kobo.sqlite + kobodb = os.path.join(self.kobodir, u"Kobo.sqlite") + + if (self.kobodir != u""): + self.bookdir = os.path.join(self.kobodir, u"kepub") + self.__sqlite = sqlite3.connect(kobodb) + self.__cursor = self.__sqlite.cursor() + self._userkeys = [] + self._books = [] + self._volumeID = [] + self._serials = serials def close (self): """Closes the database used by the library.""" @@ -301,7 +331,7 @@ class KoboLibrary(object): def __bookfile (self, volumeid): """The filename needed to open a given book.""" - return os.path.join(self.kobodir, 'kepub', volumeid) + return os.path.join(self.kobodir, u"kepub", volumeid) def __getmacaddrs (self): """The list of all MAC addresses on this machine.""" @@ -317,8 +347,13 @@ class KoboLibrary(object): output = subprocess.check_output('/sbin/ifconfig -a', shell=True) matches = c.findall(output) for m in matches: - # print "m:",m[0] + # print u"m:{0}".format(m[0]) macaddrs.append(m[0].upper()) + + # extend the list of macaddrs in any case with the serials + # cannot hurt ;-) + macaddrs.extend(self._serials) + return macaddrs def __getuserids (self): @@ -454,13 +489,13 @@ class KoboFile(object): if contents[:5]=="