
    ljS                    X   d Z ddlmZ g dZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZ erddlmZ d	d
lmZ ddlmZmZmZ d	dlmZ d7dZd7dZd7dZd7dZd7dZd7dZd8dZd9dZ d:dZ!d;dZ"d;dZ#d<d$Z$d=d'Z%d>d?d*Z&d@d-Z'dAd.Z(dBd/Z)dCd1Z* ed2          d3fdDd6Z+dS )Ez7Utility functions for interacting with the file system.    )annotations)add_extension_if_not_presentguarantee_existenceguarantee_empty_existenceseek_full_path_from_defaultsmodify_atime	open_fileis_mp4_formatis_gif_formatis_png_formatis_webm_formatis_mov_formatwrite_to_movieensure_executableNPath)copyfile)TYPE_CHECKING)StrPath   )SceneFileWriter)__version__configlogger)consolereturnboolc                 (    t           d         dk    } | S )z
    Determines if output format is .mp4

    Returns
    -------
    class:`bool`
        ``True`` if format is set as mp4

    formatmp4r   vals    O/home/agentuser/manim-venv/lib/python3.11/site-packages/manim/utils/file_ops.pyr
   r
   (        x E)CJ    c                 (    t           d         dk    } | S )z
    Determines if output format is .gif

    Returns
    -------
    class:`bool`
        ``True`` if format is set as gif

    r   gifr!   r"   s    r$   r   r   6   r%   r&   c                 (    t           d         dk    } | S )z
    Determines if output format is .webm

    Returns
    -------
    class:`bool`
        ``True`` if format is set as webm

    r   webmr!   r"   s    r$   r   r   D   s     x F*CJr&   c                 (    t           d         dk    } | S )z
    Determines if output format is .mov

    Returns
    -------
    class:`bool`
        ``True`` if format is set as mov

    r   movr!   r"   s    r$   r   r   R   r%   r&   c                 (    t           d         dk    } | S )z
    Determines if output format is .png

    Returns
    -------
    class:`bool`
        ``True`` if format is set as png

    r   pngr!   r"   s    r$   r   r   `   r%   r&   c                     t                      rdS t          d         p7t                      p)t                      pt	                      pt                      S )a+  
    Determines from config if the output is a video format such as mp4 or gif, if the --format is set as 'png'
    then it will take precedence event if the write_to_movie flag is set

    Returns
    -------
    class:`bool`
        ``True`` if the output should be written in a movie format

    Fr   )r   r   r
   r   r   r    r&   r$   r   r   n   sY      u  	??	??	 	 ??r&   path_to_exer   c                    | j         t          d          k    rt          j        | j                  }|dS n| }t          j        |t
          j                  S )N.F)parentr   shutilwhichstemosaccessX_OK)r1   
executables     r$   r   r      sS    T#YY&&%+\+2B%C%C
5  !
9Z)))r&   	file_name	extensionstrc                V    | j         |k    r|                     | j         |z             S | S )N)suffixwith_suffix)r<   r=   s     r$   r   r      s2    9$$$$Y%5	%ABBBr&   c                X    |                      | j         dt           | j                   S )N
_ManimCE_v)	with_namer7   r   r@   )r<   s    r$   add_version_before_extensionrE      s5    >DD[D)2BDD  r&   pathc                \    |                      dd           |                     d          S NT)parentsexist_ok)strict)mkdirresolverF   s    r$   r   r      s,    JJtdJ+++<<t<$$$r&   c                    |                                  r!t          j        t          |                      |                     dd           |                     d          S rH   )existsr5   rmtreer>   rL   rM   rN   s    r$   r   r      sR    {{}} !c$ii   JJtdJ+++<<t<$$$r&   r   default_dir
extensions	list[str]c                D    t                                                     g}| fddg|D             z  }|D ]}|                                r|c S dt          j                     d  dt	          t          t          |                     }t          |          )Nc                <    g | ]}t                     | z  S r0   r   ).0r=   rR   r<   s     r$   
<listcomp>z0seek_full_path_from_defaults.<locals>.<listcomp>   s>       :C[y5)555  r&    zFrom: z, could not find z at either of these locations: )r   
expanduserrP   cwdlistmapr>   OSError)r<   rR   rS   possible_pathsrF   errors   ``    r$   r   r      s     9oo00223N     HJGXZGX   N   ;;== 	KKK		@ 	@ 	@i 	@ 	@#C^$<$<==	@ 	@ 
 %..r&   	file_pathNonec                    t          j        | t          j                    t          |                                           j        f           dS )zWill manually change the accessed time (called `atime`) of the file, as on a lot of OS the accessed time refresh is disabled by default.

    Parameters
    ----------
    file_path
        The path of the file.
    )timesN)r8   utimetimer   statst_mtime)ra   s    r$   r   r      s?     HYty{{DOO,@,@,B,B,KLMMMMMMr&   F
in_browserc                   t          j                    }|dk    rt          j        |s| n| j                   d S |dk    rdg}|s| n| j        } nC|                    d          rdg}|s| n| j        } n|dk    r
|sdgnddg}nt          d	          t          j        rt          j        g}|	                    t          |                      t          j        |           d S )
NWindowsLinuxzxdg-openCYGWINcygstartDarwinopenz-Rz+Unable to identify your operating system...)platformsystemr8   	startfiler4   
startswithr^   r   preview_commandappendr>   sprun)ra   ri   
current_oscommandss       r$   r	   r	      s
   ""JY 	jFYYi6FGGGGG  "|H)3I		9III""8,, 	I"|H)3I		9III8##'1Exx~HHGHHH ! 	0./HI'''
xr&   file_writerr   c                   g }t           d         r|                    | j                   t                      r(t	                      s|                    | j                   t                      r(t	                      r|                    | j                   |D ]T}t           d         rt          |d           t           d         r(t          |d           t          j	        d| d           Ud S )Nsave_last_frameshow_in_file_browserTpreviewFzPreviewed File at: '')
r   rv   image_file_pathr   r   movie_file_pathgif_file_pathr	   r   info)r{   
file_pathsra   s      r$   open_media_filer      s    J  7+5666 7 7+5666 5MOO 5+3444 = =	() 	'i&&&) 	=i'''K;y;;;<<<= =r&   c                     t          j        t          t                    j        j        dz            } d |                     d          D             S )zhReturns template names from the templates directory.

    Returns
    -------
        :class:`list`
    	templatesc                    g | ]	}|j         
S r0   )r7   )rW   template_names     r$   rX   z&get_template_names.<locals>.<listcomp>   s    PPP=MPPPr&   z*.mtp)r   rM   __file__r4   glob)template_paths    r$   get_template_namesr      sF     Lh!6!=!KLLMPPM4F4Fw4O4OPPPPr&   c                 h    t          j        t          t                    j        j        dz            S )z\Returns the Path of templates directory.

    Returns
    -------
        :class:`Path`
    r   )r   rM   r   r4   r0   r&   r$   get_template_pathr      s%     <X-4{BCCCr&   filec                    |                      d          5 }d}|                                }|                    d           |                    |dz   |z              ddd           dS # 1 swxY w Y   dS )zWPrepends an import statement in a file

    Parameters
    ----------
        file
    zr+zfrom manim import *r   
N)rp   readseekwrite)r   fimport_linecontents       r$   add_import_statementr     s     
4 .A+&&((	q				d"W,---	. . . . . . . . . . . . . . . . . .s   AA**A.1A.r3   Defaultproject_dirr   c                   t          j        t          t                    j        j        dz            }t          j        t          t                    j        j        d| dz            }|                                st          | d          |                                st          | d          t          |t          j        | dz                       t          j        d           t          |t          j        | dz                       t          j        d           t          t          j        | dz                       d	S )
zCopies template files from templates dir to project_dir.

    Parameters
    ----------
        project_dir
            Path to project directory.
        template_name
            Name of template.
    ztemplates/template.cfgz
templates/z.mtpz : file does not existz	manim.cfgz/
	[green]copied[/green] [blue]manim.cfg[/blue]
zmain.pyz-
	[green]copied[/green] [blue]main.py[/blue]
N)
r   rM   r   r4   rP   FileNotFoundErrorr   r   printr   )r   r   template_cfg_pathtemplate_scene_paths       r$   copy_template_filesr     s@    X$'??  ,X$'GM'G'G'GG  ##%% N#4 L L LMMM%%'' P#6 N N NOOO[;-F G GHHHMFGGG $,{Y/F"G"GHHHMDEEEkI&=>>?????r&   )r   r   )r1   r   r   r   )r<   r   r=   r>   r   r   )r<   r   r   r   )rF   r   r   r   )r<   r   rR   r   rS   rT   r   r   )ra   r>   r   rb   )F)ra   r   ri   r   r   rb   )r{   r   r   rb   )r   rT   )r   r   )r   r   r   rb   )r   r   r   r>   r   rb   ),__doc__
__future__r   __all__r8   rq   r5   
subprocessrw   rf   pathlibr   r   typingr   manim.typingr   scene.scene_file_writerr   manimr   r   r   rY   r   r
   r   r   r   r   r   r   r   rE   r   r   r   r   r	   r   r   r   r   r   r0   r&   r$   <module>r      s   = = " " " " " "    
			                                :$$$$$$999999 - - - - - - - - - -                        ,* * * *      % % % %
% % % %   "N N N N    2= = = =&Q Q Q QD D D D. . . . S			@ @ @ @ @ @ @r&   