From de3d91f5e53807aa8e029e49b40d4cead3deee79 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 15:21:09 +0100 Subject: [PATCH] Don't repack EPUB if nothing has changed --- CHANGELOG.md | 1 + DeDRM_plugin/__init__.py | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9565d52..569d982 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -109,4 +109,5 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix SHA1 hash function for erdr2pml.py script (#608, thanks @unwiredben). - Make Kobo DRM removal not fail when there are undownloaded ebooks (#384, thanks @precondition). - Fix Obok import failing in Calibre flatpak due to missing ip command (#586 and #585, thanks @jcotton42). +- Don't re-pack EPUB if there's no DRM to remove and no postprocessing done (fixes #555). diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 983ecc8..8200122 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -216,12 +216,16 @@ class DeDRM(FileTypePlugin): traceback.print_exc() raise - def postProcessEPUB(self, path_to_ebook): + def postProcessEPUB(self, path_to_ebook, path_to_original_ebook = None): # This is called after the DRM is removed (or if no DRM was present) # It does stuff like de-obfuscating fonts (by calling checkFonts) # or removing watermarks. postProcessStart = time.time() + postProcessingNeeded = False + + # Save a backup of the EPUB path after DRM removal but before any postprocessing is done. + pre_postprocessing_EPUB_path = path_to_ebook try: import prefs @@ -248,6 +252,15 @@ class DeDRM(FileTypePlugin): postProcessEnd = time.time() print("{0} v{1}: Post-processing took {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, postProcessEnd-postProcessStart)) + + # If the EPUB is DRM-free (path_to_original_ebook will only be set in this case), + # and the post-processing hasn't changed anything in the EPUB, + # return the raw original file from path_to_original_ebook from before the + # zipfix code was executed. + if ((path_to_ebook == pre_postprocessing_EPUB_path) and path_to_original_ebook is not None): + print("{0} v{1}: Post-processing didn't do anything on DRM-free EPUB, returning original file".format(PLUGIN_NAME, PLUGIN_VERSION)) + return path_to_original_ebook + return path_to_ebook except: @@ -299,9 +312,9 @@ class DeDRM(FileTypePlugin): # import the LCP handler import lcpdedrm - if (lcpdedrm.isLCPbook(path_to_ebook)): + if (lcpdedrm.isLCPbook(inf.name)): try: - retval = lcpdedrm.decryptLCPbook(path_to_ebook, dedrmprefs['lcp_passphrases'], self) + retval = lcpdedrm.decryptLCPbook(inf.name, dedrmprefs['lcp_passphrases'], self) except: print("Looks like that didn't work:") raise @@ -628,7 +641,7 @@ class DeDRM(FileTypePlugin): # Not a Barnes & Noble nor an Adobe Adept # Probably a DRM-free EPUB, but we should still check for fonts. - return self.postProcessEPUB(inf.name) + return self.postProcessEPUB(inf.name, path_to_ebook) def PDFIneptDecrypt(self, path_to_ebook):