o
    3gt:                     @   s~  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ZddlmZmZm	Z	m
Z
mZmZ eZG dd deZG dd dZi Zdd	 ZdHddZdHddZdHddZddlmZ e Zej
Zdd Zdd Zdd Zzddlm Z  dd Z!W n e"y   dd Z!Y nw dd Z#ej$Z$ee$_%ege$_&ej'Z'de'_%ege'_&ej(Z(ee(_%ege(_&ej)Z)ee)_%ege)_&ej*Z+ee+_%eege+_&ee+_,dd  Z*ej-Z.ee._%ee
e	ge._&ee._,d!d" Z-ej/Z/ee/_%eege/_&ee/_,ej/Z0ee0_%eege0_&ee0_,d#d$ Z/ej1Z2ee2_%eege2_&ee2_,d%d& Z1ej3Z3ee3_%eege3_&ej4Z4ee4_%eege4_&ej5Z5ee5_%eege5_&d
Z6e7ed'rYe7ed(rYd)Z6ej8Z9ee9_%eeee	ge9_&ee9_,ej:Z;ee;_%eeee	ge;_&ee;_,d*d' Z8d+d( Z:d
Z<e7ed,rtd)Z<ej=Z=ee=_%g e=_&d-d. Z>dZ?dZ@d/ZAd0ZBd1ZCd2ZDd3ZEd2ZFd4ZGd5ZHd6ZId7ZJd8ZKd9ZLd:ZMd;ZNd<ZOd=ZPd>ZQd?ZRd@ZSdAZTdBZUdZVdZWd/ZXdCZYd0ZZdDZ[dEZ\dFdG Z]e]e^  dS )Iai  
magic is a wrapper around the libmagic file identification library.

See README for more information.

Usage:

>>> import magic
>>> magic.from_file("testdata/test.pdf")
'PDF document, version 1.2'
>>> magic.from_file("testdata/test.pdf", mime=True)
'application/pdf'
>>> magic.from_buffer(open("testdata/test.pdf").read(1024))
'PDF document, version 1.2'
>>>

    N)c_char_pc_intc_size_tc_void_pbyrefPOINTERc                       s   e Zd Z fddZ  ZS )MagicExceptionc                    s   t t| | || _d S N)super	Exception__init__message)selfr   	__class__ F/home/garg/my-data/venv/lib/python3.10/site-packages/magic/__init__.pyr   !   s   
zMagicException.__init__)__name__
__module____qualname__r   __classcell__r   r   r   r   r       s    r   c                   @   sV   e Zd ZdZ		dddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZdS )Magicz;
    Magic is a wrapper around the libmagic C library.
    FNc           	   
   C   s   t | _|r|  jtO  _|r|  jtO  _|r|  jtO  _|r'|  jtO  _|r0|  jtO  _|r9|  jtO  _t| j| _	t
 | _t| j	| |rWtrSt dk rWtdtrvz	| td W dS  tyu } zW Y d}~dS d}~ww dS )a  
        Create a new libmagic wrapper.

        mime - if True, mimetypes are returned instead of textual descriptions
        mime_encoding - if True, codec is returned
        magic_file - use a mime database other than the system default
        keep_going - don't stop at the first match, keep going
        uncompress - Try to look inside compressed files.
        raw - Do not try to decode "non-printable" chars.
        extension - Print a slash-separated list of valid extensions for the file type found.
        i  z<MAGIC_EXTENSION is not supported in this version of libmagic@   N)
MAGIC_NONEflagsMAGIC_MIME_TYPEMAGIC_MIME_ENCODINGMAGIC_CONTINUEMAGIC_COMPRESS	MAGIC_RAWMAGIC_EXTENSION
magic_opencookie	threadingLocklock
magic_load_has_versionversionNotImplementedError
_has_paramsetparamMAGIC_PARAM_NAME_MAXr   )	r   mime
magic_filemime_encoding
keep_going
uncompressraw	extensioner   r   r   r   +   s4   
zMagic.__init__c                 C   s   | j A z!t|tkrttkr|jddd}tt| j|W W  d   S  tyC } z| 	|W  Y d}~W  d   S d}~ww 1 sGw   Y  dS )z0
        Identify the contents of `buf`
        utf-8replace)errorsN)
r%   typestrbytesencodemaybe_decodemagic_bufferr"   r   _handle509Bug)r   bufr4   r   r   r   from_buffer^   s   		zMagic.from_bufferc                 C   s   t | W d    n1 sw   Y  | j0 ztt| j|W W  d    S  tyF } z| |W  Y d }~W  d    S d }~ww 1 sJw   Y  d S r	   )
_real_openr%   r<   r.   r"   r   r>   )r   filenamer4   r   r   r   	from_filen   s   
zMagic.from_filec                 C   sz   | j 0 ztt| j|W W  d    S  ty2 } z| |W  Y d }~W  d    S d }~ww 1 s6w   Y  d S r	   )r%   r<   magic_descriptorr"   r   r>   )r   fdr4   r   r   r   from_descriptory   s   zMagic.from_descriptorc                 C   s   |j d u r| jt@ rdS |)Nzapplication/octet-stream)r   r   r   )r   r4   r   r   r   r>      s   zMagic._handle509Bugc                 C   s   t | j||S r	   )magic_setparamr"   )r   paramvalr   r   r   r+         zMagic.setparamc                 C   s   t | j|S r	   )magic_getparamr"   )r   rH   r   r   r   getparam   s   zMagic.getparamc                 C   s4   t | dr| jrtrt| j d | _d S d S d S d S )Nr"   )hasattrr"   magic_close)r   r   r   r   __del__   s   

zMagic.__del__)FNFFFFF)r   r   r   __doc__r   r@   rC   rF   r>   r+   rL   rO   r   r   r   r   r   &   s    
3	r   c                 C   s(   t | }|d u rt| d }t | < |S )N)r-   )
_instancesgetr   )r-   ir   r   r   _get_magic_type   s   
rT   Fc                 C      t |}|| S )z"
    Accepts a filename and returns the detected filetype.  Return
    value is the mimetype if mime=True, otherwise a human readable
    name.

    >>> magic.from_file("testdata/test.pdf", mime=True)
    'application/pdf'
    )rT   rC   )rB   r-   mr   r   r   rC         	
rC   c                 C   rU   )z
    Accepts a binary string and returns the detected filetype.  Return
    value is the mimetype if mime=True, otherwise a human readable
    name.

    >>> magic.from_buffer(open("testdata/test.pdf").read(1024))
    'PDF document, version 1.2'
    )rT   r@   )bufferr-   rV   r   r   r   r@      rW   r@   c                 C   rU   )a  
    Accepts a file descriptor and returns the detected filetype.  Return
    value is the mimetype if mime=True, otherwise a human readable
    name.

    >>> f = open("testdata/test.pdf")
    >>> magic.from_descriptor(f.fileno())
    'PDF document, version 1.2'
    )rT   rF   )rE   r-   rV   r   r   r   rF      s   

rF      )loaderc                 C   s    | d u rt |d }t|| S )Nr   magic_errorr   resultfuncargserrr   r   r   errorcheck_null      rb   c                 C   s    | dkrt |d }t|| S )Nr   r[   r]   r   r   r   errorcheck_negative_one   rc   re   c                 C   s   t tkr| S | ddS )Nr5   backslashreplace)r9   r:   decode)sr   r   r   r<      s   r<   )PathLikec                 C   s   t | tr	|  S | S r	   )
isinstanceri   
__fspath__rB   r   r   r   unpath   s   
rm   c                 C   s   | S r	   r   rl   r   r   r   rm      s   c                 C   sX   | d u rd S t | } tjd dkrt| tp!tjd dko!t| t}|r*| ddS | S )Nr         r5   surrogateescape)rm   sysversion_inforj   unicoder9   r;   )rB   
is_unicoder   r   r   coerce_filename   s   ru   c                 C      t | t|S r	   )_magic_fileru   r"   rB   r   r   r   r.   (  rJ   r.   c                 C   s   t | |t|S r	   )_magic_bufferlen)r"   r?   r   r   r   r=   2  s   r=   c                 C   s
   t | |S r	   )_magic_descriptor)r"   rE   r   r   r   rD   A  s   
rD   c                 C   rv   r	   )_magic_loadru   rx   r   r   r   r&   K  rJ   r&   rG   rK   Tc                 C   s$   t stdt|}t| |t|S )Nzmagic_setparam not implemented)r*   r)   r   _magic_setparamr   )r"   rH   rI   vr   r   r   rG   i  s   c                 C   s(   t stdt }t| |t| |jS )Nzmagic_getparam not implemented)r*   r)   r   _magic_getparamr   value)r"   rH   rI   r   r   r   rK   p  s
   magic_versionc                   C   s   t stdt S )Nzmagic_version not implemented)r'   r)   r   r   r   r   r   r(     s   r(   rn            i   i       r         i   i   i    i @  i   i   i   i   i   i   ro         c           
         s   dd l  dd l}ddlm}  fdd}g d}|D ]}||j| | |< q|d}tdg}|j D ]#\}}	||rX|| v rT||v rGq5| | |	krSt	d| q5|	| |< q5d S )	Nr   )compatc                    s    fdd}|S )Nc                     s    dt  | i |S )NzUsing compatibility mode with libmagic's python binding. See https://github.com/ahupp/python-magic/blob/master/COMPAT.md for details.)warnPendingDeprecationWarning)r`   kwargs)fnwarningsr   r   _  s
   z3_add_compat.<locals>.deprecation_wrapper.<locals>._r   )r   r   r   )r   r   deprecation_wrapper  s   z(_add_compat.<locals>.deprecation_wrapper)detect_from_filenamedetect_from_contentdetect_from_fobjopenz	^[A-Z_]+$
MAGIC_MIMEzinconsistent value for )
r   remagicr   __dict__compilesetitemsmatchr   )
	to_moduler   r   r   r   fnameis_const_reallowed_inconsistentnamer   r   r   r   _add_compat  s&   


r   )F)_rP   rq   globctypesctypes.utilr#   loggingr   r   r   r   r   r   r   rA   r   r   r   rQ   rT   rC   r@   rF    rZ   load_liblibmagicmagic_trb   re   r<   osri   rm   ImportErrorru   r!   restypeargtypesrN   r\   magic_errnor.   rw   errcheckr=   ry   rD   r{   r&   r|   magic_setflagsmagic_checkmagic_compiler*   rM   rG   r}   rK   r   r'   r   r(   r   MAGIC_DEBUGMAGIC_SYMLINKr   MAGIC_DEVICESr   r   r   r    r   MAGIC_CHECKMAGIC_PRESERVE_ATIMEr   MAGIC_ERRORMAGIC_NO_CHECK_COMPRESSMAGIC_NO_CHECK_TARMAGIC_NO_CHECK_SOFTMAGIC_NO_CHECK_APPTYPEMAGIC_NO_CHECK_ELFMAGIC_NO_CHECK_ASCIIMAGIC_NO_CHECK_TROFFMAGIC_NO_CHECK_FORTRANMAGIC_NO_CHECK_TOKENSMAGIC_PARAM_INDIR_MAXr,   MAGIC_PARAM_ELF_PHNUM_MAXMAGIC_PARAM_ELF_SHNUM_MAXMAGIC_PARAM_ELF_NOTES_MAXMAGIC_PARAM_REGEX_MAXMAGIC_PARAM_BYTES_MAXr   globalsr   r   r   r   <module>   s     y











&