U
    gA                     @   s   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m	Z	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ G d	d
 d
eZdS )    N   )FileDownloader   )Request)CertificateVerifyError	HTTPErrorTransportError)
ContentTooShortErrorRetryManagerThrottledDownloadXAttrMetadataErrorXAttrUnavailableErrorencodeFilenameint_or_noneparse_http_rangetry_callwrite_xattr)HTTPHeaderDictc                   @   s   e Zd Zdd ZdS )HttpFDc           	         sB  d  dd G dd dt}| |_|_d _tddi dj dd	rnjn j d
p di  d
pdd_	d_
j dd_t _t d\
	}j ddrtjtjrtjtj_
j
dk_G dd dtG dd dtG dd dt 	
fdd}fdd fdd}tj djD ]}z|  | W   S  k
r } z|j|_W Y qW 5 d }~X Y nZ  k
r   d |_| jd 8  _Y qY n, k
r&   Y  dS       Y nX qd	S )!Nurlrequest_datac                   @   s   e Zd ZejZejZejZ	dS )z-HttpFD.real_download.<locals>.DownloadContextN)
__name__
__module____qualname__dictget__getattr____setitem____setattr____delitem____delattr__ r!   r!   :/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/downloader/http.pyDownloadContext    s   r#   zAccept-EncodingidentityZhttp_headerstestFZhttp_chunk_sizeZdownloader_optionsr   wbZ
buffersizei   RangeZ
continuedlTc                   @   s   e Zd ZdS )z-HttpFD.real_download.<locals>.SucceedDownloadNr   r   r   r!   r!   r!   r"   SucceedDownloadC   s   r)   c                   @   s   e Zd Zdd ZdS )z+HttpFD.real_download.<locals>.RetryDownloadc                 S   s
   || _ d S N)source_error)selfr+   r!   r!   r"   __init__G   s    z4HttpFD.real_download.<locals>.RetryDownload.__init__N)r   r   r   r-   r!   r!   r!   r"   RetryDownloadF   s   r.   c                   @   s   e Zd ZdS )z*HttpFD.real_download.<locals>.NextFragmentNr(   r!   r!   r!   r"   NextFragmentJ   s   r/   c            	         s  srt td n_jdkr\j
d k	rB
7 jrTj d_n"
d k	rj
njdkrzdnd d_jrj d } 	d kr| nt| 	 n	d k	r	 nd  t	 fddrd_d_t
d	 d
  dt	 fddrjd  t}d k	}|rVdt dt pJd |jd< zЈj|_|rjjd}t|\}}}|krjr| ks| k r|_|s	rt|pʈ		p|
pd _W d S dkr  d_d_tjjdd  __W n tk
rt } z,|jdkrBz&jt_jjd }W n> tk
r } z|jdk s|jdkr W 5 d }~X Y nX |d k	r"jd t|  k rjd k r"n n>j jj jdjjd n  d_d_W Y ,d S n|jdk sZ|jdkr\ |W 5 d }~X Y nB tk
r    Y n, tk
r } z|W 5 d }~X Y nX d S )Ngffffff?r   abFr   c                      s    kS r*   r!   r!   	range_endZrange_startr!   r"   <lambda>j       zDHttpFD.real_download.<locals>.establish_connection.<locals>.<lambda>r&   zConflicting range. (start=z > end=)c                      s
    j kS r*   )content_lenr!   )ctxr2   r!   r"   r3   o   r4   zbytes=- r'   zContent-RangeContent-lengthi  zContent-Lengthi  iX  d   finished)filenamestatusdownloaded_bytestotal_bytes)randomrandintint
chunk_size
resume_len	is_resumeZreport_resuming_byte	open_modeminr   	Exceptionr6   r   r   headersZydlurlopendatar   r   data_lenZreport_unable_to_resumer   r>   Zreport_file_already_downloadedr=   
try_renametmpfilename_hook_progressr   r   )	Zchunk_aware_endrequestZ	has_rangeZcontent_rangeZcontent_range_startZcontent_range_endr6   errcontent_length)r.   r)   rD   r7   rJ   	info_dictis_testreq_end	req_startr   r,   r   r1   r"   establish_connectionM   s    


$
"
"

 
	z2HttpFD.real_download.<locals>.establish_connectionc                      s(    j d k	r$ jdkr j   d  _ d S )Nr8   )streamrO   closer!   )r7   r!   r"   close_stream   s    


z*HttpFD.real_download.<locals>.close_streamc                     s  j jd} j jdr d } r@| d ks:t| jkr@j} | d k	rt| j } jd}jd}|d k	r| |k rd|  d| d dS |d k	r| |krƈd	|  d
| d dS dj  j}t		 }d }|} fdd}z$j 
s
|nt||   }W n, tk
rH }	 z||	 W 5 d }	~	X Y nX  t|7  t|dkrhq
jd krdzFjj\__jd k	stj_j W n: tk
r }	 zd|	  W Y dS d }	~	X Y nX jddrd| d k	rdztjdt|   W n8 ttfk
rb }	 zd|	  W 5 d }	~	X Y nX zj| W nD tk
r }	 z$d d|	  W Y dS d }	~	X Y nX || j  t		 }|}
jdds |
| t|}|
}!|| j }j"d kr(d }n"#|t		 j"j  j }$d j"jj|||j% dd	 | d k	r | krq
|r|jdpdk rj&d kr|_&n6|j& dkrjd k	rjdkrj'  t(q|rd _&qjd kr.d d dS s^j)r^j*d k	r^ j*k r^ _jdkrtj'  | d k	r | krt+ t| }	||	 ,jj jddr܈-jj jdd d< $  jd t		 j% dd! dS )"Nr:   zContent-encodingZmin_filesizeZmax_filesizez/[download] File is smaller than min-filesize (z	 bytes < z bytes). Aborting.Fz.[download] File is larger than max-filesize (z	 bytes > r   c                    sX     j dkr_n4ztjtj _W n tk
rJ   d_Y nX  | d S )Nr8   r   )rO   rE   ospathgetsizer   FileNotFoundError)e)r.   byte_counterr[   r7   r!   r"   retry   s    
z5HttpFD.real_download.<locals>.download.<locals>.retryzunable to open for writing: Zxattr_set_filesizezuser.ytdl.filesizezunable to set filesize xattr: 
zunable to write data: ZnoresizebufferZdownloadingctx_id)	r>   r?   r@   rO   r=   etaspeedelapsedrd   Zthrottledratelimit   r8   zDid not get any data blocksZ
updatetimeTzlast-modifiedZfiletimer<   )r?   r@   r=   r>   rg   rd   ).rL   rJ   r   rC   _TEST_FILE_SIZErE   paramsZ	to_screen
block_sizetimereadrH   r   lenrY   Zsanitize_openrO   rG   AssertionErrorZundo_temp_namer=   Zreport_destinationOSErrorZreport_errorr   strencoder   r   writeZ	to_stderrZ	slow_downZbest_block_sizeZ
calc_speedrM   Zcalc_etarP   
start_timeZthrottle_startrZ   r   rD   r6   r	   rN   Z	try_utime)rM   Zmin_data_lenZmax_data_lenrk   startnowbeforerb   Z
data_blockrR   afterrf   re   )r/   r.   r[   r7   rT   rU   r,   )ra   r"   download   s    
$ "
"



&
	z&HttpFD.real_download.<locals>.downloadretriesr   )r   r   r=   Z	temp_namerO   rY   r   rj   ri   rG   rE   rk   rl   rt   r   r\   r]   isfiler   r^   rF   rI   r
   Zreport_retryr+   errorattempt)	r,   r=   rT   r#   _rX   ry   rb   rR   r!   )r/   r.   r)   rD   r[   r7   rJ   rT   rU   rV   rW   r   r,   r   r"   real_download   sd    

"v '
zHttpFD.real_downloadN)r   r   r   r   r!   r!   r!   r"   r      s   r   )r\   rA   rl   commonr   Z
networkingr   Znetworking.exceptionsr   r   r   utilsr	   r
   r   r   r   r   r   r   r   r   Zutils.networkingr   r   r!   r!   r!   r"   <module>   s   0