§
    öf§jÔ  ã                   óˆ   — d 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
  G d„ de
¦  «        Z ed¦  «        d
d	„¦   «         ZdS )z*Experimental module for subtitles support.é    N)Úconvert_path_to_string©Úconvert_to_seconds)ÚTextClipÚ	VideoClipc                   ó@   — e Zd ZdZd
d„Zdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dS )ÚSubtitlesClipax  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 as a string or path-like object, or a list

    font
        Path to a font file to be used. Optional if make_textclip is provided.

    make_textclip
        A custom function to use for text clip generation. If None, a TextClip
        will be generated.

        The function must take a text as argument and return a VideoClip
        to be used as caption

    encoding
        Optional, specifies srt file encoding.
        Any standard Python encoding is allowed (listed at
        https://docs.python.org/3.8/library/codecs.html#standard-encodings)

    Examples
    --------

    .. code:: python

        from moviepy.video.tools.subtitles import SubtitlesClip
        from moviepy.video.io.VideoFileClip import VideoFileClip
        generator = lambda text: TextClip(text, font='./path/to/font.ttf',
                                        font_size=24, color='white')
        sub = SubtitlesClip("subtitles.srt", make_textclip=generator, encoding='utf-8')
        myvideo = VideoFileClip("myvideo.avi")
        final = CompositeVideoClip([clip, subtitles])
        final.write_videofile("final.mp4", fps=myvideo.fps)

    Nc                 ó*  ‡ ‡— t          j        ‰ d¬¦  «         t          |t          ¦  «        st	          ||¬¦  «        }|‰ _        t          ¦   «         ‰ _        |‰ _        |€‰ j        €t          d¦  «        ‚ˆ fd„}|‰ _
        d‰ _        t          d„ ‰ j        D ¦   «         ¦  «        ‰ _        ‰ j        ‰ _        ˆ fd„Šˆˆ fd	„}ˆˆ fd
„}|‰ _        t!          ‰  
                    d¦  «        j        ¦  «        }|rt          |d¬¦  «        nd ‰ _        d S )NF)Úhas_constant_size©Úencodingz3Argument font is required if make_textclip is None.c                 ó8   •— t          ‰j        | dddd¬¦  «        S )Né   z#ffffffz#000000é   )ÚfontÚtextÚ	font_sizeÚcolorÚstroke_colorÚstroke_width)r   r   )ÚtxtÚselfs    €úiC:\Users\johnn\AppData\Local\Programs\Python\Python311\Lib\site-packages\moviepy/video/tools/subtitles.pyÚmake_textclipz-SubtitlesClip.__init__.<locals>.make_textclipJ   s.   ø€ ÝØœØØ Ø#Ø!*Ø!"ðñ ô ð ó    r   c                 ó   — g | ]
\  \  }}}|‘ŒS © r   )Ú.0ÚtaÚtbr   s       r   ú
<listcomp>z*SubtitlesClip.__init__.<locals>.<listcomp>V   s    € ÐFÐFÐF¡O¡X b¨"¨s˜RÐFÐFÐFr   c                 ó  •‡ — ˆ fd„‰j                              ¦   «         D ¦   «         }|sˆ fd„‰j        D ¦   «         }|sdS |d         }|‰j                              ¦   «         vr#‰                     |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                 óH   •— g | ]\  \  }}}|‰cxk    r|k     ¯n n||f|f‘ŒS r   r   ©r   Ú
text_startÚtext_endr   Úts       €r   r!   zHSubtitlesClip.__init__.<locals>.add_textclip_if_none.<locals>.<listcomp>^   sX   ø€ ð ð ð á2Ñ+�j (¨TØ !Ð.Ð.Ò.Ð. hÒ.Ð.Ð.Ð.Ð.ð ˜hÐ'¨Ð.à.Ð.Ð.r   c                 óH   •— g | ]\  \  }}}|‰cxk    r|k     ¯n n||f|f‘ŒS r   r   r$   s       €r   r!   zHSubtitlesClip.__init__.<locals>.add_textclip_if_none.<locals>.<listcomp>d   sX   ø€ ð ð ð á6Ñ/˜* h°Ø" aÐ2Ð2Ò2Ð2¨(Ò2Ð2Ð2Ð2Ð2ð ! (Ð+¨TÐ2à2Ð2Ð2r   Fr   r   )Ú	textclipsÚkeysÚ	subtitlesr   )r'   Úsubr   s   ` €r   Úadd_textclip_if_nonez4SubtitlesClip.__init__.<locals>.add_textclip_if_noneY   sÂ   øø€ ð
ð ð ð à6:´n×6IÒ6IÑ6KÔ6Kðñ ô ˆCð
 ð !ðð ð ð à:>¼.ðñ ô �ð
 ð !Ø ˜5Ø�a”&ˆCØ˜$œ.×-Ò-Ñ/Ô/Ð/Ð/Ø&*×&8Ò&8¸¸Q¼Ñ&@Ô&@�”˜sÑ#àˆJr   c                 óŽ   •—  ‰| ¦  «        }|r ‰j         |                              | ¦  «        nt          j        g d¢gg¦  «        S )N)r   r   r   )r)   Ú	get_frameÚnpÚarray©r'   r,   r-   r   s     €€r   Úframe_functionz.SubtitlesClip.__init__.<locals>.frame_functionq   sJ   ø€ Ø&Ð& qÑ)Ô)ˆCØ7:ÐW�4”> #Ô&×0Ò0°Ñ3Ô3Ð3ÅÄÈ9È9È9È+ÈÑ@WÔ@WÐWr   c                 ó”   •—  ‰| ¦  «        }|r%‰j         |         j                             | ¦  «        nt          j        dgg¦  «        S )Nr   )r)   Úmaskr/   r0   r1   r2   s     €€r   Úmake_mask_framez/SubtitlesClip.__init__.<locals>.make_mask_frameu   sH   ø€ Ø&Ð& qÑ)Ô)ˆCØ<?ÐT�4”> #Ô&Ô+×5Ò5°aÑ8Ô8Ð8ÅRÄXÐPQÈsÈeÁ_Ä_ÐTr   ÚTT)Úis_mask)r   Ú__init__Ú
isinstanceÚlistÚfile_to_subtitlesr+   Údictr)   r   Ú
ValueErrorr   ÚstartÚmaxÚdurationÚendr3   Úboolr5   )	r   r+   r   r   r   r3   r6   Úhasmaskr-   s	   `       @r   r9   zSubtitlesClip.__init__8   su  øø€ ÝÔ˜4°5Ð9Ñ9Ô9Ð9å˜)¥TÑ*Ô*ð 	Hå)¨)¸hÐGÑGÔGˆIð #ˆŒÝ™œˆŒàˆŒ	àÐ ØŒyÐ Ý Ð!VÑWÔWÐWðð ð ð ð ð +ˆÔØˆŒ
ÝÐFÐF°t´~ÐFÑFÔFÑGÔGˆŒØ”=ˆŒð	ð 	ð 	ð 	ð 	ð0	Xð 	Xð 	Xð 	Xð 	Xð 	Xð	Uð 	Uð 	Uð 	Uð 	Uð 	Uð -ˆÔÝ�t×)Ò)¨#Ñ.Ô.Ô3Ñ4Ô4ˆØ@GÐQ•I˜o°tÐ<Ñ<Ô<Ð<ÈTˆŒ	ˆ	ˆ	r   c                 óJ   ‡‡‡‡— ˆˆfd„Šˆˆfd„Šˆˆfd„| j         D ¦   «         S )zÜReturns a sequence of [(t1,t2), text] covering all the given subclip
        from start_time to end_time. The first and last times will be cropped so as
        to be exactly start_time and end_time if possible.
        c                 óh   •— 	 ‰| cxk    o‰k     nc p‰|cxk     o‰k    nc S # t           $ r Y dS w xY w)NF)Ú	Exception©Út1Út2Úend_timeÚ
start_times     €€r   Úis_in_subclipz/SubtitlesClip.in_subclip.<locals>.is_in_subclipƒ   sm   ø€ ðØ" bÐ3Ð3Ò3Ð3¨8Ò3Ð3Ð3Ð3ÐU¸ÀbÐ9TÐ9TÒ9TÐ9TÈHÒ9TÐ9TÐ9TÐ9TÐUøÝð ð ð Ø�u�uðøøøs   ƒ# £
1°1c                 ón   •— 	 t          | ‰¦  «        t          |‰¦  «        fS # t          $ r | |fcY S w xY w©N)r@   ÚminrG   rH   s     €€r   Útry_croppingz.SubtitlesClip.in_subclip.<locals>.try_cropping‰   sO   ø€ ðÝ˜2˜zÑ*Ô*­C°°HÑ,=Ô,=Ð=Ð=øÝð ð ð Ø˜2�v���ðøøøs   ƒ# £4³4c                 óP   •— g | ]"\  \  }}} ‰||¦  «        ¯ ‰||¦  «        |f‘Œ#S r   r   )r   rI   rJ   r   rM   rQ   s       €€r   r!   z,SubtitlesClip.in_subclip.<locals>.<listcomp>�   sT   ø€ ð 
ð 
ð 
á‘�"�b˜3Øˆ}˜R Ñ$Ô$ð
Øˆ\˜"˜bÑ!Ô! 3Ð'ð
ð 
ð 
r   ©r+   )r   rL   rK   rM   rQ   s    ``@@r   Ú
in_subclipzSubtitlesClip.in_subclip}   st   øøøø€ ð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð
ð 
ð 
ð 
ð 
à#'¤>ð
ñ 
ô 
ð 	
r   c                 ó*   — t          | j        ¦  «        S rO   )Úiterr+   )r   s    r   Ú__iter__zSubtitlesClip.__iter__•   s   € Ý�D”NÑ#Ô#Ð#r   c                 ó   — | j         |         S rO   rS   )r   Úks     r   Ú__getitem__zSubtitlesClip.__getitem__˜   s   € ØŒ~˜aÔ Ð r   c                 óV   ‡— d„ Šd                      ˆfd„| j        D ¦   «         ¦  «        S )Nc                 ób   — | \  \  }}}t          |¦  «        }t          |¦  «        }|›d|›d|›�S )Nz - ú
r   )Úsub_elementrL   rK   r   Úformatted_start_timeÚformatted_end_times         r   Úto_srtz%SubtitlesClip.__str__.<locals>.to_srtœ   sI   € Ø+6Ñ(Ñ"ˆZ˜ DÝ#5°jÑ#AÔ#AÐ Ý!3°HÑ!=Ô!=ÐØ$8Ð$8Ð$8Ð:LÐ:LÐ:LÈdÈdÐSÐSr   z

c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S rO   r   )r   r,   ra   s     €r   ú	<genexpr>z(SubtitlesClip.__str__.<locals>.<genexpr>¢   s+   øè è € ÐAÐA¨3˜6˜6 #™;œ;ÐAÐAÐAÐAÐAÐAr   )Újoinr+   )r   ra   s    @r   Ú__str__zSubtitlesClip.__str__›   s@   ø€ ð	Tð 	Tð 	Tð �{Š{ÐAÐAÐAÐA°$´.ÐAÑAÔAÑAÔAÐAr   c                 óD   ‡— t          ˆfd„| j        D ¦   «         ¦  «        S )z?Matches a regular expression against the subtitles of the clip.c                 óR   •— g | ]#}t          j        ‰|d          ¦  «        g k    ¯!|‘Œ$S )r   )ÚreÚfindall)r   r,   Úexprs     €r   r!   z,SubtitlesClip.match_expr.<locals>.<listcomp>§   s3   ø€ ÐMÐMÐM�S­b¬j¸¸sÀ1¼vÑ.FÔ.FÈ"Ò.LÐ.LˆSÐ.LÐ.LÐ.Lr   )r	   r+   )r   rj   s    `r   Ú
match_exprzSubtitlesClip.match_expr¤   s.   ø€ åØMÐMÐMÐM˜DœNÐMÑMÔMñ
ô 
ð 	
r   c                 óœ   — t          |d¦  «        5 }|                     t          | ¦  «        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z5Writes an ``.srt`` file with the content of the clip.zw+N)ÚopenÚwriteÚstr)r   ÚfilenameÚfiles      r   Ú	write_srtzSubtitlesClip.write_srtª   s‹   € å�(˜DÑ!Ô!ð 	" TØ�JŠJ•s˜4‘y”yÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s   ‘#AÁAÁA)NNN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r9   rT   rW   rZ   re   rk   rr   r   r   r   r	   r	      sž   € € € € € ð)ð )ðVCRð CRð CRð CRðJ
ð 
ð 
ð 
ð0$ð $ð $ð!ð !ð !ðBð Bð Bð
ð 
ð 
ð"ð "ð "ð "ð "r   r	   rp   c                 óX  — g }d}d}t          | d|¬¦  «        5 }|D ]u}t          j        d|¦  «        }|rd„ |D ¦   «         }Œ&|                     ¦   «         dk    r0|                     ||                     d¦  «        f¦  «         d\  }}Œn|r||z  }Œv	 ddd¦  «         n# 1 swxY w Y   |S )	zÓConverts a srt file into subtitles.

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

    Only works for '.srt' format for the moment.
    NÚ Úrr   z([0-9]*:[0-9]*:[0-9]*,[0-9]*)c                 ó,   — g | ]}t          |¦  «        ‘ŒS r   r   )r   r'   s     r   r!   z%file_to_subtitles.<locals>.<listcomp>À   s!   € Ð FÐ FÐ F¸1Õ!3°AÑ!6Ô!6Ð FÐ FÐ Fr   r]   )Nrx   )rm   rh   ri   ÚstripÚappend)rp   r   Útimes_textsÚcurrent_timesÚcurrent_textrq   ÚlineÚtimess           r   r<   r<   °   s  € ð €KØ€MØ€LÝ	ˆh˜ hÐ	/Ñ	/Ô	/ð 	%°4Øð 	%ð 	%ˆDÝ”JÐ>ÀÑEÔEˆEØð %Ø FÐ FÀÐ FÑ FÔ F��Ø—’‘” Ò#Ð#Ø×"Ò" M°<×3EÒ3EÀdÑ3KÔ3KÐ#LÑMÔMÐMØ.6Ñ+�˜|˜|Øð %Ø Ñ$�øð	%ð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð Ðs   ™A9BÂB#Â&B#rO   )rv   rh   Únumpyr0   Úmoviepy.decoratorsr   Úmoviepy.toolsr   Úmoviepy.video.VideoClipr   r   r	   r<   r   r   r   ú<module>r†      sÅ   ðØ 0Ð 0à 	€	€	€	à Ð Ð Ð à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ða"ð a"ð a"ð a"ð a"�Iñ a"ô a"ð a"ðH Ð˜
Ñ#Ô#ðð ð ñ $Ô#ðð ð r   