Ë
    Eü´jÔ  ã                   ót   — 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y)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
y)Ú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           
      óF  ‡ ‡— t        j                  ‰ d¬«       t        |t        «      st	        ||¬«      }|‰ _        t        «       ‰ _        |‰ _        |€‰ j                  €t        d«      ‚ˆ fd„}|‰ _
        d‰ _        t        ‰ j
                  D ���cg c]
  \  \  }}}|‘Œ c}}}«      ‰ _        ‰ j                  ‰ _        ˆ fd„Šˆˆ fd„}ˆˆ fd	„}	|‰ _        t!        ‰ j                  d
«      j"                  «      }
|
rt        |	d¬«      ‰ _        y d ‰ _        y c c}}}w )NF)Úhas_constant_size©Úencodingz3Argument font is required if make_textclip is None.c                 ó:   •— t        ‰j                  | dddd¬«      S )Né   z#ffffffz#000000é   )ÚfontÚtextÚ	font_sizeÚcolorÚstroke_colorÚstroke_width)r   r   )ÚtxtÚselfs    €ú[/root/workspace/ytshorts/venv/lib/python3.12/site-packages/moviepy/video/tools/subtitles.pyÚmake_textclipz-SubtitlesClip.__init__.<locals>.make_textclipJ   s&   ø€ ÜØŸ™ØØ Ø#Ø!*Ø!"ôð ó    r   c                 ó¢  •— ‰j                   j                  «       D ���cg c]  \  \  }}}|| cxk  r|k  r	n n||f|f‘Œ }}}}|s8‰j                  D ���cg c]  \  \  }}}|| cxk  r|k  r	n n||f|f‘Œ }}}}|sy|d   }|‰j                   j                  «       vr!‰j                  |d   «      ‰j                   |<   |S c c}}}w c c}}}w )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.
            Fr   r   )Ú	textclipsÚkeysÚ	subtitlesr   )ÚtÚ
text_startÚtext_endr   Úsubr   s        €r   Úadd_textclip_if_nonez4SubtitlesClip.__init__.<locals>.add_textclip_if_noneY   só   ø€ ð 7;·n±n×6IÑ6IÓ6K÷ð á2Ñ+�j (¨TØ !Ô. hÕ.ð ˜hÐ'¨Ò.ðˆCò ñ
 ð ;?¿.¹.÷ð á6Ñ/˜* h°Ø" aÔ2¨(Õ2ð ! (Ð+¨TÒ2ð�ò ñ
 Ø Ø�a‘&ˆCØ˜$Ÿ.™.×-Ñ-Ó/Ñ/Ø&*×&8Ñ&8¸¸Q¹Ó&@�—‘˜sÑ#àˆJùô#ùôs    !CÁ!C
c                 ó†   •—  ‰| «      }|r‰j                   |   j                  | «      S 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   s;   ø€ Ù& qÓ)ˆCÙ7:�4—>‘> #Ñ&×0Ñ0°Ó3ÐWÄÇÁÊ9È+ÈÓ@WÐWr   c                 ó–   •—  ‰| «      }|r(‰j                   |   j                  j                  | «      S t        j                  dgg«      S )Nr   )r   Úmaskr&   r'   r(   r)   s     €€r   Úmake_mask_framez/SubtitlesClip.__init__.<locals>.make_mask_frameu   sA   ø€ Ù& qÓ)ˆCÙ<?�4—>‘> #Ñ&×+Ñ+×5Ñ5°aÓ8ÐTÄRÇXÁXÐPQÈsÈeÃ_ÐTr   ÚTT)Úis_mask)r   Ú__init__Ú
isinstanceÚlistÚfile_to_subtitlesr   Údictr   r   Ú
ValueErrorr   ÚstartÚmaxÚdurationÚendr*   Úboolr,   )r   r   r   r   r   ÚtaÚtbr   r*   r-   Úhasmaskr$   s   `          @r   r0   zSubtitlesClip.__init__8   sø   ù€ Ü×Ñ˜4°5Õ9ä˜)¤TÔ*ä)¨)¸hÔGˆIð #ˆŒÜ›ˆŒàˆŒ	àÐ Ø�y‰yÐ Ü Ð!VÓWÐWôð +ˆÔØˆŒ
Ü°t·~±~×FÐF¡O¡X b¨"¨sšRÔFÓGˆŒØ—=‘=ˆŒô	õ0	Xõ	Uð -ˆÔÜ�t×)Ñ)¨#Ó.×3Ñ3Ó4ˆÙ@G”I˜o°tÔ<ˆ�	ÈTˆ�	ùôK Gs   ÂDc           	      ó˜   ‡‡— ˆˆfd„}ˆˆfd„}| j                   D ���cg c]  \  \  }}} |||«      r |||«      |f‘Œ c}}}S c c}}}w )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  xr ‰k  nc xs ‰|cxk  xr ‰k  S c S # t         $ r Y yw xY w)NF)Ú	Exception©Út1Út2Úend_timeÚ
start_times     €€r   Úis_in_subclipz/SubtitlesClip.in_subclip.<locals>.is_in_subclipƒ   s?   ø€ ðØ" bÖ3¨8Ô3ÒU¸ÀbÖ9TÈHÑ9TÐUÑ9TÐUøÜò Ùðús   ƒ% ¢% ¥	1°1c                 ó\   •— 	 t        | ‰«      t        |‰«      fS # t        $ r | |fcY S w xY w©N)r7   Úminr@   rA   s     €€r   Útry_croppingz.SubtitlesClip.in_subclip.<locals>.try_cropping‰   s9   ø€ ðÜ˜2˜zÓ*¬C°°HÓ,=Ð=Ð=øÜò Ø˜2�v’ðús   ƒ ›+ª+©r   )r   rE   rD   rF   rJ   rB   rC   r   s    ``     r   Ú
in_subclipzSubtitlesClip.in_subclip}   sV   ù€ õ	õ	ð $(§>¡>÷
ð 
á‘�"�b˜3Ù˜R Ô$ñ ˜"˜bÓ! 3Ò'ô
ð 	
ùô 
s   Ÿ!Ac                 ó,   — t        | j                  «      S rH   )Úiterr   )r   s    r   Ú__iter__zSubtitlesClip.__iter__•   s   € Ü�D—N‘NÓ#Ð#r   c                 ó    — | j                   |   S rH   rK   )r   Úks     r   Ú__getitem__zSubtitlesClip.__getitem__˜   s   € Ø�~‰~˜aÑ Ð r   c                 óR   ‡— d„ Šdj                  ˆfd„| j                  D «       «      S )Nc                 óR   — | \  \  }}}t        |«      }t        |«      }|›d|›d|›�S )Nz - ú
r   )Úsub_elementrE   rD   r   Úformatted_start_timeÚformatted_end_times         r   Úto_srtz%SubtitlesClip.__str__.<locals>.to_srtœ   s5   € Ø+6Ñ(Ñ"ˆZ˜ DÜ#5°jÓ#AÐ Ü!3°HÓ!=ÐÚ$8Ò:LÉdÐSÐSr   z

c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wrH   © )Ú.0r#   rY   s     €r   ú	<genexpr>z(SubtitlesClip.__str__.<locals>.<genexpr>¢   s   øè ø€ ÒA¨3™6 #Ÿ;ÑAùs   ƒ)Újoinr   )r   rY   s    @r   Ú__str__zSubtitlesClip.__str__›   s$   ø€ ò	Tð �{‰{ÓA°$·.±.ÔAÓAÐAr   c           
      óŒ   — t        | j                  D �cg c]!  }t        j                  ||d   «      g k7  sŒ |‘Œ# c}«      S c c}w )z?Matches a regular expression against the subtitles of the clip.r   )r	   r   ÚreÚfindall)r   Úexprr#   s      r   Ú
match_exprzSubtitlesClip.match_expr¤   s:   € äØ ŸN™NÖM�S¬b¯j©j¸¸sÀ1¹vÓ.FÈ"Ó.LŠSÒMó
ð 	
ùÚMs
   ”!A¶Ac                 óz   — t        |d«      5 }|j                  t        | «      «       ddd«       y# 1 sw Y   yxY w)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ª   s3   € ä�(˜DÓ!ð 	" TØ�J‰J”s˜4“yÔ!÷	"÷ 	"ñ 	"ús   �1±:)NNN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   rL   rO   rR   r_   rd   rk   r[   r   r   r	   r	      s/   „ ñ)óVCRóJ
ò0$ò!òBò
ó"r   r	   ri   c                 ó\  — g }d}d}t        | d|¬«      5 }|D ]v  }t        j                  d|«      }|r|D �cg c]  }t        |«      ‘Œ }}Œ4|j	                  «       dk(  r(|j                  ||j	                  d«      f«       d\  }}Œo|sŒr||z  }Œx 	 ddd«       |S c c}w # 1 sw Y   |S xY w)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]*)rU   )Nrq   )rf   ra   rb   r   ÚstripÚappend)	ri   r   Útimes_textsÚcurrent_timesÚcurrent_textrj   ÚlineÚtimesr    s	            r   r3   r3   °   sÆ   € ð €KØ€MØ€LÜ	ˆh˜ hÔ	/ð 	%°4Øò 	%ˆDÜ—J‘JÐ>ÀÓEˆEÙØ@EÖ F¸1Ô!3°AÕ!6Ð F�Ñ FØ—‘“ Ò#Ø×"Ñ" M°<×3EÑ3EÀdÓ3KÐ#LÔMØ.6Ñ+�™|ÚØ Ñ$‘ñ	%÷	%ð Ðùò !G÷		%ð Ðús#   •"B!·BÁ	A B!Â
B!ÂB!Â!B+rH   )ro   ra   Únumpyr'   Úmoviepy.decoratorsr   Úmoviepy.toolsr   Úmoviepy.video.VideoClipr   r   r	   r3   r[   r   r   ú<module>r~      s?   ðÙ 0ã 	ã å 5Ý ,ß 7ôa"�Iô a"ñH ˜
Ó#òó $ñr   