From b11aadcca6e80621c421a644ec1cd305c2b0a479 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 29 Dec 2021 11:36:59 +0100 Subject: [PATCH] Bugfixes in standalone code for Calibre < 5 / Python 2 --- DeDRM_plugin/__calibre_compat_code.py | 14 ++++++++ DeDRM_plugin/__init__.py | 8 ++--- DeDRM_plugin/config.py | 4 +-- DeDRM_plugin/erdr2pml.py | 4 +-- DeDRM_plugin/genbook.py | 3 +- DeDRM_plugin/k4mobidedrm.py | 3 +- DeDRM_plugin/kfxdedrm.py | 5 +-- DeDRM_plugin/prefs.py | 4 +-- DeDRM_plugin/scriptinterface.py | 4 +-- DeDRM_plugin/standalone/__init__.py | 22 ++++++------ DeDRM_plugin/topazextract.py | 4 +-- DeDRM_plugin/utilities.py | 5 +-- DeDRM_plugin/wineutils.py | 5 ++- DeDRM_plugin/zipfix.py | 3 +- Obok_plugin/obok/obok.py | 2 +- Other_Tools/Kobo/obok.py | 2 +- make_release.py | 51 ++++++++++++++++++++++++++- 17 files changed, 100 insertions(+), 43 deletions(-) create mode 100644 DeDRM_plugin/__calibre_compat_code.py diff --git a/DeDRM_plugin/__calibre_compat_code.py b/DeDRM_plugin/__calibre_compat_code.py new file mode 100644 index 0000000..4896dd6 --- /dev/null +++ b/DeDRM_plugin/__calibre_compat_code.py @@ -0,0 +1,14 @@ + +#@@CALIBRE_COMPAT_CODE_START@@ +import sys, os + +# Explicitly allow importing the parent folder +if os.path.dirname(os.path.dirname(os.path.abspath(__file__))) not in sys.path: + sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Bugfix for Calibre < 5: +if "calibre" in sys.modules and sys.version_info[0] == 2: + from calibre.utils.config import config_dir + if os.path.join(config_dir, "plugins", "DeDRM.zip") not in sys.path: + sys.path.insert(0, os.path.join(config_dir, "plugins", "DeDRM.zip")) +#@@CALIBRE_COMPAT_CODE_END@@ diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 80f7f28..ac11d0f 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from __future__ import print_function + # __init__.py for DeDRM_plugin # Copyright © 2008-2020 Apprentice Harper et al. # Copyright © 2021 NoDRM @@ -97,9 +99,7 @@ import sys, os import time import traceback -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - +#@@CALIBRE_COMPAT_CODE@@ class DeDRMError(Exception): pass @@ -162,7 +162,7 @@ class DeDRM(FileTypePlugin): def cli_main(self, data): - from standalone import main + from .standalone import main main(data) def initialize(self): diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 4cdb2ea..79e7c4d 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -16,8 +16,8 @@ from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, from PyQt5 import Qt as QtGui from zipfile import ZipFile -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ # calibre modules and constants. diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index 70d7b46..26c947d 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -71,9 +71,7 @@ __version__='1.00' import sys, re import struct, binascii, getopt, zlib, os, os.path, urllib, tempfile, traceback -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - +#@@CALIBRE_COMPAT_CODE@@ # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get diff --git a/DeDRM_plugin/genbook.py b/DeDRM_plugin/genbook.py index a0e0d0d..21186b8 100644 --- a/DeDRM_plugin/genbook.py +++ b/DeDRM_plugin/genbook.py @@ -35,8 +35,7 @@ import getopt from struct import pack from struct import unpack -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ class TpzDRMError(Exception): diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index 1a6465b..ec108d4 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -72,8 +72,7 @@ import time import html.entities import json -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ class DrmException(Exception): diff --git a/DeDRM_plugin/kfxdedrm.py b/DeDRM_plugin/kfxdedrm.py index 0674d63..cec764c 100644 --- a/DeDRM_plugin/kfxdedrm.py +++ b/DeDRM_plugin/kfxdedrm.py @@ -15,8 +15,9 @@ import zipfile from io import BytesIO -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ + from ion import DrmIon, DrmIonVoucher diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index ae44213..4db9618 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -8,8 +8,8 @@ __license__ = 'GPL v3' import os, sys import traceback -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ from calibre.utils.config import JSONConfig diff --git a/DeDRM_plugin/scriptinterface.py b/DeDRM_plugin/scriptinterface.py index 3351ee7..e65f426 100644 --- a/DeDRM_plugin/scriptinterface.py +++ b/DeDRM_plugin/scriptinterface.py @@ -6,8 +6,8 @@ import sys import os -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ import re diff --git a/DeDRM_plugin/standalone/__init__.py b/DeDRM_plugin/standalone/__init__.py index fceda3b..dbf0cab 100644 --- a/DeDRM_plugin/standalone/__init__.py +++ b/DeDRM_plugin/standalone/__init__.py @@ -3,6 +3,8 @@ # CLI interface for the DeDRM plugin (useable without Calibre, too) +from __future__ import absolute_import, print_function + # Copyright © 2021 NoDRM OPT_SHORT_TO_LONG = [ @@ -16,15 +18,11 @@ OPT_SHORT_TO_LONG = [ ["f", "force"] ] -import sys, os -IS_CALIBRE = False -if "calibre" in sys.modules: - IS_CALIBRE = True +#@@CALIBRE_COMPAT_CODE@@ -# Explicitly allow importing the parent folder -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Explicitly set the package identifier so we are allowed to import stuff ... __package__ = "DeDRM_plugin" +import os, sys global _additional_data @@ -46,7 +44,7 @@ def print_help(): print("Based on DeDRM Calibre plugin by Apprentice Harper, Apprentice Alf and others.") print("See https://github.com/noDRM/DeDRM_tools for more information.") print() - if IS_CALIBRE: + if "calibre" in sys.modules: print("This plugin can be run through Calibre - like you are doing right now - ") print("but it can also be executed with a standalone Python interpreter.") else: @@ -81,11 +79,11 @@ def handle_single_argument(arg, next): if arg == "--help": print_help() - exit(0) + sys.exit(0) elif arg == "--credits": print_credits() - exit(0) + sys.exit(0) elif arg in ["--username", "--password"]: used_up = 1 @@ -93,7 +91,7 @@ def handle_single_argument(arg, next): if next is None: print_err_header() print("Missing parameter for argument " + arg) - exit(1) + sys.exit(1) else: _additional_params.append(next[0]) @@ -104,7 +102,7 @@ def handle_single_argument(arg, next): else: print_err_header() print("Unknown argument: " + arg) - exit(1) + sys.exit(1) # Used up 0 additional arguments @@ -132,7 +130,7 @@ def main(argv): skip_opts = False # First element is always the ZIP name, remove that. - if not arguments[0].lower().endswith(".zip") and not IS_CALIBRE: + if not arguments[0].lower().endswith(".zip") and not "calibre" in sys.modules: print("Warning: File name does not end in .zip ...") print(arguments) arguments.pop(0) diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 4db5072..8be96a2 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -14,8 +14,8 @@ __version__ = '6.0' import sys import os, csv, getopt -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ + import zlib, zipfile, tempfile, shutil import traceback diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index 1efd8ce..bd008b5 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -1,10 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import sys, os -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - +#@@CALIBRE_COMPAT_CODE@@ from ignoblekeyGenPassHash import generate_key diff --git a/DeDRM_plugin/wineutils.py b/DeDRM_plugin/wineutils.py index 071e0da..cd79b4c 100644 --- a/DeDRM_plugin/wineutils.py +++ b/DeDRM_plugin/wineutils.py @@ -5,7 +5,10 @@ __license__ = 'GPL v3' # Standard Python modules. import os, sys, re, hashlib, traceback -from calibre_plugins.dedrm.__init__ import PLUGIN_NAME, PLUGIN_VERSION + +#@@CALIBRE_COMPAT_CODE@@ + +from __init__ import PLUGIN_NAME, PLUGIN_VERSION class NoWinePython3Exception(Exception): diff --git a/DeDRM_plugin/zipfix.py b/DeDRM_plugin/zipfix.py index 079e49a..3fbfbce 100644 --- a/DeDRM_plugin/zipfix.py +++ b/DeDRM_plugin/zipfix.py @@ -22,8 +22,7 @@ __version__ = "1.1" import sys, os -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ import zlib import zipfilerugged diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index f680341..e80e9ae 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -788,7 +788,7 @@ def cli_main(): books = [lib.books[num - 1]] except (ValueError, IndexError): print("Invalid choice. Exiting...") - exit() + sys.exit() results = [decrypt_book(book, lib) for book in books] lib.close() diff --git a/Other_Tools/Kobo/obok.py b/Other_Tools/Kobo/obok.py index 6f87114..ae08800 100644 --- a/Other_Tools/Kobo/obok.py +++ b/Other_Tools/Kobo/obok.py @@ -739,7 +739,7 @@ def cli_main(): books = [lib.books[num - 1]] except (ValueError, IndexError): print("Invalid choice. Exiting...") - exit() + sys.exit() results = [decrypt_book(book, lib) for book in books] lib.close() diff --git a/make_release.py b/make_release.py index e600af8..95bebf6 100755 --- a/make_release.py +++ b/make_release.py @@ -14,19 +14,65 @@ import shutil DEDRM_SRC_DIR = 'DeDRM_plugin' +DEDRM_SRC_TMP_DIR = 'DeDRM_plugin_temp' DEDRM_README= 'DeDRM_plugin_ReadMe.txt' OBOK_SRC_DIR = 'Obok_plugin' OBOK_README = 'obok_plugin_ReadMe.txt' RELEASE_DIR = 'release' +def patch_file(filepath): + f = open(filepath, "rb") + fn = open(filepath + ".tmp", "wb") + patch = open(os.path.join(DEDRM_SRC_DIR, "__calibre_compat_code.py"), "rb") + patchdata = patch.read() + patch.close() + + while True: + line = f.readline() + if len(line) == 0: + break + + if line.strip().startswith(b"#@@CALIBRE_COMPAT_CODE@@"): + fn.write(patchdata) + else: + fn.write(line) + + f.close() + fn.close() + shutil.move(filepath + ".tmp", filepath) + + def make_release(version): try: shutil.rmtree(RELEASE_DIR) except: pass + try: + shutil.rmtree(DEDRM_SRC_TMP_DIR) + except: + pass + os.mkdir(RELEASE_DIR) - shutil.make_archive(DEDRM_SRC_DIR, 'zip', DEDRM_SRC_DIR) + + # Copy folder + shutil.copytree(DEDRM_SRC_DIR, DEDRM_SRC_TMP_DIR) + + # Modify folder + try: + shutil.rmtree(os.path.join(os.path.abspath(DEDRM_SRC_TMP_DIR), "__pycache__")) + except: + pass + + # Patch file to add compat code. + for root, dirs, files in os.walk(DEDRM_SRC_TMP_DIR): + for name in files: + if name.endswith(".py"): + patch_file(os.path.join(root, name)) + + + # Package + shutil.make_archive(DEDRM_SRC_DIR, 'zip', DEDRM_SRC_TMP_DIR) shutil.make_archive(OBOK_SRC_DIR, 'zip', OBOK_SRC_DIR) shutil.move(DEDRM_SRC_DIR+'.zip', RELEASE_DIR) shutil.move(OBOK_SRC_DIR+'.zip', RELEASE_DIR) @@ -34,6 +80,9 @@ def make_release(version): shutil.copy(OBOK_README, RELEASE_DIR) shutil.copy("ReadMe_Overview.txt", RELEASE_DIR) + # Remove temp folder: + shutil.rmtree(DEDRM_SRC_TMP_DIR) + if version is not None: release_name = 'DeDRM_tools_{}'.format(version) else: