U
    ¦y^›<  ã                   @   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
¡pŽd‰dˆ_	dˆ_
d ˆ_ˆ
j dd¡ˆ_t ¡ ˆ_d ˆ_ˆ
j dd¡rötj tˆjƒ¡röt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 ¢�q‚W 5 d }~X Y n2 ˆ k
�r   Y �q‚Y 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   úMC:\Users\TaGoRe\Desktop\beinconnect-dl\binaries\youtube_dl\downloader\http.pyÚDownloadContext   s   r   zYoutubedl-no-compressionÚTrueÚhttp_headersÚtestFZdownloader_optionsÚhttp_chunk_sizer   ÚwbÚ
buffersizei   Ú
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Êˆj |¡ˆ_|�rxˆjj d¡}|�rdt d|¡}|�rd| t| d¡ƒk�rdt| d¡ƒ}t| d	¡ƒ}ˆj �pP||k�pP||k }|�rd|ˆ_W d S ˆ ¡  dˆ_d
ˆ_tˆj ¡  dd ¡ƒˆ_W d S  tjfk
�rì }	 �z2|	jdk�rºz(ˆj t
ˆd ˆƒ¡ˆ_ˆj ¡ d }
W nB tjfk
�r$ }	 z|	jdk �s|	jdk�r‚ W 5 d }	~	X Y n”X |
d k	�ršˆjd t|
ƒ  k �rXˆ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 �sÒ|	jdk�rÔ‚ ˆ |	ƒ‚W 5 d }	~	X Y n> tjk
�r( }	 z|	j t j!k�r‚ ˆ |	ƒ‚W 5 d }	~	X Y nX d S )Ngffffffî?r   ÚabFr   z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_resumeÚreport_resuming_byteÚ	open_modeÚdata_lenÚ	has_ranger   ÚydlÚurlopenÚdataÚheadersr   ÚreÚsearchÚgroupr
   Úreport_unable_to_resumeÚinfor   Ú	HTTPErrorÚcodeÚreport_file_already_downloadedr8   Ú
try_renameÚtmpfilenameÚ_hook_progressÚsocketÚerrorÚerrnoÚ
ECONNRESET)Zrange_startZ	range_endrE   ÚrequestZcontent_rangeZcontent_range_mZcontent_range_endZcontent_lenZaccept_content_lenÚerrÚcontent_length)	r,   r(   r?   ÚctxrI   Úis_testr*   r2   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	r¬t| ƒˆ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  
ˆsì|nt|| ˆ  ƒ¡}W np tjk
�r, }	 z||	ƒ W 5 d }	~	X Y nD tjk
�rn }	 z"|	jtjtjfk�rV‚ ||	ƒ W 5 d }	~	X Y nX ˆ t|ƒ7 ‰ t|ƒdk�rŽ�q¸ˆjd k�r’zDtˆjˆjƒ\ˆ_ˆ_ˆjd k	�sÂt‚ˆ ˆj¡ˆ_ˆ ˆj¡ W n@ ttfk
�r }
 zˆ d
t|
ƒ ¡ W Y ¢dS d }
~
X Y nX ˆj dd¡�r’| d k	�r’z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¡�s2ˆ &|| t|ƒ¡}|}ˆ '||ˆ ˆj ¡}ˆj(d k�r\d }n"ˆ )|t	 	¡ ˆj(ˆj ˆ ˆj ¡}ˆ *dˆ ˆj(ˆjˆj|||ˆj+ dœ¡ ˆrÜˆ | krÜ�q¸qÜˆ�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	�r\ˆ | k�r\t.ˆ t| ƒƒ}
ˆˆk�rX||
ƒ |
‚ˆ /ˆjˆj¡ ˆj dd¡�rœˆ 0ˆjˆj  ¡  dd ¡¡ˆd< ˆ *ˆ ˆ ˆjdt	 	¡ ˆj+ dœ¡ dS )Nr5   Úmin_filesizeÚ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                    sF   ˆj dk}|sˆj ¡  d ˆ_|r&ˆntj tˆj ƒ¡ˆ_ˆ | ƒ‚d S )Nú-)rS   ÚstreamÚcloseÚosÚpathÚgetsizer	   r@   )ÚeZ	to_stdout)r,   Úbyte_counterr\   r   r   ÚretryÛ   s    

z5HttpFD.real_download.<locals>.download.<locals>.retryzunable to open for writing: %sÚxattr_set_filesizezuser.ytdl.filesizezutf-8z unable to set filesize xattr: %sÚ
zunable to write data: %sÚnoresizebufferÚdownloading)r9   r:   r;   rS   r8   ÚetaÚspeedÚelapsedzDid not get any data blocksra   Ú
updatetimeTzlast-modifiedÚfiletimer7   )r:   r;   r8   r9   rp   )1rH   rN   r   r>   Ú_TEST_FILE_SIZEr@   ÚparamsÚ	to_screenÚ
block_sizeÚtimeÚreadÚminrU   ÚtimeoutrV   rW   rX   Z	ETIMEDOUTÚlenrb   r   rS   rC   ÚAssertionErrorÚundo_temp_namer8   Úreport_destinationÚOSErrorÚIOErrorÚreport_errorÚstrr   Úencoder   r   ÚwriteÚ	to_stderrÚ	slow_downÚbest_block_sizeÚ
calc_speedrD   Úcalc_etarT   Ú
start_timer?   rc   r   rR   Ú	try_utime)rD   Zmin_data_lenZmax_data_lenrv   r0   ÚnowZbeforeri   Z
data_blockrg   rZ   Zafterro   rn   )r-   r,   Úcountr\   Ú	info_dictr]   r&   r*   )rh   r   Údownload½   sÈ    
	" ÿ$
"ø&



 ûz&HttpFD.real_download.<locals>.downloadr   zgiving up after %s retries)r   r8   Ú	temp_namerS   rb   r   Úupdatert   rs   rC   r@   rD   rv   rw   rŠ   r?   rd   re   Úisfiler	   rf   rA   Ú	ExceptionÚreport_retryr)   r�   )r*   r8   rŽ   r   Zadd_headersr^   r�   rg   r   )r-   r,   r(   r?   r�   r\   rI   rŽ   r]   r&   r*   r2   r   r   Úreal_download   sj    



ÿþ
ÿg 


zHttpFD.real_downloadN)r   r   r   r•   r   r   r   r   r      s   r   )Ú
__future__r   rW   rd   rU   rw   r<   rJ   Úcommonr   Úcompatr   r   Úutilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   Ú<module>   s   (