a
    lOKc                     @   sz   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 e jdkrPd dlm	Z	m
Z
 nd dlZd dlm	Z	m
Z
 G dd dZdS )    N)BytesIO   r   )urlopenRequestc                   @   sX   e Zd Zdd ZdddZddd	ZdddZdd ZdddZdddZ	dddZ
dS )
Downloaderc                 K   s   | dddi| _d| _tjdkr,td t j}z.tj	
|sTdd l}| }tj|d| _W n   t | _Y n0 d S )	NZ	useragentz
User-AgentZMozillai   ntZcolorr   )cafile)getuachunkosnamesystemsslZget_default_verify_pathsZopenssl_cafilepathexistscertifiwhereZcreate_default_contextssl_contextZ_create_unverified_context)selfkwargsr	   r    r   :/Volumes/EFI-PX-HACK/Utils/GenSMBIOS/Scripts/downloader.py__init__   s    
zDownloader.__init__utf-8ignorec                 C   s$   t jdkr t|tr |||S |S )Nr   )sysversion_info
isinstancebytesdecode)r   valueencodingerrorsr   r   r   _decode   s    zDownloader._decodeNc              
   C   sX   |d kr| j n|}ztt||d| jd}W n& tyR } zW Y d }~d S d }~0 0 |S )N)headers)context)r   r   r   r   	Exception)r   urlr&   responseer   r   r   open_url$   s    zDownloader.open_urlF   c                    s@  |dkrdS |rg dng d}|r(dnd}t |}i  |D ]}	| |	< || }q<rntfdd|D d nrzn t fd	d|d d d D d
}
zt|}W n   d}Y n0 |dk rdn|dkrdn|}t |
 |}t|d\}}|r|dn|dkr||dnd}dt||s4dnd| |
S )NUnknown)BZKiBZMiBZGiBZTiBZPiB)r0   ZKBZMBZGBZTBZPBi   i  c                 3   s"   | ]}|     kr|V  qd S N)lower.0x)suffixr   r   	<genexpr>C       z&Downloader.get_size.<locals>.<genexpr>c                 3   s   | ]} | d kr|V  qdS )   Nr   r3   )s_dictr   r   r7   E   r8   r0   r-   r      .0 z	{:,}{} {})	floatnextintroundstrsplitrstripljustformat)r   sizer6   Zuse_1024Zround_toZstrip_zeroesextZdivsr+   ZbiggestZbvalabr   )r:   r6   r   get_size/   s$    
 **zDownloader.get_sizec                 C   s   |dkrvt || }t|d d}| |}z| ||dd }W n   | |}Y n0 tjd||| n| |}tjd| d S )Nr   d   r-    r9   z![KDownloaded {} of {} ({:.2f}%)z[KDownloaded {})r?   rB   rM   rD   r   stdoutwriterG   )r   bytes_so_far
total_sizeZpercentZt_sZb_sr   r   r   _progress_hookQ   s    

zDownloader._progress_hookTc                 C   s&   |  ||||}|d krd S | |S r1   )	get_bytesr%   )r   r)   progressr&   expand_gzipr*   r   r   r   
get_string]   s    zDownloader.get_stringc                 C   s   |  ||}|d krd S d}zt|jd }W n   d}Y n0 d}|| j}	|t|	7 }|rl| || |	srq|||	7 }qD|r|jdd dkrt	|}
t
j|
d}| S |rtd	 |S )
Nr   Content-Lengthr.   r8   zContent-Encodingunknowngzip)fileobjr>   )r,   rA   r&   readr   lenrT   r
   r2   r   r[   ZGzipFileprint)r   r)   rV   r&   rW   r*   rR   rS   Zchunk_so_farr   r\   Zgfiler   r   r   rU   b   s"    
zDownloader.get_bytesc           
      C   s   |  ||}|d krd S d}zt|jd }W n   d}Y n0 t|dJ}|| j}	|t|	7 }|rt| || |	szq||	 qLW d    n1 s0    Y  |rt	d t
j|r|S d S )Nr   rY   r.   wbr>   )r,   rA   r&   openr]   r   r^   rT   rQ   r_   r   r   r   )
r   r)   Z	file_pathrV   r&   r*   rR   rS   fr   r   r   r   stream_to_filev   s    *zDownloader.stream_to_file)r   r   )N)NFr-   F)TNT)TNT)TN)__name__
__module____qualname__r   r%   r,   rM   rT   rX   rU   rc   r   r   r   r   r      s   


"

r   )r   r   timer   r[   ior   r   urllib.requestr   r   urllib2r   r   r   r   r   <module>   s   (
