diff --git a/.gitignore b/.gitignore index 40a2d17..61074db 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ config.yml **/tempCodeRunnerFile.py .vscode/ node_modules/ +Downloads/ # Created by https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,pycharm+all,virtualenv # Edit at https://www.toptal.com/developers/gitignore?templates=python,visualstudiocode,pycharm+all,virtualenv diff --git a/docs/README.md b/docs/README.md index 74f284d..6b08134 100644 --- a/docs/README.md +++ b/docs/README.md @@ -58,25 +58,28 @@ Python CLI tool download sách từ VNULIB --- -- [✨ VNULIB DOWNLOADER ✨](#-vnulib-downloader-) - - [🎆 CHỨC NĂNG](#-chức-năng) - - [🥂 DEMO](#-demo) - - [🪴 HƯỚNG DẪN SỬ DỤNG](#-hướng-dẫn-sử-dụng) - - [1️⃣ Tải tool](#1️⃣-tải-tool) - - [2️⃣ Sử dụng](#2️⃣-sử-dụng) - - [⚙️ NÂNG CAO](#️-nâng-cao) - - [🗃️ Pre-config](#️-pre-config) - - [⛏️ Command line arguments](#️-command-line-arguments) - - [📦 Docker](#-docker) - - [🤐 Python](#-python) - - [🤔 NOTES](#-notes) - - [Giải thích thuật ngữ](#giải-thích-thuật-ngữ) - - [👨‍💻 DEVELOP / CONTRIBUTE](#-develop--contribute) - - [📓 TODO](#-todo) - - [📝 LICENSE](#-license) - - [🤥 DISCLAIMER](#-disclaimer) - - [😌 CREDIT](#-credit) - - [⭐ STARGAZER](#-stargazer) + + +- [🎆 CHỨC NĂNG](#%F0%9F%8E%86-ch%E1%BB%A9c-nang) +- [🥂 DEMO](#%F0%9F%A5%82-demo) +- [🪴 HƯỚNG DẪN SỬ DỤNG](#%F0%9F%AA%B4-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-s%E1%BB%AD-d%E1%BB%A5ng) + - [1️⃣ Tải tool](#1%EF%B8%8F%E2%83%A3-t%E1%BA%A3i-tool) + - [2️⃣ Sử dụng](#2%EF%B8%8F%E2%83%A3-s%E1%BB%AD-d%E1%BB%A5ng) +- [⚙️ NÂNG CAO](#%E2%9A%99%EF%B8%8F-nang-cao) + - [🗃️ Pre-config](#%F0%9F%97%83%EF%B8%8F-pre-config) + - [⛏️ Command line arguments](#%E2%9B%8F%EF%B8%8F-command-line-arguments) + - [📦 Docker](#%F0%9F%93%A6-docker) + - [🤐 Python](#%F0%9F%A4%90-python) +- [🤔 NOTES](#%F0%9F%A4%94-notes) + - [Giải thích thuật ngữ](#gi%E1%BA%A3i-thich-thu%E1%BA%ADt-ng%E1%BB%AF) +- [👨‍💻 DEVELOP / CONTRIBUTE](#%F0%9F%91%A8%E2%80%8D%F0%9F%92%BB-develop--contribute) +- [📓 TODO](#%F0%9F%93%93-todo) +- [📝 LICENSE](#%F0%9F%93%9D-license) +- [🤥 DISCLAIMER](#%F0%9F%A4%A5-disclaimer) +- [😌 CREDIT](#%F0%9F%98%8C-credit) +- [⭐ STARGAZER](#%E2%AD%90-stargazer) + + --- @@ -138,16 +141,6 @@ Python CLI tool download sách từ VNULIB | `CREATE_PDF` | `y`, `n`, ... | `y` | Tạo file PDF từ các ảnh đã tải về | `y` | | `CLEAN_IMG` | `y`, `n`, ... | `y` | Xoá ảnh sau khi đã tạo PDF | `y` | -> [!WARNING] -> -> - Vì sử dụng Multithreading, nếu tải quá nhiều sách có thể ảnh hưởng đến server -> - Thi thoảng `[browser] driver` không tự tắt dẫn đến ngốn RAM và CPU. Hãy check và tắt _(Task Manager, pkill,...)_ - -> [!IMPORTANT] -> -> - Nếu trong tương lai việc sử dụng link `book` hay `preview` không được, hãy thử link `page` _(vì các phần tử trang web -> có thể thay đổi)_ - > [!NOTE] > > - Ảnh và sách sẽ được tải về `./Downloads/` @@ -161,6 +154,13 @@ Python CLI tool download sách từ VNULIB > - `page` link: Trong link có query `&page=`: > - `1`: Tool sẽ tự động check và tải trang sách đến khi đạt giới hạn _(Single thread)_ > - \> `1`: Tool tự nhận đấy là limit của file sách hoặc chủ đích sử dụng _(Multithreading)_ +> - Nếu trong tương lai việc sử dụng link `book` hay `preview` không được, hãy thử link `page` _(vì các phần tử trang web +> có thể thay đổi)_ + +> [!WARNING] +> +> - Vì sử dụng Multithreading, nếu tải quá nhiều sách có thể ảnh hưởng đến server +> - Thi thoảng `[browser] driver` không tự tắt dẫn đến ngốn RAM và CPU. Hãy check và tắt _(Task Manager, pkill,...)_ --- @@ -202,8 +202,13 @@ Python CLI tool download sách từ VNULIB ``` - Ví dụ _(Windows)_: ```.ps1 - .\VNULIB-Downloader-windows.exe --link "link1" "link2" --username "1500023520000" --password "examplePass" --browser "./chrome_driver.exe" --headless --create-pdf --clean-imgs + .\VNULIB-Downloader-windows.exe --link "link1" "link2" --username="1500023520000" --password "examplePass\!" --browser="" --headless --create-pdf --clean-img --timeout="20" ``` + > Đảm bảo các arguments như trên sẽ không yêu cầu nhập từ stdin + +> [!NOTE] +> +> Vui lòng để ý nếu mật khẩu chứa ký tự đặc biệt cần escape _(`\`, `\``, `^` tùy shell)_ hoặc hãy sử dụng [🗃️ Pre-config](#%F0%9F%97%83%EF%B8%8F-pre-config) ### 📦 Docker @@ -231,7 +236,6 @@ Python CLI tool download sách từ VNULIB git clone "https://github.com/KevinNitroG/VNULIB-Downloader" --depth 1 --filter=blob:none ``` 3. Create virtual environment _(optional)_ - - Create virtual environment ```.ps1 python -m venv .venv @@ -245,22 +249,18 @@ Python CLI tool download sách từ VNULIB ```.sh source .venv/bin/activate ``` - - Deactive virtual environment - ```.sh - deactivate - ``` - 4. Install requirements - ```ps1 pip install -r requirements/requirements.txt ``` - 5. Run tool - ```ps1 python main.py ``` +6. Deactive virtual environment _(optional)_ + ```.sh + deactivate + ``` > [!NOTE] > diff --git a/main.py b/main.py index f008fee..e525b73 100644 --- a/main.py +++ b/main.py @@ -6,12 +6,11 @@ from multiprocessing import freeze_support from pprint import pformat -from urllib3 import PoolManager from urllib3 import disable_warnings as urllib3_disable_warnings from urllib3.exceptions import InsecureRequestWarning from src import Action, Browser, CleanIMG, Config, CreatePDF, DownloadIMG, LinkParse, Login, PrintIntro, ToolLogger, UserOptions, create_directory, delete_old_meipass, pause, print_title -from src.constants import DOWNLOAD_DIR, NUMBER_OF_THREADS +from src.constants import DOWNLOAD_DIR def main() -> None: @@ -62,5 +61,4 @@ def main() -> None: if __name__ == "__main__": freeze_support() # For pyinstaller to fix multiprocessing in Windows due to freeze scheme urllib3_disable_warnings(InsecureRequestWarning) - PoolManager(num_pools=NUMBER_OF_THREADS) main() diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 040125b..0f8745b 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -5,6 +5,6 @@ img2pdf==0.5.1 print-color==0.4.6 pyyaml==6.0.1 requests==2.32.3 -selenium==4.21.0 -urllib3==2.2.1 +selenium==4.22.0 +urllib3==2.2.2 webdriver-manager==4.0.1 diff --git a/src/constants.py b/src/constants.py index bde89ef..1382096 100644 --- a/src/constants.py +++ b/src/constants.py @@ -26,7 +26,7 @@ def _get_number_of_thread(max_number_of_threads: int) -> int: return number_of_thread if number_of_thread * 5 < max_number_of_threads else max_number_of_threads -VERSION: str = "v1.17.4" +VERSION: str = "v1.17.5" AUTHORS: str = "KevinNitroG & NTGNguyen" BANNER_FILE: str = f"{BUNDLE_DIR}assets/utils/ascii_banner.txt" with open(BANNER_FILE, encoding="utf-8") as banner_content: diff --git a/src/modules/__init__.py b/src/modules/__init__.py index 8ebc79e..3a5570e 100644 --- a/src/modules/__init__.py +++ b/src/modules/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations -from .argpase import setup_argparse +from .argparse import setup_argparse from .clean_img import CleanIMG from .config import Config from .create_pdf import CreatePDF diff --git a/src/modules/argpase.py b/src/modules/argparse.py similarity index 100% rename from src/modules/argpase.py rename to src/modules/argparse.py diff --git a/src/modules/user_options.py b/src/modules/user_options.py index 6675b7b..e3e4ea4 100644 --- a/src/modules/user_options.py +++ b/src/modules/user_options.py @@ -12,7 +12,7 @@ from yaml import safe_load from ..constants import CONFIG_FILE, USER_INPUT_NO, USER_INPUT_YES -from .argpase import setup_argparse +from .argparse import setup_argparse logger = getLogger(__name__) @@ -155,7 +155,7 @@ def _setup_timeout(self) -> int: """ if self.argparse.timeout is not None: self._log_set_by_argparse("timeout") - return int(self.argparse.browser) + return int(self.argparse.timeout) if self._config["TIMEOUT"] is not None: self._log_set_by_config("timeout") return int(self._config["TIMEOUT"]) @@ -175,7 +175,7 @@ def _setup_browser(self) -> str: self._log_set_by_config("browser") return self._config["BROWSER"].lower() self._log_set_by_user_input("browser") - return input('Enter browser you are using ["CHROME", "CHROMIUM", "path/to/chrome_driver"]: ').strip().lower() + return input('Enter browser you are using ["chrome", "chromium", "path/to/chrome_driver"]: ').strip().lower() def _setup_headless(self) -> bool: """Setup headless mode. diff --git a/src/utils/logger.py b/src/utils/logger.py index a3f127a..54d488f 100644 --- a/src/utils/logger.py +++ b/src/utils/logger.py @@ -2,7 +2,7 @@ from __future__ import annotations -from logging import DEBUG, WARNING, Logger, getLogger +from logging import DEBUG, ERROR, WARNING, Logger, getLogger from logging.config import dictConfig from logging.handlers import QueueHandler from multiprocessing import Queue @@ -49,7 +49,7 @@ def _setup_other_logger() -> None: getLogger("PIL.PngImagePlugin").setLevel(WARNING) getLogger("PIL.Image").setLevel(WARNING) getLogger("charset_normalizer").setLevel(WARNING) - getLogger("urllib3.connectionpool").setLevel(WARNING) + getLogger("urllib3.connectionpool").setLevel(ERROR) getLogger("selenium.webdriver.remote.remote_connection").disabled = True os_environ["WDM_LOG"] = str(DEBUG) os_environ["WDM_SSL_VERIFY"] = "0"