o ܸ`8@sJdZddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z e ZGdddeZGdddZiZdd ZdDd d ZdDd dZdDddZddlmZeZej ZddZddZddZddZej Z ee _!ege _"ej#Z#de#_!ege#_"ej$Z$ee$_!ege$_"ej%Z%ee%_!ege%_"ej&Z'ee'_!eege'_"ee'_(ddZ&ej)Z*ee*_!ee e ge*_"ee*_(ddZ)ej+Z+ee+_!eege+_"ee+_(ej+Z,ee,_!eege,_"ee,_(dd Z+ej-Z.ee._!eege._"ee._(d!d"Z-ej/Z/ee/_!eege/_"ej0Z0ee0_!eege0_"ej1Z1ee1_!eege1_"d Z2e3ed#r?e3ed$r?d%Z2ej4Z5ee5_!eee e ge5_"ee5_(ej6Z7ee7_!eee e ge7_"ee7_(d&d#Z4d'd$Z6d Z8e3ed(rZd%Z8ej9Z9ee9_!ge9_"d)d*Z:dZ;dZd-Z?d.Z@d/ZAd.ZBd0ZCd1ZDd2ZEd3ZFd4ZGd5ZHd6ZId7ZJd8ZKd9ZLd:ZMd;ZNdZQdZRdZSd+ZTd?ZUd,ZVd@ZWdAZXdBdCZYeYeZdS)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_pc_intc_size_tc_void_pbyrefPOINTERcseZdZfddZZS)MagicExceptioncstt||||_dSN)super Exception__init__message)selfr  __class__0/usr/lib/python3/dist-packages/magic/__init__.pyr !s zMagicException.__init__)__name__ __module__ __qualname__r __classcell__rrrrr src@sVeZdZdZ  dddZddZdd Zd d Zd d ZddZ ddZ ddZ dS)Magicz; Magic is a wrapper around the libmagic C library. FNc Cst|_|r |jtO_|r|jtO_|r|jtO_|r'|jtO_|r0|jtO_|r9|jtO_t|j|_ t |_ t |j ||rWtrStdkrWtdtrvz |tdWdStyu}zWYd}~dSd}~wwdS)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)rfilenamer4rrr from_filems zMagic.from_filec Csz|j0ztt|j|WWdSty2}z||WYd}~WdSd}~ww1s6wYdSr )r%r<magic_descriptorr"rr>)rfdr4rrrfrom_descriptorxszMagic.from_descriptorcCs|jdur |jt@r dS|)Nzapplication/octet-stream)r rr)rr4rrrr>szMagic._handle509BugcCst|j||Sr )magic_setparamr")rparamvalrrrr+zMagic.setparamcCs t|j|Sr )magic_getparamr")rrHrrrgetparams zMagic.getparamcCs4t|dr|jrtrt|jd|_dSdSdSdS)Nr")hasattrr" magic_close)rrrr__del__s   z Magic.__del__)FNFFFFF) rrr__doc__r r@rCrFr>r+rLrOrrrrr&s 3   rcCs(t|}|durt|d}t|<|S)N)r-) _instancesgetr)r-irrr_get_magic_types rTFcCt|}||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' )rTrC)rBr-mrrrrC rCcCrU)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' )rTr@)bufferr-rVrrrr@rWr@cCrU)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' )rTrF)rEr-rVrrrrFs rF)loadercCs |durt|d}t||S)Nr magic_errorrresultfuncargserrrrrerrorcheck_null rbcCs |dkrt|d}t||S)Nrr[r]rrrerrorcheck_negative_onercrecCsttkr|S|ddS)Nr5backslashreplace)r9r:decode)srrrr<s r<cCsP|durdStjddkrt|tptjddkot|t}|r&|ddS|S)Nrr5surrogateescape)sys version_info isinstanceunicoder9r;)rB is_unicoderrrcoerce_filenames rqcCt|t|Sr ) _magic_filerqr"rBrrrr.rJr.cCst||t|Sr ) _magic_bufferlen)r"r?rrrr=!sr=cCs t||Sr )_magic_descriptor)r"rErrrrD0s rDcCrrr ) _magic_loadrqrtrrrr&:rJr&rGrKTcCs$tstdt|}t||t|S)Nzmagic_setparam not implemented)r*r)r_magic_setparamr)r"rHrIvrrrrGXscCs(tstdt}t||t||jS)Nzmagic_getparam not implemented)r*r)r_magic_getparamrvalue)r"rHrIrrrrK_s  magic_versioncCststdtS)Nzmagic_version not implemented)r'r)r}rrrrr(osr(riii riii i@iiiiiirjc sddlddl}ddlm}fdd}gd}|D] }||j|||<q|d}tdg}|jD]#\}} ||rX||vrT||vrGq5||| krSt d|q5| ||<q5dS) Nr)compatcsfdd}|S)Ncsdt|i|S)NzUsing compatibility mode with libmagic's python binding. See https://github.com/ahupp/python-magic/blob/master/COMPAT.md for details.)warnPendingDeprecationWarning)r`kwargs)fnwarningsrr_s z3_add_compat..deprecation_wrapper.._r)rrr)rrdeprecation_wrappersz(_add_compat..deprecation_wrapper)detect_from_filenamedetect_from_contentdetect_from_fobjopenz ^[A-Z_]+$ MAGIC_MIMEzinconsistent value for ) rremagicr__dict__compilesetitemsmatchr ) to_modulerrrrfname is_const_reallowed_inconsistentnamer|rrr _add_compats&        r)F)[rPrlglobctypes ctypes.utilr#loggingrrrrrrrrAr rrrQrTrCr@rFrZload_liblibmagicmagic_trbrer<rqr!restypeargtypesrNr\ magic_errnor.rserrcheckr=rurDrwr&rxmagic_setflags magic_check magic_compiler*rMrGryrKr{r'r}r(r MAGIC_DEBUG MAGIC_SYMLINKr MAGIC_DEVICESrrrr r MAGIC_CHECKMAGIC_PRESERVE_ATIMEr MAGIC_ERRORMAGIC_NO_CHECK_COMPRESSMAGIC_NO_CHECK_TARMAGIC_NO_CHECK_SOFTMAGIC_NO_CHECK_APPTYPEMAGIC_NO_CHECK_ELFMAGIC_NO_CHECK_ASCIIMAGIC_NO_CHECK_TROFFMAGIC_NO_CHECK_FORTRANMAGIC_NO_CHECK_TOKENSMAGIC_PARAM_INDIR_MAXr,MAGIC_PARAM_ELF_PHNUM_MAXMAGIC_PARAM_ELF_SHNUM_MAXMAGIC_PARAM_ELF_NOTES_MAXMAGIC_PARAM_REGEX_MAXMAGIC_PARAM_BYTES_MAXrglobalsrrrrs x             &