import os import asyncio from playwright.async_api import async_playwright import time class ThumbnailHandler: def __init__(self, locator_manager, browser_controller, logger, whale_translator, clipboardImageManager, toggle_states): 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) # 폴더가 없으면 생성 def update_page(self, page1): self.page = page1 self.logger.debug(f"page객체 업데이트 : {page1}") def update_whale(self): self.whale_translator = self.browser_controller.get_whale() self.logger.debug(f"whale_translator 업데이트 : {self.whale_translator}") 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.debug(f"총 썸네일 카드 수집 완료: {total_thumbnails}개") 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.debug(f"{index}번째 썸네일 이미지 URL: {image_url}") # 이미지 번역 실행 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) async def translate_thumbnail_image(self, image_url, index): try: # 이미지 번역 수행 및 임시 저장 경로 반환 translated_image_path = os.path.join(self.temp_dir, f"translated_thumb_{index}.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.debug(f"{index}번째 썸네일 이미지 번역 완료: {translated_image_path}") self.browser_controller.switch_to_chrome() # 크롬으로 포커스 이동 return translated_image_path except Exception as e: self.logger.error(f"{index}번째 썸네일 이미지 번역 중 오류 발생: {e}", 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.debug("썸네일 삭제 버튼 클릭 완료") except Exception as e: self.logger.error(f"썸네일 삭제 중 오류 발생: {e}", 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.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.debug("이미지 파일 업로드 완료") # '이미지 삽입' 버튼 클릭 confirm_button = await self.page.query_selector(self.confirm_upload_button_selector) await confirm_button.click() self.logger.debug("이미지 삽입 버튼 클릭 완료") except Exception as e: self.logger.error(f"이미지 업로드 중 오류 발생: {e}", exc_info=True)