o
    ůh                     @  s   d dl m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
 zd dlZdZW n ey;   dZY nw G dd	 d	Zdd
dZedkrQee dS )    )annotationsN)ThreadPoolExecutor)as_completed)BytesIOTFc                   @  sp   e Zd ZdZdddedfddZedd Zd	d
 Zdd Z	dd Z
edd Zedd Zdd Zdd ZdS )
Compressor)jpgjpegpnggifwebpzipgztgzbz2tbzxzbrswfflvwoffwoff23gp3gppasfavim4vmovmp4mpegmpgwebmwmvNTFc                 C  s<   |d u r| j }| || _|| _|ot| _|s|| _d S d S N)SKIP_COMPRESS_EXTENSIONSget_extension_reextension_reuse_gzipbrotli_installed
use_brotlilog)self
extensionsr&   r(   r)   quiet r-   P/var/www/Befach/backend/venv/lib/python3.10/site-packages/whitenoise/compress.py__init__8   s   

zCompressor.__init__c              	   C  s0   | st dS t ddtt j| t jS )Nz^$z\.({})$|)recompileformatjoinmapescape
IGNORECASE)r+   r-   r-   r.   r$   C   s
   
zCompressor.get_extension_rec                 C  s   | j | S r"   )r%   search)r*   filenamer-   r-   r.   should_compressL   s   zCompressor.should_compressc                 C  s   d S r"   r-   )r*   messager-   r-   r.   r)   O   s   zCompressor.logc                 C  s   g }t |d}t| }| }W d    n1 sw   Y  t|}| jrD| |}| d|||rB|	| 
||d| n|S | jr_| |}| d|||r_|	| 
||d| |S )NrbBrotliz.brGzipz.gz)openosfstatfilenoreadlenr(   compress_brotliis_compressed_effectivelyappend
write_datar&   compress_gzip)r*   path	filenamesfstat_resultdatasize
compressedr-   r-   r.   compressR   s    


zCompressor.compressc                 C  sR   t  }tjdd|ddd}||  W d    | S 1 s w   Y  | S )N wb	   r   )r9   modefileobjcompresslevelmtime)r   gzipGzipFilewritegetvalue)rN   outputgz_filer-   r-   r.   rI   e   s   

zCompressor.compress_gzipc                 C  s
   t | S r"   )brotlirQ   )rN   r-   r-   r.   rE   p   s   
zCompressor.compress_brotlic              	   C  sh   t |}|dkrd}n|| }|dk}|r&| d|||d |d  |S | d| d| d |S )	Nr   Fgffffff?z{} compressed {} ({}K -> {}K)i   z	Skipping z (z compression not effective))rD   r)   r3   )r*   encoding_namerJ   	orig_sizerN   compressed_sizeis_effectiveratior-   r-   r.   rF   t   s   z$Compressor.is_compressed_effectivelyc                 C  sT   || }t |d}|| W d    n1 sw   Y  t||j|jf |S )NrS   )r?   r[   r@   utimest_atimest_mtime)r*   rJ   rN   suffixrM   r9   rL   r-   r-   r.   rH      s   zCompressor.write_data)__name__
__module____qualname__r#   printr/   staticmethodr$   r:   r)   rQ   rI   rE   rF   rH   r-   r-   r-   r.   r      s    
$




r   c                 C  s.  t jdd}|jddddd |jdd	d
dd |jddd
dd |jddd dtj}|jdddd| d tjd || }t|j|j|j	|j
d}t ;}g }t|jD ]\}}}	|	D ]}
||
rx|||jtj||
 qbq[t|D ]}|  q~W d    dS 1 sw   Y  dS )NzSearch for all files inside <root> *not* matching <extensions> and produce compressed versions with '.gz' and '.br' suffixes (as long as this results in a smaller file))descriptionz-qz--quietzDon't produce log output
store_true)helpactionz	--no-gzipzDon't produce gzip '.gz' filesstore_falser&   )rp   rq   destz--no-brotliz Don't produce brotli '.br' filesr(   rootz(Path root from which to search for files)rp   z, r+   *z,File extensions to exclude from compression z
(default: ))nargsrp   default)r+   r&   r(   r,   r   )argparseArgumentParseradd_argumentr4   r   r#   
parse_argsr+   r&   r(   r,   r   r@   walkrt   r:   rG   submitrQ   rJ   r   result)argvparserdefault_excludeargs
compressorexecutorfuturesdirpath_dirsfilesr9   futurer-   r-   r.   main   sl   

	


r   __main__r"   )
__future__r   ry   rY   r@   r1   concurrent.futuresr   r   ior   r_   r'   ImportErrorr   r   ri   
SystemExitr-   r-   r-   r.   <module>   s&    
z;
