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: