diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist
index cfd9fcc..6ed5ade 100644
--- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist
+++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist
@@ -24,19 +24,19 @@
This plugin removes DRM from ebooks when they are imported into calibre. If you already have DRMed ebooks in your calibre library, you will need to remove them and import them again.
diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py index 37d4cb1..232b6bc 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py @@ -35,13 +35,14 @@ __docformat__ = 'restructuredtext en' # 6.0.6 - Fix up an incorrect function call # 6.0.7 - Error handling for incomplete PDF metadata # 6.0.8 - Fixes a Wine key issue and topaz support +# 6.0.9 - Ported to work with newer versions of Calibre (moved to Qt5). Still supports older Qt4 versions. """ Decrypt DRMed ebooks. """ PLUGIN_NAME = u"DeDRM" -PLUGIN_VERSION_TUPLE = (6, 0, 8) +PLUGIN_VERSION_TUPLE = (6, 0, 9) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) # Include an html helpfile in the plugin's zipfile with the following name. RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/config.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/config.py index 1e58476..b5c5300 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/config.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/config.py @@ -9,16 +9,24 @@ __license__ = 'GPL v3' import os, traceback, json # PyQT4 modules (part of calibre). -from PyQt4.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, +try: + from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QGroupBox, QPushButton, QListWidget, QListWidgetItem, - QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl, QString) -from PyQt4 import QtGui - + QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl) +except ImportError: + from PyQt4.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, + QGroupBox, QPushButton, QListWidget, QListWidgetItem, + QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl) +try: + from PyQt5 import Qt as QtGui +except ImportError: + from PyQt4 import QtGui + from zipfile import ZipFile # calibre modules and constants. from calibre.gui2 import (error_dialog, question_dialog, info_dialog, open_url, - choose_dir, choose_files) + choose_dir, choose_files, choose_save_file) from calibre.utils.config import dynamic, config_dir, JSONConfig from calibre.constants import iswindows, isosx @@ -267,7 +275,7 @@ class ManageKeysDialog(QDialog): def getwineprefix(self): if self.wineprefix is not None: - return unicode(self.wp_lineedit.text().toUtf8(), 'utf8').strip() + return unicode(self.wp_lineedit.text()).strip() return u"" def populate_list(self): @@ -316,7 +324,7 @@ class ManageKeysDialog(QDialog): if d.result() != d.Accepted: # rename cancelled or moot. return - keyname = unicode(self.listy.currentItem().text().toUtf8(),'utf8') + keyname = unicode(self.listy.currentItem().text()) if not question_dialog(self, "{0} {1}: Confirm Rename".format(PLUGIN_NAME, PLUGIN_VERSION), u"Do you really want to rename the {2} named {0} to {1}?".format(keyname,d.key_name,self.key_type_name), show_copy_button=False, default_yes=False): return self.plugin_keys[d.key_name] = self.plugin_keys[keyname] @@ -328,7 +336,7 @@ class ManageKeysDialog(QDialog): def delete_key(self): if not self.listy.currentItem(): return - keyname = unicode(self.listy.currentItem().text().toUtf8(), 'utf8') + keyname = unicode(self.listy.currentItem().text()) if not question_dialog(self, "{0} {1}: Confirm Delete".format(PLUGIN_NAME, PLUGIN_VERSION), u"Do you really want to delete the {1} {0}?".format(keyname, self.key_type_name), show_copy_button=False, default_yes=False): return if type(self.plugin_keys) == dict: @@ -352,9 +360,10 @@ class ManageKeysDialog(QDialog): open_url(QUrl(url)) def migrate_files(self): - dynamic[PLUGIN_NAME + u"config_dir"] = config_dir - files = choose_files(self, PLUGIN_NAME + u"config_dir", - u"Select {0} files to import".format(self.key_type_name), [(u"{0} files".format(self.key_type_name), [self.keyfile_ext])], False) + unique_dlg_name = PLUGIN_NAME + u"import {0} keys".format(self.key_type_name).replace(' ', '_') #takes care of automatically remembering last directory + caption = u"Select {0} files to import".format(self.key_type_name) + filters = [(u"{0} files".format(self.key_type_name), [self.keyfile_ext])] + files = choose_files(self, unique_dlg_name, caption, filters, all_files=False) counter = 0 skipped = 0 if files: @@ -408,17 +417,14 @@ class ManageKeysDialog(QDialog): r = error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), _(errmsg), show=True, show_copy_button=False) return - filter = QString(u"{0} Files (*.{1})".format(self.key_type_name, self.keyfile_ext)) - keyname = unicode(self.listy.currentItem().text().toUtf8(), 'utf8') - if dynamic.get(PLUGIN_NAME + 'save_dir'): - defaultname = os.path.join(dynamic.get(PLUGIN_NAME + 'save_dir'), u"{0}.{1}".format(keyname , self.keyfile_ext)) - else: - defaultname = os.path.join(os.path.expanduser('~'), u"{0}.{1}".format(keyname , self.keyfile_ext)) - filename = unicode(QtGui.QFileDialog.getSaveFileName(self, u"Save {0} File as...".format(self.key_type_name), defaultname, - u"{0} Files (*.{1})".format(self.key_type_name,self.keyfile_ext), filter)) + keyname = unicode(self.listy.currentItem().text()) + unique_dlg_name = PLUGIN_NAME + u"export {0} keys".format(self.key_type_name).replace(' ', '_') #takes care of automatically remembering last directory + caption = u"Save {0} File as...".format(self.key_type_name) + filters = [(u"{0} Files".format(self.key_type_name), [u"{0}".format(self.keyfile_ext)])] + defaultname = u"{0}.{1}".format(keyname, self.keyfile_ext) + filename = choose_save_file(self, unique_dlg_name, caption, filters, all_files=False, initial_filename=defaultname) if filename: - dynamic[PLUGIN_NAME + 'save_dir'] = os.path.split(filename)[0] - with file(filename, 'w') as fname: + with file(filename, 'wb') as fname: if self.binary_file: fname.write(self.plugin_keys[keyname].decode('hex')) elif self.json_file: @@ -458,7 +464,7 @@ class RenameKeyDialog(QDialog): self.resize(self.sizeHint()) def accept(self): - if self.key_ledit.text().isEmpty() or unicode(self.key_ledit.text()).isspace(): + if not unicode(self.key_ledit.text()) or unicode(self.key_ledit.text()).isspace(): errmsg = u"Key name field cannot be empty!" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), _(errmsg), show=True, show_copy_button=False) @@ -479,7 +485,7 @@ class RenameKeyDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @@ -553,7 +559,7 @@ class AddBandNKeyDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -562,11 +568,11 @@ class AddBandNKeyDialog(QDialog): @property def user_name(self): - return unicode(self.name_ledit.text().toUtf8(), 'utf8').strip().lower().replace(' ','') + return unicode(self.name_ledit.text()).strip().lower().replace(' ','') @property def cc_number(self): - return unicode(self.cc_ledit.text().toUtf8(), 'utf8').strip().replace(' ', '').replace('-','') + return unicode(self.cc_ledit.text()).strip().replace(' ', '').replace('-','') def accept(self): @@ -634,7 +640,7 @@ class AddEReaderDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -643,11 +649,11 @@ class AddEReaderDialog(QDialog): @property def user_name(self): - return unicode(self.name_ledit.text().toUtf8(), 'utf8').strip().lower().replace(' ','') + return unicode(self.name_ledit.text()).strip().lower().replace(' ','') @property def cc_number(self): - return unicode(self.cc_ledit.text().toUtf8(), 'utf8').strip().replace(' ', '').replace('-','') + return unicode(self.cc_ledit.text()).strip().replace(' ', '').replace('-','') def accept(self): @@ -719,7 +725,7 @@ class AddAdeptDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -792,7 +798,7 @@ class AddKindleDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -841,11 +847,11 @@ class AddSerialDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): @@ -889,11 +895,11 @@ class AddPIDDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/DeDRM_Help.htm b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/DeDRM_Help.htm index 69edade..f0c51a8 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/DeDRM_Help.htm +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/DeDRM_Help.htm @@ -17,7 +17,7 @@ p {margin-top: 0} -This plugin removes DRM from ebooks when they are imported into calibre. If you already have DRMed ebooks in your calibre library, you will need to remove them and import them again.
diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py index 37d4cb1..232b6bc 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py @@ -35,13 +35,14 @@ __docformat__ = 'restructuredtext en' # 6.0.6 - Fix up an incorrect function call # 6.0.7 - Error handling for incomplete PDF metadata # 6.0.8 - Fixes a Wine key issue and topaz support +# 6.0.9 - Ported to work with newer versions of Calibre (moved to Qt5). Still supports older Qt4 versions. """ Decrypt DRMed ebooks. """ PLUGIN_NAME = u"DeDRM" -PLUGIN_VERSION_TUPLE = (6, 0, 8) +PLUGIN_VERSION_TUPLE = (6, 0, 9) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) # Include an html helpfile in the plugin's zipfile with the following name. RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/config.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/config.py index 1e58476..b5c5300 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/config.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/config.py @@ -9,16 +9,24 @@ __license__ = 'GPL v3' import os, traceback, json # PyQT4 modules (part of calibre). -from PyQt4.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, +try: + from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QGroupBox, QPushButton, QListWidget, QListWidgetItem, - QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl, QString) -from PyQt4 import QtGui - + QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl) +except ImportError: + from PyQt4.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, + QGroupBox, QPushButton, QListWidget, QListWidgetItem, + QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl) +try: + from PyQt5 import Qt as QtGui +except ImportError: + from PyQt4 import QtGui + from zipfile import ZipFile # calibre modules and constants. from calibre.gui2 import (error_dialog, question_dialog, info_dialog, open_url, - choose_dir, choose_files) + choose_dir, choose_files, choose_save_file) from calibre.utils.config import dynamic, config_dir, JSONConfig from calibre.constants import iswindows, isosx @@ -267,7 +275,7 @@ class ManageKeysDialog(QDialog): def getwineprefix(self): if self.wineprefix is not None: - return unicode(self.wp_lineedit.text().toUtf8(), 'utf8').strip() + return unicode(self.wp_lineedit.text()).strip() return u"" def populate_list(self): @@ -316,7 +324,7 @@ class ManageKeysDialog(QDialog): if d.result() != d.Accepted: # rename cancelled or moot. return - keyname = unicode(self.listy.currentItem().text().toUtf8(),'utf8') + keyname = unicode(self.listy.currentItem().text()) if not question_dialog(self, "{0} {1}: Confirm Rename".format(PLUGIN_NAME, PLUGIN_VERSION), u"Do you really want to rename the {2} named {0} to {1}?".format(keyname,d.key_name,self.key_type_name), show_copy_button=False, default_yes=False): return self.plugin_keys[d.key_name] = self.plugin_keys[keyname] @@ -328,7 +336,7 @@ class ManageKeysDialog(QDialog): def delete_key(self): if not self.listy.currentItem(): return - keyname = unicode(self.listy.currentItem().text().toUtf8(), 'utf8') + keyname = unicode(self.listy.currentItem().text()) if not question_dialog(self, "{0} {1}: Confirm Delete".format(PLUGIN_NAME, PLUGIN_VERSION), u"Do you really want to delete the {1} {0}?".format(keyname, self.key_type_name), show_copy_button=False, default_yes=False): return if type(self.plugin_keys) == dict: @@ -352,9 +360,10 @@ class ManageKeysDialog(QDialog): open_url(QUrl(url)) def migrate_files(self): - dynamic[PLUGIN_NAME + u"config_dir"] = config_dir - files = choose_files(self, PLUGIN_NAME + u"config_dir", - u"Select {0} files to import".format(self.key_type_name), [(u"{0} files".format(self.key_type_name), [self.keyfile_ext])], False) + unique_dlg_name = PLUGIN_NAME + u"import {0} keys".format(self.key_type_name).replace(' ', '_') #takes care of automatically remembering last directory + caption = u"Select {0} files to import".format(self.key_type_name) + filters = [(u"{0} files".format(self.key_type_name), [self.keyfile_ext])] + files = choose_files(self, unique_dlg_name, caption, filters, all_files=False) counter = 0 skipped = 0 if files: @@ -408,17 +417,14 @@ class ManageKeysDialog(QDialog): r = error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), _(errmsg), show=True, show_copy_button=False) return - filter = QString(u"{0} Files (*.{1})".format(self.key_type_name, self.keyfile_ext)) - keyname = unicode(self.listy.currentItem().text().toUtf8(), 'utf8') - if dynamic.get(PLUGIN_NAME + 'save_dir'): - defaultname = os.path.join(dynamic.get(PLUGIN_NAME + 'save_dir'), u"{0}.{1}".format(keyname , self.keyfile_ext)) - else: - defaultname = os.path.join(os.path.expanduser('~'), u"{0}.{1}".format(keyname , self.keyfile_ext)) - filename = unicode(QtGui.QFileDialog.getSaveFileName(self, u"Save {0} File as...".format(self.key_type_name), defaultname, - u"{0} Files (*.{1})".format(self.key_type_name,self.keyfile_ext), filter)) + keyname = unicode(self.listy.currentItem().text()) + unique_dlg_name = PLUGIN_NAME + u"export {0} keys".format(self.key_type_name).replace(' ', '_') #takes care of automatically remembering last directory + caption = u"Save {0} File as...".format(self.key_type_name) + filters = [(u"{0} Files".format(self.key_type_name), [u"{0}".format(self.keyfile_ext)])] + defaultname = u"{0}.{1}".format(keyname, self.keyfile_ext) + filename = choose_save_file(self, unique_dlg_name, caption, filters, all_files=False, initial_filename=defaultname) if filename: - dynamic[PLUGIN_NAME + 'save_dir'] = os.path.split(filename)[0] - with file(filename, 'w') as fname: + with file(filename, 'wb') as fname: if self.binary_file: fname.write(self.plugin_keys[keyname].decode('hex')) elif self.json_file: @@ -458,7 +464,7 @@ class RenameKeyDialog(QDialog): self.resize(self.sizeHint()) def accept(self): - if self.key_ledit.text().isEmpty() or unicode(self.key_ledit.text()).isspace(): + if not unicode(self.key_ledit.text()) or unicode(self.key_ledit.text()).isspace(): errmsg = u"Key name field cannot be empty!" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), _(errmsg), show=True, show_copy_button=False) @@ -479,7 +485,7 @@ class RenameKeyDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @@ -553,7 +559,7 @@ class AddBandNKeyDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -562,11 +568,11 @@ class AddBandNKeyDialog(QDialog): @property def user_name(self): - return unicode(self.name_ledit.text().toUtf8(), 'utf8').strip().lower().replace(' ','') + return unicode(self.name_ledit.text()).strip().lower().replace(' ','') @property def cc_number(self): - return unicode(self.cc_ledit.text().toUtf8(), 'utf8').strip().replace(' ', '').replace('-','') + return unicode(self.cc_ledit.text()).strip().replace(' ', '').replace('-','') def accept(self): @@ -634,7 +640,7 @@ class AddEReaderDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -643,11 +649,11 @@ class AddEReaderDialog(QDialog): @property def user_name(self): - return unicode(self.name_ledit.text().toUtf8(), 'utf8').strip().lower().replace(' ','') + return unicode(self.name_ledit.text()).strip().lower().replace(' ','') @property def cc_number(self): - return unicode(self.cc_ledit.text().toUtf8(), 'utf8').strip().replace(' ', '').replace('-','') + return unicode(self.cc_ledit.text()).strip().replace(' ', '').replace('-','') def accept(self): @@ -719,7 +725,7 @@ class AddAdeptDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -792,7 +798,7 @@ class AddKindleDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -841,11 +847,11 @@ class AddSerialDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): @@ -889,11 +895,11 @@ class AddPIDDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): diff --git a/DeDRM_calibre_plugin/DeDRM_plugin.zip b/DeDRM_calibre_plugin/DeDRM_plugin.zip index 58d8174..b314cb0 100644 Binary files a/DeDRM_calibre_plugin/DeDRM_plugin.zip and b/DeDRM_calibre_plugin/DeDRM_plugin.zip differ diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/DeDRM_Help.htm b/DeDRM_calibre_plugin/DeDRM_plugin/DeDRM_Help.htm index 69edade..f0c51a8 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/DeDRM_Help.htm +++ b/DeDRM_calibre_plugin/DeDRM_plugin/DeDRM_Help.htm @@ -17,7 +17,7 @@ p {margin-top: 0} -This plugin removes DRM from ebooks when they are imported into calibre. If you already have DRMed ebooks in your calibre library, you will need to remove them and import them again.
diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py index 37d4cb1..232b6bc 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py @@ -35,13 +35,14 @@ __docformat__ = 'restructuredtext en' # 6.0.6 - Fix up an incorrect function call # 6.0.7 - Error handling for incomplete PDF metadata # 6.0.8 - Fixes a Wine key issue and topaz support +# 6.0.9 - Ported to work with newer versions of Calibre (moved to Qt5). Still supports older Qt4 versions. """ Decrypt DRMed ebooks. """ PLUGIN_NAME = u"DeDRM" -PLUGIN_VERSION_TUPLE = (6, 0, 8) +PLUGIN_VERSION_TUPLE = (6, 0, 9) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) # Include an html helpfile in the plugin's zipfile with the following name. RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/config.py b/DeDRM_calibre_plugin/DeDRM_plugin/config.py index 1e58476..b5c5300 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/config.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/config.py @@ -9,16 +9,24 @@ __license__ = 'GPL v3' import os, traceback, json # PyQT4 modules (part of calibre). -from PyQt4.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, +try: + from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QGroupBox, QPushButton, QListWidget, QListWidgetItem, - QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl, QString) -from PyQt4 import QtGui - + QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl) +except ImportError: + from PyQt4.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, + QGroupBox, QPushButton, QListWidget, QListWidgetItem, + QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl) +try: + from PyQt5 import Qt as QtGui +except ImportError: + from PyQt4 import QtGui + from zipfile import ZipFile # calibre modules and constants. from calibre.gui2 import (error_dialog, question_dialog, info_dialog, open_url, - choose_dir, choose_files) + choose_dir, choose_files, choose_save_file) from calibre.utils.config import dynamic, config_dir, JSONConfig from calibre.constants import iswindows, isosx @@ -267,7 +275,7 @@ class ManageKeysDialog(QDialog): def getwineprefix(self): if self.wineprefix is not None: - return unicode(self.wp_lineedit.text().toUtf8(), 'utf8').strip() + return unicode(self.wp_lineedit.text()).strip() return u"" def populate_list(self): @@ -316,7 +324,7 @@ class ManageKeysDialog(QDialog): if d.result() != d.Accepted: # rename cancelled or moot. return - keyname = unicode(self.listy.currentItem().text().toUtf8(),'utf8') + keyname = unicode(self.listy.currentItem().text()) if not question_dialog(self, "{0} {1}: Confirm Rename".format(PLUGIN_NAME, PLUGIN_VERSION), u"Do you really want to rename the {2} named {0} to {1}?".format(keyname,d.key_name,self.key_type_name), show_copy_button=False, default_yes=False): return self.plugin_keys[d.key_name] = self.plugin_keys[keyname] @@ -328,7 +336,7 @@ class ManageKeysDialog(QDialog): def delete_key(self): if not self.listy.currentItem(): return - keyname = unicode(self.listy.currentItem().text().toUtf8(), 'utf8') + keyname = unicode(self.listy.currentItem().text()) if not question_dialog(self, "{0} {1}: Confirm Delete".format(PLUGIN_NAME, PLUGIN_VERSION), u"Do you really want to delete the {1} {0}?".format(keyname, self.key_type_name), show_copy_button=False, default_yes=False): return if type(self.plugin_keys) == dict: @@ -352,9 +360,10 @@ class ManageKeysDialog(QDialog): open_url(QUrl(url)) def migrate_files(self): - dynamic[PLUGIN_NAME + u"config_dir"] = config_dir - files = choose_files(self, PLUGIN_NAME + u"config_dir", - u"Select {0} files to import".format(self.key_type_name), [(u"{0} files".format(self.key_type_name), [self.keyfile_ext])], False) + unique_dlg_name = PLUGIN_NAME + u"import {0} keys".format(self.key_type_name).replace(' ', '_') #takes care of automatically remembering last directory + caption = u"Select {0} files to import".format(self.key_type_name) + filters = [(u"{0} files".format(self.key_type_name), [self.keyfile_ext])] + files = choose_files(self, unique_dlg_name, caption, filters, all_files=False) counter = 0 skipped = 0 if files: @@ -408,17 +417,14 @@ class ManageKeysDialog(QDialog): r = error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), _(errmsg), show=True, show_copy_button=False) return - filter = QString(u"{0} Files (*.{1})".format(self.key_type_name, self.keyfile_ext)) - keyname = unicode(self.listy.currentItem().text().toUtf8(), 'utf8') - if dynamic.get(PLUGIN_NAME + 'save_dir'): - defaultname = os.path.join(dynamic.get(PLUGIN_NAME + 'save_dir'), u"{0}.{1}".format(keyname , self.keyfile_ext)) - else: - defaultname = os.path.join(os.path.expanduser('~'), u"{0}.{1}".format(keyname , self.keyfile_ext)) - filename = unicode(QtGui.QFileDialog.getSaveFileName(self, u"Save {0} File as...".format(self.key_type_name), defaultname, - u"{0} Files (*.{1})".format(self.key_type_name,self.keyfile_ext), filter)) + keyname = unicode(self.listy.currentItem().text()) + unique_dlg_name = PLUGIN_NAME + u"export {0} keys".format(self.key_type_name).replace(' ', '_') #takes care of automatically remembering last directory + caption = u"Save {0} File as...".format(self.key_type_name) + filters = [(u"{0} Files".format(self.key_type_name), [u"{0}".format(self.keyfile_ext)])] + defaultname = u"{0}.{1}".format(keyname, self.keyfile_ext) + filename = choose_save_file(self, unique_dlg_name, caption, filters, all_files=False, initial_filename=defaultname) if filename: - dynamic[PLUGIN_NAME + 'save_dir'] = os.path.split(filename)[0] - with file(filename, 'w') as fname: + with file(filename, 'wb') as fname: if self.binary_file: fname.write(self.plugin_keys[keyname].decode('hex')) elif self.json_file: @@ -458,7 +464,7 @@ class RenameKeyDialog(QDialog): self.resize(self.sizeHint()) def accept(self): - if self.key_ledit.text().isEmpty() or unicode(self.key_ledit.text()).isspace(): + if not unicode(self.key_ledit.text()) or unicode(self.key_ledit.text()).isspace(): errmsg = u"Key name field cannot be empty!" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), _(errmsg), show=True, show_copy_button=False) @@ -479,7 +485,7 @@ class RenameKeyDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @@ -553,7 +559,7 @@ class AddBandNKeyDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -562,11 +568,11 @@ class AddBandNKeyDialog(QDialog): @property def user_name(self): - return unicode(self.name_ledit.text().toUtf8(), 'utf8').strip().lower().replace(' ','') + return unicode(self.name_ledit.text()).strip().lower().replace(' ','') @property def cc_number(self): - return unicode(self.cc_ledit.text().toUtf8(), 'utf8').strip().replace(' ', '').replace('-','') + return unicode(self.cc_ledit.text()).strip().replace(' ', '').replace('-','') def accept(self): @@ -634,7 +640,7 @@ class AddEReaderDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -643,11 +649,11 @@ class AddEReaderDialog(QDialog): @property def user_name(self): - return unicode(self.name_ledit.text().toUtf8(), 'utf8').strip().lower().replace(' ','') + return unicode(self.name_ledit.text()).strip().lower().replace(' ','') @property def cc_number(self): - return unicode(self.cc_ledit.text().toUtf8(), 'utf8').strip().replace(' ', '').replace('-','') + return unicode(self.cc_ledit.text()).strip().replace(' ', '').replace('-','') def accept(self): @@ -719,7 +725,7 @@ class AddAdeptDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -792,7 +798,7 @@ class AddKindleDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): @@ -841,11 +847,11 @@ class AddSerialDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): @@ -889,11 +895,11 @@ class AddPIDDialog(QDialog): @property def key_name(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() @property def key_value(self): - return unicode(self.key_ledit.text().toUtf8(), 'utf8').strip() + return unicode(self.key_ledit.text()).strip() def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): diff --git a/Other_Tools/Kindle_for_Android_Patches/kindle_version_4.0.2.1/kindle4.0.2.1.patch b/Other_Tools/Kindle_for_Android_Patches/kindle_version_4.0.2.1/kindle4.0.2.1.patch new file mode 100644 index 0000000..010f68f --- /dev/null +++ b/Other_Tools/Kindle_for_Android_Patches/kindle_version_4.0.2.1/kindle4.0.2.1.patch @@ -0,0 +1,238 @@ +Only in kindle4.0.2.1: build +diff -r -u10 kindle4.0.2.1_orig/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali kindle4.0.2.1/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali +--- kindle4.0.2.1_orig/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali 2013-05-22 18:39:03.000000000 -0500 ++++ kindle4.0.2.1/smali/com/amazon/kcp/application/AndroidDeviceInformationProvider.smali 2013-05-23 16:54:53.000000000 -0500 +@@ -36,20 +36,22 @@ + .field private maxCpuSpeed:J + + .field private maxMemory:J + + .field private minCpuSpeed:J + + .field private resources:Landroid/content/res/Resources; + + .field private security:Lcom/mobipocket/android/library/reader/AndroidSecurity; + ++.field private pidList:Ljava/lang/String; ++ + .field private totalMemory:J + + + # direct methods + .method static constructor