U
    o_*                     @   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   sl   | dddi| _d| _t j}z.tj|s@dd l	}|
 }tj|d| _W n   t | _Y nX d S )NZ	useragentz
User-AgentZMozillai   r   )cafile)getuachunksslZget_default_verify_pathsZopenssl_cafileospathexistscertifiwhereZcreate_default_contextssl_contextZ_create_unverified_context)selfkwargsr   r    r   CC:\Users\steff\Desktop\Mac OS\gibMacOS-master\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   sZ   |d kr| j n|}ztt||d| jd}W n( tk
rT } z
W Y d S d }~X Y nX |S )N)headers)context)r
   r   r   r   	Exception)r   urlr#   responseer   r   r   open_url$   s    zDownloader.open_urlF   c                    sP  |dkrdS |r ddddddgndd	d
dddg}|r8dnd}t |}i  |D ]}	| |	< || }qLr~tfdd|D d nrn t fdd|d d d D d}
zt|}W n   d}Y nX |dk rdn|dkrdn|}t |
 |}t|d\}}|r|dn|dkr,||dnd}dt||sDdnd| |
S )NUnknownBZKiBZMiBZGiBZTiBZPiBZKBZMBZGBZTBZPBi   i  c                 3   s"   | ]}|     kr|V  qd S N)lower.0x)suffixr   r   	<genexpr>C   s      z&Downloader.get_size.<locals>.<genexpr>c                 3   s   | ]} | d kr|V  qdS )   Nr   r0   )s_dictr   r   r4   E   s      r*   r      .0 z	{:,}{} {})	floatnextintroundstrsplitrstripljustformat)r   sizer3   Zuse_1024Zround_toZstrip_zeroesZextZdivsr(   ZbiggestZbvalabr   )r6   r3   r   get_size/   s(    $
 *  
*zDownloader.get_sizec                 C   s   |dkrvt || }t|d d}| |}z| ||dd }W n   | |}Y nX tjd||| n| |}tjd| d S )Nr   d   r*    r5   zDownloaded {} of {} ({:.2f}%)zDownloaded {})r;   r>   rH   r@   r   stdoutwriterC   )r   r'   bytes_so_far
total_sizepercentZt_sZb_sr   r   r   _progress_hookQ   s    
  
zDownloader._progress_hookTc                 C   s&   |  ||||}|d krd S | |S r.   )	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X d}|| j}	|t|	7 }|rn| ||| |	stq~||	7 }qD|r|jdd dkrt	|}
t
j|
d}| S |S )	Nr   Content-Lengthr+       zContent-Encodingunknowngzip)fileobj)r)   r=   r#   readr   lenrP   r	   r/   r   rX   ZGzipFile)r   r&   rR   r#   rS   r'   rM   rN   Zchunk_so_farr   rY   Zgfiler   r   r   rQ   b   s*       
  
zDownloader.get_bytesc           
   	   C   s   |  ||}|d krd S d}zt|jd }W n   d}Y nX t|dB}|| j}	|t|	7 }|rv| ||| |	s|q||	 qLW 5 Q R X t	j
|r|S d S )Nr   rU   r+   wb)r)   r=   r#   openrZ   r   r[   rP   rL   r   r   r   )
r   r&   Z	file_pathrR   r#   r'   rM   rN   fr   r   r   r   stream_to_fileu   s"       
  zDownloader.stream_to_file)r   r   )N)NFr*   F)TNT)TNT)TN)__name__
__module____qualname__r   r"   r)   rH   rP   rT   rQ   r_   r   r   r   r   r      s   


"

r   )r   r   timer   rX   ior   r   Zurllib.requestr   r   Zurllib2r   r   r   r   r   <module>   s   (
