Ë
    š„j¾T  ã                   óØ   — 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Zddlm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZmZ dd	lmZmZmZ dd
lmZ ddlmZ  G d„ de«      Z G d„ de	«      Zy)é    Né   )ÚFileDownloader)ÚHttpFDé   )Úaes_cbc_decrypt_bytesÚunpad_pkcs7)ÚRequest)Ú	HTTPErrorÚIncompleteRead)ÚDownloadErrorÚRetryManagerÚtraverse_obj)ÚHTTPHeaderDict)ÚProgressCalculatorc                   ó   — e Zd Zd„ ZeZy)ÚHttpQuietDownloaderc                  ó   — y ©N© )ÚselfÚargsÚkargss      úQ/var/www/html/GAP/venv/lib/python3.12/site-packages/yt_dlp/downloader/fragment.pyÚ	to_screenzHttpQuietDownloader.to_screen   s   € Øó    N)Ú__name__Ú
__module__Ú__qualname__r   Úto_console_titler   r   r   r   r      s   „ òð !Ñr   r   c                   óŒ   — e Zd ZdZd„ Zdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ d„ ddddœd„Zy)Ú
FragmentFDa  
    A base file downloader class for fragmented media (e.g. f4m/m3u8 manifests).

    Available options:

    fragment_retries:   Number of times to retry a fragment for HTTP error
                        (DASH and hlsnative only). Default is 0 for API, but 10 for CLI
    skip_unavailable_fragments:
                        Skip unavailable fragments (DASH and hlsnative only)
    keep_fragments:     Keep downloaded fragments on disk after downloading is
                        finished
    concurrent_fragment_downloads:  The number of threads to use for native hls and dash downloads
    _no_ytdl_file:      Don't use .ytdl file

    For each incomplete fragment download yt-dlp keeps on disk a special
    bookkeeping file with download state and metadata (in future such files will
    be used for any incomplete download handled by yt-dlp). This file is
    used to properly handle resuming, check download file consistency and detect
    potential errors. The file has a .ytdl extension and represents a standard
    JSON file of the following format:

    extractor:
        Dictionary of extractor related data. TBD.

    downloader:
        Dictionary of downloader related data. May contain following data:
            current_fragment:
                Dictionary with current (being downloaded) fragment data:
                index:  0-based index of current fragment among all fragments
            fragment_count:
                Total count of fragments

    This feature is experimental and file format may change in future.
    c                 óL   — | j                  d«       | j                  ||||«      S )Nz{yt_dlp.downloader.FragmentFD.report_retry_fragment is deprecated. Use yt_dlp.downloader.FileDownloader.report_retry instead)Údeprecation_warningÚreport_retry)r   ÚerrÚ
frag_indexÚcountÚretriess        r   Úreport_retry_fragmentz FragmentFD.report_retry_fragment>   s.   € Ø× Ñ ð "]ô 	^à× Ñ   e¨W°jÓAÐAr   Nc                 óJ   — |rd|› d�nd}| j                  d|› d|d›d�«       y )Nú ú;Ú z
[download]z Skipping fragment Údz ...)r   )r   r&   r%   s      r   Úreport_skip_fragmentzFragmentFD.report_skip_fragmentC   s1   € Ù��#��a‰j RˆØ�‰˜ C 5Ð(;¸JÀq¸>ÈÐNÕOr   c                 óF   — |j                  d«      }|rt        |d |«      S |S )NÚhttp_headers)Úgetr	   )r   Ú	info_dictÚurlÚheaderss       r   Ú_prepare_urlzFragmentFD._prepare_urlG   s&   € Ø—-‘- Ó/ˆÙ.5Œw�s˜D 'Ó*Ð>¸3Ð>r   c                 óJ   — | j                  |«       | j                  ||«       y r   )Ú_prepare_frag_downloadÚ_start_frag_download)r   Úctxr3   s      r   Ú _prepare_and_start_frag_downloadz+FragmentFD._prepare_and_start_frag_downloadK   s    € Ø×#Ñ# CÔ(Ø×!Ñ! # yÕ1r   c                 ó`   — |d   duxr& |d   dk7  xr | j                   j                  d«       S )NÚliveTÚtmpfilenameú-Ú_no_ytdl_file)Úparamsr2   )r   r:   s     r   Ú__do_ytdl_filezFragmentFD.__do_ytdl_fileO   s6   € Ø�6‰{ $Ð&Òm¨3¨}Ñ+=ÀÑ+DÒmÈTÏ[É[Ï_É_Ð]lÓMmÐImÐmr   c                 óX  — d|vsJ ‚| j                  | j                  |d   «      d«      \  }}	 t        j                  |j	                  «       «      }|d   d   d   |d<   d|d   v r|d   d   |d<   |j                  «        y # t
        $ r d	|d<   Y Œ!w xY w# |j                  «        w xY w)
NÚytdl_corruptÚfilenameÚrÚ
downloaderÚcurrent_fragmentÚindexÚfragment_indexÚextra_stateT)Úsanitize_openÚytdl_filenameÚjsonÚloadsÚreadÚ	ExceptionÚclose)r   r:   ÚstreamÚ_Ú	ytdl_datas        r   Ú_read_ytdl_filezFragmentFD._read_ytdl_fileR   s½   € Ø SÑ(Ð(Ð(Ø×&Ñ& t×'9Ñ'9¸#¸j¹/Ó'JÈCÓP‰	ˆ�ð	ÜŸ
™
 6§;¡;£=Ó1ˆIØ$-¨lÑ$;Ð<NÑ$OÐPWÑ$XˆCÐ Ñ!Ø 	¨,Ñ 7Ñ7Ø%.¨|Ñ%<¸]Ñ%K��MÑ"ð �L‰L�Nøô ò 	'Ø"&ˆC�Óð	'ûð �L‰L�Nús$   ¯AB ÂBÂB ÂBÂB ÂB)c                 óF  — | j                  | j                  |d   «      d«      \  }}	 dd|d   ii}d|v r|d   |d<   |j                  d«      �|d   |d<   |j                  t	        j
                  d|i«      «       |j                  «        y # |j                  «        w xY w)	NrE   ÚwrH   rI   rJ   rK   Úfragment_countrG   )rL   rM   r2   ÚwriterN   ÚdumpsrR   )r   r:   Úfrag_index_streamrT   rG   s        r   Ú_write_ytdl_filezFragmentFD._write_ytdl_file_   s¹   € Ø#×1Ñ1°$×2DÑ2DÀSÈÁ_Ó2UÐWZÓ[ÑÐ˜1ð	&à"Ø˜SÐ!1Ñ2ð%ðˆJð
  Ñ#Ø,/°Ñ,>�
˜=Ñ)Ø�w‰wÐ'Ó(Ð4Ø/2Ð3CÑ/D�
Ð+Ñ,Ø×#Ñ#¤D§J¡J°¸jÐ/IÓ$JÔKà×#Ñ#Õ%øÐ×#Ñ#Õ%ús   ©AB ÂB c                 ó�  — d|d   |d   fz  }||xs |j                  d«      ||j                  d«      dœ}d}|d   j                  j                  d	d
«      r | j                  | j                  |«      «      }|x|d<   |d<   |d   j	                  ||«      \  }	}
|	sy|j                  d«      r|j                  d«      |d<   ||d<   y
)Nz	%s-Frag%dr>   rJ   r1   Úctx_id)r4   r1   Úrequest_datar_   r   ÚdlÚ
continuedlTÚfrag_resume_lenFÚfiletimeÚfragment_filetimeÚfragment_filename_sanitized)r2   rA   Úfilesize_or_noneÚ	temp_nameÚdownload)r   r:   Úfrag_urlr3   r5   r`   Úfragment_filenameÚfragment_info_dictrc   ÚsuccessrT   s              r   Ú_download_fragmentzFragmentFD._download_fragmento   sî   € Ø'¨3¨}Ñ+=¸sÐCSÑ?TÐ*UÑUÐàØ#ÒD y§}¡}°^Ó'DØ(Ø—g‘g˜hÓ'ñ	
Ðð ˆØˆt‰9×Ñ×Ñ ¨dÔ3Ø"×3Ñ3°D·N±NÐCTÓ4UÓVˆOØIXÐXÐÐ,Ñ-°Ð4EÑ0Fà˜‘Y×'Ñ'Ð(9Ð;MÓN‰
ˆ�ÙØØ×!Ñ! *Ô-Ø'9×'=Ñ'=¸jÓ'IˆCÐ#Ñ$Ø->ˆÐ)Ñ*Ør   c                 óè   — |j                  d«      sy 	 | j                  |d   d«      \  }}||d<   |j                  «       }|j	                  «        |S # t        $ r |j                  d«      rY y ‚ w xY w)Nrf   Úrbr=   )r2   rL   ÚFileNotFoundErrorrP   rR   )r   r:   ÚdownÚfrag_sanitizedÚfrag_contents        r   Ú_read_fragmentzFragmentFD._read_fragment„   s~   € Ø�w‰wÐ4Ô5Øð	Ø#'×#5Ñ#5°cÐ:WÑ6XÐZ^Ó#_Ñ ˆD�.ð
 .<ˆÐ)Ñ*Ø—y‘y“{ˆØ�
‰
ŒØÐøô !ò 	Ø�w‰w�vŒÙØð	ús   ”A ÁA1Á/A1c                 ó²  — 	 |d   j                  |«       |d   j                  «        | j                  |«      r| j                  |«       | j                  j                  dd«      s| j                  |d   «       |d= y # | j                  |«      r| j                  |«       | j                  j                  dd«      s| j                  |d   «       |d= w xY w)NÚdest_streamÚkeep_fragmentsFrf   )rZ   ÚflushÚ_FragmentFD__do_ytdl_filer]   rA   r2   Ú
try_remove)r   r:   rt   s      r   Ú_append_fragmentzFragmentFD._append_fragment’   sÃ   € ð	3Ø�Ñ×$Ñ$ \Ô2Ø�Ñ×$Ñ$Ô&à×"Ñ" 3Ô'Ø×%Ñ% cÔ*Ø—;‘;—?‘?Ð#3°UÔ;Ø—‘ Ð$AÑ BÔCØÐ1Ñ2øð	 ×"Ñ" 3Ô'Ø×%Ñ% cÔ*Ø—;‘;—?‘?Ð#3°UÔ;Ø—‘ Ð$AÑ BÔCØÐ1Ñ2ús   ‚'A? Á?ACc           
      ó"  — |j                  dd«      s%d|d   z  }|j                  dd«      }|r|d|z  z  }nd}| j                  d	| j                  › d
|› �«       | j	                  |d   «       t        | j                  i | j                  ¥ddddddœ¥«      }| j                  |d   «      }d}| j                  |«      }|dkD  rd}|j                  |ddœ«       | j                  |«      rùt        j                  j                  | j                  |d   «      «      }| j                  j                  dd«      }	|	rs|rq| j!                  |«       |j                  d«      du }
|d   dkD  xr |dk(  }|
s|rq|
rdnd}| j#                  |› d�«       dx|d<   }d|v r|d= | j%                  |«       n7|	s|r| j!                  |«       dx|d<   }| j%                  |«       |d   dk(  sJ ‚| j'                  ||«      \  }}|j                  ||||dœ«       y )Nr=   Fú%dÚtotal_fragsÚad_fragsr   ú (not including %d ad)úunknown (live)ú[ú] Total fragments: rE   T)Ú
noprogressÚtestÚsleep_intervalÚmax_sleep_intervalÚsleep_interval_subtitlesÚwbÚab©r>   rJ   rb   rD   rJ   z.ytdl file is corruptz2Inconsistent state of incomplete fragment downloadz#. Restarting from the beginning ...)ra   rw   r>   Úcomplete_frags_downloaded_bytes)Ú
setdefaultr2   r   ÚFD_NAMEÚreport_destinationr   ÚydlrA   rh   rg   Úupdaterz   ÚosÚpathÚisfilerM   rV   Úreport_warningr]   rL   )r   r:   Útotal_frags_strr€   ra   r>   Ú	open_modeÚ
resume_lenÚytdl_file_existsrb   Ú
is_corruptÚis_inconsistentÚmessagerw   s                 r   r8   z!FragmentFD._prepare_frag_download�   s\  € Ø�~‰~˜f eÔ,Ø" S¨Ñ%7Ñ7ˆOØ—w‘w˜z¨1Ó-ˆHÙØÐ#;¸hÑ#FÑF‘à.ˆOØ�‰˜˜4Ÿ<™<˜.Ð(;¸OÐ;LÐMÔNØ×Ñ  J¡Ô0Ü  §¡ð ,
Ø�k‰kð,
àØØØ"#Ø()ò,
ó ˆð —n‘n S¨¡_Ó5ˆØˆ	ð ×*Ñ*¨;Ó7ˆ
Ø˜Š>ØˆIð 	�
‰
Ø&Øñ
ô 	ð
 ×Ñ˜sÔ#Ü!Ÿw™wŸ~™~¨d×.@Ñ.@ÀÀZÁÓ.QÓRÐØŸ™Ÿ™¨°tÓ<ˆJÙÑ.Ø×$Ñ$ SÔ)Ø ŸW™W ^Ó4¸Ð<�
Ø"%Ð&6Ñ"7¸!Ñ";Ò"OÀ
ÈaÁ�Ù¡á3=Ñ/ØLð ð ×'Ñ'Ø"˜)Ð#FÐGôIà9:Ð:�CÐ(Ñ)¨JØ%¨Ñ,Ø Ð/Ø×)Ñ)¨#Õ.ñ "Ù'Ø×,Ñ,¨SÔ1Ø9:Ð:�CÐ(Ñ)¨JØ×%Ñ% cÔ*ØÐ+Ñ,°Ò1Ð1Ð1à#'×#5Ñ#5°kÀ9Ó#MÑ ˆ�[à�
‰
ØØ&Ø&à/9ñ
õ 	r   c                 óö   ‡ ‡‡‡‡‡‡— ‰d   }‰d   Š‰j                  d«      Šd|‰d   ‰‰d   ‰d   dœŠt        j                  «       ‰d	<   t        |«      Šˆˆˆˆˆ ˆˆfd
„}‰d   j                  |«       ‰d	   S )Nr�   r   r_   ÚdownloadingrJ   rE   r>   )ÚstatusÚdownloaded_bytesrJ   rY   rE   r>   Ústartedc                 ó0  •— | d   dvry ‰	s‰j                  d«      r‰d   ‰d<   ‰�| j                  d«      ‰k7  ry ‰j                  d«      ‰d<   ‰j                  d«      ‰d<   ‰j                  ‰d<   | j                  d«      xs d	}| j                  d
i «      | d<   ‰d   sK‰d   |z   ‰d   dz   z  ‰	z  }|‰_        ‰j	                  | j                  d«      «       ‰j                  ‰d<   n ‰j	                  | j                  d«      «       | d   dk(  r%‰dxx   dz  cc<   ‰d   ‰d<   ‰j                  «        ‰j                  x‰d<   ‰d<   ‰j                  j                  x‰d<   ‰d<   ‰j                  j                  ‰d<   ‰j                  ‰‰«       y )Nr    )rŸ   ÚfinishedrY   r_   Úmax_progressÚprogress_idxÚelapsedÚtotal_bytesr   r3   rl   r=   r�   rJ   r   r¡   Útotal_bytes_estimater¤   ÚspeedÚeta)r2   r§   ÚpopÚtotalr’   Úthread_resetÚ
downloadedrª   Úsmoothr«   Ú_hook_progress)
ÚsÚfrag_total_bytesÚestimated_sizer:   r_   r3   Úprogressr   Ústater   s
      €€€€€€€r   Úfrag_progress_hookz;FragmentFD._start_frag_download.<locals>.frag_progress_hookò   s½  ø€ Ø�‰{Ð"=Ñ=Øá 3§7¡7Ð+;Ô#<Ø*-Ð.>Ñ*?�Ð&Ñ'àÐ! a§e¡e¨H£o¸Ò&?Øà$'§G¡G¨NÓ$;ˆE�.Ñ!Ø$'§G¡G¨NÓ$;ˆE�.Ñ!à'×/Ñ/ˆE�)ÑØ Ÿu™u ]Ó3Ò8°qÐØ&'§e¡e¨K¸Ó&<ˆAÐ"Ñ#ð �v’;àÐ:Ñ;Ð>NÑNØÐ-Ñ.°Ñ2ñ4Ø6AñBð ð "0�”Ø—‘ §¡Ð&8Ó 9Ô:Ø08·±�Ð,Ò-à—‘ §¡Ð&8Ó 9Ô:à�‰{˜jÒ(ØÐ&Ó'¨1Ñ,Ó'Ø(-Ð.>Ñ(?�Ð$Ñ%Ø×%Ñ%Ô'àQY×QdÑQdÐdˆEÐ$Ñ%¨Ð,MÑ(NØ,4¯N©N×,AÑ,AÐAˆE�'‰N˜S ™\Ø#Ÿ<™<×.Ñ.ˆE�%‰Là×Ñ  yÕ1r   ra   )r2   Útimer   Úadd_progress_hook)	r   r:   r3   r™   r·   r_   rµ   r¶   r   s	   ```  @@@@r   r9   zFragmentFD._start_frag_downloadá   s•   þ€ ØÐ:Ñ;ˆ
Ø˜-Ñ(ˆØ—‘˜Ó"ˆð $Ø *Ø!Ð"2Ñ3Ø)Ø˜J™Ø˜}Ñ-ñ
ˆô Ÿ™›ˆˆI‰Ü% jÓ1ˆ÷%	2ò %	2ðN 	ˆD‰	×#Ñ#Ð$6Ô7à�9‰~Ðr   c                 ó>  — |d   j                  «        | j                  |«      r#| j                  | j                  |d   «      «       t	        j                  «       |d   z
  }|d   dk7  }|r| j                  |d   «      }n|d   }|s(|r| j                  |d   «       | j                  d«       y|r•| j                  |d   |d   «       |j                  d	«      }| j                  j                  d
«      rQ|rOt        j                  t        «      5  t        j                  |d   t	        j                  «       |f«       d d d «       | j                  |||d   d||j                  d«      |j                  d«      |j                  d«      dœ|«       y# 1 sw Y   ŒUxY w)Nrw   rE   r¢   r>   r?   r�   zThe downloaded file is emptyFre   Ú
updatetimer¤   r_   r¥   r¦   )r¡   r¨   rE   r    r§   r_   r¥   r¦   T)rR   rz   r{   rM   r¸   rg   Úreport_errorÚ
try_renamer2   rA   Ú
contextlibÚsuppressrQ   r“   Úutimer±   )r   r:   r3   r§   Úto_filer¡   rd   s          r   Ú_finish_frag_downloadz FragmentFD._finish_frag_download  s‚  € ØˆMÑ× Ñ Ô"Ø×Ñ˜sÔ#Ø�O‰O˜D×.Ñ.¨s°:©Ó?Ô@Ü—)‘)“+  I¡Ñ.ˆà�mÑ$¨Ñ+ˆÙØ#×4Ñ4°S¸Ñ5GÓHÑà"Ð#DÑEÐáÙØ—‘  MÑ 2Ô3Ø×ÑÐ<Ô=ØÙØ�O‰O˜C Ñ.°°J±Ô@Ø—w‘wÐ2Ó3ˆHØ�{‰{�‰˜|Ô,±Ü×(Ñ(¬Ó3ñ GÜ—H‘H˜S ™_¬t¯y©y«{¸HÐ.EÔF÷Gð 	×ÑØ 0Ø+Ø˜J™Ø ØØ—g‘g˜hÓ'ØŸG™G NÓ3ØŸG™G NÓ3ñ	
ð ô		ð ÷Gð Gús   Ä.FÆFc                 ó   — d|vrd|d<   |d   s%d|d   z  }|j                  dd«      }|r|d|z  z  }nd}| j                  d	| j                  › d
|› �«       | j                  |d   «      }|j	                  |ddœ«       y )Nr=   Fr~   r   r€   r   r�   r‚   rƒ   r„   rE   rŒ   )r2   r   r�   rh   r’   )r   r:   r—   r€   r>   s        r   Ú_prepare_external_frag_downloadz*FragmentFD._prepare_external_frag_downloadA  s›   € Ø˜ÑØˆC�‰KØ�6Š{Ø" S¨Ñ%7Ñ7ˆOØ—w‘w˜z¨1Ó-ˆHÙØÐ#;¸hÑ#FÑF‘à.ˆOØ�‰˜˜4Ÿ<™<˜.Ð(;¸OÐ;LÐMÔNà—n‘n S¨¡_Ó5ˆð 	�
‰
Ø&Øñ
õ 	r   c                 ó.   ‡ ‡‡‡— i Šˆˆˆ fd„Šˆˆˆ fd„}|S )Nc                 óŽ   •— | ‰vr<‰j                   j                  ‰j                  ‰| «      «      j                  «       ‰| <   ‰|    S r   )r‘   Úurlopenr6   rP   )r4   Ú
_key_cacher3   r   s    €€€r   Ú_get_keyz&FragmentFD.decrypter.<locals>._get_keyX  sD   ø€ Ø˜*Ñ$Ø"&§(¡(×"2Ñ"2°4×3DÑ3DÀYÐPSÓ3TÓ"U×"ZÑ"ZÓ"\�
˜3‘Ø˜c‘?Ð"r   c                 óh  •— |€y | j                  d«      }|r|d   dk7  r|S |j                  d«      xs t        j                  d| d   «      }|j                  d«      xs  ‰t        ‰d«      xs |d	   «      |d<   ‰j                  j                  d
d«      r|S t        t        ||d   |«      «      S )NÚdecrypt_infoÚMETHODzAES-128ÚIVz>8xqÚmedia_sequenceÚKEY)Úhls_aesÚuriÚURIr†   F)r2   ÚstructÚpackr   rA   r   r   )Úfragmentrt   rË   ÚivrÉ   r3   r   s       €€€r   Údecrypt_fragmentz.FragmentFD.decrypter.<locals>.decrypt_fragment]  sÅ   ø€ ØÐ#ØØ#Ÿ<™<¨Ó7ˆLÙ <°Ñ#9¸YÒ#FØ#Ð#Ø×!Ñ! $Ó'ÒZ¬6¯;©;°v¸xÐHXÑ?YÓ+ZˆBØ#/×#3Ñ#3°EÓ#:ò $sÙ&.¬|¸IÐGYÓ/ZÒ/qÐ^jÐkpÑ^qÓ&rð ˜Ñð
 �{‰{�‰˜v uÔ-Ø#Ð#ÜÔ4°\À<ÐPUÑCVÐXZÓ[Ó\Ð\r   r   )r   r3   r×   rÉ   rÈ   s   `` @@r   Ú	decrypterzFragmentFD.decrypterU  s   û€ Øˆ
ö	#ö
	]ð   Ðr   c           	      ó  ‡ ‡‡‡— dgŠt        |«      Š‰dk(  r ‰ j                  |d   i ‰¤ŽS ‰ j                  j                  dd«      }‰dkD  r‰ j	                  ‰«       t        t        |d«      «      }ˆˆˆˆ fd„} G d„ dt        j                  j                  «      }t        j                  d	k(  rd
„ }nd„ }ˆfd„}g }	t        |«      D ]V  \  }
\  }}} |t        j                  |‰z  «      «      }|j                  ||
| ||«      ||«      }|	j!                  ||f«       ŒX d}|	D ]$  \  }}	 |xr  ||«      }|j%                  d¬«       Œ& ‰d   s|st"        ‚|S # t"        $ r d‰d<   Y Œ3w xY w# |j%                  d¬«       w xY w)z“
        @params (ctx1, fragments1, info_dict1), (ctx2, fragments2, info_dict2), ...
                all args must be either tuple or list
        Tr   r   Úconcurrent_fragment_downloads).r   Úis_livec                 óL   •— ‰|d<   | |d<    ‰j                   |||fi ‰¤|‰dœ¤ŽS )Nr¥   r¦   )ÚtpeÚinterrupt_trigger)Údownload_and_append_fragments)	Úidxr:   Ú	fragmentsr3   rÝ   rÞ   Úkwargsr¥   r   s	        €€€€r   Úthread_funczFFragmentFD.download_and_append_fragments_multiple.<locals>.thread_func}  sJ   ø€ Ø".ˆC�ÑØ"%ˆC�ÑØ5�4×5Ñ5Ø�Y 	ñcØ-3ðcØ9<ÐPaócð cr   c                   ó   — e Zd Zd„ Zy)ú?FragmentFD.download_and_append_fragments_multiple.<locals>.FTPEc                  ó   — y r   r   )r   Úexc_typeÚexc_valÚexc_tbs       r   Ú__exit__zHFragmentFD.download_and_append_fragments_multiple.<locals>.FTPE.__exit__…  s   € Ør   N)r   r   r   rê   r   r   r   ÚFTPErå   ƒ  s   „ ór   rë   Úntc                 ó€   — 	 	 | j                  d«      S # t        $ r ‚ t        j                  j                  $ r Y Œ;w xY w)Ngš™™™™™¹?)ÚresultÚKeyboardInterruptÚ
concurrentÚfuturesÚTimeoutError©Úfutures    r   Úfuture_resultzHFragmentFD.download_and_append_fragments_multiple.<locals>.future_result‰  sB   € Øð!Ø%Ÿ}™}¨SÓ1Ð1øÜ,ò ØÜ%×-Ñ-×:Ñ:ò !Ù ð!ús   ƒ ”&=¼=c                 ó"   — | j                  «       S r   )rî   ró   s    r   rõ   zHFragmentFD.download_and_append_fragments_multiple.<locals>.future_result’  s   € Ø—}‘}“Ð&r   c              3   ó2   •K  — | D ]  }‰d   s y |–— Œ y ­w)Nr   r   )ÚfgÚfrÞ   s     €r   Úinterrupt_trigger_iterzQFragmentFD.download_and_append_fragments_multiple.<locals>.interrupt_trigger_iter•  s&   øè ø€ Øò �Ø(¨Ò+ÙØ“ñùs   ƒF©Úwait)Úlenrß   rA   r2   Ú_prepare_multiline_statusÚanyr   rð   rñ   ÚThreadPoolExecutorr“   ÚnameÚ	enumerateÚmathÚceilÚsubmitÚappendrï   Úshutdown)r   r   râ   Úmax_workersrÛ   rã   rë   rõ   rú   Úspinsrà   r:   rá   r3   rÝ   Újobrî   rÞ   r¥   s   ` `              @@r   Ú&download_and_append_fragments_multiplez1FragmentFD.download_and_append_fragments_multipleo  s£  û€ ð
 "˜FÐÜ˜4“yˆØ˜1ÒØ5�4×5Ñ5°t¸A±wÐIÀ&ÑIÐIØ—k‘k—o‘oÐ&EÀqÓIˆØ˜!ÒØ×*Ñ*¨<Ô8Ü”l 4Ð)<Ó=Ó>ˆ÷	cô	”:×%Ñ%×8Ñ8ô 	ô
 �7‰7�dŠ?ó!ò'ô	ð ˆÜ09¸$³ò 	%Ñ,ˆCÑ,�#�y )Ù”t—y‘y ¨|Ñ!;Ó<Ó=ˆCØ—*‘*˜[¨#¨sÑ4JÈ9Ó4UÐW`ÐbeÓfˆCØ�L‰L˜#˜s˜Õ$ð	%ð
 ˆØò 	(‰HˆC�ð(ØÒ6¡M°#Ó$6�ð —‘ $�Õ'ð	(ð ! Ò#©GÜ#Ð#ð ˆøô %ò -Ø',Ð! !Ó$ð-ûð —‘ $�Õ'ús$   Ä/EÅE/Å,E2Å.E/Å/E2Å2Fc                  ó   — y)NFr   )rà   s    r   ú<lambda>zFragmentFD.<lambda>°  ó   � r   c                 ó   — | S r   r   )Úcontentrà   s     r   r  zFragmentFD.<lambda>±  s   € ¨G€ r   )T)Úis_fatalÚ	pack_funcÚfinish_funcrÝ   rÞ   c          
      ó  ‡ ‡‡‡‡‡‡— ‰ j                   j                  dd«      sd„ Šˆˆˆˆ fd„Šˆˆˆ fd„}	‰ j                  ‰«      }
t        j                  ‰ j                   j                  dd«      ‰j                  dd«      z  «      }|dkD  rŽˆˆfd	„}|xs t
        j                  j                  |«      5 }	 |j                  ||«      D ]D  \  }}}‰j                  ||d
œ«        |	 |
|‰ j                  ‰«      «      |‰«      rŒ< d d d «       y 	 d d d «       n?|D ]:  }‰d   s n3	  ‰|‰«        |	 |
|‰ j                  ‰«      «      |d   ‰«      }|rŒ: y |�,‰d   j                   |«       «       ‰d   j!                  «        ‰ j#                  ‰‰«      S # t        $ r8 ‰ j                  «        ‰ j                  ddd¬«       |j                  d¬«       ‚ w xY w# 1 sw Y   Œ�xY w# t        $ r ‰j                  d«      rY  Œ­‚ w xY w)NÚskip_unavailable_fragmentsTc                  ó   — y)NTr   )rT   s    r   r  z:FragmentFD.download_and_append_fragments.<locals>.<lambda>µ  r  r   c           
      ó2  •‡‡‡— ‰
d   sy | d   xŠ‰d<   d ‰d<   t        ‰	j                  d«      «      }| j                  d«      }|rd|d   |d	   d
z
  fz  |d<    ‰| j                  d«      xs ‰d
z
  «      Šˆˆˆˆfd„}t        ‰j                  j                  d«      |«      D ]@  }	 | j                  d«      ‰d<   ‰j	                  ‰| d   ‰	|‰	j                  d«      «      s y ŒB y # t
        t        f$ r}||_        Y d }~Œ_d }~wt        $ r ‰r‚ Y Œpw xY w)Nr   r&   rJ   Ú
last_errorr1   Ú
byte_rangezbytes=%d-%dÚstartÚendr   ÚRangerI   c                 ón   •— ‰r||kD  r‰d   j                  «        ‰j                  | ||‰‰«       | ‰d<   y )Nrw   r  )rR   r$   )r%   r'   r(   r:   Úfatalr&   r   s      €€€€r   Úerror_callbackz[FragmentFD.download_and_append_fragments.<locals>.download_fragment.<locals>.error_callbackÅ  s=   ø€ Ù˜U Wš_Ø˜Ñ&×,Ñ,Ô.Ø×!Ñ! # u¨g°zÀ5ÔIØ$'��LÒ!r   Úfragment_retriesrY   r4   r`   )	r   r2   r   rA   rn   r
   r   Úerrorr   )rÕ   r:   r5   r  r  Úretryr%   r  r&   r3   rÞ   r  r   s    `     @@€€€€r   Údownload_fragmentzCFragmentFD.download_and_append_fragments.<locals>.download_fragment·  s>  û€ Ø$ QÒ'Øà19¸,Ñ1GÐGˆJ˜Ð-Ñ.Ø $ˆC�ÑÜ$ Y§]¡]°>Ó%BÓCˆGØ!Ÿ™ lÓ3ˆJÙØ#0°J¸wÑ4GÈÐTYÑIZÐ]^ÑI^Ð3_Ñ#_�˜Ñ ñ ˜XŸ\™\¨'Ó2ÒF°zÀA±~ÓGˆE÷(ô & d§k¡k§o¡oÐ6HÓ&IÈ>ÓZò �ð
Ø,4¯L©LÐ9IÓ,J�CÐ(Ñ)Ø×2Ñ2Ø ¨%¡°)¸WÀiÇmÁmÐTbÓFcôeáðeñøô "¤>Ð2ò Ø"%�E”KÜûÜ$ò ÙØñ ðús   Â);C)Ã)DÃ8DÄDÄDc                 óÊ   •— | r‰j                  | ‰| |«      «       y ‰|dz
  «      s‰j                  |d«       y|d   j                  «        ‰j                  d|› d�«       y)Nr   zfragment not foundrw   z	fragment z not found, unable to continueFT)r|   r/   rR   r¼   )rt   r&   r:   r  r  r   s      €€€r   Úappend_fragmentzAFragmentFD.download_and_append_fragments.<locals>.append_fragmentØ  st   ø€ ÙØ×%Ñ% c©9°\À:Ó+NÔOð ñ ˜j¨1™nÔ-Ø×)Ñ)¨*Ð6JÔKð
 ð �MÑ"×(Ñ(Ô*Ø×!Ñ! I¨j¨\Ð9WÐ"XÔYØr   rÚ   r   r¥   c                 ód   •— ‰j                  «       } ‰| |«       | | d   |j                  d«      fS )Nr&   rf   )Úcopyr2   )rÕ   Úctx_copyr:   r#  s     €€r   rn   zDFragmentFD.download_and_append_fragments.<locals>._download_fragmentè  s4   ø€ ØŸ8™8›:�Ù! (¨HÔ5Ø ¨,Ñ!7¸¿¹ÐFcÓ9dÐdÐdr   )rf   rJ   Fz;Interrupted by user. Waiting for all threads to shutdown...)Úis_errorÚtbrû   r   r&   rÛ   rw   )rA   r2   rØ   r  r  rð   rñ   r   Úmapr’   ru   rï   Ú_finish_multiline_statusr¼   r  rZ   ry   rÂ   )r   r:   rá   r3   r  r  r  rÝ   rÞ   r%  r×   r  rn   ÚpoolrÕ   r&   Úfrag_filenamerî   r#  s   `` ```  `         @r   rß   z(FragmentFD.download_and_append_fragments¯  s,  þ€ ð
 �{‰{�‰Ð;¸TÔBÙ%ˆH÷	öB		ð  Ÿ>™>¨)Ó4Ðä—i‘iØ�K‰K�O‰OÐ;¸QÓ?À#Ç'Á'È.ÐZ[ÓB\Ñ\ó^ˆà˜Š?õeð
 ÒJœ
×*Ñ*×=Ñ=¸kÓJð ÈdðØ?C¿x¹xÐHZÐ\eÓ?fò )Ñ;˜ *¨mØŸ
™
Ø;HØ.8ñ$ô ñ  /Ñ/?ÀÈ$×J]ÑJ]Ð^aÓJbÓ/cÐeoÐqtÕuØ#(÷ð ñ)÷ð ð  &ò !�Ø(¨Ò+ÙðÙ% h°Ô4Ù,Ù(¨°4×3FÑ3FÀsÓ3KÓLÈhÐWcÑNdÐfiók�Fò Ù ð!ð Ð"Ø�Ñ×$Ñ$¡[£]Ô3Ø�Ñ×$Ñ$Ô&Ø×)Ñ)¨#¨yÓ9Ð9øô1 )ò Ø×1Ñ1Ô3Ø×%Ñ%ØUÐ`eÐjoð &ô qà—M‘M u�MÔ-Øðú÷ð ûô. )ò Ø —}‘} YÔ/ÚØðús>   Â7GÂ9AFÄFÄFÄ),G+ÆAGÇGÇG(Ç+H
ÈH
r   )NN)r   r   r   Ú__doc__r)   r/   r6   r;   rz   rV   r]   rn   ru   r|   r8   r9   rÂ   rÄ   rØ   r  rß   r   r   r   r!   r!      sv   „ ñ!òFBó
Pò?ò2ònòò&ó ò*ò	3òBòH:òx"òHò( ò4>ñB ;LÙ3À$Ø¨õ_:r   r!   )Úconcurrent.futuresrð   r¾   rN   r  r“   rÓ   r¸   Úcommonr   Úhttpr   Úaesr   r   Ú
networkingr	   Únetworking.exceptionsr
   r   Úutilsr   r   r   Úutils.networkingr   Úutils.progressr   r   r!   r   r   r   ú<module>r9     sO   ðÛ Û Û Û Û 	Û Û å "Ý ß 4Ý  ß =ß =Ñ =Ý -Ý /ô!˜&ô !ôt:�õ t:r   