From aa5324ad2d561d5a1a221a2ea59c05ca40530d52 Mon Sep 17 00:00:00 2001 From: projectdx Date: Mon, 29 Dec 2025 00:37:09 +0900 Subject: [PATCH] refactor: Ensure Camoufox setup runs only once per session and refine its installation logic. --- mod_anilife.py | 49 +++++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/mod_anilife.py b/mod_anilife.py index ac25bd4..eced6ec 100644 --- a/mod_anilife.py +++ b/mod_anilife.py @@ -1232,9 +1232,15 @@ class AniLifeQueueEntity(FfmpegQueueEntity): provider_html = None aldata_value = None - # Camoufox 설치 확인 및 자동 설치 + # Camoufox 설치 확인 및 자동 설치 (플러그인 세션 내 1회만 실행) + if not hasattr(LogicAniLife, 'camoufox_setup_done'): + LogicAniLife.camoufox_setup_done = False + def ensure_camoufox_installed(): """Camoufox 및 필수 시스템 패키지(xvfb) 설치 확인 및 자동 설치""" + if LogicAniLife.camoufox_setup_done: + return True + import importlib.util import subprocess as sp import shutil @@ -1243,51 +1249,38 @@ class AniLifeQueueEntity(FfmpegQueueEntity): if platform.system() == 'Linux' and shutil.which('Xvfb') is None: logger.info("Xvfb not found. Attempting to install system package...") try: - # apt-get을 사용하는 데비안/우분투 계열 가정 (Docker 환경) - # sudo 없이 시도 (Docker는 보통 root 권한) sp.run(['apt-get', 'update', '-qq'], capture_output=True) sp.run(['apt-get', 'install', '-y', 'xvfb', '-qq'], capture_output=True) - if shutil.which('Xvfb') is not None: - logger.info("Xvfb system package installed successfully") except Exception as e: logger.error(f"Failed to install xvfb system package: {e}") - # 2. Camoufox 패키지 확인 및 업그레이드 - # 'xvfb' 인자는 최신 버전에서 지원되므로 존재하더라도 업그레이드 시도 + # 2. Camoufox 패키지 확인 및 설치 + # 이미 설치되어 있다면 무거운 --upgrade 체크는 건너뜀 need_install = importlib.util.find_spec("camoufox") is None - if need_install: - logger.info("Camoufox not installed. Installing latest version...") - else: - # 이미 설치되어 있어도 최신 버전으로 업그레이드 (xvfb 지원을 위해) - logger.info("Checking for Camoufox updates to ensure Xvfb support...") - try: - # pip 멤버로 설치/업그레이드 (camoufox[geoip] 포함) - cmd = [sys.executable, "-m", "pip", "install", "--upgrade", "camoufox[geoip]", "-q"] - pip_result = sp.run(cmd, capture_output=True, text=True, timeout=120) + if need_install: + logger.info("Camoufox not installed. Installing latest version...") + cmd = [sys.executable, "-m", "pip", "install", "camoufox[geoip]", "-q"] + sp.run(cmd, capture_output=True, text=True, timeout=120) - if pip_result.returncode != 0: - logger.error(f"Failed to install/upgrade camoufox: {pip_result.stderr}") - if need_install: return False # 새로 설치 중이었으면 중단 - else: - logger.info("Camoufox package installed/upgraded successfully") - - # Camoufox 브라우저 바이너리 다운로드 - logger.info("Downloading Camoufox browser binary...") + # 브라우저 바이너리 존재 여부 확인 (기본 경로 추정) + # 실제로는 camoufox fetch를 매번 부르기보다 라이브러리가 알아서 확인하게 두거나 1회만 실행 + logger.info("Ensuring Camoufox browser binary is fetched...") sp.run([sys.executable, "-m", "camoufox", "fetch"], capture_output=True, text=True, timeout=300) + LogicAniLife.camoufox_setup_done = True return True except Exception as install_err: logger.error(f"Failed during Camoufox setup: {install_err}") - return not need_install # 이미 설치되어 있었으면 에러나도 일단 진행 시도 - - # Camoufox를 subprocess로 실행 (스텔스 Firefox - 봇 감지 우회) + return not need_install + + # Camoufox를 subprocess로 실행 try: import subprocess import json as json_module - # Camoufox 설치 확인 + # 셋업 실행 (세션 내 1회만 실제 동작) if not ensure_camoufox_installed(): logger.error("Camoufox installation failed. Cannot proceed.") return