mirror of
https://github.com/noDRM/DeDRM_tools.git
synced 2025-01-12 03:14:43 +06:00
mobidedrm 0.13
This commit is contained in:
parent
8e7d2657a4
commit
86357531a5
@ -26,6 +26,15 @@
|
|||||||
# Also now handles encrypted files that don't need a specific PID.
|
# Also now handles encrypted files that don't need a specific PID.
|
||||||
# 0.11 - use autoflushed stdout and proper return values
|
# 0.11 - use autoflushed stdout and proper return values
|
||||||
# 0.12 - Fix for problems with metadata import as Calibre plugin, report errors
|
# 0.12 - Fix for problems with metadata import as Calibre plugin, report errors
|
||||||
|
# 0.13 - Formatting fixes: retabbed file, removed trailing whitespace
|
||||||
|
# and extra blank lines, converted CR/LF pairs at ends of each line,
|
||||||
|
# and other cosmetic fixes.
|
||||||
|
|
||||||
|
__version__ = '0.13'
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import struct
|
||||||
|
import binascii
|
||||||
|
|
||||||
class Unbuffered:
|
class Unbuffered:
|
||||||
def __init__(self, stream):
|
def __init__(self, stream):
|
||||||
@ -36,15 +45,10 @@ class Unbuffered:
|
|||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
return getattr(self.stream, attr)
|
return getattr(self.stream, attr)
|
||||||
|
|
||||||
import sys
|
|
||||||
sys.stdout=Unbuffered(sys.stdout)
|
|
||||||
|
|
||||||
import struct,binascii
|
|
||||||
|
|
||||||
class DrmException(Exception):
|
class DrmException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
#implementation of Pukall Cipher 1
|
# Implementation of Pukall Cipher 1
|
||||||
def PC1(key, src, decryption=True):
|
def PC1(key, src, decryption=True):
|
||||||
sum1 = 0;
|
sum1 = 0;
|
||||||
sum2 = 0;
|
sum2 = 0;
|
||||||
@ -160,9 +164,7 @@ class DrmStripper:
|
|||||||
break
|
break
|
||||||
return found_key
|
return found_key
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, data_file, pid):
|
def __init__(self, data_file, pid):
|
||||||
|
|
||||||
if checksumPid(pid[0:-2]) != pid:
|
if checksumPid(pid[0:-2]) != pid:
|
||||||
raise DrmException("invalid PID checksum")
|
raise DrmException("invalid PID checksum")
|
||||||
pid = pid[0:-2]
|
pid = pid[0:-2]
|
||||||
@ -190,7 +192,6 @@ class DrmStripper:
|
|||||||
extra_data_flags, = struct.unpack('>H', sect[0xF2:0xF4])
|
extra_data_flags, = struct.unpack('>H', sect[0xF2:0xF4])
|
||||||
print "Extra Data Flags = %d" %extra_data_flags
|
print "Extra Data Flags = %d" %extra_data_flags
|
||||||
|
|
||||||
|
|
||||||
crypto_type, = struct.unpack('>H', sect[0xC:0xC+2])
|
crypto_type, = struct.unpack('>H', sect[0xC:0xC+2])
|
||||||
if crypto_type == 0:
|
if crypto_type == 0:
|
||||||
print "This book is not encrypted."
|
print "This book is not encrypted."
|
||||||
@ -223,6 +224,7 @@ class DrmStripper:
|
|||||||
# print "record %d, extra_size %d" %(i,extra_size)
|
# print "record %d, extra_size %d" %(i,extra_size)
|
||||||
self.patchSection(i, PC1(found_key, data[0:len(data) - extra_size]))
|
self.patchSection(i, PC1(found_key, data[0:len(data) - extra_size]))
|
||||||
print "done"
|
print "done"
|
||||||
|
|
||||||
def getResult(self):
|
def getResult(self):
|
||||||
return self.data_file
|
return self.data_file
|
||||||
|
|
||||||
@ -230,7 +232,6 @@ if not __name__ == "__main__":
|
|||||||
from calibre.customize import FileTypePlugin
|
from calibre.customize import FileTypePlugin
|
||||||
|
|
||||||
class MobiDeDRM(FileTypePlugin):
|
class MobiDeDRM(FileTypePlugin):
|
||||||
|
|
||||||
name = 'MobiDeDRM' # Name of the plugin
|
name = 'MobiDeDRM' # Name of the plugin
|
||||||
description = 'Removes DRM from secure Mobi files'
|
description = 'Removes DRM from secure Mobi files'
|
||||||
supported_platforms = ['linux', 'osx', 'windows'] # Platforms this plugin will run on
|
supported_platforms = ['linux', 'osx', 'windows'] # Platforms this plugin will run on
|
||||||
@ -239,7 +240,6 @@ if not __name__ == "__main__":
|
|||||||
file_types = set(['prc','mobi','azw']) # The file types that this plugin will be applied to
|
file_types = set(['prc','mobi','azw']) # The file types that this plugin will be applied to
|
||||||
on_import = True # Run this plugin during the import
|
on_import = True # Run this plugin during the import
|
||||||
|
|
||||||
|
|
||||||
def run(self, path_to_ebook):
|
def run(self, path_to_ebook):
|
||||||
from calibre.gui2 import is_ok_to_use_qt
|
from calibre.gui2 import is_ok_to_use_qt
|
||||||
from PyQt4.Qt import QMessageBox
|
from PyQt4.Qt import QMessageBox
|
||||||
@ -268,11 +268,13 @@ if not __name__ == "__main__":
|
|||||||
return 'Enter PID (separate multiple PIDs with comma)'
|
return 'Enter PID (separate multiple PIDs with comma)'
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print "MobiDeDrm v0.12. Copyright (c) 2008 The Dark Reverser"
|
sys.stdout=Unbuffered(sys.stdout)
|
||||||
|
print ('MobiDeDrm v%(__version__)s. '
|
||||||
|
'Copyright 2008-2010 The Dark Reverser.' % globals())
|
||||||
if len(sys.argv)<4:
|
if len(sys.argv)<4:
|
||||||
print "Removes protection from Mobipocket books"
|
print "Removes protection from Mobipocket books"
|
||||||
print "Usage:"
|
print "Usage:"
|
||||||
print " mobidedrm infile.mobi outfile.mobi (PID)"
|
print " %s <infile> <outfile> <PID>" % sys.argv[0]
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
infile = sys.argv[1]
|
infile = sys.argv[1]
|
||||||
|
Loading…
Reference in New Issue
Block a user