
    ?i                     >   d Z ddlZddlZddlZddlmZ ddlZej                  j                  d e	 ee
      j                               ddlZddlmZmZmZmZ eZdZeZdZdZeZedz  Z ed	      Zd
ZdZde	de	defdZdede	deddfdZd Ze dk(  r e        yy)uC   컨셉 #31 — 어스 트루스 (Patagonia Style) 이미지 생성.    N)Path)
CTA_MIN_PXHEAD_SUB_RATIOSUBHEAD_MIN_PXWORKSPACE_ROOT*   \   gffffff?z=output/meta-ads/concept-catalog/31-patagonia-style/sample.pngz/tmp/concept31_overlay.htmlaU  Vast mountain landscape at golden hour, dramatic natural lighting, earthy warm tones with deep forest greens and warm browns, open field or mountain vista, natural and unfiltered color grading, slight film grain texture, documentary outdoor photography style, panoramic view, no text, no words, no letters, no people, 1080x1080 square formatu  <!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=1080"/>
  <title>Concept 31 - Patagonia Style</title>
  <style>
    @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;700;800;900&display=swap');

    *, *::before, *::after {{ box-sizing: border-box; margin: 0; padding: 0; }}

    html, body {{
      width: 1080px;
      height: 1080px;
      overflow: hidden;
      -webkit-font-smoothing: antialiased;
    }}

    body {{
      position: relative;
      background: #E8DCC8;
    }}

    /* 배경 이미지 레이어 */
    #bg-layer {{
      position: absolute;
      inset: 0;
      z-index: 0;
      background-image: url('{bg_url}');
      background-size: cover;
      background-position: center center;
      background-repeat: no-repeat;
    }}

    /* 하단 그라디언트 오버레이 (하단 40%) */
    #gradient-overlay {{
      position: absolute;
      inset: 0;
      z-index: 1;
      background: linear-gradient(
        to bottom,
        transparent 40%,
        rgba(28, 46, 28, 0.55) 65%,
        rgba(28, 46, 28, 0.85) 100%
      );
    }}

    /* 상단 좌측 코너 태그 */
    .corner-tag {{
      position: absolute;
      top: 52px;
      left: 52px;
      z-index: 4;
      background: rgba(74, 139, 139, 0.82);
      padding: 10px 22px;
      border-radius: 4px;
    }}

    .corner-tag span {{
      font-family: 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
      font-size: {_CTA_PX}px;
      font-weight: 700;
      color: #FFFFFF;
      letter-spacing: 0.12em;
      text-transform: uppercase;
    }}

    /* 하단 텍스트 영역 */
    .bottom-zone {{
      position: absolute;
      bottom: 0;
      left: 0;
      right: 0;
      z-index: 3;
      padding: 0 64px 72px 64px;
      display: flex;
      flex-direction: column;
      align-items: flex-start;
    }}

    /* 핵심 메시지 */
    .headline {{
      font-family: 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
      font-size: {_SIZE_92PX}px;
      font-weight: 800;
      line-height: {_LH_1_15};
      color: #FFFFFF;
      letter-spacing: -0.02em;
      white-space: pre-line;
      margin-bottom: 28px;
      text-shadow: 0 2px 16px rgba(0,0,0,0.4);
    }}

    /* 보조 메시지 */
    .subtext {{
      font-family: 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
      font-size: {_SUBHEAD_PX}px;
      font-weight: 400;
      line-height: {_LH_RATIO};
      color: #E8DCC8;
      letter-spacing: -0.01em;
      margin-bottom: 36px;
      text-shadow: 0 2px 8px rgba(0,0,0,0.35);
    }}

    /* 구분선 */
    .divider {{
      width: 64px;
      height: 3px;
      background-color: #D4541A;
      margin-bottom: 28px;
    }}

    /* CTA */
    .cta {{
      font-family: 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
      font-size: {_SIZE_42PX}px;
      font-weight: 700;
      color: #D4541A;
      letter-spacing: 0.02em;
    }}
  </style>
</head>
<body>
  <div id="bg-layer"></div>
  <div id="gradient-overlay"></div>

  <!-- 상단 좌측 태그 -->
  <div class="corner-tag">
    <span>CAREER CHANGE</span>
  </div>

  <!-- 하단 텍스트 영역 -->
  <div class="bottom-zone">
    <div class="headline">열심히는 하는데,&#10;월급은 제자리걸음?</div>
    <div class="subtext">당신의 노력만큼 보상받고 계십니까?</div>
    <div class="divider"></div>
    <div class="cta">지금 확인하기 →</div>
  </div>
</body>
</html>tokenpromptreturnc                 @   g d}d|  dd}dd|igigddd	gid
}d}d}|D ]  }d| d}t        d| d       t        j                         }		 t        j                  |||d      }|j                  dv r&t        d|j                   d       |j                  }z|j                          t        j                         |	z
  }
t        d|
dd        n t        d|       |j                         }|j                  dg       }|st        dt        |      dd        |d   j                  di       j                  dg       D ]#  }d|v st        j                  |d   d         c S  t        d       # t        $ r}|}t        d| d       Y d}~vd}~ww xY w)!u&   Gemini API로 배경 이미지 생성.)zgemini-3-pro-image-previewzgemini-3.1-flash-image-previewzgemini-2.5-flash-imagezBearer zapplication/json)AuthorizationzContent-TypepartstextresponseModalitiesIMAGETEXT)contentsgenerationConfigNz8https://generativelanguage.googleapis.com/v1beta/models/z:generateContentu0     [Gemini] 배경 이미지 생성 중 (모델: z)...i,  )headersjsontimeout)i  i  z  [Gemini] u    — 다음 모델 시도...u     [Gemini] 완료 (z.1fu   초)u     [Gemini] 오류: u(   모든 모델 실패. 마지막 오류: 
candidateszNo candidates: r   content
inlineDatadatau.   이미지 데이터가 응답에 없습니다.)printtimerequestspoststatus_coderaise_for_status	ExceptionRuntimeErrorr   getstrbase64	b64decode)r
   r   	model_idsr   payloadlast_errrespmodel_idurlstartelapseder   r   parts                  A/home/jay/workspace/tools/ai-image-gen/gen_concept31_patagonia.pygenerate_bg_imager4      s   I #5'**G
  01231GV3DEG
 HD RH
Rbc@
$OP			==gGSQD:-D$4$4#55QRS++!!#iikE)G'}D9:R& EhZPQQ99;D,+J_SYt_,=>??1!!)R044WbA @4##D$6v$>??@ G
HH!  	H's*FGH	s   AE87E88	FFFbg_byteshtml_templateoutput_pathc                    ddl m} ddl}|j                  |       j	                         }d| }|j                  |      }t        j                  |d       t        dt                |j                  j                  d	d	
        |       5 }|j                  j                         }		 |	j                  ddd      }
|
j                  dt         d       |
j                  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'   HTML + Playwright로 최종 PNG 생성.r   )sync_playwrightNzdata:image/jpeg;base64,)bg_urlzutf-8)encodingu     [HTML] 템플릿 저장: T)parentsexist_oki8  )widthheight)viewportzfile://networkidle)
wait_untili  png)pathtypeu     [PNG] 저장 완료: )playwright.sync_apir9   r'   	b64encodedecodeformat	HTML_PATH
write_textr   parentmkdirchromiumlaunchnew_pagegotowait_for_timeout
screenshotr&   close)r5   r6   r7   r9   b64bg_b64bg_data_urlhtml_contentpbrowserpages              r3   render_html_to_pngr\      s+   3]]8$++-F+F84K ''{';L8	'	{
34TD9		 	a**##%	##tt-L#MDII	{+IF!!$'OO[!1O>+K=9:MMO	 	 MMO	 	s%   E*A*D.E.E  EEc                     t        d       t        d       t        j                  d      } t        dt        |        d       t        d       t	        | t
              }t        dt        |      dd	       t        d
       t        |t        t               t        j                         j                  dz  }t        dt         d|dd       y )NuC   === 컨셉 #31 어스 트루스 (Patagonia Style) 생성 시작 ===u%   
[1/3] Gemini 인증 토큰 획득...z3https://www.googleapis.com/auth/generative-languageu      토큰 획득 성공 (길이: u   자)u!   
[2/3] 배경 이미지 생성...u     배경 이미지 크기: ,z bytesu1   
[3/3] HTML 오버레이 합성 및 PNG 저장...i   u   
=== 완료: z (z.0fz KB) ===)r   gcloud_authget_service_account_tokenlenr4   	BG_PROMPTr\   HTML_TEMPLATEOUTPUT_PATHstatst_size)r
   r5   size_kbs      r3   mainrh      s    	
OP	
2311=E 
,SZL
=>	
./ 	2H	'Ha'8
?@	
>?x< ((4/G	N;-r'#h
?@    __main__)!__doc__r'   sysr   pathlibr   r   rD   insertr&   __file__rL   r_   
gen_configr   r   r   r   _CTA_PX
_SIZE_42PX_SUBHEAD_PX
_SIZE_92PX_LH_1_15	_LH_RATIOrd   rJ   rb   rc   bytesr4   r\   rh   __name__ ri   r3   <module>rz      s    I  
    3tH~,,- .  Q Q 

	 ^^./	H 
L^0IS 0I# 0I% 0If s  RV 4A( zF ri   