U
    $Pf ?                     @   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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mZmZmZmZmZ G dd	 d	e	ZdS )
    )unicode_literalsN   )FileDownloader   )
compat_strcompat_urllib_error)ContentTooShortErrorencodeFilenameint_or_nonesanitize_opensanitized_Requestwrite_xattrXAttrMetadataErrorXAttrUnavailableErrorc                   @   s   e Zd Zdd ZdS )HttpFDc              
      s2  d G dd dt }| |_
|_d _ddid}|rV| 
jddrn
jn d	i d
p
jd
pdd_	d_
d _
jdd_t _d _
jddrtjtjrtjtj_
j
dk_d
jdd	G dd dtG dd dtG dd dt dd 
f	dd} 	
fdd}	kr z|  | W S  k
r } z0d7 	krЈ
|j	 W Y qW 5 d }~X Y n2  k
r   Y qY n k
r   Y dS X q
d	  dS ) Nurlc                   @   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-7zdooeg3/youtube_dl/downloader/http.pyDownloadContext   s   r   zYoutubedl-no-compressionTrueZhttp_headerstestFZdownloader_optionsZhttp_chunk_sizer   wbZ
buffersizei   Z
continuedlTretriesc                   @   s   e Zd ZdS )z-HttpFD.real_download.<locals>.SucceedDownloadNr   r   r   r   r   r   r   SucceedDownloadF   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__J   s    z4HttpFD.real_download.<locals>.RetryDownload.__init__N)r   r   r   r'   r   r   r   r   RetryDownloadI   s   r(   c                   @   s   e Zd ZdS )z*HttpFD.real_download.<locals>.NextFragmentNr#   r   r   r   r   NextFragmentM   s   r)   c                 S   s(   d| }|r|t |7 }| d| d S )Nz	bytes=%d-ZRange)r   
add_header)reqstartendZrange_headerr   r   r   	set_rangeP   s    z'HttpFD.real_download.<locals>.set_rangec                     s  srt td n_jdkrLj} jrDj d_njdkr\d} nd } d_jrz| j d nd }|rjd k	r|jkrjd }| d k	}|_	t
d }|rʈ|| | zzj|_W nN tjfk
r. } z*t|dd }t|tjr ||W 5 d }~X Y nX |rΈjjd}|rtd|}|r| t|dkrt|d	}t|d
}	j p||kp|	|k }
|
r|	_W d S   d_d_tj dd _W d S  tjfk
rB } z2|jdkrz(jt
d _j d }W nB tjfk
rz } z|jdk sh|jdkrj W 5 d }~X Y nX |d k	rjd t|  k rjd k rn n>j  j!j "jdjjd  n  d_d_W Y ,d S n|jdk s(|jdkr*  |W 5 d }~X Y n> tj#k
r~ } z|j$t$j%krf  |W 5 d }~X Y nX d S )Ngffffff?r   abFr   reasonzContent-Rangezbytes (\d+)-(\d+)?(?:/(\d+))?r      r!   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data_len	has_ranger   Zydlurlopendatar   URLErrorgetattr
isinstancesockettimeoutheadersr   researchgroupr
   Zreport_unable_to_resumeinfo	HTTPErrorcodeZreport_file_already_downloadedr5   
try_renametmpfilename_hook_progresserrorerrno
ECONNRESET)Zrange_startZ	range_endrA   requesterrr0   Zcontent_rangeZcontent_range_mZcontent_range_endZcontent_lenZaccept_content_lencontent_length)	r(   r$   r<   ctxrI   is_testr&   r.   r   r   r   establish_connectionV   s    





 
	z2HttpFD.real_download.<locals>.establish_connectionc                     s  j  dd } r2| d ks,t| jkr2j} | d k	rt| j } jd}jd}|d k	r| |k rd| |f  dS |d k	r| |krd| |f  dS dj  j}t		 }d }|} fdd	}z&j 
| d kr|nt||   }W n tjk
r0 }	 z||	 W 5 d }	~	X Y nV tjk
r }	 z4|	jtjtjfksjt|	d
d dkrr||	  W 5 d }	~	X Y nX  t|7  t|dkrq҈jd krzDtjj\__jd k	stj_j W n@ ttfk
r4 }
 zdt|
  W Y dS d }
~
X Y nX jddr| d k	rzt jdt| !d W n: t"t#fk
r }
 zdt|
  W 5 d }
~
X Y nX zj$| W nJ ttfk
r }
 z&%d dt|
  W Y dS d }
~
X Y nX &|| j  t		 }|}jddsH'|| t|}|}(|| j }j)d krrd }n"*|t		 j)j  j }+d j)jj|||j, d | d k	r܈ | krܐqq܈sj-rj)d k	r j)k r _ jd kr(%d d dS jdkr>j.  | d k	rv | krvt/ t| }
krr||
 |
0jj jddr1jj  dd d< +  jdt		 j, d dS )Nr2   Zmin_filesizeZmax_filesizezN[download] File is smaller than min-filesize (%s bytes < %s bytes). Aborting.FzM[download] File is larger than max-filesize (%s bytes > %s bytes). Aborting.r   c                    sP   j dk}jd k	r(|s"j  d _|r0ntjtj _ | d S )N-)rQ   streamcloseospathgetsizer	   r=   )eZ	to_stdout)r(   byte_counterrY   r   r   retry   s    


z5HttpFD.real_download.<locals>.download.<locals>.retrymessagezThe read operation timed outzunable to open for writing: %sZxattr_set_filesizezuser.ytdl.filesizezutf-8z unable to set filesize xattr: %s
zunable to write data: %sZnoresizebufferZdownloading)r6   r7   r8   rQ   r5   etaspeedelapsedzDid not get any data blocksr\   Z
updatetimeTzlast-modifiedZfiletimer4   )r7   r8   r5   r6   ri   )2rC   rM   r   r;   _TEST_FILE_SIZEr=   paramsZ	to_screen
block_sizetimereadminrG   rH   rS   rT   rU   Z	ETIMEDOUTrE   lenr]   r   rQ   r?   AssertionErrorZundo_temp_namer5   Zreport_destinationOSErrorIOErrorreport_errorstrr   encoder   r   writeZ	to_stderrZ	slow_downZbest_block_sizeZ
calc_speedr@   Zcalc_etarR   
start_timer<   r^   r   rP   Z	try_utime)r@   Zmin_data_lenZmax_data_lenrl   r,   nowbeforerd   Z
data_blockrb   rW   afterrh   rg   )r)   r(   countrY   	info_dictrZ   r"   r&   )rc   r   download   s    

&& $
"&



 z&HttpFD.real_download.<locals>.downloadr   zgiving up after %s retries)r   r5   Z	temp_namerQ   r]   r   updaterk   rj   r?   r=   r@   rl   rm   rx   r<   r_   r`   isfiler	   ra   r>   	ExceptionZreport_retryr%   rt   )r&   r5   r}   r   add_headersr[   r~   rb   r   )r)   r(   r$   r<   r|   rY   rI   r}   rZ   r"   r&   r.   r   r   real_download   sj    




n 


zHttpFD.real_downloadN)r   r   r   r   r   r   r   r   r      s   r   )
__future__r   rT   r_   rG   rm   r9   rJ   commonr   compatr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   <module>   s   (