o
    Y+i_                     @   sL   d Z ddlZddlZddlmZ ddlmZmZ G dd deZ	dd Z
dS )	z, Experimental module for subtitles support.     Ncvsecs)TextClip	VideoClipc                   @   sL   e Zd ZdZdddZdddZdd Zd	d
 Zdd Zdd Z	dd Z
dS )SubtitlesClipa   A Clip that serves as "subtitle track" in videos.
    
    One particularity of this class is that the images of the
    subtitle texts are not generated beforehand, but only if
    needed.

    Parameters
    ==========

    subtitles
      Either the name of a file, or a list

    Examples
    =========
    
    >>> from moviepy.video.tools.subtitles import SubtitlesClip
    >>> from moviepy.video.io.VideoFileClip import VideoFileClip
    >>> generator = lambda txt: TextClip(txt, font='Georgia-Regular', fontsize=24, color='white')
    >>> sub = SubtitlesClip("subtitles.srt", generator)
    >>> myvideo = VideoFileClip("myvideo.avi")
    >>> final = CompositeVideoClip([clip, subtitles])
    >>> final.write_videofile("final.mp4", fps=myvideo.fps)
    
    Nc                    s   t jdd t|trt|}|_t _|d u rdd }|_d_	t
dd jD _j_fdd	  fd
d} fdd}|_tdj}|r^t |dd_d S d _d S )NF)has_constant_sizec                 S   s   t | ddddddS )NzGeorgia-Bold   whiteblackg      ?)fontfontsizecolorstroke_colorstroke_width)r   )txt r   P/var/www/html/venv/lib/python3.10/site-packages/moviepy/video/tools/subtitles.py<lambda>1   s    z(SubtitlesClip.__init__.<locals>.<lambda>r   c                 S   s   g | ]\\}}}|qS r   r   .0tatbr   r   r   r   
<listcomp>7   s    z*SubtitlesClip.__init__.<locals>.<listcomp>c                    sf    fddj  D }|s fddjD }|sdS |d }|j  vr1|d j |< |S )z Will generate a textclip if it hasn't been generated asked
            to generate it yet. If there is no subtitle to show at t, return
            false. c                    8   g | ]\\}}}|   kr|k rn n||f|fqS r   r   r   tr   r   r   >       
zHSubtitlesClip.__init__.<locals>.add_textclip_if_none.<locals>.<listcomp>c                    r   r   r   r   r   r   r   r   A   r   Fr      )	textclipskeys	subtitlesmake_textclipr   subselfr   r   add_textclip_if_none:   s   z4SubtitlesClip.__init__.<locals>.add_textclip_if_nonec                    s.    | }|rj | | S tg dggS )N)r   r   r   )r   	get_framenparrayr"   r&   r%   r   r   
make_frameK   s   z*SubtitlesClip.__init__.<locals>.make_framec                    s,    | }|rj | j| S tdggS )Nr   )r   maskr'   r(   r)   r"   r*   r   r   make_mask_frameP   s   z/SubtitlesClip.__init__.<locals>.make_mask_frameTT)ismask)r   __init__
isinstancestrfile_to_subtitlesr    dictr   r!   startmaxdurationendr+   boolr,   )r%   r    r!   r+   r-   hasmaskr   r*   r   r0   %   s"   
 zSubtitlesClip.__init__c                    s2   fdd fdd fdd| j D S )z Returns a sequence of [(t1,t2), txt] covering all the given subclip
        from t_start to t_end. The first and last times will be cropped so as
        to be exactly t_start and t_end if possible. c                    sB   z|   ko
 k n  p|  k o kW S   W S    Y dS )NFr   t1t2t_endt_startr   r   is_in_subclip^   s   4z/SubtitlesClip.in_subclip.<locals>.is_in_subclipc                    s*   zt | t| fW S    | |f Y S N)r6   minr;   r>   r   r   try_croppingc   s   z.SubtitlesClip.in_subclip.<locals>.try_croppingc                    s,   g | ]\\}}} ||r|||fqS r   r   )r   r<   r=   r   )rA   rD   r   r   r   h   s    z,SubtitlesClip.in_subclip.<locals>.<listcomp>r    )r%   r@   r?   r   )rA   r?   r@   rD   r   
in_subclipY   s   zSubtitlesClip.in_subclipc                 C   s
   t | jS rB   )iterr    r$   r   r   r   __iter__m      
zSubtitlesClip.__iter__c                 C   s
   | j | S rB   rE   )r%   kr   r   r   __getitem__r   rI   zSubtitlesClip.__getitem__c                    s"   dd  d  fdd| jD S )Nc                 S   s*   | \\}}}t |}t |}d|||f S )Nz
%s - %s
%sr   )sub_elementr   r   r   ftaftbr   r   r   to_srty   s   z%SubtitlesClip.__str__.<locals>.to_srtz

c                 3   s    | ]} |V  qd S rB   r   )r   srO   r   r   	<genexpr>   s    z(SubtitlesClip.__str__.<locals>.<genexpr>)joinr    r$   r   rQ   r   __str__w   s   zSubtitlesClip.__str__c                    s   t  fdd| jD S )Nc                    s$   g | ]}t  |d  g kr|qS )r   )refindall)r   eexprr   r   r      s    z,SubtitlesClip.match_expr.<locals>.<listcomp>)r   r    )r%   rY   r   rX   r   
match_expr   s   zSubtitlesClip.match_exprc                 C   s>   t |d}|t|  W d    d S 1 sw   Y  d S )Nzw+)openwriter2   )r%   filenamefr   r   r   	write_srt   s   "zSubtitlesClip.write_srtrB   )NN)__name__
__module____qualname____doc__r0   rF   rH   rK   rT   rZ   r_   r   r   r   r   r      s    

4r   c                 C   s   g }d}d}t | d9}|D ]-}td|}|r dd |D }q| dkr5|||df d\}}q|r;||7 }qW d   |S 1 sGw   Y  |S )	z Converts a srt file into subtitles.

    The returned list is of the form ``[((ta,tb),'some text'),...]``
    and can be fed to SubtitlesClip.

    Only works for '.srt' format for the moment.
    N rz([0-9]*:[0-9]*:[0-9]*,[0-9]*)c                 S   s   g | ]}t |qS r   r   )r   r   r   r   r   r      s    z%file_to_subtitles.<locals>.<listcomp>
)Nrd   )r[   rU   rV   stripappend)r]   times_textscurrent_timescurrent_textr^   linetimesr   r   r   r3      s&   



r3   )rc   rU   numpyr(   moviepy.toolsr   moviepy.video.VideoClipr   r   r   r3   r   r   r   r   <module>   s     