From 672c5a3e4f3c34b9a5abfd3b8e5180d5cb6c310f Mon Sep 17 00:00:00 2001 From: 9700X_PC <9700X_PC@gmail.com> Date: Mon, 25 Aug 2025 16:56:27 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B2=84=EC=A0=84=203.11.4=EB=A1=9C=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=ED=95=98=EB=A9=B0,=20?= =?UTF-8?q?=EB=A9=94=EB=AA=A8=EB=A6=AC=20=EC=83=81=ED=99=A9=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EB=8F=99=EC=A0=81=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EA=B3=A0,=20GPT5=20=EC=9D=91=EB=8B=B5=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=EA=B0=9C=EC=84=A0?= =?UTF-8?q?=ED=95=98=EC=98=80=EC=8A=B5=EB=8B=88=EB=8B=A4.=20DLL=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=20=EB=AC=B8=EC=A0=9C=EB=A5=BC=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=ED=95=98=EC=98=80=EC=9C=BC=EB=A9=B0,=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=A1=9C=EA=B7=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=ED=95=98=EC=97=AC=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=9D=84=20=EB=B0=98=EC=98=81=ED=95=98?= =?UTF-8?q?=EC=98=80=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AutoPercenty_20250823_090708.iss | 328 ++++++++++++++++++ browser_control.py | 66 +++- mainUI_SP.py | 4 +- setup.py | 21 +- src/contents/option.py | 96 ++--- src/modules/8.jpg | Bin 120817 -> 0 bytes src/modules/gpu_utils.py | 276 +++++++++++++++ src/modules/image_processor3.py | 29 +- src/modules/ocr_module.py | 44 ++- src/modules/pil.py | 7 - src/titleManager/gpt_client.py | 38 +- ...ta_909d2ef8-7053-4006-ab40-49eb49f20383.db | Bin 3321856 -> 3678208 bytes updateManager/__version__.py | 2 +- updateManager/updateLog.md | 16 +- 14 files changed, 847 insertions(+), 80 deletions(-) create mode 100644 AutoPercenty_20250823_090708.iss delete mode 100644 src/modules/8.jpg create mode 100644 src/modules/gpu_utils.py delete mode 100644 src/modules/pil.py diff --git a/AutoPercenty_20250823_090708.iss b/AutoPercenty_20250823_090708.iss new file mode 100644 index 00000000..fc809a45 --- /dev/null +++ b/AutoPercenty_20250823_090708.iss @@ -0,0 +1,328 @@ +; AutoPercenty3 Inno Setup Script +; 이 스크립트는 cx_Freeze로 빌드된 결과물이 있는 "build\exe.win-amd64-3.11" 폴더를 기반으로 인스톨러를 제작합니다. +; 20250823_090708에 생성됨 + +#define AppId "autopercenty" +#define MyAppName "Edit_PartTimer" +#define MyAppVersion "3.11.3" +#define MyAppPublisher "WhenRideMyCar" +#define MyAppProgramName "편집알바생" +#define MyAppDescription "편집알바생" +#define MyAppCopyright "Copyright 2024" +#define MyAppExeName "Edit_PartTimer3" +#define MySetupName "Edit_PartTimer Setup" +#define MySetupIcon "src/Edit_PartTimer3.ico" +#define MySetupOutputDir "dist/installer" + +[Setup] +; 기본 설정 +AppId={#AppId} +AppName={#MyAppProgramName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +DefaultDirName={autopf}\{#MyAppName} +DefaultGroupName={#MyAppPublisher} +OutputDir={#MySetupOutputDir} +OutputBaseFilename={#MySetupName} +SetupIconFile={#MySetupIcon} +Compression=lzma +SolidCompression=yes + +; 업데이트 관련 설정 - 권한 최적화 +PrivilegesRequired=admin +PrivilegesRequiredOverridesAllowed=dialog +UpdateUninstallLogAppName=yes +AppMutex={#MyAppName} +CloseApplications=yes +RestartApplications=no + +; 보안 및 호환성 설정 +ArchitecturesAllowed=x64 +ArchitecturesInstallIn64BitMode=x64 +AllowNoIcons=yes + +; 버전 정보 +VersionInfoVersion={#MyAppVersion} +VersionInfoCompany={#MyAppPublisher} +VersionInfoDescription={#MyAppDescription} +VersionInfoCopyright={#MyAppCopyright} +VersionInfoProductName={#MyAppProgramName} +VersionInfoProductVersion={#MyAppVersion} + +[Languages] +Name: "korean"; MessagesFile: "compiler:Languages\Korean.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}" + +[Dirs] +; 설치 시 {app}\logs 폴더를 생성하고, +; Users 그룹에 'modify' 권한(=쓰기 가능)을 부여 +Name: "{app}\logs"; Permissions: users-modify +; 설치 시 {app}\user_data 폴더를 생성하고, +; Users 그룹에 'modify' 권한(=쓰기 가능)을 부여 +Name: "{app}\user_data"; Permissions: users-modify +; Playwright 브라우저 폴더를 Program Files 내부에 생성 +Name: "{app}\lib\src\browsers\chromium-1155"; Permissions: users-modify +; Playwright 브라우저 사용자폴더를 Program Files 내부에 생성 +Name: "{app}\lib\src\browsers\user_data"; Permissions: users-modify + +[Files] +; 프로그램 파일만 설치 (항상 덮어쓰기) +Source: "build\exe.win-amd64-3.11\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +; VC++ 재배포 패키지 파일을 임시 폴더({tmp})에 복사 +Source: "VC_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall + +[Registry] +; Playwright 브라우저 경로를 Program Files 내부로 설정 +Root: HKCU; Subkey: "Environment"; ValueType: expandsz; ValueName: "PLAYWRIGHT_BROWSERS_PATH"; ValueData: "{app}\lib\src\browsers"; Flags: preservestringtype + +[Icons] +; 시작 메뉴 바로가기 +Name: "{group}\{#MyAppProgramName}"; Filename: "{app}\{#MyAppExeName}.exe" +; 바탕화면 바로가기 +Name: "{autodesktop}\{#MyAppProgramName}"; Filename: "{app}\{#MyAppExeName}.exe"; Tasks: desktopicon +; 프로그램 제거 바로가기 +Name: "{group}\{#MyAppProgramName} 제거"; Filename: "{uninstallexe}" + +[Run] +; VC++ 재배포 패키지 설치 (필요할 경우) +Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/install /passive /norestart"; StatusMsg: "VC++ 재배포 패키지 설치 중..."; Check: NeedsVCredist +; 설치 후 프로그램 실행 (원할 경우) +Filename: "{app}\{#MyAppExeName}.exe"; Description: "{cm:LaunchProgram,{#MyAppProgramName}}"; Flags: nowait postinstall skipifsilent + +[Code] +function CompareVersion(V1, V2: string): Integer; +var + P1, P2, N1, N2: Integer; +begin + P1 := 1; + P2 := 1; + Result := 0; + while (Result = 0) and ((P1 <= Length(V1)) or (P2 <= Length(V2))) do begin + while (P1 <= Length(V1)) and (V1[P1] = '.') do Inc(P1); + while (P2 <= Length(V2)) and (V2[P2] = '.') do Inc(P2); + if (P1 <= Length(V1)) and (P2 <= Length(V2)) then begin + N1 := 0; while (P1 <= Length(V1)) and (V1[P1] >= '0') and (V1[P1] <= '9') do begin N1 := N1 * 10 + Ord(V1[P1]) - Ord('0'); Inc(P1); end; + N2 := 0; while (P2 <= Length(V2)) and (V2[P2] >= '0') and (V2[P2] <= '9') do begin N2 := N2 * 10 + Ord(V2[P2]) - Ord('0'); Inc(P2); end; + if N1 < N2 then Result := -1 else if N1 > N2 then Result := 1; + end else begin + if P1 <= Length(V1) then Result := 1 else if P2 <= Length(V2) then Result := -1; + end; + while (P1 <= Length(V1)) and (V1[P1] <> '.') do Inc(P1); + while (P2 <= Length(V2)) and (V2[P2] <> '.') do Inc(P2); + end; +end; + +// 파일 또는 폴더 복사 함수 +procedure CopyDir(const SourcePath, DestPath: string); +var + FindRec: TFindRec; + SourceFilePath: string; + DestFilePath: string; +begin + ForceDirectories(DestPath); + + if FindFirst(SourcePath + '\*', FindRec) then + begin + try + repeat + if (FindRec.Name <> '.') and (FindRec.Name <> '..') then + begin + SourceFilePath := SourcePath + '\' + FindRec.Name; + DestFilePath := DestPath + '\' + FindRec.Name; + + if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then + begin + if FileCopy(SourceFilePath, DestFilePath, False) then + Log('파일 복사 성공: ' + SourceFilePath + ' -> ' + DestFilePath) + else + Log('파일 복사 실패: ' + SourceFilePath); + end + else + CopyDir(SourceFilePath, DestFilePath); + end; + until not FindNext(FindRec); + finally + FindClose(FindRec); + end; + end; +end; + +// 디렉토리 삭제 함수 +procedure DeleteDir(const DirPath: string); +var + FindRec: TFindRec; + FilePath: string; +begin + if not DirExists(DirPath) then Exit; + + if FindFirst(DirPath + '\*', FindRec) then + begin + try + repeat + if (FindRec.Name <> '.') and (FindRec.Name <> '..') then + begin + FilePath := DirPath + '\' + FindRec.Name; + + if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then + begin + if DeleteFile(FilePath) then + Log('파일 삭제 성공: ' + FilePath) + else + Log('파일 삭제 실패: ' + FilePath); + end + else + DeleteDir(FilePath); + end; + until not FindNext(FindRec); + finally + FindClose(FindRec); + end; + end; + + if RemoveDir(DirPath) then + Log('디렉토리 삭제 성공: ' + DirPath) + else + Log('디렉토리 삭제 실패: ' + DirPath); +end; + +// 프로그램 실행 여부 확인 +function IsAppRunning(const FileName: string): Boolean; +var + Handle: THandle; +begin + Handle := FindWindowByWindowName('{#MyAppProgramName}'); // 프로그램의 윈도우 타이틀로 찾기 + Result := (Handle <> 0); +end; + +// 프로그램 종료 +procedure CloseApplication(const FileName: string); +var + Handle: THandle; +begin + Handle := FindWindowByWindowName('{#MyAppProgramName}'); + if Handle <> 0 then + begin + PostMessage(Handle, 18, 0, 0); // WM_QUIT + Sleep(1000); // 종료 대기 + end; +end; + +// VC++ 재배포 패키지 필요 여부 확인 +function NeedsVCredist: Boolean; +begin + if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64') then + Result := False // 이미 설치됨 + else + Result := True; // 미설치 -> 설치 필요 +end; + +// 설치 완료 후 실행 여부 확인 +function InitializeFinish(): Boolean; +var + ResultCode: Integer; +begin + Result := True; + if MsgBox('설치가 완료되었습니다. 프로그램을 실행하시겠습니까?' + #13#10 + + '(실행 시 서버와 동기화하여 설정이 업데이트됩니다)', + mbConfirmation, MB_YESNO) = IDYES then + begin + Exec(ExpandConstant('{app}\{#MyAppExeName}.exe'), '', '', SW_SHOW, ewNoWait, ResultCode); + end; +end; + +function InitializeSetup(): Boolean; +var + OldVersion: String; + NewVersion: String; + OldAppPath: String; + UserDataSourcePath, UserDataBackupPath: String; + ResultCode: Integer; +begin + Result := True; + NewVersion := '{#MyAppVersion}'; + UserDataBackupPath := ExpandConstant('{tmp}\user_data_backup'); + + // 현재 프로그램 버전 확인 + if RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}_is1', + 'DisplayVersion', OldVersion) then + begin + // 같은 버전이거나 더 높은 버전이 설치되어 있는 경우 + if CompareVersion(OldVersion, NewVersion) >= 0 then + begin + MsgBox('현재 설치된 버전(' + OldVersion + ')이 이 설치 프로그램의 버전(' + + NewVersion + ')과 같거나 더 높습니다.' + #13#10 + + '설치를 계속할 수 없습니다.', mbInformation, MB_OK); + Result := False; + exit; + end; + + // 이전 버전이 설치되어 있는 경우 업데이트 진행 + if CompareVersion(OldVersion, NewVersion) < 0 then + begin + Log('업데이트 설치 진행: ' + OldVersion + ' -> ' + NewVersion); + + // 프로그램이 실행 중인지 확인하고 종료 요청 + if IsAppRunning('{#MyAppExeName}.exe') then + begin + if MsgBox('프로그램을 업데이트하기 위해 실행 중인 프로그램을 종료해야 합니다.' + #13#10 + + '계속하시겠습니까?', mbConfirmation, MB_YESNO) = IDNO then + begin + Result := False; + exit; + end; + CloseApplication('{#MyAppExeName}.exe'); + Sleep(2000); // 프로세스 종료 대기 + end; + + // 레지스트리에서 설치 경로 확인 + if RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}_is1', + 'InstallLocation', OldAppPath) then + begin + Log('기존 설치 경로: ' + OldAppPath); + + // lib/src/user_data 폴더 백업 + UserDataSourcePath := OldAppPath + '\lib\src\user_data'; + if DirExists(UserDataSourcePath) then + begin + Log('사용자 데이터 백업 중: ' + UserDataSourcePath + ' -> ' + UserDataBackupPath); + ForceDirectories(UserDataBackupPath); + CopyDir(UserDataSourcePath, UserDataBackupPath); + end + else + begin + Log('사용자 데이터 폴더가 존재하지 않음: ' + UserDataSourcePath); + end; + + // 기존 설치 폴더 완전 삭제 + if DirExists(OldAppPath) then + begin + Log('기존 설치 폴더 삭제 중: ' + OldAppPath); + DeleteDir(OldAppPath); + end; + end; + end; + end; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +var + UserDataBackupPath, UserDataDestPath: String; +begin + // 설치 완료 후 + if CurStep = ssPostInstall then + begin + UserDataBackupPath := ExpandConstant('{tmp}\user_data_backup'); + UserDataDestPath := ExpandConstant('{app}\lib\src\user_data'); + + // 백업한 사용자 데이터 폴더가 있으면 복원 + if DirExists(UserDataBackupPath) then + begin + Log('사용자 데이터 복원 중: ' + UserDataBackupPath + ' -> ' + UserDataDestPath); + ForceDirectories(UserDataDestPath); + CopyDir(UserDataBackupPath, UserDataDestPath); + Log('사용자 데이터 복원 완료'); + end; + end; +end; diff --git a/browser_control.py b/browser_control.py index cf7f9190..a787c211 100644 --- a/browser_control.py +++ b/browser_control.py @@ -4083,6 +4083,13 @@ class ImageWorkerManager: self.restart_count = 0 self.max_restart = 5 self.image_worker_fatal = image_worker_fatal + # 정책 로드(토글 기반) + self._success_count = 0 + self._consecutive_mem_errors = 0 + self._periodic_restart_every = 0 + self._mem_restart_threshold = 0 + self._mem_error_escalate_after = 2 + self._load_worker_policies() # ─── 프로세스/큐 생성 ─────────────────────────────────── self.task_q = Queue() self.result_q = Queue() @@ -4143,6 +4150,30 @@ class ImageWorkerManager: timeout = 120 if self.first_call else 60 result = await self._call_worker("process_single_image", timeout=timeout, **kwargs) self.first_call = False + # 성공 시 연속 메모리 오류 카운터 초기화 + try: + self._consecutive_mem_errors = 0 + except Exception: + pass + + # 메모리 임계치 기반 재시작 + try: + if self._mem_restart_threshold and self._mem_restart_threshold > 0: + vm = psutil.virtual_memory() + if vm.percent >= self._mem_restart_threshold: + self.logger.log(f"메모리 임계치 초과({vm.percent}% >= {self._mem_restart_threshold}%) → 워커 재시작", level=logging.WARNING) + self.restart(cause="error") + except Exception: + pass + + # 주기적 재시작 트리거: 성공으로 간주되는 경우에만 카운트 + try: + if self._periodic_restart_every and isinstance(result, dict) and result.get("status") in {"translated", "original", "exclude", "success"}: + self._success_count += 1 + if self._success_count % self._periodic_restart_every == 0: + self.restart(cause="periodic") + except Exception: + pass return result async def safe_process_single_image(self, **kwargs): @@ -4197,8 +4228,22 @@ class ImageWorkerManager: self.restart(cause="error") raise # 상위에서 필요하다면 재시도 로직을 추가 except Exception as e: # ← RuntimeError 포함 - self.logger.log(f"워커 내부 오류 → 재시작: {e}", level=logging.WARNING) - self.restart(cause="error") + # primitive/메모리 오류 에스컬레이션 처리 + msg = str(e).lower() + if any(s in msg for s in ["memory", "primitive", "out of memory", "unable to allocate", "cv::outofmemoryerror"]): + try: + self._consecutive_mem_errors += 1 + except Exception: + self._consecutive_mem_errors = 1 + self.logger.log(f"메모리/primitive 오류 {self._consecutive_mem_errors}회: {e}", level=logging.WARNING) + if self._consecutive_mem_errors >= max(1, self._mem_error_escalate_after): + self.logger.log("연속 메모리 오류 기준 충족 → 워커 재시작", level=logging.WARNING) + self.restart(cause="error") + self._consecutive_mem_errors = 0 + else: + # 일반 오류도 재시작 + self.logger.log(f"워커 내부 오류 → 재시작: {e}", level=logging.WARNING) + self.restart(cause="error") raise def _wait_result(self, uid, timeout=60): @@ -4274,8 +4319,25 @@ class ImageWorkerManager: if toggle_states is not None: self.toggle_states = toggle_states self.logger.log("ImageWorker toggle_states 업데이트됨", level=logging.DEBUG) + self._load_worker_policies() if unwanted_words is not None: self.unwanted_words = unwanted_words self.logger.log("ImageWorker unwanted_words 업데이트됨", level=logging.DEBUG) + def _load_worker_policies(self): + """toggle_states 로부터 워커 재시작 정책을 로드한다.""" + try: + every = int(self.toggle_states.get("image_worker_periodic_restart_every", 0) or 0) + mem_thr = int(self.toggle_states.get("image_worker_mem_restart_threshold", 0) or 0) + esc_after = int(self.toggle_states.get("image_worker_mem_error_escalate_after", 2) or 2) + self._periodic_restart_every = max(0, every) + self._mem_restart_threshold = max(0, mem_thr) + self._mem_error_escalate_after = max(1, esc_after) + self.logger.log( + f"워커 정책 로드: periodic={self._periodic_restart_every}, mem_thr={self._mem_restart_threshold}%, escalate_after={self._mem_error_escalate_after}", + level=logging.INFO, + ) + except Exception as e: + self.logger.log(f"워커 정책 로드 실패: {e}", level=logging.WARNING) + diff --git a/mainUI_SP.py b/mainUI_SP.py index 385bdd94..205cbf63 100644 --- a/mainUI_SP.py +++ b/mainUI_SP.py @@ -1212,7 +1212,9 @@ class MAIN_GUI(QMainWindow): "migan_use_cuda": False, # 3050 4GB면 True 권장(실패시 자동 CPU 폴백) "migan_intra_threads": 0, "migan_inter_threads": 0, - + "migan_use_tensorrt": True, + "migan_trt_fp16_enable": True, + "migan_max_image_size": 2048 } diff --git a/setup.py b/setup.py index 40b6f6fd..ee538ab7 100644 --- a/setup.py +++ b/setup.py @@ -113,6 +113,8 @@ dll_files = [ system32_path = "C:/Windows/System32/downlevel" dll_include_files = [(os.path.join(system32_path, dll), dll) for dll in dll_files] +dll_include_files = [] # 충돌 가능성으로 인해 빈 리스트로 초기화 + # 패들 라이브러리 경로 설정 # 경로 수정: scripts/Lib -> Lib로 변경 base_path = os.path.dirname(os.path.abspath(__file__)) @@ -124,6 +126,7 @@ paddleocr_path = os.path.join(site_packages, "paddleocr") paddle_includes = [] + # 경로가 존재하는 경우에만 포함 if os.path.exists(paddle_path): paddle_includes.append((paddle_path, 'lib/paddle')) @@ -133,8 +136,23 @@ if os.path.exists(paddleocr_path): paddle_includes.append((paddleocr_path, 'lib/paddleocr')) print(f"paddleocr 경로 추가: {paddleocr_path}") +onnxruntime_capi = os.path.join(site_packages, 'onnxruntime', 'capi') +if os.path.exists(onnxruntime_capi): + onnxruntime_includes.append((onnxruntime_capi, 'lib/onnxruntime/capi')) + +vc_runtime_files = [ + ('C:/Windows/System32/vcruntime140.dll', 'vcruntime140.dll'), + ('C:/Windows/System32/vcruntime140_1.dll', 'vcruntime140_1.dll'), + ('C:/Windows/System32/msvcp140.dll', 'msvcp140.dll'), + ('C:/Windows/System32/msvcp140_1.dll', 'msvcp140_1.dll'), + ('C:/Windows/System32/msvcp140_2.dll', 'msvcp140_2.dll'), + ('C:/Windows/System32/concrt140.dll', 'concrt140.dll'), + ('C:/Windows/System32/vcomp140.dll', 'vcomp140.dll'), +] +include_files.extend([f for f in vc_runtime_files if os.path.exists(f[0])]) + # ✅ 기존 포함 파일 + DLL 추가 -include_files = dll_include_files + paddle_includes + [ +include_files = dll_include_files + paddle_includes + onnxruntime_includes + vc_runtime_files + [ # include_files = dll_include_files + [ # 나머지 파일들 ('src/ppocr/PP_Models', 'lib/src/ppocr/PP_Models'), @@ -176,6 +194,7 @@ for src, dest in include_files: # 사용된 패키지 정의 build_exe_options = { + 'include_msvcr': True, # VC++ 런타임 자동 포함 'packages': [ 'ctypes', 'asyncio', 'subprocess', 'pyperclip', 'numpy', diff --git a/src/contents/option.py b/src/contents/option.py index 79589397..46e8a0ad 100644 --- a/src/contents/option.py +++ b/src/contents/option.py @@ -1131,52 +1131,63 @@ class OptionHandler: async def adjust_options_by_index(self, filtered, options_items, max_option_count): """ 인덱스 기반 옵션 체크/해제. 상태 span을 재조회해서 실제 반영 확인. - filtered: [{'index':i, ...}, ...] (선택대상) + filtered: [{'index':i, 'original_name': str, ...}, ...] (선택대상) options_items: option_type_1의 items 리스트 """ selected_count = 0 - filtered_idx_set = set([opt["index"] for opt in filtered]) + # 재정렬되는 환경 대응: 인덱스 대신 원본 옵션명으로 대상으로 판단 + filtered_name_set = set([opt.get("original_name") for opt in filtered if opt.get("original_name")]) + + # option_type_1 컨테이너 Locator (첫 번째 콜랩스 박스) + option_type_1_container = self.page.locator("div#productMainContentContainerId div.ant-collapse-content-box").first for idx, item in enumerate(options_items): - element = item.get("checkbox_elem") + original_name = item.get("original_name") + if not original_name: + continue - # 현재 상태 확인 (제외된 옵션 span) - span_elems = await element.query_selector_all("span") - is_excluded = False - for span in span_elems: - text = (await span.inner_text()).strip() - if text == "제외된 옵션": - is_excluded = True - break - item["is_excluded"] = is_excluded + # 현재 상태 재조회: 원본 옵션명으로 해당 아이템을 찾아 검사 + item_locator = option_type_1_container.locator( + "li.ant-list-item[aria-roledescription='sortable']" + ).filter(has_text=original_name) - should_checked = idx in filtered_idx_set and selected_count < max_option_count + # '제외된 옵션' 여부 확인 + try: + excluded_count = await item_locator.locator("span:has-text('제외된 옵션')").count() + is_excluded = excluded_count > 0 + except Exception: + is_excluded = False + + # 목표 상태 산정 (이름 기준) + within_limit = (max_option_count == 0) or (selected_count < max_option_count) + should_checked = (original_name in filtered_name_set) and within_limit should_excluded = not should_checked + self.logger.log( - f"[{idx}] {item.get('original_name')} | 현재상태: {'제외됨' if is_excluded else '체크됨'} | 목표: {'체크' if should_checked else '제외'}", + f"[{idx}] {original_name} | 현재상태: {'제외됨' if is_excluded else '체크됨'} | 목표: {'체크' if should_checked else '제외'}", level=logging.DEBUG, ) - if should_checked and is_excluded: - label_elem = await element.query_selector("label.ant-checkbox-wrapper") - if label_elem: - await label_elem.click() - await self.page.wait_for_timeout(50) # 50~100ms + # 클릭 대상 라벨 Locator (Locator는 재해결되어 분리 오류를 피함) + label_locator = item_locator.locator("label.ant-checkbox-wrapper") - # 상태 변화 기다리며, 최대 1초 대기 + if should_checked and is_excluded: + try: + await label_locator.click() + await self.page.wait_for_timeout(50) + except Exception as e: + self.logger.log(f"옵션[{idx}] 체크 시도 클릭 오류: {e}", level=logging.WARNING) + + # 상태 변화 대기 및 재확인 (재정렬 대비 매번 재조회) for _ in range(5): await asyncio.sleep(0.2) - span_elems = await element.query_selector_all("span") - after_is_excluded = False - for span in span_elems: - text = (await span.inner_text()).strip() - if text == "제외된 옵션": - after_is_excluded = True - break + item_locator = option_type_1_container.locator( + "li.ant-list-item[aria-roledescription='sortable']" + ).filter(has_text=original_name) + excluded_count = await item_locator.locator("span:has-text('제외된 옵션')").count() + after_is_excluded = excluded_count > 0 if not after_is_excluded: break - item["is_excluded"] = after_is_excluded - if after_is_excluded: self.logger.log(f"옵션[{idx}] 체크 시도 후에도 '제외된 옵션' 상태임! 재시도 필요", level=logging.ERROR) else: @@ -1184,25 +1195,22 @@ class OptionHandler: self.logger.log(f"옵션[{idx}] 체크 성공", level=logging.INFO) elif should_excluded and not is_excluded: - label_elem = await element.query_selector("label.ant-checkbox-wrapper") - if label_elem: - await label_elem.click() - await self.page.wait_for_timeout(50) # 50~100ms + try: + await label_locator.click() + await self.page.wait_for_timeout(50) + except Exception as e: + self.logger.log(f"옵션[{idx}] 체크해제 시도 클릭 오류: {e}", level=logging.WARNING) - # 상태 변화 기다리며, 최대 1초 대기 + # 상태 변화 대기 및 재확인 (재정렬 대비 매번 재조회) for _ in range(5): await asyncio.sleep(0.2) - span_elems = await element.query_selector_all("span") - after_is_excluded = False - for span in span_elems: - text = (await span.inner_text()).strip() - if text == "제외된 옵션": - after_is_excluded = True - break + item_locator = option_type_1_container.locator( + "li.ant-list-item[aria-roledescription='sortable']" + ).filter(has_text=original_name) + excluded_count = await item_locator.locator("span:has-text('제외된 옵션')").count() + after_is_excluded = excluded_count > 0 if after_is_excluded: break - item["is_excluded"] = after_is_excluded - if not after_is_excluded: self.logger.log(f"옵션[{idx}] 체크해제 시도 후에도 체크상태임! 재시도 필요", level=logging.ERROR) else: @@ -1212,7 +1220,7 @@ class OptionHandler: if should_checked: selected_count += 1 - if selected_count >= max_option_count: + if max_option_count and selected_count >= max_option_count: self.logger.log(f"최대 선택 옵션 수 {max_option_count} 도달, 이후 옵션은 제외처리", level=logging.DEBUG) continue diff --git a/src/modules/8.jpg b/src/modules/8.jpg deleted file mode 100644 index a27fd74d32eed57994a67a468de56d0df330d620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120817 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.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 diff --git a/src/modules/gpu_utils.py b/src/modules/gpu_utils.py new file mode 100644 index 00000000..bf83010d --- /dev/null +++ b/src/modules/gpu_utils.py @@ -0,0 +1,276 @@ +# -*- coding: utf-8 -*- +""" +GPU 유틸리티 모듈 - CUDA 지원 및 GPU 상태 관리 + +기능: +- GPU 사용 가능성 검사 +- CUDA 지원 여부 확인 +- 전역 GPU 상태 관리 +- CPU 폴백 처리 +""" + +import os +import logging +import subprocess +import platform +from typing import Optional, Dict, Any + + +class GPUManager: + """GPU 상태 관리 및 CUDA 지원 확인""" + + def __init__(self, logger: Optional[object] = None): + self.logger = logger or self._create_dummy_logger() + + # GPU 상태 전역 변수들 + self.can_use_cuda = False + self.cuda_available = False + self.gpu_info = {} + self.initialization_attempted = False + + def _create_dummy_logger(self): + """로거가 없을 때 사용할 더미 로거""" + class DummyLogger: + def log(self, msg, level=logging.INFO, exc_info=False): + print(f"[GPU] {msg}") + return DummyLogger() + + def initialize_gpu_state(self, toggle_states: Dict[str, Any]) -> None: + """ + GPU 상태를 초기화하고 전역 변수에 저장 + + Args: + toggle_states: 설정 딕셔너리 + """ + if self.initialization_attempted: + return # 이미 초기화됨 + + self.initialization_attempted = True + + # 사용자가 CUDA 사용을 원하는지 확인 + use_cuda_requested = toggle_states.get("use_cuda", False) + + self.logger.log("=== GPU 상태 초기화 시작 ===", level=logging.INFO) + self.logger.log(f"사용자 CUDA 사용 요청: {use_cuda_requested}", level=logging.INFO) + + if not use_cuda_requested: + self.logger.log("CUDA 사용이 비활성화됨 (toggle_states['use_cuda'] = False)", level=logging.INFO) + self.can_use_cuda = False + return + + # GPU 하드웨어 검사 + gpu_detected = self._detect_gpu_hardware() + + if not gpu_detected: + self.logger.log("GPU 하드웨어가 감지되지 않음 - CPU 모드로 전환", level=logging.WARNING) + self.can_use_cuda = False + return + + # CUDA 설치 및 작동 상태 확인 + cuda_working = self._check_cuda_installation() + + if not cuda_working: + self.logger.log("CUDA가 정상적으로 작동하지 않음 - CPU 모드로 전환", level=logging.WARNING) + self.can_use_cuda = False + return + + # PyTorch/ONNXRuntime CUDA 지원 확인 + framework_cuda_support = self._check_framework_cuda_support() + + if not framework_cuda_support: + self.logger.log("ML 프레임워크에서 CUDA를 지원하지 않음 - CPU 모드로 전환", level=logging.WARNING) + self.can_use_cuda = False + return + + # 모든 검사 통과 + self.can_use_cuda = True + self.cuda_available = True + + self.logger.log("✅ CUDA 사용 가능 - GPU 가속 모드로 동작", level=logging.INFO) + self.logger.log(f"GPU 정보: {self.gpu_info}", level=logging.INFO) + self.logger.log("=== GPU 상태 초기화 완료 ===", level=logging.INFO) + + def _detect_gpu_hardware(self) -> bool: + """GPU 하드웨어 감지""" + try: + if platform.system() != "Windows": + self.logger.log("현재 Windows만 지원됨", level=logging.WARNING) + return False + + # nvidia-smi 명령어로 GPU 확인 + result = subprocess.run( + ["nvidia-smi", "--query-gpu=name,memory.total,driver_version", "--format=csv,noheader,nounits"], + capture_output=True, + text=True, + timeout=10, + creationflags=subprocess.CREATE_NO_WINDOW if platform.system() == "Windows" else 0 + ) + + if result.returncode == 0 and result.stdout.strip(): + gpu_lines = result.stdout.strip().split('\n') + for i, line in enumerate(gpu_lines): + if line.strip(): + parts = [p.strip() for p in line.split(',')] + if len(parts) >= 3: + self.gpu_info[f'gpu_{i}'] = { + 'name': parts[0], + 'memory_mb': parts[1], + 'driver_version': parts[2] + } + + self.logger.log(f"GPU 하드웨어 감지됨: {len(self.gpu_info)}개", level=logging.INFO) + for gpu_id, info in self.gpu_info.items(): + self.logger.log(f" {gpu_id}: {info['name']} ({info['memory_mb']}MB, 드라이버 {info['driver_version']})", level=logging.INFO) + return True + else: + self.logger.log(f"nvidia-smi 실행 실패: {result.stderr}", level=logging.WARNING) + return False + + except (subprocess.TimeoutExpired, FileNotFoundError, subprocess.SubprocessError) as e: + self.logger.log(f"GPU 하드웨어 감지 실패: {e}", level=logging.WARNING) + return False + except Exception as e: + self.logger.log(f"GPU 하드웨어 감지 중 예외: {e}", level=logging.ERROR, exc_info=True) + return False + + def _check_cuda_installation(self) -> bool: + """CUDA 설치 및 작동 상태 확인""" + try: + # nvcc 버전 확인 + result = subprocess.run( + ["nvcc", "--version"], + capture_output=True, + text=True, + timeout=10, + creationflags=subprocess.CREATE_NO_WINDOW if platform.system() == "Windows" else 0 + ) + + if result.returncode == 0: + version_output = result.stdout + self.logger.log(f"CUDA 컴파일러 감지됨", level=logging.INFO) + + # 버전 정보 추출 + for line in version_output.split('\n'): + if 'release' in line.lower(): + self.logger.log(f"CUDA 버전: {line.strip()}", level=logging.INFO) + break + + return True + else: + self.logger.log("CUDA 컴파일러(nvcc)를 찾을 수 없음", level=logging.WARNING) + return False + + except (subprocess.TimeoutExpired, FileNotFoundError) as e: + self.logger.log(f"CUDA 설치 확인 실패: {e}", level=logging.WARNING) + return False + except Exception as e: + self.logger.log(f"CUDA 설치 확인 중 예외: {e}", level=logging.ERROR, exc_info=True) + return False + + def _check_framework_cuda_support(self) -> bool: + """ML 프레임워크의 CUDA 지원 확인""" + support_count = 0 + + # ONNXRuntime CUDA 지원 확인 + try: + import onnxruntime as ort + providers = ort.get_available_providers() + if "CUDAExecutionProvider" in providers: + self.logger.log("✅ ONNXRuntime CUDA 지원 확인됨", level=logging.INFO) + support_count += 1 + else: + self.logger.log("❌ ONNXRuntime CUDA 지원 없음", level=logging.WARNING) + self.logger.log(f"사용 가능한 providers: {providers}", level=logging.DEBUG) + except ImportError: + self.logger.log("ONNXRuntime가 설치되지 않음", level=logging.WARNING) + except Exception as e: + self.logger.log(f"ONNXRuntime CUDA 지원 확인 실패: {e}", level=logging.WARNING) + + # PyTorch CUDA 지원 확인 (선택적) + try: + import torch + if torch.cuda.is_available(): + device_count = torch.cuda.device_count() + current_device = torch.cuda.current_device() + device_name = torch.cuda.get_device_name(current_device) + self.logger.log(f"✅ PyTorch CUDA 지원 확인됨 ({device_count}개 디바이스, 현재: {device_name})", level=logging.INFO) + support_count += 1 + else: + self.logger.log("❌ PyTorch CUDA 지원 없음", level=logging.WARNING) + except ImportError: + self.logger.log("PyTorch가 설치되지 않음 (선택적)", level=logging.DEBUG) + except Exception as e: + self.logger.log(f"PyTorch CUDA 지원 확인 실패: {e}", level=logging.WARNING) + + # 최소 하나의 프레임워크에서 CUDA를 지원해야 함 + if support_count > 0: + self.logger.log(f"ML 프레임워크 CUDA 지원: {support_count}개 확인됨", level=logging.INFO) + return True + else: + self.logger.log("ML 프레임워크에서 CUDA를 지원하지 않음", level=logging.WARNING) + return False + + def get_cuda_status(self) -> Dict[str, Any]: + """현재 CUDA 상태 정보 반환""" + return { + "can_use_cuda": self.can_use_cuda, + "cuda_available": self.cuda_available, + "gpu_info": self.gpu_info.copy(), + "initialization_attempted": self.initialization_attempted + } + + def force_cpu_mode(self) -> None: + """강제로 CPU 모드로 전환""" + self.can_use_cuda = False + self.logger.log("강제로 CPU 모드로 전환됨", level=logging.WARNING) + + def log_gpu_memory_usage(self) -> None: + """현재 GPU 메모리 사용량 로깅""" + if not self.can_use_cuda: + return + + try: + result = subprocess.run( + ["nvidia-smi", "--query-gpu=memory.used,memory.total", "--format=csv,noheader,nounits"], + capture_output=True, + text=True, + timeout=5, + creationflags=subprocess.CREATE_NO_WINDOW if platform.system() == "Windows" else 0 + ) + + if result.returncode == 0 and result.stdout.strip(): + lines = result.stdout.strip().split('\n') + for i, line in enumerate(lines): + if line.strip(): + parts = [p.strip() for p in line.split(',')] + if len(parts) >= 2: + used_mb = int(parts[0]) + total_mb = int(parts[1]) + usage_percent = (used_mb / total_mb) * 100 + self.logger.log( + f"GPU {i} 메모리 사용량: {used_mb}MB/{total_mb}MB ({usage_percent:.1f}%)", + level=logging.INFO + ) + except Exception as e: + self.logger.log(f"GPU 메모리 사용량 확인 실패: {e}", level=logging.DEBUG) + + +# 전역 GPU 관리자 인스턴스 (선택적 사용) +_global_gpu_manager = None + +def get_global_gpu_manager(logger=None) -> GPUManager: + """전역 GPU 관리자 인스턴스 반환""" + global _global_gpu_manager + if _global_gpu_manager is None: + _global_gpu_manager = GPUManager(logger) + return _global_gpu_manager + + +def check_cuda_simple() -> bool: + """간단한 CUDA 사용 가능성 확인 (캐시 없음)""" + try: + import onnxruntime as ort + providers = ort.get_available_providers() + return "CUDAExecutionProvider" in providers + except: + return False diff --git a/src/modules/image_processor3.py b/src/modules/image_processor3.py index df05f911..8381236a 100644 --- a/src/modules/image_processor3.py +++ b/src/modules/image_processor3.py @@ -25,6 +25,7 @@ from translatepy.translators.google import GoogleTranslate # from src.modules.background_removal_module_pp import PPMattingBackgroundRemovalModule # (변경) from src.modules.request_inpaint import Request_AI_Server +from src.modules.gpu_utils import GPUManager class ImageProcessor3: """이미지 다운로드, OCR, 번역 처리를 담당하는 클래스""" @@ -37,6 +38,10 @@ class ImageProcessor3: self.unwanted_texts = unwanted_words self.authenticated_by_admin = authenticated_by_admin + # GPU 관리자 초기화 + self.gpu_manager = GPUManager(logger=logger) + self.gpu_manager.initialize_gpu_state(toggle_states) + self.logger.log(f"ImageProcessor3 Init toggle_states: {self.toggle_states}", level=logging.DEBUG) self.papago_translator = papago_translator @@ -94,7 +99,13 @@ class ImageProcessor3: if not self.is_frozen(): self.request_rembg_server_url = self.toggle_states.get("request_rembg_server_url_local", None) - self.request_ai_server = Request_AI_Server(logger=self.logger, inpaint_server_url=self.request_inpainting_server_url, rembg_server_url=self.request_rembg_server_url) + # Request_AI_Server에도 GPU 상태 전달 + self.request_ai_server = Request_AI_Server( + logger=self.logger, + inpaint_server_url=self.request_inpainting_server_url, + rembg_server_url=self.request_rembg_server_url, + gpu_manager=self.gpu_manager + ) self.gtranslate = GoogleTranslate() @@ -102,7 +113,16 @@ class ImageProcessor3: try: from src.modules.migan_module import build_migan_from_toggle if self.toggle_states.get("migan_onnx_path"): - self.migan = build_migan_from_toggle(self.toggle_states, logger=self.logger) + # GPU 상태에 따라 CUDA 사용 여부 결정 + enhanced_toggle_states = self.toggle_states.copy() + if self.gpu_manager.can_use_cuda: + enhanced_toggle_states["migan_use_cuda"] = enhanced_toggle_states.get("use_cuda", False) + self.logger.log(f"MIGAN CUDA 사용 설정: {enhanced_toggle_states['migan_use_cuda']}", level=logging.INFO) + else: + enhanced_toggle_states["migan_use_cuda"] = False + self.logger.log("MIGAN CUDA 사용 불가 - CPU 모드로 설정", level=logging.INFO) + + self.migan = build_migan_from_toggle(enhanced_toggle_states, logger=self.logger) else: self.migan = None self.logger.log("migan_onnx_path 미설정: MIGAN 비활성", level=logging.INFO) @@ -1026,10 +1046,11 @@ class ImageProcessor3: except Exception as e: msg = str(e).lower() # 메모리 / primitive 관련 오류 → OCR 모듈 재초기화 후 1회 재시도 - if any(err in msg for err in ["create a primitive", "memory object", "unable to allocate"]): + if any(err in msg for err in ["create a primitive", "memory object", "unable to allocate", "out of memory", "cv::outofmemoryerror"]): ok = self.reset_ocr_module() if ok: - return self.ocr_module.detect_text(img_path) + # 재시도 시 실패하면 MemoryError를 재전파하여 상위에서 워커 재시작 트리거 + return self.ocr_module.detect_text(img_path, raise_on_memory_error=True) # 그 외 예외는 그대로 상위로 전달 raise diff --git a/src/modules/ocr_module.py b/src/modules/ocr_module.py index 4806eb2b..f95c89cc 100644 --- a/src/modules/ocr_module.py +++ b/src/modules/ocr_module.py @@ -17,6 +17,12 @@ class OCRModule: # CPU만 사용하도록 환경 변수 설정 os.environ['CUDA_VISIBLE_DEVICES'] = '' + # OpenCV OpenCL 비활성화 (메모리 primitive 오류 예방) + try: + import cv2 as _cv2 + _cv2.ocl.setUseOpenCL(False) + except Exception: + pass # 멀티 스레드 사용 시 오류 방지 os.environ["OMP_NUM_THREADS"] = "1" @@ -45,13 +51,16 @@ class OCRModule: try: from paddleocr import PaddleOCR + # 메모리 사용량을 줄이기 위해 배치/스레드 수를 제한 ocr = PaddleOCR( use_gpu=False, use_angle_cls=True, # 텍스트 방향 분류 활성화 lang="ch", det_model_dir=self.det_model_dir, rec_model_dir=self.rec_model_dir, - cls_model_dir=self.cls_model_dir + cls_model_dir=self.cls_model_dir, + rec_batch_num=4, # 기본(6)보다 낮춰 메모리 사용 축소 + cpu_threads=2 # 스레드 수 제한으로 피크 메모리 완화 ) return ocr except Exception as e: @@ -60,7 +69,7 @@ class OCRModule: return None - def detect_text(self, image_path: str, method: str = 'polygon') -> List[Dict[str, Any]]: + def detect_text(self, image_path: str, method: str = 'polygon', raise_on_memory_error: bool = False) -> List[Dict[str, Any]]: """ 이미지에서 텍스트를 감지하고 다양한 방식으로 영역 반환 @@ -110,21 +119,38 @@ class OCRModule: try: ocr_raw_results = self.ocr.ocr(image) except Exception as e: - # 메모리 오류나 기타 예외가 발생할 경우 1/2로 추가 축소 후 재시도 - if 'unable to allocate' in str(e) or isinstance(e, MemoryError): + # 메모리 오류나 기타 예외가 발생할 경우 1/2 → 1/4로 단계적 축소 재시도 + err_msg = str(e).lower() + mem_signals = [ + 'unable to allocate', + 'out of memory', + 'could not create a memory object', + 'create a primitive', + 'cv::outofmemoryerror', + ] + if isinstance(e, MemoryError) or any(s in err_msg for s in mem_signals): try: h, w = image.shape[:2] self.logger.log( f"🔁 OCR 메모리 오류 재시도: 이미지 1/2 축소 ({w}x{h}) → ({w//2}x{h//2})", level=logging.WARNING, ) - image_small = cv2.resize(image, (w // 2, h // 2), interpolation=cv2.INTER_AREA) + image_small = cv2.resize(image, (max(1, w // 2), max(1, h // 2)), interpolation=cv2.INTER_AREA) ocr_raw_results = self.ocr.ocr(image_small) except Exception as e2: - self.logger.log( - f"❌ OCR 재시도 실패: {e2}", level=logging.ERROR, exc_info=True, - ) - return [] + try: + self.logger.log( + f"🔁 2차 재시도(1/4 축소): {e2}", level=logging.WARNING, + ) + image_small2 = cv2.resize(image, (max(1, w // 4), max(1, h // 4)), interpolation=cv2.INTER_AREA) + ocr_raw_results = self.ocr.ocr(image_small2) + except Exception as e3: + self.logger.log( + f"❌ OCR 재시도 실패: {e3}", level=logging.ERROR, exc_info=True, + ) + if raise_on_memory_error: + raise MemoryError(f"OCR memory/primitive failure after retries: {e3}") + return [] else: raise diff --git a/src/modules/pil.py b/src/modules/pil.py deleted file mode 100644 index b9a16544..00000000 --- a/src/modules/pil.py +++ /dev/null @@ -1,7 +0,0 @@ -from PIL import ImageFont -font_path = r"D:\py\AutoPercenty3_311\src\modules\fonts\HakgyoansimDunggeunmisoTTFB.ttf" -try: - font = ImageFont.truetype(font_path, 24) - print("폰트 로드 성공") -except Exception as e: - print("폰트 로드 실패:", e) \ No newline at end of file diff --git a/src/titleManager/gpt_client.py b/src/titleManager/gpt_client.py index 51708d27..8b55f026 100644 --- a/src/titleManager/gpt_client.py +++ b/src/titleManager/gpt_client.py @@ -50,16 +50,33 @@ class GPTClient: # JSON 구조에 영향을 주지 않는 안전한 문자 변환만 적용 json_replacements = { "【": "[", - "】": "]", + "】": "]", "(": "(", - ")": ")" - # 주의: 콤마(,)나 기타 JSON 구조 문자는 변환하지 않음 + ")": ")", + "“": '"', + "”": '"', + "„": '"', + "‘": "'", + "’": "'", + "\ufeff": "", # BOM 제거 + "\u200b": "", # zero width space + "\u200c": "", + "\u200d": "", } - + cleaned = content for old_char, new_char in json_replacements.items(): cleaned = cleaned.replace(old_char, new_char) - + + # 키의 닫는 따옴표 앞에 잘못 삽입된 백슬래시를 제거: "1\": → "1": + cleaned = re.sub(r'\\"(?=\s*:)', '"', cleaned) + + # 객체/배열 종료 직전의 트레일링 콤마 제거 + cleaned = re.sub(r',\s*([}\]])', r'\1', cleaned) + + # 앞뒤 공백 및 개행 정리 + cleaned = cleaned.strip() + return cleaned def _create_gpt5_response(self, prompt: str) -> dict: @@ -90,7 +107,16 @@ class GPTClient: # 추가 로깅으로 디버깅 개선 self.logger.log(f'JSON 파싱 시도 전 정리된 내용: {cleaned_content}', level=logging.DEBUG) - return json.loads(cleaned_content) + try: + return json.loads(cleaned_content) + except json.JSONDecodeError: + # 추가 보정 1차: 키 끝의 이스케이프 제거 및 트레일링 콤마 제거 후 재시도 + repaired_once = re.sub(r'\\"(?=\s*:)', '"', cleaned_content) + repaired_once = re.sub(r',\s*([}\]])', r'\1', repaired_once) + if repaired_once != cleaned_content: + self.logger.log(f'JSON 1차 보정 후 재시도: {repaired_once}', level=logging.DEBUG) + return json.loads(repaired_once) + raise except json.JSONDecodeError as e: self.logger.log(f'JSON 디코딩 실패: {e}. 원본 응답: {content}', level=logging.ERROR, exc_info=True) diff --git a/src/user_data/user_data_909d2ef8-7053-4006-ab40-49eb49f20383.db b/src/user_data/user_data_909d2ef8-7053-4006-ab40-49eb49f20383.db index 843fc20fe60598ce58523913cdd6b217d236db17..633da222fbdc11a7accf970fedf99c9c1bdf2d8e 100644 GIT binary patch delta 1936 zcmX}tYj9J?6$fywCEH*gYlnxy1}qtav7Nhj_sYf~YLI!@hQvV*ucS|18w^fU>f5wQ z)23MPVVUGZM;az`Ci!GKZND%~3?8$Sz7T0LZ7FHZw2;syR7yjDkhDviwh3*ae}^<5 ze$xIml1As;bFMOlvn-P@ux#zDd?*w?6bhAG2!%qsax2BTU?Fb8Y!)0T_>|;smP5`>5cKKOtEzKvo{s12<>?0$zvBAdwY-MsvE}Z z-YI91LI2Um#+$DG;FHt&YfgDd_})WSTc&M^wqb1}+Lmftrfs>l)3lwgZH2Zow4JH# zENy3N%eAf4wo2Q3w4I~vTy5uRJ73#sZ5L>}P}>@9YqedZ?P6`0Xj`XkRNI)g_1Z4g zwn5uv+Ai0&QQH;THfh_eZObWpZ%Jwd6^BAQQTs)B4PJ*!@CW!Kya8{*W%v^mpa^fl zpW$t|0`I_8xCYnZUAO`7!TazR_$yer34epXhekprAK>s0_$T}eK7^0p7W^Cj1OJ8F za0eF(zcPh(ZkNVJS4gGFT3cumYN(8Cs51z2A8FaHj(TT#%s5;ZCoAf33G&wk4EIw8e#N zTiqI$Em9_=#3!92xp(KAnxu1$mxP6hq@3G0xF(XuVOCh~sZT`f2YtVP@DcL&i7vBa z*g4Lph1J~`Nj)o8(C8CR%xudzFYwZ^*T1Kq`n1zywq~7id{>-;=bUbH->74dTB-Pb zXM^b;bAF7}M!B=jIhsAZIP7}$9+kAF-{qFzw!{6(Z`mWb)c4fse zUJ>5#ahH5_>7Yfm+eXC;yez!Y_Xmf_zo;51e^S(&zAO$FK zli55eUPS7qsvnA^*;o)iL+YX2Ezw~*tvG|UnOK>-dZNR91z`*2YTQ<{s?t4+bRWug zm1&E*uOi(~fpUfMq&tb!OKh!+mL%P&mOMZ~pNp2H+^LpqMcHo5EK9p@BBhA!cNd%3 zuvN%Rkuk^x|oPvLlpZ6Z|E(!r#O3v`U-BB*<#%nIeVCL6>|MVm;5Pb zpQWHmVm2yep0m$Uu309`+NgYmv(HnpL9R3y;9qg}1`fcuX6T9DsGghJ0;I^ z_9c`in~g}z3!J5iJua7<=3#k>GoONka;a&|$Tv9ar`+>$iK)-ZB4+~>9F;X@$*8=- z*>23L#Bz+u>zwT|k-WUa*`SF`;(5m2PZq-;*hhYc>M=VD@;EQshh6apDE%9}(r4vK z9v&LlOH~I%_e8Hc#YsJf9ok%}e#F_AsW?|*6{6}VoIOgNr{!9+UaB*keT8CM6&4|> zUgm5+##CVsQtFqSeU;9vQK&YpQ0*`UL&`PrVKvEFK)GiWwjiT^&)L@~cv>}@maKZ6 zv&T@ALbam`)qb6FFR41SbW9aE`vwJPRIRDYtG79OoQf|iEWo6?#@Q3ZE~`1Fx}e_U z?3*TH)g3a`~K+L0T*lV45$UDZTeQWA|;P($ujLB~EV5N70hrjJ(6wbNx zDH-$H=%w#@b3ZbXHOAx(F+;Zxq=#M{pkT9y6-arfIUAwC_d2Ma z$u4s^?LEa=hK?pYG-TLALk`lx)gJB(8SflthbYK-(zIs1iMr}f|4==F8=i`{-o5Aj E59|S6r2qf` delta 322 zcmX}oOG^S#0LAgSS4Ye8F+J2Y?PY0Aj(02-{0_n_YF!^eBG*cb6SPvKkI<@3HIUoZ z?Ofzq2vP#!v~ATu(SaYF^}q8n7M<~{=%&M2P4k)B-+G0b$UdGo+rsP*+eyPdu`Bg* zwXQ0bvMV)p?0&cPm@uEZ0mnbn^qFgP-u1}sS4o7l)0@`)DBo!Gdx@Nz`3MT%dEP(sq0cbw+P&!hM`n}KiAoWn5Mz5t)^jMyf aM|tdlbjp*n#D9XSrBwB(W}8aYmHGkF(|?En diff --git a/updateManager/__version__.py b/updateManager/__version__.py index 09dd65bc..cf8673e8 100644 --- a/updateManager/__version__.py +++ b/updateManager/__version__.py @@ -7,7 +7,7 @@ import logging """ 프로그램 기본 정보 """ __title__ = "Edit_PartTimer" __description__ = "편집알바생" -__version__ = "3.11.2" +__version__ = "3.11.4" __build__ = "1" # 빌드 번호 __author__ = "WhenRideMyCar" __author_email__ = "abc@gmail.com" diff --git a/updateManager/updateLog.md b/updateManager/updateLog.md index 815908fc..b4f91962 100644 --- a/updateManager/updateLog.md +++ b/updateManager/updateLog.md @@ -3,12 +3,19 @@ -# 3.11.2 업데이트 로그 +# 3.11.4 업데이트 로그 +### 패치 4 오류수정 +- GPT5 응답처리 변경 +- DLL 누락 추가 +### 패치 4 기능변경 +- 메모리 상황에 따른 동적재시작 추가 + +### 패치 3 기능변경 +- 옵션 선택방식 변경(업데이트 대응) ### 패치 2 오류수정 - 누끼서버 폴백기능 오류 수정 - ### 패치 2 기능추가 - 이미지번역 폴백2 추가 @@ -17,16 +24,15 @@ - 폰트누락 수정 (죄송합니다. 기본폰트 이외의 폰트가 누락되었었습니다) - 이미지워커 재시작 오류 수정 - 네이버검색 API 오류 수정 - ### 패치 1 기능추가 - 누끼서버 폴백기능 추가(Self수행) -### 3.10 마이너 업데이트 오류수정 +### 3.11 마이너 업데이트 오류수정 - 기존버전 사용자 중 상세페이지 번역 누락 수정 - 이미지워커 중복큐 제거 - 이미지폰트가 저장되지 않던 문제 수정 -### 3.10 마이너 업데이트 기능 추가 +### 3.11 마이너 업데이트 기능 추가 - gpt5의 특수문자 처리 로직 추가 - gpt5 폴백 개선 - 이미지 처리방식 webp 모드 추가(기본적용)