From a28b957a8240f26aec69eb51729dc10d926a761e Mon Sep 17 00:00:00 2001 From: k-aito <77667659+k-aito@users.noreply.github.com> Date: Sun, 3 Dec 2023 16:18:00 +0100 Subject: [PATCH] Add support for pydeeplx with random wait and proxy until 10 retry hardcoded Signed-off-by: k-aito <77667659+k-aito@users.noreply.github.com> --- README.md | 3 +- requirements.txt | 1 + srtranslator/__main__.py | 4 ++- srtranslator/translators/pydeeplx.py | 52 ++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 srtranslator/translators/pydeeplx.py diff --git a/README.md b/README.md index cac418f..7dcb567 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,13 @@ from srtranslator import SrtFile from srtranslator.translators.deepl_api import DeeplApi from srtranslator.translators.deepl_scrap import DeeplTranslator from srtranslator.translators.translatepy import TranslatePy +from srtranslator.translators.pydeeplx import DeepLX ``` Initialize translator. It can be any translator, even your own, check the docs, there are instructions per translator and how to create your own. ```python -translator = DeeplTranslator() # or TranslatePy() or DeeplApi(api_key) +translator = DeeplTranslator() # or TranslatePy() or DeeplApi(api_key) or DeepLX() ``` Load, translate and save. For multiple recursive files in folder, check `examples folder` diff --git a/requirements.txt b/requirements.txt index 8dd7dad..1ef7abe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,6 +17,7 @@ jinxed==1.2.0 lxml==4.9.3 outcome==1.2.0 pycparser==2.21 +PyDeepLX==1.0.4 PySocks==1.7.1 python-editor==1.0.4 pyuseragents==1.0.5 diff --git a/srtranslator/__main__.py b/srtranslator/__main__.py index 7998aa6..931b00e 100644 --- a/srtranslator/__main__.py +++ b/srtranslator/__main__.py @@ -7,6 +7,7 @@ from .translators.deepl_api import DeeplApi from .translators.deepl_scrap import DeeplTranslator from .translators.translatepy import TranslatePy +from .translators.pydeeplx import DeepLX parser = argparse.ArgumentParser(description="Translate an .STR file") @@ -71,7 +72,7 @@ "-t", "--translator", type=str, - choices=["deepl-scrap", "translatepy", "deepl-api"], + choices=["deepl-scrap", "translatepy", "deepl-api", "deeplx"], help="Built-in translator to use", default="deepl-scrap", ) @@ -86,6 +87,7 @@ "deepl-scrap": DeeplTranslator, "deepl-api": DeeplApi, "translatepy": TranslatePy, + "deeplx": DeepLX, } args = parser.parse_args() diff --git a/srtranslator/translators/pydeeplx.py b/srtranslator/translators/pydeeplx.py new file mode 100644 index 0000000..cf3bcba --- /dev/null +++ b/srtranslator/translators/pydeeplx.py @@ -0,0 +1,52 @@ +from PyDeepLX import PyDeepLX +from random import randint +from time import sleep + +from .base import Translator as BaseTranslator +from fp.fp import FreeProxy +from .selenium_utils import ( + create_proxy, +) + + +class DeepLX(BaseTranslator): + max_char = 1500 + + def __init__(self): + self.proxies = None + + def translate(self, text, source_language, destination_language): + # Sleep a random number of seconds (between 3 and 5) + # https://www.shellhacks.com/python-sleep-random-time-web-scraping/ + RANDOM_WAIT = randint(3,5) + print(f"...... Wait randomly {RANDOM_WAIT}s") + sleep(RANDOM_WAIT) + + # Max retry 3 + RETRY_COUNTER = 10 + result = None + while RETRY_COUNTER > 0 : + try: + result = PyDeepLX.translate( + text, + source_language, + destination_language, + proxies=self.proxies + ) + + if result == None: + print("...... Exception: result is empty raise exception") + raise Exception("Result is empty") + + # Everyting alright + break + except Exception as e: + print(f"...... Exception {e} with retry number {RETRY_COUNTER}") + + # Get a random proxy + print("...... Use or change proxy") + self.proxies = FreeProxy(rand=True, timeout=1).get() + + # Decrease RETRY_COUNTER + RETRY_COUNTER -= 1 + return result