示例#1
0
    def KindleMobiDecrypt(self, path_to_ebook):

        # add the alfcrypto directory to sys.path so alfcrypto.py
        # will be able to locate the custom lib(s) for CDLL import.
        sys.path.insert(0, self.alfdir)
        # Had to move this import here so the custom libs can be
        # extracted to the appropriate places beforehand these routines
        # look for them.
        import calibre_plugins.dedrm.prefs as prefs
        import calibre_plugins.dedrm.k4mobidedrm

        dedrmprefs = prefs.DeDRM_Prefs()
        pids = dedrmprefs['pids']
        serials = dedrmprefs['serials']
        for android_serials_list in dedrmprefs['androidkeys'].values():
            #print android_serials_list
            serials.extend(android_serials_list)
        #print serials
        androidFiles = []
        kindleDatabases = list(dedrmprefs['kindlekeys'].items())

        try:
            book = k4mobidedrm.GetDecryptedBook(path_to_ebook, kindleDatabases,
                                                androidFiles, serials, pids,
                                                self.starttime)
        except Exception as e:
            decoded = False
            # perhaps we need to get a new default Kindle for Mac/PC key
            defaultkeys = []
            print("{0} v{1}: Failed to decrypt with error: {2}".format(
                PLUGIN_NAME, PLUGIN_VERSION, e.args[0]))
            print(
                "{0} v{1}: Looking for new default Kindle Key after {2:.1f} seconds"
                .format(PLUGIN_NAME, PLUGIN_VERSION,
                        time.time() - self.starttime))

            try:
                if iswindows or isosx:
                    from calibre_plugins.dedrm.kindlekey import kindlekeys

                    defaultkeys = kindlekeys()
                else:  # linux
                    from .wineutils import WineGetKeys

                    scriptpath = os.path.join(self.alfdir, "kindlekey.py")
                    defaultkeys = WineGetKeys(scriptpath, ".k4i",
                                              dedrmprefs['kindlewineprefix'])
            except:
                print(
                    "{0} v{1}: Exception when getting default Kindle Key after {2:.1f} seconds"
                    .format(PLUGIN_NAME, PLUGIN_VERSION,
                            time.time() - self.starttime))
                traceback.print_exc()
                pass

            newkeys = {}
            for i, keyvalue in enumerate(defaultkeys):
                keyname = "default_key_{0:d}".format(i + 1)
                if keyvalue not in dedrmprefs['kindlekeys'].values():
                    newkeys[keyname] = keyvalue
            if len(newkeys) > 0:
                print("{0} v{1}: Found {2} new {3}".format(
                    PLUGIN_NAME, PLUGIN_VERSION, len(newkeys),
                    "key" if len(newkeys) == 1 else "keys"))
                try:
                    book = k4mobidedrm.GetDecryptedBook(
                        path_to_ebook, list(newkeys.items()), [], [], [],
                        self.starttime)
                    decoded = True
                    # store the new successful keys in the defaults
                    print("{0} v{1}: Saving {2} new {3}".format(
                        PLUGIN_NAME, PLUGIN_VERSION, len(newkeys),
                        "key" if len(newkeys) == 1 else "keys"))
                    for keyvalue in newkeys.values():
                        dedrmprefs.addnamedvaluetoprefs(
                            'kindlekeys', 'default_key', keyvalue)
                    dedrmprefs.writeprefs()
                except Exception as e:
                    pass
            if not decoded:
                #if you reached here then no luck raise and exception
                print(
                    "{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md"
                    .format(PLUGIN_NAME, PLUGIN_VERSION,
                            time.time() - self.starttime))
                raise DeDRMError(
                    "{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md"
                    .format(PLUGIN_NAME, PLUGIN_VERSION,
                            time.time() - self.starttime))

        of = self.temporary_file(book.getBookExtension())
        book.getFile(of.name)
        of.close()
        book.cleanup()
        return of.name
示例#2
0
    def KindleMobiDecrypt(self, path_to_ebook):

        # add the alfcrypto directory to sys.path so alfcrypto.py
        # will be able to locate the custom lib(s) for CDLL import.
        sys.path.insert(0, self.alfdir)
        # Had to move this import here so the custom libs can be
        # extracted to the appropriate places beforehand these routines
        # look for them.
        import calibre_plugins.dedrm.prefs as prefs
        import calibre_plugins.dedrm.k4mobidedrm

        dedrmprefs = prefs.DeDRM_Prefs()
        pids = dedrmprefs['pids']
        serials = dedrmprefs['serials']
        kindleDatabases = dedrmprefs['kindlekeys'].items()

        try:
            book = k4mobidedrm.GetDecryptedBook(path_to_ebook, kindleDatabases,
                                                serials, pids, self.starttime)
        except Exception, e:
            decoded = False
            # perhaps we need to get a new default Kindle for Mac/PC key
            defaultkeys = []
            print u"{0} v{1}: Failed to decrypt with error: {2}".format(
                PLUGIN_NAME, PLUGIN_VERSION, e.args[0])
            print u"{0} v{1}: Looking for new default Kindle Key after {2:.1f} seconds".format(
                PLUGIN_NAME, PLUGIN_VERSION,
                time.time() - self.starttime)

            try:
                if iswindows or isosx:
                    from calibre_plugins.dedrm.kindlekey import kindlekeys

                    defaultkeys = kindlekeys()
                else:  # linux
                    from wineutils import WineGetKeys

                    scriptpath = os.join(self.alfdir, u"kindlekey.py")
                    defaultkeys = self.WineGetKeys(
                        scriptpath, u".k4i", dedrmprefs['kindlewineprefix'])
            except:
                pass

            newkeys = {}
            for i, keyvalue in enumerate(defaultkeys):
                keyname = u"default_key_{0:d}".format(i + 1)
                if keyvalue not in dedrmprefs['kindlekeys'].values():
                    newkeys[keyname] = keyvalue
            if len(newkeys) > 0:
                print u"{0} v{1}: Found {2} new {3}".format(
                    PLUGIN_NAME, PLUGIN_VERSION, len(newkeys),
                    u"key" if len(newkeys) == 1 else u"keys")
                try:
                    book = k4mobidedrm.GetDecryptedBook(
                        path_to_ebook, newkeys.items(), [], [], self.starttime)
                    decoded = True
                    # store the new successful keys in the defaults
                    print u"{0} v{1}: Saving {2} new {3}".format(
                        PLUGIN_NAME, PLUGIN_VERSION, len(newkeys),
                        u"key" if len(newkeys) == 1 else u"keys")
                    for keyvalue in newkeys.values():
                        dedrmprefs.addnamedvaluetoprefs(
                            'kindlekeys', 'default_key', keyvalue)
                    dedrmprefs.writeprefs()
                except Exception, e:
                    pass