
    iGj37                        d dl Z d dlZd dlZd dlZd dl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  ed          ZdZdZ ed          Z ed          Z ed          Z ed	          Zd
ZdZdZdZdZdZedz  Zej                            dd           d Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&e'dk    r e&             dS dS )    N)Pathzb/data/video-pipeline/Channel-Loi-Co-Nhan/project/13062026-090-Nuoc-Sau-Chay-Cham-Nguoi-Khon-Noi-Itz0http://192.168.40.11:20128/v1/images/generationsz"http://192.168.40.12:3900/generatezL/data/video-pipeline/Youtube-Video-Maker/data/voices/template1/refaudio1.wavzK/data/video-pipeline/Youtube-Video-Maker/data/voices/template1/reftext1.txtzX/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/paulyudin-sentimental-story-182512.mp3zD/data/video-pipeline/Channel-Loi-Co-Nhan/data/logo/logoloiconhan.png      z0.88   g      ?g      @zlogs/complete_short_project.logTparentsexist_okc                     t          j        d          | z   }t          |d           t                              dd          5 }|                    |dz              d d d            d S # 1 swxY w Y   d S )Nz%F %T T)flushautf-8encoding
)timestrftimeprintLOGopenwrite)slinefs      /data/video-pipeline/Channel-Loi-Co-Nhan/project/13062026-090-Nuoc-Sau-Chay-Cham-Nguoi-Khon-Noi-It/scripts_complete_short_project.pylogr      s    	x	 	 	"D	$d	#w	'	'@1aggd4i.@.@.@@@@@@@@@@@@@@@@@@@s   A++A/2A/c                     t          d          } |                                 r|                                                                 D ]}|                    d          rt
          j                            d          sa|                    dd          d         	                                	                    d          	                    d          t
          j        d<   d S d S )Nz/home/hermes/.hermes/.envzGEN_IMG_API_KEY=GEN_IMG_API_KEY=r   "')
r   exists	read_text
splitlines
startswithosenvirongetsplitstrip)pr   s     r   load_envr+      s    
&''Axxzz aKKMM,,.. 	a 	aD122 a2:>>J[;\;\ a.2jjQ.?.?.B.H.H.J.J.P.PQT.U.U.[.[\_.`.`
,-a a	a 	a    c           	          t          dd                    t          t          |                     z              t	          j        t          t          t          |                                d S )NzRUN  )r   joinmapstr
subprocess
check_calllist)cmds    r   runr6   !   sP    sxxC%%%&&&$s3s||,,-----r,   c                     t          j        dddddddt          |           gd	                                          }t	          |          S )
Nffprobe-verrorz-show_entrieszformat=durationz-ofzdefault=nw=1:nk=1T)text)r2   check_outputr1   r)   float)r*   outs     r   durr?   %   sg    4HYZ_`stwxytztz {  BF  	G  	G  	G  	M  	M  	O  	OC::r,   c           	      0   t                       t          j        d         }|j                            dd           |                                r|                                j        dk    r'	 d| ddd}t          j	        
                    t          t          j        |                                          d	|z   d
dd          }t          j	                            |d          5 }t          j        |                                                    dd                    }d d d            n# 1 swxY w Y   |d         d                             d          }|                    d          r|                    dd          d         }|                    d          }|                    t1          j        |                     |                    |           t7          d|            no# t8          $ rb}	t7          d|j         dt=          |	          j         d|	            dtA          |	          v rdnd}
tC          j"        |
           Y d }	~	nd }	~	ww xY w|                                |                                j        dk    %d S d S )Nr   Tr   r   cx/gpt-5.5-image	1024x1792r   )modelpromptsizenzBearer zapplication/json)AuthorizationContent-TypePOSTdataheadersmethodiX  timeoutr   ignorerK   b64_jsonzdata:,.tmpzDONE image zRETRY image : r.   zHTTP Error 502   )#r+   r%   r&   parentmkdirr!   statst_sizeurllibrequestRequestIMG_URLjsondumpsencodeurlopenloadsreaddecoder'   r$   r(   with_suffixwrite_bytesbase64	b64decodereplacer   	Exceptionnametype__name__r1   r   sleep)rD   r>   keybodyreqrpayloadbtmpedelays              r   	gen_imagerx   )   s   JJJBJ013:3C3CDZ^3C3_3_3_jjll chhjj0!33	,fKTUVVD&&wDJt4D4D4K4K4M4Mgpqtgt  EW  WX  WX  `f&  g  gC''C'88tAtzRSRXRXRZRZRaRabijrRsRsGtGtwtttttttttttttttfoa $$Z00A||G$$9Aq(9a''C9I!9L9L)M)M)Ms{{[^O_O_O_#c##$$$$ 	 	 	AsxAA477+;AAaAABBB)SVV33AAEJu		 jjll chhjj0!333333s?   0A:G2 *;D1%G2 1D55G2 8D59B8G2 2
I<AIIc                    dt          j                    j        z   }g }|                                 D ]6\  }}|                    d| d| d| d                                           7|                                D ]\  }}t          |          }t          j        t          |                    d         pd}|                    d| d| d|j
         d	| d
	                                |                                z   dz              |                    d| d                                           |d                    |          fS )Nz----OmniVoiceBoundaryz--z(
Content-Disposition: form-data; name="z"

z
r   zapplication/octet-streamz"; filename="z"
Content-Type: z

s   
z--
r,   )uuiduuid4hexitemsappendr`   r   	mimetypes
guess_typer1   rk   
read_bytesr/   )	fieldsfilesboundarychunkskvpathr*   mimes	            r   	multipartr   :   s   $TZ\\%55Hbv||~~  D  D!v}}-y(-y-yfg-y-yrs-y-y-y  .A  .A  .C  .C   D   D   D   D++-- j j$
t**9/A77:X>Xd  I8  I  Iq  I  I_`_e  I  Iz~  I  I  I  P  P  R  R  ST  S_  S_  Sa  Sa  a  bi  i  	j  	j  	j  	j
MM'x'''..00111(388FCSCS:S3Sr,   c                    t          | d                   }|j                            dd           |                                r1|                                j        dk    rt          d|            d S t                                          rt                              d          nd}t          j
        d	d
| d                                                   }d}|                                r|                                j        dk     r|dz  }	 |d|t          dddd}t          |dt          i          \  }}t          j                            t$          |dd|z   id          }t          j                            |d          5 }	|	                                }
d d d            n# 1 swxY w Y   |                    d          }|                    |
           |
d d         dk    rd|
d d         v st/          |
d d                   |                    |           t          d |            no# t2          $ rb}t          d!| d"          d#| d$t5          |          j         d%|            t9          j        t=          d&|z  d                     Y d }~nd }~ww xY w|                                |                                j        dk     d S d S )'N
audio_pathTr     zSKIP existing tts r   r    u   \s*[:;\-–—]\s*z, r;   r   r   vi24z2.0	broadcast)r;   languageref_textspeednum_stepguidance_scaleeffect_preset	ref_audiorH   zmultipart/form-data; boundary=rI   rJ      rN   rS      s   RIFFs   WAVE   P   z	DONE tts z
RETRY tts idz	 attempt rT   r.   rU   )r   rV   rW   r!   rX   rY   r   REF_TEXTr"   resubr)   	TTS_SPEEDr   	REF_AUDIOrZ   r[   r\   TTS_URLra   rc   re   rf   RuntimeErrorri   rj   rl   rm   r   rn   min)itemr>   r   r;   attemptr   r   rp   rq   rr   blobru   rv   s                r   tts_oner   B   s   T,  C#*"2"24"2"N"N"N
zz|| 

*4//&&&'''5=__5F5FNX111BH	%tT&\	:	:	@	@	B	BDGjjll vchhjj055

	v48Iaew|  NY  Z  ZF#F[,CDDMHT&&wD.QqrzQzA{  DJ&  K  KC''C'88LAAFFHHtLLLLLLLLLLLLLLL''C)>)>)>!Hg%%'T#2#Y*>*>|TXY\Z\Y\T]G^G^A^KK!C!!"""" 	v 	v 	vST$ZSS'SST!WW=MSSPQSSTTTVZV`adeghoeopsatatVuVuVuVuVuVuVuVu	v jjll vchhjj0555555s?   A7H; F-!H; -F11H; 4F15BH; ;
J'AJ""J'c                     t          t          | dz                      }|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|dd|dd|dd|dS )Nr   i6 i`  02:rR   03)intround)secmshmr   s        r   srt_timer   X   s    
5T??Br7{QBKB2u9b%ibSUW[S[QR]_ae]e]_***Q***A***2****r,   c                  P  1 t                               dd           t          j        t          dz                      d                    } g d}dt          | d                   dz  t          | d                   d	z
  g}|D ]}| d         |         }|                    d
          pd11fd|D             }|r(t          d|                    d           d|           t          dt          j
        |                    d          ddd	1d d         dd          z              g }| d         D ]t}t          dz  |d         dz   z  }|                    |                    d
          p1|                    d          p|                    d          p|d         |f           ut          j                            t                    5 }t!          |                    d |                     d d d            n# 1 swxY w Y   t          dz  }	|                     d          p)|                     di                               dd           }
d!|
 d"}t%          ||	           g }| d         D ]G}|d         }|d         }|                    |||t'          t          d#z  |z  d$z            d%           Ht          d#z                      d&d&'           t          d(z                      t          j
        d)|idd*          d           t          j                            t*                    5 }t!          |                    t,          |                     d d d            n# 1 swxY w Y   t          d+z  }g }g }d,}g }g }d	}t          d-z  }t/          d.d/d0d1d2d3d4d5d6t0          d7d8|g           dd:}t3          |d	          D ]x\  }}t5          |d;                   }t7          |          }|t0          z   }|                    d<| d=           |                    d<| d=           |                    |d         |||z   ||z   ||t0          t'          |          t'          t          dz  |d          dz            d>	            ||d?         d9          }|r|t          |          z  }t3          |          D ]y\  }}|||z  z   } ||d	z   |z  z   }!|                    | d@t9          |            dAt9          |!           d@| d@           |                    ||d         | |!|dB           |d	z  }z||z  }z|                    d                    |          d           t          dCz  }"|"j                            d&D           t/          d.d/d0d1d2dEdFdGd4|dHdIdJdKd7d8|"g           t          dLz                      d&d&'           t          dMz                      t          j
        t7          |"          |dNdd*          d           t          dOz                      t          j
        |dd*          d           t          dPz                      d@                    |          d           |                     di                               dQ          p|
                                }#t          dRz  }$|$j                            d&d&'           |$                     d&S           t-          dT|#t'          |$          dU           t          dV           d S )Nr   r   r   zscript/scenes.json)u   cổ phong giấy vàngzaged parchmentzink-washzNegative prompt:zno modern objectszno textr   scenes   r   image_promptc                     g | ]}|v|	S  r   ).0termrD   s     r   
<listcomp>zmain.<locals>.<listcomp>e   s#    PPPDT=O=O4=O=O=Or,   z"image_prompt preflight failed for scene_idz
: missing zPREFLIGHT image payload rA   rB   i  )r   rC   rE   rF   rD   F)ensure_asciizimages/scenesz.pngvisual_promptvisual_beat	narration)max_workersc                     t          |  S )N)rx   )jobs    r   <lambda>zmain.<locals>.<lambda>o   s
    	3 r,   z&output/thumbnails/thumb_9x16_final.pngtitlemetadatauB   Cổ nhân dạy: Người khôn nói ít, kẻ dại nói nhiềuu   Vertical 9:16 thumbnail, cổ phong giấy vàng, aged yellow parchment, ink-wash cinematic Vietnamese moral story poster. Large readable Vietnamese brush title: z. Symbolic half bowl of rice shared with a traveler, golden seed sprouting from humble hands, warm village dawn, sepia bronze gold accents, mobile-safe composition, dramatic but dignified, no modern neon, no horizontal layout.zaudio/voice_segmentszseg_001.wav)r   r   r;   r   Tr   z1audio/voice_segments/voice_segments_manifest.jsonr}   )r   indentzaudio/concat.txtg        zaudio/silence_scene_pause.wavffmpegz-yr9   r:   z-flavfiz-izanullsrc=r=44100:cl=monoz-tz-c:a	pcm_s16ler   c                 h   |                      dd                                          }g }d}|t          |          k     rrt          |          |z
  }||k    r|n|}||dz   k    rd}|                    d                    ||||z                                 ||z  }|t          |          k     r|S )Nr   r.   r   r      )ri   r(   lenr~   r/   )r;   rF   wordsr>   iremaintakes          r   word_chunkszmain.<locals>.word_chunks   s    ll4$$**,,"ca#e**nnu::a<F6!88aaqs{{DJJsxxa$h001111d71 #e**nn 
r,   r   zfile 'z'
)	r   startend
speech_enddurationaudio_duration	pause_secr   
image_pathr;   r   z --> )idxr   r   r   r;   zaudio/master_narration.wav)r	   concatz-safe0z-ar44100z-ac1	subtitlesz$audio/master_narration_timeline.json)duration_secr}   z'subtitles/subtitle_cue_debug_short.jsonz&subtitles/master_subtitles_clamped.srttopic_sentencezoutput/intro/intro_audio.wav)
missing_okintro)r   r;   r   zYSTOP after audio/subtitle rebuild; production render/package must use worker-only script.zrender_onepass/segments.txtz	duration r   z.3fzoutput/main_story.mp4zT[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,subtitles='z':force_style='FontSize=z0,Outline=1,Alignment=2,MarginV=80'[base];movie='zW',scale=160:-1,format=rgba,colorchannelmixer=aa=0.55[wm];[base][wm]overlay=W-w-35:35[v]z-filter_complexz-mapz[v]z1:az-r30z-c:vlibx264z-pix_fmtyuv420paacz	-shortestuC   Cổ nhân dạy: Người khôn nói ít, kẻ dại nói nhiều.zoutput/intro/intro.mp4z-loopz-vfzCscale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920zoutput/intro/intro_pause_4s.mp4zanullsrc=r=44100:cl=stereozoutput/final/final_concat.txtz'
file 'zoutput/final/final_no_bgm.mp4zoutput/final/final_video.mp4aK  [0:v]scale=1080:1920,setsar=1[v0];[0:a]aformat=sample_rates=44100:channel_layouts=stereo[a0];[1:v]scale=1080:1920,setsar=1[v1];[1:a]aformat=sample_rates=44100:channel_layouts=stereo[a1];[2:v]scale=1080:1920,setsar=1[v2];[2:a]aformat=sample_rates=44100:channel_layouts=stereo[a2];[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[v][voice]z[voice]z[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[voice];[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.30[bgm];[voice][bgm]amix=inputs=2:duration=first:dropout_transition=2[a]z-stream_loopz-1z0:vz[a]copy	completedz9:16)
project_idstatus	thumbnail
main_storyfinal_videor   r   format	tts_speedsubtitle_font_sizescene_pause_secintro_pause_seczoutput/info.jsonz	COMPLETE )r   )(r   
write_textr^   rb   PROJECTr"   r   r'   r   r   r_   r~   
concurrentfuturesThreadPoolExecutorWORKERSr4   r0   rx   r1   rW   TTS_WORKERSr   r6   SCENE_PAUSE_SEC	enumerater   r?   r   r/   rV   r)   unlinkr   SUB_FONT_SIZELOGOINTRO_PAUSE_SECBGMrk   r   )2rK   required_prompt_termssample_indicesr   scmissing
image_jobsr>   exthumbr   thumb_promptr}   sidr;   r   linestimelinetsrt	cue_debugcue_idxsilencer   itapdvisual_dr   stepcitxtcscemaster
intro_textintro_audioseglistsegtxtmainvfcr   pauselistpru   final	concat_fcmix_fcinforD   s2                                                    @r   mainr+  \   s0	   NN2wN'''	W11<<g<NN	O	OD J  J  JT(^,,a/T(^1D1DQ1FGN { {(^C ''-2PPPP$9PPP 	mkBFF:DVDVkkbikklll&tzrvvj?Q?Q\n  yD  KL  X^  _c  `c  _c  Xd  3e  3e  ty  (z  (z  (z  z  	{  	{  	{  	{J8n @ @O#R
^F%:;266.11xRVVO5L5LxPRPVPVWdPePexiklwixz}~			.	.7	.	C	C >rRVV//<<===> > > > > > > > > > > > > > >
:
:E
((7

  Itxx
266::7  DH   I   IE `  w|  `  `  `LlE"""
E8n  zNKD3#Ts7SiKijmKmn{K{G|G|}}~~~~##**4*FFF@@LLTZY`afXguz  CD  NE  NE  NE  OVL  W  W  W			.	.;	.	G	Gk2tTVTZTZ[bdiTjTjOkOkOkkkkkkkkkkkkkkkk%%FRu"aSWYYcd[b33G$tGD6QRVWfgmny  {B  	C  D  D  D    E!$$  B< !!
b''Ao-8%b%%%&&&*g***+++BzN11X:[\]^[^jr  EF  Sb  ps  tv  pw  pw  EH  IP  Q`  I`  df  gq  dr  ax  ax  ax  Ix  Ey  Ey  z  z  	{  	{  	{{2f:a(( 	3v;;D#F++  3RW9BqD$;b

gSS"SSHRLLSSCSSSTTT  2j>RT[]eh!i!ijjj
	8
bggenng666//F1D1Dd1D1S1S1S$tGD'#d6%PWX]^abhitu{|}}}[t<<<33??
\_`f\g\grzK{K{  KP  YZ  A[  A[  A[  fm?  n  n  n66BB4:iejrsCtCtCt  FB  G  G  G55AA$))C..[bAccc((:r**../?@@IEPPRRJ::KTD999$'''7Jc+>N>NOOPPPcddd
Fs$   %HHH7)M,,M03M0__main__)(rg   concurrent.futuresr   r^   r   r%   r   r2   r   rz   urllib.requestrZ   pathlibr   r   r]   r   r   r   r  r  r   r   r   r  r   r  r   rV   rW   r   r+   r6   r?   rx   r   r   r   r+  rm   r   r,   r   <module>r0     s   b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b      
$s
t
t:,
$]
^
^		[	\	\D	cdd	T
PQQ	
	-- 
    - - -A A A
a a a. . .    "T T Tv v v,+ + +j  j  j V Zr,   