
    qi-Y                        d Z ddl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mZ ddl	m
Z
 ddlZddlmZ  ed      Zedz  Zed	z  Zed
z  Zedz  ZdZdZdZddddddddddd
Zdddddddd d!dd"dd#d$dd%dd&d'dd(dd)d*d+d,d-dd.d/d0ddd.d1d2dd"d.d3d4dd%d.d5d6dd(d.d7d8d9d,d-d
Zd:dd;d<d+d,d-d:d.d=d>d9d,d-d?Zd@efdAZdBedCedDedEed@eee
f   f
dFZdGedHedIedDedEed@efdJZdK ZedLk(  r e        yy)MuP   v2 Hybrid 광고 이미지 파이프라인 — Gemini 배경 + HTML 오버레이    N)datetime)Path)Any)sync_playwrightz/home/jay/workspacezoutput/campaign-top/v2-hybridz
teams/dev1zv2_carousel_template.htmlzv2_gfa_template.htmlzgemini-3.1-flash-image-previewz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languagea(  Premium modern office with floor-to-ceiling windows overlooking Seoul cityscape. Golden hour warm lighting, volumetric light rays through glass. Clean minimalist desk with premium accessories. Confident professional atmosphere. No text, no people, no watermark. Photorealistic. 1:1 square format.a  Small cramped cluttered office cubicle. Dim fluorescent lighting, grey walls. Stacks of paper on old desk, outdated monitor. Feeling of isolation and frustration. Dark moody atmosphere, desaturated cool tones. No text, no people, no watermark. Photorealistic. 1:1 square.a$  Bright modern open-plan office with collaborative workspace. Natural daylight streaming in, white and light wood interiors. Multiple screens showing data dashboards. Team energy feeling. Clean, organized, tech-forward environment. No text, no people, no watermark. Photorealistic. 1:1 square.a9  Close-up of large premium monitor screen displaying upward growth chart and analytics dashboard. Green ascending line graph, data visualization. Soft blue ambient glow from screen. Premium desk setup with modern keyboard. Achievement and success feel. No text, no people, no watermark. Photorealistic. 1:1 square.a!  Bright sunrise view through modern office window. Golden warm light flooding in. Open door leading to bright light, symbolizing new beginning and opportunity. Clean modern hallway, premium corporate interior. Hope and optimism. No text, no people, no watermark. Photorealistic. 1:1 square.a  Impressive large-scale corporate headquarters building exterior at twilight. Modern glass skyscraper with blue accent lighting. Authoritative and established feel. Clean architectural lines, premium corporate presence. No text, no people, no watermark. Photorealistic. 1:1 square.zEmpty corporate meeting room with unanswered questions feel. Scattered documents on conference table, empty chairs. Slightly foggy window, uncertain atmosphere. Cool blue-grey tones. No text, no people, no watermark. Photorealistic. 1:1 square.a=  Large professional boardroom with long conference table. Premium leather chairs, large display screens on wall showing organizational chart. Floor-to-ceiling windows, city view. Corporate power and structure. Blue accent lighting, modern corporate design. No text, no people, no watermark. Photorealistic. 1:1 square.a  Abstract business growth visualization. Multiple upward arrows in 3D space. Blue and teal color scheme with gold accent highlights. Data visualization elements floating in dark space. Premium corporate data dashboard feel. No text, no people, no watermark. Photorealistic. 1:1 square.a  Modern corporate office lobby with warm welcoming lighting. Clean marble floors, premium reception area. Glass walls showing bustling office beyond. Warm golden accent lights, inviting professional atmosphere. No text, no people, no watermark. Photorealistic. 1:1 square.)
a1_hook
a2_problema3_solutiona4_proofa5_ctab1_hook
b2_problemb3_solutionb4_proofb5_ctahookAu-   보험 영업,
아직도 혼자 버티세요?uH   서울대 출신 전문가가 설계한 시스템으로 바꿔보세요.)	slideTypebrandheadlinesubTextproblemu*   DB 없고, 멘토 없고,
수입도 불안uK   혼자 뛰는 보험 영업, 정착까지 버티는 사람이 드뭅니다.solutionu.   서울대 출신이 만든
AI 영업 시스템u<   30종 DB·5대 AI 무기·1:1 코칭으로 빠르게 정착.proofu(   정착률 99%,
숫자가 증명합니다uL   24시간 세일즈캠퍼스, 서울대 기획 시스템으로 성장한 팀.ctau%   지금 딱 한 번만
물어보세요u=   경력·신입 모두 환영. 정착지원금 지원 가능.*u   무료 상담 신청u!   *조건 있음, 상담 시 확인)r   r   r   r   ctaText
disclaimerBu'   대형 법인GA,
시작이 다릅니다uD   수수료 매출 1,863% 성장, 검증된 조직이 기다립니다.u&   좋은 회사인지,
어떻게 알죠?uU   규모·안정성·지원 체계, 세 가지를 동시에 갖춘 곳은 드뭅니다.u-   인카금융 TOP사업단의
검증된 구조uH   제휴 보험사 30개사, 본부 5개·지점 10개·구성원 200명+.u#   482명→5,500명,
성장의 증명u?   수수료 매출 120억→2,236억. 정착률 99%의 안정감.u+   안정적인 출발,
지금 확인하세요uN   경력·신입 정착지원금 별도 지원.* 함께 성장할 동료 모집.u   지금 상담받기gfau   서울대보험쌤 TOP사업단u&   수수료 1,863% 성장, 정착률 99%u   인카금융 TOP사업단u(   검증된 조직, 함께 성장하세요)gfa_agfa_breturnc                      t        j                  ddddt         gddd      } | j                  j	                         }|st        d      |S )u   gcloud access token 획득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/teams/dev1/v2_pipeline.pyget_gcloud_tokenr1      sU    ^^	6/9\N1KL	F MM!E`aaL    r/   promptoutput_pathlabelc                    t          dt         d}d|  dd}dd|igigdd	d
gid}t        d| d       t        j                         }t	        j
                  |||d      }|j                          t        j                         |z
  }	|j                         }
|
j                  dg       }|s$t        dt        j                  |
      dd        |d   j                  di       j                  dg       }t        d |D        d      }|s5|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}|j                  |      }|j                  j!                  d d !       |j#                  |       |j%                         j&                  }t        d| d"|j(                   d#|d$d%|	d&d'	       |||	dd(S c c}w ))u%   Gemini API로 배경 이미지 생성z/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-Typepartsr&   responseModalitiesIMAGETEXT)contentsgenerationConfig  [u   ] 배경 생성 중...,  )headersjsontimeout
candidatesu   candidates 없음. 응답: Nr   contentc              3   *   K   | ]  }d |v s|  yw)
inlineDataN ).0ps     r0   	<genexpr>z&generate_background.<locals>.<genexpr>   s     =Q<1+<q=s   	 u.   이미지 데이터 없음. 텍스트 파트:    rF   mimeTypez
image/jpegdatajpeg.jpg.pngTparentsexist_oku
   ] 완료:  (,z bytes, z.1fu   초))pathsizetimeerror)GEMINI_API_BASEMODEL_IDprintrY   requestspostraise_for_statusrA   getr-   dumpsnextbase64	b64decodewith_suffixparentmkdirwrite_bytesstatst_sizename)r/   r3   r4   r5   urlr@   payloadstartresponseelapsedrN   rC   r8   
image_partrI   
text_parts	mime_typeimage_bytesext
final_pathrX   s                        r0   generate_backgroundrx      s&   XhZ/?
@C"5'**G
  01231GV3DEG
 
Cw,
-.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((-JD48;'??$$D	Cwj 1D88GC=PT
UVgMM Gs   	G>G>template_pathrN   bg_pathc           	      P   |j                         st        d|       |j                         st        d|       d|j                          }| j                  |d       | j	                  d|j                          dt        j                  |d	       d
       | j                  d       |j                  j                  dd       | j                  t        |      d       |j                         j                  }t        d| d|j                   d|dd       ||ddS )u,   HTML 템플릿 + 배경 -> Playwright 캡처u-   템플릿 파일을 찾을 수 없습니다: u-   배경 이미지를 찾을 수 없습니다: zfile://networkidle)
wait_untilz/() => {
        window.BG_IMAGE_PATH = "file://z"";
        window.SCENARIO_DATA = F)ensure_asciiz};
        if (typeof render === 'function') {
            render(window.SCENARIO_DATA, window.BG_IMAGE_PATH);
        }
    }i  TrR   png)rW   typer>   u   ] 캡처 완료: rU   rV   z bytes)N)rW   rX   rZ   )existsFileNotFoundErrorresolvegotoevaluaterA   rb   wait_for_timeoutrg   rh   
screenshotstrrj   rk   r]   rl   )pagery   rN   rz   r4   r5   template_urlrX   s           r0   capture_hybridr   
  s-    !"OP] _``>>"OPWy YZZ]22456LIIl}I5MM ((/(9': ;  $

4e DE F
  	$TD9OO[)O6%%D	Cw'(8(8'9D87
KL==r2   c            
         t        j                  d      } | j                  ddd       | j                  dg dd	d
       | j                         }t        dz  }t        dz  }t        dz  }t        dz  }||||fD ]  }|j                  dd        g g g g d}|j                  set        d       t        d       t        d       	 t               }t        dt        |       d       |r)i }|j                  dv rI|j                  t         j#                         D ci c]  \  }}|j%                  d      s|| c}}       |j                  dv rI|j                  t         j#                         D ci c]  \  }}|j%                  d      s|| c}}       |j#                         D ]Z  \  }}|d| d z  }	 t'        ||||      }|d   j                  d!|i|d"t)        |d"         i       t5        j6                  d'       \ nt        d(       t        d)       t        d*       t        d       t9               5 }|j:                  j=                         }|j?                  d+d+d,-      }i }|j                  dv rI|j                  t@        j#                         D ci c]  \  }}|j%                  d      s|| c}}       |j                  dv rI|j                  t@        j#                         D ci c]  \  }}|j%                  d      s|| c}}       |j#                         D ]  \  }}|d| d z  }|jC                         s	|d| d.z  }|jC                         s(d/| }
t        d|
        |d   j                  |
       `|d0   }|j%                  d      r
|d1| d.z  }n	|d1| d.z  }	 tE        |tF        ||||      }|d2   j                  |t)        |      |d3   d4        t        d)       t        d6       t        d       |j?                  d7d8d,-      }tH        j#                         D ]  \  }}|d9k(  rd:}nd;}|d| d z  }|jC                         s	|d| d.z  }|jC                         s(d<| }
t        d|
        |d   j                  |
       j|d9k(  rd=nd>}||z  }	 tE        |tJ        ||||      }|d?   j                  |t)        |      |d3   d4        |jM                          d d d        t        d)       t        dA       t        d       t        dBt        |d          dC       t        dDt        |d2          dC       t        dEt        |d?          dC       t        dFt        |d          dG       |d   r#t        dH       |d   D ]  }t        dI|         t        dJz  }tO        |dKdLM      5 }tQ        jR                  ||dNd't(        O       d d d        t        dP|        y # t        $ rJ}	dt        |	      j                   d|	 }
t        d|
        |d   j                  |
       d }Y d }	~	pd }	~	ww xY wc c}}w c c}}w # t*        j,                  $ rc}	d#| d$|	j.                  j0                   d|	j.                  j2                  d d%  }
t        d|
        |d   j                  |
       Y d }	~	d }	~	wt        $ rK}	d#| d&t        |	      j                   d|	 }
t        d|
        |d   j                  |
       Y d }	~	>d }	~	ww xY wc c}}w c c}}w # t        $ rK}	d5| d&t        |	      j                   d|	 }
t        d|
        |d   j                  |
       Y d }	~	cd }	~	ww xY w# t        $ rK}	d@| d&t        |	      j                   d|	 }
t        d|
        |d   j                  |
       Y d }	~	d }	~	ww xY w# 1 sw Y   xY w# 1 sw Y   xY w)QNu*   v2 Hybrid 광고 이미지 파이프라인)descriptionz	--skip-bg
store_trueu+   배경 생성 스킵 (기존 배경 사용))actionhelpz--group)aballr   u   생성할 그룹)choicesdefaultr   zmeta-carousel-azmeta-carousel-bz	naver-gfabackgroundsTrR   )r   	carouselsr   errorsz<============================================================u'   Phase 1: Gemini 배경 이미지 생성u'   [인증] 토큰 획득 성공 (길이: z chars)u   토큰 획득 실패: z: z
  [ERROR] r   )r   r   r   )r   r   r   bg_rP   keyrW   u   배경 생성 실패 [z] HTTP r?   z]: rL   u5   [Phase 1] --skip-bg 옵션으로 배경 생성 스킵z=
============================================================u&   Phase 2: Playwright 캡처 (캐러셀)i8  )widthheight)viewportrQ   u   배경 이미지 없음:    slide_r   rX   )r   rW   rX   u   캡처 실패 [u   Phase 3: GFA 배너 캡처i  it  r   r   r   u   GFA 배경 이미지 없음: z	gfa_a.pngz	gfa_b.pngr   u   GFA 캡처 실패 [u   결과 요약u   배경: u   장u   캐러셀: zGFA: u   에러: u   건u   
[에러 목록]z  - zresults.jsonwzutf-8)encodingF)r~   indentr   u   
결과 저장: )*argparseArgumentParseradd_argument
parse_argsOUTPUT_BASErh   skip_bgr]   r1   len	Exceptionr   __name__appendgroupupdate
BG_PROMPTSitems
startswithrx   r   r^   	HTTPErrorrp   status_coder&   rY   sleepr   chromiumlaunchnew_page
SLIDE_DATAr   r   CAROUSEL_TEMPLATEGFA_DATAGFA_TEMPLATEcloseopenrA   dump)parserargsdir_adir_bdir_gfabg_dirdresultsr/   erZ   prompts_to_genkvr   r3   rz   r.   rI   browsercarousel_pageslides_to_genrN   	slide_numout_pathgfa_pagebg_keyout_nameerrresults_pathfs                                  r0   mainr   1  s<   $$1]^F
:  
 !	   D ++E++EK'G=(FUGV, -	t,- 	 G <<h78h	$&E;CJ<wOP -/Nzz\)%%
8H8H8J&`1all[^N_q!t&`azz\)%%
8H8H8J&`1all[^N_q!t&`a-335 V ST?2
40MFM*115#2e2eQTU[\bUcQd2ef 

1 	EF
 
/	
23	(O		 Ia**##%((DD2Q(R)+::%  :3C3C3E![41aVYIZ!Q$![\::%  :3C3C3E![41aVYIZ!Q$![\&,,. 	0ICSE.G>># ST?2>>#3C59
5'*+!((/ AI~~c" VI;d#;; VI;d#;;0'7H$PWYacfg$++CXX^_eXf,gh)	0: 	o*+h##ts-K#L!) 	0ICg~""VHD11G>># S#55>>#7x@
5'*+!((/&)Wn{+H)H0',gxY\]%%c3x=RXY_R`&ab+	06 	SI\ 
/	/	(O	HS/01
56	KGK012#
67	E#gen%&c
*+	HS*+,C
01x!"8$ 	 CD,	  /L	lC'	2 Ia		'15CHI	l^
,-K  	,T!W-=-=,>bDEJug&'H$$U+E		 'a&`  )) 44SEAWAW@XXZ_`_i_i_n_nosps_t^uvEJug./H%,,U33  44SET!W=M=M<NbQRPSTEJug./H%,,U334, "\![.  0)#c$q'2B2B1C2aSI
5'*+!((//0H  0-cU#d1g6F6F5Gr!M
5'*+!((//0II IzI Is   
"X !Y$
;Y$
8Y*
Y*
?6Y0A"_5%\;?\;8_5<]]B!_5=8]5C_5:8^2_5`	Y!?YY!0\8A[!!\8-A \33\8;_5	^A ^_5^_5	_2'A _-'_5-_22_55_?`__main__) __doc__r   rd   rA   r(   rY   r   pathlibr   typingr   r^   playwright.sync_apir   	WORKSPACEr   TEMPLATE_DIRr   r   r\   r[   r*   r   r   r   r   r1   dictrx   r   r   r   rG   r2   r0   <module>r      sd   V          / &'	99<' #>> 44+DD	O	H	H	H	H	H	H	H	H	H{B
V D]	 A`	  EQ	 ?a	 <R)9 >Y	 =j	  D]	 :T	 Bc(9wC
P 5;)9 /=(90# &'Ns 'NC 'Nd 'N3 'NSWX[]`X`Sa 'N^>> > 	>
 > > 
>No.d zF r2   