From b01065524ee961f2be94b35abbd8a1d159c8dc3f Mon Sep 17 00:00:00 2001 From: eneller Date: Thu, 4 Sep 2025 18:59:43 +0200 Subject: [PATCH] chore: executable paths --- pyproject.toml | 23 +++++++++++++++ src/{ => degourou}/DeGourou.py | 31 +++++++++++---------- src/degourou/decrypt/__init__.py | 0 src/{ => degourou}/decrypt/decodeEPUB.py | 4 +-- src/{ => degourou}/decrypt/decodePDF.py | 4 +-- src/{ => degourou}/decrypt/params.py | 0 src/{ => degourou}/decrypt/zeroedzipinfo.py | 0 src/degourou/setup/__init__.py | 0 src/{ => degourou}/setup/customRSA.py | 0 src/{ => degourou}/setup/data.py | 4 +-- src/{ => degourou}/setup/fulfill.py | 6 ++-- src/{ => degourou}/setup/ia.py | 1 - src/{ => degourou}/setup/libadobe.py | 4 +-- src/{ => degourou}/setup/libadobeAccount.py | 12 ++++---- src/{ => degourou}/setup/libadobeFulfill.py | 8 +++--- src/{ => degourou}/setup/libpdf.py | 0 src/{ => degourou}/setup/loginAccount.py | 6 ++-- src/{ => degourou}/setup/params.py | 0 uv.lock | 23 ++++++++++++++- 19 files changed, 85 insertions(+), 41 deletions(-) rename src/{ => degourou}/DeGourou.py (85%) create mode 100644 src/degourou/decrypt/__init__.py rename src/{ => degourou}/decrypt/decodeEPUB.py (96%) rename src/{ => degourou}/decrypt/decodePDF.py (99%) rename src/{ => degourou}/decrypt/params.py (100%) rename src/{ => degourou}/decrypt/zeroedzipinfo.py (100%) create mode 100644 src/degourou/setup/__init__.py rename src/{ => degourou}/setup/customRSA.py (100%) rename src/{ => degourou}/setup/data.py (99%) rename src/{ => degourou}/setup/fulfill.py (96%) rename src/{ => degourou}/setup/ia.py (98%) rename src/{ => degourou}/setup/libadobe.py (99%) rename src/{ => degourou}/setup/libadobeAccount.py (98%) rename src/{ => degourou}/setup/libadobeFulfill.py (98%) rename src/{ => degourou}/setup/libpdf.py (100%) rename src/{ => degourou}/setup/loginAccount.py (87%) rename src/{ => degourou}/setup/params.py (100%) diff --git a/pyproject.toml b/pyproject.toml index dabe131..ba118e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,3 +10,26 @@ dependencies = [ "pycryptodomex==3.17", "requests==2.31.0", ] +[project.scripts] +degourou = "degourou.DeGourou:main" + +[tool.uv.pip] +no-binary = ["charset-normalizer"] + +[tool.uv.workspace] +members = [ + ".", +] + +[tool.uv.sources] +degourou = { workspace = true } + +[build-system] +requires = ["setuptools>=64", "setuptools_scm>=8"] + +[dependency-groups] +dev = [ + "degourou", + "lxml-stubs>=0.5.1", +] + diff --git a/src/DeGourou.py b/src/degourou/DeGourou.py similarity index 85% rename from src/DeGourou.py rename to src/degourou/DeGourou.py index 787312a..ff4180c 100644 --- a/src/DeGourou.py +++ b/src/degourou/DeGourou.py @@ -1,17 +1,17 @@ -from setup.loginAccount import loginAndGetKey -from setup.fulfill import downloadFile +from degourou.setup.loginAccount import loginAndGetKey +from degourou.setup.fulfill import downloadFile -from decrypt.decodePDF import decryptPDF -from decrypt.decodeEPUB import decryptEPUB +from degourou.decrypt.decodePDF import decryptPDF, getPDFencryptionType +from degourou.decrypt.decodeEPUB import decryptEPUB import argparse from os import mkdir, remove, rename from os.path import exists -from setup.params import FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML -from decrypt.params import KEYPATH -from setup.data import createDefaultFiles -from setup.ia import SESSION_FILE, manage_login, get_book, return_book +from degourou.setup.params import FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML +from degourou.decrypt.params import KEYPATH +from degourou.setup.data import createDefaultFiles +from degourou.setup.ia import SESSION_FILE, manage_login, get_book, return_book def loginADE(email, password): @@ -31,7 +31,7 @@ def loginIA(email,password): manage_login(email,password) print() -def main(acsmFile, outputFilename): +def run(acsmFile, outputFilename): if not exists('account'): mkdir('account') # setting up the account and keys @@ -80,13 +80,12 @@ def handle_IA(url,format): if acsmFile is None: print("Could not get Book, try using ACSm file as input") return - main(acsmFile,None) + run(acsmFile,None) remove(acsmFile) if(return_book(url) is None): print("Please return it yourself") - -if __name__ == "__main__": +def main(): parser = argparse.ArgumentParser(description="Download and Decrypt an encrypted PDF or EPUB file.") parser.add_argument("-f", type=str, nargs='?', default=None, help="path to the ACSM file") parser.add_argument("-u", type=str, nargs='?', default=None, help="book url from InternetArchive") @@ -133,8 +132,12 @@ if __name__ == "__main__": elif args.f == None: if exists("URLLink.acsm"): args.f = "URLLink.acsm" - main(args.f, args.o) + run(args.f, args.o) else: parser.print_help() else: - main(args.f, args.o) + run(args.f, args.o) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/degourou/decrypt/__init__.py b/src/degourou/decrypt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/decrypt/decodeEPUB.py b/src/degourou/decrypt/decodeEPUB.py similarity index 96% rename from src/decrypt/decodeEPUB.py rename to src/degourou/decrypt/decodeEPUB.py index 7c69ad0..cb62151 100644 --- a/src/decrypt/decodeEPUB.py +++ b/src/degourou/decrypt/decodeEPUB.py @@ -11,7 +11,7 @@ Decrypt Adobe Digital Editions encrypted ePub books. """ -from decrypt.params import KEYPATH +from .params import KEYPATH __license__ = 'GPL v3' __version__ = "8.0" @@ -21,7 +21,7 @@ import traceback import base64 import zlib from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED -from decrypt.zeroedzipinfo import ZeroedZipInfo +from .zeroedzipinfo import ZeroedZipInfo from contextlib import closing from lxml import etree from uuid import UUID diff --git a/src/decrypt/decodePDF.py b/src/degourou/decrypt/decodePDF.py similarity index 99% rename from src/decrypt/decodePDF.py rename to src/degourou/decrypt/decodePDF.py index 271f859..15ddf28 100644 --- a/src/decrypt/decodePDF.py +++ b/src/degourou/decrypt/decodePDF.py @@ -13,7 +13,7 @@ Decrypts Adobe ADEPT-encrypted PDF files. """ -from decrypt.params import KEYPATH +from .params import KEYPATH __license__ = 'GPL v3' __version__ = "10.0.4" @@ -2305,5 +2305,3 @@ def decryptPDF(inpath): else: print("Decryption failed") return None - - diff --git a/src/decrypt/params.py b/src/degourou/decrypt/params.py similarity index 100% rename from src/decrypt/params.py rename to src/degourou/decrypt/params.py diff --git a/src/decrypt/zeroedzipinfo.py b/src/degourou/decrypt/zeroedzipinfo.py similarity index 100% rename from src/decrypt/zeroedzipinfo.py rename to src/degourou/decrypt/zeroedzipinfo.py diff --git a/src/degourou/setup/__init__.py b/src/degourou/setup/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/setup/customRSA.py b/src/degourou/setup/customRSA.py similarity index 100% rename from src/setup/customRSA.py rename to src/degourou/setup/customRSA.py diff --git a/src/setup/data.py b/src/degourou/setup/data.py similarity index 99% rename from src/setup/data.py rename to src/degourou/setup/data.py index 9aa457c..b53ede5 100644 --- a/src/setup/data.py +++ b/src/degourou/setup/data.py @@ -1,5 +1,5 @@ -from setup.params import FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML -from decrypt.params import KEYPATH +from .params import FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML +from degourou.decrypt.params import KEYPATH keyContent = b'0\x82\x02\\\x02\x01\x00\x02\x81\x81\x00\xad*E\x8e0\n\x91\xd6\xbaj\xc1t3\xc2R2h\xa6\x18\x063i\xfd\x9bR/e\xa6\xec\x87\xab\x11\n\'\xb7\x93\x14\xb6\xbbm\xfa\xf0\xf4\xe8=\x18\xa6\xe9\x15$\xdao\xb3\x8d\xf5\xddT\n\xf5\t<\xe8\xb2\x93k\x02zi\xe6\x86\x10F\x13\xc9m\xcfZ\x83\xe6=\xd6G\xf2/]3\xff\x8ch#\xea|\xa9I\x9a\xf6\xbf\x19\xd9\x10\xe0\x18\xa1\rb\x801k~\xc03f\x84\x07{v\x88\x18\x9bH\x91+o \x90\x9b\xb7\xf5\x02\x03\x01\x00\x01\x02\x81\x80\x05\xfd\x95\xd3\x886\x9a\xba\x8ck\xc1\xb5\xc21\x86\xab\x1a\xa8^\x1af%\x9b\x8a\xc0\x96\xc6\x10}\xb6\xf6\xeb\x80\xc4R\xc2@\x9d\xf9F\xa1\xf7\xe6\x06jPs\xad\xc3w\xd3\xea\xb7\xca\xec\x03\x17\xcf\xff\x01u\x96\x15\n\x0e&\xb0\xc7\x90F\xc4\xdaZ"\xc1)>\xee\x19\xf6\x05\xa5\xba\x00H)\xa8>\x1fC\x02\xd3\xba\xa8){\x06^D\xb4\xfd"\x05\x05\xec\xef\xdb.tbZ8\xabU<,+\xb6\xfaI\x98\xcc7H\xedr\xa9\xfd\x02A\x00\xc27%\xc5\xa0\xff\xd5l\xaa\x7f=\x1dx\xab?\xd8~\xf7v\x1f!\x0cCh\xc9\xb4\x1a\x8b\xb2\xaeC\xa0\xf9\x91\xcc\x99<\x11\xfbQ\xae\x8fG\xb0\xd1b\x0c=\xebR\x19\xb4\x15\xd4\x1c\xbe\xf4\xc7E\xe8\xea\xe1\xb3\x0b\x02A\x00\xe4@\xcb(\xdd\x04F\xe4jT\xe5a\xaaj\xaf=F\xa1\xaf\x1c\xa6F\x93\xc7V1\xd9\xb1\x96\xdb\x1b\xf5\x86\r\xb11\x10\x12\x18\xc5\xee\xaeD\xa3\xc1/\xe3\xf2\x8f\xaf\xad\xda\xe6\t\x8d\x9d\x99z\x04\xeeK\xdb \xff\x02A\x00\xad_\x9d\x90v\xd0\xeb->f\xa7\xa0\x0f\x80\x90V+\xc1\xac\xe8\xcd\x0f\xad}u\xd2\x19\x80k\xd9\xb4\xf5\x96\xd4\xd8\xd8R\x0f\x9bR\xa7\x89\xb0m\xdf\xfc\xaf\x00\xf7y+\x08\xe0\x13\xa25\xb5=\xce\xe2\xc6\x0b\x05Q\x02@\x18\xee\xf7\x02\\\xbaU\xe0\'\xb9da9\xd3s\x97\x16\xfb\x1c|\xdd\xb1\x01\xfd\x99m\xd2\xa0\xf2\xa0\xb6\xba(M\xa0\x98\x82o\xe7\xa2\xdf\x82\xcb\xde\xb3\x80\xbe\xbe\xc5qdep\x11\x85\x15\xbd)6\x16\xad\xd4\x9f\x13\x02@\x0f\x15\xc1Y"b\x19\x81Q\x81\x8d\x006\xe4\xf0e\xa2\xa7\xb8\x98{\x1c\x12\xe0\nw\xbe\x86A-\xd0\x1c7\xf3\x169\xadd3\x85\xaf\x13\x99\x08\x97e)c\xaf\xb1V\xf1\x15\xf6K\r\x16\xb4\xf9\xd1\x10\xe2\x92\xf9' diff --git a/src/setup/fulfill.py b/src/degourou/setup/fulfill.py similarity index 96% rename from src/setup/fulfill.py rename to src/degourou/setup/fulfill.py index 15a99a5..dcd4fd0 100644 --- a/src/setup/fulfill.py +++ b/src/degourou/setup/fulfill.py @@ -12,9 +12,9 @@ import os, time, shutil import zipfile from lxml import etree -from setup.libadobe import sendHTTPRequest_DL2FILE -from setup.libadobeFulfill import buildRights, fulfill -from setup.libpdf import patch_drm_into_pdf +from .libadobe import sendHTTPRequest_DL2FILE +from .libadobeFulfill import buildRights, fulfill +from .libpdf import patch_drm_into_pdf ####################################################################### diff --git a/src/setup/ia.py b/src/degourou/setup/ia.py similarity index 98% rename from src/setup/ia.py rename to src/degourou/setup/ia.py index d07caef..5b519a5 100644 --- a/src/setup/ia.py +++ b/src/degourou/setup/ia.py @@ -1,4 +1,3 @@ -from charset_normalizer import md__mypyc from os import path, mkdir from requests import Session import random diff --git a/src/setup/libadobe.py b/src/degourou/setup/libadobe.py similarity index 99% rename from src/setup/libadobe.py rename to src/degourou/setup/libadobe.py index a02a368..ccd4a65 100644 --- a/src/setup/libadobe.py +++ b/src/degourou/setup/libadobe.py @@ -30,7 +30,7 @@ except ImportError: #@@CALIBRE_COMPAT_CODE@@ -from setup.customRSA import CustomRSA +from .customRSA import CustomRSA from cryptography.hazmat.primitives.serialization.pkcs12 import load_key_and_certificates from cryptography.hazmat.primitives import serialization @@ -38,7 +38,7 @@ from cryptography.hazmat.primitives import serialization VAR_ACS_SERVER_HTTP = "http://adeactivate.adobe.com/adept" VAR_ACS_SERVER_HTTPS = "https://adeactivate.adobe.com/adept" -from setup.params import FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML +from .params import FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML # Lists of different ADE "versions" we know about VAR_VER_SUPP_CONFIG_NAMES = [ "ADE 1.7.2", "ADE 2.0.1", "ADE 3.0.1", "ADE 4.0.3", "ADE 4.5.10", "ADE 4.5.11" ] diff --git a/src/setup/libadobeAccount.py b/src/degourou/setup/libadobeAccount.py similarity index 98% rename from src/setup/libadobeAccount.py rename to src/degourou/setup/libadobeAccount.py index be604ef..07f614c 100644 --- a/src/setup/libadobeAccount.py +++ b/src/degourou/setup/libadobeAccount.py @@ -15,12 +15,12 @@ except ImportError: #@@CALIBRE_COMPAT_CODE@@ -from setup.libadobe import addNonce, sign_node, sendRequestDocu, sendHTTPRequest -from setup.libadobe import makeFingerprint, makeSerial, encrypt_with_device_key, decrypt_with_device_key -from setup.libadobe import get_devkey_path, get_device_path, get_activation_xml_path -from setup.libadobe import VAR_VER_SUPP_CONFIG_NAMES, VAR_VER_HOBBES_VERSIONS, VAR_VER_OS_IDENTIFIERS -from setup.libadobe import VAR_VER_ALLOWED_BUILD_IDS_SWITCH_TO, VAR_VER_SUPP_VERSIONS, VAR_ACS_SERVER_HTTP -from setup.libadobe import VAR_ACS_SERVER_HTTPS, VAR_VER_BUILD_IDS, VAR_VER_NEED_HTTPS_BUILD_ID_LIMIT, VAR_VER_ALLOWED_BUILD_IDS_AUTHORIZE +from .libadobe import addNonce, sign_node, sendRequestDocu, sendHTTPRequest +from .libadobe import makeFingerprint, makeSerial, encrypt_with_device_key, decrypt_with_device_key +from .libadobe import get_devkey_path, get_device_path, get_activation_xml_path +from .libadobe import VAR_VER_SUPP_CONFIG_NAMES, VAR_VER_HOBBES_VERSIONS, VAR_VER_OS_IDENTIFIERS +from .libadobe import VAR_VER_ALLOWED_BUILD_IDS_SWITCH_TO, VAR_VER_SUPP_VERSIONS, VAR_ACS_SERVER_HTTP +from .libadobe import VAR_ACS_SERVER_HTTPS, VAR_VER_BUILD_IDS, VAR_VER_NEED_HTTPS_BUILD_ID_LIMIT, VAR_VER_ALLOWED_BUILD_IDS_AUTHORIZE def createDeviceFile(randomSerial, useVersionIndex = 0): diff --git a/src/setup/libadobeFulfill.py b/src/degourou/setup/libadobeFulfill.py similarity index 98% rename from src/setup/libadobeFulfill.py rename to src/degourou/setup/libadobeFulfill.py index 2d2c57e..9906380 100644 --- a/src/setup/libadobeFulfill.py +++ b/src/degourou/setup/libadobeFulfill.py @@ -5,10 +5,10 @@ import time #@@CALIBRE_COMPAT_CODE@@ -from setup.libadobe import addNonce, sign_node, get_cert_from_pkcs12, sendRequestDocu, sendRequestDocuRC, sendHTTPRequest -from setup.libadobe import get_devkey_path, get_device_path, get_activation_xml_path -from setup.libadobe import VAR_VER_SUPP_VERSIONS, VAR_VER_HOBBES_VERSIONS -from setup.libadobe import VAR_VER_BUILD_IDS, VAR_VER_USE_DIFFERENT_NOTIFICATION_XML_ORDER +from .libadobe import addNonce, sign_node, get_cert_from_pkcs12, sendRequestDocu, sendRequestDocuRC, sendHTTPRequest +from .libadobe import get_devkey_path, get_device_path, get_activation_xml_path +from .libadobe import VAR_VER_SUPP_VERSIONS, VAR_VER_HOBBES_VERSIONS +from .libadobe import VAR_VER_BUILD_IDS, VAR_VER_USE_DIFFERENT_NOTIFICATION_XML_ORDER def buildFulfillRequest(acsm): diff --git a/src/setup/libpdf.py b/src/degourou/setup/libpdf.py similarity index 100% rename from src/setup/libpdf.py rename to src/degourou/setup/libpdf.py diff --git a/src/setup/loginAccount.py b/src/degourou/setup/loginAccount.py similarity index 87% rename from src/setup/loginAccount.py rename to src/degourou/setup/loginAccount.py index d1715c5..a9b35aa 100644 --- a/src/setup/loginAccount.py +++ b/src/degourou/setup/loginAccount.py @@ -5,14 +5,14 @@ This is an experimental Python version of libgourou. ''' -from setup.libadobe import createDeviceKeyFile, FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML -from setup.libadobeAccount import createDeviceFile, createUser, signIn, activateDevice, exportAccountEncryptionKeyDER, getAccountUUID +from .libadobe import createDeviceKeyFile, FILE_DEVICEKEY, FILE_DEVICEXML, FILE_ACTIVATIONXML +from .libadobeAccount import createDeviceFile, createUser, signIn, activateDevice, exportAccountEncryptionKeyDER, getAccountUUID from os.path import exists +from degourou.decrypt.params import KEYPATH VAR_MAIL = "" VAR_PASS = "" VAR_VER = 1 # None # 1 for ADE2.0.1, 2 for ADE3.0.1 -from decrypt.params import KEYPATH ################################################################# diff --git a/src/setup/params.py b/src/degourou/setup/params.py similarity index 100% rename from src/setup/params.py rename to src/degourou/setup/params.py diff --git a/uv.lock b/uv.lock index fb994b1..4b9b0a1 100644 --- a/uv.lock +++ b/uv.lock @@ -110,7 +110,7 @@ wheels = [ [[package]] name = "degourou" version = "0.1.0" -source = { virtual = "." } +source = { editable = "." } dependencies = [ { name = "cryptography" }, { name = "lxml" }, @@ -118,6 +118,12 @@ dependencies = [ { name = "requests" }, ] +[package.dev-dependencies] +dev = [ + { name = "degourou" }, + { name = "lxml-stubs" }, +] + [package.metadata] requires-dist = [ { name = "cryptography", specifier = "==41.0.1" }, @@ -126,6 +132,12 @@ requires-dist = [ { name = "requests", specifier = "==2.31.0" }, ] +[package.metadata.requires-dev] +dev = [ + { name = "degourou", editable = "." }, + { name = "lxml-stubs", specifier = ">=0.5.1" }, +] + [[package]] name = "idna" version = "3.10" @@ -197,6 +209,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/44/9613f300201b8700215856e5edd056d4e58dd23368699196b58877d4408b/lxml-6.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:2834377b0145a471a654d699bdb3a2155312de492142ef5a1d426af2c60a0a31", size = 3753901, upload-time = "2025-08-22T10:34:45.799Z" }, ] +[[package]] +name = "lxml-stubs" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/da/1a3a3e5d159b249fc2970d73437496b908de8e4716a089c69591b4ffa6fd/lxml-stubs-0.5.1.tar.gz", hash = "sha256:e0ec2aa1ce92d91278b719091ce4515c12adc1d564359dfaf81efa7d4feab79d", size = 14778, upload-time = "2024-01-10T09:37:46.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/c9/e0f8e4e6e8a69e5959b06499582dca6349db6769cc7fdfb8a02a7c75a9ae/lxml_stubs-0.5.1-py3-none-any.whl", hash = "sha256:1f689e5dbc4b9247cb09ae820c7d34daeb1fdbd1db06123814b856dae7787272", size = 13584, upload-time = "2024-01-10T09:37:44.931Z" }, +] + [[package]] name = "pycparser" version = "2.22"