
    Si                         d Z ddlZddlZddlZddlmZ ddlmZ ddlZ ed      Zedz  Z	dZ
dZd	Zd
dddZdefdZdeddfdZdedededefdZd Zedk(  r e        yy)u   v4-hybrid 배경 이미지 생성 스크립트.

gcloud access token으로 Gemini API를 직접 호출하여
텍스트 없는 배경 이미지 3장(bg_A, bg_B, bg_C)을 생성합니다.
    N)datetime)Pathz7/home/jay/workspace/tools/ai-image-gen/output/v4-hybridz
errors.logzgemini-3.1-flash-image-previewz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languagea  Premium corporate office environment. 100th-floor Seoul panoramic view through floor-to-ceiling windows. Golden hour lighting, warm volumetric rays. Navy and gold color scheme. Blurred background suitable for text overlay. No text, no people, no watermark. 1080x1080 square format.zLuxury private consultation room atmosphere. Dark walnut bookshelf, mahogany desk, brass lamp. Warm amber lighting. Shallow depth of field, dreamy bokeh. No text, no people. 1080x1080.zCinematic corridor scene. Dark corporate hallway with golden light streaming through open door at the end. Volumetric god-rays, dust particles. Teal and orange color grade. No text, no people. 1080x1080.ABCreturnc                      t        j                  ddddt         gddd      } | j                  j	                         }|st        d      |S )Ngcloudauthzprint-access-tokenz	--scopes=T)capture_outputtextcheckuC   gcloud auth print-access-token이 빈 토큰을 반환했습니다.)
subprocessrunGEMINI_SCOPEstdoutstripRuntimeError)resulttokens     [/home/jay/workspace/.worktrees/task-2117-dev1/tools/ai-image-gen/output/v4-hybrid/gen_bg.pyget_gcloud_access_tokenr   -   sU    ^^	6/9\N1KL	F MM!E`aaL    messagec                     t        j                         j                         }t        t        dd      5 }|j                  d| d|  d       d d d        t        d|         y # 1 sw Y   xY w)Nazutf-8)encoding[] 
z[ERROR] )r   now	isoformatopen
ERRORS_LOGwriteprint)r   	timestampfs      r   	log_errorr*   :   sc    ((*I	j#	0 .A	!I;b	,-.	HWI
. .s   A%%A.r   scenariopromptc                    t          dt         d}d|  dd}dd|igigdd	d
gid}t        d| dt         d       t        j                         }t	        j
                  |||d      }|j                          t        j                         |z
  }|j                         }	|	j                  dg       }
|
s$dd l}t        d|j                  |	      d d        |
d   j                  di       j                  dg       }t        d |D        d       }|5|D cg c]  }d|v s|j                  dd       }}t        d|d d        |d   j                  dd      }t        j                  |d   d         }d|v rdnd }t        d!| | z  }|j                  |       |j!                         j"                  }t        d| d"|j$                   d#|d$d%|d&d'| d       |t'        |      |j$                  ||t)        |d      d d(S c c}w ))Nz/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-Typepartsr   responseModalitiesIMAGETEXT)contentsgenerationConfigu   [시나리오 u   ] 요청 중... (모델: )   )headersjsontimeout
candidatesr   u   candidates 없음. 응답: i,  contentc              3   *   K   | ]  }d |v s|  yw)
inlineDataN ).0ps     r   	<genexpr>z!generate_image.<locals>.<genexpr>Z   s     =Q<1+<q=s   	 u.   이미지 데이터 없음. 텍스트 파트:    r=   mimeTypez
image/jpegdatajpegz.jpgz.pngbg_u
   ] 완료: z (,z bytes, .1fu
   초, mime=)r+   filepathfilenamefile_size_bytes	mime_typetime_secondserror)GEMINI_API_BASEMODEL_IDr'   timerequestspostraise_for_statusr8   getr   dumpsnextbase64	b64decode
OUTPUT_DIRwrite_bytesstatst_sizenamestrround)r   r+   r,   urlr7   payloadstartresponseelapsedrE   r:   r8   r/   
image_partr@   
text_partsrM   image_bytesextoutput_pathsizes                        r   generate_imagerm   A   sR   XhZ/?
@C"5'**G
  01231GV3DEG
 
N8*$=hZq
IJIIKE}}S'MHiikE!G==?D,+J8D9I$39O8PQRRqMi,00"=E=%=tDJ16FA&A+aeeFB'F
FKJWYXYNK[\]]<(,,ZFI"":l#;F#CDKi'&VCXJse44KK(%%D	N8*J{/?/?.@4((SZ[^R__ijsittu
vw $$$gq)  Gs   	H"Hc                  >   t         j                  dd       t        d       t        d       t        dt                t        dt                 t        d       t        d       	 t	               } t        dt        |        d	       g }dD ]7  }t        d| d       	 t        | |t        |         }|j%                  |       9 t        d       t        d       t        d       t'        d |D              }t        d| dd|z
   d       |D ]o  }|d   dnd}|d    r	|d    d!d"nd#}	|d$   r	|d$   d%d&nd#}
t        d'|d(    d)| d*|j)                  d+d#       d*|	 d*|
 
       |d   s_t        d,|d           q t*        j-                         rt        d-t*                y y # t        $ r5}t        d
t        |      j                   d|        t        d      |d }~ww xY w# t        j                  $ rV}d| d|j                  j                    d|j                  j"                  d d  }t        |       ||d d d d d d}Y d }~d }~wt        $ r>}d| dt        |      j                   d| }t        |       ||d d d d d d}Y d }~d }~ww xY w).NT)parentsexist_okz<============================================================u(   v4-hybrid 배경 이미지 생성 시작u   모델: u   출력 디렉토리: u+   
[인증] gcloud access token 획득 중...u'   [인증] 토큰 획득 성공 (길이: z chars)u   토큰 획득 실패: z:    r   z
[u   ] 처리 중...u   시나리오 u    HTTP 오류: z - i  )r+   rO   rJ   rK   rL   rM   rN   u	    오류: z=
============================================================u   결과 요약c              3   ,   K   | ]  }|d    	d  yw)rO   Nrq   r>   )r?   rs     r   rA   zmain.<locals>.<genexpr>   s     ;'
(:!;s   
u   성공: u   /3, 실패:    z/3rO   OKFAILrL   rH   z byteszN/ArN   rI   u   초z  [r+   r    z | rK   z         ERROR: u   
에러 로그: )r[   mkdirr'   rQ   r   len	Exceptionr*   type__name__
SystemExitrm   	SCENARIOSrS   	HTTPErrorre   status_coder   appendsumrV   r%   exists)r   eresultsr+   r   	error_msgsuccessrs   statussize_strt_strs              r   mainr   t   s   TD1	(O	
45	HXJ
 	!*
./	(O	
89#')7E
|7KL
 G# H:_-.	X#E8Yx5HIF 	v  
/	/	(O;W;;G	HWI\!g+b
9: 37+89:K8La)*1-V4RW12>1B1^$S)-AjM?"VHCj0G/HH:UXY^X_`aW:$QwZL123 !*./ G  #*47+;+;*<BqcBCm"# !! 	X'z

@V@V?WWZ[\[e[e[j[jkolo[pZqrIi "*YD^b)-DRVXF 	X'z47;K;K:LBqcRIi "*YD^b)-DRVXF	Xs=   )"F- "G.-	G+60G&&G+.JAIJ3JJ__main__)__doc__rY   r   rR   r   pathlibr   rS   r[   r%   rQ   rP   r   r}   r`   r   r*   dictrm   r   r{   r>   r   r   <module>r      s         KL
,&
+DD	E	)	)	.
 
 s  t  0# 0 0c 0d 0f10h zF r   