
    sj              	          d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddd	Z
d
ZdZdddddddddZd1dZd2dZd3d!Zd4d#Zd5d&Zd5d'Zd6d)Zd7d*Zd8d+Zd9d0ZdS ):zDRenderer manifest generation for retention-led AutoShortsBot videos.    )annotationsN)Path)Any)_slugi8  i  )widthheightz9:16   z7Generated by renderer from text and style instructions.zWNeeds captured or synthesized vertical screen recording; avoid fake unreadable UI text.zIGenerated by renderer from concise text cards; animate one idea per beat.zENeeds human/phone/context B-roll; avoid generic corporate stock feel.zDOptional abstract background only; must not become the main content.zQNeeds photorealistic vertical AI-video clip; no baked text, logos, or watermarks.z[Needs renderer-generated mechanism/layer animation with visible movement every 1-2 seconds.zQGenerated by renderer as large beat-synced caption overlays, not paragraph cards.)kinetic_textscreen_recordingcard_animationstock_brollgenerated_backgroundcinematic_ai_videomechanism_animationkinetic_text_overlayvalueint | floatreturnintc                @    t          t          |           dz            S )N  )roundfloat)r   s    T/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/autoshorts/render_manifest.py_seconds_to_msr      s    u$%%%    startendc                \    t          dt          |          t          |           z
            S )Ni  )maxr   )r   r   s     r   _duration_msr!       s'    sN3''.*?*??@@@r   
asset_typestrvideo_idscenec                    d| d|dd|  S )Nzplaceholder://z/scene-02d/ )r"   r$   r%   s      r   _placeholderr*   $   s#    EHEEUEEEEEEr   dict[str, Any]c                   ddd| d         dk    rdnddd	}| d
         dk    r|                     ddd           n| d
         dk    r|                     ddd           n| d
         dk    r|                     ddd           nq| d
         dk    r|                     dddd           nK| d
         dk    r|                     dddd           n%| d
         dk    r|                     dd dd!           |S )"N   	bold_sanssentencer%      	push_zoomcut_or_slidehigh)safe_area_pctfontcaption_casemotioncontrastr"   r   minimal_cards   )layoutmax_words_on_screenr   screen_plus_captionT)r;   blur_sensitive_uir   broll_under_captionfast_cut)r;   pacer   cinematic_under_caption)r;   no_baked_textrA   r   xray_layer_reveal
   )r;   r<   layered_motionr   kinetic_full_frame   )r;   r<   beat_synced)update)r%   bases     r   _visual_stylerL   (   sT   "!&w1!4!4++. D \...rJJKKKK	|	 2	2	244PPQQQQ	|		-	-4jIIJJJJ	|	 4	4	484Ycddeeee	|	 5	5	522aeffgggg	|	 6	6	63B_cddeeeKr   planlist[dict[str, Any]]c                   | d         }g }| d         D ]}|                     d|d         dd|d         t          |d         ||d                   t          |d                   t          |d         |d	                   |d
         |d         |                    dd          |                    dd          |d         t          |          d           |S )Nidscenesscene_r%   r'   visualr"   r   r   on_screen_textvisual_directionvisual_motionr2   	sound_cuenoneretention_goal)rP   tracktype	asset_refstart_msduration_mstextrU   rV   rW   rY   style)appendr*   r   r!   getrL   )rM   r$   itemsr%   s       r   _visual_timeline_itemsrd   ?   s    DzH"$Eh 
 
3uW~333!l+)%*=xwXX*5>::+E'NE%LII./$)*<$=!&?N!K!K"YY{F;;"'(8"9&u-- 	
 	
 	
 	
  Lr   c                   |                      dg           }t          | d                   dz  }g }t          |          D ]\  }}t          |d                   }|dz   t	          |          k     rt          ||dz            d                   n|}|                    d|dz   ddd	|t          d
||z
            |d         dddddd           |S )Ncaption_beatsestimated_secondsr   r   r0   caption_r'   captionskinetic_captioni  r_   r-   lower_third   T)r4   positionmax_chars_per_linehighlight_keywords)rP   rZ   r[   r]   r^   r_   r`   )rb   r   	enumerater   lenra   r    )rM   beatstotal_msrc   indexbeatr]   next_start_mss           r   _caption_timeline_itemsrw   V   s   HH_b))E4+,--4H"$E '' 
 
t!$w-00EJQYQTUZQ[Q[E[E[uUQY'7'@AAAai0000#)$"3(@AAV%& -*,*.	  	
 	
 	
 	
  Lr   dict[str, list[dict[str, Any]]]c           
     *   d t           D             }| d         D ]x}|d         }|                    |g                               |d         t          || d         |d                   |d         t                               |d          d           y|S )	Nc                    i | ]}|g S r)   r)   ).0keys     r   
<dictcomp>z'_asset_requirements.<locals>.<dictcomp>q   s    4`4`4`S"4`4`4`r   rQ   r"   r%   rP   rU   z,Provide asset matching the visual direction.)r%   r\   briefhint)ASSET_REQUIREMENT_HINTS
setdefaultra   r*   rb   )rM   requirementsr%   r"   s       r   _asset_requirementsr   p   s    4`4`H_4`4`4`Lh 	
 	
<(

B//66w)*d4j%.QQ12/33J@noo	 	
 	
 	
 	
 r   c                    t          |           t          |           z   }ddd|                    fd           d| d         | d         | d	         t          | d
                   dz  t          t
          t          d|t          |           dd|                     di                               dd          dd|                     di                               dd          dd|                     dg           dS )z>Convert a human shot plan into a structured renderer contract.r   r0   )rS   ri   c                Z    | d                              | d         d          | d         fS )Nr]   rZ   c   rP   )rb   )itemtrack_orders    r   <lambda>z'build_render_manifest.<locals>.<lambda>   s-    D$4kood7mUW6X6XZ^_cZd#e r   )r|   zrender_manifest.v1rP   titlepillarrg   r   )rP   r   r   r^   aspect_ratio
resolutionfpsT   final_render_intentvisual_change_every_secondsr:   static_card_limit)avoid_static_slideshowpattern_interrupt_every_secondsr   first_frame_hook_requiredmax_words_per_visual_cardmax_static_cards&human_approval_required_before_publishproduction_notes)schema_versionvideotimelineasset_requirementsrender_constraintsr   )	rd   rw   sortr   ASPECT_RATIO
RESOLUTIONFPSr   rb   )rM   r   r   s     @r   build_render_manifestr      s   %d++.Ed.K.KKHA..KMMeeeeMfff.t*']8nt$7899D@($
 
 1$77&*/0+/884I2+N+N+R+RSprs+t+t)-)+ $)> C C G GH[]^ _ _6:
 
 !HH%7<<-  r   c                    t          | d                   }| d         }|                    |          r| dS | d| dS )Nr   rP   z.json-)r   endswith)rM   
title_slugr$   s      r   _manifest_filenamer      sX    tG}%%JDzH$$ "!!!!******r   plans
output_dirr   
list[Path]c                   |                     dd           g }| D ]g}t          |          }|t          |          z  }|                    t	          j        |dd          dz   d           |                    |           h|S )	z,Write render manifests as pretty JSON files.T)parentsexist_ok   F)indentensure_ascii
zutf-8)encoding)mkdirr   r   
write_textjsondumpsra   )r   r   pathsrM   manifestpaths         r   write_render_manifestsr      s    TD111E  (...t444
8AEJJJTQ\cdddTLr   )r   r   r   r   )r   r   r   r   r   r   )r"   r#   r$   r#   r%   r   r   r#   )r%   r+   r   r+   )rM   r+   r   rN   )rM   r+   r   rx   )rM   r+   r   r+   )rM   r+   r   r#   )r   rN   r   r   r   r   )__doc__
__future__r   r   pathlibr   typingr   autoshorts.script_draftsr   r   r   r   r   r   r!   r*   rL   rd   rw   r   r   r   r   r)   r   r   <module>r      su   J J " " " " " "              * * * * * *t,,
 NqaZbmxo	 	 & & & &A A A AF F F F   .   .   4      >+ + + +	 	 	 	 	 	r   