o
    ܸ`8                     @   sJ  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dDddZdDddZdDddZddlmZ e Zej
Zdd Zdd Zdd Z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+Z,ee,_!eege,_"ee,_(dd  Z+ej-Z.ee._!eege._"ee._(d!d" Z-ej/Z/ee/_!eege/_"ej0Z0ee0_!eege0_"ej1Z1ee1_!eege1_"d
Z2e3ed#r?e3ed$r?d%Z2ej4Z5ee5_!eeee	ge5_"ee5_(ej6Z7ee7_!eeee	ge7_"ee7_(d&d# Z4d'd$ Z6d
Z8e3ed(rZd%Z8ej9Z9ee9_!g e9_"d)d* Z:dZ;dZ<d+Z=d,Z>d-Z?d.Z@d/ZAd.ZBd0ZCd1ZDd2ZEd3ZFd4ZGd5ZHd6ZId7ZJd8ZKd9ZLd:ZMd;ZNd<ZOd=ZPd>ZQdZRdZSd+ZTd?ZUd,ZVd@ZWdAZXdBdC ZYeYeZ  dS )Eai  
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__ 0/usr/lib/python3/dist-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_filem   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_descriptorx   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<   c                 C   sP   | d u rd S 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)sysversion_info
isinstanceunicoder9   r;   )rB   
is_unicoder   r   r   coerce_filename   s   rq   c                 C      t | t|S r	   )_magic_filerq   r"   rB   r   r   r   r.     rJ   r.   c                 C   s   t | |t|S r	   )_magic_bufferlen)r"   r?   r   r   r   r=   !  s   r=   c                 C   s
   t | |S r	   )_magic_descriptor)r"   rE   r   r   r   rD   0  s   
rD   c                 C   rr   r	   )_magic_loadrq   rt   r   r   r   r&   :  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   X  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   _  s
   magic_versionc                   C   s   t stdt S )Nzmagic_version not implemented)r'   r)   r}   r   r   r   r   r(   o  s   r(   ri            i   i       r         i   i   i    i @  i   i   i   i   i   i   rj         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   rl   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<   rq   r!   restypeargtypesrN   r\   magic_errnor.   rs   errcheckr=   ru   rD   rw   r&   rx   magic_setflagsmagic_checkmagic_compiler*   rM   rG   ry   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     x



	






&