AutoPercenty3/thumb.py

140 lines
7.7 KiB
Python

import os
import sys
import logging
class ThumbnailHandler:
def __init__(self, locator_manager, browser_controller, logger, whale_translator, clipboardImageManager, toggle_states, update_detail_progress_signal, set_progress_visible_signal):
self.update_detail_progress_signal = update_detail_progress_signal
self.set_progress_visible_signal = set_progress_visible_signal
self.locator_manager = locator_manager
self.browser_controller = browser_controller
self.page = self.browser_controller.page
self.whale_translator = whale_translator
self.clipboardImageManager = clipboardImageManager
self.toggle_states = toggle_states
self.logger = logger
self.thumbnail_selector_template = "div#productMainContentContainerId div:nth-child({index}) > div > div:nth-child(2) > div > img"
self.delete_button_selector_template = "div#productMainContentContainerId div:nth-child({index}) > div > div.ant-row.ant-row-no-wrap.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(1) > div > span"
# self.delete_button_selector_for_Num1 = "div#productMainContentContainerId div:nth-child(1) > div > div.ant-row.ant-row-no-wrap.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(1) > div > span"
self.upload_button_selector = "div#productMainContentContainerId div:nth-child({index}) > div > div:nth-child(2) > span"
self.file_upload_button_selector = 'span.ant-upload-btn input[type="file"]'
self.confirm_upload_button_selector = "div.ant-modal-footer > button[type=\"button\"].ant-btn.css-1li46mu.ant-btn-primary"
# # main.py 실행 폴더의 tmp_images 폴더 경로 설정
# base_dir = os.path.dirname(os.path.abspath(__file__)) # main.py 위치 확인
# self.temp_dir = os.path.join(base_dir, "tmp_images") # tmp_images 폴더 경로 설정
# os.makedirs(self.temp_dir, exist_ok=True) # 폴더가 없으면 생성
# main.py 실행 폴더의 tmp_images 폴더 경로 설정
base_dir = self.get_base_dir() # get_base_dir() 메서드 호출
self.temp_dir = os.path.join(base_dir, "tmp_images") # tmp_images 폴더 경로 설정
os.makedirs(self.temp_dir, exist_ok=True) # 폴더가 없으면 생성
self.logger.log(f"임시 디렉토리 생성: {self.temp_dir}", level=logging.INFO) # 디렉토리 생성 로그 출력
def get_base_dir(self):
"""
실행 환경에 따라 base_dir을 설정하는 메서드.
cx_Freeze로 패키징된 경우 실행 파일의 경로, 일반 Python 환경일 경우 __file__을 기준으로 설정.
"""
if getattr(sys, 'frozen', False): # 패키징된 경우
base_dir = os.path.dirname(sys.executable)
internal_dir = os.path.join(base_dir, '_internal') # _internal 디렉토리 포함
if os.path.exists(internal_dir): # _internal 디렉토리가 존재하면 base_dir로 설정
return internal_dir
else: # 일반 Python 실행 환경
base_dir = os.path.dirname(os.path.abspath(__file__))
return base_dir
def update_page(self, page1):
self.page = page1
self.logger.log(f"page객체 업데이트 : {page1}", level=logging.DEBUG)
def update_whale(self):
self.whale_translator = self.browser_controller.get_whale()
self.logger.log(f"whale_translator 업데이트 : {self.whale_translator}", level=logging.DEBUG)
async def process_thumbnails(self):
self.update_whale()
# 썸네일 카드 개수 수집
thumbnails = await self.page.query_selector_all("div#productMainContentContainerId div.ant-row.ant-row-bottom.css-1li46mu > div")
total_thumbnails = len(thumbnails)
self.logger.log(f"총 썸네일 카드 수집 완료: {total_thumbnails}", level=logging.DEBUG)
self.set_progress_visible_signal.emit(True)
for index in range(total_thumbnails-1):
thumbnail_img_selector = self.thumbnail_selector_template.format(index=1)
delete_button_selector = self.delete_button_selector_template.format(index=1) # 첫번째카드만 삭제를 반복하면 되므로
# 이미지 URL 수집
thumbnail_img_element = await self.page.query_selector(thumbnail_img_selector)
if thumbnail_img_element:
image_url = await thumbnail_img_element.get_attribute("src")
self.logger.log(f"{index+1}번째 썸네일 이미지 URL: {image_url}", level=logging.DEBUG)
# 이미지 번역 실행
translated_image_path = await self.translate_thumbnail_image(image_url, index)
# 기존 썸네일 삭제
await self.delete_thumbnail(delete_button_selector)
# 번역된 이미지 업로드
await self.upload_translated_image(translated_image_path, thumbnails)
self.update_detail_progress_signal.emit(index+1,total_thumbnails)
self.set_progress_visible_signal.emit(False)
async def translate_thumbnail_image(self, image_url, index):
try:
# 이미지 번역 수행 및 임시 저장 경로 반환
translated_image_path = os.path.join(self.temp_dir, f"translated_thumb_{index+1}.png") # 이미지 저장 경로 설정
is_success_translated = self.whale_translator.translate_image(image_url)
self.clipboardImageManager.process_clipboard(image_url, is_success_translated, self.toggle_states, translated_image_path, is_thumb=True)
self.logger.log(f"{index+1}번째 썸네일 이미지 번역 완료: {translated_image_path}", level=logging.DEBUG)
# self.browser_controller.switch_to_chrome() # 크롬으로 포커스 이동
return translated_image_path
except Exception as e:
self.logger.log(f"{index+1}번째 썸네일 이미지 번역 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)
return None
async def delete_thumbnail(self, delete_button_selector):
try:
delete_button = await self.page.query_selector(delete_button_selector)
if delete_button:
await delete_button.click()
self.logger.log("썸네일 삭제 버튼 클릭 완료", level=logging.DEBUG)
except Exception as e:
self.logger.log(f"썸네일 삭제 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)
async def upload_translated_image(self, image_path, thumbnails):
try:
# 썸네일 카드 목록의 마지막 요소가 업로드 카드
last_thumbnail = thumbnails[-1]
upload_button = await last_thumbnail.query_selector("span:has-text('Upload')")
if upload_button:
await upload_button.click()
self.logger.log("업로드 버튼 클릭 완료", level=logging.DEBUG)
# 파일 업로드 수행
file_input = await self.page.query_selector(self.file_upload_button_selector)
if file_input:
await file_input.set_input_files(image_path)
self.logger.log("이미지 파일 업로드 완료", level=logging.DEBUG)
# '이미지 삽입' 버튼 클릭
confirm_button = await self.page.query_selector(self.confirm_upload_button_selector)
await confirm_button.click()
self.logger.log("이미지 삽입 버튼 클릭 완료", level=logging.DEBUG)
except Exception as e:
self.logger.log(f"이미지 업로드 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)