o
    i@                     @   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                   @      e Zd Zdd ZdS )HttpFDc           
         s<  d  dd i }|d ur|d< G dd dt}| |_|_d _tddi dj d	d
rFj	nj dpV di  dpVdd_
d_j dd_t _t d\
	}j ddrtjjrt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 ]E}z	|  | W   S  y }	 z
|	j|_W Y d }	~	qd }	~	w  y
   d |_| jd!8  _Y q y   Y  dS       d
S )"Nurlrequest_data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   J/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/downloader/http.pyDownloadContext    s    
r!   zAccept-Encodingidentityhttp_headerstestFhttp_chunk_sizedownloader_optionsr   wb
buffersizei   Range
continuedlTc                   @      e Zd ZdS )z-HttpFD.real_download.<locals>.SucceedDownloadNr   r   r   r   r   r   r    SucceedDownloadB       r-   c                   @   r   )z+HttpFD.real_download.<locals>.RetryDownloadc                 S   s
   || _ d S N)source_error)selfr0   r   r   r    __init__F   s   
z4HttpFD.real_download.<locals>.RetryDownload.__init__N)r   r   r   r2   r   r   r   r    RetryDownloadE       r3   c                   @   r+   )z*HttpFD.real_download.<locals>.NextFragmentNr,   r   r   r   r    NextFragmentI   r.   r5   c            	         s  srt td n_jdkr.j
d ur!
7 jr*j d_n
d ur5
n
jdkr=dnd d_jrXj d } 	d u rR| nt| 	 n		d ur_	 nd  t	 fddr}d_d_t
d	 d
  dt	 fddrjd  td}d u}|rdt dt pd |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 d S  ty } z|jdkrzjt_jjd }W n# tyL } z|jdk s>|jdkr? W Y d }~|d }~ww |d urjd t|  k rfjd k rn nj jj jdjjd   d_d_W Y d }~d S |jdk s|jdkr |d }~w ty     ty } z|d }~ww )Ngffffff?r   abFr   c                      s    kS r/   r   r   	range_endrange_startr   r    <lambda>i   s    zDHttpFD.real_download.<locals>.establish_connection.<locals>.<lambda>r'   zConflicting range. (start=z > end=)c                      s
    j kS r/   )content_lenr   )ctxr8   r   r    r:   n   s   
 )
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_resumereport_resuming_byte	open_modeminr   	Exceptionr<   r   r   headersydlurlopendatar   r   data_lenreport_unable_to_resumer   rE   report_file_already_downloadedrD   
try_renametmpfilename_hook_progressr   r   )	chunk_aware_endrequest	has_rangecontent_rangecontent_range_startcontent_range_endr<   errcontent_length)r3   r-   rK   r=   rR   	info_dictis_testreq_end	req_startr   request_extensionsr1   r   r7   r    establish_connectionL   s   


""


,z2HttpFD.real_download.<locals>.establish_connectionc                      s,    j d ur jdkr j   d  _ d S d S )Nr?   )streamrZ   closer   )r=   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rct| j } jd}jd}|d urM| |k rMd|  d| d dS |d urc| |krcd	|  d
| d dS dj  j}t		 }d }|} fdd}	 zj 
s|nt||   }W n ty }	 z
||	 W Y d }	~	nd }	~	ww  t|7  t|dkrnjd u rz"jj\__jd usJ j_j W n ty }	 zd|	  W Y d }	~	dS d }	~	ww zj| W n! ty }	 zd d|	  W Y d }	~	dS d }	~	ww || j  t		 }|}
jddsB|
| t|}|
}|| j }jd u rWd }n|t		 jj  j }d jjj|||j dd	 | d ur | krn<|r|jdpdk rj d u r|_ n"|j  dkrjd urjdkrj!  t"n|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r0'jj jdd d<   jdt		 j dd dS )NrA   zContent-encodingmin_filesize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_ | ztjj _W  |  ty+   d_Y  | w )Nr?   r   )rZ   rL   ospathgetsizeFileNotFoundError)e)r3   byte_counterrl   r=   r   r    retry   s   
z5HttpFD.real_download.<locals>.download.<locals>.retryTzunable to open for writing: 
zunable to write data: noresizebufferdownloadingctx_id)	rE   rF   rG   rZ   rD   etaspeedelapsedry   throttledratelimit   r?   zDid not get any data blocks
updatetimezlast-modifiedfiletimerC   )rF   rG   rD   rE   r|   ry   )(rU   rR   r   rJ   _TEST_FILE_SIZErL   params	to_screen
block_sizetimereadrP   r   lenrj   sanitize_openrZ   rO   undo_temp_namerD   report_destinationOSErrorreport_errorwrite	to_stderr	slow_downbest_block_size
calc_speedrV   calc_etar[   
start_timethrottle_startrk   r   rK   r<   r	   rY   	try_utime)rV   min_data_lenmax_data_lenr   startnowbeforeru   
data_blockrb   afterr{   rz   )r5   r3   rl   r=   rd   re   r1   )rt   r    download   s   
"

"

O

&
	z&HttpFD.real_download.<locals>.downloadretriesr   )r   _get_impersonate_targetr   rD   	temp_namerZ   rj   r   r   r   rO   rL   r   r   r   r   ro   rp   isfilerq   rM   rQ   r
   report_retryr0   errorattempt)
r1   rD   rd   impersonate_targetr!   _ri   r   ru   rb   r   )r5   r3   r-   rK   rl   r=   rR   rd   re   rf   rg   r   rh   r1   r   r    real_download   sj   


$v !zHttpFD.real_downloadN)r   r   r   r   r   r   r   r    r      r4   r   )ro   rH   r   commonr   
networkingr   networking.exceptionsr   r   r   utilsr	   r
   r   r   r   r   utils.networkingr   r   r   r   r   r    <module>   s     