
    .i%                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 er	 g dZdddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 dd	Zy
)u   프레임 생성 모듈.

IDS Phase 5 — 모션 카드뉴스 (HTML→MP4)
- PIL 기반 솔리드 프레임 생성 (테스트/폴백용)
- Playwright 기반 HTML→PNG 변환 (프로덕션)
    )annotations)Path)TYPE_CHECKING)Image	ImageDraw	ImageFont)zR/home/jay/workspace/tools/ai-image-gen/satori-test/fonts/NotoSansCJKkr-Regular.otfzO/home/jay/workspace/tools/ai-image-gen/satori-test/fonts/NotoSansCJKkr-Bold.otfz6/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttcz6/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttcc                    t         D ]4  }t        |      j                         s	 t        j                  ||       c S  t        j                         S # t
        $ r Y Vw xY w)uN   한글 폰트를 로드합니다. 실패 시 기본 폰트를 반환합니다.)_FONT_SEARCH_PATHSr   existsr   truetype	Exceptionload_default)size	font_paths     7/home/jay/workspace/skills/motion-cardnews-ko/frames.py_get_korean_fontr      s^    ' 		?!!# )))T:: !!##  s   A	AAc           	        t        j                  d| |f|      }t        j                  |      }t	        t        dt        | dz  d                  }|j                  d||      }|d	   |d
   z
  }	|d   |d   z
  }
| |	z
  d	z  }||
z
  d	z  }|j                  |d	z   |d	z   f|d|       |j                  ||f|d|       t        |      }|j                  j                  dd       |j                  t        |      d       |S )u  솔리드 컬러 배경에 텍스트를 그린 PNG 프레임을 생성합니다.

    Args:
        width: 이미지 너비 (픽셀)
        height: 이미지 높이 (픽셀)
        color: RGB 배경색 튜플, 예: (220, 50, 50)
        text: 프레임에 표시할 텍스트
        output_path: 저장할 PNG 파일 경로

    Returns:
        저장된 PNG 파일의 Path 객체
    RGB)color   
   H   )r   )r   r   )font   r         )r   r   r      )fillr   )   r   r   Tparentsexist_okPNG)r   newr   Drawr   maxmintextbboxtextr   parentmkdirsavestr)widthheightr   r)   output_pathimgdrawr   bboxtext_wtext_hxys                r   generate_solid_framer8   $   s   & ))EE6?%
8C>>#DRUb[")=!>?D ==D=1D!WtAwF!WtAwF 
AA	&QA 	IIq1ua!enddICIIq!fdtI<{#KTD9HHSu%    c                ^   	 ddl m} |\  }}t        |      }|j	                  dd       g } |       5 }|j
                  j                         }	|	j                  ||d      }
t        |       D ]y  \  }}t        |      }|
j                  d	|j                                 |
j                  d
       |d|ddz  }|
j                  t        |             |j                  |       { |	j                          ddd       |S # t        $ r}t        d      |d}~ww xY w# 1 sw Y   |S xY w)uk  HTML 파일 목록을 Playwright로 PNG 프레임으로 변환합니다.

    Args:
        html_paths: HTML 파일 경로 목록
        size: (width, height) 출력 해상도
        output_dir: PNG를 저장할 디렉토리

    Returns:
        생성된 PNG 파일 경로 목록

    Raises:
        ImportError: playwright가 설치되지 않은 경우
    r   )sync_playwrightui   playwright가 설치되지 않았습니다. 설치: pip install playwright && playwright install chromiumNTr    )r.   r/   )viewportzfile://networkidleframe_04dz.png)path)playwright.sync_apir;   ImportErrorr   r+   chromiumlaunchnew_page	enumerategotoabsolutewait_for_load_state
screenshotr-   appendclose)
html_pathsr   
output_dirr;   excr.   r/   frame_pathspbrowserpagei	html_pathout_paths                 r   frames_from_htmlrW   N   s?   $7 ME6j!JTD1 K		 a**##%5F)KL%j1 	)LAyYIII	 2 2 4567$$]3!fQsG4$88HOOXO/x(	) 	 7  L
 	 s#   D CD"	DDD"D,N)$   )r   intreturnz.'ImageFont.FreeTypeFont | ImageFont.ImageFont')r.   rY   r/   rY   r   ztuple[int, int, int]r)   r-   r0   r   rZ   r   )rM   
list[Path]r   ztuple[int, int]rN   r   rZ   r[   )__doc__
__future__r   pathlibr   typingr   PILr   r   r   r
   r   r8   rW    r9   r   <module>rb      s    #    + + $'''  ' 	'
 ' 
'T//
/ / 	/r9   