U
    a+d_                     @   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 kr>dd }|_d_	t
dd jD _j_fdd	  fd
d} fdd}|_tdj}|rt |ddnd _d S )NF)Zhas_constant_sizec                 S   s   t | ddddddS )NzGeorgia-Bold   ZwhiteZblackg      ?)fontZfontsizecolorZstroke_colorZstroke_width)r   )txt r   A/tmp/pip-unpacked-wheel-0yp4gafk/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 }|s8 fddjD }|s8dS |d }|j  krb|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                    s8   g | ]0\\}}}|   kr$|k rn q||f|fqS r   r   r   tr   r   r   >   s
    
 
 zHSubtitlesClip.__init__.<locals>.add_textclip_if_none.<locals>.<listcomp>c                    s8   g | ]0\\}}}|   kr$|k rn q||f|fqS r   r   r   r   r   r   r   A   s
    
 
 Fr      )	textclipskeys	subtitlesmake_textclipr   subselfr   r   add_textclip_if_none:   s    z4SubtitlesClip.__init__.<locals>.add_textclip_if_nonec                    s0    | }|rj | | S tdddgggS Nr   )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 r   )r   maskr    r!   r"   r   r#   r   r   make_mask_frameP   s    z/SubtitlesClip.__init__.<locals>.make_mask_frameTT)Zismask)r   __init__
isinstancestrfile_to_subtitlesr   dictr   r   startmaxdurationendr$   boolr%   )r   r   r   r$   r&   Zhasmaskr   r#   r   r(   %   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                    sF   z2|   ko k n  p0|  k o, kn  W S    Y dS X d S )NFr   t1t2t_endt_startr   r   is_in_subclip^   s    2z/SubtitlesClip.in_subclip.<locals>.is_in_subclipc                    s0   zt | t| fW S    | |f Y S X d S N)r.   minr2   r5   r   r   try_croppingc   s    z.SubtitlesClip.in_subclip.<locals>.try_croppingc                    s,   g | ]$\\}}} ||r|||fqS r   r   )r   r3   r4   r
   )r8   r;   r   r   r   h   s    

z,SubtitlesClip.in_subclip.<locals>.<listcomp>r   )r   r7   r6   r   )r8   r6   r7   r;   r   
in_subclipY   s    zSubtitlesClip.in_subclipc                 C   s
   t | jS r9   )iterr   r   r   r   r   __iter__m   s    zSubtitlesClip.__iter__c                 C   s
   | j | S r9   r<   )r   kr   r   r   __getitem__r   s    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   )Zsub_elementr   r   r
   ZftaZftbr   r   r   to_srty   s    z%SubtitlesClip.__str__.<locals>.to_srtz

c                 3   s   | ]} |V  qd S r9   r   )r   srB   r   r   	<genexpr>   s     z(SubtitlesClip.__str__.<locals>.<genexpr>)joinr   r   r   rD   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   rL   r   rK   r   
match_expr   s    zSubtitlesClip.match_exprc              	   C   s(   t |d}|t|  W 5 Q R X d S )Nzw+)openwriter*   )r   filenamefr   r   r   	write_srt   s    zSubtitlesClip.write_srt)N)NN)__name__
__module____qualname____doc__r(   r=   r?   rA   rG   rM   rR   r   r   r   r   r      s   
4
r   c              	   C   s   g }d}d}t | df}|D ]Z}td|}|r@dd |D }q| dkrj|||df d\}}q|r||7 }qW 5 Q R X |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>
)NrW   )rN   rH   rI   stripappend)rP   Ztimes_textsZcurrent_timesZcurrent_textrQ   linetimesr   r   r   r+      s    
r+   )rV   rH   Znumpyr!   Zmoviepy.toolsr   Zmoviepy.video.VideoClipr   r   r   r+   r   r   r   r   <module>   s    