
    &<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d      Zedz  Zedz  Z	edz  Z
dZd Zd	ed
efdZded
dfdZd
efdZd Zedk(  r e        yy)uI   컨셉 #06 다크 프리미엄 - 배경 생성 + HTML 오버레이 합성    N)PathzC/home/jay/workspace/output/meta-ads/concept-catalog/06-dark-premiumzbg.pngztemplate.htmlz
sample.pngc                  P   t         j                  j                  d      } | r| S t        d      }|j	                         rh|j                         j                         D ]G  }|j                  d      s|j                  dd      d   j                         j                  d      c S  y)u   GEMINI_API_KEY 로드GEMINI_API_KEYz/home/jay/workspace/.envzGEMINI_API_KEY==   "N)
osenvirongetr   exists	read_text
splitlines
startswithsplitstrip)keyenv_pathlines      n/home/jay/workspace/.worktrees/task-2057-dev2/output/meta-ads/concept-catalog/06-dark-premium/gen_concept06.pyget_api_keyr      s     **..)
*C

./H&&(335 	@D01zz#q)!,224::3??	@     api_keyreturnc           	      V   t        d       d}g d}d|d    d|  }t        d|d           dd	|igigd
ddgid}d}|D ]x  }d| d|  }t        d|        	 t        j                  ||d      }|j                  dv rt        d|j                   d       Z|j	                          t        d|         n ||j                  dk7  rt        d       y|j                         }	|	j                  dg       }
|
st        d|	        y|
d   j                  di       j                  dg       }d}|D ]
  }d|v s|} n |s3|D cg c]  }d	|v s|j                  d	d       }}t        d|        y|d   j                  d d!      }t        j                  |d   d"         }d#|v rt        }n	t        d$z  }|j                  |       t        d%| d&t        |      d'd(| d)       y*# t        j
                  $ r Y t        $ r}t        d|        Y d}~d}~ww xY wc c}w )+u%   Gemini API로 배경 이미지 생성u5   [Step 1] Gemini API로 배경 이미지 생성 중...ui  Ultra premium dark navy financial background. Deep midnight blue gradient from very dark navy #0A1628 at edges to slightly lighter #1a1a2e at center. Extremely subtle tiny gold dust particles scattered throughout, barely visible. Abstract geometric thin gold hairline lines in lower third only — very faint diagonal grid pattern. Luxury financial institution aesthetic. No text, no numbers, no logos, no faces, no objects, no charts. Pure abstract dark background. Extremely refined and sophisticated. Slight vignette darkening at all four corners. 1080x1080 square format. Photorealistic ultra high quality render.)zgemini-2.5-flash-imagezgemini-3-pro-image-previewzgemini-3.1-flash-image-previewz8https://generativelanguage.googleapis.com/v1beta/models/r   z:generateContent?key=u
     모델: partstextresponseModalitiesIMAGETEXT)contentsgenerationConfigNu     시도 중: x   )jsontimeout)i  i  z  -> u'    접근 불가, 다음 모델 시도...u     -> 성공: u     -> 오류:    u   [오류] 모든 모델 실패F
candidatesu   [오류] candidates 없음: content
inlineData u-   [오류] 이미지 파트 없음. 텍스트: mimeTypez
image/jpegdatapngbg.jpgu   [완료] 배경 저장:  (,z bytes, )T)printrequestspoststatus_coderaise_for_status	HTTPError	Exceptionr#   r   base64	b64decodeBG_PATH
OUTPUT_DIRwrite_byteslen)r   promptmodels_to_tryurlpayloadrespmodel_idtry_urler+   r&   r   
image_partp
text_parts	mime_type	img_bytes	save_paths                     r   generate_backgroundrL   $   s   	
AB
	4 M E]STEUDVVklskt
uC	J}Q'(
)*  01231GV3DEG
 D! LXJVklsktuxj)*	==wDD:-d..//VWX!!#M(,-" |t''3.-/99;D,+J,TF34qMi,00"=EJ 1J
 16FA&A+aeeFB'F
F=j\JK<(,,ZFI  L!9&!ABI 		)	)$	$YKr#i.1C8I;VW
XYO !! 	 	M!%&	, Gs0   ?G,G,	H&H&,H#H#
HH#bg_pathc                     t        d       d| j                          }d| d}t        j                  |d       t        dt                y)	u"   HTML 오버레이 템플릿 생성u2   [Step 2] HTML 오버레이 템플릿 생성 중...file://u2  <!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1080">
<title>컨셉 #06 다크 프리미엄</title>
<link rel="preconnect" href="https://cdn.jsdelivr.net">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable.min.css">
<style>
  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }

  body {
    width: 1080px;
    height: 1080px;
    overflow: hidden;
    background: #0A1628;
    font-family: 'Pretendard Variable', 'Pretendard', 'Noto Sans KR', -apple-system, sans-serif;
  }

  .canvas {
    position: relative;
    width: 1080px;
    height: 1080px;
    overflow: hidden;
  }

  /* 배경 이미지 */
  .bg {
    position: absolute;
    inset: 0;
    background-image: url('u  ');
    background-size: cover;
    background-position: center;
  }

  /* 배경 위 그라디언트 오버레이 - 가독성 향상 */
  .bg-overlay {
    position: absolute;
    inset: 0;
    background: linear-gradient(
      135deg,
      rgba(10, 22, 40, 0.82) 0%,
      rgba(10, 22, 40, 0.65) 50%,
      rgba(26, 26, 46, 0.55) 100%
    );
  }

  /* 메인 콘텐츠 컨테이너 */
  .content {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    padding: 72px 80px 64px 80px;
  }

  /* ── 상단 영역 (15%) ── */
  .section-top {
    height: 162px;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    gap: 16px;
  }

  .top-line {
    width: 48px;
    height: 1px;
    background: #D4A855;
  }

  .brand-label {
    font-size: 13px;
    font-weight: 500;
    letter-spacing: 0.35em;
    color: #D4A855;
    text-transform: uppercase;
  }

  /* ── 중상단 영역 (38%) ── */
  .section-mid-top {
    flex: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 18px;
    padding-top: 8px;
  }

  .sub-tag {
    font-size: 15px;
    font-weight: 500;
    letter-spacing: 0.22em;
    color: #D4A855;
    text-transform: uppercase;
  }

  .headline {
    display: flex;
    flex-direction: column;
    gap: 6px;
  }

  .headline-line {
    font-size: 46px;
    font-weight: 700;
    line-height: 1.2;
    color: #F0F4F8;
    letter-spacing: -0.01em;
  }

  .divider-line {
    width: 100%;
    height: 1px;
    background: rgba(212, 168, 85, 0.25);
    margin: 6px 0;
  }

  .emphasis-block {
    display: flex;
    flex-direction: column;
    gap: 6px;
  }

  .emphasis-number {
    font-size: 64px;
    font-weight: 800;
    line-height: 1.0;
    color: #D4A855;
    letter-spacing: -0.02em;
  }

  .emphasis-desc {
    font-size: 15px;
    font-weight: 400;
    color: #8899AA;
    letter-spacing: 0.05em;
  }

  /* ── 중하단 영역 (30%) - 데이터 바 ── */
  .section-data {
    height: 220px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 28px;
  }

  .data-section-label {
    font-size: 11px;
    font-weight: 500;
    letter-spacing: 0.25em;
    color: rgba(136, 153, 170, 0.6);
    text-transform: uppercase;
    margin-bottom: -8px;
  }

  .bar-item {
    display: flex;
    flex-direction: column;
    gap: 10px;
  }

  .bar-header {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
  }

  .bar-label {
    font-size: 14px;
    font-weight: 500;
    color: #8899AA;
    letter-spacing: 0.02em;
  }

  .bar-value {
    font-size: 18px;
    font-weight: 700;
    color: #D4A855;
    letter-spacing: 0.01em;
  }

  .bar-track {
    width: 100%;
    height: 8px;
    background: rgba(212, 168, 85, 0.12);
    border-radius: 4px;
    overflow: hidden;
  }

  .bar-fill-1 {
    height: 100%;
    width: 80%;
    background: linear-gradient(to right, #B5965A, #D4A855);
    border-radius: 4px;
  }

  .bar-fill-2 {
    height: 100%;
    width: 90%;
    background: linear-gradient(to right, #B5965A, #D4A855, #E8C070);
    border-radius: 4px;
  }

  /* ── 하단 영역 (17%) ── */
  .section-bottom {
    height: 130px;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    gap: 20px;
  }

  .cta-divider {
    width: 100%;
    height: 1px;
    background: rgba(212, 168, 85, 0.2);
  }

  .cta-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
  }

  .cta-button {
    display: inline-flex;
    align-items: center;
    padding: 14px 44px;
    border: 1px solid #D4A855;
    border-radius: 2px;
    font-size: 15px;
    font-weight: 600;
    letter-spacing: 0.12em;
    color: #D4A855;
    background: transparent;
    text-decoration: none;
    cursor: pointer;
  }

  .cta-arrow {
    margin-left: 10px;
    font-size: 13px;
    opacity: 0.7;
  }

  .footnote {
    font-size: 11px;
    font-weight: 400;
    color: rgba(136, 153, 170, 0.65);
    letter-spacing: 0.04em;
    line-height: 1.5;
  }

</style>
</head>
<body>
<div class="canvas">
  <!-- 배경 이미지 -->
  <div class="bg"></div>
  <!-- 오버레이 -->
  <div class="bg-overlay"></div>

  <!-- 메인 콘텐츠 -->
  <div class="content">

    <!-- 상단: 브랜드 아이덴티티 -->
    <div class="section-top">
      <div class="top-line"></div>
      <div class="brand-label">T.O.P &nbsp;사업단</div>
    </div>

    <!-- 중상단: 헤드라인 + 강조 수치 -->
    <div class="section-mid-top">
      <div class="sub-tag">경력직 정착지원금</div>

      <div class="headline">
        <div class="headline-line">당신의 경력이 드디어</div>
        <div class="headline-line">제대로 평가받습니다</div>
      </div>

      <div class="divider-line"></div>

      <div class="emphasis-block">
        <div class="emphasis-number">직전연봉 50%</div>
        <div class="emphasis-desc">경력직 정착지원금 지원 한도</div>
      </div>
    </div>

    <!-- 중하단: 데이터 시각화 바 -->
    <div class="section-data">
      <div class="data-section-label">지원금 비교</div>

      <!-- Bar 1: 신입 -->
      <div class="bar-item">
        <div class="bar-header">
          <span class="bar-label">신입 정착지원금</span>
          <span class="bar-value">최대 1,000만원</span>
        </div>
        <div class="bar-track">
          <div class="bar-fill-1"></div>
        </div>
      </div>

      <!-- Bar 2: 경력직 -->
      <div class="bar-item">
        <div class="bar-header">
          <span class="bar-label">경력직 정착지원금</span>
          <span class="bar-value">직전연봉 50%</span>
        </div>
        <div class="bar-track">
          <div class="bar-fill-2"></div>
        </div>
      </div>
    </div>

    <!-- 하단: CTA -->
    <div class="section-bottom">
      <div class="cta-divider"></div>
      <div class="cta-row">
        <div class="cta-button">
          지금 상담 신청하기
          <span class="cta-arrow">→</span>
        </div>
      </div>
      <div class="footnote">
        ⚠ 2026.7월 조건 변경 예정 &nbsp;|&nbsp; 코스닥 상장사 인카금융서비스
      </div>
    </div>

  </div>
</div>
</body>
</html>zutf-8)encodingu    [완료] HTML 템플릿 저장: N)r1   resolveTEMPLATE_PATH
write_text)rM   bg_urlhtmls      r   create_html_templaterV   |   sa    	
>?w()*F"D #8 p$ERDh
 TG4	,]O
<=r   c            
         t        d       	 ddlm}  dt        j                          }	  |        5 }|j                  j                  ddg	      }|j                  d
d
d      }|j                  |dd       |j                  d       |j                  t        t              dddd
d
d       |j                          ddd       t        j                         j                   dz  }t        dt         d|dd       y# t        $ r t        d       Y yw xY w# 1 sw Y   \xY w# t"        $ r}t        d|        Y d}~yd}~ww xY w)u#   Playwright로 HTML을 PNG로 캡처u5   [Step 3] Playwright로 최종 이미지 캡처 중...r   )sync_playwrightu8   [오류] playwright가 설치되어 있지 않습니다.FrO   z--no-sandboxz--disable-setuid-sandbox)argsi8  )widthheight)viewportnetworkidlei:  )
wait_untilr$   i	  r,   )xyrZ   r[   )pathtypeclipNi   u"   [완료] 최종 이미지 저장: r.   z.0fz KB)Tu#   [오류] Playwright 캡처 실패: )r1   playwright.sync_apirX   ImportErrorrR   rQ   chromiumlaunchnew_pagegotowait_for_timeout
screenshotstr
FINAL_PATHclosestatst_sizer7   )rX   template_urlrG   browserpagesize_kbrE   s          r   capture_finalru     sD   	
AB7
 ]22456L 	!jj''n>X-Y'ZG##tt-L#MDIIl}eIL!!$'OOZuQR]amqCrOsMMO	 //#++d22:,bTRS%  HI	 	  3A378sA   D D( BDA D( DDD%!D( (	E	1EE	c                     t        d       t        d       t        d       t        j                  dd       t               } | s t        d       t	        j
                  d       t        dt        |        d       t        |       }t        j                         rt        nt        d	z  }|j                         sd }t        |xs t               t               }t        d
       t        d       t        d       t        d|rdnd dt         d       t        dt                t        d|rdnd dt                |rt        d       y t        d       y )Nz<============================================================u,   컨셉 #06 다크 프리미엄 생성 시작T)parentsexist_oku3   [오류] GEMINI_API_KEY를 찾을 수 없습니다.r   u(   [인증] API 키 로드 완료 (길이: z chars)r-   z=
============================================================u   생성 결과u     배경 이미지: OKSKIPu    → z/bg.*u     HTML 템플릿: OK → u     최종 이미지: FAILu$   
[SUCCESS] 컨셉 #06 생성 완료!u?   
[PARTIAL] 일부 단계 실패. 파일을 확인해 주세요.)r1   r;   mkdirr   sysexitr=   rL   r:   r   rV   ru   rR   rm   )r   bg_ok	actual_bgfinal_oks       r   mainr     s    	(O	
89	(OTD1 mGCD	4S\N'
JK  (E #>>+h1FI	-g. H	/	/	(O	 F ;5E
RS	%m_
56	 v >eJ<
PQ56PQr   __main__)__doc__r8   r	   r}   pathlibr   r2   r;   r:   rR   rm   r   r   rl   boolrL   rV   ru   r   __name__ r   r   <module>r      s    O  	 
   WX

x
_,,&
  T T Tp[>$ [>4 [>~
t @%RP zF r   