
    Hj#(                        d Z ddlm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mZmZ ddd	d
ddZdGdHdZdIdZdJdZdKd&ZdLd-Z	 dMdNd2ZdOd6ZdPdQd:ZdRd?ZdSdBZ	 	 	 dTdUdFZdS )Va  Deterministic preview renderer for AutoShortsBot render manifests.

This v1 renderer intentionally uses manifest-driven cards/placeholders instead of
AI-generated video. It renders a simple vertical MP4 suitable for timing and
approval review before investing in polished assets.
    )annotationsN)Path)Any)Image	ImageDraw	ImageFont))      &   )O   F      )   r
   *   )         ))      '   )         ))      r
   )"      ^   )r   r      )   U      )kinetic_textscreen_recordingcard_animationstock_brollgenerated_backgroundFsizeintboldboolreturn,ImageFont.FreeTypeFont | ImageFont.ImageFontc                    |rdnd|rdndg}|D ];}t          |                                          rt          j        ||           c S <t          j                    S )Nz4/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttfz//usr/share/fonts/truetype/dejavu/DejaVuSans.ttfz=/usr/share/fonts/truetype/liberation2/LiberationSans-Bold.ttfz@/usr/share/fonts/truetype/liberation2/LiberationSans-Regular.ttf)r*   )r   existsr   truetypeload_default)r*   r,   
candidatespaths       U/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/autoshorts/preview_renderer.py_fontr7      s    BF}>>L}KO  	XGG  VXJ  7 7:: 	7%d666666	7!###    textstrwidth_charsc                    d                     t          j        d                     |                                           |                    S )N
 )width)jointextwrapwrapsplit)r9   r;   s     r6   
_wrap_textrD   '   s7    99X]388DJJLL#9#9MMMNNNr8   drawImageDraw.ImageDrawfontr   spacingtuple[int, int]c                >    |                                 pdg} fd|D             }t          d |D             d          }t          d |D                       |t          dt          |          dz
            z  z   }t	          |          t	          |          fS )N c                @    g | ]}                     d |          S )r   r   rG   textbbox.0linerE   rG   s     r6   
<listcomp>z$_text_block_size.<locals>.<listcomp>-   s+    FFFT]]64d]33FFFr8   c              3  8   K   | ]}|d          |d         z
  V  dS )   r   N rR   boxs     r6   	<genexpr>z#_text_block_size.<locals>.<genexpr>.   .      22SQ#a&222222r8   r   )defaultc              3  8   K   | ]}|d          |d         z
  V  dS )      NrW   rX   s     r6   rZ   z#_text_block_size.<locals>.<genexpr>/   r[   r8   r_   )
splitlinesmaxsumlenr+   )rE   r9   rG   rH   linesboxesr?   heights   ` `     r6   _text_block_sizerg   +   s    OO%"EFFFFFFFFE22E222A>>>E22E22222Ws1c%jjSTn?U?U5UUFu::s6{{""r8   	max_width
max_height	max_linespreferred_sizemin_sizedict[str, Any]c                   d                     |                                          }t          ||dz
  d          D ]}	t          dt	          ||	dz  z                      }
t          ||
          }|                                }t          |	|          }t          dt	          |	dz                      }t          | |||          \  }}t          |          |k    r#||k    r||k    r|||	t          |          |d	c S t          ||          }t          dt	          ||dz  z                      }t          ||          }|||t          |                                          t          dt	          |dz                      d	S )
z>Choose a readable font size and wrapping that fits a text box.r>   r_   
   gHzG?r,      g      ?)r9   rG   	font_size
line_countrH   )
r@   rC   rangera   roundrD   r`   r7   rg   rc   )rE   r9   rh   ri   rj   rk   rl   r,   cleanedr*   
wrap_charswrappedrd   rG   rH   block_widthblock_heightfallback_fontfallback_charsfallbacks                       r6   _fit_text_blockr   3   s    hhtzz||$$GnhlB77  U9t#<==>>
Wj11""$$T%%%atd{++,,$4T7D'$R$R!\u::""{i'?'?LT^D^D^!!%jj"     (...MU94#@AABBN'>22H(--//00q%40011  r8   r?   rf   starttuple[int, int, int]endImage.Imagec                B   t          j        d| |f          }t          j        |          }t	          |          D ]_}|t          d|dz
            z  t          fdt	          d          D                       }|                    d|f| |fg|           `|S )NRGBr_   c              3  f   K   | ]+}t          |         d z
  z  |         z  z             V  ,dS )r_   N)rv   )rR   ir   ratior   s     r6   rZ   z_gradient.<locals>.<genexpr>`   sE      WWeE!HE	2SVe^CDDWWWWWWr8   r^   r   )fill)r   newr   Drawru   ra   tuplerS   )	r?   rf   r   r   imagerE   ycolorr   s	     ``    @r6   	_gradientr   [   s    IeeV_e44E>%  D6]] 4 4C6A:&&&WWWWWWeTUhhWWWWW		Aq6E1:&U	3333Lr8      xyr   Nonec                    |                                 } fd|D             }d |D             }t          |          |t          dt          |          dz
            z  z   }	|d         |	dz  z
  }
t	          |||          D ]F\  }}}|d         |d         z
  }                     |d         |dz  z
  |
f||           |
||z   z  }
Gd S )Nc                @    g | ]}                     d |          S rM   rO   rQ   s     r6   rT   z*_draw_multiline_center.<locals>.<listcomp>n   s+    KKKT$--4-88KKKr8   c                0    g | ]}|d          |d         z
  S )r^   r_   rW   rX   s     r6   rT   z*_draw_multiline_center.<locals>.<listcomp>o   s$    :::CFSVO:::r8   r   r_   rV   rG   r   )r`   rb   ra   rc   zipr9   )rE   r   r9   rG   r   rH   rd   
line_boxesline_heightstotal_heightr   rS   rY   line_height
line_widths   `  `           r6   _draw_multiline_centerr   e   s     OOEKKKKKUKKKJ::z:::L|$$wQE

Q1G1G'GGL
1!!A"%eZ"F"F # #c;Vc!f_
		2a5:?*A.4d	KKK	[7""# #r8   itemmanifest"tuple[Image.Image, dict[str, int]]c                   t                               | d         d          \  }}t          ||||          }t          j        |          }t          |dz            }t          t          dt          |dz                      d          }	t          t          dt          |d	z                      d
          }
t          t          dt          |dz                      d
          }t          |dz            }t          |dz            }|                    ||||z
  |gt          |dz            ddt          d|dz                       |	                    |t          |dz            f|d         d         |
d           |	                    |t          |dz            f| d         
                    dd                                          |	d           | d         
                    dd                                          }|	                    |dz  ||z   f||d           t          || d         ||dz  z
  t          |dz            dt          d t          |d!z                      t          dt          |d"z                      d#          }t          ||dz  t          |d$z            f|d         |d%         d&|d'         (           t          ||                     d)d*          ||dz  z
  t          |d+z            d,t          d-t          |d.z                      t          dt          |d/z                      d
#          }t          ||dz  t          |d0z            f|d         |d%         d|d'         (           | d1         d2z  d3d4| d1         | d5         z   d2z  d3d6}|	                    ||t          |dz            z
  f||
d           |	                    ||z
  |                    d7|
8          z
  |t          |dz            z
  fd7|
d           ||d9         |d:         |d9         |d:         d;fS )<Ntype)r    )@   r   r   g333333?   gQ?Trq      gMb?Fg rh?g
ףp=
?g(\?g{Gz?)   r   r   )         rV      )radiusr   outliner?   g)\(?videoidr   g
ףp=
?_r>   gffffff?)G   r#   i   r9   rr   gQ?   g+?gT㥛 ?)rh   ri   rj   rk   rl   r,   g?rG   r   rH   )rH   retention_goalrK   gQ?r^   r   g~jt?gˡE?gGz?start_ms  z.1fu   s – duration_mssPREVIEWrN   rs   rt   )main_font_sizemain_line_countretention_font_sizeretention_line_count)BACKGROUND_BY_TYPEgetr   r   r   rv   r7   ra   rounded_rectangler9   replaceupperr   r   
textlength)r   r   r?   rf   r   r   r   rE   margin
title_font
label_font
small_fontcard_topcard_bottomscene_labelmain_fitretention_fittimings                     r6   _render_scene_imager   x   s    $''V6RSSJE3eVUC00E>%  D55=!!Fs2uUT\2233$???Js2uUU]33445AAAJs2uUU]33445AAAJ Vd]##H&&K	56>;7UT\""!Uc\""     	IIvuVe^,,-x/@/FZ^mInnnIIvuVd]++,d6l.B.B3.L.L.R.R.T.T[el{I|||t*$$S#..4466KIIv|X./:TaIbbbV&1*$$''2uUU]3344Ruu}--..	 	 	H 	!U6D=))*#    $!2&&&1*$$''2uUU]3344Ruu}--..	 	 	M 	!U6D=))*ffi(    Z 4'iiiD4DtMGZ4Z^b3biiiiFIIvvfun 5 556ZVeIfffIIuv~	
 K KKVV[\bej\jVkVkMklnw  I  P_I  `  `  `";/#L1,[9 -l ;	   r8       list[dict[str, Any]]c           
         d | d         D             }g }|D ]K}t          || ||          \  }}|                    |d         |d         |d         |d         ||d           L|S )z8Build one representative image per visual timeline item.c                *    g | ]}|d          dk    |S )trackvisualrW   )rR   r   s     r6   rT   z(build_preview_frames.<locals>.<listcomp>   s&    WWWTT']h=V=VD=V=V=Vr8   timeliner   r   r   r9   )scene_idr   r   r9   
typographyr   )r   append)r   r?   rf   visual_itemsframesr   r   r   s           r6   build_preview_framesr      s    WWXj%9WWWL#%F 
 
/hvNNz J ,#M2V( 		
 		
 		
 		
 Mr8   r   
output_dirr   
list[Path]c                    |                     dd           g }t          | d          D ]H\  }}|d|dd|d          d	z  }|d
                             |           |                    |           I|S )z+Write preview frames as numbered PNG files.Tparentsexist_okr_   )r   frame_03dr   r   z.pngr   )mkdir	enumeratesaver   )r   r   pathsindexframer5   s         r6   write_frame_imagesr      s    TD111E!&222  uHUHHHz1BHHHHgD!!!TLr8   image_pathsconcat_pathc                   g }t          | |          D ]b\  }}t          d|d         dz            }|                    d|                                 d           |                    d|d           c|r1|                    d|d                                          d           |                    d	                    |          d	z   d
           d S )Ng      ?r   r   zfile ''z	duration z.3fro   r=   zutf-8)encoding)r   ra   r   as_posix
write_textr@   )r   r   r   rd   r   
image_pathsecondss          r6   _write_concat_filer      s    E 55 0 0zc5/$6776j1133666777....//// =;k"o6688;;;<<<499U++d2WEEEEEr8   r   output_pathfpsc                .   t          j        d          }|st          d          |j                            dd           t          | ||          }t          j        d          5 }t          |          }t          ||dz            }	|d	z  }
t          ||	|
           |d
dddddt          |
          dd| dddt          |          g}t          j        |ddd          }ddd           n# 1 swxY w Y   |t          |          ||j        dS )zDRender a manifest-driven preview MP4 using Pillow frames and ffmpeg.ffmpegz.ffmpeg is required to render preview MP4 filesTr   )r?   rf   autoshorts_preview_)prefixr   z
concat.txtz-yz-fconcatz-safe0z-iz-vfzfps=z,format=yuv420pz	-movflagsz
+faststart)checkcapture_outputr9   N)r   frame_countr   stderr)shutilwhichRuntimeErrorparentr   r   tempfileTemporaryDirectoryr   r   r   r:   
subprocessrunrc   r  )r   r   r?   rf   r   r   r   tmptmp_dirr   r   command	completeds                r6   render_preview_videor     s    \(##F MKLLLTD999!(%GGGF		$,A	B	B	B Xcs))(81CDD,6;<<<'3'''
 N7$tRVWWW	)X X X X X X X X X X X X X X X, #6{{"	  s   )A>C33C7:C7)F)r*   r+   r,   r-   r.   r/   )r9   r:   r;   r+   r.   r:   )
rE   rF   r9   r:   rG   r   rH   r+   r.   rI   )rE   rF   r9   r:   rh   r+   ri   r+   rj   r+   rk   r+   rl   r+   r,   r-   r.   rm   )
r?   r+   rf   r+   r   r   r   r   r.   r   )r   )rE   rF   r   rI   r9   r:   rG   r   r   r   rH   r+   r.   r   )
r   rm   r   rm   r?   r+   rf   r+   r.   r   )r   r   )r   rm   r?   r+   rf   r+   r.   r   )r   r   r   r   r.   r   )r   r   r   r   r   r   r.   r   )r   r   r   )r   rm   r   r   r?   r+   rf   r+   r   r+   r.   rm   )__doc__
__future__r   r  r  r  rA   pathlibr   typingr   PILr   r   r   r   r7   rD   rg   r   r   r   r   r   r   r   r  rW   r8   r6   <module>r     s    # " " " " "                    + + + + + + + + + + 2640:  $ $ $ $ $O O O O# # # #% % % %P     # # # # #&K K K K\    &   F F F F ( ( ( ( ( ( (r8   