
    i#                        d Z ddlmZ ddlZddlZddlZddlZddlmZ ej                  j                  dd       ddlZddlZddlmZ  ed      Zedz  Zed	z  Zed
z  ZdZdZdZg dZddZddZddZddZddZddZedk(  r e        yy)u
  Concept #08 Emotional Narrative - 하이브리드 이미지 생성 스크립트.

파이프라인:
1. Gemini API로 따뜻한 파스텔 배경 사진 생성 → bg.jpg
2. HTML 템플릿에 배경 이미지 삽입
3. Playwright로 1080x1080 PNG 캡처 → sample.png
    )annotationsN)Pathz&/home/jay/workspace/tools/ai-image-gen)sync_playwrightzJ/home/jay/workspace/output/meta-ads/concept-catalog/08-emotional-narrativezbg.jpgztemplate.htmlz
sample.pngz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languageaL  Warm pastel lifestyle photo, soft afternoon sunlight streaming through a window, a clean wooden desk with a cup of coffee and an open notebook, cream and amber tones, shallow depth of field, calm and hopeful mood, no people, no text, suitable for financial service advertisement background, 1080x1080px square format, photorealistic)z)gemini-2.0-flash-preview-image-generationzgemini-3-pro-image-previewzgemini-3.1-flash-image-previewzimagen-3.0-generate-001c           
        t        d       t        D ]  }t        d|        t         d| d}d|  dd}dd	t        igigd
ddgid}	 t	        j
                  |||d      }|j                  dv rt        d|j                   d       {|j                          |j                         }|j                  dg       }|st        d       |d   j                  di       j                  dg       }t        d |D        d      }	|	8|D 
cg c]  }
d	|
v s|
j                  d	d       }}
t        d|dd  d       -|	d   j                  dd      }t        j                  |	d   d         }d |v rt        j                  d!      }nt        }|j                  |       |t        k7  r|j!                  t               t        d"t         d#t#        |      d$d%| d&        y' y*c c}
w # t        j$                  $ r.}t        d(|j&                  j                   d       Y d}~d}~wt(        $ r}t        d)| d       Y d}~5d}~ww xY w)+uJ   Gemini API로 배경 이미지를 생성하고 BG_PATH에 저장합니다.u(   [배경 생성] Gemini API 호출 중...u     모델 시도: z/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-TypepartstextresponseModalitiesIMAGETEXT)contentsgenerationConfigx   )headersjsontimeout)i  i  i  z  HTTP u    - 다음 모델로 시도
candidatesu-     candidates 없음 - 다음 모델로 시도r   contentc              3  *   K   | ]  }d |v s|  yw)
inlineDataN ).0ps     p/home/jay/workspace/.worktrees/task-2116-dev1/output/meta-ads/concept-catalog/08-emotional-narrative/generate.py	<genexpr>z$generate_bg_image.<locals>.<genexpr>O   s     EQ<13DqEs   	N u&     이미지 파트 없음. 텍스트:    r   mimeTypez
image/jpegdatapngz.pngu     [OK] 배경 저장: z (,z bytes, )Tu     HTTP 오류: u
     오류: F)printMODELSGEMINI_API_BASE	BG_PROMPTrequestspoststatus_coderaise_for_statusr   getnextbase64	b64decodeBG_PATHwith_suffixwrite_bytesrenamelen	HTTPErrorresponse	Exception)tokenmodel_idurlr   payloadrespr   r   r   
image_partr   
text_parts	mime_typeimage_bytes	save_pathes                   r   generate_bg_imagerB   1   ss   	
45 6!(,- !(3CD&ug..

 "VY$7#89:!57H I

*	==gGSQD?2 0 011KLM!!#99;D,3JEFqM%%i488"EEE%EtLJ!9>NA&A+aeeFB/N
N>z"1~>NNhij"<044ZNI **:l+CF+KLK 	!#//7	#	!!+.G#  )*7)2c+6Fq5IR[Q\\]^__6p 9 O* !! 	OAJJ$:$:#;;UVW 	Jqc!;<=	sP   A G*?G*>G*	G%G%)G*?B"G*%G**I=#H&&I2IIc           
        t        d       t        j                  d      }d| j                          }|j	                  d|      }t
        dz  }|j                  |d       t               5 }|j                  j                         }	 |j                  ddd	      }|j                  d|j                          d
       |j                  d       |j                  t        t              dddddd       t        dt                |j!                          	 ddd       y# |j!                          w xY w# 1 sw Y   yxY w)uA   Playwright로 HTML 템플릿을 1080x1080 PNG로 캡처합니다.u,   [HTML 렌더링] Playwright 캡처 시작...zutf-8)encodingzfile://BG_IMAGE_URLztemplate_rendered.html8  )widthheight)viewportnetworkidle)
wait_untili  r    r   )xyrG   rH   )pathtypeclipu     [OK] PNG 저장: N)r#   TEMPLATE_PATH	read_textresolvereplace
OUTPUT_DIR
write_textr   chromiumlaunchnew_pagegotowait_for_timeout
screenshotstrSAMPLE_PATHclose)bg_pathtemplate_contentbg_urlrendered_content	temp_htmlr   browserpages           r   render_html_to_pngrg   p   s2   	
89 %...@w()*F'//G 55I)G<		 
a**##%	##tt-L#MDII	 1 1 345-IP!!$'OO[!1!RS^bnrDsOt'}56MMO
 
 MMO
 
s%   -D:	BD%D:%D77D::Ec            
     F   	 ddl m}  | j                  t              5 }|j                  \  }}t        d| d| d|dk(  r|dk(  rdnd d	       d
d
d
       y
# 1 sw Y   y
xY w# t        $ r4 t        j                         j                  dz  }t        d|dd       Y y
w xY w)u"   출력 이미지 해상도 확인.r   Imageu   [검증] 해상도: rL   zpx (rF   OKMISMATCHr"   Ni   u   [검증] 파일 크기: z.0fu'    KB (PIL 없어서 해상도 미확인))	PILrj   openr^   sizer#   ImportErrorstatst_size)rj   imgwhsize_kbs        r   verify_outputrw      s    _ZZ$ 	h88DAq(1QCtAI!t)DYc3ddefg	h 	h 	h  _""$,,t3(5\]^_s.   A# 1AA# A A#  A# #:B B c                 J   t        d       t        d       t        d       t        j                  dd       t        d       	 t        j                  t
              } t        dt        |        d       t        d       t        j                         }t               }|s)t        d       t                t        j                         }|s t        d       t        j                  d       t        j                         |z
  }t        d|dd       t        d       t!        t               t        d       t#                t        d       t        d       t        dt                t        dt$                t        dt&                t        d       y # t        $ r~}t        d|        t        d	       	 t        j                         } t        d
       n9# t        $ r-}t        d|        t        j                  d       Y d }~nd }~ww xY wY d }~d }~ww xY w)Nz<============================================================uB   Concept #08 Emotional Narrative - 하이브리드 이미지 생성T)parentsexist_oku!   
[인증] SA 토큰 획득 중...u      토큰 획득 성공 (길이: z chars)u     SA 토큰 실패: u     gcloud CLI fallback 시도...u!     gcloud CLI 토큰 획득 성공u     인증 완전 실패: r   u(   
[Step 1] Gemini 배경 이미지 생성uQ     Gemini 이미지 생성 실패. 폴백: 크림 그라디언트 배경 생성...u$   배경 생성 완전 실패. 종료.u     소요 시간: z.1fu   초u/   
[Step 2] HTML 오버레이 합성 (Playwright)u	   
[검증]z=
============================================================u   생성 완료!u     배경:    u     템플릿:  u     최종:    )r#   rU   mkdirgcloud_authget_service_account_tokenGEMINI_SCOPEr3   r6   get_access_tokensysexittimerB   _generate_fallback_bgr/   existsrg   rw   rQ   r^   )r7   rA   e2startsuccesselapseds         r   mainr      s   	(O	
NO	(OTD1 

./55lC0UGDE 

56IIKE&Gab.."45iikE!G	gc]#
./ 

<=w 
,O	/	
	M'
#$	N=/
*+	M+
'(	(OS  $QC()/0	002E57 	,RD12HHQKK	sB   1F 	H"$H>GH	H'#H
HHHH"c                     	 ddl m} m}m} ddl}t        d       | j                  dd      }|j                  |      }t        d      D ]V  }|dz  }t        d|d	z  z
        }t        d
|dz  z
        }	t        d|dz  z
        }
|j                  d|fd|fg||	|
f       X |j                  |j                  d            }|j                  t        t              dd       t        dt                y# t         $ r t#                Y yw xY w)u`   Pillow로 따뜻한 크림 그라디언트 배경을 생성합니다 (Gemini 실패 시 폴백).r   )rj   	ImageDrawImageFilterNu6     [폴백] Pillow로 크림 파스텔 배경 생성...RGBrF   rF   rF            <      d   )fill   )radiusJPEG_   qualityu     [OK] 폴백 배경 저장: )rm   rj   r   r   randomr#   newDrawrangeintlinefilterGaussianBlursaver]   r/   rp   _generate_solid_bg)rj   r   r   r   rs   drawrM   trgbs              r   r   r      s   55FGii|,~~c" t 	;ADAC!b&L!AC!b&L!AC!c'M"AII1vay)Aq	I:	; jj111;<Wvr2-gY78 s   C4C7 7DDc                     ddl } ddl}d\  }}d\  }}}t        d       dd}	  |t        |||f||f       y# t        $ r Y yw xY w)u7   최소한의 단색 배경 JPEG 생성 (최후 폴백).r   Nr   )r   r   r   uJ     [폴백] 배경 이미지 없이 단색 배경으로 렌더링합니다.c                p    ddl m} |j                  d||      }|j                  t	        |       dd       y )Nr   ri   r   r   r   r   )rm   rj   r   r   r]   )rN   colorro   rj   rs   s        r   create_solid_pngz,_generate_solid_bg.<locals>.create_solid_png   s-    iitU+TFB/    )rN   r   r   tuplero   r   returnNone)structzlibr#   r/   r6   )r   r   rt   ru   r   r   r   r   s           r   r   r      sX     DAqGAq! 

VW0
1a)aV4 s   8 	AA__main__)r7   r]   r   bool)r`   r   r   r   )r   r   )__doc__
__future__r   r-   r   r   r   pathlibr   rN   insertr|   r'   playwright.sync_apir   rU   r/   rQ   r^   r%   r~   r&   r$   rB   rg   rw   r   r   r   __name__r   r   r   <module>r      s    #   
   ; <   /^_

x
_,<'DD0 

<~4	_5p62 zF r   