diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py b/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py index 19be51a5..11258d10 100644 --- a/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py @@ -323,12 +323,12 @@ def generateBook(bookDir, raw, fixedimage): meta_array = getMetaArray(metaFile) # replace special chars in title and authors like & < > - title = meta_array['Title'] + title = meta_array.get('Title','No Title Provided') title = title.replace('&','&') title = title.replace('<','<') title = title.replace('>','>') meta_array['Title'] = title - authors = meta_array['Authors'] + authors = meta_array.get('Authors','No Authors Provided') authors = authors.replace('&','&') authors = authors.replace('<','<') authors = authors.replace('>','>') @@ -413,8 +413,10 @@ def generateBook(bookDir, raw, fixedimage): htmlstr += '' + meta_array['Title'] + ' by ' + meta_array['Authors'] + '\n' htmlstr += '\n' htmlstr += '\n' - htmlstr += '\n' - htmlstr += '\n' + if 'ASIN' in meta_array: + htmlstr += '\n' + if 'GUID' in meta_array: + htmlstr += '\n' htmlstr += '\n' htmlstr += '\n\n' @@ -430,8 +432,10 @@ def generateBook(bookDir, raw, fixedimage): svgindex += '' + meta_array['Title'] + '\n' svgindex += '\n' svgindex += '\n' - svgindex += '\n' - svgindex += '\n' + if 'ASIN' in meta_array: + svgindex += '\n' + if 'GUID' in meta_array: + svgindex += '\n' svgindex += '\n' svgindex += '\n' @@ -485,9 +489,12 @@ def generateBook(bookDir, raw, fixedimage): opfstr += '\n' # adding metadata opfstr += ' \n' - opfstr += ' ' + meta_array['GUID'] + '\n' - opfstr += ' ' + meta_array['ASIN'] + '\n' - opfstr += ' ' + meta_array['oASIN'] + '\n' + if 'GUID' in meta_array: + opfstr += ' ' + meta_array['GUID'] + '\n' + if 'ASIN' in meta_array: + opfstr += ' ' + meta_array['ASIN'] + '\n' + if 'oASIN' in meta_array: + opfstr += ' ' + meta_array['oASIN'] + '\n' opfstr += ' ' + meta_array['Title'] + '\n' opfstr += ' ' + meta_array['Authors'] + '\n' opfstr += ' en\n' diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py b/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py index 039daf9a..c10f105a 100644 --- a/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py @@ -18,9 +18,9 @@ class DrmException(Exception): global charMap4 if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4pcutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4mutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" @@ -67,22 +67,6 @@ def decode(data,map): result += pack("B",value) return result - -# Parse the Kindle.info file and return the records as a list of key-values -def parseKindleInfo(kInfoFile): - DB = {} - infoReader = openKindleInfo(kInfoFile) - infoReader.read(1) - data = infoReader.read() - if sys.platform.startswith('win'): - items = data.split('{') - else : - items = data.split('[') - for item in items: - splito = item.split(':') - DB[splito[0]] =splito[1] - return DB - # Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). # Return the decoded and decrypted record def getKindleInfoValueForHash(hashedKey): @@ -241,7 +225,7 @@ def getKindlePid(pidlst, rec209, token, serialnum): # Parse the EXTH header records and parse the Kindleinfo # file to calculate the book pid. -def getK4Pids(pidlst, rec209, token, kInfoFile=None): +def getK4Pids(pidlst, rec209, token, kInfoFile): global kindleDatabase global charMap1 kindleDatabase = None @@ -254,10 +238,17 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): if kindleDatabase == None : return pidlst + + try: + # Get the Mazama Random number + MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - # Get the Mazama Random number - MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - + # Get the kindle account token + kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + except KeyError: + print "Keys not found in " + kInfoFile + return pidlst + # Get the HDD serial encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) @@ -273,10 +264,7 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): devicePID = checksumPid(devicePID) pidlst.append(devicePID) - # Compute book PID - - # Get the kindle account token - kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + # Compute book PIDs # book pid pidHash = SHA1(DSN+kindleAccountToken+rec209+token) @@ -300,8 +288,10 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): def getPidList(md1, md2, k4, pids, serials, kInfoFiles): pidlst = [] + if kInfoFiles is None: + kInfoFiles = [] if k4: - pidlst = getK4Pids(pidlst, md1, md2) + kInfoFiles = getKindleInfoFiles(kInfoFiles) for infoFile in kInfoFiles: pidlst = getK4Pids(pidlst, md1, md2, infoFile) for serialnum in serials: diff --git a/Calibre_Plugins/k4mobidedrm_plugin.zip b/Calibre_Plugins/k4mobidedrm_plugin.zip index 6b497899..83afae4f 100644 Binary files a/Calibre_Plugins/k4mobidedrm_plugin.zip and b/Calibre_Plugins/k4mobidedrm_plugin.zip differ diff --git a/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py b/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py index d165f37d..3ae1afaa 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py @@ -29,7 +29,7 @@ # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.7' +__version__ = '2.8' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,7 @@ class K4DeDRM(FileTypePlugin): 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, 7) # The version number of this plugin + version = (0, 2, 8) # 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/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py b/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py index 5e57701c..539723d4 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py @@ -168,27 +168,33 @@ def CryptUnprotectData(encryptedData): return cleartext -# Locate and open the .kindle-info file -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - home = os.getenv('HOME') - cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' - cmdline = cmdline.encode(sys.getfilesystemencoding()) - p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) - out1, out2 = p1.communicate() - reslst = out1.split('\n') - kinfopath = 'NONE' - cnt = len(reslst) - for j in xrange(cnt): - resline = reslst[j] - pp = resline.find('.kindle-info') - if pp >= 0: - kinfopath = resline - break - if not os.path.isfile(kinfopath): - raise DrmException('Error: .kindle-info file can not be found') - return open(kinfopath,'r') - else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle-info file can not be found') - return open(kInfoFile, 'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + home = os.getenv('HOME') + cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' + cmdline = cmdline.encode(sys.getfilesystemencoding()) + p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p1.communicate() + reslst = out1.split('\n') + kinfopath = 'NONE' + found = False + cnt = len(reslst) + for resline in reslst: + if os.path.isfile(resline): + kInfoFiles.append(resline) + found = True + if not found: + print('No .kindle-info files have been found.') + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('[') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py b/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py index efc310d2..d460a705 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py @@ -93,18 +93,25 @@ def CryptUnprotectData(indata, entropy): return CryptUnprotectData CryptUnprotectData = CryptUnprotectData() -# -# Locate and open the Kindle.info file. -# -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") - path = winreg.QueryValueEx(regkey, 'Local AppData')[0] - kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' - if not os.path.isfile(kinfopath): - raise DrmException('Error: kindle.info file can not be found') - return open(kinfopath,'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") + path = winreg.QueryValueEx(regkey, 'Local AppData')[0] + kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' + if not os.path.isfile(kinfopath): + print('The kindle.info files has not been found.') else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle.info file can not be found') - return open(kInfoFile, 'r') + kInfoFiles.append(kinfopath) + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('{') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist index f1761acb..c99622a5 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.5, Written 2010–2011 by Apprentice Alf and others. + DeDRM 2.6, Written 2010–2011 by Apprentice Alf and others. CFBundleIconFile droplet CFBundleInfoDictionaryVersion @@ -34,7 +34,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.5 + 2.6 CFBundleSignature dplt LSMinimumSystemVersion diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py index 19be51a5..11258d10 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py @@ -323,12 +323,12 @@ def generateBook(bookDir, raw, fixedimage): meta_array = getMetaArray(metaFile) # replace special chars in title and authors like & < > - title = meta_array['Title'] + title = meta_array.get('Title','No Title Provided') title = title.replace('&','&') title = title.replace('<','<') title = title.replace('>','>') meta_array['Title'] = title - authors = meta_array['Authors'] + authors = meta_array.get('Authors','No Authors Provided') authors = authors.replace('&','&') authors = authors.replace('<','<') authors = authors.replace('>','>') @@ -413,8 +413,10 @@ def generateBook(bookDir, raw, fixedimage): htmlstr += '' + meta_array['Title'] + ' by ' + meta_array['Authors'] + '\n' htmlstr += '\n' htmlstr += '\n' - htmlstr += '\n' - htmlstr += '\n' + if 'ASIN' in meta_array: + htmlstr += '\n' + if 'GUID' in meta_array: + htmlstr += '\n' htmlstr += '\n' htmlstr += '\n\n' @@ -430,8 +432,10 @@ def generateBook(bookDir, raw, fixedimage): svgindex += '' + meta_array['Title'] + '\n' svgindex += '\n' svgindex += '\n' - svgindex += '\n' - svgindex += '\n' + if 'ASIN' in meta_array: + svgindex += '\n' + if 'GUID' in meta_array: + svgindex += '\n' svgindex += '\n' svgindex += '\n' @@ -485,9 +489,12 @@ def generateBook(bookDir, raw, fixedimage): opfstr += '\n' # adding metadata opfstr += ' \n' - opfstr += ' ' + meta_array['GUID'] + '\n' - opfstr += ' ' + meta_array['ASIN'] + '\n' - opfstr += ' ' + meta_array['oASIN'] + '\n' + if 'GUID' in meta_array: + opfstr += ' ' + meta_array['GUID'] + '\n' + if 'ASIN' in meta_array: + opfstr += ' ' + meta_array['ASIN'] + '\n' + if 'oASIN' in meta_array: + opfstr += ' ' + meta_array['oASIN'] + '\n' opfstr += ' ' + meta_array['Title'] + '\n' opfstr += ' ' + meta_array['Authors'] + '\n' opfstr += ' en\n' diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py index d165f37d..3ae1afaa 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py @@ -29,7 +29,7 @@ # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.7' +__version__ = '2.8' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,7 @@ class K4DeDRM(FileTypePlugin): 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, 7) # The version number of this plugin + version = (0, 2, 8) # 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_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py index 5e57701c..539723d4 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py @@ -168,27 +168,33 @@ def CryptUnprotectData(encryptedData): return cleartext -# Locate and open the .kindle-info file -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - home = os.getenv('HOME') - cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' - cmdline = cmdline.encode(sys.getfilesystemencoding()) - p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) - out1, out2 = p1.communicate() - reslst = out1.split('\n') - kinfopath = 'NONE' - cnt = len(reslst) - for j in xrange(cnt): - resline = reslst[j] - pp = resline.find('.kindle-info') - if pp >= 0: - kinfopath = resline - break - if not os.path.isfile(kinfopath): - raise DrmException('Error: .kindle-info file can not be found') - return open(kinfopath,'r') - else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle-info file can not be found') - return open(kInfoFile, 'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + home = os.getenv('HOME') + cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' + cmdline = cmdline.encode(sys.getfilesystemencoding()) + p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p1.communicate() + reslst = out1.split('\n') + kinfopath = 'NONE' + found = False + cnt = len(reslst) + for resline in reslst: + if os.path.isfile(resline): + kInfoFiles.append(resline) + found = True + if not found: + print('No .kindle-info files have been found.') + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('[') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4pcutils.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4pcutils.py index efc310d2..d460a705 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4pcutils.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4pcutils.py @@ -93,18 +93,25 @@ def CryptUnprotectData(indata, entropy): return CryptUnprotectData CryptUnprotectData = CryptUnprotectData() -# -# Locate and open the Kindle.info file. -# -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") - path = winreg.QueryValueEx(regkey, 'Local AppData')[0] - kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' - if not os.path.isfile(kinfopath): - raise DrmException('Error: kindle.info file can not be found') - return open(kinfopath,'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") + path = winreg.QueryValueEx(regkey, 'Local AppData')[0] + kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' + if not os.path.isfile(kinfopath): + print('The kindle.info files has not been found.') else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle.info file can not be found') - return open(kInfoFile, 'r') + kInfoFiles.append(kinfopath) + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('{') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py index 039daf9a..c10f105a 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py @@ -18,9 +18,9 @@ class DrmException(Exception): global charMap4 if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4pcutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4mutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" @@ -67,22 +67,6 @@ def decode(data,map): result += pack("B",value) return result - -# Parse the Kindle.info file and return the records as a list of key-values -def parseKindleInfo(kInfoFile): - DB = {} - infoReader = openKindleInfo(kInfoFile) - infoReader.read(1) - data = infoReader.read() - if sys.platform.startswith('win'): - items = data.split('{') - else : - items = data.split('[') - for item in items: - splito = item.split(':') - DB[splito[0]] =splito[1] - return DB - # Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). # Return the decoded and decrypted record def getKindleInfoValueForHash(hashedKey): @@ -241,7 +225,7 @@ def getKindlePid(pidlst, rec209, token, serialnum): # Parse the EXTH header records and parse the Kindleinfo # file to calculate the book pid. -def getK4Pids(pidlst, rec209, token, kInfoFile=None): +def getK4Pids(pidlst, rec209, token, kInfoFile): global kindleDatabase global charMap1 kindleDatabase = None @@ -254,10 +238,17 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): if kindleDatabase == None : return pidlst + + try: + # Get the Mazama Random number + MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - # Get the Mazama Random number - MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - + # Get the kindle account token + kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + except KeyError: + print "Keys not found in " + kInfoFile + return pidlst + # Get the HDD serial encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) @@ -273,10 +264,7 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): devicePID = checksumPid(devicePID) pidlst.append(devicePID) - # Compute book PID - - # Get the kindle account token - kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + # Compute book PIDs # book pid pidHash = SHA1(DSN+kindleAccountToken+rec209+token) @@ -300,8 +288,10 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): def getPidList(md1, md2, k4, pids, serials, kInfoFiles): pidlst = [] + if kInfoFiles is None: + kInfoFiles = [] if k4: - pidlst = getK4Pids(pidlst, md1, md2) + kInfoFiles = getKindleInfoFiles(kInfoFiles) for infoFile in kInfoFiles: pidlst = getK4Pids(pidlst, md1, md2, infoFile) for serialnum in serials: diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py index 19be51a5..11258d10 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/genbook.py @@ -323,12 +323,12 @@ def generateBook(bookDir, raw, fixedimage): meta_array = getMetaArray(metaFile) # replace special chars in title and authors like & < > - title = meta_array['Title'] + title = meta_array.get('Title','No Title Provided') title = title.replace('&','&') title = title.replace('<','<') title = title.replace('>','>') meta_array['Title'] = title - authors = meta_array['Authors'] + authors = meta_array.get('Authors','No Authors Provided') authors = authors.replace('&','&') authors = authors.replace('<','<') authors = authors.replace('>','>') @@ -413,8 +413,10 @@ def generateBook(bookDir, raw, fixedimage): htmlstr += '' + meta_array['Title'] + ' by ' + meta_array['Authors'] + '\n' htmlstr += '\n' htmlstr += '\n' - htmlstr += '\n' - htmlstr += '\n' + if 'ASIN' in meta_array: + htmlstr += '\n' + if 'GUID' in meta_array: + htmlstr += '\n' htmlstr += '\n' htmlstr += '\n\n' @@ -430,8 +432,10 @@ def generateBook(bookDir, raw, fixedimage): svgindex += '' + meta_array['Title'] + '\n' svgindex += '\n' svgindex += '\n' - svgindex += '\n' - svgindex += '\n' + if 'ASIN' in meta_array: + svgindex += '\n' + if 'GUID' in meta_array: + svgindex += '\n' svgindex += '\n' svgindex += '\n' @@ -485,9 +489,12 @@ def generateBook(bookDir, raw, fixedimage): opfstr += '\n' # adding metadata opfstr += ' \n' - opfstr += ' ' + meta_array['GUID'] + '\n' - opfstr += ' ' + meta_array['ASIN'] + '\n' - opfstr += ' ' + meta_array['oASIN'] + '\n' + if 'GUID' in meta_array: + opfstr += ' ' + meta_array['GUID'] + '\n' + if 'ASIN' in meta_array: + opfstr += ' ' + meta_array['ASIN'] + '\n' + if 'oASIN' in meta_array: + opfstr += ' ' + meta_array['oASIN'] + '\n' opfstr += ' ' + meta_array['Title'] + '\n' opfstr += ' ' + meta_array['Authors'] + '\n' opfstr += ' en\n' 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 d165f37d..3ae1afaa 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 @@ # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.7' +__version__ = '2.8' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,7 @@ class K4DeDRM(FileTypePlugin): 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, 7) # The version number of this plugin + version = (0, 2, 8) # 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/k4mutils.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mutils.py index 5e57701c..539723d4 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mutils.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4mutils.py @@ -168,27 +168,33 @@ def CryptUnprotectData(encryptedData): return cleartext -# Locate and open the .kindle-info file -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - home = os.getenv('HOME') - cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' - cmdline = cmdline.encode(sys.getfilesystemencoding()) - p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) - out1, out2 = p1.communicate() - reslst = out1.split('\n') - kinfopath = 'NONE' - cnt = len(reslst) - for j in xrange(cnt): - resline = reslst[j] - pp = resline.find('.kindle-info') - if pp >= 0: - kinfopath = resline - break - if not os.path.isfile(kinfopath): - raise DrmException('Error: .kindle-info file can not be found') - return open(kinfopath,'r') - else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle-info file can not be found') - return open(kInfoFile, 'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + home = os.getenv('HOME') + cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' + cmdline = cmdline.encode(sys.getfilesystemencoding()) + p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p1.communicate() + reslst = out1.split('\n') + kinfopath = 'NONE' + found = False + cnt = len(reslst) + for resline in reslst: + if os.path.isfile(resline): + kInfoFiles.append(resline) + found = True + if not found: + print('No .kindle-info files have been found.') + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('[') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4pcutils.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4pcutils.py index efc310d2..d460a705 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4pcutils.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/k4pcutils.py @@ -93,18 +93,25 @@ def CryptUnprotectData(indata, entropy): return CryptUnprotectData CryptUnprotectData = CryptUnprotectData() -# -# Locate and open the Kindle.info file. -# -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") - path = winreg.QueryValueEx(regkey, 'Local AppData')[0] - kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' - if not os.path.isfile(kinfopath): - raise DrmException('Error: kindle.info file can not be found') - return open(kinfopath,'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") + path = winreg.QueryValueEx(regkey, 'Local AppData')[0] + kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' + if not os.path.isfile(kinfopath): + print('The kindle.info files has not been found.') else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle.info file can not be found') - return open(kInfoFile, 'r') + kInfoFiles.append(kinfopath) + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('{') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/kgenpids.py b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/kgenpids.py index 039daf9a..c10f105a 100644 --- a/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/kgenpids.py +++ b/DeDRM_Windows_Application/DeDRM_WinApp/DeDRM_lib/lib/kgenpids.py @@ -18,9 +18,9 @@ class DrmException(Exception): global charMap4 if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4pcutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4mutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" @@ -67,22 +67,6 @@ def decode(data,map): result += pack("B",value) return result - -# Parse the Kindle.info file and return the records as a list of key-values -def parseKindleInfo(kInfoFile): - DB = {} - infoReader = openKindleInfo(kInfoFile) - infoReader.read(1) - data = infoReader.read() - if sys.platform.startswith('win'): - items = data.split('{') - else : - items = data.split('[') - for item in items: - splito = item.split(':') - DB[splito[0]] =splito[1] - return DB - # Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). # Return the decoded and decrypted record def getKindleInfoValueForHash(hashedKey): @@ -241,7 +225,7 @@ def getKindlePid(pidlst, rec209, token, serialnum): # Parse the EXTH header records and parse the Kindleinfo # file to calculate the book pid. -def getK4Pids(pidlst, rec209, token, kInfoFile=None): +def getK4Pids(pidlst, rec209, token, kInfoFile): global kindleDatabase global charMap1 kindleDatabase = None @@ -254,10 +238,17 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): if kindleDatabase == None : return pidlst + + try: + # Get the Mazama Random number + MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - # Get the Mazama Random number - MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - + # Get the kindle account token + kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + except KeyError: + print "Keys not found in " + kInfoFile + return pidlst + # Get the HDD serial encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) @@ -273,10 +264,7 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): devicePID = checksumPid(devicePID) pidlst.append(devicePID) - # Compute book PID - - # Get the kindle account token - kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + # Compute book PIDs # book pid pidHash = SHA1(DSN+kindleAccountToken+rec209+token) @@ -300,8 +288,10 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): def getPidList(md1, md2, k4, pids, serials, kInfoFiles): pidlst = [] + if kInfoFiles is None: + kInfoFiles = [] if k4: - pidlst = getK4Pids(pidlst, md1, md2) + kInfoFiles = getKindleInfoFiles(kInfoFiles) for infoFile in kInfoFiles: pidlst = getK4Pids(pidlst, md1, md2, infoFile) for serialnum in serials: diff --git a/KindleBooks_Tools/KindleBooks/lib/genbook.py b/KindleBooks_Tools/KindleBooks/lib/genbook.py index 19be51a5..11258d10 100644 --- a/KindleBooks_Tools/KindleBooks/lib/genbook.py +++ b/KindleBooks_Tools/KindleBooks/lib/genbook.py @@ -323,12 +323,12 @@ def generateBook(bookDir, raw, fixedimage): meta_array = getMetaArray(metaFile) # replace special chars in title and authors like & < > - title = meta_array['Title'] + title = meta_array.get('Title','No Title Provided') title = title.replace('&','&') title = title.replace('<','<') title = title.replace('>','>') meta_array['Title'] = title - authors = meta_array['Authors'] + authors = meta_array.get('Authors','No Authors Provided') authors = authors.replace('&','&') authors = authors.replace('<','<') authors = authors.replace('>','>') @@ -413,8 +413,10 @@ def generateBook(bookDir, raw, fixedimage): htmlstr += '' + meta_array['Title'] + ' by ' + meta_array['Authors'] + '\n' htmlstr += '\n' htmlstr += '\n' - htmlstr += '\n' - htmlstr += '\n' + if 'ASIN' in meta_array: + htmlstr += '\n' + if 'GUID' in meta_array: + htmlstr += '\n' htmlstr += '\n' htmlstr += '\n\n' @@ -430,8 +432,10 @@ def generateBook(bookDir, raw, fixedimage): svgindex += '' + meta_array['Title'] + '\n' svgindex += '\n' svgindex += '\n' - svgindex += '\n' - svgindex += '\n' + if 'ASIN' in meta_array: + svgindex += '\n' + if 'GUID' in meta_array: + svgindex += '\n' svgindex += '\n' svgindex += '\n' @@ -485,9 +489,12 @@ def generateBook(bookDir, raw, fixedimage): opfstr += '\n' # adding metadata opfstr += ' \n' - opfstr += ' ' + meta_array['GUID'] + '\n' - opfstr += ' ' + meta_array['ASIN'] + '\n' - opfstr += ' ' + meta_array['oASIN'] + '\n' + if 'GUID' in meta_array: + opfstr += ' ' + meta_array['GUID'] + '\n' + if 'ASIN' in meta_array: + opfstr += ' ' + meta_array['ASIN'] + '\n' + if 'oASIN' in meta_array: + opfstr += ' ' + meta_array['oASIN'] + '\n' opfstr += ' ' + meta_array['Title'] + '\n' opfstr += ' ' + meta_array['Authors'] + '\n' opfstr += ' en\n' diff --git a/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py b/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py index d165f37d..3ae1afaa 100644 --- a/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py +++ b/KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py @@ -29,7 +29,7 @@ # and import that ZIP into Calibre using its plugin configuration GUI. -__version__ = '2.7' +__version__ = '2.8' class Unbuffered: def __init__(self, stream): @@ -250,7 +250,7 @@ class K4DeDRM(FileTypePlugin): 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, 7) # The version number of this plugin + version = (0, 2, 8) # 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/k4mutils.py b/KindleBooks_Tools/KindleBooks/lib/k4mutils.py index 5e57701c..539723d4 100644 --- a/KindleBooks_Tools/KindleBooks/lib/k4mutils.py +++ b/KindleBooks_Tools/KindleBooks/lib/k4mutils.py @@ -168,27 +168,33 @@ def CryptUnprotectData(encryptedData): return cleartext -# Locate and open the .kindle-info file -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - home = os.getenv('HOME') - cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' - cmdline = cmdline.encode(sys.getfilesystemencoding()) - p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) - out1, out2 = p1.communicate() - reslst = out1.split('\n') - kinfopath = 'NONE' - cnt = len(reslst) - for j in xrange(cnt): - resline = reslst[j] - pp = resline.find('.kindle-info') - if pp >= 0: - kinfopath = resline - break - if not os.path.isfile(kinfopath): - raise DrmException('Error: .kindle-info file can not be found') - return open(kinfopath,'r') - else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle-info file can not be found') - return open(kInfoFile, 'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + home = os.getenv('HOME') + cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' + cmdline = cmdline.encode(sys.getfilesystemencoding()) + p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p1.communicate() + reslst = out1.split('\n') + kinfopath = 'NONE' + found = False + cnt = len(reslst) + for resline in reslst: + if os.path.isfile(resline): + kInfoFiles.append(resline) + found = True + if not found: + print('No .kindle-info files have been found.') + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('[') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/KindleBooks_Tools/KindleBooks/lib/k4pcutils.py b/KindleBooks_Tools/KindleBooks/lib/k4pcutils.py index efc310d2..d460a705 100644 --- a/KindleBooks_Tools/KindleBooks/lib/k4pcutils.py +++ b/KindleBooks_Tools/KindleBooks/lib/k4pcutils.py @@ -93,18 +93,25 @@ def CryptUnprotectData(indata, entropy): return CryptUnprotectData CryptUnprotectData = CryptUnprotectData() -# -# Locate and open the Kindle.info file. -# -def openKindleInfo(kInfoFile=None): - if kInfoFile == None: - regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") - path = winreg.QueryValueEx(regkey, 'Local AppData')[0] - kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' - if not os.path.isfile(kinfopath): - raise DrmException('Error: kindle.info file can not be found') - return open(kinfopath,'r') +# Locate the .kindle-info files +def getKindleInfoFiles(kInfoFiles): + regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") + path = winreg.QueryValueEx(regkey, 'Local AppData')[0] + kinfopath = path +'\\Amazon\\Kindle For PC\\{AMAwzsaPaaZAzmZzZQzgZCAkZ3AjA_AY}\\kindle.info' + if not os.path.isfile(kinfopath): + print('The kindle.info files has not been found.') else: - if not os.path.isfile(kInfoFile): - raise DrmException('Error: kindle.info file can not be found') - return open(kInfoFile, 'r') + kInfoFiles.append(kinfopath) + return kInfoFiles + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = open(kInfoFile, 'r') + infoReader.read(1) + data = infoReader.read() + items = data.split('{') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB diff --git a/KindleBooks_Tools/KindleBooks/lib/kgenpids.py b/KindleBooks_Tools/KindleBooks/lib/kgenpids.py index 039daf9a..c10f105a 100644 --- a/KindleBooks_Tools/KindleBooks/lib/kgenpids.py +++ b/KindleBooks_Tools/KindleBooks/lib/kgenpids.py @@ -18,9 +18,9 @@ class DrmException(Exception): global charMap4 if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4pcutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + from k4mutils import getKindleInfoFiles, parseKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" @@ -67,22 +67,6 @@ def decode(data,map): result += pack("B",value) return result - -# Parse the Kindle.info file and return the records as a list of key-values -def parseKindleInfo(kInfoFile): - DB = {} - infoReader = openKindleInfo(kInfoFile) - infoReader.read(1) - data = infoReader.read() - if sys.platform.startswith('win'): - items = data.split('{') - else : - items = data.split('[') - for item in items: - splito = item.split(':') - DB[splito[0]] =splito[1] - return DB - # Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). # Return the decoded and decrypted record def getKindleInfoValueForHash(hashedKey): @@ -241,7 +225,7 @@ def getKindlePid(pidlst, rec209, token, serialnum): # Parse the EXTH header records and parse the Kindleinfo # file to calculate the book pid. -def getK4Pids(pidlst, rec209, token, kInfoFile=None): +def getK4Pids(pidlst, rec209, token, kInfoFile): global kindleDatabase global charMap1 kindleDatabase = None @@ -254,10 +238,17 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): if kindleDatabase == None : return pidlst + + try: + # Get the Mazama Random number + MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - # Get the Mazama Random number - MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - + # Get the kindle account token + kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + except KeyError: + print "Keys not found in " + kInfoFile + return pidlst + # Get the HDD serial encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) @@ -273,10 +264,7 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): devicePID = checksumPid(devicePID) pidlst.append(devicePID) - # Compute book PID - - # Get the kindle account token - kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + # Compute book PIDs # book pid pidHash = SHA1(DSN+kindleAccountToken+rec209+token) @@ -300,8 +288,10 @@ def getK4Pids(pidlst, rec209, token, kInfoFile=None): def getPidList(md1, md2, k4, pids, serials, kInfoFiles): pidlst = [] + if kInfoFiles is None: + kInfoFiles = [] if k4: - pidlst = getK4Pids(pidlst, md1, md2) + kInfoFiles = getKindleInfoFiles(kInfoFiles) for infoFile in kInfoFiles: pidlst = getK4Pids(pidlst, md1, md2, infoFile) for serialnum in serials: