From 74a4c894cb24cb2eeadbe2bf8afcba522e430bb3 Mon Sep 17 00:00:00 2001 From: Apprentice Alf Date: Tue, 11 Jun 2013 19:41:21 +0100 Subject: [PATCH] tools v6.0.7 --- .../DeDRM.app/Contents/Info.plist | 6 +++--- .../DeDRM.app/Contents/Resources/__init__.py | 18 +++++++++++------- .../DeDRM.app/Contents/Resources/ineptepub.py | 2 +- .../DeDRM.app/Contents/Resources/ineptpdf.py | 12 ++++++++---- .../Contents/Resources/k4mobidedrm.py | 2 +- .../DeDRM.app/Contents/Resources/prefs.py | 9 ++++----- .../Contents/Resources/topazextract.py | 8 ++++---- .../DeDRM.app/Contents/Resources/wineutils.py | 2 +- .../DeDRM_App/DeDRM_lib/DeDRM_app.pyw | 2 +- .../DeDRM_App/DeDRM_lib/lib/__init__.py | 11 ++++++----- .../DeDRM_App/DeDRM_lib/lib/ineptepub.py | 2 +- .../DeDRM_App/DeDRM_lib/lib/ineptpdf.py | 12 ++++++++---- .../DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py | 2 +- .../DeDRM_App/DeDRM_lib/lib/prefs.py | 9 ++++----- .../DeDRM_App/DeDRM_lib/lib/wineutils.py | 2 +- DeDRM_calibre_plugin/DeDRM_plugin.zip | Bin 334094 -> 334161 bytes DeDRM_calibre_plugin/DeDRM_plugin/__init__.py | 4 ++-- .../DeDRM_plugin/ignoblekeygen.py | 2 +- .../DeDRM_plugin/ineptepub.py | 12 ++++++++---- DeDRM_calibre_plugin/DeDRM_plugin/ineptpdf.py | 2 +- DeDRM_calibre_plugin/DeDRM_plugin/zipfix.py | 2 +- 21 files changed, 68 insertions(+), 53 deletions(-) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist index e2d4077..9a030d4 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist @@ -24,19 +24,19 @@ CFBundleExecutable droplet CFBundleGetInfoString - DeDRM AppleScript 6.0.5. Written 2010–2013 by Apprentice Alf and others. + DeDRM AppleScript 6.0.7. Written 2010–2013 by Apprentice Alf and others. CFBundleIconFile DeDRM CFBundleIdentifier com.apple.ScriptEditor.id.707CCCD5-0C6C-4BEB-B67C-B6E866ADE85A CFBundleInfoDictionaryVersion - 6.0 + 6.0.7 CFBundleName DeDRM CFBundlePackageType APPL CFBundleShortVersionString - 6.0.5 + 6.0.7 CFBundleSignature dplt LSRequiresCarbon diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py index 35c37d7..caed6e8 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py @@ -27,14 +27,18 @@ __docformat__ = 'restructuredtext en' # Revision history: # 6.0.0 - Initial release # 6.0.1 - Bug Fixes for Windows App, Kindle for Mac and Windows Adobe Digital Editions -# 6.0.2 - Restored call to Wine to get Kindle for PC keys +# 6.0.2 - Restored call to Wine to get Kindle for PC keys, added for ADE +# 6.0.3 - Fixes for Kindle for Mac and Windows non-ascii user names +# 6.0.4 - Fixes for stand-alone scripts and applications +# and pdb files in plugin and initial conversion of prefs. +# 6.0.6 - Fix up an incorrect function call """ Decrypt DRMed ebooks. """ PLUGIN_NAME = u"DeDRM" -PLUGIN_VERSION_TUPLE = (6, 0, 5) +PLUGIN_VERSION_TUPLE = (6, 0, 7) 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' @@ -213,10 +217,10 @@ class DeDRM(FileTypePlugin): else: # linux from wineutils import WineGetKeys - scriptpath = os.join(self.alfdir,u"adobekey.py") + scriptpath = os.path.join(self.alfdir,u"adobekey.py") defaultkeys = WineGetKeys(scriptpath, u".der",dedrmprefs['adobewineprefix']) - self.default_key = default_keys[0] + self.default_key = defaultkeys[0] except: traceback.print_exc() self.default_key = u"" @@ -308,7 +312,7 @@ class DeDRM(FileTypePlugin): try: from wineutils import WineGetKeys - scriptpath = os.join(self.alfdir,u"adobekey.py") + scriptpath = os.path.join(self.alfdir,u"adobekey.py") defaultkeys = self.WineGetKeys(scriptpath, u".der",dedrmprefs['adobewineprefix']) except: pass @@ -386,7 +390,7 @@ class DeDRM(FileTypePlugin): else: # linux from wineutils import WineGetKeys - scriptpath = os.join(self.alfdir,u"kindlekey.py") + scriptpath = os.path.join(self.alfdir,u"kindlekey.py") defaultkeys = self.WineGetKeys(scriptpath, u".k4i",dedrmprefs['kindlewineprefix']) except: pass @@ -426,7 +430,7 @@ class DeDRM(FileTypePlugin): import calibre_plugins.dedrm.prefs as prefs import calibre_plugins.dedrm.erdr2pml - dedrmrefs = prefs.DeDRM_Prefs() + dedrmprefs = prefs.DeDRM_Prefs() # Attempt to decrypt epub with each encryption key (generated or provided). for keyname, userkey in dedrmprefs['ereaderkeys'].items(): keyname_masked = u"".join((u'X' if (x.isdigit()) else x) for x in keyname) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.py index 225ffa7..f8181cb 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.py @@ -3,7 +3,7 @@ from __future__ import with_statement -# ineptepub.pyw, version 5.9 +# ineptepub.pyw, version 6.1 # Copyright © 2009-2010 by i♥cabbages # Released under the terms of the GNU General Public Licence, version 3 diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py index 797db60..1986e20 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptpdf.py @@ -51,14 +51,15 @@ from __future__ import with_statement # 7.12 - Revised to allow use in calibre plugins to eliminate need for duplicate code # 7.13 - Fixed erroneous mentions of ineptepub # 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility -# 8.0 - Work if TkInter is missing +# 8.0 - Work if TkInter is missing +# 8.0.1 - Broken Metadata fix. """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "8.0" +__version__ = "8.0.1" import sys import os @@ -949,8 +950,11 @@ class PSStackParser(PSBaseParser): try: (pos, objs) = self.end_type('d') if len(objs) % 2 != 0: - raise PSSyntaxError( - 'Invalid dictionary construct: %r' % objs) + print "Incomplete dictionary construct" + objs.append("") # this isn't necessary. + # temporary fix. is this due to rental books? + # raise PSSyntaxError( + # 'Invalid dictionary construct: %r' % objs) d = dict((literal_name(k), v) \ for (k,v) in choplist(2, objs)) self.push((pos, d)) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py index 0e426a1..929ce57 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py @@ -188,7 +188,7 @@ def unescape(text): def GetDecryptedBook(infile, kDatabases, serials, pids, starttime = time.time()): # handle the obvious cases at the beginning if not os.path.isfile(infile): - raise DRMException (u"Input file does not exist.") + raise DrmException(u"Input file does not exist.") mobi = True magic3 = open(infile,'rb').read(3) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/prefs.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/prefs.py index 2c8c665..05065ac 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/prefs.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/prefs.py @@ -114,7 +114,7 @@ def convertprefs(always = False): # Generate eReader user key from name and credit card number. keyname = u"{0}_{1}".format(name.strip(),cc.strip()[-4:]) keyvalue = getuser_key(name,cc).encode('hex') - userkeysappend([keyname,keyvalue]) + userkeys.append([keyname,keyvalue]) except Exception, e: traceback.print_exc() print e.args[0] @@ -231,21 +231,20 @@ def convertprefs(always = False): dedrmprefs.addnamedvaluetoprefs('bandnkeys', name, value) addedkeycount = len(dedrmprefs['bandnkeys'])-priorkeycount if addedkeycount > 0: - print u"{0} v{1}: {2:d} Barnes and Noble {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, ignoblecount, u"key file" if ignoblecount==1 else u"key files") + print u"{0} v{1}: {2:d} Barnes and Noble {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, u"key file" if addedkeycount==1 else u"key files") # Make the json write all the prefs to disk dedrmprefs.writeprefs(False) # get any .der files in the config dir priorkeycount = len(dedrmprefs['adeptkeys']) adeptfilekeys = getConfigFiles('.der','hex') - ineptcount = addConfigFiles('.der', 'adeptkeys') for keypair in adeptfilekeys: name = keypair[0] value = keypair[1] dedrmprefs.addnamedvaluetoprefs('adeptkeys', name, value) addedkeycount = len(dedrmprefs['adeptkeys'])-priorkeycount if addedkeycount > 0: - print u"{0} v{1}: {2:d} Adobe Adept {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, ineptcount, u"keyfile" if ineptcount==1 else u"keyfiles") + print u"{0} v{1}: {2:d} Adobe Adept {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, u"keyfile" if addedkeycount==1 else u"keyfiles") # Make the json write all the prefs to disk dedrmprefs.writeprefs(False) @@ -280,7 +279,7 @@ def convertprefs(always = False): if addedserialcount > 0: print u"{0} v{1}: {2:d} {3} imported from Kindle plugin preferences".format(PLUGIN_NAME, PLUGIN_VERSION, addedserialcount, u"serial number" if addedserialcount==1 else u"serial numbers") try: - if kindleprefs['wineprefix'] != "": + if 'wineprefix' in kindleprefs and kindleprefs['wineprefix'] != "": dedrmprefs.set('adobewineprefix',kindleprefs['wineprefix']) dedrmprefs.set('kindlewineprefix',kindleprefs['wineprefix']) print u"{0} v{1}: WINEPREFIX ‘(2)’ imported from Kindle plugin preferences".format(PLUGIN_NAME, PLUGIN_VERSION, kindleprefs['wineprefix']) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/topazextract.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/topazextract.py index 72f8797..97f6583 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/topazextract.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/topazextract.py @@ -71,7 +71,7 @@ def unicode_argv(): argvencoding = sys.stdin.encoding if argvencoding == None: argvencoding = 'utf-8' - return [arg if (type(arg) == unicode) else unicode(arg, argvencoding) for arg in sys.argv] + return [arg if (type(arg) == unicode) else unicode(arg,argvencoding) for arg in sys.argv] #global switch debug = False @@ -92,12 +92,12 @@ class DrmException(Exception): def zipUpDir(myzip, tdir, localname): currentdir = tdir if localname != u"": - currentdir = os.path.join(currentdir, localname) + currentdir = os.path.join(currentdir,localname) list = os.listdir(currentdir) for file in list: afilename = file localfilePath = os.path.join(localname, afilename) - realfilePath = os.path.join(currentdir, file) + realfilePath = os.path.join(currentdir,file) if os.path.isfile(realfilePath): myzip.write(realfilePath, localfilePath) elif os.path.isdir(realfilePath): @@ -116,7 +116,7 @@ def bookReadEncodedNumber(fo): data = ord(fo.read(1)) if data >= 0x80: datax = (data & 0x7F) - while data >= 0x80: + while data >= 0x80 : data = ord(fo.read(1)) datax = (datax <<7) + (data & 0x7F) data = datax diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/wineutils.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/wineutils.py index f8d5f7a..b54db80 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/wineutils.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/wineutils.py @@ -24,7 +24,7 @@ def WineGetKeys(scriptpath, extension, wineprefix=""): outdirpath = os.path.join(basepath, u"winekeysdir") if not os.path.exists(outdirpath): - os.mkdir(outdirpath) + os.makedirs(outdirpath) if wineprefix != "" and os.path.exists(wineprefix): cmdline = u"WINEPREFIX=\"{2}\" wine python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix) diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_app.pyw b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_app.pyw index 26eb06e..e73226b 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_app.pyw +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_app.pyw @@ -12,7 +12,7 @@ # 6.0.4 - Fix for other potential unicode problems # 6.0.5 - Fix typo -__version__ = '6.0.5' +__version__ = '6.0.7' import sys import os, os.path 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 830b66d..caed6e8 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py @@ -31,13 +31,14 @@ __docformat__ = 'restructuredtext en' # 6.0.3 - Fixes for Kindle for Mac and Windows non-ascii user names # 6.0.4 - Fixes for stand-alone scripts and applications # and pdb files in plugin and initial conversion of prefs. +# 6.0.6 - Fix up an incorrect function call """ Decrypt DRMed ebooks. """ PLUGIN_NAME = u"DeDRM" -PLUGIN_VERSION_TUPLE = (6, 0, 5) +PLUGIN_VERSION_TUPLE = (6, 0, 7) 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' @@ -216,10 +217,10 @@ class DeDRM(FileTypePlugin): else: # linux from wineutils import WineGetKeys - scriptpath = os.join(self.alfdir,u"adobekey.py") + scriptpath = os.path.join(self.alfdir,u"adobekey.py") defaultkeys = WineGetKeys(scriptpath, u".der",dedrmprefs['adobewineprefix']) - self.default_key = default_keys[0] + self.default_key = defaultkeys[0] except: traceback.print_exc() self.default_key = u"" @@ -311,7 +312,7 @@ class DeDRM(FileTypePlugin): try: from wineutils import WineGetKeys - scriptpath = os.join(self.alfdir,u"adobekey.py") + scriptpath = os.path.join(self.alfdir,u"adobekey.py") defaultkeys = self.WineGetKeys(scriptpath, u".der",dedrmprefs['adobewineprefix']) except: pass @@ -389,7 +390,7 @@ class DeDRM(FileTypePlugin): else: # linux from wineutils import WineGetKeys - scriptpath = os.join(self.alfdir,u"kindlekey.py") + scriptpath = os.path.join(self.alfdir,u"kindlekey.py") defaultkeys = self.WineGetKeys(scriptpath, u".k4i",dedrmprefs['kindlewineprefix']) except: pass diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptepub.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptepub.py index 225ffa7..f8181cb 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptepub.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptepub.py @@ -3,7 +3,7 @@ from __future__ import with_statement -# ineptepub.pyw, version 5.9 +# ineptepub.pyw, version 6.1 # Copyright © 2009-2010 by i♥cabbages # Released under the terms of the GNU General Public Licence, version 3 diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptpdf.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptpdf.py index 797db60..1986e20 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptpdf.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ineptpdf.py @@ -51,14 +51,15 @@ from __future__ import with_statement # 7.12 - Revised to allow use in calibre plugins to eliminate need for duplicate code # 7.13 - Fixed erroneous mentions of ineptepub # 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility -# 8.0 - Work if TkInter is missing +# 8.0 - Work if TkInter is missing +# 8.0.1 - Broken Metadata fix. """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "8.0" +__version__ = "8.0.1" import sys import os @@ -949,8 +950,11 @@ class PSStackParser(PSBaseParser): try: (pos, objs) = self.end_type('d') if len(objs) % 2 != 0: - raise PSSyntaxError( - 'Invalid dictionary construct: %r' % objs) + print "Incomplete dictionary construct" + objs.append("") # this isn't necessary. + # temporary fix. is this due to rental books? + # raise PSSyntaxError( + # 'Invalid dictionary construct: %r' % objs) d = dict((literal_name(k), v) \ for (k,v) in choplist(2, objs)) self.push((pos, d)) diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py index 0e426a1..929ce57 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py @@ -188,7 +188,7 @@ def unescape(text): def GetDecryptedBook(infile, kDatabases, serials, pids, starttime = time.time()): # handle the obvious cases at the beginning if not os.path.isfile(infile): - raise DRMException (u"Input file does not exist.") + raise DrmException(u"Input file does not exist.") mobi = True magic3 = open(infile,'rb').read(3) diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/prefs.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/prefs.py index 2c8c665..05065ac 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/prefs.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/prefs.py @@ -114,7 +114,7 @@ def convertprefs(always = False): # Generate eReader user key from name and credit card number. keyname = u"{0}_{1}".format(name.strip(),cc.strip()[-4:]) keyvalue = getuser_key(name,cc).encode('hex') - userkeysappend([keyname,keyvalue]) + userkeys.append([keyname,keyvalue]) except Exception, e: traceback.print_exc() print e.args[0] @@ -231,21 +231,20 @@ def convertprefs(always = False): dedrmprefs.addnamedvaluetoprefs('bandnkeys', name, value) addedkeycount = len(dedrmprefs['bandnkeys'])-priorkeycount if addedkeycount > 0: - print u"{0} v{1}: {2:d} Barnes and Noble {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, ignoblecount, u"key file" if ignoblecount==1 else u"key files") + print u"{0} v{1}: {2:d} Barnes and Noble {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, u"key file" if addedkeycount==1 else u"key files") # Make the json write all the prefs to disk dedrmprefs.writeprefs(False) # get any .der files in the config dir priorkeycount = len(dedrmprefs['adeptkeys']) adeptfilekeys = getConfigFiles('.der','hex') - ineptcount = addConfigFiles('.der', 'adeptkeys') for keypair in adeptfilekeys: name = keypair[0] value = keypair[1] dedrmprefs.addnamedvaluetoprefs('adeptkeys', name, value) addedkeycount = len(dedrmprefs['adeptkeys'])-priorkeycount if addedkeycount > 0: - print u"{0} v{1}: {2:d} Adobe Adept {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, ineptcount, u"keyfile" if ineptcount==1 else u"keyfiles") + print u"{0} v{1}: {2:d} Adobe Adept {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, u"keyfile" if addedkeycount==1 else u"keyfiles") # Make the json write all the prefs to disk dedrmprefs.writeprefs(False) @@ -280,7 +279,7 @@ def convertprefs(always = False): if addedserialcount > 0: print u"{0} v{1}: {2:d} {3} imported from Kindle plugin preferences".format(PLUGIN_NAME, PLUGIN_VERSION, addedserialcount, u"serial number" if addedserialcount==1 else u"serial numbers") try: - if kindleprefs['wineprefix'] != "": + if 'wineprefix' in kindleprefs and kindleprefs['wineprefix'] != "": dedrmprefs.set('adobewineprefix',kindleprefs['wineprefix']) dedrmprefs.set('kindlewineprefix',kindleprefs['wineprefix']) print u"{0} v{1}: WINEPREFIX ‘(2)’ imported from Kindle plugin preferences".format(PLUGIN_NAME, PLUGIN_VERSION, kindleprefs['wineprefix']) diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/wineutils.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/wineutils.py index f8d5f7a..b54db80 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/wineutils.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/wineutils.py @@ -24,7 +24,7 @@ def WineGetKeys(scriptpath, extension, wineprefix=""): outdirpath = os.path.join(basepath, u"winekeysdir") if not os.path.exists(outdirpath): - os.mkdir(outdirpath) + os.makedirs(outdirpath) if wineprefix != "" and os.path.exists(wineprefix): cmdline = u"WINEPREFIX=\"{2}\" wine python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix) diff --git a/DeDRM_calibre_plugin/DeDRM_plugin.zip b/DeDRM_calibre_plugin/DeDRM_plugin.zip index 6f6c7a511e7637162ea825d88e8294ed4778ee99..7c4878ac2a4db8fcac318e129bd2a29f211fd7a8 100644 GIT binary patch delta 31394 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 fNkixf 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 WIoy8*a)F5P08G%G@PL0;`2PX19>E>} diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py index 77423e1..caed6e8 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py @@ -38,7 +38,7 @@ Decrypt DRMed ebooks. """ PLUGIN_NAME = u"DeDRM" -PLUGIN_VERSION_TUPLE = (6, 0, 6) +PLUGIN_VERSION_TUPLE = (6, 0, 7) 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' @@ -220,7 +220,7 @@ class DeDRM(FileTypePlugin): scriptpath = os.path.join(self.alfdir,u"adobekey.py") defaultkeys = WineGetKeys(scriptpath, u".der",dedrmprefs['adobewineprefix']) - self.default_key = default_keys[0] + self.default_key = defaultkeys[0] except: traceback.print_exc() self.default_key = u"" diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/ignoblekeygen.py b/DeDRM_calibre_plugin/DeDRM_plugin/ignoblekeygen.py index 225ffa7..f8181cb 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/ignoblekeygen.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/ignoblekeygen.py @@ -3,7 +3,7 @@ from __future__ import with_statement -# ineptepub.pyw, version 5.9 +# ineptepub.pyw, version 6.1 # Copyright © 2009-2010 by i♥cabbages # Released under the terms of the GNU General Public Licence, version 3 diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/ineptepub.py b/DeDRM_calibre_plugin/DeDRM_plugin/ineptepub.py index 797db60..1986e20 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/ineptepub.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/ineptepub.py @@ -51,14 +51,15 @@ from __future__ import with_statement # 7.12 - Revised to allow use in calibre plugins to eliminate need for duplicate code # 7.13 - Fixed erroneous mentions of ineptepub # 7.14 - moved unicode_argv call inside main for Windows DeDRM compatibility -# 8.0 - Work if TkInter is missing +# 8.0 - Work if TkInter is missing +# 8.0.1 - Broken Metadata fix. """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "8.0" +__version__ = "8.0.1" import sys import os @@ -949,8 +950,11 @@ class PSStackParser(PSBaseParser): try: (pos, objs) = self.end_type('d') if len(objs) % 2 != 0: - raise PSSyntaxError( - 'Invalid dictionary construct: %r' % objs) + print "Incomplete dictionary construct" + objs.append("") # this isn't necessary. + # temporary fix. is this due to rental books? + # raise PSSyntaxError( + # 'Invalid dictionary construct: %r' % objs) d = dict((literal_name(k), v) \ for (k,v) in choplist(2, objs)) self.push((pos, d)) diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/ineptpdf.py b/DeDRM_calibre_plugin/DeDRM_plugin/ineptpdf.py index 0e426a1..929ce57 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/ineptpdf.py @@ -188,7 +188,7 @@ def unescape(text): def GetDecryptedBook(infile, kDatabases, serials, pids, starttime = time.time()): # handle the obvious cases at the beginning if not os.path.isfile(infile): - raise DRMException (u"Input file does not exist.") + raise DrmException(u"Input file does not exist.") mobi = True magic3 = open(infile,'rb').read(3) diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/zipfix.py b/DeDRM_calibre_plugin/DeDRM_plugin/zipfix.py index f8d5f7a..b54db80 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/zipfix.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/zipfix.py @@ -24,7 +24,7 @@ def WineGetKeys(scriptpath, extension, wineprefix=""): outdirpath = os.path.join(basepath, u"winekeysdir") if not os.path.exists(outdirpath): - os.mkdir(outdirpath) + os.makedirs(outdirpath) if wineprefix != "" and os.path.exists(wineprefix): cmdline = u"WINEPREFIX=\"{2}\" wine python.exe \"{0}\" \"{1}\"".format(scriptpath,outdirpath,wineprefix)