
    yj3                       d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	Z	ddl
Z
ddlmZmZmZ ddlmZ dd	lmZmZmZ ed
e
j        e         f         Z ed           G d d                      Z ed           G d d                      ZddddLdZdMdZd d!dNd&ZdOd-Zd.d/dPd3ZdQd5ZdRd>Z dd?dSdEZ!e
j"        ddFdTdKZ#dS )UzBProcedural motion renderer for final-near TrueTrace review videos.    )annotations)Callable)	dataclass)PathN)Image	ImageDraw	ImageFont)ValidationResult)FinalVideoPlanFinalVideoScenevalidate_final_video_plan.T)frozenc                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   dZded<   dZded<   dZded<   dS )MotionRenderPlanr   
final_planstr
output_dir	frame_dirconcat_pathoutput_pathintwidthheightfpsNzdict[str, str] | Nonebackground_paths tuple[str, ...]side_effectsexternal_calls)__name__
__module____qualname____annotations__r   r   r   r       ^/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/autoshorts/rendering/motion_renderer.pyr   r      s         OOONNNJJJKKKHHH.22222$&L&&&&&(N((((((r$   r   c                  h    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
Zded<   dZded<   dS )MotionRenderResultr   r   r   frame_pathsr   r   
returncodestdoutstderr)	write_pngwrite_concatcall_ffmpeg	write_mp4r   )ffmpegr   N)r    r!   r"   r#   r   r   r   r$   r%   r'   r'   "   ss             OOOKKKKKK$]L]]]]&1N111111r$   r'         ?)preview_scaler   r   r   r   
str | Pathr2   floatr   dict[str, str | Path] | Nonereturnc                  t          |           }|j        s't          d                    |j                            d|cxk    rdk    sn t          d          t          |          }t          | j        |z            }t          | j        |z            }|dk     rdn| j	        }t          | t          |          t          |dz            t          |dz            t          |d	z            |||d
 |pi                                 D             pd 	  	        }	t          |	          }|j        s't          d                    |j                            |	S )N;       ?r1   z*preview_scale must be between 0.25 and 1.0      framesz
frames.txtzmotion-preview.mp4c                4    i | ]\  }}|t          |          S r   )r   ).0scene_idpaths      r%   
<dictcomp>z,build_motion_render_plan.<locals>.<dictcomp>G   s$    eee.(D(CIIeeer$   )	r   r   r   r   r   r   r   r   r   )r   is_valid
ValueErrorjoinerrorsr   r   r   r   r   r   r   itemsvalidate_motion_render_plan)
r   r   r2   r   
validationrootr   r   r   plans
             r%   build_motion_render_planrK   .   sr    +:66J 7:#455666M((((S((((EFFF
D
 =011E"]233F!!""z~Ct99dXo&&|+,,3344eeEUE[Y[DbDbDdDdeeemim
 
 
D -T22J 7:#455666Kr$   rJ   r
   c                   g }| j         dk    s| j        dk    r|                    d           | j         dz  | j        dz  k    r|                    d           | j        dvr|                    d           | j                            d          s|                    d	           | j                            d
          s|                    d           | j                                        s|                    d           | j	        r|                    d           | j
        r|                    d           t          | j                  }|                    |j                   t          | t!          |                    S )Nr   z!width and height must be positive   	   z2motion render must keep 9:16 vertical aspect ratio>   r;      zfps must be 24 or 30z.mp4zoutput_path must end with .mp4z.txtzconcat_path must end with .txtzframe_dir is requiredz-motion render plan must not have side effectsz/motion render plan must not have external calls)rB   rE   )r   r   appendr   r   endswithr   r   stripr   r   r   r   extendrE   r
   tuple)rJ   rE   final_validations      r%   rG   rG   O   s{   FzQ$+**9:::zB$+/))JKKKxx,---$$V,, 86777$$V,, 86777>!! /-... GEFFF IGHHH0AA
MM")***ZfFFFFr$   Fboldsizer   rW   boolc                   |rdnd}|D ]*}	 t          j        ||           c S # t          $ r Y 'w xY wt          j                    S )N)zDejaVuSans-Bold.ttfDejaVuSans.ttf)r[   )rX   )r	   truetypeOSErrorload_default)rX   rW   namesnames       r%   _fontra   f   sr    9=V55CVE  	%d666666 	 	 	H	!###s   $
11drawImageDraw.ImageDrawtextr   	max_width	list[str]c                j   g }|                                 D ]}|                                }|s|                    d           .|d         }|dd          D ]E}| d| }	|                     d|	|          d         |k    r|	}.|                    |           |}F|                    |           |S )N r   r:    )r   r   )font   )
splitlinessplitrP   textbbox)
rb   rd   rj   re   lines	paragraphwordscurrentword	candidates
             r%   _wrapru   p   s    E__&&  	!! 	LL(!""I 	 	D"++T++I}}VYT}::1=JJ#W%%%WLr$   
   )spacingxytuple[int, int]rw   c                   |\  }}t          |dd          |z   }	t          | |||          D ]"}
|                     ||f|
||           ||	z  }#|S )NrX   r;   rj   fill)getattrru   rd   )rb   rx   rd   rj   r|   re   rw   xyline_heightlines              r%   _draw_text_blockr      sm    DAq$++g5KdD$	22  		1a&$T	555	[Hr$   progressc                    ddt          j        t           j        t          dt	          d|                     z            z  z
  S )Ng      ?        r1   )mathcospimaxmin)r   s    r%   _easer      s7    tx#c3sH3E3E*F*F FGGGGGr$   boxtuple[int, int, int, int]titlebodyaccenttuple[int, int, int]
font_scaleNonec          	        |\  }}}}	|                      |dd|d           |                     ||||dz   f|           t          |d          }
t          t          dt	          |d	z                                }|                     |d
z   |dz   f||
d           t          | |d
z   |dz   f||d||z
  dz
  d           d S )Nr;               radiusr|   outliner   rM   r|   TrV   g(\?             *   r{   V   )3   A   U   8      rj   r|   re   rw   )rounded_rectangle	rectanglera   r   r   rd   r   )rb   r   r   r   r   r   x1y1x2y2small	body_fonts               r%   _draw_email_cardr      s    NBB3rWXYYYNNBBR(vN666*4(((Ec"c*t"3445566IIIrBwR %e,IGGGTBGR"W-t),bdgibilnbnxyzzzzzzr$   
backgroundscener   r   Image.Image | NoneImage.Imagec               \   | j         | j        }}|t          j        d||fd          }ng|                                }t          j        d||fd          }t          j        |                    d          |                              d          }t          j        |          }d}	d}
d}d}t          d	|d
z            }t          t          d|dz            d          }t          t          d|dz            d          }t          t          d|dz                      }t          d|t          d|dz                      D ],}d|dz  dz  z   ddf}|                    d|||f|d           -|                    dd|df|	           t          |          }|j        dk    rt!          d|z
  | z  dz            }t#          ||||dz  z   f|j        |d|d|z  z
  d            t!          |d!z            }t'          |||||z
  |t!          |d"z            z   fd#d$|
t          d%|dz            &           |                    |t!          |d'z            ||z
  t!          |d(z            fd%d)*           |                    |d	z   t!          |d+z            fd,|d-.           n|j        d/k    r/t#          |||fd0|d|d|z  z
  d            t!          t-          j        |t,          j        z  d1z            d2z  d|z
  z            }t!          |d3d4d|z
  z  z
  z            }t'          |||z   |||z
  |z   |t!          |d5z            z   fd6d7|t          d%|d8z            &           t!          d9d9t3          t-          j        |t,          j        z  d:z                      z  z             }|                    ||z
  d;z
  |d	z   ||z
  d<z
  |d=z   f|d>df           nE|j        d?k    rt#          |||fd@|d|d|z  z
  d            t!          |dAz            }|||z
  }}|                    ||d;z
  |dBz   |d;z   fdCdD|
dEF           |                    |dGz   |dz
  fdH|dI.           t!          |dJz   ||z
  dKz
  |z  z             }|                    |dLz   |||f|
d           |                    ||f|dz
  |dz
  f|dz
  |dz   fg|
           |                    |dJz
  |dMz
  ||dMz   fd%dN|d:F           |                    |dBz
  |dz
  fdO|dP.           |dQk    ro|                    |t!          |dRz            ||z
  t!          |dSz            fddT|d:F           |                    |dCz   t!          |dUz            fdV|dP.           n|j        dWk    rt#          |||fdX|d|d|z  z
  d            |dz  t!          |dYz            f}|                    |d         dZz
  |d         dz
  |d         dZz   |d         dz   fdd[|	dEF           |                    |d         d\z
  |d         d<z
  fd]|d^.           d_d`|
fdadb|fdcdd|fg}g }t9          |          D ]\  } \  }!}"}t;          det          df|| dgz  z
  dhz                      }#t!          |di| djz  z   z            }$t!          ||d|z  z
  |#z  z             }%|                    |!|"||$|%f           |                    |d         |d         dkz   |%|$dlz   f|dm           |D ]b\  }!}"}}$}&|                    ||$||z
  |$t!          |dnz            z   fddo|d:F           |                    |d	z   |$dz   f|! dp|" |d.           cnddq|z  z   }'|t!          |d3z            ||z
  t!          |drz            f}(|                    |(dsdo|
dF           t#          ||dtz   t!          |duz            f|j        |d|d|z  z
  d=z
  d
            |                    |t!          |dvz            fdw||	.           |'})|S )xNRGB)      r;   RGBA)            )"         )4   r      )      $   )r   q   r   r      r      TrV   r;      r      r   0   rv   ,   r:   )r|   r   r   inbox_motionr9      r   rk   r   r   gRQ?gQ?z
Demo inboxz.All fields present
Format clean
Action obvious   )r   r   r   r   g
ףp=
?gHzG?)r   e   r   )r   r|   gQ?zStatus: works in the demo)   r      r{   email_card_interruptzThen one weird email arrives.r   r   g{Gz?g?g(\?z	New emailzL"hey can you handle this maybe??"

Missing name
Wrong format
Unclear requestr   P   r   r   rM   @   r   wrong_route_warningu   AI routes it confidently…gQ?      )r   v   n   r   r   &   AI)      r      ih     <   )      r   Wrong)      r   g?gffffff?g?)E   rv   rv   g\(\?z&Not an AI problem. A workflow problem.three_path_diagramzDecide the three paths first.gףp=
?x   )rO   )   ;   H   Input)r      r   Normalz
Go throughUnclearReviewzWeird/RiskyStopr1   r   g
ףp=
?gffffff?gGz?gzG?:   -   r   g?r   u    → gQ?gQ?rO   r   g?gRQ?zSystems over prompts.)r   r   r   newcopyalpha_compositeconvertr   Drawr   ra   ranger   r   r   visual_moder   r   renderer_textr   r   rd   r   sinr   absellipsepolygon	enumerater   rP   )*rJ   r   r   r   whimageoverlayrb   r   greenamberredmargin
title_fontmid_font
small_fonticolorpoffsetcard_yshaker   pulsecyr   r   	arrow_endstartlabels	positionsidxtopbottomrevealbyex_exzoomr   _s*                                             r%   _render_scener&     s
   :t{qA	%!Q55!!)FQFO<<%emmF&;&;WEEMMeTT>%  DFEE
CQ"WFs2qBw''d333JSQ"W%%D111Hs2qBw''((J 1aRb))** 5 5qBw"n$b"-		1aA,U!	4444NNAq!R=vN...hAN**a!er\D())1(<=u?RYcjy  FG  JK  NT  JT  FT  ^`  	a  	a  	a  	aQXF
FST]]<RS[g  oa  jo  |  @B  DE  IK  DK  |L  |L  	M  	M  	M  	MAHq6z3q4x==QZ\cpqqq		6B;AI/1LS[bq	rrrr		4	4	4/1PWahw  DE  HI  LR  HR  DR  \^  	_  	_  	_  	_DHX/!344q8ALIJJTDAEN*+,,1v:3Eq3qSWx==GXYal  tF  OT  ad  eg  ij  np  ip  aq  aq  	r  	r  	r  	rBc$(8dg+=+A"B"BCCCCDDa&j2oq2vq6zBBGuVXZ[n]]]]		3	3	3/1NU_fu  BC  FG  JP  FP  BP  Z\  	]  	]  	]  	]T]]VBBGR#XrBw?Q_invwxxx		27BG$d	PPPSBGcMQ#6677			28RB/e2	FFFy"o	BR'@9r>SUXZSZB[\chiiiS"r'2rBw?Q^hkstuuu		28R"W%wXO	TTTd??""FCDMM1v:s1t8}}#U^`gs  ~A  IJ"  K  K  KIIv{CDMM24\cm  uDI  E  E  E		2	2	2/1PWahw  DE  HI  LR  HR  DR  \^  	_  	_  	_  	_aQX'a3a2uQx#~uUVxZ\}]fho{  FL  TU  	V  	V  	V		58b=%(R-0'	___\51Ix3OR_agilQmn	)26):): 	S 	S%C%#vuc#3:(='EFFGGFQ$u,-..BVq1v:~7788Bc65"b9:::IIuQxqBBG<5PQIRRRR+4 	j 	j'CC""FBF
BQX<N#OXZamw|  EF"  G  G  GIIv{BG,.C.C6.C.C(YhIiiii	j 4!8|s1t8}}a&j#a$h--@s2L%WXYYYST]];U=PWahw  DE  HI  LR  HR  DR  UW  DW  ac  	d  	d  	d  	d		63q4x==)+BX^	___Lr$   )runnermax_frames_per_scener'  Runnerr(  
int | Nonec                  t          |           }|j        s't          d                    |j                            t          | j                  }|                    dd           t          | j                                      dd           g }i }| j	        pi 
                                D ]^\  }}t          j        |                              d                              | j        | j        ft          j        j                  ||<   _d}	| j        j        D ]}
|
j        |
j        z
  dz  }t/          dt1          || j        z                      }|t5          ||          }t7          |          D ]}|t/          d|dz
            z  }t9          | |
||                    |
j                            }|d	|	d
dz  }|                    |d           |                     tC          |                     |	dz  }	t          | j"                  }d| j        z  |#                    d                    fd|D                       d           dddddddtC          |          dddtC          | j                  ddddd d!| j$        g} ||ddd"#          }tK          | j$        tM          |          | j"        |j'        |j(        |j)        $          S )%Nr8   T)parentsexist_okr   r   i  r:   r   frame_05dz.pngPNG)formatrh   c              3  j   K   | ]-}d t          |                                           dddV  .dS )zfile 'z'
duration z.8f
N)r   resolve)r>   r@   frame_durations     r%   	<genexpr>z(render_motion_preview.<locals>.<genexpr>
  sM      "}"}im#dDJJ,>,>,@,@#d#dn#d#d#d#d"}"}"}"}"}"}r$   zutf-8)encodingr0   z-yz-fconcatz-safe0z-iz-vfzformat=yuv420pz-rz-c:vlibx264z-presetveryfastz	-movflagsz
+faststartF)capture_outputrd   check)r   r(   r   r)   r*   r+   )*rG   rB   rC   rD   rE   r   r   mkdirr   r   rF   r   openr   resizer   r   
ResamplingLANCZOSr   scenesend_msstart_msr   roundr   r   r   r&  getr?   saverP   r   r   
write_textr   r'   rT   r)   r*   r+   )rJ   r'  r(  rH   r   r(   background_cacher?   r@   frame_indexr   scene_durationcountlocal_indexr   r  r   command	completedr5  s                      @r%   render_motion_previewrQ     s'    -T22J 7:#455666T^$$IOOD4O000t<<<K/106B==?? A A$%*Z%5%5%=%=e%D%D%K%KTZY]YdLeglgwg  &A  &A""K'  ,74?Au^dh67788+344E << 	 	K"SEAI%6%66H!$xDTDXDXY^YgDhDhiiiE======DJJtEJ***s4yy)))1KK	 t'((K\N277"}"}"}"}q|"}"}"}}}  IP  Q  Q  QKDH'G* wt$eLLLI$+&&$'   r$   )
r   r   r   r3   r2   r4   r   r5   r6   r   )rJ   r   r6   r
   )rX   r   rW   rY   )rb   rc   rd   r   re   r   r6   rf   )rb   rc   rx   ry   rd   r   re   r   rw   r   r6   r   )r   r4   r6   r4   )rb   rc   r   r   r   r   r   r   r   r   r   r   r6   r   )
rJ   r   r   r   r   r4   r   r   r6   r   )rJ   r   r'  r)  r(  r*  r6   r'   )$__doc__
__future__r   collections.abcr   dataclassesr   pathlibr   r   
subprocessPILr   r   r	   autoshorts.ideas.candidater
   %autoshorts.rendering.final_video_planr   r   r   CompletedProcessr   r)  r   r'   rK   rG   ra   ru   r   r   r   r&  runrQ  r   r$   r%   <module>r]     sz   H H " " " " " " $ $ $ $ $ $ ! ! ! ! ! !            + + + + + + + + + + 7 7 7 7 7 7 l l l l l l l l l l	#z2377	8 $) ) ) ) ) ) ) ) $2 2 2 2 2 2 2 2 59     BG G G G. &+ $ $ $ $ $ $   & A      H H H H{ { { { x| L L L L L Ld  ^'+	? ? ? ? ? ? ? ?r$   