a
    h@                     @   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 ddlmZ G d	d
 d
eZdS )    N   )FileDownloader   )Request)CertificateVerifyError	HTTPErrorTransportError)ContentTooShortErrorRetryManagerThrottledDownloadint_or_noneparse_http_rangetry_call)HTTPHeaderDictc                   @   s   e Zd Zdd ZdS )HttpFDc           
         s`  d  dd i }|d ur2|d< G dd dt}| |_|_d _tddi dj d	d
rj	n j dp di  dpdd_
d_j dd_t _t d\
	}j ddrtjjrtj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  y }	 z"|	j|_W Y d }	~	qW Y d }	~	n^d }	~	0   y.   d |_| jd!8  _Y qY n* yD   Y  dS       Y n0 qd
S )"Nurlrequest_dataZimpersonatec                   @   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   K/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/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   SucceedDownloadB   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__F   s    z4HttpFD.real_download.<locals>.RetryDownload.__init__N)r   r   r   r)   r   r   r   r   RetryDownloadE   s   r*   c                   @   s   e Zd ZdS )z*HttpFD.real_download.<locals>.NextFragmentNr$   r   r   r   r   NextFragmentI   s   r+   c            	         s  srt td n_jdkr\j
d urB
7 jrTj d_n"
d urj
njdkrzdnd d_jrj d } 	d u r| nt| 	 n	d ur	 nd  t	 fddrd_d_t
d	 d
  dt	 fddrjd  td}d u}|rZdt dt pNd |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y } z:|jdkrJz&jt_jjd }W n@ ty } z&|jdk s|jdkr W Y d }~nd }~0 0 |d u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 }~d S n|jdk sb|jdkrd |W Y d }~nJd }~0  ty    Y n. ty } z|W Y d }~n
d }~0 0 d S )Ngffffff?r   abFr   c                      s    kS r&   r   r   	range_endZrange_startr   r   <lambda>i       zDHttpFD.real_download.<locals>.establish_connection.<locals>.<lambda>r"   zConflicting range. (start=z > end=)c                      s
    j kS r&   )content_lenr   )ctxr.   r   r   r/   n   r0   )
extensionsz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   	Exceptionr2   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_endr2   errcontent_length)r*   r%   rA   r3   rG   	info_dictis_testreq_end	req_startr   request_extensionsr(   r   r-   r   establish_connectionL   s    


$
"
"


	z2HttpFD.real_download.<locals>.establish_connectionc                      s(    j d ur$ jdkr j   d  _ d S )Nr5   )streamrL   closer   )r3   r   r   close_stream   s    


z*HttpFD.real_download.<locals>.close_streamc                     s  j jd} j jdr d } r@| d u s:t| jkr@j} | d urt| j } jd}jd}|d ur| |k rd|  d| d dS |d ur| |krƈd	|  d
| d dS dj  j}t		 }d }|} fdd}z$j 
s
|nt||   }W n. tyJ }	 z||	 W Y d }	~	n
d }	~	0 0  t|7  t|dkrjqjd u rzFjj\__jd usJ j_j W n8 ty }	 zd|	  W Y d }	~	dS d }	~	0 0 zj| W nB tyH }	 z(d d|	  W Y d }	~	dS d }	~	0 0 || j  t		 }|}
jdds|
| t|}|
}|| j }jd u rd }n"|t		 jj  j }d jjj|||j dd	 | d ur$ | kr$q|r|jdp<dk rj d u rV|_ n6|j  dkrjd urjdkrj!  t"q|rd _ qjd u rd d dS sj#rj$d ur j$k r _jdkrj!  | d ur. | kr.t% t| }	||	 &jj jdrj'jj jdd d<   jdt		 j dd dS )Nr7   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                    sR     j dkr_n.ztjj _W n tyD   d_Y n0  | d S )Nr5   r   )rL   rB   ospathgetsizeFileNotFoundError)e)r*   byte_counterrY   r3   r   r   retry   s    
z5HttpFD.real_download.<locals>.download.<locals>.retryzunable to open for writing: 
zunable to write data: ZnoresizebufferZdownloadingctx_id)	r;   r<   r=   rL   r:   etaspeedelapsedrb   Zthrottledratelimit   r5   zDid not get any data blocksZ
updatetimezlast-modifiedZfiletimer9   )r<   r=   r:   r;   re   rb   T)(rI   rG   r   r@   _TEST_FILE_SIZErB   paramsZ	to_screen
block_sizetimereadrE   r   lenrW   Zsanitize_openrL   rD   Zundo_temp_namer:   Zreport_destinationOSErrorZreport_errorwriteZ	to_stderrZ	slow_downZbest_block_sizeZ
calc_speedrJ   Zcalc_etarM   
start_timeZthrottle_startrX   r   rA   r2   r	   rK   Z	try_utime)rJ   Zmin_data_lenZmax_data_lenri   startnowbeforer`   Z
data_blockrO   afterrd   rc   )r+   r*   rY   r3   rQ   rR   r(   )r_   r   download   s    
$
"



&
	z&HttpFD.real_download.<locals>.downloadretriesr   )r   Z_get_impersonate_targetr   r:   Z	temp_namerL   rW   r   rh   rg   rD   rB   ri   rj   ro   r   rZ   r[   isfiler\   rC   rF   r
   Zreport_retryr'   errorattempt)
r(   r:   rQ   Zimpersonate_targetr   _rV   rt   r`   rO   r   )r+   r*   r%   rA   rY   r3   rG   rQ   rR   rS   rT   r   rU   r(   r   r   real_download   sh    


$v !"
zHttpFD.real_downloadN)r   r   r   rz   r   r   r   r   r      s   r   )rZ   r>   rj   commonr   Z
networkingr   Znetworking.exceptionsr   r   r   utilsr	   r
   r   r   r   r   Zutils.networkingr   r   r   r   r   r   <module>   s    