Feat: Add Botasaurus @request fetching layer and automatic dependency installation
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
title: "애니 다운로더"
|
title: "애니 다운로더"
|
||||||
version: "0.6.6"
|
version: "0.6.7"
|
||||||
package_name: "anime_downloader"
|
package_name: "anime_downloader"
|
||||||
developer: "projectdx"
|
developer: "projectdx"
|
||||||
description: "anime downloader"
|
description: "anime downloader"
|
||||||
|
|||||||
@@ -155,12 +155,45 @@ class LogicOhli24(AnimeModuleBase):
|
|||||||
return token_data.get("path")
|
return token_data.get("path")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def ensure_essential_dependencies(cls) -> bool:
|
||||||
|
"""필수 패키지(jsbeautifier, loguru, botasaurus) 확인 및 자동 설치"""
|
||||||
|
target_packages = ["jsbeautifier", "loguru", "botasaurus"]
|
||||||
|
need_install = []
|
||||||
|
|
||||||
|
import importlib.util
|
||||||
|
for pkg in target_packages:
|
||||||
|
if importlib.util.find_spec(pkg) is None:
|
||||||
|
need_install.append(pkg)
|
||||||
|
|
||||||
|
if not need_install:
|
||||||
|
return True
|
||||||
|
|
||||||
|
import subprocess as sp
|
||||||
|
try:
|
||||||
|
logger.info(f"[Dependencies] Missing: {need_install}, installing via pip...")
|
||||||
|
cmd = [sys.executable, "-m", "pip", "install"] + need_install + ["-q"]
|
||||||
|
result = sp.run(cmd, capture_output=True, text=True, timeout=180)
|
||||||
|
|
||||||
|
if result.returncode == 0:
|
||||||
|
logger.info(f"[Dependencies] Successfully installed: {need_install}")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
logger.warning(f"[Dependencies] Installation failed: {result.stderr[:200]}")
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"[Dependencies] Installation error: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def ensure_zendriver_installed(cls) -> bool:
|
def ensure_zendriver_installed(cls) -> bool:
|
||||||
"""Zendriver 패키지 확인 및 자동 설치"""
|
"""Zendriver 패키지 확인 및 자동 설치"""
|
||||||
if cls.zendriver_setup_done:
|
if cls.zendriver_setup_done:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
# 필수 패키지 먼저 확인
|
||||||
|
cls.ensure_essential_dependencies()
|
||||||
|
|
||||||
import importlib.util
|
import importlib.util
|
||||||
import subprocess as sp
|
import subprocess as sp
|
||||||
|
|
||||||
@@ -1770,6 +1803,8 @@ class LogicOhli24(AnimeModuleBase):
|
|||||||
# @staticmethod
|
# @staticmethod
|
||||||
def plugin_load(self) -> None:
|
def plugin_load(self) -> None:
|
||||||
try:
|
try:
|
||||||
|
# 필수 패키지 확인 및 설치
|
||||||
|
LogicOhli24.ensure_essential_dependencies()
|
||||||
# SupportFfmpeg.initialize(ffmpeg_modelsetting.get('ffmpeg_path'), os.path.join(F.config['path_data'], 'tmp'),
|
# SupportFfmpeg.initialize(ffmpeg_modelsetting.get('ffmpeg_path'), os.path.join(F.config['path_data'], 'tmp'),
|
||||||
# self.callback_function, ffmpeg_modelsetting.get_int('max_pf_count'))
|
# self.callback_function, ffmpeg_modelsetting.get_int('max_pf_count'))
|
||||||
|
|
||||||
@@ -1912,7 +1947,27 @@ class LogicOhli24(AnimeModuleBase):
|
|||||||
headers["Referer"] = "https://ani.ohli24.com"
|
headers["Referer"] = "https://ani.ohli24.com"
|
||||||
|
|
||||||
|
|
||||||
# === [TEST MODE] Layer 1, 2 일시 비활성화 - Layer 3, 4만 테스트 ===
|
# === [Layer 1: Botasaurus @request (빠름 - HTTP Request)] ===
|
||||||
|
if not response_data or len(response_data) < 10:
|
||||||
|
if cls.ensure_essential_dependencies():
|
||||||
|
try:
|
||||||
|
logger.debug(f"[Layer1] Trying Botasaurus @request: {url}")
|
||||||
|
from botasaurus.request import request as b_request
|
||||||
|
|
||||||
|
@b_request(headers=headers, use_stealth=True, proxy=LogicOhli24.get_proxy())
|
||||||
|
def fetch_url(request, data):
|
||||||
|
return request.get(data)
|
||||||
|
|
||||||
|
b_resp = fetch_url(url)
|
||||||
|
if b_resp and len(b_resp) > 10:
|
||||||
|
logger.info(f"[Layer1] Botasaurus success, HTML len: {len(b_resp)}")
|
||||||
|
return b_resp
|
||||||
|
else:
|
||||||
|
logger.warning(f"[Layer1] Botasaurus short response: {len(b_resp) if b_resp else 0}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"[Layer1] Botasaurus failed: {e}")
|
||||||
|
|
||||||
|
# === [TEST MODE] Layer 1 (기존 것들) 일시 비활성화 - Layer 3, 4만 테스트 ===
|
||||||
response_data = "" # 바로 Layer 3로 이동
|
response_data = "" # 바로 Layer 3로 이동
|
||||||
|
|
||||||
# max_retries = 3
|
# max_retries = 3
|
||||||
|
|||||||
Reference in New Issue
Block a user