
    i              
           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  ee      j                  Zedz  Zedz  Zedz  Zd	 Zd
edefdZdededefdZddededededz  fdZd Zedk(  r e        yy)u1   Meta 캐러셀 광고 이미지 자동 생성 PoC    N)Path)OpenAI)sync_playwright	templatesdatabackgroundsc                     t        d      } | j                         r| j                         j                         D ]  }|j	                         }|s|j                  d      r(d|v s-|j                  d      r|dd }|j                  d      \  }}}|j	                         j	                  d      j	                  d      }t        j                  j                  |j	                         |        yy)	z!Load API keys from .env.keys filez/home/jay/workspace/.env.keys#=zexport    N"')
r   exists	read_text
splitlinesstrip
startswith	partitionosenviron
setdefault)env_pathlinekey_values        U/home/jay/workspace/.worktrees/task-2116-dev1/tools/carousel-gen/generate_carousel.pyload_env_keysr      s    34H&&(335 		:D::<DDOOC0SD[??9-8D $s 3Q++C066s;

%%ciik59		:     set_namereturnc                     ddi}|j                  |       }|st        d|        t        |z  }t        |dd      5 }t	        j
                  |      cddd       S # 1 sw Y   yxY w)zLoad slide data from JSONu   상시Az
set_a.jsonzUnknown set: rzutf-8)encodingN)get
ValueErrorDATA_DIRopenjsonload)r    set_mapfilename	data_pathfs        r   load_slide_datar/   '   si     ,'G{{8$H=
3448#I	iw	/ 1yy|  s   AA%promptslide_numberc                    t         d| dz  }|j                         rt        d|        |S t        d       t               }|j                  j                  d| ddd	      }|j                  st        d
| d      |j                  d   j                  }|st        d| d      t        j                  |      }t         j                  dd       |j                  |       t        d|        |S )z2Generate background image using OpenAI GPT Image 1	bg_slide_.pngu$     [캐시] 배경 이미지 사용: u3     [AI] 배경 이미지 생성 중... (gpt-image-1)zgpt-image-1   	1024x1024low)modelr0   nsizequalityu8   AI 배경 생성 실패: 응답 데이터 없음 (slide )r   u9   AI 배경 생성 실패: b64_json이 비어있음 (slide Tparentsexist_oku      [AI] 배경 이미지 저장: )BG_CACHE_DIRr   printr   imagesgenerater   RuntimeErrorb64_jsonbase64	b64decodemkdirwrite_bytes)r0   r1   
cache_pathclientresultimage_base64image_bytess          r   generate_ai_backgroundrO   4   s   )L> >>J 4ZLAB	?AXF]]##
 $ F ;;UVbUccdeff;;q>**LVWcVddefgg""<0Ktd3;'	,ZL
9:r   template_path
slide_dataoutput_pathbg_pathc                 r   t        |      }|rd|j                          |d<   dt        |      j                          }| j                  |d       | j	                  dt        j                  |d       d       | j                  d	       | j                  t        |      d
       t        d|        y)z1Render HTML template with data and capture as PNGzfile://backgroundImagenetworkidle)
wait_untilz$() => {
        window.SLIDE_DATA = F)ensure_asciizd;
        if (typeof render === 'function') {
            render(window.SLIDE_DATA);
        }
    }i  png)pathtypeu     [캡처] N)dictresolver   gotoevaluater)   dumpswait_for_timeout
screenshotstrrA   )pagerP   rQ   rR   rS   js_datatemplate_urls          r   capture_sliderg   W   s     :G'.w/@.A%B!" T-088:;<LIIl}I5 	MM !ZZeDE F
  	$ 	OO[)O6	K}
%&r   c                     t        j                  d      } | j                  ddd       | j                  ddd	
       | j                  ddd       | j                         }t	                t        |j                        }|d   }t        |j                        }|j                  dd       t        d       t        d|d           t        dt        |              t        d|j                                 t                t        t        dz        }t        t        dz        }t               5 }|j                   j#                         }|j%                  ddd      }	|D ]  }
|
d   }|
d   }|
d   }t        d| d| d | d!       |d"| d#| d$z  }|d%k(  rt'        |	||
|       G|d&k(  sMd }|
j)                  d'd(      }|j*                  s|rt-        ||      }nBt.        d)| d$z  j1                         rt.        d)| d$z  }t        d*|        nt        d+       t'        |	||
||        |j3                          d d d        t                t        d,t        |       d-       t5        |j7                  d.            D ]<  }|j9                         j:                  d/z  }t        d0|j<                   d1|d2d3       > y # 1 sw Y   xY w)4Nu)   Meta 캐러셀 광고 이미지 생성기)descriptionz--setTu!   카피 세트명 (예: "상시A"))requiredhelpz--outputz	./output/u   출력 디렉토리)defaultrk   z	--skip-ai
store_trueuN   AI 배경 생성 스킵 (기존 캐시 또는 그라디언트 fallback 사용))actionrk   slidesr=   u.   === Meta 캐러셀 이미지 생성 시작 ===u   세트: setNameu   슬라이드 수: u   출력 경로: zinfographic.htmlzemotional.htmli8  )widthheight)viewportslideNumberapproachtitleu   [슬라이드 z] u    (접근법 r<   slide_r   r4   BCbgPrompt r3   u!     [캐시] 기존 배경 사용: u?     [경고] AI 배경 없음 — 그라디언트 fallback 사용u   === 완료: u   장 이미지 생성 ===zslide_*.pngi   z  z (z.0fz KB))argparseArgumentParseradd_argument
parse_argsr   r/   setr   outputrH   rA   lenr]   rc   TEMPLATE_DIRr   chromiumlaunchnew_pagerg   r%   skip_airO   r@   r   closesortedglobstatst_sizename)parserargsr   ro   
output_dirinfographic_templateemotional_templatepbrowserrd   slidenumru   rv   rR   rS   	bg_promptr.   size_kbs                      r   mainr   u   s   $$1\]F
$5XY

K>ST
L/   D O 488$D(^F dkk"JTD1	:<	HT)_%
&'	s6{m
,-	OJ..01
23	G |.@@A\,<<=		  a**##%44)HI 	UE&CZ(H'NEN3%r%XJaHI$uAeWD'AAK3d$8%MS!IIj"5	||	4YDG"yT%::BBD*yT-BBG=gYGH[]d$6{GT5	U8 	A D 
G	LV%=
>? JOOM23 0&&(""T)166("WSM./0M   s   6A>K5BKK__main__)N)__doc__r|   rF   r)   r   syspathlibr   openair   playwright.sync_apir   __file__parentBASE_DIRr   r'   r@   r   rc   r\   r/   intrO   rg   r   __name__ r   r   <module>r      s    7    	 
   0>  +%f-': 
c 
d 
 3  c  d  F's ' '4 'Z^aeZe '<F0R zF r   