o
    :n0j/                     @   sv  U d 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m	Z	 ddl
mZmZmZ ddlmZmZ dad[d	d
ZdejddfddZdejdededdfddZejdedeedB edB f fddZddddddddZeeef ed< edd e D Zeeef ed < dd!d"Zeeef ed#< dedeedB edB f fd$d%Z dedeedB edB f fd&d'Z!d(ededeedB edB f fd)d*Z"d+ee dedB fd,d-Z#i d.d/d0d1d2d3d4d5d6d7d8dd9d:d;d<d=d<d>d?d@ddAddBdCdDdEdFdGdHd!dIdJdKddLdddMdNdOdPdQdRdSdTdUdVdWZ$eeef edX< d(edededB fdYdZZ%e  dS )\zMIME type detection functions.    N)Sequence   )ArchiveMimetypesArchiveCompressions)	log_errorlog_warninglog_info)find_programbacktickreturnc               
   C   sR   zt jddaW n ty" }  ztd|   W Y d} ~ dS d} ~ ww tt dS )z&Initialize the internal MIME database.Fstrictz$could not initialize MIME database: N)	mimetypes	MimeTypesmimedb	Exceptionr   add_mimedb_data)msg r   T/home/wildlama/miniconda3/envs/lam_a2e/lib/python3.10/site-packages/patoolib/mime.pyinit_mimedb   s   r   r   c                 C   s,  d| j d< d| j d< d| j d< d| j d< d	| j d
< d| jd< t| dd t| dd t| dd t| dd t| dd t| dd t| dd t| dd t| dd t| dd t| dd t| dd  t| d!d" t| d#d$ t| d%d& t| d%d' t| d(d) t| d*d+ t| d,d- t| d.d/ t| d0d1 t| d2d3 t| d4d5 t| d6d7 t| d8d9 t| d:d; t| d<d= t| d>d? t| d@dA t| dBdC t| dDdE t| dFdG t| dHdI t| dJdK t| dLdM t| dNdO t| dPdQ t| dPdR t| dPdS t| dTdU t| dVd
 dWS )Xz5Add missing encodings and mimetypes to MIME database.bzip2z.bz2lzmaz.lzmaxzz.xzlzipz.lzzstdz.zstz.tar.bz2z.tbz2application/x-lzopz.lzoapplication/x-adfz.adfapplication/x-arjz.arjapplication/x-bzip3z.bz3application/x-lzmaapplication/x-xzzapplication/java-archivez.jarapplication/vnd.rarz.rarz.cbrapplication/x-7z-compressedz.7zz.cb7zapplication/x-cabz.cabapplication/x-rpmz.rpmapplication/x-debian-packagez.debapplication/x-acez.acez.cbaapplication/x-archivez.aapplication/x-alzipz.alzapplication/x-arcz.arcapplication/x-lrzipz.lrzapplication/x-lhaz.lhazapplication/x-lzhz.lzhzapplication/x-lz4z.lz4application/x-rzipz.rzapplication/x-zooz.zooapplication/x-dmsz.dmszapplication/x-ms-wimz.wimzapplication/x-zip-compressedz.crxzapplication/x-sharz.sharapplication/x-tarz.cbtzapplication/x-vhdz.vhdaudio/x-apez.apezaudio/x-shnz.shn
audio/flacz.flacapplication/x-chmz.chmzapplication/x-iso9660-imagez.isoapplication/zipz.cbzz.epubz.apkapplication/zpaqz.zpaqapplication/zstdN)encodings_map
suffix_mapadd_mimetype)r   r   r   r   r   *   s^   





r   mimetype	extensionc                 C   s"   || j d v }| j|||d dS )z>Add or replace a mimetype to be used with the given extension.Tr   N)	types_mapadd_type)r   r9   r:   r   r   r   r   r8   ]   s   
r8   filenamec              
   C   st   t | \}}|du rt| \}}nt| \}}||kr,td|  d| d| d| d	 |dus6|du s6J ||fS )zGuess the MIME type of given filename using file(1) and if that
    fails by looking at the filename extension with the Python mimetypes
    module.

    The result of this function is cached.
    Nz"Different MIME types detected for : z by file(1), z by extension. Preferring .)guess_mime_fileguess_mime_mimedbr   )r=   mimeencodingmime2	encoding2r   r   r   
guess_mimef   s    rF   zapplication/gzipzapplication/x-bzip2zapplication/x-compressr    zapplication/x-lzipr!   r5   )gzipr   compressr   r   r   r   Encoding2Mimec                 C   s   g | ]\}}||fqS r   r   ).0_keyZ_valr   r   r   
<listcomp>   s    rL   Mime2Encodingr"   )zapplication/x-gzipzapplication/x-rarLegacyMimeTypec                 C   s   d\}}t durt j| dd\}}|du r.|du r.tj| \}}t j||  dd\}}|tvr<|tv r<t| }d}||fS )zMGuess MIME type from given filename.
    @return: tuple (mime, encoding)
    NNNFr   )	r   
guess_typeospathsplitextlowerr   r   rI   )r=   rB   rC   rootextr   r   r   rA      s   rA   c           	   
   C   s8  d\}}t j| r'td}|r#t|| \}}|du r"t|| }d}ntd |tv r|dddd| g}zt|	 
d	}|d
 
ddd
 }W n! ttjfyi } ztd| d|  d}W Y d}~nd}~ww |tv rrt| }|dv s||tv s||st| \}}|tv r|}|}||fS |tv r|}t|}||fS )a-  Determine MIME type of filename with file(1):
     (a) using `file --brief --mime-type`
     (b) using `file --brief` and look at the result string
     (c) detect compressed archives (eg. .tar.gz) using
         `file --brief --mime --uncompress --no-sandbox`
    @return: tuple (mime, encoding)
    rO   fileNzUcould not find a 'file' executable, falling back to guess mime type by file extension--briefz--mimez--uncompressz--no-sandbox;r    r   error executing r>   )zapplication/x-emptyzapplication/octet-stream)rQ   rR   isfiler	   guess_mime_file_mimeguess_mime_file_textr   rM   r
   stripsplitOSError
subprocessCalledProcessErrorr   rN   rA   r   get_file_mime_encoding)	r=   rB   rC   	file_progcmdZoutpartsrD   errrE   r   r   r   r@      sJ   
r@   re   c              
   C   s   d\}}| dd|g}zt | }W n ty. } ztd| d|  W Y d}~nd}~ww |tv r7t| }|tvr?d\}}||fS )zhDetermine MIME type of filename with file(1) and --mime option.
    @return: tuple (mime, encoding)
    rO   rX   z--mime-typer[   r>   N)r
   r_   ra   r   rN   r   )re   r=   rB   rC   rf   rg   r   r   r   r]      s    r]   partsc                 C   sL   | D ]!}| dD ]}|dr"| dd  }t|    S q	qdS )zDGet encoding value from splitted output of file --mime --uncompress.rZ   zcompressed-encoding==r   N)r`   
startswithr_   rM   get)rh   partsubpartrB   r   r   r   rd      s   
rd   z7-zip archive datar#   zACE archive datar&   zALZ archive datar(   zAmiga DOS diskr   zARJ archive datar   zbzip2 compressed datazbzip3 compressed datar   zcpio archivezapplication/x-cpiozASCII cpio archivezDebian binary packager%   zgzip compressed datazLZMA compressed datazLRZIP compressed datar*   zlzop compressed datar   zMicrosoft Cabinet archive dataz!application/vnd.ms-cab-compressedzRAR archive datazRPM r$   r/   r3   r,   r'   r+   r)   r-   r.   r0   r1   r2   r4   )zPOSIX tar archivezxz compressed datazZip archive datazcompress'd datazlzip compressed datazrzip compressed datazcurrent ar archivezLHa zARC archive datazZoo archive datazDMS archive datazMonkey's AudiozFLAC audio bitstream datazMS Windows HtmlHelp DatazZPAQ streamFileText2Mimec              
   C   s   | d|g}zt | }W n ty* } ztd| d|  W Y d}~dS d}~ww t D ]\}}||r@|tv r@|  S q/dS )z-Determine MIME type of filename with file(1).rX   r[   r>   N)r
   r_   ra   r   rn   itemsrj   r   )re   r=   rf   outputrg   ZmatcherrB   r   r   r   r^   #  s   
r^   )r   N)&__doc__	functoolsrQ   r   rb   collections.abcr    r   r   logr   r   r   utilr	   r
   r   r   r   r   strr8   cachetuplerF   rI   dict__annotations__ro   rM   rN   rA   r@   r]   rd   rn   r^   r   r   r   r   <module>   s   
3	$	""7
	
$
