
    Si1                     `   d 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j                  j                  d e ee      j                               ddlZ ed      Zej#                  dd       edz  Zed	z  Zed
z  ZdZdZdZdefdZdedefdZdedefdZd Zedk(  r e        yy)u   Sample B — Impact Number 광고 배너 생성 (hybrid-image 방식)

파이프라인:
1. Gemini API → 추상 금융 배경 이미지 생성 (JPEG)
2. HTML/CSS 오버레이 → Playwright 스크린샷 → PNG 최종 합성
    N)Path)sync_playwrightz;/home/jay/workspace/output/meta-ads/angle-A/concept-samplesT)parentsexist_okzsample-B-number-bg.jpgzsample-B-number.pngzsample-B-number-template.htmlz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languagea  Abstract financial data visualization background. Dark navy blue base (#0A1628), deep midnight blue tones. Glowing gold accent lines forming rising curves and upward trending graphs. Subtle grid lines, faint data chart elements in background. Bokeh light particles, luminous gold streaks suggesting growth and momentum. Premium luxury financial atmosphere. No text, no numbers, no labels. Pure abstract atmospheric background. Cinematic quality, ultra-premium financial brand aesthetic. 1:1 square format, 1080x1080px.returnc            
         t        d       t        j                         } t        j                  t              }t        dt        |       d       g d}|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      }t        d|j                          |j                  dvrt        d|j                  dd         |j                         }|j                  dg       }	|	st        d       |	d   j                  di       j                  dg       }
t        d |
D        d      }|7|
D cg c]  }d|v s|j                  dd       }}t        d|dd         6|d    j                  d!d"      }t        j                   |d    d#         }d$|v rd%nd&}t"        j%                  |      }|j'                  |       t        j                         | z
  }t        d'|j(                   d(t        |      d)d*|d+d,       |c S  t-        d/      c c}w # t*        $ r}t        d-| d.|        Y d}~
d}~ww xY w)0u?   Gemini API로 배경 이미지를 생성하고 저장합니다.u.   [Step 1] Gemini 배경 이미지 생성 중...u#     SA 토큰 획득 완료 (길이: z chars))zgemini-2.5-flash-imagezgemini-3-pro-image-previewzgemini-3.1-flash-image-previewu     모델 시도: z/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-TypepartstextresponseModalitiesIMAGETEXT)contentsgenerationConfigx   )headersjsontimeoutu     HTTP 상태: )   u     응답 오류: Ni,  
candidatesu,     candidates 없음. 다음 모델 시도...r   contentc              3   *   K   | ]  }d |v s|  yw)
inlineDataN ).0ps     \/home/jay/workspace/.worktrees/task-2117-dev1/tools/ai-image-gen/generate_sample_b_number.py	<genexpr>z&generate_background.<locals>.<genexpr>`   s     EQ<13DqEs   	 u     이미지 없음. 텍스트:    r   mimeTypez
image/jpegdatajpegz.jpgz.pngu     배경 생성 완료:  (,z bytes, .1f   초)u	     모델 u	    오류: u"   모든 Gemini 모델 시도 실패)printtimegcloud_authget_service_account_tokenGEMINI_SCOPElenGEMINI_API_BASE	BG_PROMPTrequestspoststatus_coder   r   getnextbase64	b64decodeBG_PATHwith_suffixwrite_bytesname	ExceptionRuntimeError)starttokenmodels_to_trymodel_idurlr   payloadrespr"   r   r
   
image_partr   
text_parts	mime_typeimage_bytesextbg_pathelapsedes                       r   generate_backgroundrL   4   s   	
:;IIKE 11,?E	/E
|7
CDM " 0!(,-.	$%XhZ7GHC#*5'!2 2G &(;'<=>%9GV;L$MG
 ==gGSQDOD$4$4#567v-)$))DS/):;<99;D,3JDFqM%%i488"EEE%EtLJ!9>NA&A+aeeFB/N
N7
2A7GHI"<044ZNI **:l+CF+KLK"i/&VC))#.G,iikE)G,W\\N"S=Ma<PPXY`adXeeijkNY0d ;
<<' O  	IhZy45	sD   *BI,/I>I	H<$H<8IB I<I	I&
I!!I&rI   c                     t        d       d| j                          }d| d}t        j                  |d       t        dt        j                          t        S )u3   HTML/CSS 오버레이 템플릿을 생성합니다.u2   [Step 2] HTML 오버레이 템플릿 생성 중...file://a
  <!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=1080">
  <style>
    @import url('file:///home/jay/.local/share/fonts/Pretendard/PretendardVariable.ttf');

    @font-face {
      font-family: 'Pretendard';
      src: url('file:///home/jay/.local/share/fonts/Pretendard/Pretendard-Black.otf') format('opentype');
      font-weight: 900;
    }
    @font-face {
      font-family: 'Pretendard';
      src: url('file:///home/jay/.local/share/fonts/Pretendard/Pretendard-Bold.otf') format('opentype');
      font-weight: 700;
    }
    @font-face {
      font-family: 'Pretendard';
      src: url('file:///home/jay/.local/share/fonts/Pretendard/Pretendard-Medium.otf') format('opentype');
      font-weight: 500;
    }
    @font-face {
      font-family: 'Pretendard';
      src: url('file:///home/jay/.local/share/fonts/Pretendard/Pretendard-Regular.otf') format('opentype');
      font-weight: 400;
    }

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

    body {
      width: 1080px;
      height: 1080px;
      overflow: hidden;
      background: #0A1628;
    }

    .container {
      position: relative;
      width: 1080px;
      height: 1080px;
      overflow: hidden;
      background-image: url('u
  ');
      background-size: cover;
      background-position: center;
      background-color: #0A1628;
    }

    /* 다크 오버레이 — 배경 이미지 위에 살짝 어둡게 */
    .dark-overlay {
      position: absolute;
      inset: 0;
      background: linear-gradient(
        180deg,
        rgba(10, 22, 40, 0.55) 0%,
        rgba(10, 22, 40, 0.35) 40%,
        rgba(10, 22, 40, 0.55) 70%,
        rgba(10, 22, 40, 0.80) 100%
      );
    }

    /* 중앙 콘텐츠 블록 */
    .content-block {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -52%);
      text-align: center;
      width: 960px;
    }

    /* 임팩트 숫자 */
    .impact-number {
      font-family: 'Pretendard', 'Noto Sans KR', sans-serif;
      font-weight: 900;
      font-size: 200px;
      line-height: 0.9;
      color: #D4A843;
      letter-spacing: -4px;
      text-shadow:
        0 0 60px rgba(212, 168, 67, 0.6),
        0 0 120px rgba(212, 168, 67, 0.3),
        0 4px 30px rgba(0, 0, 0, 0.8);
      display: block;
    }

    /* 서브텍스트 — 매출 성장 */
    .sub-text {
      font-family: 'Pretendard', 'Noto Sans KR', sans-serif;
      font-weight: 500;
      font-size: 44px;
      color: #FFFFFF;
      letter-spacing: 8px;
      margin-top: 28px;
      display: block;
      text-shadow: 0 2px 12px rgba(0, 0, 0, 0.7);
      opacity: 0.92;
    }

    /* 골드 구분선 */
    .divider {
      width: 120px;
      height: 2px;
      background: linear-gradient(90deg, transparent, #D4A843, transparent);
      margin: 36px auto 0;
    }

    /* 하단 정보 */
    .bottom-info {
      position: absolute;
      bottom: 60px;
      left: 50%;
      transform: translateX(-50%);
      text-align: center;
      width: 900px;
    }

    .bottom-text {
      font-family: 'Pretendard', 'Noto Sans KR', sans-serif;
      font-weight: 400;
      font-size: 26px;
      color: rgba(255, 255, 255, 0.70);
      letter-spacing: 2px;
      text-shadow: 0 1px 8px rgba(0, 0, 0, 0.8);
    }

    .bottom-text .sep {
      color: #D4A843;
      margin: 0 12px;
      opacity: 0.8;
    }
  </style>
</head>
<body>
  <div class="container">
    <!-- 배경 오버레이 -->
    <div class="dark-overlay"></div>

    <!-- 중앙 임팩트 숫자 블록 -->
    <div class="content-block">
      <span class="impact-number">1,863%</span>
      <span class="sub-text">매출 성장</span>
      <div class="divider"></div>
    </div>

    <!-- 하단 정보 -->
    <div class="bottom-info">
      <p class="bottom-text">
        코스닥 상장
        <span class="sep">|</span>
        본부5
        <span class="sep">|</span>
        지점10
        <span class="sep">|</span>
        200+명
      </p>
    </div>
  </div>
</body>
</html>zutf-8)encodingu     HTML 템플릿 저장: )r(   resolveHTML_TEMPLATE_PATH
write_textr:   )rI   bg_urlhtmls      r   create_html_templaterU   }   so    	
>?w()*F/^ %X u&_dDL !!$!9	%&8&=&=%>
?@    	html_pathc           
         t        d       t        j                         }t               5 }|j                  j	                  ddg      }	 |j                  ddd      }d| j                          }|j                  |d	
       |j                  d       |j                  t        t              dddddd       |j                          	 ddd       t        j                         |z
  }t        j                         j                  dz  }t        dt         d|dd|dd       t        S # |j                          w xY w# 1 sw Y   wxY w)u7   Playwright로 HTML을 1080x1080 PNG로 캡처합니다.u!   [Step 3] Playwright 캡처 중...z--no-sandboxz--disable-setuid-sandbox)argsi8  )widthheight)viewportrN   networkidle)
wait_untili  pngr   )xyrZ   r[   )pathtypeclipNi   u     캡처 완료: r$   z.0fz KB, r&   r'   )r(   r)   r   chromiumlaunchnew_pagerP   gotowait_for_timeout
screenshotstr
FINAL_PATHclosestatst_size)rW   r=   r   browserpagetemplate_urlrJ   size_kbs           r   capture_with_playwrightrt   2  s*   	
-.IIKE		 
a**##.:T)U#V	##tt-L#MD$Y%6%6%8$9:LIIl}I=!!$'OOZuQR]amqCrOsMMO
 iikE!Goo''$.G	j\GC=gc]$
OP MMO
 
s$   E
A2D.<E.E  EEc                  h   t        d       t        d       t        dt                t        d       t        j                         } t               }t	        |      }t        |      }t        j                         | z
  }t        d       t        d|dd       t        d|        t        d       y )Nz<============================================================u/   Sample B — Impact Number 배너 생성 시작u   출력 경로: u   완료! 총 소요 시간: r&   u   초u   최종 파일: )r(   rl   r)   rL   rU   rt   )total_startrI   rW   
final_pathtotal_elapseds        r   mainry   M  s    	(O	
;<	OJ<
()	(O))+K "#G %W-I )3JIIK+-M	(O	'c':#
>?	OJ<
()	(OrV   __main__)__doc__r5   r   sysr)   pathlibr   r0   playwright.sync_apir   rb   insertrk   __file__parentr*   
OUTPUT_DIRmkdirr7   rl   rQ   r.   r,   r/   rL   rU   rt   ry   __name__r   rV   r   <module>r      s      
    / 3tH~,,- .  OP
 
    -
/
///
"AA DD& 
"B=T B=Rn$ n4 njt  6. zF rV   