
    i+                    L   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 ddl	Z	ddl
mZ  ee      j                  Zej                  j!                  d ee             ddlZedz  Zedz  Zedz  Zed	z  Zed
z  Zg dZdZdZ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   컨셉 #18 Portrait-Text Hybrid v2 생성 스크립트.

1. Gemini API로 배경(인물 사진) 생성
2. HTML 템플릿 + Playwright로 텍스트 오버레이 합성
3. sample-v2.png 및 18-portrait-text-v2.png 저장
    )annotationsN)Path)WORKSPACE_ROOTz0output/meta-ads/concept-catalog/18-portrait-textztemplate-v2.htmlz	bg_v2.jpgzsample-v2.pngz18-portrait-text-v2.png)z)gemini-2.0-flash-preview-image-generationzgemini-2.0-flash-expzimagen-3.0-generate-002z0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languageae  Professional Korean businessman in white dress shirt, mid-30s, confident warm smile, standing in bright modern office with large windows, soft natural lighting, man positioned on right side of frame, clean corporate look, upper body portrait, 1080x1080, photorealistic, high quality, professional photography, bokeh background, bright airy office atmospherec                 f   t        j                  d      } | st        d       ydD ]  }t         d| d|  }dt        igdd	d
dd}t        d| d       	 t        j                  ||d      }|j                  dk(  r|j                         }|j                  dg       }|rBd|d   v r;t        j                  |d   d         }t        d| dt        |      dd       |c S t        d| dt        |      dd         n+t        d| d|j                   d|j                  dd         
 dD ]+  }	t         d|	 d|  }ddt        igigd d!d"gid#}t        d|	 d       	 t        j                  ||d      }|j                  dk(  r|j                         }|j                  d$g       }
|
D ]n  }|j                  d%i       j                  dg       }|D ]E  }d&|v st        j                  |d&   d'         }t        d|	 dt        |      dd       |c c c S  p t        d|	 d(       n+t        d|	 d|j                   d|j                  dd)         . y# t        $ r}t        d| d|        Y d}~]d}~ww xY w# t        $ r}t        d|	 d|        Y d}~xd}~ww xY w)*u  API 키로 Gemini 이미지 생성 시도.

    우선순위:
    1. imagen-4.0-generate-001 (predict API)
    2. gemini-3-pro-image-preview (generateContent + IMAGE 모달리티)
    3. gemini-3.1-flash-image-preview (fallback)
    4. gemini-2.5-flash-image (fallback)
    GEMINI_API_KEYu)     [API Key] GEMINI_API_KEY 없음, 스킵Nzimagen-4.0-generate-001zimagen-4.0-fast-generate-001/models/z:predict?key=prompt   1:1
image/jpegsampleCountaspectRatiooutputMimeType	instances
parametersz  [API Key]     요청 중...x   )jsontimeout   predictionsbytesBase64Encodedr   
    성공! (, bytes)u    응답에 이미지 없음:  HTTP : 	    오류: zgemini-3-pro-image-previewzgemini-3.1-flash-image-previewzgemini-2.5-flash-imagez:generateContent?key=partstextresponseModalitiesIMAGETEXTcontentsgenerationConfig
candidatescontent
inlineDatadata    응답에 이미지 없음   )gcloud_authget_api_keyprintGEMINI_API_BASE	BG_PROMPTrequestspoststatus_coder   getbase64	b64decodelenstrr$   	Exception)api_keyimagen_modelurlpayloadrespr.   r   	img_bytesemodel_idr+   candr#   parts                 T/home/jay/workspace/.worktrees/task-2116-dev1/tools/ai-image-gen/gen_concept18_v2.pygenerate_bg_with_api_keyrJ   4   s+    %%&67G9: T = !,}WIN#Y/0 $".
 	\N.9:	===7C@D3&yy{"hh}b9#7;q>#I & 0 0Q@T1U VILjYPQ@RRYZ[$$\N2OPSTXPYZ^[^P_O`ab\N&9I9I8J"TYYW[X[_L]^_-=6 9
 !!(3H	R!VY$7#89:!57H I
 	XJn56	9==7C@D3&yy{!XXlB7
& -D HHY377DE % -'4/(.(8(8l9KF9S(TI!L
*S^TUDVV]"^_#,,	-- XJ.IJKXJfT5E5E4FbSWTWHYZ[39: C  	=Lis;<<	=<  	9L
)A3788	9sE   B
I#%A	I#(A9J"<J!>J#	J,JJ	J0J++J0c                   d|  dd}dD ]*  }t          d| d}ddt        igigd	d
dgid}t        d| d       	 t        j                  |||d      }|j
                  dk(  r|j                         }|j                  dg       }|D ]n  }|j                  di       j                  dg       }	|	D ]E  }
d|
v st        j                  |
d   d         }t        d| dt        |      dd       |c c c S  p t        d| d       n+t        d| d|j
                   d|j                  dd         - dD ]  }t          d| d }d!t        igd"d#d$d%d&}t        d| d       	 t        j                  |||d      }|j
                  dk(  rf|j                         }|j                  d'g       }|rBd(|d)   v r;t        j                  |d)   d(         }t        d| dt        |      dd       |c S t        d| d|j
                   d|j                  dd          y# t        $ r}t        d| d|        Y d}~;d}~ww xY w# t        $ r}t        d| d|        Y d}~3d}~ww xY w)*u3   Bearer 토큰으로 Gemini 이미지 생성 시도.zBearer zapplication/json)AuthorizationzContent-Typer"   r	   z:generateContentr#   r$   r%   r&   r'   r(   z  [Bearer] r   r   )headersr   r   r   r+   r,   r-   r.   r   r   r   r/   r   r    Nr0   r!   r   z:predictr
   r   r   r   r   r   r   r   r   )r4   r5   r3   r6   r7   r8   r   r9   r:   r;   r<   r$   r>   )tokenrM   rF   rA   rB   rC   r.   r+   rG   r#   rH   rD   rE   r@   r   s                  rI   generate_bg_with_tokenrO   ~   s    #5'**G 8
 !!(3CD!VY$7#89:!57H I
 	H:^45	8==gGSQD3&yy{!XXlB7
& -D HHY377DE % -'4/(.(8(8l9KF9S(TI!KzC	NSTCUU\"]^#,,	-- H:-HIJH:VD4D4D3ER		RVSVGXYZ38< T < !,x@#Y/0 $".
 	L>89	<==gGSQD3&yy{"hh}b9#7;q>#I & 0 0Q@T1U VIK~ZIq?QQXYZ$$K~VD4D4D3ER		RVSVGXYZ)<0 9  	8Kz1#677	82  	<K~Yqc:;;	<sC   A:H&9<H&8>H&*BI8+I&	I/II	I3I..I3c            	        t        d       t        j                         } t        j                         rt        dt                t        S t	               }|0t        d       	 t        j                  t              }t        |      }|t        d      t        j                  |       t        j                         | z
  }t        dt         dt        |      d	d
|dd       t        S # t        $ r}t        d|        Y d}~d}~ww xY w)u9   배경 이미지 생성. 성공 시 저장 경로 반환.u)   
[1단계] 배경 이미지 생성 시작u     기존 bg_v2.jpg 재사용: Nu)     [Bearer 토큰] SA 토큰 획득 중...u     [Bearer 토큰] 실패: u=   모든 Gemini API 방법으로 배경 이미지 생성 실패u     bg_v2.jpg 저장 완료:  (r   z bytes, z.1fu   초))r3   timeBG_PATHexistsrJ   r1   get_service_account_tokenGEMINI_SCOPErO   r>   RuntimeErrorwrite_bytesr<   )startrD   rN   rE   elapseds        rI   generate_backgroundr[      s    	
67IIKE ~~.wi89 )*I 9:	499,GE.u5I Z[[	"iikE!G	'y3y>!2DHWUXMY]
^_N  	4.qc233	4s   $$C+ +	D4DDc                    ddl m} t        d|j                          t        j                         st        dt               | j                         st        d|        dt        j                          }d| j                          } |       5 }|j                  j                         }	 |j                  ddd	      }|j                  |d
       |j                  d| d       |j                  d       |j                  j                  dd       |j!                  t#        |      d       t        d|        |j%                          	 ddd       y# |j%                          w xY w# 1 sw Y   yxY w)u'   Playwright로 HTML 오버레이 캡처.r   )sync_playwrightu(   
[2단계] HTML 오버레이 합성 → u   템플릿 없음: u   배경 이미지 없음: zfile://i8  )widthheight)viewportnetworkidle)
wait_untilz() => {
                const bgEl = document.getElementById('bgImage');
                if (bgEl) {
                    bgEl.style.backgroundImage = "url('z$')";
                }
            }i  T)parentsexist_okpng)pathtypeu     캡처 완료: N)playwright.sync_apir]   r3   nameTEMPLATE_PATHrT   FileNotFoundErrorresolvechromiumlaunchnew_pagegotoevaluatewait_for_timeoutparentmkdir
screenshotr=   close)bg_pathoutput_pathr]   template_urlbg_file_urlpbrowserpages           rI   capture_overlayr~      sm   3	5k6F6F5G
HI!"4]O DEE>>";G9 EFF]22456LGOO-./K		 a**##%	##tt-L#MDIIl}I= MM 8 9D} E  !!$'$$TD$AOO[!1O>%k]34MMO+ * MMO+ s%   E40BEE4E11E44E=c                    t        d       t        d       t        d       t               } t        | t               t        dt        j
                          t        j                  t        t               t        dt                t        d       t        d       t        d       t        t        fD ]2  }|j                         j                  dz  }t        d| d	|d
d       4 y )Nz<============================================================u)   컨셉 #18 Portrait-Text Hybrid v2 생성u   
[3단계] 파일 복사: u     복사 완료: z=
============================================================u   생성 완료i   z  rQ   z.0fz KB))
r3   r[   r~   SAMPLE_V2_PATH	COPY_PATHri   shutilcopy2statst_size)rw   r{   size_kbs      rI   mainr     s    	(O	
56	(O "#G G^, 
'	'7
89
LL+	i[
)* 
/	/	(Oi( +&&(""T)1#R}D)*+    __main__)returnbytes | None)rN   r=   r   r   )r   r   )rw   r   rx   r   r   None)r   r   )"__doc__
__future__r   r:   r   sysrR   pathlibr   r6   
gen_configr   __file__rs   
SCRIPT_DIRrf   insertr=   r1   
OUTPUT_DIRrj   rS   r   r   	MODEL_IDSr4   rV   r5   rJ   rO   r[   r~   r   __name__ r   rI   <module>r      s    #   
    % (^""
 3z? #  PP
//
{
"o-22		
 ED6 
GT>B>#L+2 zF r   