From 867ac35b4555f0a48ab27310fb08462270b9f375 Mon Sep 17 00:00:00 2001 From: Apprentice Alf Date: Thu, 24 Feb 2011 23:42:37 +0000 Subject: [PATCH] tools v3.7 --- .../K4MobiDeDRM_plugin/kgenpids.py | 15 +++++-------- .../K4MobiDeDRM_plugin/topazextract.py | 20 +++++++++++------- Calibre_Plugins/k4mobidedrm_plugin.zip | Bin 44145 -> 44219 bytes .../k4mobidedrm_plugin/k4mobidedrm_plugin.py | 4 ++-- .../k4mobidedrm_plugin/mobidedrm.py | 14 +++++++----- DeDRM_Macintosh_Application/DeDRM.app.txt | Bin 106668 -> 106676 bytes .../DeDRM.app/Contents/Info.plist | 6 +++--- .../DeDRM.app/Contents/MacOS/droplet | Bin 29592 -> 55856 bytes .../Contents/Resources/Scripts/main.scpt | Bin 230488 -> 234456 bytes .../DeDRM.app/Contents/Resources/droplet.rsrc | Bin 362 -> 362 bytes .../Contents/Resources/k4mobidedrm.py | 4 ++-- .../DeDRM.app/Contents/Resources/mobidedrm.py | 8 +++++-- .../DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py | 4 ++-- .../DeDRM_WinApp/DeDRM_lib/lib/mobidedrm.py | 8 +++++-- .../KindleBooks/lib/k4mobidedrm.py | 4 ++-- .../KindleBooks/lib/mobidedrm.py | 8 +++++-- .../Kindle_4_Mac_Unswindle/lib/mobidedrm.py | 8 +++++-- .../Kindle_4_PC_Unswindle/mobidedrm.py | 8 +++++-- Mobi_Additional_Tools/lib/mobidedrm.py | 8 +++++-- 19 files changed, 73 insertions(+), 46 deletions(-) diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py b/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py index 6dcbf73..039daf9 100644 --- a/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py @@ -224,13 +224,11 @@ def pidFromSerial(s, l): # Parse the EXTH header records and use the Kindle serial number to calculate the book pid. def getKindlePid(pidlst, rec209, token, serialnum): - - if rec209 != None and token != None: - # Compute book PID - pidHash = SHA1(serialnum+rec209+token) - bookPID = encodePID(pidHash) - bookPID = checksumPid(bookPID) - pidlst.append(bookPID) + # Compute book PID + pidHash = SHA1(serialnum+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) # compute fixed pid for old pre 2.5 firmware update pid as well bookPID = pidFromSerial(serialnum, 7) + "*" @@ -276,9 +274,6 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): pidlst.append(devicePID) # Compute book PID - if rec209 == None or token == None: - print "\nNo EXTH record type 209 or token - Perhaps not a K4 file?" - return pidlst # Get the kindle account token kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py b/Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py index 732bbae..59bc5fa 100644 --- a/Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py @@ -157,18 +157,22 @@ class TopazBook: raise TpzDRMError("Parse Error : Record Names Don't Match") flags = ord(self.fo.read(1)) nbRecords = ord(self.fo.read(1)) + # print nbRecords for i in range (0,nbRecords) : - record = [bookReadString(self.fo), bookReadString(self.fo)] - self.bookMetadata[record[0]] = record[1] + keyval = bookReadString(self.fo) + content = bookReadString(self.fo) + # print keyval + # print content + self.bookMetadata[keyval] = content return self.bookMetadata def getPIDMetaInfo(self): - keysRecord = None - keysRecordRecord = None - if 'keys' in self.bookMetadata: - keysRecord = self.bookMetadata['keys'] - if keysRecord in self.bookMetadata: - keysRecordRecord = self.bookMetadata[keysRecord] + keysRecord = self.bookMetadata.get('keys','') + keysRecordRecord = '' + if keysRecord != '': + keylst = keysRecord.split(',') + for keyval in keylst: + keysRecordRecord += self.bookMetadata.get(keyval,'') return keysRecord, keysRecordRecord def getBookTitle(self): diff --git a/Calibre_Plugins/k4mobidedrm_plugin.zip b/Calibre_Plugins/k4mobidedrm_plugin.zip index 0e5c337ee882fdd3f2e0f1e62a65e48ec263b8c0..6b497899270362f79e5b94f1a10a42394d0cc667 100644 GIT binary patch delta 16841 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 delta 16774 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 u#>^76&& '') +# 0.29 - It seems that the ideas about when multibyte trailing characters were +# included in the encryption were wrong. They aren't for DOC compressed +# files, but they are for HUFF/CDIC compress files! -__version__ = '0.27' +__version__ = '0.29' import sys @@ -176,6 +180,7 @@ class MobiBook: # parse information from section 0 self.sect = self.loadSection(0) self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.compression, = struct.unpack('>H', self.sect[0x0:0x0+2]) if self.magic == 'TEXtREAd': print "Book has format: ", self.magic @@ -191,7 +196,7 @@ class MobiBook: if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) print "Extra Data Flags = %d" % self.extra_data_flags - if self.mobi_version < 7: + if (self.mobi_version < 7) and (self.compression != 17480): # multibyte utf8 data is included in the encryption for mobi_version 6 and below # so clear that byte so that we leave it to be decrypted. self.extra_data_flags &= 0xFFFE @@ -237,12 +242,11 @@ class MobiBook: return title def getPIDMetaInfo(self): - rec209 = None - token = None + rec209 = '' + token = '' if 209 in self.meta_array: rec209 = self.meta_array[209] data = rec209 - token = '' # The 209 data comes in five byte groups. Interpret the last four bytes # of each group as a big endian unsigned integer to get a key value # if that key exists in the meta_array, append its contents to the token diff --git a/DeDRM_Macintosh_Application/DeDRM.app.txt b/DeDRM_Macintosh_Application/DeDRM.app.txt index 197b27413b9dbbd4e18fe8df9d1a69f6bbdb2320..26aa8fd627cc3f662fedb038543ae6a85c5c6e36 100644 GIT binary patch delta 52 zcmV-40L%ZZ!3MO!2C#h2ldRbcmu^x49G8F}0S=RXzdn=Ds0@=H$_SHy$U>7~a|V+P K#0;}g&s@=UL>FZM delta 27 lcmV+$0ObF)!3M0s2C#h2lhCLjmxvz$4wHVrKC|%7#L>br4s`$k diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist index 4f3beb7..f1761ac 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist @@ -24,7 +24,7 @@ CFBundleExecutable droplet CFBundleGetInfoString - DeDRM 2.4, Copyright © 2010–2011 by Apprentice Alf and others. + DeDRM 2.5, Written 2010–2011 by Apprentice Alf and others. CFBundleIconFile droplet CFBundleInfoDictionaryVersion @@ -34,7 +34,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.4 + 2.5 CFBundleSignature dplt LSMinimumSystemVersion @@ -50,7 +50,7 @@ name ScriptWindowState positionOfDivider - 0.0 + 0 savedFrame 1578 27 862 788 1440 -150 1680 1050 selectedTabView diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/MacOS/droplet b/DeDRM_Macintosh_Application/DeDRM.app/Contents/MacOS/droplet index c715860463c5434cb471de58b710cbe95976c23f..6a4731203faab0c2c04422745e3f25741f928321 100644 GIT binary patch literal 55856 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 bJ;NT_{;) delta 3213 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 diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt index 80448cabd90996b52fb7dc565b84a3cc982c6cc9..4d03f32e44585afe4236637e421a658811e537ce 100644 GIT binary patch delta 19976 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 TixrZDaZlinhzmdc^v3@IJB&Ry delta 17434 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 '') +# 0.29 - It seems that the ideas about when multibyte trailing characters were +# included in the encryption were wrong. They aren't for DOC compressed +# files, but they are for HUFF/CDIC compress files! -__version__ = '0.28' +__version__ = '0.29' import sys @@ -177,6 +180,7 @@ class MobiBook: # parse information from section 0 self.sect = self.loadSection(0) self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.compression, = struct.unpack('>H', self.sect[0x0:0x0+2]) if self.magic == 'TEXtREAd': print "Book has format: ", self.magic @@ -192,7 +196,7 @@ class MobiBook: if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) print "Extra Data Flags = %d" % self.extra_data_flags - if self.mobi_version < 7: + if (self.mobi_version < 7) and (self.compression != 17480): # multibyte utf8 data is included in the encryption for mobi_version 6 and below # so clear that byte so that we leave it to be decrypted. self.extra_data_flags &= 0xFFFE diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py index 3a0000e..d165f37 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mobidedrm.py @@ -29,7 +29,7 @@ from __future__ import with_statement # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.6' +__version__ = '2.7' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,7 @@ if not __name__ == "__main__" and inCalibre: Provided by the work of many including DiapDealer, SomeUpdates, IHeartCabbages, CMBDTC, Skindle, DarkReverser, ApprenticeAlf, etc.' supported_platforms = ['osx', 'windows', 'linux'] # Platforms this plugin will run on author = 'DiapDealer, SomeUpdates' # The author of this plugin - version = (0, 2, 6) # The version number of this plugin + version = (0, 2, 7) # The version number of this plugin file_types = set(['prc','mobi','azw','azw1','tpz']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import priority = 210 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/mobidedrm.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/mobidedrm.py index e660a1a..7aef175 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/mobidedrm.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/mobidedrm.py @@ -48,8 +48,11 @@ # 0.26 - Now enables Text-To-Speech flag and sets clipping limit to 100% # 0.27 - Correct pid metadata token generation to match that used by skindle (Thank You Bart!) # 0.28 - slight additional changes to metadata token generation (None -> '') +# 0.29 - It seems that the ideas about when multibyte trailing characters were +# included in the encryption were wrong. They aren't for DOC compressed +# files, but they are for HUFF/CDIC compress files! -__version__ = '0.28' +__version__ = '0.29' import sys @@ -177,6 +180,7 @@ class MobiBook: # parse information from section 0 self.sect = self.loadSection(0) self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.compression, = struct.unpack('>H', self.sect[0x0:0x0+2]) if self.magic == 'TEXtREAd': print "Book has format: ", self.magic @@ -192,7 +196,7 @@ class MobiBook: if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) print "Extra Data Flags = %d" % self.extra_data_flags - if self.mobi_version < 7: + if (self.mobi_version < 7) and (self.compression != 17480): # multibyte utf8 data is included in the encryption for mobi_version 6 and below # so clear that byte so that we leave it to be decrypted. self.extra_data_flags &= 0xFFFE diff --git a/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py b/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py index 3a0000e..d165f37 100644 --- a/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py +++ b/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py @@ -29,7 +29,7 @@ from __future__ import with_statement # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.6' +__version__ = '2.7' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,7 @@ if not __name__ == "__main__" and inCalibre: Provided by the work of many including DiapDealer, SomeUpdates, IHeartCabbages, CMBDTC, Skindle, DarkReverser, ApprenticeAlf, etc.' supported_platforms = ['osx', 'windows', 'linux'] # Platforms this plugin will run on author = 'DiapDealer, SomeUpdates' # The author of this plugin - version = (0, 2, 6) # The version number of this plugin + version = (0, 2, 7) # The version number of this plugin file_types = set(['prc','mobi','azw','azw1','tpz']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import priority = 210 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm diff --git a/KindleBooks_Tools/KindleBooks/lib/mobidedrm.py b/KindleBooks_Tools/KindleBooks/lib/mobidedrm.py index e660a1a..7aef175 100644 --- a/KindleBooks_Tools/KindleBooks/lib/mobidedrm.py +++ b/KindleBooks_Tools/KindleBooks/lib/mobidedrm.py @@ -48,8 +48,11 @@ # 0.26 - Now enables Text-To-Speech flag and sets clipping limit to 100% # 0.27 - Correct pid metadata token generation to match that used by skindle (Thank You Bart!) # 0.28 - slight additional changes to metadata token generation (None -> '') +# 0.29 - It seems that the ideas about when multibyte trailing characters were +# included in the encryption were wrong. They aren't for DOC compressed +# files, but they are for HUFF/CDIC compress files! -__version__ = '0.28' +__version__ = '0.29' import sys @@ -177,6 +180,7 @@ class MobiBook: # parse information from section 0 self.sect = self.loadSection(0) self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.compression, = struct.unpack('>H', self.sect[0x0:0x0+2]) if self.magic == 'TEXtREAd': print "Book has format: ", self.magic @@ -192,7 +196,7 @@ class MobiBook: if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) print "Extra Data Flags = %d" % self.extra_data_flags - if self.mobi_version < 7: + if (self.mobi_version < 7) and (self.compression != 17480): # multibyte utf8 data is included in the encryption for mobi_version 6 and below # so clear that byte so that we leave it to be decrypted. self.extra_data_flags &= 0xFFFE diff --git a/KindleBooks_Tools/Kindle_4_Mac_Unswindle/lib/mobidedrm.py b/KindleBooks_Tools/Kindle_4_Mac_Unswindle/lib/mobidedrm.py index e660a1a..7aef175 100644 --- a/KindleBooks_Tools/Kindle_4_Mac_Unswindle/lib/mobidedrm.py +++ b/KindleBooks_Tools/Kindle_4_Mac_Unswindle/lib/mobidedrm.py @@ -48,8 +48,11 @@ # 0.26 - Now enables Text-To-Speech flag and sets clipping limit to 100% # 0.27 - Correct pid metadata token generation to match that used by skindle (Thank You Bart!) # 0.28 - slight additional changes to metadata token generation (None -> '') +# 0.29 - It seems that the ideas about when multibyte trailing characters were +# included in the encryption were wrong. They aren't for DOC compressed +# files, but they are for HUFF/CDIC compress files! -__version__ = '0.28' +__version__ = '0.29' import sys @@ -177,6 +180,7 @@ class MobiBook: # parse information from section 0 self.sect = self.loadSection(0) self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.compression, = struct.unpack('>H', self.sect[0x0:0x0+2]) if self.magic == 'TEXtREAd': print "Book has format: ", self.magic @@ -192,7 +196,7 @@ class MobiBook: if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) print "Extra Data Flags = %d" % self.extra_data_flags - if self.mobi_version < 7: + if (self.mobi_version < 7) and (self.compression != 17480): # multibyte utf8 data is included in the encryption for mobi_version 6 and below # so clear that byte so that we leave it to be decrypted. self.extra_data_flags &= 0xFFFE diff --git a/KindleBooks_Tools/Kindle_4_PC_Unswindle/mobidedrm.py b/KindleBooks_Tools/Kindle_4_PC_Unswindle/mobidedrm.py index e660a1a..7aef175 100644 --- a/KindleBooks_Tools/Kindle_4_PC_Unswindle/mobidedrm.py +++ b/KindleBooks_Tools/Kindle_4_PC_Unswindle/mobidedrm.py @@ -48,8 +48,11 @@ # 0.26 - Now enables Text-To-Speech flag and sets clipping limit to 100% # 0.27 - Correct pid metadata token generation to match that used by skindle (Thank You Bart!) # 0.28 - slight additional changes to metadata token generation (None -> '') +# 0.29 - It seems that the ideas about when multibyte trailing characters were +# included in the encryption were wrong. They aren't for DOC compressed +# files, but they are for HUFF/CDIC compress files! -__version__ = '0.28' +__version__ = '0.29' import sys @@ -177,6 +180,7 @@ class MobiBook: # parse information from section 0 self.sect = self.loadSection(0) self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.compression, = struct.unpack('>H', self.sect[0x0:0x0+2]) if self.magic == 'TEXtREAd': print "Book has format: ", self.magic @@ -192,7 +196,7 @@ class MobiBook: if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) print "Extra Data Flags = %d" % self.extra_data_flags - if self.mobi_version < 7: + if (self.mobi_version < 7) and (self.compression != 17480): # multibyte utf8 data is included in the encryption for mobi_version 6 and below # so clear that byte so that we leave it to be decrypted. self.extra_data_flags &= 0xFFFE diff --git a/Mobi_Additional_Tools/lib/mobidedrm.py b/Mobi_Additional_Tools/lib/mobidedrm.py index e660a1a..7aef175 100644 --- a/Mobi_Additional_Tools/lib/mobidedrm.py +++ b/Mobi_Additional_Tools/lib/mobidedrm.py @@ -48,8 +48,11 @@ # 0.26 - Now enables Text-To-Speech flag and sets clipping limit to 100% # 0.27 - Correct pid metadata token generation to match that used by skindle (Thank You Bart!) # 0.28 - slight additional changes to metadata token generation (None -> '') +# 0.29 - It seems that the ideas about when multibyte trailing characters were +# included in the encryption were wrong. They aren't for DOC compressed +# files, but they are for HUFF/CDIC compress files! -__version__ = '0.28' +__version__ = '0.29' import sys @@ -177,6 +180,7 @@ class MobiBook: # parse information from section 0 self.sect = self.loadSection(0) self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.compression, = struct.unpack('>H', self.sect[0x0:0x0+2]) if self.magic == 'TEXtREAd': print "Book has format: ", self.magic @@ -192,7 +196,7 @@ class MobiBook: if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) print "Extra Data Flags = %d" % self.extra_data_flags - if self.mobi_version < 7: + if (self.mobi_version < 7) and (self.compression != 17480): # multibyte utf8 data is included in the encryption for mobi_version 6 and below # so clear that byte so that we leave it to be decrypted. self.extra_data_flags &= 0xFFFE